Commit Graph

1179 Commits

Author SHA1 Message Date
Nicolas Meienberger
1a4fb41c99 refactor: add snapshot path context facade
Snapshot browsing, restore planning, dump preparation, and Windows path
handling were sharing the same path rules through many helpers and
callers. This creates one core facade that owns source-path detection,
restic path conversion, display path, restore targets, and dump
2026-06-30 20:51:24 +02:00
Nico
f646bc4f92 fix: harden volume browser path codec (#1020)
Volume browser paths are API paths, not native filesystem paths. They
need stable slash-separated encoding so paths containing spaces,
backslashes, or percent-encoded characters can round-trip between the
browser and the agent without escaping the mounted volume root.

This adds a small codec at the volume-host boundary, verifies
symlink/root containment on the resolved native path, and keeps the
local file browser from normalizing user-facing request.
2026-06-30 19:21:15 +02:00
Nico
3e3719f33c fix(bacups): reschedule immediately warning backups (#1016)
* fix(bacups): reschedule immediately warning backups

Backups that didn't end properly due to a container restart should be
re-scheduled immediately

* chore: pr feedback
2026-06-30 13:03:12 +02:00
Nico
f3f6a4e5f9 test(integration): add restore test suite (#1018)
Add an integration test suite for restore
2026-06-30 11:36:52 +02:00
Nicolas Meienberger
f504dfc372 chore(desktop): alpha naming 2026-06-29 09:12:21 +02:00
Nicolas Meienberger
7274740ab5 fix(ci): scope desktop release signing secrets 2026-06-29 08:31:11 +02:00
Nico
b010e25803 refactor(desktop): remove restic bridge (#1012) 2026-06-28 13:09:32 +02:00
Nicolas Meienberger
083fdd1234 fix(desktop): harden startup against localhost port hijack 2026-06-24 09:43:02 +02:00
Nico
cd90abd3fe feat(desktop): automatic release pipeline (#1006)
* feat(desktop): automatic release pipeline

* refactor(desktop-release): remove build number infer since we won't release locally

* fix(desktop): correct MAS TestFlight release config
2026-06-23 11:38:11 +02:00
Nico
3f48e935f5 feat(desktop): add packaging runtime (#1005) 2026-06-22 21:16:15 +02:00
Nico
956e357b72 feat(desktop): add tray UI (#1004) 2026-06-22 15:36:46 +02:00
Nico
22fe4fa0a5 feat(desktop): add native shell capabilities (#1002)
* feat(desktop): add native shell capabilities

* refactor: pr feedback
2026-06-22 14:55:12 +02:00
Nico
f26ed7b5fd feat(desktop): add app foundation (#1001)
* feat(desktop): add app foundation

refactor(desktop): slim app foundation

* refactor: pr feedbacks
2026-06-22 14:05:02 +02:00
Nicolas Meienberger
591b6c81d1 test: automate legacy sftp integration 2026-06-22 10:27:39 +02:00
Copilot
cc29347e57 docs: update Docker Compose examples to Zerobyte v0.40 (#999)
* Initial plan

* docs: update docker compose image tags to v0.40

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-06-22 09:45:51 +02:00
Nicolas Meienberger
277c24e1a0 fix(auth): revoke organization API keys when removing members v0.40.0 v0.40.0-beta.2 2026-06-21 22:46:51 +02:00
Nicolas Meienberger
019ffa98fd fix(auth): require SSO auto-link policy for existing members 2026-06-21 17:23:35 +02:00
Nicolas Meienberger
4dd96307ec fix(sso): allow verified invitation account linking 2026-06-21 11:50:44 +02:00
Nicolas Meienberger
dec9ac5b28 test(e2e): fix failure due to changes in UI 2026-06-21 11:49:49 +02:00
Nico
c0148aba89 feat(desktop): prepare folder picker for desktop (#993)
* feat(desktop): prepare folder picker for desktop

* fix: test failure
2026-06-17 14:34:39 +02:00
Nicolas Meienberger
da13257295 refactor: min 32 chars for desktop launch secret 2026-06-16 22:57:16 +02:00
Nicolas Meienberger
7b5eb7574c fix(auth): disable sign-up paths when password is disabled 2026-06-16 22:48:37 +02:00
Parman Mohammadalizadeh
34e8f89727 feat: add option to disable password login (#949)
* feat: add option to disable password login

Adds a global admin setting to hide the username/password form on the
login page, useful for deployments that rely solely on SSO/OIDC or
passkeys. The form defaults to enabled so existing deployments are
unaffected.

Changes:
- Add PASSWORD_LOGIN_ENABLED_KEY constant
- Add isPasswordLoginEnabled / setPasswordLoginEnabled to system service
  (defaults to true when no DB record exists)
- Add GET/PUT /api/v1/system/password-login-status endpoints (GET
  auth-gated for admin use; setting is exposed to the login page via
  the existing getLoginOptions server function)
- Extend getLoginOptions to include passwordLoginEnabled
- Conditionally render the password login form in LoginPage
- Add "Enable password login" toggle in the admin System Settings tab,
  next to "Enable new user registrations"
- Add corresponding entries to generated API client files
  (types.gen.ts, sdk.gen.ts, @tanstack/react-query.gen.ts)

Closes #941

* fix(login): show errors even if password is disabled

* feat(cli): add command to re-enable password

---------

Co-authored-by: Nicolas Meienberger <github@thisprops.com>
2026-06-16 22:26:56 +02:00
Nico
1f38d9241b fix(backups): allow clearing retention policy fields (#992)
Related issue: #988
2026-06-16 19:35:41 +02:00
renovate[bot]
4cdce2a26d chore(deps): update github/codeql-action digest to 8aad20d (#914)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-16 16:17:45 +02:00
renovate[bot]
1e08eb0d15 chore(deps): update voidzero-dev/setup-vp digest to 2dec1e3 (#923)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-16 16:17:19 +02:00
renovate[bot]
e720e9707e chore(deps): update actions/checkout digest to df4cb1c (#936)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-16 16:16:53 +02:00
renovate[bot]
7f6dedf64a fix(deps): update bun minor and patch dependencies (#974) 2026-06-16 07:32:10 +02:00
Nicolas Meienberger
697ba92686 fix(notifications): trim smtpHost before saving
Related issue #851
2026-06-15 22:33:27 +02:00
Nico
d24167b520 refactor(auth): mark desktop sessions with auth source (#990)
* refactor(auth): mark desktop sessions with auth source

Makes it easier to filter out on session type in backend paths that
behave differently depending on the context

* chore: fix un-used import

* fix(auth): align desktop session guards

* refactor(auth): gate desktop sessions by runtime features
2026-06-15 21:39:32 +02:00
Nico
d1e96c21b9 feat(desktop): add launch-secret session bootstrap (#989) 2026-06-15 17:33:14 +02:00
Nico
35748e757f refactor(auth): model password support as runtime capability (#987) 2026-06-15 16:38:30 +02:00
Nico
d79ecc41a3 feat(desktop): hide unavailable admin flows (#986) 2026-06-14 23:27:27 +02:00
Nico
64e3bf48b9 refactor(auth): enforce named permissions on server routes (#984) 2026-06-14 20:16:34 +02:00
Nico
551e55aa53 refactor(auth): introduce named permission policy (#983) 2026-06-14 19:50:14 +02:00
Nico
aded9bbdce feat(system): expose runtime backend capabilities (#982) 2026-06-14 19:38:49 +02:00
Nicolas Meienberger
051bf96e8b feat(desktop): add desktop runtime config 2026-06-14 19:17:56 +02:00
Nicolas Meienberger
9ff5f9b7e7 fix(sso): block api key sessions from verifying sso invitations 2026-06-14 17:53:22 +02:00
Nico
3c37360bca fix(restore): files with brackets in name (#981) 2026-06-14 15:22:51 +02:00
Nico
ab781837f4 refactor(datetime): share formatter utilities across runtimes (#980) 2026-06-14 14:30:50 +02:00
Nico
2361a00e53 feat(restic): support configurable restic command (#979) 2026-06-14 14:15:51 +02:00
Lyall Cooper
e3df99aceb fix: restore trackpad swipe-back navigation (#972) 2026-06-13 11:34:55 +02:00
Nico
15c367eeb8 feat(copy): pass custom restic params (#976)
Restic copy (mirror) should inherit the compatible custom flags from the
parent backup setup

Related issue #960
2026-06-13 10:29:36 +02:00
Nico
283de054ec feat(authentication): api key (#966)
* feat(authentication): api key

Keeps selected UX pieces from b487b096.

Co-authored-by: Nguyen Quy Hy <nguyenquyhy@live.com.sg>

* refactor: pr feedbacks

* chore: bump @better-auth/api-key

* refactor: global limit of 50 api key instead of 10 per org

---------

Co-authored-by: Nguyen Quy Hy <nguyenquyhy@live.com.sg>
2026-06-12 20:14:21 +02:00
renovate[bot]
bd46bd1156 fix(deps): update bun minor and patch dependencies (#937)
* fix(deps): update bun minor and patch dependencies

* fix: require SSO flow for SSO org invitations

Manual enforcement since better-auth made the rule wider

* chore: re-generate api-client

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Nicolas Meienberger <github@thisprops.com>
2026-06-12 08:50:56 +02:00
Nicolas Meienberger
d70ec84baa fix: adapt for new restic 0.19.0 behavior 2026-06-11 20:01:27 +02:00
iven
aed2c15709 Rename docker-compose.yml to compose.yaml (#935)
Aligns the project with the current Compose Specification, which
designates compose.yaml as the canonical filename and treats the
docker-compose.yml name as a legacy fallback.

Renames every compose file in the repo (the root dev/e2e stack, the
deployment examples under examples/, and the integration-test infra
stack) and updates all documentation, the integration test runner, the
capability hint messages, and the .gitattributes pattern accordingly.
No top-level version field was present to remove.

Functional behavior is unchanged: docker compose discovers either
filename, so existing deployments are not affected by the rename.

Reference: https://docs.docker.com/compose/intro/compose-application-model/
2026-06-10 20:04:00 +02:00
Raj Dave
e6a5d04a5e Add range selection functionality to repository page (#843)
* Add range selection functionality to repository page

* Fix two issues identified by coderabbit

* fix one more coderabbit identified issue

* Add initial selection, and deselection functionality

* small fix

---------

Co-authored-by: Nicolas Meienberger <github@thisprops.com>
2026-06-10 19:51:25 +02:00
Nico
fd48ff9ce9 fix(backups): reduce low-cpu backup UI contention (#963)
* fix(backups): reduce low-cpu backup UI contention

* chore: remove un-used import

* refactor: start polling for backup updates on start event

* fix: skip ionice automatically if it fails to schedule
2026-06-10 19:36:56 +02:00
Nicolas Meienberger
8919b45e7a chore: bump upstream deps 2026-06-10 19:17:47 +02:00