Source-available, self-hosted digital signage for the places people gather.
Restaurants, churches, schools, event venues, and community spaces.
DisplayGrid gives you full control over your screens without a cloud subscription, recurring fees, or vendor lock-in.
Website · Download · Roadmap · Guides · Report a Bug
Desktop apps — the fastest way to run DisplayGrid. The Server App is fully self-contained: it creates its database on first launch, opens the dashboard in a native window, and keeps itself updated from GitHub Releases.
| App | Windows | macOS (Universal) | Linux |
|---|---|---|---|
| Server — dashboard + WebSocket server | .exe | .dmg | .AppImage · .deb |
| Kiosk — fullscreen display client | .exe | .dmg | .AppImage · .deb |
Docker — the whole server in one container; migrations run on boot and all state lives in a single volume:
docker run -d --name displaygrid \
-p 3000:3000 -p 3001:3001 \
-v displaygrid-data:/data \
ghcr.io/joemighty/displaygrid:latestOr docker compose up -d — compose.yaml includes an optional HTTPS proxy profile.
Raspberry Pi displays run Chromium in kiosk mode pointed at your server. On a fresh Raspberry Pi OS Lite, one command sets everything up:
curl -sSL https://joemighty.github.io/DisplayGrid/pi-setup.sh | bashIt installs Chromium, asks for your server address and screen token, and boots the Pi fullscreen into your signage — see the Raspberry Pi guide. No app install, no device maintenance: server updates reach every Pi instantly.
Any browser display — pair with zero typing by putting the token in the URL: open http://<server>:5555/display?token=<token> on the device (bookmark it, or use a memorable custom token like lobby set on the Screens page).
| Screens dashboard | Playlist manager |
![]() |
![]() |
| Asset library | Multi-zone layout editor |
![]() |
![]() |
| Display client (kiosk view) | |
![]() |
|
Content & playback
- Drag-and-drop playlist builder with per-slide durations, transitions, and day/time scheduling
- Asset library for images, videos, and PDFs with automatic WebP optimisation
- Live streams: HLS (
.m3u8) and WebRTC (WHEP) sources as slides — pair with go2rtc or MediaMTX to put IP cameras and OBS feeds on any screen - Web page, custom HTML, clock, and text slides
- Multi-zone layouts: split any screen into independently controlled regions, each with its own playlist
Screens & operations
- Multi-screen management: resolution, refresh rate, rotation, colour profile, and LED panel grids per screen
- Real-time delivery — WebSocket pushes playlist changes to every display instantly
- Screen health monitoring: live online/offline status, last-seen, client IP
- Emergency override: broadcast a full-screen alert to every display with one click
- Offline resilience — displays cache their last playlist and keep playing through outages
Platform
- Role-based access: Super Admin, Admin, Operator, Viewer
- Kiosk lock: PIN-protected overlay with a configurable unlock key combo
- Auto-updating apps — kiosks update silently on restart, never mid-show
- Runs on Windows, macOS, Linux, Raspberry Pi, and Docker
See the roadmap for what's next — a documented REST API, date-range scheduling, and NDI support.
| Layer | Technology |
|---|---|
| Dashboard | Next.js 14 (App Router), Tailwind CSS |
| Database | SQLite · Drizzle ORM · better-sqlite3 |
| Auth | Auth.js v5 (JWT, edge-safe) |
| Real-time | Node.js ws WebSocket server |
| Display client | Vite + React (+ hls.js for streams) |
| Desktop apps | Electron + electron-updater |
| Monorepo | Turborepo + pnpm workspaces |
git clone https://github.com/JoeMighty/DisplayGrid.git
cd DisplayGrid
pnpm install
cp apps/dashboard/.env.example apps/dashboard/.env.local # then fill in values
mkdir -p data && pnpm db:migrate
pnpm dev # dashboard :3000 + display client :5173
node apps/dashboard/ws-server.js # WebSocket server :3001 (second terminal)Open http://localhost:3000 and follow the setup wizard. Requirements: Node.js 18/20, pnpm 10+. The full walkthrough — including environment variables, local domains, and reverse proxies — is in the Getting Started guide.
DisplayGrid/
├── apps/
│ ├── dashboard/ # Next.js dashboard + ws-server.js
│ ├── display-client/ # Vite/React display client
│ ├── electron-server/ # Desktop server app (tray + native window)
│ └── electron-kiosk/ # Desktop kiosk app (fullscreen)
├── packages/
│ ├── db/ # Drizzle schema, migrations, SQLite client
│ └── shared/ # Types and constants shared across apps
├── docker/ # Container entrypoint + Caddyfile
├── docs/ # Website (GitHub Pages) + guides
└── compose.yaml # Docker Compose (optional TLS profile)
Setup and operations guides live on the website: Getting Started · Hardware · Kiosk Setup · Network · Raspberry Pi
Issues and pull requests are welcome. Please open an issue before starting significant work so we can discuss the approach.
DisplayGrid is designed for community gathering places: restaurants, churches, schools, and event venues.
These aren't just intentions — they are binding license terms. DisplayGrid is licensed under the Hippocratic License 3.0 with the Mass Surveillance, Military Activities, and Law Enforcement modules, which prohibit using it for surveillance programs, military activities, or providing services to law enforcement agencies. Facial recognition and other biometric monitoring fall under the license's privacy and mass-surveillance clauses.
Hippocratic License 3.0 (HL3-LAW-MIL-SV) — free to use, modify, and distribute, including commercially, subject to the ethical conditions above. This makes DisplayGrid source-available rather than OSI open source.
Releases up to and including v1.0.18 were published under the MIT License and remain available under it.
By JoeMighty




