DJ on Home

For the founder, 2026-10-19. mono-volt main 9f68881ad, py-mkt main cf99cee7dd, #3187 for DJ's header. Nothing is committed.

"dj besides volt button top right of homepage too mayb what do ya think? instead of jus within the event page."

  1. Yes, put DJ on home. With no plan running, home has no way into DJ today; the bar above the tabs only shows while a plan runs, has news or needs them.
  2. My pick is B: DJ and the bolt in one glass capsule, the way the bell and bolt already share one. It's 10 pt narrower than its own pill and keeps DJ's badge off the bolt.
  3. A tap opens DJ on the last conversation with one line about the city's weekend. That needs entry=home on /dj/open; the app side is OTA only.

Today

The real home on main, and every way into DJ that exists now.

Where DJ starts today, from mono-volt main: the event page chip (Ask DJ, or the plan running for that show), the DJ bar above the tabs, search's Ask DJ row when the query reads like a request, and DJ in Settings. The bar is empty with no plan, news or need (dj-bar-model.ts), so someone who just wants to ask about the weekend has to pick a show first.

A. DJ gets its own pill

Founder's wordsOTA

The literal reading: a second glass pill left of the bolt, both pinned top right.

At rest on the real home capture, 402 pt.
At rest. No plan running.
1 running. The plans badge from the DJ header: ink, 18 pt, 2 pt ring.
Needs you. Same badge in DJ amber with how many need them.
DJ answering. The mark breathes like DJ's header avatar: 1 to 1.04 to 1 over 1.6 s, still with reduced motion.

Built from

GlassPillButton (48 pt, the bolt's own) with DJ's mark at 26 pt, 6 pt left of the bolt. Badge: DjPlansBadge from #3187.

Haptic

haptics.tap() on press, from GlassPillButton, the same light tap as the bolt. Nothing when DJ opens or the line lands.

Room

102 pt top right. The badge hangs 5 pt past the pill, so it sits 1 pt from the bolt. San Francisco runs under it on every phone; Los Angeles touches it at 375 and runs 2 pt under at 393.

Ships

OTA. home-hero.tsx only, plus the badge and the avatar's breathe moved into shared files. No native change.

B. DJ and the bolt share one capsule

My pickOTA

DJ's mark and the bolt in one glass capsule, two glyphs, the bolt still on the right edge.

At rest on the real home capture, 402 pt.
At rest. No plan running.
1 running. The plans badge from the DJ header: ink, 18 pt, 2 pt ring.
Needs you. Same badge in DJ amber with how many need them.
DJ answering. The mark breathes like DJ's header avatar: 1 to 1.04 to 1 over 1.6 s, still with reduced motion.

Built from

GlassPillGroup with two GlassPillGroupItems, exactly how the bell and bolt share one capsule when mobile-notif-center-bell is on. Badge: DjPlansBadge from #3187.

Haptic

haptics.tap() on press, from GlassPillGroupItem. One per tap. The bolt half keeps its own tap and still opens socials and support.

Room

92 pt top right, 10 pt less than A. New York, Miami, Chicago and Los Angeles clear at 375 and 393. San Francisco needs the headline two points smaller.

Ships

OTA. home-hero.tsx, plus GlassPillGroup's width from its item count (it's fixed at two today). No native change.

C. No home button

TodayNo change

The bar above the tabs stays DJ's only way in from home. It only shows while a plan runs, has news, or needs them, and the person can hide it.

No plan running. No plan, news or need, so nothing on home leads to DJ.
A plan running. The DJ bar above the tabs (real capture, Oct 17 build; the Admin chip is the dev build's).
Ask DJ on a show. The way in today, one show at a time.

What stays

Event page chip, the DJ bar while a plan runs or has news or needs them, search's Ask DJ row for a request-shaped query, DJ in Settings.

Haptic

None new. The bar's tap opens DJ at that plan's card; paging the bar ticks selection, hiding it gives a soft tap.

Room

No change. The bolt alone leaves 36 pt or more at 375 for every city.

Ships

Nothing to ship.

What the tap opens

Same for A and B: the thread, where they left it, and DJ saying one thing about the weekend in their city. From the bar (C) DJ opens at that plan's card instead, as today.

First frame. The thread on their last conversation, scrolled to the end, DJ's avatar breathing and loader B at the end: the reply bubble saying Thinking with a light passing over it, where the opener lands. Header from #3187: plans button with its badge.
Opener lands. One line with the city and the weekend, and one chip they could say. Nothing else moves. Copy: Weekend in New York starts Friday. Who are you trying to see?
Chip tapped. DJ's real answer to the same question (QA-REAL-2, Miami): the weekend card. Already built.
A plan needs them. No opener line. The thread opens under the needs row, which already says what's wrong.

Into DJ

Shown for B with one plan running; A is the same push from its own pill. Frames are the real home and thread captures at the push's offsets.

1
Press. Glass lights under the finger (isInteractive), PressDim 0.98, haptics.tap().
1
Thinking
Push, about a third in. The system push every CrowdVolt page uses (slide_from_right). Home slides 30 percent behind and dims a touch.
1
Thinking
Push, three quarters. The thread is already complete: last messages, loader B, composer.
1
Thinking
Push done. First frame is the final layout. Loader B sits where the opener lands; the avatar breathes.
Weekend in New York starts Friday. Who are you trying to see?
What's on this weekend
Opener lands when /dj/open answers: the reply crosses into the same bubble, Thinking becomes the line, and the chip follows.
OptionMomentHaptic
APress the DJ pillhaptics.tap() (light), from GlassPillButton
BPress DJ's halfhaptics.tap() (light), from GlassPillGroupItem
CTap the DJ barToday's bar behaviour; no new haptic
AllDJ opens, opener lands, badge counts change, the mark breathesNothing. Passive changes never buzz
AllA plan starts needing themNothing from home; the push carries it

With the hero's scroll fold

The hero copy shimmers out as the feed scrolls and the city pill scales in on the left. The top right is pinned and never exits, so DJ stays one tap away the whole way down.

Option A
1
At rest.
Copy shimmering. Real frame of the hero's shimmer; the top right doesn't move.
Folded. Copy gone, the city pill scales in on the left, DJ and the bolt stay put.
Option B
1
At rest.
Copy shimmering. Real frame of the hero's shimmer; the top right doesn't move.
Folded. Copy gone, the city pill scales in on the left, DJ and the bolt stay put.

Room at 375 and 393

The headline scales with the screen but the pills don't, so small phones crowd first. Drawn to the code's numbers with the longest phrase on line one.

375 pt (iPhone SE), headline 24 pt
You're wide awake
tonight in New York
A, New York.
You're wide awake
tonight in New York
B, New York.
You're wide awake
tonight in San Francisco
A, San Francisco. Runs under the pills.
You're wide awake
tonight in San Francisco
B, San Francisco. Runs under the capsule.
You're wide awake
tonight in San Francisco
B, San Francisco, fitted. Headline at 22 pt, 8 pt clear.
393 pt (iPhone 15, 16), headline 26 pt
You're wide awake
tonight in New York
A, New York.
You're wide awake
tonight in New York
B, New York.
You're wide awake
tonight in San Francisco
A, San Francisco. Runs under the pills.
You're wide awake
tonight in San Francisco
B, San Francisco. Runs under the capsule.
You're wide awake
tonight in San Francisco
B, San Francisco, fitted. Headline at 24 pt, 8 pt clear.
WidthTop rightNew YorkMiamiChicagoLos AngelesSan Francisco
375 ptToday, bolt alone 48 pt78 pt clear100 pt clear94 pt clear54 pt clear36 pt clear
375 ptA, own pill 102 pt24 pt clear46 pt clear40 pt clear0 pt clearfits at 23 ptunder by 18 ptfits at 21 pt
375 ptB, one capsule 92 pt34 pt clear56 pt clear50 pt clear10 pt clearunder by 8 ptfits at 22 pt
375 ptA with the bell on 146 ptunder by 20 ptfits at 20.5 pt2 pt clearfits at 23 ptunder by 4 ptfits at 22 ptunder by 44 ptfits at 18 ptunder by 62 ptfits at 17 pt
375 ptB with the bell on 138 ptunder by 12 ptfits at 21.5 pt10 pt clear4 pt clearfits at 23.5 ptunder by 36 ptfits at 19 ptunder by 54 ptfits at 17.5 pt
393 ptToday, bolt alone 48 pt79 pt clear102 pt clear96 pt clear52 pt clear32 pt clear
393 ptA, own pill 102 pt25 pt clear48 pt clear42 pt clearunder by 2 ptfits at 24.5 ptunder by 22 ptfits at 23 pt
393 ptB, one capsule 92 pt35 pt clear58 pt clear52 pt clear8 pt clearunder by 12 ptfits at 24 pt
393 ptA with the bell on 146 ptunder by 19 ptfits at 22.5 pt4 pt clearfits at 25 ptunder by 2 ptfits at 24.5 ptunder by 46 ptfits at 20 ptunder by 66 ptfits at 18.5 pt
393 ptB with the bell on 138 ptunder by 11 ptfits at 23.5 pt12 pt clear6 pt clearfits at 25.5 ptunder by 38 ptfits at 21 ptunder by 58 ptfits at 19.5 pt

Who sees it

DJ's glyph is there only for people DJ is on for.

Who

Only accounts where GET /dj/access says yes: py-mkt's dj-agent flag and the tktx.dj_control kill switch, read by useDjEnabled. Everyone else gets today's home, pixel for pixel: the bolt alone.

First frame

The access answer is cached on the device for a day, so on most launches DJ is there on the hero's first frame. On a first launch without it, DJ appears only when the answer lands: in A the pill fades in beside a bolt that never moves; in B the capsule widens to the left once. Same rule as the event chip.

Signed out, or turned off

No DJ glyph. If the kill switch flips, the next access read takes it away; a tap that races it lands on DJ's own not-on toast and back.

VoiceOver

"DJ", "DJ, 1 running", "DJ, 1 needs you", "DJ, answering". The bolt keeps its own label.

Backend

One new opener entry. No model, no new tables.

POST /dj/open   X-DJ-City: New York
{ "entry": "home", "client_request_id": "djr-7f2c" }

{ "messages": [{ "kind": "dj_text", "text": 
    "Weekend in New York starts Friday. Who are you trying to see?",
    "params": { "entry": "home", "city": "New York",
      "chips": ["What's on this weekend"] } }],
  "starters": ["buy", "alert", "whats_on"], "plan_uqid": null }
WhenDJ saysChip
Mon to Thu, city knownWeekend in New York starts Friday. Who are you trying to see?What's on this weekend
Fri to Sun, city knownIt's the weekend in New York. Going out tonight?What's on tonight
No city on the deviceWeekend starts Friday. Who are you trying to see?What's on this weekend
A plan needs themNo line. The needs row under the header already says it.None
Same line in the last hour, nothing sinceNot written again (the event opener's own reuse rule, one hour).None
Empty thread, first open everNo line. The fixed intro and starters, as today.Starters

Does /dj/open need entry=home?

Yes. Today entry=thread writes nothing (dj_opener.py open_thread) and entry=event needs a show. Add DjOpenEntry.HOME and open_home; the route takes the AppCity dependency /dj/messages already reads.

What it reads

The person's current plans (to skip the line when one needs them) and the thread tail (reuse). No model call, no cards, no market read: one templated line, so it answers fast and costs nothing.

Weekend

Friday to Sunday in local time, the same window as home's This weekend rail (home-filters-helpers.ts) and DJ's own what's on.

Written like the event opener

Locked per user, keyed open:home:<client_request_id>, params carry entry: home and the city, so a retry answers with what it wrote and the thread's merge by id never doubles it.

Chip

Rides params.chips like any dj_text, drawn by DjReplyChips; a tap says it, and DJ answers with the weekend card it already builds.

Client

Sends X-DJ-City on /dj/open (djPost doesn't yet), entry: "home" from the button, and opening is true for home as for event, so loader B is there from the first frame.

Old server

An app on a server without HOME gets a 400, falls to failed, and opens the thread as it is today. Server and app still ship together.

My pick: B, one capsule

  1. DJ belongs on home. With no plan running there's no way in from home today, and "what's on this weekend" has no show to start from. That's the gap you named.
  2. B is a pattern CrowdVolt already has. The bell and the bolt share one capsule the same way; DJ takes that seat with no new component.
  3. It crowds less. 92 pt against A's 102. Four of five cities clear at 375 and 393; only San Francisco needs the headline two points smaller. A also crowds Los Angeles, and San Francisco by more.
  4. The badge reads as DJ's. On A it hangs into the 6 pt gap, 1 pt from the bolt; on B it sits on DJ's half.
  5. The bolt barely moves. Its glyph shifts 1 pt and keeps its job (socials and support).
  6. All three are OTA. A and B change JS only; C changes nothing. The server half is entry=home on /dj/open, shipped with the app.

Open question for later: if the notification bell ships to the same people, the capsule holds three glyphs (138 pt) and New York's headline would need to drop to 21.5 pt at 375. I'd revisit then.

Sources

Everything above traces to these.