AbleSign-style digital signage: Next.js web dashboard, Android TV player, Supabase backend, shared TypeScript types.
| Path | Description |
|---|---|
apps/web |
Next.js 14 (App Router), Tailwind, shadcn-style UI, Zustand, Supabase |
apps/android |
Kotlin TV player (Jetpack Compose, Media3 ExoPlayer) |
apps/mobile |
Flutter client console (iOS + Android) — no admin |
packages/types |
Shared domain types |
packages/database |
SQL migrations + Supabase notes |
- Node.js 20+
- pnpm 9+
- Supabase project (free tier is fine)
- Android Studio / JDK 17 for the TV app
cd digital-signage
pnpm install
cp apps/web/.env.example apps/web/.env.localApply migrations in the Supabase SQL editor (or CLI), then fill apps/web/.env.local with your project URL and anon key.
pnpm devOpen http://localhost:3000.
See apps/android/README.md. Use Supabase Anonymous Auth on the TV so Row Level Security and Realtime work without embedding a service role key.
Client-only mobile console (apps/mobile). First allow macOS Gatekeeper for the Homebrew Dart SDK, then:
./scripts/bootstrap-mobile.sh
cd apps/mobile && flutter runSee apps/mobile/README.md.
- TV app signs in anonymously and inserts a
devicesrow with a randompairing_codeandregistered_session_id = auth.uid(). - On the web dashboard, the signed-in user runs “Link device” with that code;
owner_idis set on the matching row. - TV keeps the same anonymous session; RLS allows the session to read its device and playlist assignments.
Use type(scope): description, e.g. feat(devices): add device pairing flow.
- Media and playlists are designed for caching on the TV; prioritize resilient playback when bandwidth is variable.
- Payment hooks (bKash/Nagad/etc.) can be added later on the web app as separate modules without changing the core schema.