ember — morning
9:04 AM
11:53 AM kinvault done
kinvault 1m
kinvault needs you
Donekinvault All 42 tests pass under -race
While you were away kinvault done · edge asked once
Instant CrushDaft Punk
Headphonesconnected 80%
Screenshotcopied
Chargingfull in 40m

Fix the race in the store's compaction path

kinvault · 3m in · 2 files +23 −6 · 1 retry

kinvault · finished just now · took 12m · +23 −6

11:44 AM

Fixed the race in the store's compaction path: writers now take the segment lock before rotating, and all 42 tests pass under -race.

Good morning

Nothing running · 3 tasks yesterday

9:04 AM

kinvault wants to run

Run the whole suite under the race detector

go test -race -count=1 ./store/...

Always allows go test:* in this project

Ember a dynamic island for Wayland

The top of your screen, paying attention.

Ember hangs from your bar like a notch with a pulse. It follows Claude Code while you look elsewhere, asks before anything runs, keeps time with your music, and falls asleep when you do.

9:04 AM Scroll, and it lives through a day

Your bar already shows the workspaces, the window and the battery. It can't tell you whether Claude is still working, whether it's waiting on you, or what just finished. You look up for under two seconds. Ember answers.

  1. You hand Claude a task.

    The pill names the project, and a band of light runs across it for as long as Claude is working.

  2. Then you go read something else.

    The terminal scrolls out of sight. The work doesn't: it stays in the corner of your eye, the minutes rolling.

  3. Glance up, and the work hangs from a thread.

    Hover the pill and the card drops: the task in words, one line of facts, each step arriving down a thread from Ember. A failed test says so, in red.

  4. Claude wants to run something.

    The request drops out of the island with the whole command and exactly what Always would allow. Answer it from up there. Go on, press Allow.

  5. Done, in one sentence.

    Ember reads the reply and keeps the sentence with the outcome in it. You get “all 42 tests pass under -race”, never “Great question!”.

  6. And if you missed it, it waits.

    The news sits by the clock until you've looked. A turn that stopped never passes for a success: it says Stopped, in red, with the reason.

The rest of the desk

Everything else gets a moment, then gets out of the way.

Each one steps in, says what changed, and steps aside. Hover one to see it up top.

Instant CrushDaft Punk

Music

The cover spins in a ring that fills as the song plays. The equaliser hears the real output: low, mid and high, 25 times a second.

Volume

The waves come and go with the level. At 100 the meter stretches, so you can feel there's no 101.

Brightness

The sun's rays lengthen with the light, read straight from the backlight.

Headphonesconnected 80%

Headphones

Connected, with their battery: a number your bar doesn't have.

Screenshotcopied

Screenshots

A shutter flash, and the shot drops in, already on the clipboard.

Chargingfull in 40m

The charger

Plugged in, with the time until full, and nothing at all once it is.

A small mind

None of it is scripted animation.

A few small models run on real time, and the flame is where they show. Its energy follows the hour. Run your pointer along the day and watch it live each one.

7:10 PM

Life

Blinks are a Poisson process, about fifteen a minute, sometimes doubled. Those ticks are this flame's real blinks.

kinvault

Instant Crush

edge

switched 0× · without hysteresis 0×

Attention

What the pill shows is scored, with hysteresis: a choice holds until a rival clearly beats it, so it never flickers between two close calls.

While you were awaykinvault doneswitch tabs for a few seconds, then come back

Presence

It knows when you've stepped away. News isn't shown to an empty room: you get it in one line when you're back.

7:10 PMleave the page alone for a minute

Sleep

A quiet desk makes it drowsy, then it nods off with z's rising and the pill dimmed. Stop moving, and watch the top of this page.

Built like a small tool

No toolkit, no GPU, nothing that polls.

Ember speaks Wayland directly and draws every pixel itself, in Go, into shared memory. Everything it knows arrives as an event. When nothing moves, nothing is drawn but the flame.

  • Claude Codehooks, over a socket
  • MusicMPRIS, on D-Bus
  • BatteryUPower, on D-Bus
  • Backlightinotify
  • Screenshotsinotify
  • Windowsniri's event stream
ember one Go binary
The top of your screen wl_shm pixels on a layer-shell surface

0 events 0 polls 0 frames drawn

memory, private
≈9MB
of one core while Claude works
≈1%
binary to install
1
polling loops
0

The real thing

Everything above was this page pretending.

Below is Ember itself: every frame drawn by its own renderer, the same code that runs at the top of the screen, played from a script.

Ember on a desktop: the pill names the session at work, the card drops with its live timeline, a request to run the store tests is allowed from the island, and the pill says Done with Claude's summary
Fourteen seconds of a session, drawn frame by frame by Ember's own renderer.
The music demo: the cover in a ring in the pill, then the card's now playing section on a haze of the cover's colours, pause and play, and the volume rising to 100
Now playing lights the card in the cover's own colours.
The edge plugin's dashboard opening: a ring for the day's goal, the problem in progress, the week's bars, a rating line and a year of practice as a heatmap
Plugins sleep until their tool is installed. The first, edge, is a practice coach.
Working: the timeline hangs from Ember
Working: the timeline hangs from Ember
Three sessions: the one you can't see is the hero
Three sessions: the one you can't see is the hero
A command, wrapped, never cut
A command, wrapped, never cut
A question, as one numbered list
A question, as one numbered list
Just finished: the sentence that matters
Just finished: the sentence that matters
A quiet day, in 24 bars
A quiet day, in 24 bars
Subagents, each opening into its steps
Subagents, each opening into its steps

Install

Three lines, one of which is a check-up.

~
# a Wayland compositor with layer-shell, Go 1.27+, systemd
$ git clone https://github.com/Tejas242/ember && cd ember
$ make install    # the binary, a user service, Claude Code's hooks, a config
$ ember doctor    # says what's missing, and how to get it

Made for niri with the Noctalia shell; anything with zwlr_layer_shell_v1 should do. Music needs an MPRIS player, the equaliser PipeWire. The config takes effect within ten seconds, without a restart.

Good night.

It'll be up there in the morning, keeping the time.