Sail
A productivity plugin for the Omarchy shell: one goal at a time, with a deadline you can see.
You give it an objective and a deadline. It gives you a ship, a real route between real ports, and a globe in your bar to watch it cross — the ship moves with the clock, whether or not you do. You log your progress as cargo; the plugin tells you if you're ahead, on schedule, or drifting; the ship's log remembers where at sea you were when you did the work. That's all it is: a deadline, made visible and a little bit beautiful.
<p align="center"><img src="docs/img/banner.png" width="100%" alt="Left: the globe, a ship on its route. Right: the view from the deck at sunset off Bab-el-Mandeb."></p>$ sail new "Learn enough Rust to ship the CLI" 30d
⛵ MV Rust — ultra-large container vessel, 16.0 kn
Rotterdam → Auckland, New Zealand
11.5k nm · departs Tue 04 Aug 19:25 · arrives Thu 03 Sep 2026 19:25
via the Strait of Dover, Ushant, Cape Finisterre, the Strait of Gibraltar, …
How it works, in one paragraph. The deadline picks the vessel — a pilot boat for a day, a ferry for a week, a container ship for a month, a tall ship for a season — and the vessel picks a real destination over real sea lanes (Malacca, Suez, Gibraltar, Panama, the Cape) so that it arrives exactly on your deadline. Then two things move independently: the ship, with the clock; and your cargo, with what you log. Ahead, on schedule, drifting, becalmed. At the deadline the ship docks either way — cargo delivered, or cargo outstanding. Neither is a failure screen; both are the truth.
<p align="center"> <img src="docs/img/card.png" width="240" alt="The bar card"> <img src="docs/img/deck.png" width="520" alt="The view from the deck at sunset off Bab-el-Mandeb"> </p>| Bar pill | ship glyph · time left (⛴ 12 d). A ship's wheel when idle — click it to set a goal. |
| Card | mini globe, two bars — voyage (time gone) and cargo (work done) — a log row, the actions. With no goal: the form. |
| Globe | the route, sailed solid, remaining dashed; day and night; where you logged. |
| On deck | the sky and sea from the ship, the coast within 150 nm, nearby ports, the next mark ahead. |
| The log | your progress notes, each stamped with the day and the ship's position: Day 12 · 14.6°N 71.2°W · past the Anegada Passage · 4.2k nm out — ownership finally clicked |
| Milestones | quiet notifications as time passes: departed, passing Bab-el-Mandeb, halfway, calling at Cape Town, arrived. |
Install
omarchy plugin add https://github.com/yoanntlm/omarchy-sail.git --enable
omarchy restart shell
ln -s ~/.config/omarchy/plugins/yoanntlm.sail/bin/sail ~/.local/bin/sail # optional: the CLI on your PATH
Nothing beyond a stock Omarchy: Quickshell (the shell itself), Python 3 for
the CLI, notify-send for milestones. No network access, ever. Built for
Omarchy 4.x (plugin manifest schema 1).
To remove: omarchy plugin remove yoanntlm.sail (and delete the optional
~/.local/bin/sail link). Your voyages stay in ~/.local/state/sail/;
delete that folder to forget them.
Use
Set a goal in the card (click the wheel in the bar) or from a terminal:
sail new "<objective>" <when> 30d · 6w · 2m · 2026-09-30 · "30 sep" · "sep 30 09:30"
--to "new york" --from NLRTM --reveal
sail log 40 laid the keel a cargo %, +10 / -5, and/or a note; a note alone is a journal entry
sail journal · sail unlog the ship's log; strike the last entry
sail status · sail show · sail list
sail summon · sail deck the globe · the deck
sail abandon · sail port [PORT] · sail ports
In the panel: g globe · d deck · j log · Esc. On deck ← → look around, a ahead.
On the globe: drag, r re-centre, space sway.
Optional key and menu entry:
-- ~/.config/hypr/bindings.lua
o.bind("SUPER SHIFT, S", "exec", "omarchy-shell shell summon yoanntlm.sail '{}'", "Sail")
// ~/.config/omarchy/extensions/omarchy-menu.jsonc
{ "label": "Sail", "icon": "", "action": "omarchy-shell shell summon yoanntlm.sail '{}'" }
Settings (omarchy bar set yoanntlm.sail <key> <value>): pillStyle compact | full;
showPill always | when-sailing. Colours follow the active theme.
State lives in ~/.local/state/sail/voyages.json — plain JSON, yours.
How it works
Routes are shortest paths over a hand-drawn graph of sea lanes validated against Natural Earth land; the globe and the deck are small shaders; the coast you see from the deck is ray-cast from real coastline geometry. docs/DESIGN.md has the mechanics, docs/PLAN.md the decisions.
Licence
MIT. Coastlines and land from Natural Earth (public domain).