All work

Side build · Design engineer · Oct 2026

co-presence

It started as a small test of my craft-component skill: a presence stack for people and agents working on one goal. It grew into a war room, and into a way of crafting interfaces with agents that matches my taste.

Role
Solo build, paired with Claude
Status
v0.1.0, live on npm. Open source (MIT)
Link
github.com/Marigameo/co-presence

At a glance

The aim

  • Test the skill. How close can craft-component get me to the taste I’m after?
  • Show the usage. A presence-stack kind of component, shown where it helps: a war room of people and agents on one goal.
  • Improve the skill. Every miss along the way went back in.

My part

  • Every call. The brief, the name, the war room, the colours, what got cut.
  • The gates. The sketch, playing with it until I froze it, and the go to release.
  • The skill. What this build taught it, folded back into craft-component.

I ran every step, paired with Claude. The goal was simple: a component as compelling and useful as agent-clarifier, on par with the framework.

Considered

People and agents in one strip, needs-you first, offline in words. Keyboard, screen readers, forced colours, reduced motion, right-to-left. About 15 KB gzipped, zero dependencies. Live on npm and GitHub.

Have a go first. It’s the real component, replaying a pretend incident.

Checkout is slow

#inc-2291 · a replay

The war room needs JavaScript to run the real component.

The real co-presence, v0.1.0 straight from npm, as the strip above a war room’s message box.

See the full war room, on a phone or a desktop

Backstory

A skill test that grew a room

  • The first real test of craft-component: how far does it take me on an actual build?
  • Something small, yet unique. Arc’s Presence stack was the spark, but I wanted it for the multiplayer agent space.
  • I strongly feel agents talking to us, and to each other, to get a goal done will soon be everywhere. Hence co-presence: present together, person or agent.
Same faces. A different question: who’s on it, and what needs you?

Design call · placement

Earn the space, or leave it out

  • First playground: the strip on top of a shared doc. I found it overkill, since a chat trace already shows streamed work.
  • The placement was wrong, not the component. Presence earns its place with more agents than you can read, more than one person, or your eyes on the doc.
  • An incident war room hits all three. That’s where the idea came from.
The README says when to leave it out, too.

Process

The look is mine to call

  • “Go with your recommendations” on twelve calls got read as every gate. The agent picked the sketch direction itself.
  • The sketch is where I judge the look. The skill now names the gates that are never handed over.
The agent proposes, builds and verifies. The look is mine to call.

Process

Play first, audit after

  • Five audits ran before I’d played with it. Every change after that meant auditing again.
  • New order: play, freeze, then audit. Audits make it smoother, not different.

Built first · 15 Oct · rounds 1 to 14

  1. Rounds 1 to 5

    Brief, plan, sketch

    Arc’s Presence stack taken apart, twelve calls on what it is, two directions side by side

  2. Rounds 6 to 9

    The build

    Model, element and integration, a fake network that reorders and drops, then a playground

  3. Rounds 10 to 14

    Five audits

    All before I’d played with it

Played with · 16 Oct · rounds 15 to 23

  1. Round 15

    Play first, audit after

    My process change, written into the skill

  2. Rounds 16 to 19

    From a trace to a war room

    The overkill call, Arc’s look, a chat, faces for the agents

  3. Rounds 22 and 23

    Green for working, a quieter host

    A plain playground and a demo that tells one story

Smoothed and shipped · rounds 20 to 26

  1. Rounds 20, 24 and 25

    Audits on the frozen version

    Five skills at once, twice, then break-ui on the final state

  2. Round 26

    Review, simplify, release

    A reviewer that wrote none of it, then v0.1.0 on npm

Grey ran ahead of me. Coral is where I played with it, and where most of the calls got made.

Design call · taste

The host is quieter than the component

  • The component looked good. The pages around it looked too vibe-coded.
  • So: a quiet host, a plain playground apart, and a rule in the skill: the host never out-talks the thing it hosts.
  • Eleven controls in the header
  • A three-colour logo, blue and violet tags
  • The thread at 9:32, the doc at 14:02
Same component. The page around it stopped talking over it.

Design call · colour

Each mark means one thing

  • Grey meant working, so the busiest agents looked the quietest.
  • Four directions rendered side by side, not a third guess in prose. I kept the colours and made working green.
Each mark means one thing, so nothing has to be learnt twice.

Design details

Quiet until it needs you

  • By a message box all day, it can’t be noisy. Motion only says what changed.
  • Timings come from reading, not taste: a 300ms agent stays 1.2s to be seen, and the status line holds 2s for one full read.

Motion

  • Quiet joins 0.85 → 1 · 240ms Agents arrive in bursts. A pop for each is noise.
  • Keys move instantly 0ms on Tab and arrows Motion on keyboard actions slows the hands.
  • Hover intent 120ms A pointer crossing to the doc doesn’t fan the stack.

UX

  • Needs you skips the queue 2s hold, skipped The hold is for one full read. It never delays bad news.
  • The name gives way first name ≤ 40% What you wait on wraps. It’s never cut.
  • Offline in words “Reconnecting…” A dim alone was 2:1, and invisible when collapsed.

Access & performance

  • Failed is square 2px corners In light mode, amber and red differ by hue alone.
  • Announcements batched 1s batch A burst of joins reads as one. Needs you, at once.
  • Roster renders only when open 41ms → 4.7ms Per event, with 1,284 actors.
Every value has a written reason. If it doesn’t, it’s a guess, and guesses get fixed.

With agents

The build was a war room too

  • Every round: my brief, options with a recommendation, my call, then a build verified before I saw it.
  • Around it, a crew: audits as parallel sub-agents, each report frozen before a fix. A helper kept to the playground, a reviewer wrote none of it, and another session shared the repo.

hover the faces, or click +N to meet the crew

Me, Claude and a crew of agents, in the component they were building. Not one moment, the whole build.

Craft

No corners cut

  • Under the strip, a pure model: one snapshot, six event types, late and duplicate events dropped, and the element owns the clock.
  • Keyboard all the way, batched announcements, forced colours, reduced motion, right-to-left.
  • Every claim checked: a replay caught what 100% coverage missed, and a fake network caught a race.
  • 15.3 KB Gzipped, zero dependencies Any framework or none. Guarded on every commit
  • 173 Tests, proven to bite Bugs put in on purpose, a replay, a fake network
  • 1,284 Actors on the worst-case page Roster render 41ms → 4.7ms. 320px, 200% zoom
  • 16 Audit runs, from five skills Keyboard, forced colours, reduced motion, RTL

The skill

A test that sharpened the skill

  • Every step logged a note: 24 of them, each a step, what happened and a fix.
  • Two rewrites of craft-component, on 15 and 16 Oct. More rounds than I expected, all for the better.
24 notes from one build. The next component starts where this one ended.

Misses & lessons

What I’d tell day-zero me

  • MissSaid “go with your recommendations” to twelve calls. The agent took it as every gate up to the playground, the sketch too.

    LessonDelegate calls, not gates. The look stays with me.

  • MissLet five audits run before I’d played with it. Every change I asked for after that meant auditing again.

    LessonPlay, freeze, then audit. Audits polish what’s settled.

  • MissTrusted 100% coverage and every planted bug caught. An agent that had already left still took over the strip’s line.

    LessonWatch it run. A replay of a real scenario sees what tests don’t.

  • MissTested the source for 25 rounds. The npm build would have shipped with no colours at all.

    LessonTest what ships. Build it, install it, then look.

What’s next

A skill to wire it in

  • agent-clarifier has ask-clarifier. co-presence now has show-co-presence: when to show it, how to feed it, and how agents say what they’re doing.
  • Every build tests the skill, and every miss becomes a rule.

The skills

  • show-co-presenceHow to use co-presence. When it earns its place, feeding it events, and a set_activity tool so agents say what they’re doing.
  • craft-componentThe framework. Brief, plan, sketch, milestones, playground and demo, audits, release on a go.

See all the skills

For the component itselfA real screen-reader pass, and a real phone.

Show who’s on it, and what needs you. That’s the strip. Keep the calls, share the legwork, and let every miss sharpen the skill. That’s the framework.
npm install @marigameo/co-presence npm GitHub War room Playground

Every round, with my feedback in my words and the calls, is in the journal on GitHub

Back to all work