Commit graph

588 commits

Author SHA1 Message Date
Nico
700fa1cd4a
feat: route backups through volume agents (#860) 2026-05-06 22:13:51 +02:00
Nico
e65a135676
feat(agents): create agent registry and service (#849)
* feat(agents): create agent registry and service

* fix: mark agent offline only if the session was removed properly

* refactor: centralize agent backup lifecycle state

* refactor: simplify session management

* refactor: move effect / async boundary in one place

* chore: regen migration

* refactor: improve error handling

* chore: pr feedback
2026-05-05 19:34:10 +02:00
Nicolas Meienberger
e981211a2d
fix(notifications): validate webhook headers and show delivery health 2026-05-05 10:24:20 +02:00
Nicolas Meienberger
cd69eea27f
fix: avoid unnecessary webhook allowlist checks on notification edits 2026-05-05 10:24:20 +02:00
Nicolas Meienberger
b1ae85e2c1
fix(notifications): preserve existing destinations with target allowlist 2026-05-05 10:24:20 +02:00
Nico
147f266929
fix(notifications): enforce allowlist for custom Shoutrrr targets (#853)
Some checks failed
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
Release Workflow / request-docs-version-update (push) Has been cancelled
* fix(notifications): enforce allowlist for custom Shoutrrr targets

* fix(notifications): enforce allowlist for email notification targets
2026-05-04 17:47:44 +02:00
Nico
0351d5e0b9
refactor(auth): translate better-auth errors allowedHosts (#854)
Closes #852
2026-05-04 17:47:25 +02:00
Nicolas Meienberger
f0ac9fe35c
chore: update new issue link to show templates 2026-05-04 17:09:46 +02:00
Nicolas Meienberger
8772d4796e
feat(backups): configure backup webhook timeout
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
Release Workflow / request-docs-version-update (push) Has been cancelled
2026-05-04 07:52:21 +02:00
Nicolas Meienberger
38f5a669ae
fix(core): preserve significant path whitespace 2026-05-04 07:19:57 +02:00
Nicolas Meienberger
7be7c9edae
test(e2e): fix waiting on transitive state
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / request-docs-version-update (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-05-03 20:51:43 +02:00
Nico
f83b765d04
fix(notifications): persist delivery health status (#850)
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
Release Workflow / request-docs-version-update (push) Has been cancelled
* fix(notifications): persist delivery health status

* fix: pr feedback double update
2026-05-02 11:51:16 +02:00
Antoine Jeanselme
3d5a0a9b75
feat: add repositories & volumes column sorting (#808)
Some checks failed
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
Release Workflow / request-docs-version-update (push) Has been cancelled
* Add repository column sorting

* Make status title correctly centered o nsmaller screens

* Add volumes column sorting

* refactor: use tanstack table for filtering and sorting

* feat: make notifications sortable

* chore: pr feedbacks

---------

Co-authored-by: Antoine Jeanselme <67123340+ajeanselme@users.noreply.github.com>
Co-authored-by: Nicolas Meienberger <github@thisprops.com>
2026-05-02 10:21:42 +02:00
Nicolas Meienberger
d19d827496
fix(backups): default ignore-inode for fuse volumes 2026-05-02 08:54:14 +02:00
Nicolas Meienberger
94d7fdc9a8
fix(notifications): validate notification webhook origins 2026-05-01 18:22:53 +02:00
Nico
220e2d2801
feat: make webhook calls trusted only (#848)
* feat: make webhook calls trusted only

* fix: pr feedbacks
2026-04-30 22:14:22 +02:00
Nico
1cf96c5292
refactor(agents): split local agent bootstrap from controller startup (#847) 2026-04-30 21:39:55 +02:00
Nico
11e9fbcc44
feat: pre/post backup webhooks (#835)
* feat: pre/post backup webhooks

* fix(hooks): run post when cancelled

* refactor(webhooks): headers as array

* refactor: pr feedback

* refactor: simplify hooks ceremonies

* chore: pr feedbacks

* chore: re-gen migration
2026-04-29 23:48:58 +02:00
Nico
a5d47eac5a
fix(system): ensure version check is not cached by browser (#833)
#798
2026-04-25 09:41:29 +02:00
Nico
e506047415
test: add property-based tests with fast-check (#832) 2026-04-25 09:35:28 +02:00
Nicolas Meienberger
7b3b7583c0
chore: improve sanitize function to catch escaped characters 2026-04-25 09:30:16 +02:00
Nico
f078e006c1
fix(notifications): encode SMTP credentials in Shoutrrr URLs (#831)
Closes #829
2026-04-25 09:24:05 +02:00
Nicolas Meienberger
c64862f604
refactor: extract shared test fixtures and secret helpers 2026-04-22 22:33:18 +02:00
Nico
26203cca59
chore: remove unused deps (#828) 2026-04-22 22:17:51 +02:00
Nico
6ae5a33acd
chore: remove dead files (#827) 2026-04-22 22:13:24 +02:00
Nico
e2c9ef0518
chore: fixed unused types (#824) 2026-04-22 22:04:46 +02:00
Nico
a0c34ee48d
chore: cleanup un-used exports (#823) 2026-04-22 21:14:37 +02:00
Nicolas Meienberger
c22af17fa6
fix(volumes): avoid ENOENT during test connection cleanup
Some checks failed
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-04-20 23:06:26 +02:00
Nicolas Meienberger
f967450eea
fix(volumes): unmount existing mounts before remounting
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-04-20 22:34:58 +02:00
Nicolas Meienberger
694f1c212f
fix(volumes): isolate test-connection mounts in temp directories 2026-04-20 22:28:42 +02:00
Nico
63b08a4b71
feat(backups): ensure volume readiness before backup (#815)
* feat(backups): ensure volume readiness before backup

Backup preflight checks were relying on a db cached status. Now a real
volume healthcheck is performed before backing up. Closes #811 #695

* chore: fix ci
2026-04-20 21:18:29 +02:00
renovate[bot]
6f0617492b
fix(deps): update bun minor and patch dependencies (#795)
* fix(deps): update bun minor and patch dependencies

* chore: update api-client

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Nicolas Meienberger <github@thisprops.com>
2026-04-16 21:46:05 +02:00
Eric Hess
d2f65716fe
feat(mirrors): add selective snapshot sync to mirror repositories (#755)
* feat(mirrors): add selective snapshot sync to mirror repositories

Allow users to sync missing snapshots from the source repository to a
mirror. A new sync button per mirror opens a dialog showing which
snapshots are missing, with checkboxes to select which ones to copy.

- Add GET /:shortId/mirrors/:mirrorShortId/status endpoint to compare
  snapshots between source and mirror repositories
- Add POST /:shortId/mirrors/:mirrorShortId/sync endpoint accepting
  selected snapshotIds in the request body
- Extend restic copy command to accept multiple snapshotIds
- Add sync preview dialog with snapshot selection to the frontend

* refactor: stylistic changes

---------

Co-authored-by: Nicolas Meienberger <github@thisprops.com>
2026-04-16 21:28:48 +02:00
Nicolas Meienberger
95006a7471
chore(core package): re-organize files 2026-04-16 19:07:11 +02:00
Nico
d10a3d2d65
docs: init project (#792)
* docs: init project

docs: design

content

header sticky

docs: content

docs: update starting guide

docs: corrections

docs: oidc, sso & more

feat: landing page

style: card design

style: colors

style: zerobyte logo

style: corner content

style: docs cards

ci(docs): auto deploy to cloudflare

docs: 3-2-1 strategy

* fix: anchor links

* style: refactor landing hero

* feat: og

* chore: fix ci

* ci: build docs before publishing
2026-04-15 23:13:10 +02:00
Nico
33601dde24
feat(agent): add standalone agent runtime (#776)
* feat(agent): add standalone agent runtime

* fix(agent): add Bun and DOM types to agent tsconfig

* refactor: wrap backup error in a tagged effect error

* feat(controller): add agent manager and session handling

* feat(backups): execute backups through the agent

* fix(agent): harden disconnect and send-failure handling

* fix: rebase conflicts

* test: simplify mocks

* refactor: split agent runtime state

* fix(backup): keep old path when agent is disabled

* fix: pr feedbacks
2026-04-13 23:29:10 +02:00
Nicolas Meienberger
76ac78c40c
chore: fix ts issues in test files
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-04-12 11:39:06 +02:00
Nicolas Meienberger
832425025f
refactor(backup): move retry delay minutes conversion at the contract level 2026-04-12 11:28:39 +02:00
Nicolas Meienberger
ed046f284d
fix(backup): reset failure count on cancel 2026-04-12 10:39:14 +02:00
Nicolas Meienberger
cb22e34215
refactor(backup): default to 2 retries & 15 minutes delay 2026-04-12 10:16:26 +02:00
DerPenz
8765c5e705 feature(backup): do not trigger retry on manual backup 2026-04-12 09:49:35 +02:00
DerPenz
11bb95db92 fix(backup): retry wont be scheduled if it is after the next scheduled backup 2026-04-12 09:49:35 +02:00
DerPenz
5d8c2925d8 fix(backup): resetting failureRetryCount if backup is not retried 2026-04-12 09:49:35 +02:00
DerPenz
61396625f1 fix(backup): added limits in zod schema 2026-04-12 09:49:35 +02:00
DerPenz
b2728cb09a fix(backup): removed useless null checks 2026-04-12 09:49:35 +02:00
DerPenz
0476dcebb8 fix(backup): updating new settings correctly in the db 2026-04-12 09:49:35 +02:00
DerPenz
b1cd1a4220 fix(backup): added placeholder in settings 2026-04-12 09:49:35 +02:00
DerPenz
79b7733e1e fix(backup): updated types gen 2026-04-12 09:49:35 +02:00
DerPenz
7e9b1fafa3 feat(backup): added retry policy into job settings 2026-04-12 09:49:35 +02:00
DerPenz
feb69ef7a7 feat(backup): retry backup on failure 2026-04-12 09:49:35 +02:00
Nico
4520335ebc
fix(rclone): pass explicitly the RCLONE_CONF env var (#779) 2026-04-12 09:25:57 +02:00
Nico
73ae5c41b5
style: fix misalignment in mirrors ui (#778) 2026-04-11 08:57:46 +02:00
Nico
28ba8657f9
feat(runtime): start and ship the local agent (#767)
* feat(runtime): start and ship the local agent

* refactor: gate local agent behind feature flag

* chore: skip agent manager if flag is false

* fix: hot reload agents

* test: fix config tests
2026-04-10 00:00:30 +02:00
Nico
70c7de1efc
feat(config): add support for APP_SECRET as a file (#769)
* feat(config): add support for APP_SECRET as a file

* fix(tsc): ensure appSecret is set in type system

* fix: pr feedback
2026-04-09 23:13:07 +02:00
Nico
595a29056d
fix(slack): channel is not supported in combination with webhooks (#770)
#766
2026-04-09 22:24:24 +02:00
Nico
4872029b87
fix(smb-backend): add explicit utf8 charset encoding (#768) 2026-04-09 21:39:19 +02:00
Nico
5bcc3acc56
feat(controller): add agent manager and session handling (#763) 2026-04-09 20:00:54 +02:00
Nico
c371676ad0
feat(agent): add standalone agent runtime (#761)
* feat(agent): add standalone agent runtime

* fix(backups): bridge local executor to Effect restic API

* fix(agent): add Bun and DOM types to agent tsconfig

* refactor: wrap backup error in a tagged effect error

* fix: pr feedbacks
2026-04-08 20:47:15 +02:00
Nicolas Meienberger
049becb900 refactor(mutex): improve multi locks operations to wait for all
Wait for all locks to be available instead of locking one side and
waiting
2026-04-07 18:13:02 +02:00
Nicolas Meienberger
f11e3b7f82 fix(schedule): disable if saving with manual-only mode
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-04-04 23:23:26 +02:00
Nico
9e7f1bf138
fix: windows path style in snapshot (#742) 2026-04-04 17:21:13 +02:00
Nicolas Meienberger
43d9cb837f refactor(datetime): always use 2 digits for day and month formatting
Fixes #744
2026-04-04 17:19:53 +02:00
Nico
a4e54ac527
fix: serialize mirror copy operations per destination repository (#747)
* fix: serialize mirror copy operations per destination repository

* refactor(copy-mirror): implement acquireMany to avoid deadlock cycles
2026-04-04 17:12:45 +02:00
Nico
bae43c0d90
fix: sanitize Accept-Language locale parsing (#746)
* fix: sanitize Accept-Language locale parsing

* refactor(accept-language): prefer the highest quality language
2026-04-04 13:18:04 +02:00
Nico
95aadf6e73
refactor: dedicated edit page for notifications (#741) 2026-04-02 22:59:23 +02:00
Nico
731ebad1ee
style: redesign volume details page to match repository (#740) 2026-04-02 22:55:23 +02:00
Nico
475bfb59ae
style: redesign respository details page (#739) 2026-04-02 22:51:57 +02:00
Nico
e77723164b
refactor: improve buttons and space with dropdowns (#738) 2026-04-02 21:44:32 +02:00
Nico
4bf1463406
refactor: dedicated edit page for volumes (#737) 2026-04-02 21:40:24 +02:00
Nico
d6e80b71d7
refactor: dedicated edit page for backups (#736) 2026-04-02 21:36:31 +02:00
Nico
4305057185
test: move test runner from Bun to Vitest (#727)
* chore: migrate to vitest

* test: speed up some suites by sharing sessions and mocking expensive non-tested actions

* test: refactor some tests to verify behavior instead of implementation details

* chore: fix linting issues
2026-04-01 20:05:54 +02:00
Nicolas Meienberger
e265f7d478 test: fix flaky test depending on mutex timing
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-04-01 09:27:13 +02:00
Nicolas Meienberger
add0f2788f fix: restoring snapshots that have unrelated root paths
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-03-31 23:05:19 +02:00
Nicolas Meienberger
63e12868b1 fix: react hydration issues by using the same locale during ssr and hydration
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-03-31 22:39:16 +02:00
Nicolas Meienberger
ca38f7ca69 fix(select): render a div durng ssr to avoid hydration issues 2026-03-31 22:05:46 +02:00
Nicolas Meienberger
915b96c218 refactor: split out root-loader data getter into a dedicated function 2026-03-31 21:19:16 +02:00
Nicolas Meienberger
3acf565ccd fix: force user to provide known hosts values in sftp volume / repository creation
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-03-31 20:27:48 +02:00
Kevin Stallone
aa7eaa0929
feat(volumes): add webdav, sftp, and rclone filters (#720)
* feat(volumes): add sftp, webdav, and rclone filters

* chore(volumes): align backend filter order with create-volume form
2026-03-31 20:27:43 +02:00
Nicolas Meienberger
e55ffccd21 feat: infer default time format from navigator.language 2026-03-30 18:44:26 +02:00
Nico
f89b8c3b52
feat: custom date time format (#718) 2026-03-29 17:24:54 +02:00
Nico
2a219ac042
refactor(backups): consolidate execution into service helpers (#717) 2026-03-29 12:57:47 +02:00
Nico
611640b32b
fix: split display path and query base path (#714)
* fix: split display path and query base path

#709

* test(frontend): shared render utils

* fix(file-tree): add missing path segments

* chore: bump Bun version

* fix: select kind for synthetic folders
2026-03-29 12:30:35 +02:00
Nico
866a3c63e8
feat: manual backup option (#713)
Closes #710
2026-03-26 19:35:18 +01:00
Nicolas Meienberger
b4668e23c7 test(e2e): attach browser logs and full errors in report 2026-03-24 07:52:54 +01:00
Nicolas Meienberger
7ef211ddd5 docs: update readme version 2026-03-24 07:52:54 +01:00
Nicolas Meienberger
4c928cbc33 refactor(client): configure time formatting with timezone from server 2026-03-24 07:52:54 +01:00
Nico
8acca9ef4a
fix: cli not running (#703) 2026-03-23 19:47:44 +01:00
Nicolas Meienberger
c93b076bf6 test: simplify file-tree selection & login mocking 2026-03-22 12:06:48 +01:00
Nico
4fec2777ce
test(e2e): fail in unexpected console.error (#696)
* test(e2e): fail in unexpected console.error

* fix(datetime): graceful fallback during SSR when navigator is undefined
2026-03-22 11:31:48 +01:00
Nico
05dd440dea
fix(restic): separate error summary from diagnostic details (#694)
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-03-21 20:50:23 +01:00
Nico
618f37e250
fix(notifications): fix telegram shoutrrr URL encoding (#691)
Closes #690
2026-03-21 20:38:45 +01:00
Nicolas Meienberger
aa23967329 fix: encrypt ntfy access token at rest
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
2026-03-20 20:37:51 +01:00
Nicolas Meienberger
bad5f78991 fix(smb): use long form params username / password instead of user / pass
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
#674
2026-03-20 19:29:40 +01:00
Nico
a039bb478e
fix: separate raw include paths and patterns (#683)
Separate include patters and included path cleanly to avoid path with special characters to be expanded. Closes https://github.com/nicotsx/zerobyte/discussions/680

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

* **New Features**
  * Added ability to select specific directories and paths for inclusion in backup schedules, separate from pattern-based rules.

* **Bug Fixes & Improvements**
  * Automatically migrates existing backup configurations to work with the new path selection system.
  * Enhanced backup restoration to properly handle both selected paths and pattern-based inclusions.

* **Chores**
  * Updated database schema to support path selections in backup schedules.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-03-20 19:27:54 +01:00
Nico
f6f17cd61c
fix: backup progress use simple polling & cache (#678)
Some checks failed
Release Workflow / determine-release-type (push) Has been cancelled
Release Workflow / checks (push) Has been cancelled
Release Workflow / e2e-tests (push) Has been cancelled
Release Workflow / build-images (push) Has been cancelled
Release Workflow / publish-release (push) Has been cancelled
#593
2026-03-18 20:25:30 +01:00
Nico
429b69ec92
fix: show back warnings logs and surface in UI (#677)
fix: show back warnings logs and surface in UI

#544

chore: fix dev login issue
2026-03-18 20:21:14 +01:00
Nico
e39220c024
fix: allow quoted urls in env variables (#676) 2026-03-17 22:09:22 +01:00
Nicolas Meienberger
4356ace665 refactor: users table 2026-03-15 12:25:07 +01:00
Nicolas Meienberger
a671b17b4f refactor(schedule form): helper for multiline parsing 2026-03-15 12:09:18 +01:00
Nicolas Meienberger
2d10da72f6 refactor(volume-backend): assert mounted helper 2026-03-15 12:03:27 +01:00