YardBird is a pure frontend SPA that connects directly to your layout hardware — no backend server, no database. Build your control panel visually: create tabs, drag widgets onto a grid, and configure each one. Your layout is saved locally and can be exported as a YAML file.
- Visual dashboard editor — drag widgets onto a grid, resize, reorder tabs, import/export config
- Locomotive throttles — speed, direction, and function buttons from your JMRI roster
- Turnouts — toggle switch positions via JMRI / LCC
- Lights — toggle LCC lights, independent of track power
- DC tram control — JMRI-native tram loop control via a DCC-EX sub-connection, with configurable PWM frequency
- Command station power — per-connection power buttons with combined on/off in the header
- Home Assistant — control HA lights and switches from your dashboard
- Responsive — works on desktop, tablet, and mobile
mkdir -p config
cp yardbird.example.yaml config/yardbird.yaml
$EDITOR config/yardbird.yaml # set your JMRI host
docker compose up -dOpen http://localhost:9273.
npm install
npm run dev # http://localhost:5173See docs/installation.md for full setup details, including JMRI prerequisites and DCC-EX tram control.
Connection settings are managed through the UI and saved in localStorage. yardbird.yaml provides factory defaults — it is only read when no saved config exists (first run or after a reset).
See docs/configuration.md for the full YAML schema, widget reference, and export/import format.
See docs/architecture.md for the plugin system, config flow, Gridstack canvas details, and how to add new widget types.
| Vue 3 + TypeScript | Composition API throughout |
| Vite | Dev server and build tool |
| Nuxt UI 4 + Tailwind CSS 4 | UI components and styling |
| Gridstack | Drag-and-drop grid canvas |
| jmri-client | JMRI WebSocket communication |
| js-yaml | Config file parsing and export |
Private use only