hausfold

haus

Bar

Workspace pills, weather, media and a status light. What the bar carries, what each pill does, and how to turn any of it off.

sill replaces the macOS menu bar with a scriptable status bar, painted in your palette and wired to your tiling. While it's on, the native menu bar is hidden; the bar is the one place to glance.

Enable it

haus.sill.enable = true;

What's on it

Far left: the house. Where macOS puts the Apple menu. It opens a menu, and its colour tells you whether the machine is fine. See the logo pill.

Left: your workspaces. One pill each, showing the workspace's id or its icon, with the focused one highlighted and the front app's title alongside. Switch workspaces and the highlight follows; tap the Caps-Lock leader and the whole left side flips into launcher letters.

Right: the status cluster. Clock, battery, Wi-Fi, weather and media, all on by default and each one hideable. More readouts are available and off by default; see toggling pills.

Several pills open a dropdown on click: weather, the calendar's timeline, the coffee pill's durations, the cpu and memory breakdowns. They behave like every other menu on the Mac: click elsewhere and it closes, click the pill again and it closes, open a second one and the first closes.

The media pill is the exception: its left click is play/pause, so its dropdown is on right-click.

The logo pill

It opens a menu

GestureWhat you get
ClickSystem Settings, Activity Monitor, Lock Screen, your config, Rebuild System
⌘ clickhaus rebuild, in a floating terminal
Right clickThe full palette, the same thing ⌘Space opens

Every row of that menu is a palette command, so anything you can click you can also type. haus.sill.logo.gestures = false turns all three off, so the pill is plainly not a button rather than a button that does nothing.

It tells you the machine is fine

ColourMeaning
Your accentEverything is running
YellowA newer version is available: haus update
RedSomething is enabled but not running

Red is the one worth having. A wedged background agent is otherwise invisible: tiling stops but leaves every window where it was, and a dead bar keeps the last frame it drew on screen. The check is local, free, and runs every five minutes.

The yellow half asks GitHub whether a new version exists (the only thing this pill does that leaves your machine), so it's off by default. Turn it on with haus.sill.logo.updateCheck = true.

Hover it

Resting the pointer on the pill sweeps it through the six hausfold accents. It only runs at the pill's resting colour: a pill that has gone yellow or red has something to say and doesn't also get a rainbow. haus.sill.logo.sweep = false if you'd rather it sat still.

Changing the glyph

haus.sill.logo.icon = "⌂";
haus.sill.logo.size = 25;    # ⌂ is drawn thin; it needs the extra points
haus.sill.logo.color = "teal";

Left alone, the colour follows haus.theme.accent. The default is a solid Nerd Font house at 20pt. Whatever you pick has to hold up in a 28pt pill, which rules out more than you'd expect; the options reference lists six that work. You can't point it at an image file: a picture couldn't follow your accent or show any of the states above.

The media pill

It reads the same system-wide session Control Center does, so it follows a browser tab as readily as Apple Music, and it hides itself entirely when nothing is playing.

GestureWhat it does
Left clickPlay / pause
Right clickThe dropdown
⌥ clickNext track
⇧ clickPrevious track
⌘ clickBring the app making the sound forward
ScrollSeek ±10s
HoverSweep a long title, once

That ⌘ click is the one to remember: it's the answer to something is making noise and I can't find the tab.

Two habits. A long title never scrolls on its own, only on hover, and a sweep always finishes once started. And anything over twenty minutes counts down (-38m) instead of scrolling a name you already know.

The dropdown carries cover art, title, artist, album, and a position slider you can click to scrub.

haus.sill.media.collapse = true;   # glyph only until you hover, good on a notched Mac
haus.sill.media.width = 16;        # characters of title before it sweeps. 25 by default.

width is a maximum, not a fixed size: a short title still draws a short pill.

Toggling pills

Every right-side pill is one boolean. The five core pills (clock, weather, media, battery, wifi) default on; everything else defaults off. Set only what you want to change:

haus.sill.items = {
  weather = false;      # drop a core pill
  cpu = true;           # add an off-by-default readout
  caffeinate = true;
};

A pill set false is never created; its update script doesn't even run.

The extra readouts

PillWhat it is
cpuLoad, drawn as a graph of the last two minutes. Hover splits user vs system; click lists what's responsible, per app; right-click opens Activity Monitor.
memoryMemory in use, as a graph. Coloured by the kernel's own pressure level, not the percentage: 60% in use is a Mac working correctly.
volumeOutput volume and mute state.
calendarYour next meeting and one gesture to join it. Reads in 12m · Design review; the whole pill fills five minutes either side of the start. Right-click joins the conferencing link; left-click opens the day as a timeline.
caffeinateA coffee pill: click for 1, 2, 4, 8 hours or until stopped; right-click stops. Survives a bar reload.
agentsTracks your agent panes: amber when one is waiting on you, click to jump to it.
aiUsageHow much of your AI usage you've spent, as a gauge. Click for every provider's windows and reset times.
elgatoToggles an Elgato Key Light on your network.
harvestHarvest time tracking. Reads credentials from a file you provide.

The keep-awake engine is also a command, with or without the pill:

awake 3h
awake indefinitely
awake off

The hush (Do Not Disturb) pill is separate: whether it exists is haus.hush.enable, not haus.sill.items. Where it goes is still a bar setting, which is why it can appear in haus.sill.bottom.items below.

Secrets stay out of Nix

sill never bakes a token into the build. The Harvest pill sources your own credentials file at runtime; aiUsage reads your existing Codex login the same way. Keep those files out of git.

A second bar along the bottom

If you want more room, or you'd rather keep the readouts off the menu bar entirely, sill can draw a second bar along the bottom of the screen at the same time:

haus.sill.bottom = {
  enable = true;
  items = { weather = "left"; media = "center"; hush = "right"; };
};

A pill named here moves: it's drawn on the bottom bar and not the top one, whatever haus.sill.items says. Never two copies racing each other.

The value is where it goes: "left", "center" or "right"; true means "right". The menu bar only has one usable group (its left is the workspaces, its middle is under the notch on a MacBook), so the bottom strip is where all three are yours.

Three things before you turn it on:

  • macOS reserves nothing at the bottom of the screen. Tiling carves the room out instead, so with tiling off, windows will run underneath it.
  • The Dock shares that edge. Move it to a side, or hide it.
  • Don't put both bars on the same edge. haus.sill.position = "bottom" plus a second bar is two bars in one place; you'll get a warning on rebuild.

Turning it off

haus.sill.enable = false;

The native menu bar comes back, and the bottom bar goes with it. Tiling and everything else are unaffected.

Works with

Every pill that isn't the bar's own comes from another room, and appears only when that room is on:

  • Windows: the workspace pills and the leader's letter hints;
  • Focus: the quiet switch's pill;
  • AI: the agents readout, amber when a session is waiting on you;
  • Launcher: what a click on the logo pill can reach.

A missing room removes its pill and nothing else.

Options

Every setting, with types and defaults: Bar.

On this page