- Light mode: fix 40+ missing CSS overrides (solid emerald/cyan bg-950, 300-level text colours, border opacity variants, hover states, violet accent, bg-slate-900/30 and /90, bg-rose-950/30, red-950/50) - Light mode: fix broad bg-gradient-to-br override to only target dark banner cards (from-[#1E293B]), preserving coloured user avatar gradients - Light mode: BookingDetailsModal JSON panel switched to GitHub-Light style (bg #f6f8fa) including <pre> override so the general 'pre' rule cannot darken it back - Dashboard: simplify banner (flat card, no gradient/watermark/time-widget) - Dashboard: reduce visual noise (shorter titles, remove LIVE animated badge, remove italic notes quote, neutral checklist items, no footer jargon) - Dashboard: normalise section-icon colours to slate-400 except Active (emerald) - Dashboard: replace non-standard Tailwind classes (slate-101/350/905/1000, indigo-405, emerald-990) with valid equivalents - Dashboard: standardise button style to rounded-lg + text-xs across Active Reservations and Upcoming cards; add visible borders on Cancel/Purge
GhostGrid
GhostGrid is an internal network lab and device inventory tool for managing hardware lab environments.
The application uses an Express backend and a Vite/React frontend running in a single Node.js process. Data is stored locally in a SQLite database using better-sqlite3.
GhostGrid is designed to run fully offline. Fonts are bundled locally through @fontsource, and the application does not load external code, assets, or CDN resources at runtime.
Features
-
Dashboard
Overview of active and upcoming reservations, plus a quick links widget for frequently used tools. -
Bookings
Reserve complete lab topologies or individual devices for a defined time period. Bookings include conflict detection and device status validation. -
Inventory
Manage lab devices, including emergency and rescue information. Live device status is retrieved from CheckMK. -
Topology
Visualize devices and connections for each lab environment. -
Quick Links
Shared link dashboard for internal tools such as CheckMK, Semaphore, documentation, or jump hosts. -
Team
Overview of all registered users. -
Logbook
Shared audit and maintenance journal for lab activity, operational notes, and troubleshooting history.
Device Status
Device reachability is monitored in CheckMK and imported through the CheckMK API.
Each device can be linked to CheckMK using the CheckMK Host URL field. If no CheckMK binding is configured, the device status is set to unknown.
Devices with an unknown status are not available for booking.
Local Development
Requirements
- Node.js 20 LTS
Setup
npm install
npm run dev
The application will be available at:
http://localhost:3000
The development server runs the Express backend with Vite middleware.
Available Scripts
npm run dev
Start the local development server.
npm run build
Build the frontend into dist/ and bundle the server as dist/server.cjs.
npm start
Start the built production server. This expects NODE_ENV=production.
npm run lint
Run the TypeScript type check using tsc --noEmit.
Configuration
Configuration is loaded from environment variables or a local .env file. See .env.example for reference.
| Variable | Description |
|---|---|
JWT_SECRET |
Secret used to sign JSON Web Tokens. This must be set explicitly in production. Without a value, the application falls back to an insecure default. |
PORT |
HTTP port used by the application. Defaults to 3000. |
Deployment
Production deployment is intended to run inside a Proxmox LXC container using systemd.
For detailed deployment instructions, see:
DEPLOY.md
The container runs both branches in parallel:
| Branch | Purpose | Port |
|---|---|---|
main |
Production | 3000 |
dev |
Staging | 3001 |
Each branch runs as a separate systemd service and uses its own database.