- TypeScript 76.7%
- Svelte 19.7%
- Shell 2.3%
- CSS 0.8%
- JavaScript 0.3%
- Other 0.1%
* chore: remove the app light theme (#2468) Make dark the single app chrome theme. The light (Alucard) theme was opt-in, default off, and already dropped from the mobile View options, so keeping it was a per-token maintenance tax for a rarely-used mode. Removed: - the [data-theme="light"] token block plus the color-scheme and theme-color light hints in index.html - the Settings "Dark theme" toggle, the ui-store theme state/actions, and src/lib/utils/theme.ts - the vestigial theme props passed to MobileViewSheet - the unused sun/moon icons - the Alucard contrast utilities and their tests Also fixes the layout-preview thumbnails to render a dark rack (a mini-canvas) instead of light grey. The transparent preview background fell through to the export renderer's light branch; the preview now uses a dark background. The export "Light background" option (independent, for white paper) is unchanged. Visual-regression baselines were mostly captured in light theme, so the spec now renders dark and the baselines are regenerated separately. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C2VoE74ScZpfBtvs1MCeKW Signed-off-by: ggfevans <hi@gvns.ca> * test: regenerate visual baselines for dark-only theme (#2468) The visual-regression suite captured most states in light theme. With the light theme removed the spec now renders dark, so the Linux baselines were regenerated via the Update Visual Snapshots workflow. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C2VoE74ScZpfBtvs1MCeKW Signed-off-by: ggfevans <hi@gvns.ca> --------- Signed-off-by: ggfevans <hi@gvns.ca> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| .github | ||
| .husky | ||
| api | ||
| assets | ||
| assets-source/device-images | ||
| deploy | ||
| docs | ||
| e2e | ||
| scripts | ||
| src | ||
| static | ||
| .coderabbit.yaml | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| .markdownlint-cli2.jsonc | ||
| .mcp.json | ||
| .octocov.yml | ||
| .prettierignore | ||
| ACKNOWLEDGEMENTS.md | ||
| AGENTS.md | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| docker-compose.yml | ||
| eslint.config.js | ||
| index.html | ||
| LICENSE | ||
| login.html | ||
| package-lock.json | ||
| package.json | ||
| performance-budget.json | ||
| prettier.config.js | ||
| README.md | ||
| SECURITY.md | ||
| svelte.config.js | ||
| tsconfig.json | ||
| vite.config.ts | ||
| vitest.config.ts | ||
Drag-and-drop rack layout designer
Plan your rack, move some pixels, save your shoulders.
Features
- Drag and drop devices into your rack from a real hardware library
- Real device images from the NetBox devicetype-library, not grey boxes
- Export layouts to PNG, PDF, or SVG for documentation and change requests
- Share layouts via URL or QR code, no file attachments needed
- Mobile-friendly interface for field use
- Bayed rack grouping for AV installs and multi-cabinet deployments
- Optional persistent storage with API-backed layout sync
- Self-hostable via Docker, Proxmox LXC, or bare metal
- Optional auth with local accounts or OIDC for shared deployments
Who It's For
| Audience | Use Case |
|---|---|
| Homelabbers | Plan your server rack before you rack it. Move pixels, not 4U servers. |
| AV Technicians | Bayed rack support for audio installs, map out amp racks, patch bays, and processor chains. |
| Network Engineers | Document and plan switch/router topologies. Export for runbooks and change requests. |
| Data Centre Teams | Layout planning for colo cages and enterprise cabinets. Share via URL with your team. |
| Educators & Students | Teach networking and infrastructure concepts with a visual, hands-on tool. No licence keys, no gatekeeping. |
Why Though?
You might ask, why should I make an imaginary rack like some sort of IT cosplay? And to that I would say, "fine then! don't! SCRAM!" but also, consider:
- Plan your layouts before you build them. It's a lot easier to move your mouse than that 4U server full of hard drives. Your shoulder will thank you.
- Document existing layouts so you know what is where.
- Because you can
How Racks Work
Racks are measured in rack units, written U. One U is 1.75 inches of vertical space, and a common full-height rack is 42U. Rackula models racks in whole U: a device occupies a whole number of units and mounts at a whole-U boundary, the same way real rails register equipment under the EIA-310 standard. If something sits at U5, it is really at U5, not floating part of a unit above it.
Gear smaller than 1U, like half-height brackets or side-by-side half-width pairs, does not bolt to the rails on its own. It rides inside a 1U carrier (a bracket, tray, or shelf) that takes up one whole U and holds the smaller devices. The carrier registers to the rails, and the small devices register to the carrier.
Get Started
Use it right now
count.racku.la no account, no install, just racks.
Self-host with Docker
This is a quick run of the client-side only frontend (no persistence across browser sessions):
docker run -d -p 8080:8080 ghcr.io/rackulalives/rackula:latest
Or with Docker Compose:
curl -fsSL https://raw.githubusercontent.com/RackulaLives/Rackula/main/deploy/docker-compose.persist.yml -o docker-compose.yml
mkdir -p data && sudo chown 1001:1001 data
docker compose up -d
Open http://localhost:8080 and get after it.
Build from Source
git clone https://github.com/RackulaLives/Rackula.git
cd Rackula && npm install && npm run build
Serve the dist/ folder however you like. It's just files.
Deploy on Proxmox (LXC)
Note: LXC is currently in pre-release. See the Self-Hosting Guide for details and manual install instructions.
Security & Auth
For production deployments, configure API security and authentication:
# Generate secrets
openssl rand -hex 32 # API write token
openssl rand -hex 32 # Session secret (if using auth)
Set CORS_ORIGIN, RACKULA_API_WRITE_TOKEN, and optionally RACKULA_AUTH_MODE (none, local, or oidc) in your .env file.
See the Self-Hosting Guide for full configuration details including auth modes, env vars, and TLS setup.
Built With Claude
This project was built using AI-assisted development with Claude. I told it what to build and then said "no, not like that" a lot. The AI did a lot of typing. Commits with substantial AI contributions are marked with Co-authored-by tags because we're not going to pretend otherwise.
Documentation
Acknowledgements
Built for the r/homelab and r/selfhosted communities. Colours from Dracula Theme. Device data from NetBox devicetype-library. See ACKNOWLEDGEMENTS.md for full credits.
Star History
Licence
MIT Copyright © 2025-2026 Gareth Evans