| Name | Latest commit | Last update |
|---|---|---|
| π designs | ||
| π packages | ||
| π src | ||
| π tests | ||
| π .gitignore | Initial commit: Overseer v1 with inventory module | 4 days ago |
| π CMakeLists.txt | Initial commit: Overseer v1 with inventory module | 4 days ago |
| π README.md | Add README | 3 days ago |
| π overseer.example.yaml | Initial commit: Overseer v1 with inventory module | 4 days ago |
| π prd.md | Initial commit: Overseer v1 with inventory module | 4 days ago |
A self-hosted family information system. One binary, one SQLite file, one YAML config, one systemd unit. Server-rendered HTML with htmx for the interactive bits β no SPA, no JS build step.
Overseer is structured as a set of independent modules. v1 ships a single module:
A Doc module is sketched in the design but not built yet.
ON DELETE RESTRICT, versioned migrations with automatic pre-migration
backup.spdlog, with a journald sink when run
under systemd.Requires a C++23 compiler (GCC 14+ / Clang 18+), CMake β₯ 3.24, and:
Other dependencies (libmw, inja, nlohmann_json, spdlog,
yaml-cpp, cxxopts, and optionally googletest) are fetched
through CMake's FetchContent.
cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
For development / running tests:
cmake -B build -S . -DOVERSEER_BUILD_TEST=ON
cmake --build build -j
ctest --test-dir build
Copy overseer.example.yaml to /etc/overseer.yaml and edit it. The
config file must not be world-readable (the daemon refuses to start
otherwise) since it carries the OIDC client secret.
Minimum keys:
bind_address: "unix:/run/overseer/overseer.sock" # or "127.0.0.1"
port: 8080 # only used for TCP binds
socket_permission: "0666" # only used for unix binds
log_level: "info"
db_path: "/var/lib/overseer/overseer.db"
oidc:
issuer_url: "https://keycloak.example.com/realms/family"
client_id: "overseer"
client_secret: "REPLACE_ME"
redirect_uri: "https://overseer.example.com/oidc/callback"
The redirect URI must be registered with the OIDC provider as an allowed callback for the client.
overseer --config /etc/overseer.yaml
Other flags (run overseer --help for the full list):
--template-dir DIR β override the template root (defaults to the
source tree in a dev build, /usr/share/overseer/modules in the
Arch package).--static-dir DIR β override the static-files root.--dev β verbose logging and template hot reload.A -git PKGBUILD lives in packages/arch/:
cd packages/arch
makepkg -si
The package installs the binary to /usr/bin/overseer, templates to
/usr/share/overseer/, a sample config to /etc/overseer.yaml,
and registers a system user overseer, a tmpfiles entry for
/var/lib/overseer/, and an overseer.service unit. After editing
the config:
systemctl enable --now overseer.service
The unit binds to /run/overseer/overseer.sock by default. Point your
reverse proxy at that socket.
The source tree mirrors the module layout:
src/
inventory/ # liboverseer_inventory β pure repo/domain code
db/ # migrations + backup
overseer/ # the binary: web server, OIDC, render, session
modules/
inventory/ # routes, views, templates for the inventory module
static/ # CSS, JS (htmx)
tests/ # GoogleTest unit + HTTP integration tests
designs/ # design docs
packages/arch/ # PKGBUILD and systemd assets
The inventory library has no web dependency, so a future
agent-facing surface (MCP, REST) can reuse it directly.
For the full architectural rationale see designs/design-0-architecture.md.