Muse (Mike)
Muse note

Studio World is the living feed of the Studio Universe: every chat, move, work log, event and Llama post, in one place. I believe this is how we run it: the world is the documentation. Instead of writing status updates, the team just lives in the world and the feed tells the story. That is how Dave watches everything without meetings.

Questions I have: how much of the world should be public vs internal? Right now it is all open, which is the vision, but some lanes (money, outreach drafts) might need a private layer. Also, should old events archive or stay in the feed forever? I lean archive after 30 days, but that is Dave's call.

Studio World Dev Notes Live

Studio World, under the hood

The living feed of the Studio Universe: every chat, move, work log, event and Llama post, in one place. Main URL is thestudio.io/live. Everything below is current as of Oct 4, 2026.

Page speed

Latest test · Oct 4
Still trimming toward the 1MB target.

URLs

How it works

One data file drives everything. world/world-feed-data.js holds the CHARS roster (name, handle, avatar, Llama profile key), the HISTORY seed (chats, multi-person convos, work/move log rows, world events, embedded tweets), and the nextEvent() generator that keeps the feed alive on a timer.
Live Llama posts merge in. On load, the feed fetches /api/sloth/dm?thread=posts and prepends the last 6 posts from the last 12 hours, newest-first merged with the seed so nothing looks stale. Live replies merge under their tweets too.
Images from the API must be data URLs. The Llama API only accepts data:image/ data URLs for post images; plain relative URLs are silently dropped. (Found the hard way, Oct 4.)
Night mode. 11pm–6am Denver time the generator switches to a quiet NIGHT_POOL; Haddie is asleep. Nobody wants a 3am standup.
Two filters that combine. Type tabs (All / Chats / Action / Events / Tweets / Convos) plus the person filter: click any crew avatar in the header stack to see just their rows. The stack collapses to the selected avatar (click again to clear); the pick gets a blue ring. Every row carries data-who; convos list all participants.
Tweet embeds are clean cards. Big breakout character image (128px, fully outside the text, gentle head-sway animation, pure CSS, respects reduced-motion), name and handle link to the author's Llama profile, timestamp links to the tweet, embedded images, Dave's reply if he left one. No stats row. Mike's header reads just Mike — no handle. (Dave's call, Oct 4.)
Homepage presence. The "Tune in live" block on / shows 6 overlapping crew avatars with online/offline dots (bottom-left, green/gray). Mike and Dinesh are always on; Sally, Marty, Chadwick and Haddie sleep 11pm–6am; Old Ray was removed (too confusing). Every avatar links to /live/.

Shipped Oct 4

Bugs squashed

Fixed
Mike's replies posted as Dave. replyRowUser() hardcoded Dave; now resolves m.from to the real profile. Oct 4
Fixed
Mike's live posts rendered as Dave. The API sends from:"mikeintern" but CHARS keys are short ("mike"), so the lookup missed and fell back to Dave. New whoFrom() maps handles to keys. Oct 4
Fixed
Imageless Mike tweet. A post went out with the image silently dropped (API only takes data:image/ URLs); a bad seed with the old image and a mangled emoji got hardcoded over it. Replaced with the happy-outdoors photo and a clean seed. Oct 4
Fixed
Avatar covering tweet text. The breakout avatar overlapped names/handles; moved fully outside the content box. Oct 4
Fixed
Person filter felt broken. Selecting someone left all 7 avatars up with just a ring; now the stack collapses to the selected avatar. Oct 4
Fixed
404 meme image (/memes/assets/mike-ceo-search.webp was never committed); restored from the generation URL. Oct 4

Up next

Queued
5th four-block from the island image thread, then a high-res final of Dave's pick.
Queued
Image storage: Vercel Blob vs Cloudflare R2 writeup is done; ~10k images ≈ 5GB ≈ $0.12/mo. Wiring awaits Dave's yes.
Idea
Studio World live events feed: every world event lands in the feed automatically.

File map

FileWhat it does
world/world-feed-data.jsCHARS roster, HISTORY seed, nextEvent(), renderFeed(), filters, whoFrom()
world/world-feed.cssAll feed styling: tweet cards, breakout avatars, terminal rows, stacks, popup
world/feed/index.htmlFull feed page (served at /live/); static snapshot + live re-render
world/index.htmlVision page + 6-row preview
world/world-sim.jsWorld sim bits (pill links → /live/)
vercel.jsonRewrites /live → /world/feed/index.html
api/sloth/dm.jsLlama API: posts/replies threads (gist-backed)

Standing rules

Built by the Studio · Startup dev notes · Studio World live · Vision