Releases: Rynaro/potions
Release list
v2.15.3 — Ghostty ssh no longer breaks remote terminals
A quiet but annoying one: sshing from Ghostty into a host that lacks the xterm-ghostty terminfo entry left the remote shell unusable — garbled line editing, then 'xterm-ghostty': unknown terminal type. on exit. The Potions-managed ghostty.conf was disabling the very feature that prevents this.
🐛 Root cause
Ghostty ships ssh-env / ssh-terminfo shell-integration features that fix remote TERM mismatches automatically — install the terminfo on the remote, or fall back to xterm-256color. But the generated ghostty.conf hardcoded a full replacement set:
shell-integration-features = cursor,sudo,title
…which silently disabled both ssh features. Every ssh session then shipped TERM=xterm-ghostty to remotes that had never heard of it, breaking zsh's line editor.
✨ Fix
The theme adapter (the generator of record) now emits:
shell-integration-features = cursor,sudo,title,ssh-env,ssh-terminfo
ssh-terminfo— Ghostty auto-installs thexterm-ghosttyterminfo on the remote host on first connect.ssh-env— falls back toTERM=xterm-256colorfor hosts where that install can't run.
The generated file carries a self-documenting comment explaining both.
✅ Testing
269/269 tests pass across Ubuntu, macOS, Fedora, and Termux — including a new regression assertion that the generated ghostty.conf keeps ssh terminfo integration enabled.
⬆️ Upgrading
Existing installs pick this up after the next potions theme set <variant> (or potions upgrade) regenerates ghostty.conf.
v2.15.2 — NeoVim body follows the variant, not just the tabline
A follow-up to v2.15.1: the variant rotation now reaches the editor body, not only the tabline. Setting sepia or white recolored the barbar tabline but the editing area stayed dark blue — this release fixes that.
🐛 Root cause — a load-order fight
alchemists-orchid.nvim ships plugin/alchemists-orchid.lua that eagerly runs setup() (its dark default) plus colorscheme alchemists-orchid. Vim sources plugin/** scripts after init.vim, so:
init.vimsourcesgenerated/palette.vim→setup({ mode = 'light' })→ body correctly becomes sepia/white.- After init.vim, Vim auto-runs the plugin's
plugin/*.lua→setup()(dark) → body reverts to dark.
That step-2 colorscheme alchemists-orchid fires Potions' ColorScheme autocmd, which repaints only the barbar tabline / Visual / cheat groups from the variant tokens. So the tabline tracked the variant while the editor body did not — exactly the reported symptom.
✨ Fix
- Re-callable apply. The body apply is now a global
PotionsApplyOrchid()— still invoked immediately, so a live:source/potions reloadkeeps winning (no plugin pass follows a live source). - Startup re-assert. A
has('vim_starting')-gatedVimEnterguard re-asserts the variant after the plugin's eager pass, then re-asserts the component highlights on top. Live re-sources skip it.
🎨 Verified end-to-end
Under the real init.vim, post-VimEnter:
| Variant | Normal bg |
background |
|---|---|---|
| dark | #2e3440 |
dark |
| white | #fafbfc |
light |
| sepia | #f5f0e6 |
light |
✅ Testing
270/270 tests pass across Ubuntu, macOS, Fedora, and Termux — including two new regression assertions that lock in the VimEnter re-assert guard so the body can't silently revert again.
Full changelog: v2.15.1...v2.15.2
v2.15.1 — NeoVim follows your theme rotation
NeoVim now tracks the active Potions theme variant. Until now potions theme set|cycle repainted the terminal, Zellij, and shell — but nvim stayed dark no matter what. Switching to white or sepia now switches the editor too.
✨ Highlights
- nvim follows the rotation.
dark,white, andsepiaeach render in nvim, driven through the realalchemists-orchid.nvimv2.0 API (setup({ mode })) instead of the phantom per-variant colorscheme names that silently fell back to dark. - Editor matches the surface.
bg/fgare pinned to the active variant's tokens, so the nvim background byte-matches your terminal — no seam between the editor and the pane around it. - Light barbar shipped. The barbar tabline, Visual selection, and cheat float are now legible on the light variants (white & sepia) instead of inheriting dark Nord shades.
- Coherent sepia. Potions' sepia is a light parchment everywhere, so nvim's sepia rides the plugin's light mode with parchment overrides — not the plugin's own dark warm-brown sepia, which would have clashed with every other surface.
🐛 Root cause
The nvim adapter emitted colorscheme alchemists-orchid-{light,sepia}, but alchemists-orchid.nvim ships a single colorscheme whose palette is chosen at runtime via require('alchemists-orchid').setup({ mode = … }). The variant colorscheme names never existed → white/sepia fell back to setup() with no args → always dark.
🎨 Mode mapping
| Variant | Plugin mode | Editor surface |
|---|---|---|
| dark | dark |
#2e3440 |
| white | light |
#fafbfc |
| sepia | light + parchment overrides |
#f5f0e6 |
🔁 Live switch
Re-source the generated palette in a running nvim to apply a switch without restarting — potions reload nvim now points you straight at it:
:source ~/.potions/nvim/generated/palette.vim✅ Testing
268/268 tests pass across Ubuntu, macOS, Fedora, and Termux, including the compiler-drift, docs-sync, token-pairing, base-inheritance gates and new variant→mode mapping coverage.
Full changelog: v2.15.0...v2.15.1
v2.15.0 — One verb to reload your config everywhere
On-demand config reload across every surface. potions reload regenerates all your theme artifacts and live-applies them wherever it safely can — independent of terminal, OS, or multiplexer — then prints an honest status matrix telling you the one action (if any) needed to finish.
✨ Highlights
potions reload— one verb, every surface. Regenerates shell, NeoVim, Zellij, and every terminal-emulator artifact, then live-pushes where a control channel already exists. Until now, re-application only happened as a side effect oftheme set|cycleand install/upgrade.- Honest by design. Regenerate is the contract; live-push is an optimization; the matrix is the truth. The current terminal repaints instantly via OSC; Termux reloads live; Kitty reloads when remote control is on; Alacritty/WezTerm auto-watch their imports. Surfaces that can't be hot-reloaded from outside (Zellij, NeoVim, Ghostty) get the exact one-line action to finish.
- Never hangs, never over-promises. Every live-push is gated on a channel already named in the environment — no discovery, no probing — and bounded by a built-in watchdog (no GNU
timeoutdependency).reloadexits 0 whenever regeneration succeeded. - Scoped reloads.
potions reload terminal|shell|nvim|zellijnarrows the live-push + matrix to what you care about;potions terminal reloadis shorthand for the terminal surfaces.
🆕 Commands
potions reload # regenerate + live-apply everywhere
potions reload terminal # terminal surfaces only (== potions terminal reload)
potions reload shell|nvim|zellij # scopedExample status matrix:
Reload complete. Surface status:
Shell palette: live now
Alacritty: auto-reloaded (Alacritty watches the import)
Kitty: needs restart (or enable remote control)
Ghostty: needs action — press your Ghostty reload keybind (or restart)
Zellij: applies on next Zellij session
NeoVim: needs action — run :source $MYVIMRC in nvim (or restart)
🔧 Notes
- One engine (
.potions/lib/reload/manager.sh), two surface sets — the terminal command reuses the same engine, no divergent code paths. - Bash 3.2 compatible, idempotent, cross-platform (macOS / WSL / Termux / Debian / Fedora), and exit-0-on-absence. All prior theme/terminal behavior is unchanged.
Full changelog: v2.14.0...v2.15.0
v2.14.0 — First-class Ghostty & Termux, AAA Alchemist's Orchid
First-class terminal-emulator support with live theme rotation, and adoption of the upstream Alchemist's Orchid palette (Nord-based, WCAG-AAA, astigmatism-friendly) as the canonical theme across every surface.
✨ Highlights
- Ghostty (Linux & macOS) — first-class.
potions terminal setup ghosttybacks up your~/.config/ghostty/configand adds a single managedconfig-fileinclude: palette + cursor/selection + QoL (block cursor, dimmed inactive splits, shell-integration,macos-option-as-alt, Zellij tab keybinds). Configure-only — Potions never installs Ghostty. - Termux (Android) — first-class. Writes
~/.termux/colors.propertiesand applies it live viatermux-reload-settingson every theme switch, plus a touch-friendlyextra-keysrow. - One palette, byte-faithful everywhere. A single source of truth now carries an explicit 16-color ANSI palette + cursor/selection, so shell, NeoVim, Zellij, Ghostty, Termux, Alacritty, Kitty, and WezTerm all match the upstream theme exactly — in
dark,white, andsepia. - Live theme changes.
potions theme cyclerepaints the terminal instantly (OSC) in a bare shell; Termux reloads live; Ghostty structural settings apply on reload.
🆕 Commands
potions terminal setup [ghostty|termux|all] # wire detected emulators (backs up first)
potions terminal status # show detection + wiring
potions theme set alchemists-orchid white # dark | white | sepia
potions theme cycle🔧 Notes
- Existing Potions installs: colors shift to the AAA upstream palette on upgrade;
install/upgradeauto-wire any detected emulator (idempotent, backup-first). - Bring-your-own themes, the restricted-parser trust boundary, and all prior theme behavior are unchanged.
Full changelog: v2.13.1...v2.14.0
v2.13.1
v2.13.0
v2.12.14 — Cross-platform keystroke compatibility
First tagged Potions release. Focus: making keybindings honest and functional on every platform (macOS, WSL, Termux, Debian/Linux, Fedora).
Fixes
- Zellij footer no longer advertises broken keys. The compact layout now uses
zellij:compact-bar(clean live mode indicator) instead of the fullstatus-bar, which auto-dumped the no-prefixAltbindings — dead on macOS (Option ⌥ needs "Use Option as Meta") and mislabeled "Alt". Ctrl+Sworks everywhere. Added a guardedstty -ixonto.zshrc; previouslyCtrl+S(Neovim's advertised save) sent XOFF and froze the terminal on every platform.- Universal help key. New
F1opens the Zellij cheatsheet — modifier-free, no terminal setup (alongside the always-worksCtrl+a ?).
Docs / clarity
CHEATSHEET.md,potions keyspopup,KEYMAPS.md,README.md: clarify Alt = Option (⌥) and lead with the universalCtrl+aprefix (zero-setup path to every action).- Removed stale "manually run
stty -ixon" notes.
Upgrade
potions upgradeReviewer note: the compact-bar footer was config-validated but not rendered headlessly — worth an eyeball in a live macOS Zellij session.
v2.12.13
✨ Highlights — Neovim experience overhaul (#103)
Built on the #100 BarBar work, zero new plugin dependencies, fully within the Tier-1 Ctrl / Tier-2 Leader / Tier-3 native-motion doctrine.
- Tab highlighting —
cterm*fallbacks on all 13Buffer*groups (the #100 styling previously collapsed on non-truecolor Termux/WSL); brighter active left-bar. - Individual buffer control —
<leader>boclose-others,<leader>bPclose-all-but-pinned,<leader>b[/<leader>b]close left/right; stable buffer indices (insert_at_end) +focus_on_close='previous'. - Cheatsheet modal — zero-dependency floating
:PotionsCheatsheeton<leader>?(toggle), Orchid-themed, mirrorsKEYMAPS.md. - Cursor movement — native motions (
0 ^ $ w b e ge gg G %…) documented in the cheatsheet + Tier 3, not rebound (keeps<C-a>/<C-e>Zellij-safe). - Native QoL — yank-flash, restore-last-cursor-position, smartcase, scrolloff, persistent undo, etc.
Verified via nvim --headless full load (clean) + cheatsheet open/close/reopen.
What's Changed
- ci(termux): fix shebang failure on native ARM64 runner by @Rynaro in #98
- feat(zellij): restore mode indicator and add floating cheatsheet by @Rynaro in #99
- fix(nvim): make barbar tabs keyboard-navigable and readable by @Rynaro in #100
- chore(release): regenerate .checksums for 2.12.11 by @Rynaro in #101
- chore(eidolons): wire dispatch pointer and gitignore markers; bump 2.12.12 by @Rynaro in #102
- feat(nvim): cheatsheet modal, bulk buffer control, cterm-safe tab highlights by @Rynaro in #103
Full Changelog: v2.12.9...v2.12.13
v2.12.9
Fixes
- drink: Suppress the duplicate POTIONS banner during one-line install.
drink.shprinted the banner before staging files, then invokedinstall.shwhich also printed its own banner — users reported the logo appearing twice and assumed the installer had glitched.drink.shnow exportsPOTIONS_FROM_DRINK=1before invokinginstall.sh, andinstall.sh'smain()skipsprint_headerwhen that flag is set. Standaloneinstall.sh(manual clone path) is unaffected. (#97)