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