fash
The fashionable automated shell. A wrapper where the LLM stays out of your way until you summon it — with punctuation. No classification round-trips: anything that isn't a trigger runs in your shell, immediately.
***
@@@@@@@@@@@
~@{{]]]]]{@]
@{{]]]]]{{@ <@
@{]]]]]]{@ ]@{{@
]{]]]]]{@. {@{]]]{]
@]]]]{@* .@@@@@@{]]@
~@]]{@< <]]@*
@]]* @@{]]@
]{]{@@@@@@@ ]@{{]]]{]
@{]]]{{@ *@@{]]]]]]@
@{{{@ @@{]]]]]]]{@
~@~ *@@{]]]]]]{{@*
@@@@@@@@@@@@@
*<*
Two keystrokes from fixed
~/work ⚡︎ gerp -ri TODO . | wl⁉️ ✦ 1. grep -ri TODO . | wc -l count matching lines 2. grep -ri TODO . | less page through matches ↵ runs #1 · 1-3 picks · e edits · r retries · q cancels ~/work ⚡︎ ffmpeg ⚡️ turn demo.mov into a gif ✦ ffmpeg -i demo.mov -vf "fps=12,scale=720:-1" demo.gif confident · running
Triggers
| you type | fash does |
|---|---|
| <anything>??? | Proposes 2-3 corrected/likely commands with one-line explanations, grounded in the command's man page. ↵ runs the first. |
| ??? (bare) | Fixes the last failed command using its captured stderr. |
| <anything> !!! | Same as ???, but when the model marks its top fix confident, it runs immediately — no picker. Bare !!! auto-fixes the last failure. |
| <cmd> !!! <request> | 2-3 full invocations of <cmd> accomplishing the request, flags grounded in its man page — the top one runs immediately when confident. |
| :/ [cmd] | fash command mode — settings, context toggle, history. Bare :/ is persistent. |
| :c [message] | Chat with your shell history in context. |
| :x · :* · :y · :: | Proxy the terminal to codex, claude, agy — or reopen the last one. |
| anything else | Runs in your shell, immediately. |
Ambient, not chatty
- As you type, a completed trigger collapses into a glyph — the third
?turns??into ⁉️, the third!turns!!into ⚡️; backspace decomposes it back into the remaining two marks. Glued bangs (echo wow!!!) stay plain —!!!triggers need a space before the bangs. - Exit codes and stderr tails are captured quietly; a dim
✦ ??? to fixappears after failures. - Fish-style ghost suggestions from your own history.
- Obvious secrets (key-shaped tokens,
password=values) are redacted before anything is persisted or sent to a provider. - Global context (togglable with
:/ ctx off): recent cross-session commands, your standing notes, cwd, git state, platform.
Install & run
# from the repository root cd fash uv sync uv run fash # first run launches a setup wizard fash --vim # vi keybindings
Providers: openrouter, openai, local (any OpenAI-compatible endpoint — ollama, LM Studio, mlx), or cli — drive an installed agent CLI headlessly (claude, codex, cursor-agent, agy) with no API key: the CLI's own login applies. Rerun setup any time with fash --reconfigure.
Want your fixes instant and offline? ??? can be served by the sibling mash project, a small local model finetuned for command correction — trained partly on your own accepted fixes.