Skip to content
codedogappPublic

About

Bakhyard: a self-hosted personal dashboard

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Bakhyard

A personal dashboard for one user, hosted at home: Obsidian notes, work todos and pull requests, GitHub, games, and a Copilot planner, in one place. It's reached over Tailscale and needs a Google sign-in. It works on a Mac and on an iPhone, where it installs as a Home Screen app.

It's early. Today Bakhyard has its app shell, the sign-in, read-only notes, todos linked to Jira, open pull requests from Bitbucket with where each stands with its reviewers, the pull requests that wait for the user's review, the hours logged on Jira over the last 7 days, and a Home that gathers what needs the user from the todos and the pull requests. The modules come one small step at a time, and the plan has the steps, their order and the decisions behind them. It runs at home on an always-on Linux laptop with k3s, deployed from a private homelab repo, and on a Mac for development.

How it's built

Each feature is a Go service of its own, in services/, behind a gateway that checks who's asking and passes each request on. The app is a Svelte single-page app, in apps/web, which the web service embeds and serves. The gateway keeps its sessions, and todos its todos, in PostgreSQL. The services run on k3s on the laptop, and in process-compose on a Mac. §4 of the plan has the details.

Requirements

  • macOS, because the services read their secrets from the login Keychain. On the laptop's k3s they read them from files instead (docs/setup.md).
  • mise, which installs every other tool at the version the repo pins.
  • Tailscale, on the Mac and on every device that opens the app.
  • PostgreSQL 18, on 127.0.0.1:5433.
  • A Google OAuth client, for the sign-in.
  • An Obsidian vault in a folder on the Mac.

Run it

git clone https://github.com/codedogapp/bakhyard.git
cd bakhyard
mise install
cp mise.local.example.toml mise.local.toml

Fill in mise.local.toml. Then set up Tailscale, the Google client, the Keychain and Postgres as docs/setup.md shows, and run:

mise run up

It builds the app and the services, then runs them in process-compose's terminal UI until you quit it. Open https://<machine>.<tailnet>.ts.net, the name in BAKHYARD_HOST, and sign in.

Development

mise run check

It runs the local quality gate for the Go code and the web app: formatting, linting, the tests with their coverage thresholds, and the vulnerability scans. Then it builds the app and runs the end-to-end tests in Chromium and WebKit, which Playwright downloads the first time. The Go tests need a database of their own, which docs/setup.md shows how to make. mise tasks ls --all lists every task.

The services call each other through protobuf contracts in proto/. After changing one, run mise run gen, which regenerates their Go code in internal/gen; the gate fails while that code is out of date.

A change is done when the gate passes and its pull request's CI is green. SonarQube Cloud runs only in CI, on demand on main (AGENTS.md).

Docs

  • AGENTS.md: how we work, with the rules for every change and the quality gates.
  • docs/plan.md: what we build, in what order and why, with every decision.
  • docs/setup.md: what a machine needs before mise run up.

About

Bakhyard: a self-hosted personal dashboard

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages