josh
5b3edbdfe5
Merge pull request 'chore: bump to version 1.7.2' ( #79 ) from feat/cap-job-runs-history into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 20s
CI / test (pull_request) Successful in 18s
CI / build-dev (pull_request) Has been skipped
Reviewed-on: #79
2026-06-06 09:32:21 -04:00
josh
8edbeba2ec
Merge branch 'dev' into feat/cap-job-runs-history
CI / test (pull_request) Successful in 8s
CI / build-dev (pull_request) Has been skipped
2026-06-06 09:31:18 -04:00
josh and Claude Opus 4.7
ca914b915b
chore: bump to version 1.7.2
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-06-06 09:30:23 -04:00
josh
53fbcbe22c
Merge pull request 'feat: cap job_runs history at last 10 per job' ( #78 ) from feat/cap-job-runs-history into dev
...
CI / test (push) Successful in 19s
CI / build-dev (push) Successful in 21s
Reviewed-on: #78
2026-06-06 09:27:05 -04:00
josh and Claude Opus 4.7
e330119753
feat: cap job_runs history at last 10 per job
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Tailscale, Patchmon, and Semaphore sync jobs all wrote into a shared
job_runs table with no retention. With default poll intervals of 15-60
minutes, history grew unbounded.
- Add pruneJobRuns(jobId) and pruneAllJobRuns() helpers.
- Prune after every completeJobRun() so new runs trim old ones.
- Prune once on init() to clean up existing over-cap rows.
- Prune in importJobs() so re-imported runs are also capped.
- Defensive LIMIT 10 in getJobRuns() for the read path.
No UI changes needed — _renderRunList already renders whatever the
server returns. No schema migration — only row deletions.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-06-05 23:38:43 -04:00
josh
72b8d60985
Merge pull request 'Merge pull request 'test: add failing tests for sort/order on GET /api/instances' ( #71 ) from dev into main' ( #76 ) from merge/main-into-dev-v1.7.1 into dev
...
CI / test (push) Successful in 12s
CI / test (pull_request) Successful in 15s
CI / build-dev (push) Successful in 15s
CI / build-dev (pull_request) Has been skipped
Reviewed-on: #76
2026-05-30 19:03:24 -04:00
josh
917fb26e05
Merge branch 'main' into dev — resolve 1.7.0/1.7.1 version overlap, keep 1.7.1
...
CI / test (pull_request) Successful in 11s
CI / build-dev (pull_request) Has been skipped
# Conflicts:
# package.json
2026-05-30 19:00:49 -04:00
josh
a28867b398
Merge pull request 'fix: base64-encode Patchmon Basic auth credentials server-side' ( #74 ) from fix/patchmon-sync-basic-auth into dev
...
CI / test (push) Successful in 9s
CI / build-dev (push) Successful in 23s
CI / test (pull_request) Successful in 18s
CI / build-dev (pull_request) Has been skipped
Reviewed-on: #74
2026-05-30 18:54:53 -04:00
josh and Claude Opus 4.7
ac71ea2c49
chore: bump to version 1.7.1
...
CI / test (pull_request) Successful in 19s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-30 18:51:27 -04:00
josh and Claude Opus 4.7
efa1750cac
fix: base64-encode Patchmon Basic auth credentials server-side
...
Patchmon's API uses standard RFC 7617 Basic auth — `Basic base64(token_key:token_secret)`. The handler was sending the api_token field verbatim, so it only worked if the user had manually base64-encoded the credential. After a Patchmon upgrade, the sync started returning HTML (the SPA, served when auth is rejected) and failing with "Unexpected token '<'" on JSON.parse.
Now: if the token contains ':' (raw key:secret), encode it server-side; otherwise pass through unchanged for backward compatibility. UI gets a placeholder hint showing the expected format.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-30 18:33:41 -04:00
josh
aa6e28d818
Merge pull request 'chore: bump to version 1.7.0' ( #72 ) from chore/bump-v1.7.0 into main
...
CI / test (push) Successful in 13s
Release / release (push) Successful in 30s
CI / build-dev (push) Has been skipped
Reviewed-on: #72
2026-05-29 16:10:56 -04:00
josh
2cf797545c
chore: bump to version 1.7.0
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
2026-05-29 16:08:18 -04:00
josh
a0381b12cc
Merge pull request 'test: add failing tests for sort/order on GET /api/instances' ( #71 ) from dev into main
...
CI / test (push) Successful in 16s
Release / release (push) Failing after 11s
CI / build-dev (push) Has been skipped
Reviewed-on: #71
2026-05-29 16:05:54 -04:00
josh
64eacb28d2
Merge pull request 'feat: accept partial bodies on PUT /api/instances/:vmid' ( #70 ) from feat/partial-instance-updates into dev
...
CI / test (push) Successful in 11s
CI / build-dev (push) Successful in 38s
CI / test (pull_request) Successful in 18s
CI / build-dev (pull_request) Has been skipped
Reviewed-on: #70
2026-05-29 16:03:44 -04:00
josh
ea671535fc
feat: accept partial bodies on PUT /api/instances/:vmid
...
CI / test (pull_request) Successful in 10s
CI / build-dev (pull_request) Has been skipped
Merge the request body onto the existing instance row before validating,
so external callers (n8n, scripts) can send only the fields they want to
change instead of GET-then-splat-then-PUT the full record.
Mirrors the partial-update pattern already used by PUT /api/jobs/:id.
Full-body PUTs (today's frontend) are unaffected.
2026-05-29 15:57:58 -04:00
josh
fb3c6405c9
Merge pull request 'feat/sort-instances' ( #69 ) from feat/sort-instances into dev
...
CI / test (push) Successful in 9s
CI / build-dev (push) Successful in 25s
Reviewed-on: #69
2026-03-29 08:46:15 -04:00
josh
edf6f674b3
Merge pull request 'v1.6.0' ( #65 ) from dev into main
...
CI / test (push) Successful in 15s
Release / release (push) Successful in 52s
CI / build-dev (push) Has been skipped
Reviewed-on: #65
2026-03-28 21:01:27 -04:00
josh
a8d367b4be
Merge pull request 'chore: bump to version 1.6.0' ( #64 ) from chore/bump-v1.6.0 into dev
...
CI / test (push) Successful in 16s
CI / build-dev (push) Successful in 44s
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Reviewed-on: #64
2026-03-28 20:59:21 -04:00
josh
5ca0b648ca
chore: bump to version 1.6.0
CI / test (pull_request) Successful in 18s
CI / build-dev (pull_request) Has been skipped
2026-03-28 20:58:41 -04:00
josh
518ed42f60
Merge pull request 'feat: make stats bar cells clickable to filter by state' ( #62 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 17s
CI / build-dev (push) Successful in 27s
Reviewed-on: #62
2026-03-28 20:53:14 -04:00
josh
a9147b0198
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
2026-03-28 20:52:44 -04:00
josh and Claude Sonnet 4.6
2e3484b1d9
feat: make stats bar cells clickable to filter by state
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Clicking deployed/testing/degraded sets the state filter to that
value. Clicking total clears all filters. Hover style added.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 20:51:31 -04:00
josh
cb83d11261
Merge pull request 'fix: config is already a parsed object from the jobs API response' ( #61 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 14s
CI / build-dev (push) Successful in 26s
Reviewed-on: #61
2026-03-28 20:47:46 -04:00
josh
047fd0653e
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
2026-03-28 20:47:18 -04:00
josh and Claude Sonnet 4.6
027ed52768
fix: config is already a parsed object from the jobs API response
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
maskJob parses job.config before returning it, so calling JSON.parse
on it again threw an exception. The catch returned false for every
job, so relevant was always empty and _waitForOnCreateJobs returned
immediately without polling.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 20:46:49 -04:00
josh
e2935c58c8
Merge pull request 'fix: capture job baseline before POST to avoid race condition' ( #60 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 16s
CI / build-dev (push) Successful in 29s
Reviewed-on: #60
2026-03-28 20:43:26 -04:00
josh and Claude Sonnet 4.6
1bbe743dba
fix: capture job baseline before POST to avoid race condition
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
The previous version snapshotted last_run_id after the 201 response,
but jobs fire immediately server-side — by the time the client fetched
/api/jobs the runs were already complete, so the baseline matched the
new state and the poll loop never detected completion.
Baseline is now captured before the creation POST so it always
reflects pre-run state regardless of job speed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 20:42:46 -04:00
josh
d88b79e9f0
Merge pull request 'feat: auto-refresh UI after on-create jobs complete' ( #59 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 14s
CI / build-dev (push) Successful in 29s
Reviewed-on: #59
2026-03-28 20:26:26 -04:00
josh
8a9de6d72a
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 15s
CI / build-dev (pull_request) Has been skipped
2026-03-28 20:25:55 -04:00
josh and Claude Sonnet 4.6
ddd528a682
feat: auto-refresh UI after on-create jobs complete
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
After creating an instance, if any jobs have run_on_create enabled,
the client polls /api/jobs every 500ms until each relevant job has a
new completed run (tracked via last_run_id baseline). The dashboard
or detail page then refreshes automatically. 30s timeout as a safety
net if a job hangs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 20:25:26 -04:00
josh
03cf2aa9c6
Merge pull request 'fix: millisecond precision timestamps and correct history ordering' ( #58 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 14s
CI / build-dev (push) Successful in 29s
Reviewed-on: #58
2026-03-28 20:20:42 -04:00
josh
d84674b0c6
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
2026-03-28 20:20:03 -04:00
josh and Claude Sonnet 4.6
7999f46ca2
fix: millisecond precision timestamps and correct history ordering
...
CI / test (pull_request) Successful in 21s
CI / build-dev (pull_request) Has been skipped
datetime('now') only stores to the second, making same-second events
indistinguishable. Switched all instance_history and job_runs writes
to strftime('%Y-%m-%dT%H:%M:%f', 'now') for millisecond precision.
Reverted getInstanceHistory to ORDER BY changed_at DESC, id DESC so
newest events appear at the top and instance creation (lowest id,
earliest timestamp) is always at the bottom.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 20:19:42 -04:00
josh
307c5cf9e8
Merge pull request 'fix: initialize jobs nav dot on every page load' ( #57 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 14s
CI / build-dev (push) Successful in 28s
Reviewed-on: #57
2026-03-28 20:16:02 -04:00
josh
34af8e5a8f
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
2026-03-28 20:15:37 -04:00
josh and Claude Sonnet 4.6
76d2bffb4f
fix: initialize jobs nav dot on every page load
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Previously the dot only updated when visiting the Jobs page.
Now a jobs fetch runs at bootstrap so the dot reflects status
immediately on any page, including after a hard refresh.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 20:14:53 -04:00
josh
64de0e432c
Merge pull request 'fix: queue on-create jobs sequentially and fix history ordering' ( #56 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 28s
Reviewed-on: #56
2026-03-28 20:12:31 -04:00
josh
a5b409a348
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
2026-03-28 20:09:59 -04:00
josh and Claude Sonnet 4.6
8f35724bde
fix: queue on-create jobs sequentially and fix history ordering
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
runJobsOnCreate now awaits each job before starting the next,
ensuring they don't stomp each other's DB writes in parallel.
getInstanceHistory changed to ORDER BY changed_at ASC, id ASC so
the creation event (lowest id) is always first regardless of
same-second timestamps.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 20:09:32 -04:00
josh
cec82a3347
Merge pull request 'feat: run jobs on instance creation when run_on_create is enabled' ( #54 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 17s
CI / build-dev (push) Successful in 34s
Reviewed-on: #54
2026-03-28 20:01:53 -04:00
josh
883e59789b
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 17s
CI / build-dev (pull_request) Has been skipped
2026-03-28 20:01:20 -04:00
josh and Claude Sonnet 4.6
817fdaef13
feat: run jobs on instance creation when run_on_create is enabled
...
CI / test (pull_request) Successful in 18s
CI / build-dev (pull_request) Has been skipped
Jobs with run_on_create=true in their config fire automatically
after a new instance is created. Runs fire-and-forget so they don't
delay the 201 response. Option exposed as a checkbox in each job's
detail panel.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 20:00:45 -04:00
josh
9295354e72
Merge pull request 'v1.5.0' ( #53 ) from dev into main
...
CI / test (push) Successful in 14s
Release / release (push) Successful in 47s
CI / build-dev (push) Has been skipped
Reviewed-on: #53
2026-03-28 19:51:29 -04:00
josh
372cda6a58
Merge pull request 'chore: bump version to 1.5.0' ( #52 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 14s
CI / build-dev (push) Successful in 38s
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Reviewed-on: #52
2026-03-28 19:49:19 -04:00
josh
3301e942ef
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
2026-03-28 19:48:48 -04:00
josh and Claude Sonnet 4.6
c4ebb76deb
chore: bump version to 1.5.0
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 19:48:16 -04:00
josh
bb765453ab
Merge pull request 'feat: include job config and run history in export/import backup' ( #51 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 14s
CI / build-dev (push) Successful in 40s
Reviewed-on: #51
2026-03-28 19:44:37 -04:00
josh
88474d1048
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 17s
CI / build-dev (pull_request) Has been skipped
2026-03-28 19:44:05 -04:00
josh and Claude Sonnet 4.6
954d85ca81
feat: include job config and run history in export/import backup
...
CI / test (pull_request) Successful in 16s
CI / build-dev (pull_request) Has been skipped
Export bumped to version 3, now includes jobs (with raw unmasked
config) and job_runs arrays. Import restores them when present and
restarts the scheduler. Payloads without a jobs key leave jobs
untouched, keeping v1/v2 backups fully compatible.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 19:43:34 -04:00
josh
117dfc5f17
Merge pull request 'feat: add Semaphore Sync job' ( #50 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 15s
CI / build-dev (push) Successful in 27s
Reviewed-on: #50
2026-03-28 19:35:47 -04:00
josh
c39c7a8aef
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 19s
CI / build-dev (pull_request) Has been skipped
2026-03-28 19:35:10 -04:00
josh and Claude Sonnet 4.6
a934db1a14
feat: add Semaphore Sync job
...
CI / test (pull_request) Successful in 15s
CI / build-dev (pull_request) Has been skipped
Fetches Semaphore project inventory via Bearer auth, parses the
Ansible INI format to extract hostnames, and sets semaphore=1/0
on matching instances.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 19:34:45 -04:00
josh
ea4c5f7c95
Merge pull request 'feat: add Patchmon Sync job' ( #49 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 14s
CI / build-dev (push) Successful in 25s
Reviewed-on: #49
2026-03-28 19:24:12 -04:00
josh
5c12acb6c7
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 17s
CI / build-dev (pull_request) Has been skipped
2026-03-28 19:23:37 -04:00
josh and Claude Sonnet 4.6
0b350f3b28
feat: add Patchmon Sync job
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Syncs patchmon field on instances by querying the Patchmon hosts API
and matching hostnames. API token masked as REDACTED in responses.
seedJobs now uses INSERT OR IGNORE so new jobs are seeded on existing
installs without re-running the full seed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 19:22:41 -04:00
josh
db4071a2cf
Merge pull request 'fix: move page-jobs inside main so it renders at the top' ( #48 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 15s
CI / build-dev (push) Successful in 30s
Reviewed-on: #48
2026-03-28 19:15:38 -04:00
josh
37cd77850e
Merge branch 'dev' into feat/jobs-system
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
2026-03-28 19:15:07 -04:00
josh and Claude Sonnet 4.6
14a4826bb6
fix: move page-jobs inside main so it renders at the top
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 19:14:32 -04:00
josh
550135ca37
Merge pull request 'feat: jobs system with dedicated nav page and run history' ( #47 ) from feat/jobs-system into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 26s
Reviewed-on: #47
2026-03-28 19:10:50 -04:00
josh and Claude Sonnet 4.6
d7727badb1
feat: jobs system with dedicated nav page and run history
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Replaces ad-hoc Tailscale config tracking with a proper jobs system.
Jobs get their own nav page (master/detail layout), a dedicated DB
table, and full run history persisted forever. Tailscale connection
settings move from the Settings modal into the Jobs page. Registry
pattern makes adding future jobs straightforward.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 19:09:42 -04:00
josh
537d78e71b
Merge pull request 'feat: Tailscale sync jobs' ( #46 ) from feat/tailscale-sync-jobs into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 25s
Reviewed-on: #46
2026-03-28 17:12:35 -04:00
josh and Claude Sonnet 4.6
47e9c4faf7
feat: Tailscale sync jobs
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Adds a background job system that polls the Tailscale API on a configurable
interval and syncs tailscale status and IPs to instances by hostname match.
- New config table (key/value) in SQLite for persistent server-side settings
- New server/jobs.js: runTailscaleSync + restartJobs scheduler
- GET/PUT /api/config — read and write Tailscale settings; API key masked as **REDACTED** on GET
- POST /api/jobs/tailscale/run — immediate manual sync
- Settings modal: new Tailscale Sync section with enable toggle, tailnet, API key, poll interval, Save + Run Now buttons, last-run status
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 17:11:40 -04:00
josh
31a5090f4f
Merge pull request 'fix: remove internal database ID from frontend' ( #45 ) from fix/hide-internal-id into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 20s
Reviewed-on: #45
2026-03-28 16:48:19 -04:00
josh and Claude Sonnet 4.6
ecdac6fe23
fix: remove internal database ID from frontend
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Removed from the instance subtitle and the overview kv grid. The auto-
increment ID is an implementation detail with no user-facing meaning.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 16:47:20 -04:00
josh
07cef73fae
Merge pull request 'v1.4.0' ( #44 ) from dev into main
...
CI / test (push) Successful in 14s
Release / release (push) Successful in 39s
CI / build-dev (push) Has been skipped
Reviewed-on: #44
2026-03-28 16:16:46 -04:00
josh
1a84edc064
Merge pull request 'chore: bump version to 1.4.0' ( #43 ) from chore/bump-v1.4.0 into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 24s
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Reviewed-on: #43
2026-03-28 16:15:32 -04:00
josh and Claude Sonnet 4.6
bfb2c26821
chore: bump version to 1.4.0
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 16:09:08 -04:00
josh
a985268987
Merge pull request 'feat: include history in export/import backup' ( #42 ) from feat/export-import-history into dev
...
CI / test (push) Successful in 12s
CI / build-dev (push) Successful in 21s
Reviewed-on: #42
2026-03-28 16:06:21 -04:00
josh and Claude Sonnet 4.6
218cdb08c5
feat: include history in export/import backup
...
CI / test (pull_request) Successful in 15s
CI / build-dev (pull_request) Has been skipped
Export now returns version 2 with a history array alongside instances.
Import accepts the history array and restores all audit events. v1 backups
without a history key still import cleanly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 16:04:53 -04:00
josh
2855cc7f81
Merge pull request 'feat: mobile-responsive layout under 640px' ( #41 ) from feat/mobile-responsive into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 23s
Reviewed-on: #41
2026-03-28 15:57:07 -04:00
josh
07d2e215e4
Merge branch 'dev' into feat/mobile-responsive
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
2026-03-28 15:56:38 -04:00
josh
8ef839d6d0
Merge pull request 'fix: wrap image reference in backticks in release notes' ( #40 ) from fix/release-image-codeblock into dev
...
CI / test (push) Successful in 12s
CI / build-dev (push) Successful in 21s
Reviewed-on: #40
2026-03-28 15:55:05 -04:00
josh and Claude Sonnet 4.6
7af88328c8
feat: mobile-responsive layout under 640px
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Single breakpoint, no desktop changes. Key adjustments:
- Reset zoom: 1 (mobile browsers handle scaling)
- Padding drops from 32px to 16px throughout
- Toolbar wraps: search full-width, filters below
- Instance grid and detail grid collapse to single column
- Detail header stacks title above action buttons
- History timeline stacks timestamp above event
- Toggle grid drops from 3 to 2 columns
- Confirm box gets max-width: calc(100vw - 32px) to prevent overflow
- Toast stretches across bottom of screen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:54:12 -04:00
josh and Claude Sonnet 4.6
096e2afb3d
fix: wrap image reference in backticks in release notes
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:44:15 -04:00
josh
e3d089a71f
Merge pull request 'v1.3.1' ( #39 ) from dev into main
...
CI / test (push) Successful in 14s
Release / release (push) Successful in 42s
CI / build-dev (push) Has been skipped
Reviewed-on: #39
2026-03-28 15:42:00 -04:00
josh
668e7c34bb
Merge pull request 'chore: release v1.3.1' ( #38 ) from chore/bump-v1.3.1 into dev
...
CI / test (push) Successful in 15s
CI / build-dev (push) Successful in 25s
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Reviewed-on: #38
2026-03-28 15:40:46 -04:00
josh and Claude Sonnet 4.6
e796b4f400
chore: release v1.3.1
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:40:16 -04:00
josh
a4b5c20993
Merge pull request 'fix: clear instance history on delete and import' ( #37 ) from fix/delete-clears-history into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 20s
Reviewed-on: #37
2026-03-28 15:38:15 -04:00
josh and Claude Sonnet 4.6
d17f364fc5
fix: clear instance history on delete and import
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
deleteInstance now removes history rows for that vmid before removing
the instance. importInstances clears all history before replacing
instances. Prevents stale history appearing when a vmid is reused.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:37:45 -04:00
josh
5f79eec3dd
Merge pull request 'fix: categorize release notes into New Features / Bug Fixes, drop chores' ( #36 ) from fix/release-notes-format into dev
...
CI / test (push) Successful in 12s
CI / build-dev (push) Successful in 20s
Reviewed-on: #36
2026-03-28 15:36:27 -04:00
josh and Claude Sonnet 4.6
ed98bb57c0
fix: categorize release notes into New Features / Bug Fixes, drop chores
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:35:53 -04:00
josh
120b61a423
Merge pull request 'v1.3.0' ( #35 ) from dev into main
...
CI / test (push) Successful in 14s
Release / release (push) Successful in 40s
CI / build-dev (push) Has been skipped
Reviewed-on: #35
2026-03-28 15:31:57 -04:00
josh
074f0600af
Merge pull request 'chore: release v1.3.0' ( #34 ) from chore/bump-v1.3.0 into dev
...
CI / test (push) Successful in 14s
CI / build-dev (push) Successful in 21s
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
Reviewed-on: #34
2026-03-28 15:30:02 -04:00
josh
e4f9407827
Merge branch 'dev' into chore/bump-v1.3.0
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
2026-03-28 15:29:09 -04:00
josh
fde5ce7dc1
Merge pull request 'chore: release v1.3.0' ( #33 ) from chore/bump-v1.3.0 into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 28s
Reviewed-on: #33
2026-03-28 15:28:44 -04:00
josh and Claude Sonnet 4.6
20df10b333
chore: release v1.3.0
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:28:39 -04:00
josh and Claude Sonnet 4.6
c906511bfc
chore: release v1.3.0
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:27:30 -04:00
josh
745e5920ad
Merge pull request 'fix: set html zoom 1.1 so default scale matches browser 110%' ( #32 ) from fix/base-zoom into dev
...
CI / test (push) Successful in 12s
CI / build-dev (push) Successful in 20s
Reviewed-on: #32
2026-03-28 15:25:32 -04:00
josh and Claude Sonnet 4.6
90e0a98914
fix: set html zoom 1.1 so default scale matches browser 110%
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:24:58 -04:00
josh
cba4b73798
Merge pull request 'fix: use badge for stack on detail overview, consistent across all views' ( #31 ) from fix/detail-stack-badge into dev
...
CI / test (push) Successful in 14s
CI / build-dev (push) Successful in 21s
Reviewed-on: #31
2026-03-28 15:22:13 -04:00
josh and Claude Sonnet 4.6
0d567472a9
fix: use badge for stack on detail overview, consistent across all views
...
CI / test (pull_request) Successful in 12s
CI / build-dev (pull_request) Has been skipped
stack was plain highlighted text on the detail page but a coloured badge
on the home cards and in the history timeline. Now all three use the same
badge component.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:21:25 -04:00
josh
9f6b2ece52
Merge pull request 'fix: parse SQLite timestamps as UTC, not local time' ( #30 ) from fix/sqlite-utc-timestamps into dev
...
CI / test (push) Successful in 12s
CI / build-dev (push) Successful in 20s
Reviewed-on: #30
2026-03-28 15:20:15 -04:00
josh and Claude Sonnet 4.6
e3911157e9
fix: parse SQLite timestamps as UTC, not local time
...
CI / test (pull_request) Successful in 14s
CI / build-dev (pull_request) Has been skipped
SQLite datetime('now') returns 'YYYY-MM-DD HH:MM:SS' with no timezone
marker. JS was treating this as local time, so timestamps showed the
correct UTC digits but with the local TZ abbreviation attached (e.g.
'7:15 PM EDT' when the real local time was '3:15 PM EDT').
Add parseUtc() which appends 'Z' before parsing any string that has no
existing timezone marker, ensuring JS always treats them as UTC before
the display-timezone conversion is applied.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:19:35 -04:00
josh
0589288dfe
Merge pull request 'fix: populate nav instance count on direct detail page load/refresh' ( #29 ) from fix/detail-nav-count into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 21s
Reviewed-on: #29
2026-03-28 15:16:32 -04:00
josh and Claude Sonnet 4.6
8ead7687e5
fix: populate nav instance count on direct detail page load/refresh
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
nav-count was only set in renderDashboard, so loading /instance/:vmid
directly left it showing "—". Add getInstances() to the parallel fetch
in renderDetailPage and set the count there too.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:15:55 -04:00
josh
0e1e9b6699
Merge pull request 'fix: show stack badge in history timeline, matching state treatment' ( #28 ) from fix/history-stack-badge into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 22s
Reviewed-on: #28
2026-03-28 15:14:02 -04:00
josh and Claude Sonnet 4.6
3c008c5bce
fix: show stack badge in history timeline, matching state treatment
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:13:27 -04:00
josh
1582c28b28
Merge pull request 'fix: clean up instance detail subtitle — dividers, readable values' ( #27 ) from feat/timezone-settings into dev
...
CI / test (push) Successful in 12s
CI / build-dev (push) Successful in 21s
Reviewed-on: #27
2026-03-28 15:10:54 -04:00
josh
bcd934f5b1
Merge branch 'dev' into feat/timezone-settings
CI / test (pull_request) Successful in 12s
CI / build-dev (pull_request) Has been skipped
2026-03-28 15:10:26 -04:00
josh and Claude Sonnet 4.6
4c9acd20c7
fix: clean up instance detail subtitle — dividers, readable values
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Separate vmid / id / created with a subtle vertical border so they
don't run together. Bump font to 13px. Labels drop to 11px muted,
values use full --text colour so the actual data stands out clearly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:10:05 -04:00