
Deploy ocular
A self-hosted, open-source personal budgeting app with Sankey diagrams.
ocular
Just deployed
/data/genesis
Deploy and Host Ocular on Railway
About Hosting
Ocular is a self-hosted, open-source personal budgeting app with a beautiful, minimalist interface. It features income/expense tracking, Sankey diagram visualizations, multi-year overviews, multi-user support, PWA installability, dark/light mode, and multi-language support.
Ocular runs as a single Docker container bundling a Vue 3 SPA frontend (served by Caddy) and a Go backend (Genesis) for authentication and file-based data persistence. No external database is required — all data is stored on a persistent volume.
Why Deploy
- Privacy-first — Your financial data stays on your own infrastructure, never shared with third parties.
- Zero external dependencies — No database service needed; everything runs in a single container with file-based storage.
- Beautiful & functional — Sankey diagrams, multi-year overviews, and CSV import make budgeting intuitive and visual.
- Multi-user ready — Support multiple users with JWT-based authentication and per-user data isolation.
- PWA support — Install as a native-like app on any device for quick access to your budget.
Common Use Cases
- Personal budgeting — Track monthly income and expenses across categories, visualize spending flows with Sankey diagrams.
- Household finance management — Multiple family members can each have their own account with separate budgets.
- Year-over-year financial review — Compare budgets across years to identify trends and adjust spending habits.
- CSV import & migration — Import existing financial data from spreadsheets or other tools via CSV.
- Privacy-conscious expense tracking — Host your own budgeting tool instead of relying on cloud services that monetize your data.
Dependencies for Deployment
Deployment Dependencies
| Dependency | Details |
|---|---|
| Docker Image | ghcr.io/simonwep/ocular:latest — pre-built multi-arch image from GitHub Container Registry |
| Exposed Port | 80 (Caddy reverse proxy serves both SPA and API) |
| Persistent Volume | Mount at /data/genesis — required for storing user data and budgets |
GENESIS_JWT_SECRET | Required — a strong random string used to sign JWT authentication tokens |
GENESIS_CREATE_USERS | Optional — bootstrap initial users on first run (e.g., admin!:yourpassword, ! denotes admin) |
| External Database | None — Genesis uses a built-in file-based key/value store |
| Health Check | GET http://127.0.0.1:8080/health (Genesis backend) |
Template Content
