TimeKeep

Multi-tenant timekeeping with project + recursive WBS budgets. Drives payroll via Gusto.

What it is live

TimeKeep is the SPS internal timekeeping system. Contributors log hours against projects, projects have recursive Work-Breakdown-Structure (WBS) trees with per-node budgets, and managers can see budget burn-down per node and per person. Live at time.sandpointstudios.ltd, behind Cloudflare Access.

It's the internal mirror of the metering pattern used for billing JV products like HaulHard (hourly) vs Wyrdlyre (profit-share) — the same person can have different roles in different orgs and the time logged against each is segregated. Drives downstream payroll (Gusto) and accounting (Vigil Ledger) sync.

Architecture decisions locked

XDEC-128 (2026-05-17)Multi-tenant orgs + memberships. Same user can have different roles per org. Platform-admin view + per-user org switcher.
XDEC-129 (2026-05-17)WBS — projects + recursive WBS trees + per-(node, member) budgets + strict leaf-only allocation. An auto-seeded "Misc" leaf catches entries that don't fit any specific WBS node.
Payroll pick (2026-05-17)Gusto Simple ($40 + $6/employee/month) chosen over QuickBooks Payroll on API quality + UX. Drives the Phase 2 sync. Teagan owes the Gusto signup + API token mint before Phase 2 build.

Topology

flowchart LR USR((Contributor / manager)) --> ACC[CF Access
Google IdP] ACC --> TK[time.sandpointstudios.ltd] TK --> APP[timekeep container
vigil-server :8016
FastAPI + React in one image] APP --> PG[(Postgres
multi-tenant orgs)] subgraph FUTURE[Planned sync layers] GUSTO[Gusto API
P2] LEDGER[Vigil Ledger API
P3] end APP -.->|hours → payroll| GUSTO APP -.->|hours+budgets → GL| LEDGER

Hosting

Code/opt/timekeep/ on vigil-server
StackFastAPI + Postgres + React, all in one docker-compose image
Local port:8016 (fronted by cloudflared)
Public URLtime.sandpointstudios.ltd
CF Access app idce99b9da-...
DB credentialsBW SPS Service item 2aff9f8b-...
Redeploygit pull && docker compose up -d --build from /opt/timekeep/

Data model

Multi-tenancy (XDEC-128)

WBS (XDEC-129)

Dependencies

Roadmap

Why this matters cross-portfolio

TimeKeep is the substrate that makes "contributor X spent N hours on product Y this month, at rate R, with budget remaining B" a queryable fact rather than a memory exercise. Several downstream concerns depend on it:

Related