The plan states, the components DJ is built from, and the rules it follows.
System
A
Where DJ lives
Nothing shows until someone uses DJ. While a plan runs, a bar above the tabs shows it, one plan per page. Hide it anytime; it comes back only with news.
13 screens
B
Who's asking
DJ opens with what this person can actually do, from what py-mkt already knows: roles, listings, orders, alerts, linked wallets, and the event they came from.
8 screens
C
Buying
Say it, check the plan, approve once. DJ buys the moment a match is listed, then shows the receipt.
7 screens
D
Buying, other states
Clarifying, missing card or wallet, no max, bank checks, declines, doors opening, stopping, platform limits.
13 screens
E
Selling
Same shape for sellers: plan, approval, DJ moves the price within the seller's words, the sale.
12 screens
F
Controls
Everything DJ is doing in one place, one switch to pause it all, Settings, and the times DJ pauses itself.
5 screens
How a plan moves
One flow for buy and sell plans. Boxes are the states stored on dj_plan.state, diamonds are checks, rounded ends start or finish a plan. Click a state to open its screen.
User asksIn the thread, search or an event page.
Components
Existing is used as is, adapted is an existing component in a new place, new is built for this feature.
Four Tet
2 × General admission
Watching
Max price$80 each
Lowest now$88 each
Stop
DJ cardExisting
components/detail/detail-card.tsx
A DetailCard with the reprice header row. Plan, status and receipt are the same card.
WatchingSellingBoughtNeeds youPaused
Status badgesExisting
components/ui/status-badge.tsx
DJ's states use the existing tones. Live tones pulse.
DB trigger pricing_pause_on_manual_ask_price (existing).
Resume starts from the user's price.
9 existing1 adapted
E11Deadline, not sold
sell plan: expiring
The minimum held, so DJ asks instead of selling under it. Selling below is the seller's call.
Sell for $70 = sell-to-bid (calc_sell with use_bid_uqid).
9 existing1 adapted
E12Broker, price all
sell plan: draft (bulk)
One plan for many listings.
One dj_plan, many pricing_policy rows.
Minimums per listing, or a % under today's price.
7 existing
F1What DJ is doing
GET /dj/plans
Everything DJ is doing, in one list, from the thread's "…" button.
Rows are Dashboard cards; each opens its card in the thread.
8 existing
F2Everything paused
user: dj_paused
One switch stops everything.
Per-user flag read inside the execution transaction.
Bar and pushes stop too.
5 existing1 new
F3Paused by us
ops kill switch
When we pause DJ, users are told plainly and nothing is lost.
dj_control row (global / per event), read FOR SHARE when executing.
4 existing
F4Paused for a dispute
user: dispute open
Buying pauses automatically during a dispute.
Auto-pause on open dispute or early fraud warning.
Selling plans keep running.
4 existing1 new
F5Settings
user settings
Settings holds the bar switch, optional limits and DJ's card.
Same shell as the Notifications page.
Limits default to none.
1 existing
Not using DJ
One buy plan
One sell plan
Several plans
Swiping
Broker
Scrolled
Long-press
Hidden
Back with news
Needs you
Event page
Search
Where DJ lives13 screens · Nothing shows until someone uses DJ. While a plan runs, a bar above the tabs shows it, one plan per page. Hide it anytime; it comes back only with news.
New to DJ
Buyer with alerts
Seller with listings
Broker
From an event, no tickets
From an event, holding
From an event, listed
From an event, plan running
Who's asking8 screens · DJ opens with what this person can actually do, from what py-mkt already knows: roles, listings, orders, alerts, linked wallets, and the event they came from.
Plan
Edit max price
Approve
Watching
Bought
Push
Order
Buying7 screens · Say it, check the plan, approve once. DJ buys the moment a match is listed, then shows the receipt.
Which show?
Which ticket type?
No card for DJ
Add a card
Wallet not linked
No max, listed now
No max, nothing listed
Bank check
The bank's screen
Card declined
Doors opened
Stop
Platform limit
Buying, other states13 screens · Clarifying, missing card or wallet, no max, bank checks, declines, doors opening, stopping, platform limits.
Plan
Approve
Selling
Moved the price
Sold
Push
Plan, no minimum
Approve, no minimum
At the minimum
Changed by hand
Deadline, not sold
Broker, price all
Selling12 screens · Same shape for sellers: plan, approval, DJ moves the price within the seller's words, the sale.
What DJ is doing
Everything paused
Paused by us
Paused for a dispute
Settings
Controls5 screens · Everything DJ is doing in one place, one switch to pause it all, Settings, and the times DJ pauses itself.