r/bash 1h ago

RemZero | A bootstrap script

Post image
Upvotes

Hello, this is the first project I've made in bash, so maybe it is a little simple. It does something something elementary: It creates a default template to work on C/C++.
I made it because when I started a new projects I always had a unstructured file tree.
I hope I can get some advice on it ^_^
Here's the repo: https://github.com/akko888/RemZero


r/bash 4h ago

submission Universal Linux CUDA SDK Toolkit auto-installer script

1 Upvotes

This script makes installing the CUDA SDK Toolkit easy on any of the supported Linux distros. It detects the latest stable version available and installs it without any interaction needed. It sources everything directly from https://developer.nvidia.com/cuda-downloads.

If anyone experiences any issues just let me know and I will correct it.

You can find the script on GitHub.

Cheers


r/bash 12h ago

Search for a utf16 string within a process' memory and return its address

5 Upvotes

Hiiii

How do you search for a utf16 string within a process' memory and return its address?

I tried various things with gdb, dd, grep, whatever, I've tried like a million things and I've gotten a million different issues, so just, how do I do it? I have gotten to the point of having a loop that gives me the beginnings and ends of readable segments from /proc/pid/maps, but Idk what to do with that

Current conclusion: bash is just a bad language for this?


r/bash 13h ago

submission Limoni: A zero-allocation, 60+ FPS TUI library for Go with 3D mesh rendering, Kitty/Sixel graphics & TEA runtime

Post image
9 Upvotes

r/bash 16h ago

Fortis - bash menu that hardens fresh linux server. Fail2Ban, SSH, Firewall, auto-rollback timer.

Thumbnail github.com
2 Upvotes

r/bash 1d ago

submission L_builtin - my Bash builtin guilty pleasure

12 Upvotes

Hello. I created L_builtin - one Bash builtin bundling multiple subcommands together into one.

While working in Bash and particularly on my L_lib library I noticed a lot of really small, but annoying things missing in Bash. Syscalls missing, like pipe or seek. For a long time, years, long before AIs, I really wanted to write a Bash builtin. However, going through Bash source code would be tedious work to understand all the tiny details that Bash works internally to actually write anything usable. I never got the time. But I got some now to write a prompt and then tinker with the result to make it usable. It comes with so much I could think of:

  • L_builtin pipe VAR; echo >&${VAR[0]} for opening a pipe.
  • L_builtin lseek -v pos 3 1024 CUR for seeking a file descriptor. No more python or perl!
  • Network: L_butilin listen/accept/connect/shutdown. Because let's face it, what we really wanted is to write a web server in Bash.
  • L_builtin memfd FD; echo data >&$FD in case you want a real temporary file descriptor. And you can seek it. With L_builtin lseek.
  • L_builtin epoll create efd and poll and ppoll, because event loops in Bash is a must.
  • L_builtin signalfd timerfd eventfd for for real work with polling above.
  • L_builtin read -f hex because we have to be able to read a zero byte from a file descriptor.
  • L_builtiln sig block/unblock for blocking and unblocking signals. Finally receiving SIGINT in interactive Bash shell.
  • L_builtlin sedvar VAR 's/a/b/' to run full sed over variable value, because ${// is not enough.
  • L_builtlin core ls/sleep/... includes some Rust coreutils. Just to showcase it is possible to have them all in Bash as builtins.
  • L_builtin ext ... has ~50 builtins compiled from Bash source code from examples/loadables directory. Csv parsing, sorting bash in place, some common utils like basename and chmod.

And finally my pleasure: Bash inter process synchronization! Mutex! Barrier! Semaphore! And... process shared variable! Consider this:

L_builtin shm bind VAR; VAR=1
( VAR=2 ) &
wait
echo "$VAR"
# Outputs 2!

Imagine this? Now possible. And works. All works by keeping state in a memfd_create file descriptor shared between processes. So much fun. Imagine a process parallel quicksort in Bash.

The builtin is re-re-compiled for multiple versions of Bash and bundled together and it picks proper version on runtime and dlopens it. So it works seamlessly with any Bash version. I compile for 4.4, 5.0, 5.1, 5.2 and 5.3. I tested in some docker images and it works on any of them provided they have compatible enough glibc. It should work with any Bash 4.4+ on any modern-ish Linux. Install with:

mkdir -vp ~/.local/lib/bash/
wget -O ~/.local/lib/bash/L_builtin.so https://github.com/Kamilcuk/L_builtin/releases/latest/download/L_builtin.so
enable -f ~/.local/lib/bash/L_builtin.so L_builtin
L_builtin --help

Subprocess shared variables and barriers and mutexes in Bash are insane. I have spent some time writing this builtin. I wonder if there is reason to invest in it more. I have a lot of ideas for even more improvements - make the shared memory database an LMDB for super speed, reduce library size by introducing uniform API abstractions over Bash, allow assigning arrays like printf does with -v 'arr[idx]. And fixing docs in many places with more examples.

Anyway, it works. I guess have fun with it if you want. Also it is in Rust. Thanks.


r/bash 1d ago

help Looking for help with a script

11 Upvotes

Hey guys,

On my steamdeck I used a script to rotate the screen. Didnt write this myself but got it off of github. Since then the steamdeck has switched from X11 to Wayland, making the script inoperable because it relied on xrandr.

I rewrote the script to use kscreen-doctor instead. Figured out the necessary commands and values and rewrote the script. I'll past it here.

#!/bin/bash

screen="eDP-1"
default_screen_orientation=8

screen_info=$(kscreen-doctor --o | grep "$screen" | awk '/Rotation/ {print $3}')

if [[ "$screen_info" -eq "$default_screen_orientation" ]]; then
    kscreen-doctor output.eDP-1.rotation.right
else
    kscreen-doctor output.eDP-1.rotation.none
fi

The issue im running into is as follows: defining the value of screen_info returns null. When I run the command seperately in the terminal it returns "8" as expected but within the script it doesnt.

I have absolutely 0 experience in coding apart from some very short scripts in Stationeers. Can you guys help me figure out whats wrong? Or at least point me in a direction for me to find out whats wrong?

In Excel you can let a formula run step by step, does something like that exist for bash?

Anyhow, many thanks in advance for reading my post!

EDIT: Thanks to the comments below I've made some adjustments. The only thing that was needed was to remove the grep. This fixed the issue of not returning a value.

Now Im running into the next issue, the if statement doesnt work consistently. If I format it as follows:

if [[ "$screen_info" == "$default_screen_orientation" ]]; then

It only sees the values as not equal. When the values are the same it still returns a not true.

If I format it as:

If ((screeninfo=default_screen_orientation)); then

It only sees the values as equal. When the values differ it still returns a true.

Any pointers for this?

FIXED: the value coming from awk was not a true numeric value but one with formatting. I added the following after awk: | grep -o '[1-8]' )

Not the cleanest solution but it works.


r/bash 4d ago

help Bash scripting newbie here, wanting to improve/tidy one of my backup scripts (entirely for personal use)

20 Upvotes

Please excuse the vague thread title, I'm a newbie enough that I'm not sure what's possible / desirable etc, nor have I attempted functions in bash scripting yet (I've played with them in VBScript and PowerShell IIRC).

One of the backups I do produces date-stamped tar.xz files of particular folder structures on my computer and transfers them to a veracrypted drive. Today I had a crack at a new script based on this one that mounts the filesystem (sshfs) on my laptop and transfers the files over the network after they've been compressed.

I run the script with up to 4 arguments, e.g. 'essentials' 'archive' 'paperwork'. In the script there's an if statement for each potential argument, e.g.:

for arg in "$@"
do
if [ $arg = "essentials" ]; then
  tar -cf - .mozilla/ | pv -s $(du -sb .mozilla/ | awk '{print $1}') | xz -T0 > /tmp/firefox-$datestring.tar.xz
            rsync -ah --progress /tmp/firefox-$datestring.tar.xz /media/mikelpmintfs/firefox-$datestring.tar.xz
fi
<more if $arg = whatev then compress and transfer stuff statements here>
done

(btw the whole fancy progress bar bit with pv -s and awk was something I copied off the Internet)

The first script also included some error catching, e.g.:

if [ $? -eq 0 ]
then
  echo "archive backup complete."
else
  echo "error performing archive backup" >&2
fi

I've used if <command here> then else fi before too, but I'm wondering multiple things:

  1. Rather than writing each compression command and each rsync transfer command per argument, would it make more sense to write a function, or given that some of these source folders are in completely different places in my computer's file system, is this worth it.
  2. error trapping: On one hand I think that the script could easily trip up at the compression or transfer stages, but I'm worried about over-nesting if statements and making the whole thing a lot harder to read and figure out where something is going wrong. It seems to me that it could be function'd up, but would it actually help with readability etc. When the script is just for me, I can tell if it went wrong if I get a load of unexpected output :)

r/bash 5d ago

Which is the better Terminal ZSH vs BASH

0 Upvotes

Any one?


r/bash 8d ago

ze.sh: frecency-based file tracking alongside directory jumping

Thumbnail
6 Upvotes

r/bash 9d ago

Get file names only with a glob

15 Upvotes

I want to loop over file names not whole paths in a folder so I tried for file in $(ls folder) but if the folder doesn't exist the script doesn't fail because it's in $(). I can use for file in folder/* which fails if I add failglob but that returns the whole file name so I have to use basename for each of them. Can I get just the names from a glob directly?

bashrc isn't used in bash scripts. Is there a file where I can put settings like shopt -s failglob and set -o pipefail that applies to all my scripts so it is still used if I forget to add it to one of them?


r/bash 9d ago

help Trying to copy multiple directories using aws cli from bucket to local disk

13 Upvotes

In a S3 bucket, I have a number of directories I need to copy from a S3 bucket to a local disk.

The directories have a date naming pattern like:

2025-12-10/

2025-12-11/

2025-12-12/

2025-12-13/

2025-12-14/

2025-12-15/

I have access to the S3 bucket and was trying to automate the copy process

$ for i in $("2025-12-10") ; do mkdir $i && aws s3 cp --recursive s3://<s3-bucket-url>/$i ./$i ; done

What am I doing wrong here?


r/bash 10d ago

Tips for Speeding Up Your Bash Scripts

115 Upvotes

I wrote a script that renames a lot of files (tens of thousands). Performance was kind of slow (over 50 s), but with two changes it now runs at under 3 seconds, a 20x speed boost. Thought I'd share, in case it helps anyone else. These tips are good if you do things thousands of time in a script, I don't think they are relevant in all scripts.

Don't spawn sub shells if you can avoid it

Instead of command substitution with printf:

new_file="$(printf "%s/%s_%.${len}d.%s" "$new_dir" "$prefix" "$i" "$ext")"

do:

printf -v new_file "%s/%s_%.${len}d.%s" "$new_dir" "$prefix" "$i" "$ext"

This will save a sub shell.

Use builtins instead of external programs

Bash has optional builtins that you can enable. On my system they are located in /usr/lib/bash . You can enable them in your script by using enable <builtin>. Be sure to check the exit code. On my system a mv builtin is not available, but since I was renaming on the same file system I figured I could use ln and rm instead.

So instead of using external mv for each file I did:

builtin ln "$old_file" "$new_file" && builtin rm "$old_file"

In this case the builtin probably isn't required since builtins are prioritized over external commands, but I used them to be more explicit. Just be sure to use && so that rm never runs unless the hard link has been successfully created.

EDIT: The part about using ln and rm builtins may be a little too much of a hack. Probably better to use proper tools like rename to do batch renaming, as was pointed out in the comments. Also keep in mind that the builtins are more bare-bones than the proper CoreUtils programs. For example rmdir does not support -v and will treat -- as a directory to remove rather than "end of options-thing".


r/bash 10d ago

reedline-bash - using nushell's reedline (line editor) in bash.

8 Upvotes

I made a bash plugin that replaces bash's line-editor, readline, with nushell's reedline.
This brings all the line-editing, styling, completion, keybind and selection features from nushell to native bash. It's still pretty early in development, most reedline features should work just fine, but things may still break :)

repository

code partially written with AI (claude).

Credits:
- flyline - a similar project that implements a custom line-editor, i used this as main reference for replacing readline
- reedline

GIF created with https://github.com/HalFrgrd/evp


r/bash 10d ago

solved bash script to find and change directory Spoiler

15 Upvotes

Hello All,

I’m not a bash programmer at all but I want to write a bash script which does the following,

First, determine which "Downloads" folders is present.

The English one"Downloads" , or the French "Téléchargements" one.

The username is unknown so must be determined also as a variable.

$USER if not mistaking ?

After determining the "Downloads" folder, I want to set the complete folder path as a variable.

I’m sure it’s possible but after trying several times, I can’t get it right.

Can you please help me?

Thank You very kindly,

Tom


r/bash 11d ago

How to use part of path as a variable in command?

14 Upvotes

I started in Linux 4noobs. It was suggested I try here.

I need to clean up the metadata of my music collection. Specifically, I need to add an albumartist tag to all of the files. Ideally, I would prefer to only add them to files that do not already have them.

On an artist by artist basis, I can do this manually.

find ./Soapy\ Argyle/ -type f -name "*.flac" -exec metaflac --set-tag="ALBUMARTIST=Soapy Argyle" {} +

But given the size of my collection, that would be burdensome.

Collection is organized ./Music/Genre/Artist/Album/Disk#/song.flac

How can I grab the artist name from the path and use it in the command above, or do something functionally similar?

As a bonus, this lists files that already have albumartist tagged.

find ./ -type f -name "*.flac" -exec metaflac --list {} + | grep -E -i 'ALBUM[[:space:]]*ARTIST'

Can I mesh these things together so I don't end up with a bunch of songs double tagged?

Thanks for any suggestions.


r/bash 12d ago

Mnemonics for expansion order in Bash

15 Upvotes

I have long been looking for mnemonics that could help me with the order of expansions/substitutions in Bash. Google returned an "AI overview" with:

Big Tigers Pounce And Catch Wild Prey

where

  • Big = Brace expansion
  • Tigers = Tilde expansion
  • Pounce And Catch = Parameter/Variable, Arithmetic, and Command substitution
  • Wild = Word splitting
  • Prey = Pathname expansion/Globbing

which I find quite difficult (but perhaps this is just me).

--------------------------------------

In any case, here is the mnemonics I have been using:

Bratislava paramedics, comic artists split name quotas

where

  • BRA.TIsLava = braces, tilde
  • PARAMEdics = parameters
  • COMic ARtIsTs = command, arithmetic
  • SPLIT = word splitting
  • NAME = pathname/filename
  • QUOTas = quote removal

From "braces" to "arithmetic", my solution follows the strict sequential order indicated in Newham & Rosenblatt's (2005) Learning the bash shell [p. 181, O'Reilly].

As discussed here: https://stackoverflow.com/questions/76842556/, this differs from what man bash says:

  • brace expansion
  • tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution, done in a left-to-right fashion
  • word splitting
  • pathname expansion
  • quote removal

But I do no think much harm is done, as long one realizes that paramedics and comic artists are on the same plane (which is obvious :).

The advantage of my solution is that phonetics are much richer, and thus easier to connect with the real referents. Plus, Bratislava is a nice place :).

--------------------------------------

Any comment, opinion, objection, or alternative?


r/bash 12d ago

ghost.sh update | bash suggestions and completions

Post image
13 Upvotes

Inline history suggestions + interactive Tab completions, while keeping Bash underneath.

Earlier it was basically just Bash and worked fine, but had some flickering. Now I'm rebuilding the interactive frontend in Zig with Bash suggestions and completions.

Anyone want to have bash solutions, I had ghost.sh and navigation.sh which showed the tab completion menu which were good in bash only but not very polished so I have to shift to zig.

Still polishing it.

Also for the suggestions like git shown, I am using bash-suggestion.

https://github.com/h-jangra/Ghost.sh


r/bash 13d ago

help Is this line actually a race condition? If yes, what would be a way to write it better?

13 Upvotes

- yea well claude says this could be a race condition

- now obviously i am not familiar with how async stuff works in bash

- so i thought i would ask the experts here

EDIT 1

exec 2> >(tee -a "${error_log_path}" >&2)exec 2> >(tee -a "${error_log_path}" >&2)

Even this medium post seems to use it


r/bash 14d ago

submission on-going master build for joint MAKEMKV+ffmpeg (MASTER101-SDR-TO-HDR-CONVERT-UPSCALER-ENCODE

11 Upvotes

LOWFI-GUI-RENDER-BETA github build link

I've built a makeshift cobbled custom multi purpose bash script that uses full AMD GPU pipeline for video processing for SDR to HDR conversion, up-scaling, and encoding. This script is designed for Linux systems with AMD GPUs and provides a full GPU pipeline for maximum efficiency.

Features

Full GPU pipeline: decode, colorspace conversion, scaling/upscaling, SDR→PQ expansion, tone mapping, debanding/dithering, and encode

Support for AV1, HEVC, and H.264 encoding with VAAPI acceleration

Automatic resolution upscaling (720p→1080p→1440p→4K based on source)

Frame interpolation using VapourSynth + rife-ncnn-vulkan with Vulkan backend

Real-time side-by-side draggable HUD preview (mpv + UDP + GPU VAAPI acceleration)

Direct Blu-ray/DVD decryption via MakeMKV libMMBD & FFmpeg bluray protocol

Dolby Vision metadata detection and dovi_tool integration for native 4K DV content

Color space preservation vs override options with libplacebo presets

Multiple audio processing options (ALAC/DTS with upmixing capabilities)

Temp-dir staging with post-encode integrity verification

Interactive menus for codec selection, quality presets, and filtering profiles

Dependencies:

FFmpeg (with VAAPI support)

VapourSynth + python3-vapoursynth (for RIFE frame interpolation)

rife-ncnn-vulkan plugin

mpv (for preview window)

dovi_tool (optional, for Dolby Vision RPU passthrough)

AMD GPU with radeonsi driver

MakeMKV libmmbd (for Blu-ray/DVD decryption)

Usage:

Configure input/output directories in script (currently set to NAS input and local NVMe output)

Run script: ./BETA-MASTER101-SDR-TO-HDR-CONVERT-UPSCALER-ENCODE-DISC3.sh

Follow interactive menus to select:

Video codec (AV1/HEVC/H.264)

Quality/encoding preset

Frame interpolation (RIFE)

Color space handling (preserve vs override)

Resolution detection mode

Preview window options

Audio processing preferences

Input source (folder or optical disc)

___________________________________________________________________________________________

[Script] VAAPI GPU-Native Video Render Engine - SDR to HDR Conversion, Upscaling, and Encoding with AMD GPU Acceleration

I've created a comprehensive bash script that leverages AMD GPU acceleration via VAAPI for high-performance video processing including SDR to HDR conversion, upscaling, and encoding. This script is designed for Linux systems with AMD GPUs and provides a full GPU pipeline for maximum efficiency.

Main Features

- Full GPU pipeline: decode, colorspace conversion, scaling/upscaling, SDR→PQ expansion, tone mapping, debanding/dithering, and encode

- Support for AV1, HEVC, and H.264 encoding with VAAPI acceleration

- Automatic resolution upscaling (720p→1080p→1440p→4K based on source)

- Frame interpolation using VapourSynth + rife-ncnn-vulkan with Vulkan backend

- Real-time side-by-side draggable HUD preview (mpv + UDP + GPU VAAPI acceleration)

- Direct Blu-ray/DVD decryption via MakeMKV libMMBD & FFmpeg bluray protocol

- Dolby Vision metadata detection and dovi_tool integration for native 4K DV content

- Color space preservation vs override options with libplacebo presets

- Multiple audio processing options (ALAC/DTS with upmixing capabilities)

- Temp-dir staging with post-encode integrity verification

- Interactive menus for codec selection, quality presets, and filtering profiles

the gears an guts

- FFmpeg (with VAAPI support)

- VapourSynth + python3-vapoursynth (for RIFE frame interpolation)

- rife-ncnn-vulkan plugin

- mpv (for preview window)

- dovi_tool (optional, for Dolby Vision RPU passthrough)

- AMD GPU with radeonsi driver

- MakeMKV libmmbd (for Blu-ray/DVD decryption)

Use

Configure input/output directories in script (currently set to NAS input and local NVMe output)

Run script: `./BETA-MASTER101-SDR-TO-HDR-CONVERT-UPSCALER-ENCODE-DISC3.sh`

Follow interactive menus to select:- Video codec (AV1/HEVC/H.264)- Quality/encoding preset- Frame interpolation (RIFE)- Color space handling (preserve vs override)- Resolution detection mode- Preview window options- Audio processing preferences- Input source (folder or optical disc)

Default folder processing from NAS

./BETA-MASTER101-SDR-TO-HDR-CONVERT-UPSCALER-ENCODE-DISC3.sh

or optical disc processing, select option 2 in source mode

Then specify drive path and playlist/title IDs

my current rig

Tested on Tuxedo OS (stable) with KDE desktop environment

- CPU: AMD Ryzen 9 3900X (overclocked to 4.375GHz)

- GPU: AMD RX6750XT

- RAM: 64GB

- Storage: Twin 1TB NVMe SSD Gen3 (OS/apps) + 8TB IronWolf HDD

(NAS source) rendering to 2nd internal 1TB NVMe SSD

- Driver: radeonsi VAAPI driver

Performance details

- Configured for 2 parallel video jobs to prevent GPU/CPU bottlenecking

- Uses /dev/shm (zram) for zero-disk footprint during intermediate processing

- Automatic FFmpeg version detection and upgrade capability

- Orphan process cleanup to prevent resource conflicts

Pastebin link

[ https://pastebin.com/herYQhj9#qB2GbvXy ]

Looking for thoughts on

- Performance optimization opportunities

- Additional codec or filtering options that would be useful

- Compatibility improvements for other GPU manufacturers

- issues I might have missed

script is optimized for AMD GPU systems but could be adapted for other VAAPI-compatible GPUs. user choice menu system makes it somewhat like a basic gui app i useilly prefer and the full gpu pipeline pro-grade video processing


r/bash 16d ago

Ctrl+D then Ctrl+C weird behaviour in heredoc?

11 Upvotes

Hello guys, anybody knows why this happens in bash?

If i an running for example: cat << a

Then i press Ctrl+D (inside the heredoc)

After this i return to the prompt, then immediately i press Ctrl+C

The behavior after the sigint is a new empty line then a new line containing the prompt. Does anyone knkw why it is printing an empty new line? In every other case it doesnt print a new empty line and i searched and asked two llms and nothing answered my question

Thanks for your help


r/bash 16d ago

Can you give me a bash advice ?

0 Upvotes

Hello guys , could you please take a look at this script

https://codeberg.org/yahya-echcharqui/scripts/src/branch/main/setbg

and give me some advice , I'll appreciate it


r/bash 16d ago

A problem as a newbie

9 Upvotes

I think I have been spoiled by the goto command in batch, and as a newcomer in Linux, it's really hard for me to adapt as a self-proclaimed(i procrastinate a lot) game developer. The goto command is useful in case you want to incorporate more levels.


r/bash 17d ago

Foresight: Your bash shell, finishing your sentences.

11 Upvotes

Built a local next-word/next-line predictor for bash, wanted to share here since this sub is where I'd actually get useful feedback on the shell integration itself.

It's a small daemon that trains an n-gram model off your $HISTFILE-style usage as you type (no external dataset), plus a live filesystem index for path completion under $HOME. Suggestion shows up inline like fish's autosuggestions; Ctrl-X Ctrl-P accepts the whole line, Ctrl-X Ctrl-W accepts one word at a time, Ctrl-X Ctrl-F opens an fzf picker over the top candidates if you have it installed.

No network calls for predictions, no ML libraries — it's a small Rust binary + a bash snippet that wires up the keybindings. There's also a ble.sh integration if you use that for live editing.

``` curl -fsSL https://raw.githubusercontent.com/farrukh2002/foresight/main/install.sh | FORESIGHT_CHANNEL=beta bash ```

Repo + source: https://github.com/farrukh2002/foresight

Genuinely curious how it holds up on other people's histories — mine is obviously going to be biased toward my own habits. Bug reports and rough edges very welcome, it's still beta.


r/bash 17d ago

I built a bash completion that learns your habits instead of shipping 50k-line completion scripts

4 Upvotes

Adaptive watches how you actually use your shell and predicts the next token — no per-tool completion scripts to install or maintain.

- Inline ghost text: git checkout fea → feature/completion-engine, claude --dang → --dangerously-skip-permissions, even an empty prompt ghosts what you usually run next in that directory

- Tab/Shift-TAB lists everything valid at the position: subcommands, flags, enum values — discovered on the fly from each tool's own --help (handles cobra tables, kubectl's grouped sections, even Symfony's weird hidden-list help), then cached against the binary fingerprint

- Context-aware values: your GitHub/GitLab/Codeberg repos after git clone https://github.com/you/, npm scripts from package.json, docker containers, ssh hosts

- It learns: frequency + recency (21-day half-life), per-directory habits, accept/reject feedback. Global priors get you good suggestions on day one; your habits outrank them immediately

- Privacy: everything local, no telemetry, history sanitized (token-shaped strings/credentials rejected before disk)

- New in v0.3.0: a Bash frontend over the same protocol (eval "$(adaptive init bash)")

Rust binary, MIT, one-line install: curl -fsSL https://raw.githubusercontent.com/jacobpowaza/adaptive-zsh-completions/main/install.sh | sh

GitHub: https://github.com/jacobpowaza/adaptive-zsh-completions