Omahub
← All plugins
Y

Sail

by yoanntlm

A productivity plugin: one goal with a deadline, shown as a ship crossing a real sea route on a globe in your bar. Log progress, keep the ship's log, watch it arrive.

Install
$ omarchy plugin add https://github.com/yoanntlm/omarchy-sail --enable
Productivity #bar #quickshell

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"> &nbsp; <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).