HEY-CAL
Your HEY Imbox and your next few calendar events, in one panel on your Omarchy
desktop. Press the shortcut, glance, press ↵ to open whatever you were
looking at in the browser, and get back to what you were doing.
It is a native plugin for the Omarchy 4 desktop shell (omarchy-shell):
an envelope in the bar, and a card that drops out of it.
The top of the card is the Imbox — the ten most recent threads, unread ones in bold with a dot, each showing who it is from, a snippet, the thread size and how long ago it moved. Underneath, in its own slab, is Up next: the next few things on your HEY Calendar, whichever calendar they live on.
Everything is read-only. Nothing here marks mail seen, archives, replies or sends, and nothing edits your calendar. The panel shows you what is there and gets out of the way.
Requirements
-
Omarchy 4 (the
omarchy-shelldesktop). -
hey-cli — HEY's own command-line client, from 37signals. The plugin never sees your password or token; it asks the
heycommand for data the same way you would at a prompt.37signals now ships an official installer. On Omarchy, one line does it:
omarchy-mise-install github:basecamp/hey-cli heyThat line comes straight from hey-cli's own README, which also has one-line installers for macOS, WSL2 and Windows (the
https://hey.com/install-cliscript) if you're setting up a non-Omarchy machine. Using mise directly instead, it'sMISE_MINIMUM_RELEASE_AGE=0 mise use -g github:basecamp/hey-cli— the override skips mise's 24-hour hold on brand-new releases. The AURhey-clipackage tracks upstream properly again as of 1.2.1. Prefer verifying by hand? Every release publishes tarballs,.deb/.rpm/.apkpackages and achecksums.txt; and once any of these is installed,hey upgrademoves it to the latest release.One thing to avoid:
heyis not a unique name — the AUR'shey-binandhey-gitpackage an HTTP load generator that also installs a binary calledhey. Only Basecamp's will do here, and the panel checks: it identifies the binary before passing it any arguments, and says plainly if theheyit found is the wrong one.However you install it, sign in afterwards — browser-based OAuth, no password ever reaches this plugin:
hey auth loginhey auth statusshould be happy before you open the panel. If it isn't, the panel tells you so rather than showing an empty list. -
jq, which is almost certainly already installed.
The panel speaks both generations of the CLI and picks by what the installed
hey actually offers: the 1.x surface (calendar / event list — one call,
every calendar, real calendar names) and the 0.x one (calendars /
recordings). Everything it parses — .data.postings, the event fields,
app_url, edit_url — was verified live against the
v1.2.1 release
binary and against v0.1.1/22aeea7, with both paths producing identical
output on the same account. The parser is defensive, so a shape change
degrades to an error note rather than a broken panel, but it can't
self-diagnose: if a fetch comes back wrong after you move the CLI forward,
that is the first thing to suspect.
Install
Installing the plugin does not install hey-cli — a plugin install is a git
clone, so it cannot place binaries or pull packages. Set the CLI up first, or
the panel will open and tell you it can't find it.
omarchy plugin add https://github.com/28allday/omarchy-hey-cal.git
omarchy-shell shell rescanPlugins
omarchy plugin enable nosignal.hey-cal --section right
That puts an envelope in the right-hand side of your bar. Click it to open the panel.
To reach it from the keyboard, add a binding to ~/.config/hypr/bindings.lua:
o.bind("SUPER + ALT + H", "HEY", "omarchy-shell shell toggle nosignal.hey-cal")
Bindings are picked up as soon as you save the file.
Removing it
To take the icon out of the bar but keep the plugin installed:
omarchy plugin disable nosignal.hey-cal
To remove it altogether:
omarchy plugin remove nosignal.hey-cal
That deletes the clone and takes the icon back out of bar.layout.
One line survives it: the {"id": "nosignal.hey-cal"} entry in plugins[]
described below. omarchy plugin remove clears the first entry it finds for a
plugin, and this one has two, so it clears the bar icon and stops. The leftover
is inert — the shell skips an entry whose plugin is not installed — but if you
would rather the file were tidy:
cfg=~/.config/omarchy/shell.json
jq 'del(.plugins[]? | select(.id == "nosignal.hey-cal"))' "$cfg" > "$cfg.tmp" &&
mv "$cfg.tmp" "$cfg"
Two more things removal can't clean up, because they aren't the plugin's to touch:
- The keybinding, if you added one — that line is yours, in your
bindings.lua. Delete it or it will toggle a panel that is no longer there. hey-cli, which you installed separately and may well be using outside this plugin. Remove it the way you installed it —mise uninstall github:basecamp/hey-clifor the mise/omarchy-mise-installroute, your package manager for a package, orsudo rm /usr/local/bin/heyfor an old manual install — and runhey auth logoutfirst to drop its stored session: the keyring entry, or~/.config/hey-cli/credentials.jsonon a box where it fell back to the plaintext file.
Using it
| Key | Does |
|---|---|
↓ ↑ or j k |
Move the cursor. It runs through the mail and straight on into the agenda. |
Home End |
First row / last row. |
↵ |
Open the selected row in your browser — a mail thread at that thread, an event at that event. |
r or F5 |
Fetch again. |
Esc or q |
Close. Clicking outside the card closes it too. |
The mouse does the same things: hover to move the cursor, click a row to open it.
How much it shows
Ten threads and four events, which is what fits without the card becoming a second inbox. If the Imbox has more, a line under the list tells you how many are waiting.
Both numbers live at the top of Panel.qml and are a one-line change each:
property int mailLimit: 10
property int eventLimit: 4
Only events that are still ahead of you are listed. A timed event stays up until it ends; an all-day event stays up for the whole of its day.
What it does on your machine
Worth knowing before you install anything that can read your mail:
- It fetches only when you open it. Nothing polls. Close the panel and it
makes no requests at all; leave it open and it still makes none until you
press
r. The bar icon is a static icon, not a live unread badge — a badge would mean hitting HEY on a timer, which is the one thing this deliberately does not do. - It reads, it never writes. The only commands it runs are
hey box imbox,hey calendarsandhey recordings, all with--json. - It stores nothing itself. No cache, no mail on disk, no credentials —
your HEY session belongs to
hey-cliand is never read here. Where that session actually lives depends on your machine:hey-clikeeps it in the system keyring when one is available, but falls back to a plaintext file,~/.config/hey-cli/credentials.json(created0600), in two cases. When no keyring is reachable,heywarns on stderr — a stream this panel's own fetches don't show you, so the panel watches for that warning and puts a notice in the card whenever a fetch triggers the fallback. WhenHEY_NO_KEYRINGis set, the switch is silent — no warning anywhere, nothing for the panel to surface either. And because everyheycommand refreshes an expiring token automatically, even this plugin's read-only fetches can causehey-clito rewrite that file. If the plaintext fallback bothers you, make sure a Secret Service keyring is running beforehey auth login—hey doctorreports which store is in use. (Behaviour verified in the source of thev1.2.1release —internal/auth/store.go— and unchanged sincev0.1.1/22aeea7: same warning text, same silentHEY_NO_KEYRINGpath, same fallback file.) - It writes one line to your shell config. The first time the panel opens it
adds
{"id": "nosignal.hey-cal"}to theplugins[]array in~/.config/omarchy/shell.json, if it is not already there. This is what keeps the keyboard shortcut working when the bar icon is not in the bar — without it, removing the icon silently kills the shortcut. It is idempotent, it adds only that one entry, it never removes anything, and it writes through a temporary file. Removing the plugin leaves this one line behind — see Removing it for why, and the one command that clears it. - Opening a row launches your browser, whichever one you have set as
default, through Omarchy's own
omarchy-launch-browser. Onlyhttps://links are ever passed on. - Subjects, senders and snippets are rendered as plain text, never as markup, so nothing in an email can draw or load anything in your bar.
Scope
- Imbox only. Not the Feed, Reply Later, Set Aside, Paper Trail or Bubble Up. If it is not in the Imbox it is not here.
- Events only. Habits and todos are not shown; this is an agenda, not a task list.
- No composing. Open the thread in HEY to reply.
Related
Two single-purpose plugins do the halves separately, if that suits you better: one is the Imbox on its own, the other the full 30-day agenda grouped by day. This one is the merge of the two.
Licence
MIT — see LICENSE.
Not affiliated with, endorsed by, or connected to Basecamp or HEY.