Commits
deno adapter for the desktop target (svelte.config.js drives detection),
route-config windows static-path patch, cef backend for reliable rendering,
and an app-config-driven first-launch flow (/setup mode screen -> /welcome ->
dashboard) reading its mode at runtime rather than baked in.
TANGLED_REF_NAME is unbound in the Spindles step, so `set -u` aborted before
docker login. Derive the version from package.json (the ChronVer source of
truth) instead of a CI-provided ref variable.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Unifies the runtime image with the local toolchain and CI (both 2.9.3).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The previous fix (download a pinned deno into the runner) fails on the
nixery/microvm NixOS runner: no FHS dynamic linker, so the glibc deno binary
can't execute ("required file not found"). Run fmt/typecheck/tests inside
denoland/deno:$DENO_VERSION via docker-in-VM instead — same pinned version,
working environment. Validated `deno fmt --check` in the image locally.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
nixpkgs' deno differs from the local toolchain, and deno fmt rules are
version-specific, so CI's format step flagged CSS/HTML/SVG/Svelte files that are
clean locally. Install a pinned Deno (DENO_VERSION) and put it on PATH so the
checks — including the nested deno calls in `deno task ...` — match local.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- .tangled/workflows/ci.yml: fmt check, typecheck, and tests on push/PR to main
- .tangled/workflows/build-image.yml: build and push the image on ChronVer tags
- scripts/tag.ts + `deno task tag`: create and push the release tag
- .claude/skills/release/SKILL.md: the end-to-end release cycle
- deno.json: deno fmt config (useTabs, fmt-component) and fmt/tag tasks
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
One-time normalization after adopting deno fmt (useTabs + fmt-component in
deno.json). Mechanical only — svelte-check and the test suite stay green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- scripts/changelog.ts: group commits by `area:` prefix into Keep-a-Changelog
sections; release boundaries are package.json version bumps, no git tags
- release.ts prepends the section and bumps package.json; `deno task changelog`
previews the pending section
- Dockerfile: point image source/url labels at the Tangled repo
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Dockerfile: OCI org.opencontainers.image.* labels + VERSION/CREATED/REVISION build args
- scripts/{version,release,build-image}.ts and deno tasks for ChronVer releases
- LICENSE (AGPL-3.0) plus license field in package.json and deno.json
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Style the native file input to match the app's fields and buttons via
::file-selector-button.
Cancel discards an unfinished (draft) import and hard-deletes its archived bytes,
from either the import list or the wizard. Restricted to drafts so it can never
hard-delete a committed import's record — that stays soft, via undo. A draft owns
no transactions, so the row deletes cleanly.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fills the permanent history gap on accounts whose SimpleFIN feed reaches back
only a week. Imports attach to an account sync already discovered; they only
insert, never reconcile, sweep, or overwrite anything sync owns.
Deliberately does not reuse ingestTransactions: it treats its feed as
authoritative and its stale-pending sweep would soft-delete every pending row
absent from a backfill CSV.
Date-only values anchor at noon UTC, not midnight — formatDay renders local, so
midnight displayed a day early across the Americas and a month's first day would
have read as the previous month while reporting under the correct one. The
duplicate window follows, counting whole UTC calendar days rather than 86400s.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The previous fix (download a pinned deno into the runner) fails on the
nixery/microvm NixOS runner: no FHS dynamic linker, so the glibc deno binary
can't execute ("required file not found"). Run fmt/typecheck/tests inside
denoland/deno:$DENO_VERSION via docker-in-VM instead — same pinned version,
working environment. Validated `deno fmt --check` in the image locally.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
nixpkgs' deno differs from the local toolchain, and deno fmt rules are
version-specific, so CI's format step flagged CSS/HTML/SVG/Svelte files that are
clean locally. Install a pinned Deno (DENO_VERSION) and put it on PATH so the
checks — including the nested deno calls in `deno task ...` — match local.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- .tangled/workflows/ci.yml: fmt check, typecheck, and tests on push/PR to main
- .tangled/workflows/build-image.yml: build and push the image on ChronVer tags
- scripts/tag.ts + `deno task tag`: create and push the release tag
- .claude/skills/release/SKILL.md: the end-to-end release cycle
- deno.json: deno fmt config (useTabs, fmt-component) and fmt/tag tasks
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- scripts/changelog.ts: group commits by `area:` prefix into Keep-a-Changelog
sections; release boundaries are package.json version bumps, no git tags
- release.ts prepends the section and bumps package.json; `deno task changelog`
previews the pending section
- Dockerfile: point image source/url labels at the Tangled repo
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Style the native file input to match the app's fields and buttons via
::file-selector-button.
Cancel discards an unfinished (draft) import and hard-deletes its archived bytes,
from either the import list or the wizard. Restricted to drafts so it can never
hard-delete a committed import's record — that stays soft, via undo. A draft owns
no transactions, so the row deletes cleanly.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fills the permanent history gap on accounts whose SimpleFIN feed reaches back
only a week. Imports attach to an account sync already discovered; they only
insert, never reconcile, sweep, or overwrite anything sync owns.
Deliberately does not reuse ingestTransactions: it treats its feed as
authoritative and its stale-pending sweep would soft-delete every pending row
absent from a backfill CSV.
Date-only values anchor at noon UTC, not midnight — formatDay renders local, so
midnight displayed a day early across the Americas and a month's first day would
have read as the previous month while reporting under the correct one. The
duplicate window follows, counting whole UTC calendar days rather than 86400s.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>