Drag and drop rack visualizer
Plan your rack layout. Drag your devices in, move them around, export it. It runs in your browser. You can close the tab whenever you want.
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:
docker run -d -p 8080:8080 ghcr.io/rackulalives/rackula:latest
curl -O https://raw.githubusercontent.com/rackulalives/rackula/main/docker-compose.yml
docker compose up -d
Then open http://localhost:8080 and get after it.
For layouts that persist across sessions:
git clone https://github.com/RackulaLives/Rackula.git
cd Rackula
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
See Self-Hosting Guide for details.
For production/self-hosted API security:
CORS_ORIGIN should be your real app URL (restricts which browser origins can call the API).RACKULA_API_WRITE_TOKEN protects API PUT/DELETE routes (optional, strongly recommended). If unset, write routes remain open.RACKULA_AUTH_MODE controls centralized auth gate behavior:none: auth gate disabled (best for local/trusted development only)oidc: use an OpenID Connect provider (requires provider config plus RACKULA_AUTH_SESSION_SECRET)local: local auth mode (requires RACKULA_AUTH_SESSION_SECRET; tracking: #1117)RACKULA_AUTH_SESSION_SECRET is required when auth mode is enabled (minimum 32 characters). Use a random secret and rotate it when needed.RACKULA_AUTH_SESSION_COOKIE_SECURE=true (compose templates default to this). Only set false for local HTTP testing.HttpOnly cookie, SameSite=Lax, Secure in productionGenerate strong secrets:
openssl rand -hex 32
Set values in a .env file beside docker-compose.yml:
cat > .env <<'EOF'
CORS_ORIGIN=https://rack.example.com
RACKULA_API_WRITE_TOKEN=replace-with-generated-token
RACKULA_AUTH_MODE=none
# To enable auth gate:
# RACKULA_AUTH_MODE=oidc
# RACKULA_AUTH_MODE=local
# RACKULA_AUTH_SESSION_SECRET=replace-with-generated-secret
# RACKULA_AUTH_SESSION_COOKIE_SECURE=true
EOF
docker compose up -d
Or pass them inline:
CORS_ORIGIN=https://rack.example.com \
RACKULA_API_WRITE_TOKEN=replace-with-generated-token \
docker compose up -d
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.
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.
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.
MIT - Copyright (c) 2025 Gareth Evans