Wires the door: config → store → migrations → the discovered module registry → nav into the shell → the reserved `static` workflow → serve. Generates the TOTP sealing key at startup in setup mode (SPEC-009 D-1) so the wizard's TOTP enrollment precedes Finish. Fails closed on a bad module set. |
||
|---|---|---|
| .opencode | ||
| cmd/myday | ||
| docs/specs | ||
| internal | ||
| .gitignore | ||
| AGENT.md | ||
| config.example.yaml | ||
| go.mod | ||
| go.sum | ||
| PROJECT_PLAN.md | ||
| README.md | ||
MyDay
A self-hosted employee time, absence & reporting app by Sechpoint. Delivered as a PWA for mobile and desktop. Single-tenant — one company per instance.
Status: 🚧 planning / pre-alpha. No application code yet.
The design of record is PROJECT_PLAN.md.
What it will do
| Area | |
|---|---|
| Org structure | users, the manager hierarchy, departments, positions |
| Time | presence and timesheets (a per-user mode) |
| Absence | leave requests, approvals, balances |
| Reporting | rollups and aggregations |
Built as one Go binary: a small core (MyDay.auth — identity, sessions, the door) plus
drop-in modules.
Running it
Not yet available — nothing is built. These are the intended steps.
# 1. configure
cp config.example.yaml config.yaml # then edit; config.yaml is gitignored
# 2. build
go build -o myday ./cmd/myday
# 3. run
./myday
⚠️ First run — do NOT expose it publicly
The first user becomes the top admin (the root of the chain). So the instance bootstraps
loopback-only, running a /setup wizard until that admin exists.
# on the server it listens on 127.0.0.1:8080 only (config.example.yaml)
ssh -L 8080:127.0.0.1:8080 user@server # from your workstation
# then open http://127.0.0.1:8080/setup and complete the wizard
Reach the app over
localhost/127.0.0.1— not a hostname. With anhttps://base_urlthe CSRF and session cookies are markedSecure, so they are not sent over plainhttp://; and only a loopback origin counts as a trustworthy/secure context for the browser's WebAuthn dialogs. So for first run and any human testing, open the app athttp://localhost:8080orhttp://127.0.0.1:8080(via the tunnel above) — never at a bare server hostname.
Only after the top admin exists should you put MyDay behind a reverse proxy and expose it.
Documentation
PROJECT_PLAN.md |
the plan & decision log of record |
AGENT.md |
instructions for AI agents working here |
docs/specs/ |
implementation specs |
config.example.yaml |
configuration template |
Security
- Secrets live in
config.yaml(gitignored) — never commit them. - Auth is Passkey (primary) + TOTP (fallback).
- See
PROJECT_PLAN.md§10 for the deferred-security register and its beta gate.
License
TBD.