Commit Graph
44 Commits
Author SHA1 Message Date
Tomas DvorakandDevin 0612beb37e ci(release): auto-tag and release when ci passes on main
release.yml now triggers on workflow_run(ci, main, success): bumps
semver from conventional commits since the latest tag (feat -> minor,
fix -> patch, BREAKING -> major), pushes the tag, then goreleaser and
the GHCR docker build release it. Merging this PR cuts v2.1.0.

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-23 11:34:31 +02:00
Tomáš Dvořák a54ba4c544 Merge pull request #10 from Dvorinka/docs/readme-intel
ci / backend (push) Canceled after 0s
ci / frontend (push) Canceled after 0s
docs: README domain intel refresh
2026-09-22 19:52:58 +02:00
Tomas DvorakandDevin 1bb5441eea docs(readme): domain intel screenshot + feature refresh
Domain watch now advertises per-record vendor attribution and the
provider strip; system monitoring mentions the new chart set. Adds the
domain-detail screenshot to the collapsible grid.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 19:50:44 +02:00
Tomáš Dvořák cfacc4ed7c Merge pull request #9 from Dvorinka/fix/domain-intel-types
fix: exactOptionalPropertyTypes on provider badge props
2026-09-22 18:29:42 +02:00
Tomas DvorakandDevin 10d9171031 fix(frontend): exactOptionalPropertyTypes on provider props
p?: Provider rejects an explicit undefined under
exactOptionalPropertyTypes — generated schema fields are optional.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 18:28:48 +02:00
Tomáš Dvořák 8ff13f74f7 Merge pull request #8 from Dvorinka/feat/domain-intel
Domain intel: per-record provider badges + vendor strip
2026-09-22 18:27:48 +02:00
Tomas DvorakandDevin 041c54c18c feat(domains): per-record provider intel + vendor strip
Structured DNSRecord list carries the detected vendor per row (NS/MX/CNAME/
TXT value, ASN org, response headers, SPF includes, verification strings)
and a Providers strip shows registrar/DNS/hosting/email/CA with favicons —
the domainstack-style view. Detection tables expanded to ~70 NS, ~45 mail,
~60 CNAME, ~130 registrar, and ~50 TXT patterns.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 18:26:24 +02:00
Tomáš Dvořák f4ebdf1f33 Merge pull request #7 from Dvorinka/feat/settings-dialog
feat(frontend): regroup settings dialog, icon renderer tiles
2026-09-22 18:05:57 +02:00
Tomas DvorakandDevin c5339a24b4 feat(frontend): regroup settings dialog, icon renderer tiles
Settings splits into labelled sections — renderer, appearance, wallpaper
and CSS, notifications, auth, backup — each with an icon header. Renderer
options gain a per-style glyph and accent-highlighted selection; theme
becomes a segmented Dark/Light control; the dialog widens to max-w-xl.

Renderer switching itself verified working end-to-end (live switch +
persistence across reload); unchanged code path since v2.0.0.

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 17:59:19 +02:00
Tomáš Dvořák 5473881f93 Merge pull request #6 from Dvorinka/feat/beszel-charts
feat(frontend): restyle monitoring charts on the Beszel school
2026-09-22 17:28:35 +02:00
Tomas DvorakandDevin c336408152 docs: retake README screenshots with seeded homelab data
All five shots recaptured against a live instance seeded with realistic
data: 20 services with dashboard-icons, 8 monitors, 4 real domains via
live WHOIS, 3 systems with the new chart grid, and a public status page.

Also references ghcr.io/dvorinka/dash:latest in docker-compose.yml so
`docker compose pull` works without a local build.

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 17:26:09 +02:00
Tomas DvorakandDevin ddd29aad24 feat(frontend): restyle monitoring charts on the Beszel school
Ports Beszel's chart design language onto our recharts primitives:
titled card grid, area fills on a true time axis, unit-aware Y ticks,
sorted dotted tooltips, and legend chips. System detail gains stacked
per-container Docker CPU/memory, per-sensor temperature lines, load
1/5/15, and GPU usage/VRAM — all from data the agent already sends.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 17:05:34 +02:00
Tomas DvorakandDevin 35602c2e52 fix(ci): track web/dist .keep so go:embed resolves on bare checkout
The blanket dist/ pattern in .gitignore excluded the
apps/backend/internal/web/dist directory itself, making the earlier
.keep negation unreachable — the file was never committed, and CI's
clean checkout left //go:embed all:dist with no matching files.

Re-include the directory (contents remain ignored) and commit .keep.
Verified: go build ./... succeeds with dist containing only .keep.

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 16:46:37 +02:00
Tomáš Dvořák eb84939a19 Merge pull request #4 from Dvorinka/feat/oss-readiness
docs: OSS readiness — README hero, one-line installer
2026-09-22 16:43:27 +02:00
Tomas DvorakandDevin afa0c931b9 docs: OSS readiness — README hero, one-line installer, stale doc fixes
Restructure README to the standard OSS layout (logo, badges, screenshots
grid, architecture, quick start). Add install.sh for curl|sh installs with
a named-volume fallback for Docker Desktop file-sharing limits, and
scripts/setup.sh for clone-based setup. Correct SECURITY.md (no longer
pre-1.0) and CONTRIBUTING.md (auth shipped in 2.0.0).

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 16:42:20 +02:00
Tomas DvorakandDevin 54b5497121 docs: v2.0.0 changelog, configuration for auth/boards, announcement refresh
ci / backend (push) Canceled after 0s
ci / frontend (push) Canceled after 0s
- CHANGELOG 2.0.0 entry covering all Phase 5 waves
- configuration.md: transports, per-monitor alert rules, auth, boards,
  appearance/language, PWA
- announcement.md: updated for shipped features and opt-in auth
- AGENTS.md: "no auth" line was stale
- ROADMAP: tick shipped M1–M3 planning checkboxes

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 13:10:29 +02:00
Tomáš Dvořák 0fa2ea82d8 Merge pull request #3 from Dvorinka/feat/phase5
Phase 5: alerts, agent depth, subdomains, auth, boards, i18n
v2.0.0
2026-09-22 12:51:44 +02:00
Tomas DvorakandDevin e0ef60eca6 feat(ui): phase 5 — graphs, widgets, theming, PWA, boards, i18n
P5a: 24h uptime bar strip + latency chart on monitor detail, iframe
embed widget, generic JSON-path widget, accent/wallpaper/custom CSS
settings, PWA manifest + service worker, demo GIF.

P5b: transport picker + per-transport fields + test button in
settings; per-monitor alert-rule fields in dialogs.

P5c: container cpu/mem columns, SMART/ZFS/GPU sections on system
detail, subdomains section on domain detail.

P5d: login/setup page + auth middleware client handling, board
switcher + /b/:slug routes, full string extraction to typed t() keys
with {param} interpolation, complete cs locale, language select.

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 12:49:51 +02:00
Tomas DvorakandDevin f3143af351 feat(api): phase 5 — alerts, agent depth, subdomains, auth, boards
P5b: notifier transport registry (webhook/slack/discord/telegram/
gotify/ntfy/smtp via net/smtp), per-monitor+domain alert rules
(failsBeforeDown, latencyWarn, certDays, mute).

P5c: per-container cpu/mem, optional SMART/ZFS/GPU exec-or-skip
collectors, crt.sh subdomain discovery with daily sweep.

P5d: opt-in auth (bcrypt, sqlite sessions, 7d rotating cookie, login
rate limit, public-route bypass) and multiple boards (boards table,
sections.board_id, /api/boards CRUD, slug routing).

Authored By: TDvorak <[email protected]>

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-22 12:49:44 +02:00
Tomas DvorakandDevin 8973be3b41 docs: Phase 5 plan — P5a quick wins, P5b alerts, P5c agent depth, P5d structure
ci / backend (push) Canceled after 0s
ci / frontend (push) Canceled after 0s
All demand-confirmed items mapped with scope and sequencing: uptime graphs,
iframe/JSON widgets, theming, PWA, demo GIF → SMTP + notifier presets +
alert rules → per-container metrics, SMART/ZFS/GPU, subdomain discovery →
opt-in auth (local accounts), multiple boards, full i18n.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 22:33:50 +02:00
Tomas DvorakandDevin fbc4ed4f23 docs: close out Phase 4 — v0.7.0 released
ci / backend (push) Canceled after 0s
ci / frontend (push) Canceled after 0s
Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 21:37:58 +02:00
Tomas DvorakandDevin 46b40047f2 fix(release): keep git tree clean for goreleaser
The dist copy deleted tracked .keep and overwrote tracked index.html —
dirty tree aborted the release. index.html is now untracked (bare clones
serve 404 instead of a stale stub), .keep alone satisfies go:embed, and
the workflow merges into dist/ without rm. fetch-depth: 0 for tag history.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
v0.7.0
2026-09-21 20:06:46 +02:00
Tomáš Dvořák 2c07d04972 Merge pull request #2 from Dvorinka/feat/monitoring-merge
feat: monitoring merge — importers, monitors, domains, systems, ops, launch prep
2026-09-21 19:53:41 +02:00
Tomas DvorakandDevin b294026cea docs: launch post draft for repo flip
Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 19:53:33 +02:00
Tomas DvorakandDevin af7d532b34 fix(release): per-binary archives + dist ignore
One archive can't span builds with different target sets (dash ships 6,
dash-agent 3) — split into two archives keyed by build id. Also: `builds`
is deprecated in goreleaser v2, renamed to `ids`. Snapshot validated
locally: 9 archives, checksums, embedded UI, migrations on boot.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 19:53:14 +02:00
Tomas DvorakandDevin 88a8210bf8 feat: i18n seam — typed t() + en dictionary
Nav and header wired as proof. Full string extraction deferred until a
second locale exists; CONTRIBUTING records the convention.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 19:45:46 +02:00
Tomas DvorakandDevin a89a81d46c docs+release: Phase 4 launch artifacts
README hero with real screenshots, install/config/widget docs, goreleaser
for dash + dash-agent, GHCR release workflow, changelog, community files,
agent systemd unit and Dockerfile, version stamping via -X main.version.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 19:39:21 +02:00
Tomas DvorakandDevin 97b8f5e87f fix: byte formatting + exactOptionalPropertyTypes
fmtBytes used 1<<40 — a 32-bit shift in JS evaluates to 1<<8=256, so every
value >=256 bytes rendered as TB. Also drop undefined-valued props that
exactOptionalPropertyTypes rejects in incident/status-page bodies.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 19:38:19 +02:00
Tomas DvorakandDevin c84a4be876 feat: ops layer — incidents, maintenance, status pages, badges, metrics (merge plan M4)
incidents + incident_updates + maintenance_windows + status_pages
tables. Monitor transitions auto-open incidents on down and
auto-resolve on recovery; an active maintenance window covering
the monitor suppresses alerts and auto-incidents, and status
pages report the covered monitor as `maintenance`.

Public status view: GET /api/status-pages/:slug/public aggregates
overall state, monitor uptime, systems, open incidents, and
scheduled maintenance; rendered read-only at /status/:slug.

GET /api/badge/:kind/:id.svg serves stateless shields; GET
/api/metrics exposes Prometheus text over existing tables;
POST /api/import/csv?kind=monitors|domains does header-driven
bulk import; /api/export v2 folds monitors/domains/systems rows
into the backup payload.

Frontend: /incidents with timeline + status flow, /status admin
for pages + windows, /status/:slug public page; nav and palette
wired.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 19:21:21 +02:00
Tomas DvorakandDevin 74c987c18a feat: system monitoring + push agent (merge plan M3)
systems + system_stats tables; agents push JSON every N seconds
to POST /api/systems/ingest with a per-system bearer token. The
server stores each sample, keeps a `latest` snapshot for cheap
list/widget reads, prunes stats after 7d, and marks systems down
when silent > max(3x interval, 30s) — firing system.up/down
webhook events on transitions.

cmd/dash-agent is a standalone Linux collector: /proc for
cpu/mem/net/load/uptime, /sys hwmon temps, statfs disk, and
container liveness via /var/run/docker.sock when present.
No imports from the server module — the sample shape is
duplicated deliberately so the agent stays a single static
binary.

Frontend: /systems card grid with usage bars, /systems/:id with
recharts cpu/mem/net/load, temps + containers tables, and the
agent command; `system` board widget; nav + palette + WidgetDialog
picker wired.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 19:02:58 +02:00
Tomas DvorakandDevin 2f3e8a1879 feat: webhook alerts for monitor + domain events (merge plan M2)
Generic webhook notification delivery configured via the
notify_webhook settings key — no new schema. Fires on monitor
up/down transitions (pending stays silent), domain expiry,
domain expiring, and TLS cert expiring; dispatch is async and
failures are logged, never fatal.

POST /api/notify/test verifies configuration; Settings dialog
gains a webhook URL field with save + send-test. Payload carries
event/name/text/content/message so Slack, Discord, ntfy, and
custom receivers all work.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 18:43:48 +02:00
Tomas DvorakandDevin f9fd1d9cf2 feat: domain monitoring (merge plan M2, phase 1)
Port of the domain-intelligence pipeline from the old Beszel fork,
adapted to Dash's SQLite + no-PocketBase architecture:

- internal/domain: RDAP via IANA bootstrap (cached), TCP WHOIS :43
  fallback with multi-format parser, DNS (NS/MX/TXT/CNAME/A/AAAA),
  TLS leaf cert details, ip-api.com geolocation, provider detection
  (DNS/email/hosting/CA). HTML scraping, paid APIs, and exec-based
  whois deliberately dropped.
- API: domains CRUD + synchronous refresh + domain_checks snapshot
  history; refresh runs inside the monitor sweep on interval_h.
- UI: /domains + /domains/:id pages, add/edit dialog, domain board
  widget (favicon + expiry countdown), palette + nav entries,
  domainId picker in the widget dialog.
- Test seam: Server.lookup injects the refresh; domain tests run
  hermetic against a stubbed result.

Verified live: github.com resolves MarkMonitor expiry 2028-10,
Route 53 DNS, GitHub Pages hosting, Sectigo cert with 69d left.

Authored By: TDvorak <[email protected]>

Generated with Devin (https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 18:35:47 +02:00
Tomas DvorakandDevin 1ff1b29ae7 feat: external importers + uptime monitors (merge plan M1)
Two tracks from the Beszel/Domain-Locker merge plan in ROADMAP.md:

- Importers: POST /api/import/external sniffs Homepage services.yml,
  Homarr JSON, and Dashy conf.yml into sections/items; SettingsDialog
  import now accepts all four formats.
- Monitors (M1): monitors + heartbeats schema, pure checkers for
  http/tcp/ping/dns/keyword/json-query/push, scheduler on app ctx,
  CRUD + check-now + push ingest API, /monitors + /monitors/:id pages
  (wouter), monitor board widget, ServiceDialog monitor opt-in.

Authored By: TDvorak <[email protected]>

Generated with Devin (https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-21 18:14:36 +02:00
Tomáš Dvořák f428e721fe Merge pull request #1 from Dvorinka/feat/initial-dashboard
ci / backend (push) Successful in 11m15s
ci / frontend (push) Successful in 10m17s
feat: initial dashboard — phases 0–3
2026-09-17 20:36:06 +02:00
Tomas Dvorak 331721cca5 docs: roadmap fully reconciled with shipped work
Adds shipped-but-unlisted items under each phase: parallel status probing,
URL scheme allowlist, post-drag click suppression, mobile status-dot
fallback, api_test.go coverage, widget local flag + error states + endpoint
tests, renderer index prop, icon preview, / shortcut, bundled fonts,
@layer base fix, SPA fallback, pre-paint theme bootstrap. Releases table
gates marked verified through v0.3.0.

Generated with [Devin](https://devin.ai)

Authored By: TDvorak <[email protected]>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-17 20:29:22 +02:00
Tomas Dvorak 55fb57456e feat: phase 3 renderers & ergonomics — index/console, ⌘K palette, icon suggest
- Index renderer (editorial): serif masthead + section heads, numbered
  full-width rows, live stat strip (time/services/up/down/widgets)
- Console renderer (terminal): $ dash status banner, bordered stat panels,
  ## section heads, › prompt rows, [ up ]/[ down ] tags
- Renderer contract gains index prop for row/section numbering
- Settings: 2x2 renderer radio grid with per-renderer descriptions
- ⌘K/Ctrl+K// palette: actions + service endpoints, arrow-key nav,
  zero-dep implementation on the existing Dialog primitive
- Icon picker: dashboard-icons slug suggestion chip + live preview
- Fonts: Instrument Serif, JetBrains Mono (fontsource)
- Fix: global :focus-visible rule was unlayered and silently overrode all
  focus-visible: utilities since phase 1 — moved into @layer base

Verified: typecheck/lint/build clean, dnd + collapse + popover in both new
renderers, palette filter + execute, icon suggest resolves real CDN assets,
360px + light theme, docker image 43.9 MB serving board + widget types.

Generated with [Devin](https://devin.ai)

Authored By: TDvorak <[email protected]>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-17 20:29:22 +02:00
Tomas Dvorak 8afc7df53b feat: phase 2 widgets — registry, fetchers, clock, config dialog
Backend: internal/widget registry (type metadata + Fetcher), Pi-hole
v5 / AdGuard / Immich fetchers, /api/widgets/types + /api/widgets/:id/data
with 30s TTL cache (failures cached too), kind+config on item create/patch.
Config secrets are never logged or echoed in errors.

Frontend: WidgetContent host maps config.type to a component, polls
/data every 30s for server-backed types; clock renders client-side.
Generic WidgetDialog builds its form from the registry's field list.
Widget tiles are sortable items in both renderers.

Generated with [Devin](https://devin.ai)

Authored By: TDvorak <[email protected]>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-17 20:29:22 +02:00
Tomas Dvorak 6004105038 feat: phase 1 MVP — sections, services, drag-drop, renderers
Backend: migration 0002 (sections/items/urls/settings), CRUD +
fractional reorder, icon upload, settings, export/import, cached
status pings. Handler tests cover reorder, URL scheme validation,
settings round-trip.

Frontend: shared board store over the generated client, dnd-kit
layer (same-section, cross-section, section reorder persisted),
URL chooser popover, add/edit service dialog, settings dialog,
Bento + Cards renderers behind the shared seam, dark/light theme.

Generated with [Devin](https://devin.ai)

Authored By: TDvorak <[email protected]>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-17 20:29:22 +02:00
Tomas Dvorak b60821350a feat: phase 0 foundation — monorepo scaffold, backend, frontend, CI, docker
Establishes the skeleton every later phase builds on: Go+Gin API with
zap logging, /api/healthz, SQLite+goose runner; Vite+React18+TS strict+
Tailwind v4 frontend with bento-mono theme tokens; openapi.yaml driving
a generated TS client; oxlint with vendored anti-slop rules; GitHub CI;
multi-stage Dockerfile -> 33.6MB distroless image; docker compose up
serves the blank board.


Generated with [Devin](https://devin.ai)

Authored By: TDvorak <[email protected]>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-17 20:29:21 +02:00
Tomas Dvorak e7f32949e9 docs: promote multi-style boards to core architecture
All four styles are board renderers over one shared store, not color
themes. Renderer contract (Board/Section/Item/Widget) lands in Phase 1;
Cards ships in v0.1.0 to validate the seam early, Index and Console
follow in v0.3.0.


Generated with [Devin](https://devin.ai)

Authored By: TDvorak <[email protected]>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-17 20:29:21 +02:00
Tomas Dvorak 3edadb613d docs: lock bento-mono as primary theme, add ROADMAP.md
Primary renderer is D (bento grid, mono palette). A/E/F kept as
alternate view themes on shared tokens. B and C deleted.
Roadmap now maps phases to releases v0.1.0 -> v1.0.0.


Generated with [Devin](https://devin.ai)

Authored By: TDvorak <[email protected]>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-17 20:29:21 +02:00
Tomas Dvorak 564a39b0e8 docs: add mockups D-F, mark casa glass rejected
D merges the two shortlisted directions (bento grid, mono palette,
no glow). E and F probe two different paradigms: editorial list and
terminal console.


Generated with [Devin](https://devin.ai)

Authored By: TDvorak <[email protected]>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-17 20:29:21 +02:00
Tomas Dvorak 420a2b9524 docs: add design spec, roadmap, and three UI mockups
Captures product requirements from prompt.md, approves SQLite over
Postgres for single-binary deployment, and sketches the Go+React
architecture, data model, API surface, and phased roadmap to OSS v1.0.


Generated with [Devin](https://devin.ai)

Authored By: TDvorak <[email protected]>
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-09-17 20:29:21 +02:00
Tomas Dvorak e42a6cfc61 chore: repository bootstrap
Authored By: TDvorak <[email protected]>
2026-09-17 20:28:06 +02:00