20 Commits
Author SHA1 Message Date
Catubba caa1b5ef57 chore(release): 1.0.0
Bump the backend package, the Python project metadata, the frontend package
and the bug-report template's version placeholder from 0.9.0 to 1.0.0. The
docs, the changelog and SECURITY.md have said 1.0.0 since M14; these are the
strings the footer and /health actually read.

The changelog's token-replacement entry also gains the second half of that
fix: a wizard pointed at a host that is already registered is now refused at
the connection step, which was the remaining way to reach the replacement by
accident.
2026-08-05 16:20:41 +02:00
Catubba 59a281ae4e feat: external schedules mode; bump to 0.9.0
Let PVE/PBS run their own scheduled jobs (backup, prune, GC, sync) and
use Joulenap purely as the power manager: at the scheduled time it wakes
the PBS, watches its tasks, and powers it off once they have been quiet
for a configurable window (issue #27).

- backup.external config block (enabled, first_task_wait, idle_wait);
  both knobs are timeouts, not fixed delays — watching starts as soon
  as the first task appears, and the quiet countdown restarts whenever
  a new task starts, so staggered/chained jobs are never cut short
- new monitor run kind + step: wake -> wait -> watch -> power off,
  recorded in run history with the number of tasks observed; a wake
  where no job ever appears still powers off and warns in the
  notification that the external schedule did not fire
- monitor runs count as the backup slot for last-backup status and the
  missed-backup startup check
- Schedule card mode switch (Scheduled by Joulenap / External
  schedules): external mode hides GC/retention/guest selection and
  shows the two timers with explanatory tooltips; manual panel runs
  the watch cycle instead of a backup and hides the GC button
- notification titles, body lines and duration phase for the watch
  cycle, in both languages
2026-07-29 09:54:52 +02:00
Catubba 6bff430cf8 feat: richer notification bodies, run id in history; bump to 0.8.0
Notifications now carry what triggered the run, a per-phase duration
breakdown, guests as ok/total with the names of the ones that failed,
the next scheduled run and the run number. Per-guest outcomes are read
off the vzdump task log as it streams, into a summary the caller owns,
so a failed task still reports which guest broke.

Also fixes two delivery bugs: bodies were collapsed onto a single line
on HTML channels (Apprise was never told the text was plain), and the
missed-backup alert mixed UTC with the configured timezone.

The run number is now the first column of the run history, so the id a
notification quotes can be looked up in the interface.
2026-07-25 22:35:48 +02:00
Catubba 5b3da78d20 feat: light theme with header toggle; bump to 0.7.0
The dark/light palettes now live as CSS variables in index.css, switched by a
data-theme attribute on <html>; theme.ts tokens reference the variables so the
whole UI (CodeMirror included) restyles without re-rendering. Scattered hex
literals are folded into shared tokens, and the four hex+alpha concatenations
are replaced with color-mix so they work on variable references.

The header gains a moon/sun toggle between Settings and Logout. The choice is
persisted to app.theme through the config API (the value existed since 0.1.0
but was never read) and mirrored to localStorage, which an inline script in
index.html applies before first paint so there is no flash of the wrong theme.
Switching cross-fades over 300ms, skipped under prefers-reduced-motion.

Also: header action buttons stretch to equal height (Logout was 3px short),
the dev stub persists PUT /config edits instead of silently reverting them,
and a parity test asserts both palettes define the identical token set.
2026-07-23 23:37:24 +02:00
CatubbaandGitHub a677d55baf Merge pull request #22 from Joulenap/dependabot/github_actions/actions/setup-python-7
chore(deps): bump actions/setup-python from 6 to 7
2026-07-23 11:58:07 +02:00
CatubbaandGitHub 7a57f7ef98 Merge pull request #17 from Joulenap/dependabot/github_actions/actions/setup-node-7
chore(deps): bump actions/setup-node from 6 to 7
2026-07-23 11:58:04 +02:00
Catubba 530cb5e9c3 release: 0.6.0 — run history, job cancellation, Prometheus metrics
Run history in the UI: the activity card gains a second tab listing every run
with job type, trigger, result, duration and guest count. Rows expand in place
to that run's steps and log lines. Backed by /api/runs, which had existed since
0.1 with no consumer; RunSummary gains guests_ok.

Job cancellation: Run backup / Run GC turn into Stop while a job is in flight,
behind a confirmation that can also power the PBS off afterwards. Cooperative
cancellation checked in the existing poll loops (task wait, PBS wake wait,
between steps), and the underlying PVE/PBS task is stopped, not abandoned, so a
cancelled backup does not keep running on the server. A running verify is
stoppable too. Previously a stuck job blocked every later run and manual
power-off until restart.

Prometheus /metrics for Grafana, protected by the existing dashboard API key.
Sixteen gauges including per-guest last-backup times, so a guest dropping out of
the backup set can be alerted on. Written directly in the text exposition format
rather than adding a dependency; a scrape never wakes the PBS.

Notifications now name the job that ran: a failed verify or GC no longer reports
"backup failed".

Removed the dead backup.guests.auto_include_new key. It was never read, while
its name and default implied new guests were picked up automatically. Existing
configs still load (the key is stripped) and the docs now state the real rule.

Documentation accuracy pass over README, ARCHITECTURE, INSTALL, INTEGRATIONS,
SECURITY and config.example: corrected the PVE and PBS token privilege lists,
the garbage-collection and guest-selection descriptions, the supported-versions
table and the API reference, and added a Settings walkthrough.

Toggle switches are announced as switches by screen readers and can no longer
submit a surrounding form.
2026-07-23 11:20:00 +02:00
dependabot[bot]andGitHub f8d5a80e3e chore(deps): bump actions/setup-python from 6 to 7
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6 to 7.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-23 08:43:51 +00:00
Catubba d5f7132ee1 release: 0.5.0 — Advanced settings tab, config.yaml editor, update check
Closes re-review findings 11.8, 11.10 and 11.14.

- Advanced settings tab exposing the config-only knobs: backup mode,
  bwlimit, keep_last/keep_yearly, history retention, port, session
  lifetime and the HTTPS-only cookie flag.
- In-browser config.yaml editor (CodeMirror 6, lazy-loaded chunk) over
  new GET/PUT /api/config/yaml. The PUT path reuses the extracted
  _apply_config helper, so the editor gets the same redaction,
  deep-merge and validation as PUT /api/config; a Copy button yields a
  secret-free config for bug reports.
- Opt-in update check (app.update_check, default off): GET /api/update
  asks GitHub once a day behind a 24h cache and never touches
  /api/health, which the Docker healthcheck depends on.
2026-07-22 19:20:55 +02:00
dependabot[bot]andGitHub f698209ba7 chore(deps): bump actions/setup-node from 6 to 7
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6 to 7.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-16 08:44:12 +00:00
Catubba 349d1b8789 release: 0.4.4 — UX + accessibility remediation
Frontend UX and accessibility fixes from the v0.3.1 re-review, plus
self-hosted fonts.

- Accessible confirmation dialog: role=alertdialog, aria-modal, focus
  trap, Escape to close, focus restored to the trigger on close
- Self-hosted IBM Plex fonts (latin subset) — no Google Fonts request;
  the UI renders offline / air-gapped
- Login and first-account screens are proper forms with password-manager
  autocomplete hints and a progress state on submit
- Header status label shows "GC running" / "Verify running" during those
  jobs instead of always "Backup running" (new /api/status running_kind)
- Block Selective backup mode with no guests selected, with an explanation
- Setup wizard: errors on lower steps scroll into view + role=alert;
  Detect MAC reports when auto-detection finds nothing
- Empty guest-list state in the guests panel
- Harden shared Dropdown buttons with type="button"

Also fixes the CHANGELOG compare links (the 0.4.3 release omitted them).
2026-07-12 23:18:00 +02:00
Catubba 344665126a release: 0.4.3 — frontend medium-finding remediation (FE-H4, FE-M1..M10)
Setup wizard validation (FE-H4): a step no longer completes and Save no longer
unlocks when a check fails (unreachable PBS, missing PBS token, empty WoL MAC).

Frontend robustness / UX (re-review FE-M cluster; FE-M3 skipped):
- FE-M1  client-side request-timeout backstop (45s), localized error
- FE-M2  unsaved-changes confirmation guard + beforeunload
- FE-M4  surface manual-action start failures inline
- FE-M5  surface scheduler-toggle failure next to the toggle
- FE-M6  fix useTaskLog overlapping-poll duplicate lines (guard + idempotent append)
- FE-M7  Localization saved-note only after save + draft resync
- FE-M8  keep last guest list on transient error + error note
- FE-M9  wizard re-save preserves hand-configured PVE port/TLS
- FE-M10 correct Integrations regenerate-key copy + read/refresh via ConfigContext

Version bumped to 0.4.3; CHANGELOG updated.
2026-07-12 17:51:06 +02:00
Catubba 5a958c0539 release: 0.4.2 2026-07-12 00:05:01 +02:00
Catubba c87b1e1c49 release: 0.4.1
Patch release: backend robustness fixes (SQLite WAL/busy_timeout/foreign_keys,
manual power-off race, worker-thread lock leak, prune-job timezone) and a
security hardening (config.yaml written owner-only). No feature or API changes.
2026-07-10 23:01:35 +02:00
Catubba 3c3d8d99ac release: 0.4.0
Bump every version reference to 0.4.0 and add the 0.4.0 CHANGELOG entry
(keep-PBS-on manual jobs + manual GC cycle; account current-password,
cron-validation, wizard-secret, and exclude-mode fixes).

Minor bump: new user-facing feature and an additive, backward-compatible
API field (keep_on defaults to false = prior behavior).
2026-07-10 21:58:48 +02:00
Catubba 1cf452217e release: align every version reference on 0.3.1
frontend/package.json had drifted at 0.2.0 since the 0.2.0 release, and the
README status heading was never updated for 0.3.0. The lockfile pins the root
version too, so it is synced here to keep `npm ci` happy.

The Docker references all use `:latest` and need no change.
2026-07-10 00:09:47 +02:00
CatubbaandGitHub 7aefc66324 fix(docker): build the SPA on node 24 to match CI (#11)
* fix(docker): build the SPA on node 24 to match CI

The frontend CI job runs on node 24 (npm 11) while the image built the SPA
on node:22-slim (npm 10). The two npm majors disagree on whether a violated
*optional* peer dependency is fatal: npm 11 warns, npm 10 fails with ERESOLVE.

So `npm ci` could pass every CI job and still fail `docker build` on the very
same lockfile — which is exactly what happened on the typescript 7 PR, where
i18next declares `peerOptional typescript@"^5 || ^6"`. CI was green; the image
build was not.

Align the build stage to node:24-slim so CI validates the same toolchain the
shipped image uses. Vite 8 requires node >=22.12, so 24 is in range.

Note this makes the image build as lenient as CI: a violated optional peer no
longer stops the build. That is the correct trade — the two environments agreeing
matters more than one of them tripping on type-only metadata — but it does remove
the tripwire that surfaced the typescript 7 conflict.

* ci: fail on node major drift between Dockerfile and ci.yml

The Dockerfile now carries a "keep this in sync with ci.yml" comment, and
comments drift. Assert it instead: parse the node major from the SPA build
stage and from node-version, and fail the build when they disagree.

Verified the guard actually fails, not just passes: drift (22 vs 24) errors,
a ci.yml declaring two different majors errors, and an unparseable Dockerfile
errors with an explanation rather than dying silently under `set -e`.
2026-07-09 11:07:26 +02:00
CatubbaandGitHub 781822f84c chore(deps): typescript 6 + group peer-coupled Dependabot updates (#6)
* chore(deps-dev): bump typescript from 5.9.3 to 6.0.3

Redone on current main rather than merging the Dependabot branch, which
was 62 commits behind and predated the tsconfig change and the frontend
test harness — its CI run proved nothing about today's tree.

Verified locally: tsc --noEmit clean, vite build succeeds, 18/18 tests
pass, npm audit --omit=dev --audit-level=high reports 0 vulnerabilities.

* ci(dependabot): group peer-coupled packages so majors can go green

react/react-dom, vite/@vitejs/*, and i18next/react-i18next are coupled by
peer dependencies. Bumping one half across a major without the other fails
npm ci with ERESOLVE, so the solo PRs Dependabot opened for each half could
never pass CI — four of five open PRs were blocked this way.

Group each family ahead of the catch-all with no update-types filter, so it
moves as one unit at every version level. The catch-all keeps its minor+patch
scope, preserving the original intent that a security patch never rides in
with an untested framework major.

Raise the npm PR limit 5 -> 10: the cap was exactly hit, which silently stops
Dependabot opening the companion half of a pair.

i18n is listed before react so that react-i18next cannot be claimed by the
react group regardless of how patterns are matched.
2026-07-09 09:25:10 +02:00
Catubba 7d0676c3fe test(frontend): add node:test harness + format.ts tests, bump CI to Node 24 (JN-030) 2026-07-08 18:15:20 +02:00
Catubba 28cc0f425d Initial commit 2026-07-02 20:46:57 +02:00