An open API service indexing awesome lists of open source software.

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

Awesome Lists containing this project

README

          


orbitdash - yet another modern server dashboard







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.


Container Image (GHCR)

## Preview

Screenshot of the app

## 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).