Self-hosted, widget-based infrastructure dashboard.
Linktree for your project infrastructure.
A single page that brings together GitHub repos, uptime monitors, analytics, CI/CD pipelines, and more into a shareable dashboard. Built with Rust, compiled to a single binary that serves both the API and the WASM client.
- 17 widget types — GitHub repos, pipelines, commit graphs, uptime monitors, Polar revenue, Umami analytics, Sentry errors, Discord servers, Beszel stats, and more
- Drag & drop editor — Arrange widgets on a visual grid. Resize, reorder, and delete with intuitive controls
- SSR + independent hydration — Pages load instantly with server-side rendering. Each widget hydrates independently so slow APIs never block the page
- Custom domains — Map any domain to a dashboard page
- Dark & light themes — Respects system preferences, switchable per page
- Self-hosted — Single Docker image, MongoDB for storage, optional Valkey/Redis for caching
- Authentication — Optional FerrisKey OIDC integration with custom login UI (passkey/password/email-OTP). Runs in open mode without it
- Docker and Docker Compose
- A MongoDB 5.0+ instance
# Clone the repo
git clone https://github.com/hauju/infrapage.git
cd infrapage
# Copy the example env and edit it
cp .env.example .env
# Start MongoDB and Valkey
docker compose up -d
# Run infrapage (replace with your actual image or build it)
docker run -d \
--env-file .env \
--network infrapage_infrapage-net \
-p 8080:8080 \
ghcr.io/hauju/infrapage:latestOpen http://localhost:8080.
Requires Rust nightly and the Dioxus CLI.
# Install Dioxus CLI
curl -sSL http://dioxus.dev/install.sh | sh
# Dev server with hot reload
dx serve --platform web
# Production build
dx build --release --platform webAll configuration is done through environment variables. Copy .env.example for a full reference.
| Variable | Required | Purpose |
|---|---|---|
MONGODB_URI |
Yes | MongoDB connection string |
MONGODB_DATABASE |
No | Database name (default: infrapage) |
ENCRYPTION_KEY |
Recommended | Base64-encoded 32-byte key for encrypting API tokens at rest |
VALKEY_URI |
No | Redis/Valkey for session storage + widget caching |
FERRISKEY_URL |
For auth | FerrisKey base API URL |
FERRISKEY_ISSUER_URL |
No | FerrisKey public OIDC issuer base URL when different from FERRISKEY_URL |
FERRISKEY_REALM |
For auth | FerrisKey realm name |
FERRISKEY_CLIENT_ID |
For auth | FerrisKey OIDC client ID |
FERRISKEY_CLIENT_SECRET |
For auth | FerrisKey confidential client secret |
GITHUB_TOKEN |
No | GitHub API token for repo/pipeline widgets |
POLAR_TOKEN |
No | Polar API token for revenue widgets |
See Configuration docs for the full list.
infrapage is a Dioxus 0.7 fullstack app. The same source compiles into both a server binary and a WASM client:
src/
├── main.rs # Routes, app entry, server setup
├── models/ # Shared types (client + server)
├── server/ # Server-only: DB, auth, API handlers, fetchers
└── components/ # Dioxus UI: layouts, pages, widgets, admin
Key design decisions:
- Two-phase page loading — SSR renders the page shell immediately, then each widget independently fetches its data on the client
- Embedded widgets — Widget configs are stored as an array inside each page document (no joins)
- Feature-gated compilation —
webfeature for WASM client,serverfeature for the backend. No server code ships to the browser
| Widget | Integration | What it shows |
|---|---|---|
| GitHub Repo | GitHub API | Stars, forks, language, description |
| GitHub Pipeline | GitHub API | Latest workflow run status |
| GitHub Commit Graph | GitHub API | Contribution-style commit heatmap |
| Uptime Monitor | HTTP HEAD | Response time and up/down status |
| Uptime Kuma | Uptime Kuma API | Monitor status from your Uptime Kuma instance |
| Polar Overview | Polar API | MRR, subscribers, revenue stats |
| Umami Stats | Umami API | Page views, visitors, bounce rate |
| Sentry Overview | Sentry API | Error counts and project health |
| Discord Server | Discord API | Member count and server info |
| Beszel | Beszel API | Server resource stats |
| Zitadel Users | Zitadel API | User count from your identity provider |
| Google Search Console | GSC API | Search impressions and clicks |
| Custom Link | — | Link card with title, description, and icon |
| Status Badge | — | Simple colored status indicator |
Full documentation is available at /docs when running infrapage, or browse the source in the docs/ directory.
Contributions are welcome! Please:
- Fork the repo and create a feature branch
- Make sure
cargo checkandcargo clippypass - Open a pull request against
main
See LICENSE for details.