🏠 SurroundShow

"Turn your home into the show." Holiday & event shows on every screen in the house β€” designer, player, venue ordering, and community, rebuilt from the legacy LinkAll8 ASP.NET app as a Next.js 15 + Convex brand app inside the LinkAll monorepo.

Overview Features Flow Tech Roadmap Test results πŸ§ͺ Pair test plan

Overview

LiveBrand app of the LinkAll platform

Repomicrospaces/linkall (LinkAll platform β€” brand apps live under apps/)
LocalC:/Users/AI/Repos/linkall
Owner agentsurroundshowdev
BackendConvex deployment upbeat-capybara-284 β€” one shared schema, one deployment per brand, isolated data
LegacyLinkAll8 multi-tenant ASP.NET (SiteId 1 = SurroundShow, SiteId 2 = FunFirst)
Sibling brandFunFirst (apps/funfirst-web, port 3002) shares the same packages & CI; RedWave web moved to its own repo (microspaces/redwave)
DomainRouteWiring
surroundshow.com/ (brand shell)Vercel project surroundshow-web
homeshow.com/homeshowhost-matched rewrites in apps/surroundshow-web/vercel.json
weddingloco.com/wedding-loco
barloco.com/bar-loco

App features

Flow

Local dev

pnpm install  (repo root)
pnpm dev:surroundshow   β†’  turbo dev --filter=surroundshow-web
        β”‚
        β–Ό
  Next.js 15 on :3001   (thin app β€” pages wire @linkall/ui components)
        β”‚
        β–Ό
  Convex cloud  NEXT_PUBLIC_CONVEX_URL (per-brand deployment)

How the hybrid model replaces legacy multitenancy

  1. Legacy SiteId column + domain→site middleware → each brand is its own Convex deployment; no tenant filtering anywhere.
  2. SignalR DisplayHub scene sync β†’ Convex reactive queries (shows.setScene updates every subscribed player/screen instantly).
  3. Comment tables (group/profile chat) β†’ posts table with replies + upvotes, live-updating.
  4. Layout JSON engine (designer.json/player.json) β†’ typed shows/scenes schema + real React components.
  5. Views/{Tenant} + per-tenant CSS β†’ brand registry + per-app Tailwind @theme tokens.

Deploy

Push to main. Two GitHub Actions workflows:

Domains: the per-show domains (homeshow.com, weddingloco.com, barloco.com) only work while attached to the surroundshow-web Vercel project β€” the host-matched rewrites live in that app's vercel.json.

Tech

Monorepopnpm 9.15.0 workspaces + Turbo 2.x. Root package name linkall-platform.
Appapps/surroundshow-web β€” Next.js 15, React 19, Tailwind 4, port 3001
Backendpackages/backend (@linkall/backend) β€” ONE Convex schema + functions; per-brand deployments. Venue service: venue.ts + venueLogic.ts + 13 indexes
Sharedpackages/ui (@linkall/ui) β€” feed, groups, shows, designer/player, venue settings, guest night, app shell Β· packages/brands (@linkall/brands) β€” brand registry
Mobileapps/mobile β€” Expo (expo-router), brand chosen by EXPO_PUBLIC_BRAND
Vercelframework: nextjs, installCommand: cd ../.. && pnpm install --frozen-lockfile, buildCommand: cd ../.. && pnpm --filter surroundshow-web build, host-matched rewrites for show domains
CI.github/workflows/vercel-deploy.yml + convex-deploy.yml, both matrix per brand
Localpnpm install Β· pnpm dev:surroundshow Β· pnpm typecheck β€” Git Bash on Windows
apps/surroundshow-web/
  app/            # /, shows, designer, player, preview, venue, order, bar,
                  # groups, feed, people, market, events, [slug]/[act]/...
  vercel.json     # host-matched rewrites (show domains)
  .env.local      # NEXT_PUBLIC_CONVEX_URL
packages/
  backend/convex/ # venue.ts, venueLogic.ts, designer.ts, locos.ts, seed.ts, …
  brands/src/     # surroundshow | funfirst | redwave registry
  ui/src/         # shared feature components

πŸ—‚οΈ Roadmap

Live roadmap, managed as GitHub issues (linkall issues). Add or close items on GitHub β€” β˜‘ = done, close as β€œnot planned” to remove.

Test results

2026-08-28 β€” venue module + mobile order verification (local)

Multi-screen player sync across physical devices not yet exercised β€” treat the 08-28 pass as feature + render verification, not a full QA pass.