https://github.com/chriscorbell/orbitdash
yet another modern server dashboard
https://github.com/chriscorbell/orbitdash
dashboard docker docker-compose homelab self-hosted server
Last synced: 25 days ago
JSON representation
yet another modern server dashboard
- Host: GitHub
- URL: https://github.com/chriscorbell/orbitdash
- Owner: chriscorbell
- Created: 2026-02-15T03:49:32.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2026-05-16T03:32:27.000Z (about 1 month ago)
- Last Synced: 2026-05-16T05:32:30.656Z (about 1 month ago)
- Topics: dashboard, docker, docker-compose, homelab, self-hosted, server
- Language: TypeScript
- Homepage:
- Size: 1.64 MB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Agents: AGENTS.md
Awesome Lists containing this project
README
orbitdash is yet another modern server dashboard,
inspired by dashdot, homer and homarr.
It is intended for use on home/private servers.
Built with TypeScript, React, TailwindCSS, shadcn/ui, Vite, Bun, Hono and SQLite.
## Preview

## Features
- Live CPU/RAM/Disk metrics with charts
- Simple service links with icons and categories
- Upload your own PNG/SVG icons, or alternatively enter a direct URL to a PNG or SVG icon
- Inline search and filtering
- UI-native service management (no config file needed)
- Toggle between 3-column and 4-column grid for service links
- Reorder category sections with a shared saved layout
## Platform Support
- x86_64
- aarch64
## Installation Options
#### Docker Run
```bash
docker run -d \
--name orbitdash \
--restart unless-stopped \
-p 7770:3000 \
-v ./orbitdash-data:/data \
ghcr.io/chriscorbell/orbitdash:latest
```
#### Docker Compose
```yaml
services:
orbitdash:
container_name: orbitdash
image: ghcr.io/chriscorbell/orbitdash:latest
restart: unless-stopped
ports:
- "7770:3000"
volumes:
- ./orbitdash-data:/data
```
After deployment, the dashboard is accessible at `http://:7770`.
Change `7770` in the docker run/compose examples above if you want to serve the dashboard on a different port.
## Data Persistence
All data is stored under `/data` inside the container:
- `orbitdash.db` (SQLite database)
- `icons/` (uploaded/downloaded service icons)
The docker run/compose examples above bind-mount `/data` to `./orbitdash-data` in the current working host directory. You can change this to a different location on the host, or alternatively map to a volume instead if desired.
Outside Docker, orbitdash stores data in `./data` by default. You can override the storage path in any environment with `ORBITDASH_DATA_DIR=/path/to/data`.
For backup and restore steps, including SQLite WAL files and icon assets, see
[docs/backup-restore.md](docs/backup-restore.md).
The backend listens on port `3001` by default outside the container. Override it with `PORT=`.
The disk metric uses `/` by default. Override it with `ORBITDASH_DISK_PATH=/path/to/mount` when you
need to track a different mount.
## Health Checks
- `GET /healthz` returns liveness for process-level checks.
- `GET /readyz` returns readiness for deployment and CI probes, including a SQLite connectivity check.
- `GET /api/health` returns the same readiness payload as `readyz` for API-oriented clients.
## Deployment Verification
After deploying or upgrading the container, verify the service with:
```bash
curl --fail http://127.0.0.1:7770/healthz
curl --fail http://127.0.0.1:7770/readyz
```
Also confirm that:
- the host directory or volume mapped to `/data` is intact
- the expected host port is mapped to container port `3000`
- persisted services and icons still load after the restart
## Testing
Use the following commands for the initial automated test workflow:
```bash
npm run test:e2e:install
npm run format
npm run format:check
npm run typecheck
npm run test:unit
npm run test:integration
npm run test:e2e
npm test -- --run
npm run test:coverage
```
Run `npm run test:e2e:install` once per machine before the first browser smoke test so Chromium is
available locally.
Formatting is enforced with Prettier. Use `npm run format` locally to normalize files and
`npm run format:check` to run the same check that CI uses.
The enforced coverage gate currently applies to shared runtime modules under `shared/` excluding
type-only definitions in `shared/types.ts`. Expand that coverage scope as backend, hook, component,
and end-to-end suites are added.
## Validation Rules
Shared runtime validation now lives in `shared/schemas.ts` and is used by both the server routes
and the service dialog submit path. The current canonical rules are:
- service names are required after trimming
- service URLs must normalize to valid `http` or `https` URLs
- icon URLs, when provided, must normalize to valid `http` or `https` URLs
- remote icon downloads are limited to 2 MB, time out after 5 seconds, follow at most 3 redirects,
reject localhost/private literal hosts, and verify the downloaded bytes match a supported image
format
- category and description fields are trimmed and normalized to `null` when empty
- the `Uncategorized` section cannot be manually included in saved category ordering
- metrics `window` must be a positive integer and is bounded to 3600 seconds
## Contributing
Issues and PRs are welcomed. Please include description, screenshots and any related logs.
For local workflows and project conventions, see [CONTRIBUTING.md](CONTRIBUTING.md),
[docs/architecture.md](docs/architecture.md), and [docs/release-checklist.md](docs/release-checklist.md).