This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
ServerKit is a server control panel for managing web applications, databases, Docker containers, and security on VPS/dedicated servers. Flask backend (Python 3.11+), React frontend (Vite + LESS), SQLite/PostgreSQL database, real-time updates via Socket.IO.
# Backend (port 5000, hot-reload)
cd backend && python -m venv venv && source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
python run.py
# Frontend (port 5173, Vite HMR)
cd frontend && npm install && npm run dev
# Both at once (Linux/WSL)
./dev.sh
# Frontend lint
cd frontend && npm run lint
# Frontend production build
cd frontend && npm run build
# Backend tests
cd backend && pytest
cd backend && pytest --cov=app
# Docker
docker compose -f docker-compose.dev.yml up --buildDefault dev credentials: admin / admin
Flask app factory in app/__init__.py using create_app(). Three-layer architecture:
app/api/— Flask Blueprints, one file per feature (36 files). All routes prefixed/api/v1/. JWT-protected via@jwt_required().app/services/— Business logic (48 files). Services are stateless modules called by API routes. Heavy lifting (shell commands, Docker API, file operations) happens here.app/models/— SQLAlchemy ORM models (15 files). Tables auto-created on startup viadb.create_all().
Other backend components:
app/sockets.py— Socket.IO event handlers for real-time metrics, logs, terminalapp/agent_gateway.py— Multi-server agent communicationapp/middleware/security.py— Security headers middlewareconfig.py— Environment-based config (development/production/testing)run.py— Entry point
React 18 SPA with client-side routing:
pages/— Route-level components (~29 files). Each maps to a route inApp.jsx.components/— Reusable UI components shared across pages.contexts/— React Context providers:AuthContext(JWT auth + token refresh),ThemeContext,ToastContext,ResourceTierContext(feature gating).services/api.js— CentralizedApiServiceclass handling all HTTP requests, token management, and auto-refresh.hooks/— Custom React hooks for reusable logic.styles/— LESS stylesheets with design system variables. Main entry ismain.less. Page-specific styles instyles/pages/.layouts/—DashboardLayoutwraps authenticated pages (sidebar + header).
Route guards: PrivateRoute (auth check), PublicRoute (redirect if logged in), SetupRoute (redirect to /setup if not configured).
Browser → Nginx (:80/:443) → proxy_pass to Docker containers (:8001-8999) for managed apps, or to Flask (:5000) for the panel API. The 404 handler in Flask serves index.html for SPA client-side routing; API routes return JSON errors.
The Dockerfile is multi-stage: Node 20 builds frontend, Python 3.11 serves everything via Gunicorn with GeventWebSocket workers. Built frontend is served from Flask's static folder.
ServerKit deploys on Linux (bare metal, VPS, or Docker). Development may happen on Windows/macOS.
- Service layer is Linux-only — nginx, systemctl, apt/dnf, PHP-FPM, etc. are inherently Linux. No need to abstract these for Windows.
- Platform-agnostic code (config management, storage, API layer) should guard Unix-only calls like
os.chmodwithif os.name != 'nt'so the dev server can run locally on any OS. - Distro differences matter — use
backend/app/utils/system.pyhelpers (get_package_manager,is_package_installed,install_package) instead of callingapt/dpkg/dnfdirectly. Not all targets are Debian-based.
- PEP 8, type hints where helpful
- Service functions are standalone (no classes unless stateful)
- Consistent JSON error responses:
{'error': 'message'}, status_code
- Functional components with hooks only
- PascalCase for components (
Sidebar.jsx), camelCase for everything else - LESS for styling — use existing design system variables (
@card-bg,@primary-color,@spacing-md, etc.) and BEM-like naming (.block__element--modifier) - Context API for global state; props drilling is fine for 2-3 levels
- No inline styles; no Tailwind/CSS-in-JS
- One logical change per commit
- Minimal, focused diffs — don't silently refactor surrounding code
- Branch naming:
feature/,fix/,docs/,refactor/prefixes
- Model: Add SQLAlchemy model in
backend/app/models/ - Service: Add business logic in
backend/app/services/ - API: Create Blueprint in
backend/app/api/, register it inapp/__init__.pywithurl_prefix='/api/v1/<feature>' - Frontend API: Add methods to
ApiServiceinfrontend/src/services/api.js - Page: Create page component in
frontend/src/pages/, add route inApp.jsx - Styles: Add LESS file in
frontend/src/styles/pages/, import inmain.less
| Variable | Purpose |
|---|---|
SECRET_KEY |
Flask session signing |
JWT_SECRET_KEY |
JWT token signing |
DATABASE_URL |
DB connection string (sqlite:///... or PostgreSQL) |
CORS_ORIGINS |
Comma-separated allowed origins |
FLASK_ENV |
development or production |