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."
- 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.
- 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.
- 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 wordsOTAThe 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 pickOTADJ'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 changeThe 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.
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.Weekend in New York starts Friday. Who are you trying to see?
What's on this weekend
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.
Press. Glass lights under the finger (isInteractive), PressDim 0.98, haptics.tap().Push, about a third in. The system push every CrowdVolt page uses (slide_from_right). Home slides 30 percent behind and dims a touch.Push, three quarters. The thread is already complete: last messages, loader B, composer.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. | Option | Moment | Haptic |
|---|
| A | Press the DJ pill | haptics.tap() (light), from GlassPillButton |
| B | Press DJ's half | haptics.tap() (light), from GlassPillGroupItem |
| C | Tap the DJ bar | Today's bar behaviour; no new haptic |
| All | DJ opens, opener lands, badge counts change, the mark breathes | Nothing. Passive changes never buzz |
| All | A plan starts needing them | Nothing 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 AAt 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 BAt 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 ptYou'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 ptYou'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. | Width | Top right | New York | Miami | Chicago | Los Angeles | San Francisco |
|---|
| 375 pt | Today, bolt alone 48 pt | 78 pt clear | 100 pt clear | 94 pt clear | 54 pt clear | 36 pt clear |
| 375 pt | A, own pill 102 pt | 24 pt clear | 46 pt clear | 40 pt clear | 0 pt clearfits at 23 pt | under by 18 ptfits at 21 pt |
| 375 pt | B, one capsule 92 pt | 34 pt clear | 56 pt clear | 50 pt clear | 10 pt clear | under by 8 ptfits at 22 pt |
| 375 pt | A with the bell on 146 pt | under by 20 ptfits at 20.5 pt | 2 pt clearfits at 23 pt | under by 4 ptfits at 22 pt | under by 44 ptfits at 18 pt | under by 62 ptfits at 17 pt |
| 375 pt | B with the bell on 138 pt | under by 12 ptfits at 21.5 pt | 10 pt clear | 4 pt clearfits at 23.5 pt | under by 36 ptfits at 19 pt | under by 54 ptfits at 17.5 pt |
| 393 pt | Today, bolt alone 48 pt | 79 pt clear | 102 pt clear | 96 pt clear | 52 pt clear | 32 pt clear |
| 393 pt | A, own pill 102 pt | 25 pt clear | 48 pt clear | 42 pt clear | under by 2 ptfits at 24.5 pt | under by 22 ptfits at 23 pt |
| 393 pt | B, one capsule 92 pt | 35 pt clear | 58 pt clear | 52 pt clear | 8 pt clear | under by 12 ptfits at 24 pt |
| 393 pt | A with the bell on 146 pt | under by 19 ptfits at 22.5 pt | 4 pt clearfits at 25 pt | under by 2 ptfits at 24.5 pt | under by 46 ptfits at 20 pt | under by 66 ptfits at 18.5 pt |
| 393 pt | B with the bell on 138 pt | under by 11 ptfits at 23.5 pt | 12 pt clear | 6 pt clearfits at 25.5 pt | under by 38 ptfits at 21 pt | under 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 }
| When | DJ says | Chip |
|---|
| Mon to Thu, city known | Weekend in New York starts Friday. Who are you trying to see? | What's on this weekend |
| Fri to Sun, city known | It's the weekend in New York. Going out tonight? | What's on tonight |
| No city on the device | Weekend starts Friday. Who are you trying to see? | What's on this weekend |
| A plan needs them | No line. The needs row under the header already says it. | None |
| Same line in the last hour, nothing since | Not written again (the event opener's own reuse rule, one hour). | None |
| Empty thread, first open ever | No 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
- 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.
- 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.
- 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.
- 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.
- The bolt barely moves. Its glyph shifts 1 pt and keeps its job (socials and support).
- 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.
- home-hero.tsx: bolt pinned 16 pt from the right, centred on the two copy lines; it stays while the copy shimmers out.
- per-tab-headers.tsx: GlassPillButton 48 pt, 22 pt icons, 6 pt gap; GlassPillGroup two 46 pt items.
- support-chat-logo-button.tsx and notif-bell.tsx: the grouped bell and bolt.
- mono-volt #3187 (fix/dj-chrome-polish, lane APP-CHROME): the plans button and DjPlansBadge used for the counts.
- use-dj-entry.ts, dj-route.ts, app/dj.tsx: how /dj opens and calls /dj/open.
- dj-thread-parts.tsx: DjTyping's old ring loader, which APP-ARRIVE (DJFIX-1) is removing for loader B, the shimmering Thinking bubble drawn here.
- dj_routes.py and dj_opener.py: the opener today.
- Captures: DJFIX-CAPTURE-1 home (2026-10-19), DJFIX-CHROME header (#3187 build), QA-REAL-2 what's on (2026-10-17), APP-PROP-1 home with the bar (2026-10-17). Thread frames are those captures cut together; loader B, the opener line, chip, DJ glyph and badges are drawn to the code's sizes and colours.
- Crowding is measured with Inter Bold at the hero's own rule (width x 28 / 430, tracking -0.07 em) against every phrase and city in the code, with 8 pt of air.
- Mobbin references weren't pulled tonight: the Mobbin connector needs a sign-in. Behaviour reference: Apple groups related toolbar buttons into one glass capsule (HIG, Toolbars).