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>
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>
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>
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>