124 Commits

Author SHA1 Message Date
Nico
8ced05c5a9 feat: add refresh snapshot list and snapshot error page (#434)
Closes #372
2026-01-29 23:20:13 +01:00
Nico
da5ad5c817 feat: add config for SMB guest mode (#431)
* feat: add config for SMB guest mode

Closes #279

* chore: pr feedbacks
2026-01-29 23:16:31 +01:00
Nico
3786a9283b fix(backup-card): dot invisible if volume name too long (#430) 2026-01-29 21:14:21 +01:00
Nico
bde5302ca4 feat(smtp-notification): add missing from name param to form (#429)
* feat(smtp-notification): add missing from name param to form

* chore: gen api client
2026-01-29 21:13:51 +01:00
Nico
93aabebd51 refactor: remove slug constraint in volume name (#428)
* refactor: remove slug constraint in volume name

Closes #413

* chore: remove un-used imports

* fix(notifications): validate name is not empty

* refactor: deny empty names
2026-01-29 20:57:20 +01:00
Didin Sino
d449547336 feat: add support for sending notifications to Telegram group topics (#401) 2026-01-27 19:43:05 +01:00
Nico
273aa2b9ac feat: add a confirm dialog before stopping the backup (#409) 2026-01-25 10:20:23 +01:00
Nicolas Meienberger
0e5438897c fix(repo-mutex): catch errors and remove listener 2026-01-22 22:06:39 +01:00
Nico
2ab37e6b67 refactor: async doctor (#375)
* feat: background doctor operation

* refactor(repo-details): design layout

* refactor(doctor): support abort signal in all operations

* chore: fix linting issue

* chore: pr feedbacks

* chore: merge conflicts

* refactor: handle aborted signal in all operations

* chore: pr feedbacks

* chore: remove old migration
2026-01-22 21:55:45 +01:00
Nico
da37b08fa0 feat: user management (#394)
* feat: user management settings

* feat: cleanup user's org when deleting them

* chore: pr feedback

* refactor(create-user): tanstack mutation
2026-01-21 22:25:15 +01:00
Nico
451aed8983 Multi users (#381)
* feat(db): add support for multiple users and organizations

* feat: backfill entities with new organization id

* refactor: filter all backend queries to surface only organization specific entities

* refactor: each org has its own restic password

* test: ensure organization is created

* chore: pr feedbacks

* refactor: filter by org id in all places

* refactor: download restic password from stored db password

* refactor(navigation): use volume id in urls instead of name

* feat: disable registrations

* refactor(auth): bubble up auth error to hono

* refactor: use async local storage for cleaner context sharing

* refactor: enable user registration vs disabling it

* test: multi-org isolation

* chore: final cleanup
2026-01-20 22:28:22 +01:00
Nicolas Meienberger
f4a222aa15 refactor(up/down limit): allow floating value & default to 1 2026-01-15 18:27:50 +01:00
Nicolas Meienberger
1622e34b0d refactoring(bw-limit): stylistic refactoring 2026-01-15 18:07:00 +01:00
Nicolas Meienberger
f0871ece52 chore: hide email in settings (not yet changeable) 2026-01-15 16:13:39 +01:00
Nicolas Meienberger
4fda10d89d style(snapshots-timeline): ensure same width for all cards 2026-01-15 16:13:14 +01:00
Nico
9bff375217 refactor: format dates in a human-friendly way (#334) 2026-01-15 16:13:14 +01:00
Raj Dave
623b4b7116 Remove 'Upload Limit' and 'Download Limit' text 2026-01-13 23:07:03 +03:00
Raj Dave
a7a4ccef6b fix a lot of the coderabbit warnings 2026-01-10 14:23:39 +03:00
Raj Dave
db127afe5a Adds bandwidth limiting to repositories
Implements bandwidth limits for repository uploads and downloads.

Adds UI components to configure bandwidth limits.
Adds database fields to store bandwidth limit configuration.
Integrates bandwidth limiting into restic commands.
2026-01-10 14:03:45 +03:00
Nicolas Meienberger
99b7f35d8e Merge branch 'to-cherry' 2026-01-09 21:27:25 +01:00
Nicolas Meienberger
6e68c75ef1 chore: various fixes
fix(create-schedule): expand folder button submitting the form

style(schedule-form): fix multi scrollbar on long file list
2026-01-09 21:25:38 +01:00
Nico
d9b150b34e feat: add 2FA (TOTP) support (#326)
* feat: setup better-auth with 2fa

* feat(totp): frontend

* refactor: split dialogs into components

* feat: disable 2fa cli

* chore: fix liniting issues

* chore(deps): bump the minor-patch group across 1 directory with 19 updates (#327)

* chore(deps): bump the minor-patch group across 1 directory with 19 updates

Bumps the minor-patch group with 19 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@react-router/node](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-node) | `7.11.0` | `7.12.0` |
| [@react-router/serve](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-serve) | `7.11.0` | `7.12.0` |
| [@scalar/hono-api-reference](https://github.com/scalar/scalar/tree/HEAD/integrations/hono) | `0.9.30` | `0.9.32` |
| [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) | `5.90.12` | `5.90.16` |
| [drizzle-orm](https://github.com/drizzle-team/drizzle-orm) | `0.44.7` | `0.45.1` |
| [hono](https://github.com/honojs/hono) | `4.10.5` | `4.11.3` |
| [hono-rate-limiter](https://github.com/rhinobase/hono-rate-limiter) | `0.5.1` | `0.5.3` |
| [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) | `0.555.0` | `0.562.0` |
| [react-hook-form](https://github.com/react-hook-form/react-hook-form) | `7.69.0` | `7.70.0` |
| [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) | `7.11.0` | `7.12.0` |
| [recharts](https://github.com/recharts/recharts) | `3.5.1` | `3.6.0` |
| [@faker-js/faker](https://github.com/faker-js/faker) | `10.1.0` | `10.2.0` |
| [@happy-dom/global-registrator](https://github.com/capricorn86/happy-dom) | `20.0.11` | `20.1.0` |
| [@hey-api/openapi-ts](https://github.com/hey-api/openapi-ts) | `0.88.2` | `0.90.2` |
| [@react-router/dev](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dev) | `7.11.0` | `7.12.0` |
| [@tanstack/react-query-devtools](https://github.com/TanStack/query/tree/HEAD/packages/react-query-devtools) | `5.91.1` | `5.91.2` |
| [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) | `0.22.0` | `0.23.0` |
| [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) | `1.36.0` | `1.38.0` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `7.3.0` | `7.3.1` |

Updates `@react-router/node` from 7.11.0 to 7.12.0
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-node/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/@react-router/node@7.12.0/packages/react-router-node)

Updates `@react-router/serve` from 7.11.0 to 7.12.0
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-serve/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/@react-router/serve@7.12.0/packages/react-router-serve)

Updates `@scalar/hono-api-reference` from 0.9.30 to 0.9.32
- [Release notes](https://github.com/scalar/scalar/releases)
- [Changelog](https://github.com/scalar/scalar/blob/main/integrations/hono/CHANGELOG.md)
- [Commits](https://github.com/scalar/scalar/commits/HEAD/integrations/hono)

Updates `@tanstack/react-query` from 5.90.12 to 5.90.16
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query@5.90.16/packages/react-query)

Updates `drizzle-orm` from 0.44.7 to 0.45.1
- [Release notes](https://github.com/drizzle-team/drizzle-orm/releases)
- [Commits](https://github.com/drizzle-team/drizzle-orm/compare/0.44.7...0.45.1)

Updates `hono` from 4.10.5 to 4.11.3
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](https://github.com/honojs/hono/compare/v4.10.5...v4.11.3)

Updates `hono-rate-limiter` from 0.5.1 to 0.5.3
- [Release notes](https://github.com/rhinobase/hono-rate-limiter/releases)
- [Commits](https://github.com/rhinobase/hono-rate-limiter/compare/v0.5.1...v0.5.3)

Updates `lucide-react` from 0.555.0 to 0.562.0
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/0.562.0/packages/lucide-react)

Updates `react-hook-form` from 7.69.0 to 7.70.0
- [Release notes](https://github.com/react-hook-form/react-hook-form/releases)
- [Changelog](https://github.com/react-hook-form/react-hook-form/blob/master/CHANGELOG.md)
- [Commits](https://github.com/react-hook-form/react-hook-form/compare/v7.69.0...v7.70.0)

Updates `react-router` from 7.11.0 to 7.12.0
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.12.0/packages/react-router)

Updates `recharts` from 3.5.1 to 3.6.0
- [Release notes](https://github.com/recharts/recharts/releases)
- [Changelog](https://github.com/recharts/recharts/blob/main/CHANGELOG.md)
- [Commits](https://github.com/recharts/recharts/compare/v3.5.1...v3.6.0)

Updates `@faker-js/faker` from 10.1.0 to 10.2.0
- [Release notes](https://github.com/faker-js/faker/releases)
- [Changelog](https://github.com/faker-js/faker/blob/next/CHANGELOG.md)
- [Commits](https://github.com/faker-js/faker/compare/v10.1.0...v10.2.0)

Updates `@happy-dom/global-registrator` from 20.0.11 to 20.1.0
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.11...v20.1.0)

Updates `@hey-api/openapi-ts` from 0.88.2 to 0.90.2
- [Release notes](https://github.com/hey-api/openapi-ts/releases)
- [Changelog](https://github.com/hey-api/openapi-ts/blob/main/docs/CHANGELOG.md)
- [Commits](https://github.com/hey-api/openapi-ts/compare/@hey-api/openapi-ts@0.88.2...@hey-api/openapi-ts@0.90.2)

Updates `@react-router/dev` from 7.11.0 to 7.12.0
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dev/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/@react-router/dev@7.12.0/packages/react-router-dev)

Updates `@tanstack/react-query-devtools` from 5.91.1 to 5.91.2
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query-devtools/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/react-query-devtools@5.91.2/packages/react-query-devtools)

Updates `oxfmt` from 0.22.0 to 0.23.0
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxfmt_v0.23.0/npm/oxfmt)

Updates `oxlint` from 1.36.0 to 1.38.0
- [Release notes](https://github.com/oxc-project/oxc/releases)
- [Changelog](https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md)
- [Commits](https://github.com/oxc-project/oxc/commits/oxlint_v1.38.0/npm/oxlint)

Updates `vite` from 7.3.0 to 7.3.1
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v7.3.1/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v7.3.1/packages/vite)

---
updated-dependencies:
- dependency-name: "@react-router/node"
  dependency-version: 7.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@react-router/serve"
  dependency-version: 7.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@scalar/hono-api-reference"
  dependency-version: 0.9.32
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.90.16
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: drizzle-orm
  dependency-version: 0.45.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: hono
  dependency-version: 4.11.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: hono-rate-limiter
  dependency-version: 0.5.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: lucide-react
  dependency-version: 0.562.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: react-hook-form
  dependency-version: 7.70.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: react-router
  dependency-version: 7.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: recharts
  dependency-version: 3.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@faker-js/faker"
  dependency-version: 10.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@happy-dom/global-registrator"
  dependency-version: 20.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@hey-api/openapi-ts"
  dependency-version: 0.90.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@react-router/dev"
  dependency-version: 7.12.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: "@tanstack/react-query-devtools"
  dependency-version: 5.91.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
- dependency-name: oxfmt
  dependency-version: 0.23.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: oxlint
  dependency-version: 1.38.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-patch
- dependency-name: vite
  dependency-version: 7.3.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: downgrade hono

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nicolas Meienberger <github@thisprops.com>

* chore: force hono version in transitive deps

* refactor: remove copy to clipboard everywhere as it's not possible on http

* chore: pr feedbacks

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-09 21:12:05 +01:00
Jakub Trávník
d0dd74a626 fix: update NFS version select to use controlled value (#329) 2026-01-09 18:37:24 +01:00
Jakub Trávník
1d2e737a98 fix: increase name length limit from 32 to 128 characters in backup schedule schema (#330) 2026-01-09 18:29:35 +01:00
Nico
87403c9407 chore: add more linting rules and fix warnings (#325) 2026-01-08 18:53:02 +01:00
Nico
99932a8522 refactor: better-auth (#319)
* refactor: better-auth

* chore: pr feedback

* chore: lower + trim usernames in db
2026-01-07 22:36:20 +01:00
Nico
62de036847 refactor: improve perf by calling api in parallel in clientLoaders (#312)
* refactor: improve perf by calling api in parallel in clientLoaders

* fix: dependent api calls
2026-01-05 21:10:00 +01:00
Nicolas Meienberger
3467d1e411 Merge branch 'tvarohohlavy-local-repo-enhancements' 2026-01-05 21:06:59 +01:00
Nicolas Meienberger
b7609a6574 chore: remove needless comments 2026-01-05 21:06:36 +01:00
Nico
b216219209 refactor: move from biome to oxlint/oxformat (#311)
* chore: install and configure oxlint

* chore: fix liniting issues

* chore: install and configure oxfmt

* ci: add oxlint action instead of biome

* chore: pr feedbacks

* Revert "chore: pr feedbacks"

This reverts commit 525dcd8d9f.
2026-01-05 21:04:37 +01:00
Jakub Trávník
86263fede7 Merge branch 'main' into local-repo-enhancements 2026-01-05 08:18:31 +01:00
Nico
d293738bf4 feat: show components versions (#297)
On hover on the Zerobyte version in the sidebar
A card will appear to show the versions of the
binaries (restic, rclone, shoutrrr)
2026-01-04 21:43:39 +01:00
Nicolas Meienberger
79d5f47b19 chore(repo-form): style adjustments 2026-01-04 15:40:09 +01:00
Nicolas Meienberger
f67ca4eed2 style(delete notification): remove icon in delete button 2026-01-04 10:30:36 +01:00
Nico
d7bcf4c9e2 feat: display updates and release notes (#290)
* feat: display notification when new release is available

* refactor: standalone re-usable cache util

* refactor: clear cache on server startup

* refactor: add timeout to gh release fetch

* fix: run with app version env variable
2026-01-04 10:19:23 +01:00
Jakub Trávník
2d6c9397c0 fix: handle imported repositories correctly in getEffectiveLocalPath
- Imported repositories use config.path directly (matching server logic)
- Removed unused isImportedLocal variable
2026-01-03 12:47:03 +01:00
Jakub Trávník
affe0a45fa Merge origin/main into local-repo-enhancements 2026-01-03 12:42:53 +01:00
Nico
1b88fa6bd6 style: responsive fixes (#282)
* style(backups): use container queries to avoid overflow when menu is open

* style: fix breadcrumbs breaking the layout on smaller devices

* style: improve wording and error displays

* chore: wording
2026-01-02 22:10:27 +01:00
Nico
b8fe2a985b feat: insecure tls & cacert for self-hosted repos (#277)
* feat: insecure tls & cacert for self-hosted repos

* fix: extra arg
2026-01-02 18:13:19 +01:00
Nicolas Meienberger
e0027b7668 refactor: code style and api client 2026-01-02 17:37:38 +01:00
tvories
08a19ed38d fix: PR suggestions 2026-01-02 17:05:43 +01:00
tvories
1a12436195 fix: add property existence checks before accessing repository config fields 2026-01-02 17:05:43 +01:00
tvories
e78af76beb feat: added additional validation, moved field location, made skip tls and ca certificate mutually exclusive with tooltips 2026-01-02 17:05:43 +01:00
tvories
07e68b9fe7 feat: add support for a cacert configuration as well as allowing the user to skip tls validation 2026-01-02 17:05:43 +01:00
Jakub Trávník
f836e2f9df fix(backups): allow removing selected paths that no longer exist on filesystem (#272)
Add X button to selected paths list in backup schedule form. When files/folders
are selected for backup but later deleted from the volume, restic fails because
`--files-from` references non-existent paths. Previously, users couldn't remove
these stale paths since they don't appear in the file browser to uncheck.

The X button enables direct removal of any selected path, fixing stuck backup
configurations that would always fail with "file not found" errors.
2026-01-02 15:33:25 +01:00
Nico
658c42a53b feat: add generic webhook form & refactor each type in its own form (#239)
* feat: add generic webhook form & refactor each type in its own form

* chore: pr feedbacks

* fix(email-form): filter out empty emails
2026-01-02 14:56:35 +01:00
Nicolas Meienberger
d535f02536 refactor: code readability 2026-01-02 14:24:22 +01:00
SaarLAN-Pissbeutel
1b8154a74b add access token for ntfy notifications 2025-12-30 11:08:32 +00:00
Nico
c05aa8d5bf feat: add support for SFTP volume backend (#249)
* feat: add support for SFTP volume backend

* feat: allow more secure SFTP connection with known hosts

* refactor: make default value for skip host key check to false

* refactor: use os.userInfo when setting uid/gid in mount commands
2025-12-28 18:30:49 +01:00
Nico
ae5233d9fb refactor: tag snapshots with schedule short_id instead of db id (#248)
* refactor: tag snapshots with schedule short_id instead of db id

* chore: formatting issues
2025-12-28 11:42:25 +01:00