MENUSIGN TV documentation
Complete guide to the admin dashboard, screen editor, media library, team access, store hours, and TV players. Use the table of contents on desktop or scroll the section chips on mobile. For the fastest path: create a screen, add menu items, save, then pair your display with the 6-digit code.
Quick start
- Sign in at menusign.tv with your workspace email.
- Open Dashboard for a snapshot of screens, playlists, media, and devices.
- Go to Screens → Add Screen. Name the display and optionally assign a group.
- In the screen editor, add images or videos (upload or pick from Media).
- Click Save Screen — changes are not live on TVs until you save.
- Copy the 6-digit TV Pairing Code from the editor.
- On the TV, open the player at live.menusign.tv (or the Samsung / iOS app) and enter the code.
- Confirm the screen shows Online under Devices or in the screen editor.
Pro tip: Export all menu artwork at the same aspect ratio as your physical mount (16:9 landscape or 9:16 portrait) before uploading — see Image & video sizes.
Overview & concepts
MENUSIGN TV is a digital menu signage platform. You manage content in the web admin; each TV runs a player app that downloads the assigned menu and plays it full screen.
- Organization — your workspace. All screens, media, and members belong to one organization.
- Screen — one logical menu for one physical display. Each screen has its own pairing code and playlist.
- Screen group — optional folder to organize many screens. Groups can share store open/close hours.
- Menu item / playlist item— an image or video slot on a screen's menu, with order, duration, and rotation.
- Media library — shared uploads reused across any screen.
- Device — a paired TV identified by a device ID (often MAC-style). Linked to exactly one screen at a time.
- Player — web, Samsung Tizen, or iOS app that pairs with a code and plays the menu.
Media is shared; menus are not. Each screen maintains its own ordered list of items unless you explicitly copy from another screen.
Dashboard
The dashboard at /dashboard is your home after sign-in.
- Summary cards for Screens, Playlists, Media files, and TV Devices — each links to that section.
- Quick counts help you see whether content or pairing is missing before opening a detail page.
- Use the sidebar for day-to-day navigation; Dashboard is the overview only.
Screens & groups
All Screens page
- Visual and List views — switch with the segmented control. Visual shows card thumbnails; List is compact for many screens.
- Create group — organize screens (e.g. by location or brand). Drag screens between groups when editing.
- Add screen — opens the screen editor for a new display.
- Edit and Delete actions per screen or group (confirm before delete).
- Store hours badge on groups when open/close scheduling is enabled.
Pairing
- Open a screen in the editor and note the 6-digit TV Pairing Code.
- On the display, launch the player (live.menusign.tv or native app).
- Enter the code. The device links to this screen only.
- Status becomes Online when the player heartbeats successfully.
- Use Disconnect in admin to force the player back to the pairing screen.
Each screen has a unique pairing code. A code cannot pair two TVs to different menus simultaneously — unpair first if reassigning hardware.
Screen editor
- TV Preview — frame matching 16:9 (landscape) or 9:16 (portrait). Use the TV icon to set mount rotation (how the display is physically installed).
- Per-item rotation — image icon on a thumbnail rotates individual content (0°, 90°, 180°, 270°).
- Add Content— upload new files, pick from the media gallery, schedule start/end dates, or copy items from another screen's menu.
- Menu Items — thumbnails for this screen only. Select an item; drag to reorder when Slide Mode is on.
- Save Screen — publishes the menu and bumps the revision players listen for. Always save after edits.
Standard mode(Slide Mode off): one item is "live" on the TV — click the thumbnail to select it, then Save Screen.
Slide mode (Slide Mode on): all active items play as a slideshow — see Slide mode.
Store hours
Configure open and close times at the screen group level. When enabled, players receive a store_closed signal outside those hours and show a black screen until open.
| Enable | Toggle on the group bar in Screens (list or visual view). |
|---|---|
| Times | Open and close in local time (24h). Overnight ranges (e.g. 22:00–06:00) are supported. |
| Override | Per-screen overrides can inherit or replace group hours when configured in the editor. |
| Player | Playlist API includes store_hours; players refresh on the next poll or SSE event. |
Saving group hours signals connected screens so TVs update without a manual reboot.
Slide mode (slideshow)
Turn on Slide Mode in the screen editor to run all active items as a slideshow.
| Sec | Seconds each image stays on screen (images only) |
|---|---|
| Videos | Play their full length, then advance to the next slide |
| Sec locked | If every item is a video, Sec is disabled |
| Transition | Fade, slide, wipe, zoom, and other transitions between items |
| Loop | After the last slide, return to the first |
| Video mute | TVs often start muted; unmute in preview if you need sound on TV |
After changing slide settings or menu items, click Save Screen. Players pick up changes within seconds via live updates or polling.
Media library
Central gallery at /media for all uploads.
View modes
| Current | Default grid with large thumbnails — best on desktop |
|---|---|
| Compact | Dense grid for browsing many files on tablet or phone |
| List | Row layout with filename, type badge, and delete — best for long filenames |
Upload & reuse
- Drag files onto the upload area or click to browse. Large videos use resumable upload (up to 100 MB).
- Deleting from Media removes the file from storage; remove it from screen menus first if still in use.
- When editing a screen, Add Content → Gallery picks from this library without re-uploading.
Playlists
The Playlists page lists reusable playlist records in your organization. Screen menus are managed primarily in the screen editor; the Playlists section is useful for overview, legacy flows, and bulk playlist management.
- Create playlists and attach items with duration and rotation metadata.
- Assign or sync playlists to screens from the Screens workflow as your deployment uses.
- Reorder items in the playlist detail view; changes follow the same Save / revision rules as screens.
Calendar
Calendar shows scheduled menu items across screens by date.
- Set start and end dates when adding content in the screen editor (schedule fields).
- Use Calendar to see what will appear on which day without opening each screen.
- Items outside their schedule are skipped by the player automatically.
Devices & telemetry
Devices lists every TV that has paired with your organization. Each row reports both pairing state and live telemetry the player POSTs every 5 minutes.
| Device ID | Unique identifier (MAC for Tizen, prefixed UUID for FIRETV / IOS / WEB) |
|---|---|
| Platform | Fire TV, iOS, Web, or Tizen — derived from the device_id prefix |
| Screen | Which screen this device is currently linked to |
| Status | Online when heartbeat is within 20 min; offline otherwise |
| Revision | Playlist revision the device is actually showing — proves the menu update reached this TV |
| App version | Player app build the device is running (useful when rolling out updates) |
| Last error | Most recent error the player hit (network timeout, etc.) — surfaces issues without walking to the venue |
| Last seen | Updated every ~45s during open hours; every 15 min during closed hours (deep-idle mode) |
Filter by status (Online / Offline / All), by platform (Fire TV / iOS / Web / Tizen), or search by MAC or screen name.
Disconnecting a device in admin clears the pairing session; the TV must enter the code again. The current pairing code stays the same — use Regenerate code on the screen panel if you want a fresh code for security.
TV players
Web player (browser)
- Open https://live.menusign.tv in the TV or tablet browser (many smart TV browsers work).
- Enter the 6-digit pairing code from the screen editor.
- Leave the tab open for continuous playback.
- After one successful online load, the web player can use cached playlist data offline.
- If admin disconnects the device, the player returns to the pairing screen.
Dedicated apps for LG webOS, Amazon Fire TV, Roku, and Android are not released yet. Use the web player on those platforms when a browser is available.
Samsung Tizen (native app)
- Install the MENUSIGN package from Samsung Seller Office / sideload for development.
- Same pairing API as web: POST pairing code + device_id, then poll playlist revision.
- Supports slideshow vs single-item playback_mode and store_closed black screen.
- Back / Return on the remote unpairs (same as Disconnect flow).
iOS / iPadOS / Apple TV
Use the native MENUSIGN TV player app for iPhone, iPad, and Apple TV (build from the project in apps/ios). Pair with the same 6-digit code; assets follow the same 16:9 / 9:16 rules as TVs.
Player URL: https://live.menusign.tv
Offline playback
Every paired TV keeps playing its assigned menu even with no internet at all. After one successful online sync each player stores the full playlist (JSON + every image + every video) locally.
| Fire TV / Fire Stick | Full offline cache — playlist JSON + media files on internal storage. Plays indefinitely without network. |
|---|---|
| iOS / iPadOS / Apple TV | Same — SlideMediaCache stores every URL under Application Support. |
| Samsung Tizen | IndexedDB-backed media cache (Tizen 3+). Same guarantee as Fire TV. |
| Web player (browser) | IndexedDB + blob URLs. Browser HTTP cache holds media for 1 year (immutable). |
- A single network blip never disconnects a paired TV — three consecutive unpaired-status responses are required before unpair (matches every platform).
- When the network returns, players auto-detect the revision change and refresh both playlist and media cache.
- Store hours and slideshow timing run off the device's local clock, so they work the same online and offline.
- Emergency takeover and force-refresh signals are buffered until network returns; players honor them on the next poll cycle.
Cold start, never online: a brand-new device that has never reached the API can't pair. Once paired at least once, the device handles offline indefinitely.
Live updates & force refresh
When you save a screen, change store hours, or push an emergency takeover, the paired TVs see the change in seconds rather than waiting for a poll cycle.
- Force refresh button — on the screen connection panel, click Refresh to push a signal that connected players honor immediately (≤ 1 s on web, ≤ 12 s on Fire TV / iOS / Tizen).
- SSE — web players subscribe to
/api/screen/[id]/eventsfor revision bumps and disconnect signals. - Polling fallback — Fire TV / iOS / Tizen poll the revision endpoint every 12 s during open hours, and every 15 min during store-closed hours (deep-idle mode).
- Heartbeat POST every ~45s during open hours keeps Devices status Online; backs off to 15 min during closed.
Emergency takeover
Push a fullscreen message to every TV in the organization in one click — useful for power outages, surprise closures, fire drills, or limited-time promotional banners.
- Open the Screens page.
- Click Emergency takeover at the top.
- Pick a preset (Closed / Maintenance / Custom) or type a custom message.
- Optionally set an end time — the takeover auto-clears at that moment.
- Click Activate on all TVs. The red banner shows the takeover is live until you Clear it.
- Web players switch within 1 second; Fire TV / iOS / Tizen within 12 s during open hours.
- While takeover is active, the normal slideshow pauses on every TV.
- Clearing the takeover resumes the assigned playlist automatically.
- Every activate / clear is recorded in the Audit log.
Group bulk actions
When you operate multiple locations, you'll do the same thing on many screens at once. Group-level bulk actions save dozens of clicks.
- Assign menu to group — click Assign menu on the group header, pick a playlist, and every screen in the group is updated in a single round-trip. Each connected TV gets a refresh signal so the new menu appears within seconds.
- Group store hours — set open / close times once on the group; every screen in the group inherits them. Override per-screen if a specific location has different hours.
- Group-wide signal — the store-hours signal endpoint pushes a refresh to every paired TV in the group when hours change.
Archive & restore
Both screens and playlists support soft-delete. Archive removes the item from the active list without losing its history; Restore brings it back.
- Click the small Archive icon (next to Delete) on any screen or playlist row.
- Archived items disappear from the main list. A banner at the top shows "N archived hidden — Show archived."
- Click Show archived to view them; each row has a Restore icon to bring it back.
- Hard Delete is still available and still cascades (linked devices unassigned, items deleted). Archive is the safer default for items you might want back.
Audit log
Every sensitive admin action is recorded with actor email, target, timestamp, and a JSON metadata blob. Open the Audit log page from the sidebar (Owner / Admin only).
Actions logged
- Screen force refresh
- Screen pairing code regenerated
- Screen device disconnected
- Screen archived / restored
- Playlist archived / restored
- Group menu assigned (bulk)
- Emergency takeover set / cleared
- Media orphan cleanup
Filters
- By action (dropdown of values actually present)
- By actor email (substring search)
- By time range (Last 24h / 7 days / 30 days / 90 days / All)
Image & video sizes
One rule for every display. Export at the correct aspect ratio for how the screen is mounted — not the exact pixel size of each TV model. Use the same files on smart TVs, the web player, and iOS.
Match media to mount orientation. The player uses a 16:9 landscape frame when horizontal, and 9:16 portrait when vertical (90° or 270° mount rotation in the editor).
| Landscape | 16:9 — e.g. 1920×1080 (Full HD) or 3840×2160 (4K) |
|---|---|
| Portrait | 9:16 — e.g. 1080×1920 or 2160×3840 |
| All devices | Ratio matters more than exact resolution |
| Images | Fit inside the frame (letterboxing possible if aspect differs) |
| Videos | Fill the frame (edge-to-edge; may crop slightly) |
Landscape 16:9
- Ideal: 1920 × 1080 px
- Also fine: 1280 × 720, 3840 × 2160
- Ratio: width ÷ height ≈ 1.78
Portrait 9:16
- Ideal: 1080 × 1920 px
- Also fine: 720 × 1280, 2160 × 3840
- Ratio: height ÷ width ≈ 1.78
Align TV Preview mount rotation with the physical display before exporting artwork.
Formats & limits
| Images | JPG, PNG, GIF (JPG for photos, PNG for graphics) |
|---|---|
| Videos | MP4 (H.264) recommended; WebM and MOV supported |
| Max video | 100 MB per file (resumable upload) |
| Avoid | Tiny images on 4K TVs; portrait files on landscape mounts |
Media cleanup
Files keep accumulating in your media bucket as menus evolve. The Media library page exposes a one-click cleanup that finds files no playlist item references.
- Open the Media library.
- Click Clean up unused at the top-right.
- You see a preview: "N files, X MB." Confirm to delete, or cancel.
- All orphaned files are removed in a single round-trip.
- The action is recorded in the Audit log with file names + total bytes freed.
Owner or Admin role required. Editor role can't run cleanup.
Members & roles
Owners and admins manage team access at /members.
| Owner | Full access, including members and ownership |
|---|---|
| Admin | Manage content and team members (except owner) |
| Editor | Edit screens, playlists, and media only |
- Invite by email; pending invites appear until the user accepts.
- Only owners can transfer ownership or demote the last owner.
- Editors can change screens and media but cannot manage billing or all member actions.
Settings
Settings covers your account email, member role display, display defaults, and system information for the workspace.
- Theme follows your browser or the in-app light/dark toggle in the sidebar.
- Password changes use Supabase Auth email flows (reset link from login).
Pricing & billing
Per-screen pricing — pay only for what you put on a screen. All plans include the full admin and every TV player, with offline playback on all four platforms.
| Free | $0 — 1 screen, no card, all core features |
|---|---|
| Starter | $9 / screen / month (up to 4 screens) — audit log + offline + store hours |
| Reliability | $12 / screen / month (5–25 screens) — adds per-device telemetry, force refresh, emergency takeover, priority email support |
| Multi-location | $15 / screen / month (25–100 screens) — adds group bulk-assign, soft delete + restore, members + roles, orphan media cleanup |
| Enterprise | $25 / screen / month, min 100 screens — adds SAML SSO, custom domain, dedicated CSM, uptime SLA |
- Annual billing saves 20% on every paid tier.
- Billing appears in the sidebar for owners only. Admins and editors don't see it.
- Hardware (e.g. Fire TV Stick) is not included — buy direct from the manufacturer.
- For enterprise contracts, custom invoicing, or onboarding help, email [email protected].
API reference
TV-facing routes are public (CORS-enabled) and use the service role on the server. Admin routes require Supabase session cookies.
| POST /api/device/pair | Body: pairing_code (6 digits), device_id. Links device to screen. |
|---|---|
| GET /api/device/{mac} | Returns screen_id assigned to device (or null). |
| GET /api/screen/{id}/playlist | Full playlist, revision, playback_mode, store_hours, store_closed. |
| GET /api/screen/{id}/events | SSE stream for revision / store-hours updates. |
| POST /api/device/update-last-seen | Body: device_id. Heartbeat for Online status. |
Example playlist item fields: url, type, duration, rotation, aspect_ratio.
Troubleshooting
- Black or white bars on images — wrong aspect ratio; re-export at 16:9 or 9:16 or fix mount rotation in preview.
- Video text cropped — videos fill the frame; keep text in the center safe area.
- TV not updating — click Save Screen; confirm device is Online; refresh the player tab.
- Invalid pairing code — use the code from the same screen; check for typos; ensure API host matches your admin deployment.
- Upload fails — use MP4 H.264 under 100 MB; check network; retry resumable upload.
- Store closed black screen — expected outside group store hours; adjust hours or disable on the group.
- Dev server chunk 404 — stop stale
next devprocesses and runnpm run dev:clean.
Glossary
| Pairing code | 6-digit code unique per screen for TV setup |
|---|---|
| Revision | Integer bumped on save; players detect changes |
| Playback mode | slideshow (all items) or single (one live item) |
| Mount rotation | Physical TV orientation in the editor frame |
| Content rotation | Per-item rotation of an image or video |
| store_closed | API flag telling players to show a black screen |
| RLS | Row Level Security — Postgres rules for tenant isolation |
Support
For account, billing, or technical help, email [email protected]. Include your organization name, screen name, and device ID when reporting player issues.
Admin: https://menusign.tv · Player: https://live.menusign.tv