Roster+ is a premium mobile + web app for booking DJs and live artists in the GCC / Dubai nightlife scene. Two sides: promoters book artists; artists get booked. It is dark-only, bilingual (Arabic / Latin), with a restrained sodium-amber accent. This document is the full picture of what has been done, the design direction chosen, the UI system, and what remains — so an external reviewer has everything needed to critique it.
Read this before judging the screens. The interactive page at the site root (roster-native-preview.pages.dev) is an art-direction mock — 3 concept screens, 2 stock portraits reused, an invented 5-tab bottom nav. It is not the product. The product is a shipping, data-driven app (web/src) onto which this design is being layered selectively. So the following already exist and should not be counted as gaps:
BookingRequestForm → POST /bookings. Not a press-and-hold; that gesture is not built and is deliberately the last phase.en.ts/ar.ts + per-surface modules), [dir='rtl'] mirroring, IBM Plex Sans Arabic, locale cookie. Not sprinkled Arabic words.Empty / Loading states.output: 'export' — fully static) + Capacitor 7 (iOS/Android). A shared web/ source is reused by the native app via path aliases.web/src ship to BOTH the Capacitor app and the live website rosterplus.io. There is no separate web-only path.useT(), locale cookie) and RTL support ([dir='rtl'], IBM Plex Sans Arabic). It also has its own design tokens (graphite + sodium-amber) and brand fonts (Chillax / Satoshi via Fontshare).After two rejected passes (flat glass cards; then a "Roster Rail" motif), the chosen concept is the Setline / مسار السهرة: a live vertical time-spine (22:00 → 04:00) where the booking night itself becomes the interface. It behaves differently per screen but is one idea, so it's a screenshot signature rather than decoration:
| Screen | The Setline becomes… |
|---|---|
| Home | the colon of a giant set-time (00 | 30) over a full-bleed graded hero; artist masthead poster-scale; data chips ride the line. |
| Discover | a drag availability scrubber — move it to a time and the roster re-sorts live; the selected hour looms behind as type. |
| Artist | the actual booking timeline (available / hold / unavailable slots); tapping a slot opens a solid "hold contract" — a ledger you press-and-hold to lock. |
References borrowed (direction from GPT-5.5): Flighty — the confidence of a live status timeline; Berghain / Ostgut Ton poster language — timetable-as-culture, severe type, black + one accent; Qasimi — bilingual Arabic/Latin restraint (Arabic as information, never ornament).
#08090b / #0c0d10), fine grain overlay, radial amber atmosphere behind heroes.The app is genuinely bilingual, so copy goes through i18n. GPT-5.5 reviewed the Arabic; corrected glossary in use:
| English | Arabic | Note |
|---|---|---|
| The Setline (brand) | مسار السهرة | replaces خط السهرة (which read as "party line") |
| Tonight | الليلة | — |
| Available (status) | الحجز متاح | gender-safe; avoids متاح/متاحة |
| Booked | تم الحجز | — |
| Provisional hold | حجز مبدئي | replaces حجز مؤقت (felt disposable) |
| Book (CTA) | احجز | — |
| Bookings (tab) | الحجوزات | — |
| Discover artists | استكشف الفنانين | — |
| Fee / Venue / Set time | الأتعاب · المكان · وقت الفقرة | — |
| Press & hold to lock the night | اضغط مطوّلًا لتثبيت حجز الليلة | — |
RTL rules applied: CSS logical properties (the amber spine flips side automatically); times / numbers / currency / artist names isolated with dir="ltr"/<bdi>; no letter-spacing on Arabic; Arabic keeps IBM Plex Sans Arabic via per-glyph font fallback.
5ef61d3). Removing another device / "sign out others" was bricking the current session ("Invalid or expired token" everywhere) because revokeRefreshTokens is per-user. Proven live, then fixed: the API re-mints a fresh session token and the client silently re-establishes. needs backend deploy — owner-gatede0d4cf6). Capacitor WebView can't anchor-download; routed through a native share sheet. Verified on-device.17ea8a8).6fc289e). First real application into the app: an additive Level-1 hero above the promoter dashboard (amber spine + live booking count + discover CTA). Existing tokens + i18n. Does not touch functional flows.6b9c265). Image-led artist cards with the amber availability spine (only when bookable); booked artists greyscaled. Search / favorites / request-booking flow unchanged. RTL correct.8abda39). The promoter Tonight hero now surfaces ONE actionable booking (soonest upcoming confirmed/contracted → else awaiting-response → else "start a booking"), not a vanity count; single primary action; status by icon + shape + text.88f3c5b). Extracted the status→label map into one shared module (list + hero + pill). Fixed a real defect: StatusPill was rendering the raw untranslated status, so Arabic users saw English "confirmed".d5b8ca3). Availability as a semantic state (filled amber dot vs hollow ring), fee, then the existing accessible Request-booking dialog → POST /bookings. No new booking state, no premature press-and-hold (per the review).c25519e). Promoter, artist and organisation now render from ONE component + ONE selection/data contract (lib/hero-object.ts); role variants differ only in copy, never CSS. The hero priority is reconciled into one rule everywhere — expiring hold → request needing action → next confirmed/contracted → start CTA. Contract documented in docs/SETLINE-HERO.md.api.rosterplus.io (prod rev tagged for rollback; no frontend bundled); full auth matrix (login/refresh/remove-device/sign-out-others/recovery/logout) re-verified live, no regression. The matching client half is on the mobile app; the live web client's revoke-recovery lands with a later (gated) web deploy.LIVE The redesign + the auth client half are now deployed to rosterplus.io (main 4d1f8aa, cherry-picked web-only onto main — no phase9 app, no backend change; prod rev tagged for rollback). Verified live: site healthy, setline CSS served, auth revoke-recovery now fixed end-to-end (backend + web). Dev continues on feat/setline-redesign.
branch feat/setline-redesign (off feat/phase9-capacitor). Both phases: tsc clean, next build 24/24 pages, EN + Arabic render verified.
The agreed model is NOT a wholesale replacement of the working, data-driven app. The Setline is a design-language layer + Level-1 hero moments; the functional dashboards, bookings, wallet, messaging and auth keep working. Rollout is lowest-risk first.
| Phase | Work | Status |
|---|---|---|
| 3 | Artist profile — booking moment as a Setline "book bar" (semantic availability + fee + existing CTA). Shipped as the restrained version the review asked for. | done d5b8ca3 |
| 4 | Dashboard hero across the other roles (artist, organisation) — one shared component + one contract, no per-role CSS | done c25519e |
| 5 | The transactional hold flow (press-and-hold to lock, expiry, timezone, cross-midnight) — last, because it's transactional. Full interaction + data spec written (docs/PHASE5-HOLD-SPEC.md): meaning, model, server-authoritative expiry, tz/cross-midnight, conflicts/concurrency, commercial review, a11y + non-gesture path, reduced motion, all failure states, idempotency. | spec ready · gated |
| — | Wallet / auth / settings / messaging / legal: shared skin + tokens only (never the full Setline) | left |
color-scheme: dark for native inputs/pickers; verify Capacitor status/nav bars.api.rosterplus.io as an isolated backend-only release (rollback-tagged, no frontend). Full auth matrix re-verified live. The live web client's revoke-recovery (client half) still awaits a separate, gated web deploy.rosterplus.io — DONE (main 4d1f8aa, web-only, rollback-tagged). Live.io.rosterplus.app app record / bundle must be created in the ASC UI by the owner.An external reviewer audited the concept (it saw the mock, not this brief — now corrected). Its design spine was right; these points are accepted and folded into the plan above:
Setline component with variants, not three bespoke CSS blocks. Factor a shared primitive when Phase 3 lands, rather than a third hand-rolled block.Not adopted (aimed at the mock, already handled in web/src): "rename Book→Bookings / You→Workspace" (no such tabs — real nav already says Bookings); "no search/filters" (directory has search + favourites; richer facets are an enhancement, not a gap); "Arabic is decorative" (real dictionaries + RTL exist); "no booking flow / press-hold is the only confirmation" (real inquiry→contract→payout flow exists; press-hold isn't built); "placeholder imagery" (mock's 2 stock images; app uses artist avatar_url).