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 typefash 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 elseRuns 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 fix appears 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.