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
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
v1.4.0
2026-03-28 16:16:46 -04:00
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
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
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
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
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
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
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
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
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
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
v1.3.1
2026-03-28 15:42:00 -04:00
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
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
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
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
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
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
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
v1.3.0
2026-03-28 15:31:57 -04:00
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
520fb98d96
Merge pull request 'feat: redesign history timeline — single-line, timestamp right-aligned' ( #26 ) from feat/timezone-settings into dev
...
CI / test (push) Successful in 12s
CI / build-dev (push) Successful in 19s
Reviewed-on: #26
2026-03-28 15:07:01 -04:00
800184d2be
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:06:34 -04:00
82c314f85c
feat: redesign history timeline — single-line, timestamp right-aligned
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Each event is now one row: label · old → new on the left, timestamp
right-aligned. Nothing is far from anything else. State changes use the
existing badge component for immediate visual recognition. The created
event reads 'instance created' in accent. Middle-dot separator keeps
field label and change value clearly associated without forced spacing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:06:09 -04:00
2fba532ec7
Merge pull request 'feat: rework history timeline for clarity' ( #25 ) from feat/timezone-settings into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 20s
Reviewed-on: #25
2026-03-28 15:01:39 -04:00
9177578aaf
Merge branch 'dev' into feat/timezone-settings
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
2026-03-28 15:01:12 -04:00
94c4a0af51
feat: rework history timeline for clarity
...
CI / test (pull_request) Successful in 12s
CI / build-dev (pull_request) Has been skipped
Timestamp now sits on its own line above each event so it's visually
separate from the change description. Field names use a friendly label
map (hardware_acceleration → hw acceleration, tailscale_ip → tailscale ip,
etc.). The created event reads "instance created" in accent colour instead
of a raw "created / —". Padding between rows increased.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 15:00:22 -04:00
ec60d53767
Merge pull request 'feat: timezone setting — display timestamps in selected local timezone' ( #24 ) from feat/timezone-settings into dev
...
CI / test (push) Successful in 12s
CI / build-dev (push) Successful in 19s
Reviewed-on: #24
2026-03-28 14:56:01 -04:00
ad81d7ace7
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 14:55:35 -04:00
badd542bd7
feat: timezone setting — display timestamps in selected local timezone
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Add a Display section to the settings modal with a timezone dropdown.
Selection is persisted to localStorage and applied to all timestamps via
fmtDate (date-only) and fmtDateFull (date + time + TZ abbreviation, e.g.
"Mar 28, 2026, 2:48 PM EDT"). Changing the timezone live-re-renders the
current page. Defaults to UTC.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 14:53:20 -04:00
7c31ee3327
Merge pull request 'chore: maintenance — test coverage, route cleanup, README rewrite' ( #23 ) from chore/maintenance into dev
...
CI / test (push) Successful in 13s
CI / build-dev (push) Successful in 23s
Reviewed-on: #23
2026-03-28 14:47:27 -04:00
0ecfa7dbc9
chore: maintenance — test coverage, route cleanup, README rewrite
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
- Add fmtHistVal and stateClass helper tests (7 new, 106 total)
- Add import regression test: missing name field returns 400 not 500
- Fix normalise() crash on missing name: body.name.trim() → (body.name ?? '').trim()
- Extract duplicate DB error handler into handleDbError() helper
- Rewrite README from scratch with audit log, export/import, full API docs
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 14:46:48 -04:00
f16fb3e088
Merge pull request 'feat: audit log / history timeline on instance detail page' ( #22 ) from feat/history-timeline into dev
...
CI / test (push) Successful in 17s
CI / build-dev (push) Successful in 22s
Reviewed-on: #22
2026-03-28 14:36:22 -04:00
cb01573cdf
feat: audit log / history timeline on instance detail page
...
CI / test (pull_request) Successful in 13s
CI / build-dev (pull_request) Has been skipped
Adds an instance_history table that records every field change:
- createInstance logs a 'created' event
- updateInstance diffs old vs new and logs one row per changed field
(name, state, stack, vmid, tailscale_ip, all service flags)
- History is stored under the new vmid when vmid changes
New endpoint: GET /api/instances/:vmid/history
The 'timestamps' section on the detail page is replaced with a
grid timeline showing timestamp | field | old → new for each event.
State changes are colour-coded (deployed=green, testing=amber,
degraded=red). Boolean service flags display as on/off.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 14:35:35 -04:00