Commit Graph
87 Commits
Author SHA1 Message Date
Paul Makles 8832cda5c0 feat: 'standalone' connection type (#534) 2026-08-24 11:30:36 +01:00
Paul Makles f91b803356 feat(yucca sdk): improve onboarding & path selection (#521) 2026-08-24 05:20:48 -05:00
Paul Makles 4ddc8e4666 feat(yucca sdk): warn status for backups (#520) 2026-08-24 05:08:03 -05:00
Paul Makles 2d0fb98666 feat: UI redesign (pt. 2) (#477) 2026-08-14 19:48:54 +01:00
Paul Makles 541e995fa4 fix: bump restic version in test (#473) 2026-08-12 21:04:20 +01:00
Paul Makles 2bae945404 feat: new immich nav item, snippet FAQ answers, user manual (#467) 2026-08-07 14:35:14 +01:00
Paul Makles b23e7b3276 feat: standalone app (#422)
* feat: standalone futo backups

* chore: use global settings for standalone ui

* chore: hide install immich on local

* feat: port immich dark mode mechanism

* fix: bump @immich/ui version in lockfile

* fix: missing dependency from standalone app
2026-08-06 11:49:25 +01:00
Paul Makles f79eeea9b8 feat: UI redesign (part 1) (#423)
* feat: redesign UI (first pass)

* feat: export upsell modal

* feat: immich nav btns & onboarding with upsell

* feat: use new onboarding steps

* refactor: dashboard

* feat: full page run history & snapshots list

* chore: missing data

* feat: scaffold settings page

* feat: new settings impl.

* chore: drop useless comment

* docs: document css hacks

* refactor: `StackList` -> `StackList`/`StackListPlaceholder`

* refactor: `OnboardingStepLayout.actions` prop

* docs: document that pwd manager prompt is hidden

* docs: document cron limitations in current ui

* refactor: move schedule settings into immich
fix: actually pause/unpause immich schedule

* refactor: split `StackListItem` into `StackListItem`/`StackListOption`

* chore: attempt to fix svelte checks

* fix: do not drop imported key in onboarding flow

* fix: write worm value
2026-08-06 11:49:24 +01:00
Paul Makles f6a7dd9d9d fix(yucca sdk): include task and logId for restore (#349) 2026-07-27 16:57:14 +00:00
Paul Makles 661cc6d0ad feat: store backup file name in tags (#348) 2026-07-27 16:42:10 +00:00
Paul Makles b3cafa2495 fix(yucca sdk): export ViewLogModal (#337) 2026-07-27 10:36:17 +00:00
Paul Makles 9b565ebe1f fix: throw not found exception when item missing (#318) 2026-07-24 10:46:12 +00:00
Paul Makles 2f8f060fd0 chore: set maintenance jwt & expose restoreSnapshot from module (#317) 2026-07-24 09:54:38 +00:00
Paul Makles 4cbdde3ac5 feat(yucca sdk): hooks for creating db dump & performing rollback (#309) 2026-07-23 11:06:40 +00:00
Paul Makles ad45113b11 refactor(yucca sdk): device flow error handling (#265) 2026-07-22 17:11:08 +00:00
Paul Makles 95622ad482 refactor: ignore invalid byte counter (if specified) (#266) 2026-07-22 17:10:47 +00:00
Paul Makles 6f88b578f5 feat(yucca sdk): pin rest connections to 'availableParallelism' (#264) 2026-07-22 17:09:37 +00:00
Paul Makles 4beb3c7f91 refactor: use existing formatDuration & omit at "100%" (#254) 2026-07-13 12:33:10 +00:00
Paul Makles a6146e9b73 fix: invert restore snapshot disabled check (#211) 2026-06-26 18:11:32 +00:00
Paul Makles ce09c1987f refactor: export one service instead of repositories (#207) 2026-06-26 17:29:27 +01:00
Paul Makles b8f361da89 refactor: polish for immich integration (#205) 2026-06-26 15:44:10 +00:00
Paul Makles 3ab42dea5c ci: drop package name for release-please (#190) 2026-06-26 10:43:12 +00:00
Paul Makles 1d94bebcdc fix: missing GatewayEvent export (#162) 2026-06-25 12:46:23 +00:00
Paul Makles 4956b5105b fix: package imports for orchestrator api (#160) 2026-06-25 12:04:47 +00:00
Paul Makles 3e9f844c8e chore: general clean up (#134) 2026-06-22 13:37:21 +00:00
Paul Makles 65b585a435 feat: use .well-known/yucca.json to discover backend (#126) 2026-06-18 18:21:09 +01:00
Paul Makles 27d1ac10c2 feat: telemetry & start up error reporting / robustness (#132) 2026-06-18 16:19:11 +00:00
Paul Makles 64b5fa7897 fix: add package metadata for provenance (#130) 2026-06-17 14:03:51 +00:00
Paul Makles 18c5e6e1f0 ci: combine release please components with root (#129) 2026-06-17 13:32:54 +00:00
Paul Makles faa288087d feat: metrics worker (radosgw ingest) (#123) 2026-06-17 14:16:28 +01:00
Paul Makles 10c0a3b39c feat: reconfigure primary repository backend (#118) 2026-06-15 13:39:19 +00:00
Paul Makles fcecc8dc20 fix: include python3 in Nix flake, needed for Tilt (#122) 2026-06-15 13:39:16 +00:00
Paul Makles 6bce03d888 refactor: another general clean-up & tests (#111)
Signed-off-by: izzy <me@insrt.uk>
2026-06-02 15:54:12 +01:00
Paul Makles 7b71eecbac chore: publish npm packages (#110)
Signed-off-by: izzy <me@insrt.uk>
2026-06-02 14:53:48 +00:00
Paul Makles 32446577f8 fix: mark incomplete runs as failed on bootstrap (#108)
Signed-off-by: izzy <me@insrt.uk>
2026-05-29 13:33:30 +00:00
Paul Makles 1f3ee2b5e6 feat: admin API (#106) 2026-05-29 13:33:04 +00:00
Paul Makles 1faaf4329e refactor: customer portal w. metrics history (#107) 2026-05-29 13:33:01 +00:00
Paul Makles 9aa444b599 chore: automatically remove restic locks (#109)
Signed-off-by: izzy <me@insrt.uk>
2026-05-29 13:33:00 +00:00
Paul Makles 86fff0f425 fix: demo padding (#103) 2026-05-20 14:50:50 +00:00
Paul Makles a701189455 refactor: use mutations for form modal UX (#102) 2026-05-20 14:48:42 +00:00
Paul Makles e6a5bc7569 refactor: show snapshot details in restore flow (#101) 2026-05-20 14:46:56 +00:00
Paul Makles 2cc0d11b55 refactor: recovery key import/view (#100) 2026-05-20 14:45:13 +00:00
Paul Makles 862526682d chore: force include database backups (#99) 2026-05-20 14:40:05 +00:00
Paul Makles fd866ade32 refactor: save preset as json in db (#98) 2026-05-20 15:38:21 +01:00
Paul Makles 740affcbe1 ci: timeout waiting for services (#97) 2026-05-20 13:32:18 +00:00
Paul Makles e703b08b83 feat: backup retention (#89)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 13:20:11 +01:00
Paul Makles ef20b45a2d refactor: prepare npm packages (#95)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 13:09:36 +01:00
Paul Makles b0d8f2c353 feat: immich integration UX (#87)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 13:07:59 +01:00
Paul Makles a20f02fcda refactor: metrics review changes (#94)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 13:05:12 +01:00
Paul Makles aac91631a9 feat: device code flow (#93)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 13:03:14 +01:00
Paul Makles e06b3ad2b4 chore: env changes (#92)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 13:00:28 +01:00
Paul Makles 70fd11fb17 feat: asymmetric jwt (#91)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 12:56:38 +01:00
Paul Makles df9640687e chore: repo changes (#90)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 12:55:45 +01:00
Paul Makles aa0a3464a8 feat: sync metrics to customer API (#84)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 12:52:45 +01:00
Paul Makles c515670146 refactor: general clean-up (4) (#83)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 12:51:14 +01:00
Paul Makles 415bb7860f feat: cancel running tasks (& node:fs repository refactor) (#81)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 12:49:04 +01:00
Paul Makles c64e90c7f1 feat(yucca api): configurable JWT expiry (#80)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 12:47:51 +01:00
Paul Makles 42635f4c30 fix: use repo metrics as source of truth for immich integration card (#79)
Signed-off-by: izzy <me@insrt.uk>
2026-05-14 12:35:21 +01:00
Paul Makles 6ef94e355c feat: configure schedule repositories (#78)
* refactor: split restore point flow into stage per component
fix: hook into TaskEnd instead of log completion

* chore: permit orchestrator reset

* chore: misc.

* feat: create local backend

* fix: build kysely async

* fix: re-bootstrap after restore

* chore: use provided redirect_uri

* chore: provide redirect uri

* feat: Dockerfile for michael

* feat: prompt for immich setup

* chore: bump version

Signed-off-by: izzy <me@insrt.uk>

* feat: create local backend

* refactor: add developmentMode flag for module

* fix: skip import step for other two cases

* feat: configure schedule repositories

* chore: enable developmentMode for local dev server

* chore: format

---------

Signed-off-by: izzy <me@insrt.uk>
2026-05-13 14:47:25 +01:00
Paul Makles e57db5ef19 feat: immich integration (& assorted fixes) (#77)
* refactor: split restore point flow into stage per component
fix: hook into TaskEnd instead of log completion

* chore: permit orchestrator reset

* chore: misc.

* feat: create local backend

* fix: build kysely async

* fix: re-bootstrap after restore

* chore: use provided redirect_uri

* chore: provide redirect uri

* feat: Dockerfile for michael

* feat: prompt for immich setup

* chore: bump version

Signed-off-by: izzy <me@insrt.uk>

* feat: create local backend

* refactor: add developmentMode flag for module

* fix: skip import step for other two cases

* chore: enable developmentMode for local dev server

* chore: format

---------

Signed-off-by: izzy <me@insrt.uk>
2026-05-13 14:46:50 +01:00
Paul Makles 56cc03e310 refactor: split restore point flow into stage per component (#72) 2026-05-13 13:38:43 +00:00
Paul Makles 9303cc1f79 feat: Dockerfile for michael (#76) 2026-04-24 12:28:06 +00:00
Paul Makles 712a4aaf5a refactor: general clean up (3) (#68) 2026-04-09 19:07:01 +01:00
Paul Makles ccdcf37ebb feat: Immich integration (#65) 2026-04-09 18:21:45 +01:00
Paul Makles 1d1e4d0136 refactor: cleaning up (2) (#64) 2026-04-09 18:19:27 +01:00
Paul Makles 79a7e9c274 refactor: use TanStack Query (#61) 2026-04-09 18:16:48 +01:00
Paul Makles e11a6546d3 feat: restore backups (#62) 2026-04-09 18:14:40 +01:00
Paul Makles 990b016d89 refactor: cleaning up again (#60) 2026-04-09 18:12:57 +01:00
Paul Makles b9aafefc21 feat: import repositories (#59) 2026-04-09 18:05:43 +01:00
Paul Makles 48e468d69d feat: schedule database backups (#58) 2026-04-09 18:03:16 +01:00
Paul Makles 9b0d2e62e3 feat: repository backend (#49) 2026-04-09 18:01:37 +01:00
Paul Makles 4b42484dee refactor: use @immich/sql-tools for schema (#50) 2026-04-09 17:57:34 +01:00
Paul Makles 28636f9670 refactor(yucca sdk): delegate to customer API OIDC flow (#48) 2026-04-09 17:57:14 +01:00
Paul Makles 521c1931ec feat: key flow modal (#44)
Signed-off-by: izzy <me@insrt.uk>
2026-02-19 10:55:03 +00:00
Paul Makles ce6b352953 feat: 'bytes stored' metric (#45)
Signed-off-by: izzy <me@insrt.uk>
2026-02-19 10:54:37 +00:00
Paul Makles 6b1168593d fix: redirect to / on login & un-delete migration (#43)
Signed-off-by: izzy <me@insrt.uk>
2026-02-18 17:20:57 +00:00
Paul Makles e383fbaea0 feat(yucca sdk): sqlite database for configuration (#42) 2026-02-18 15:42:10 +00:00
Paul Makles e5981e71fc feat(yucca sdk): add authentication handoff (#39) 2026-02-18 15:22:51 +00:00
Paul Makles c7f78f3735 fix: chunked uploads fail checksum checks (#38) 2026-02-18 15:21:51 +00:00
Paul Makles 957c3f8a6c feat: yucca SDK (#36) 2026-02-18 15:20:33 +00:00
Paul Makles a96010e181 refactor: general repository clean-up (#35) 2026-02-18 15:15:28 +00:00
Paul Makles 6dee4843d6 feat(customer API): repository API (#31) 2026-02-18 15:07:37 +00:00
Paul Makles 2e288c2d08 feat(customer portal): OIDC login (#30) 2026-02-18 14:54:18 +00:00
Paul Makles c568a50687 feat: configure OpenTelemetry (#29) 2026-02-18 14:49:31 +00:00
Paul Makles c06ae1a2e9 refactor: create library for common server components (#28)
* feat: initial commit (mise, nest, restic-api)

* ci: should use new nested tasks

* chore: use absolute imports

* chore: format

* fix: absolute imports for jest

* feat: REST API impl. with in-memory storage

* feat: s3 storage backing (wip)

* fix: use Range in S3 get object

* feat: validate path parameters

* chore: clean up checks

* chore: remove TODO

* docs: add descriptions to mise commands

* feat: JWT auth

* feat: load secrets from env (validate w. zod)

* chore: set default compose variables

* chore: add docker commands to mise

* fix: don't eat JWT errors

* fix: obfuscate s3 errors

* chore: validate auth schema

* feat: commit errors.ts

* fix: return partial status if Range provided

* chore: split jwt/payload validation errors

* fix: check name is a sha256 hash

* feat: streaming download

* feat: streaming upload

* feat: WORM / write once support

* fix: don't obscure other S3 errors for checkBucket

* refactor: more concise error types

* test: service unit tests for app/auth; e2e for storage

* chore: prettier ignore .dev folder

* feat: interceptor for Restic JSON routes

* test: app e2e tests (wip)

* test: partial content response

* chore: lint

* refactor: use class-validator for auth dto

* refactor: clean up constants through project

* refactor: also update binary content type

* fix: incorrect Basic parsing

* fix: actually handle validation errors in auth dto

* chore: delete .gitignore

* fix: should use 403 not 405 in worm

* chore: expose minio console for debug

* feat: delete config route

* fix: error consistency with restic reference

* feat: validate sha256 on blob upload

* fix: use bad request exception for mismatch

* feat: initial work on full e2e test

* fix: respond with correct headers for Range
refactor: unify respond logic

* test: backup & restore e2e test

* feat: setup empty yucca-api project

* feat: setup kysely for yucca-api & db repository

* refactor: `utils.ts` -> `utils/s3.ts`

* fix: shut down database after e2e test

* chore: remove stray log

* test: refactor getObject test

* chore: add built wrapper for now

* chore: add e2e/ to mise task

* chore: format

* fix: esm jest

* feat: setup database migrator

* feat: minimal template for frontend project

* chore: add prettier-plugin-tailwindcss to workspace

* chore: configure @immich/ui

* feat: sdk for web, hook up sample

* chore: add @oazapfts/runtime dependency

* chore: ignore `yucca-sdk/src/fetch-client.ts` from eslint

* chore: format

* chore: move all CI check stages into mise config

* test: mock $env/dynamic/publish for ui library

* chore: format code

* fix: correct restic API port in e2e test

* chore: move tasks around

* chore: use restic-wrapper from npm

* chore: string

* test: comprehensive e2e tests for restic API

* test: cover new commands in e2e tests

* test: worm-case for prune

* feat: lingui for svelte

* chore: ensure check runs lingui

* chore: ignore locales from checks

* chore: format/lint

* chore: configure nix-ld for mise

* chore: move `env.ts` to common package

* chore: accept any no. of arguments for docker tasks/e2e

* chore: different strategy for e2e clean up

* chore: configure Git Town

Signed-off-by: izzy <me@insrt.uk>

* chore: add default.nix for mise

Signed-off-by: izzy <me@insrt.uk>

* chore: lost changes from parent

Signed-off-by: izzy <me@insrt.uk>

* fix: use valid language code

* chore: ignore migration errors in dev

* fix: apply fixes to @common/server (again)

* fix: wait for common:build

---------

Signed-off-by: izzy <me@insrt.uk>
2026-01-27 14:04:32 +00:00
Paul Makles 0b99068f23 feat: initial commit (#27)
* feat: initial commit (mise, nest, restic-api)

* ci: should use new nested tasks

* chore: use absolute imports

* chore: format

* fix: absolute imports for jest

* feat: REST API impl. with in-memory storage

* feat: s3 storage backing (wip)

* fix: use Range in S3 get object

* feat: validate path parameters

* chore: clean up checks

* chore: remove TODO

* docs: add descriptions to mise commands

* feat: JWT auth

* feat: load secrets from env (validate w. zod)

* chore: set default compose variables

* chore: add docker commands to mise

* fix: don't eat JWT errors

* fix: obfuscate s3 errors

* chore: validate auth schema

* feat: commit errors.ts

* fix: return partial status if Range provided

* chore: split jwt/payload validation errors

* fix: check name is a sha256 hash

* feat: streaming download

* feat: streaming upload

* feat: WORM / write once support

* fix: don't obscure other S3 errors for checkBucket

* refactor: more concise error types

* test: service unit tests for app/auth; e2e for storage

* chore: prettier ignore .dev folder

* feat: interceptor for Restic JSON routes

* test: app e2e tests (wip)

* test: partial content response

* chore: lint

* refactor: use class-validator for auth dto

* refactor: clean up constants through project

* refactor: also update binary content type

* fix: incorrect Basic parsing

* fix: actually handle validation errors in auth dto

* chore: delete .gitignore

* fix: should use 403 not 405 in worm

* chore: expose minio console for debug

* feat: delete config route

* fix: error consistency with restic reference

* feat: validate sha256 on blob upload

* fix: use bad request exception for mismatch

* feat: initial work on full e2e test

* fix: respond with correct headers for Range
refactor: unify respond logic

* test: backup & restore e2e test

* feat: setup empty yucca-api project

* feat: setup kysely for yucca-api & db repository

* refactor: `utils.ts` -> `utils/s3.ts`

* fix: shut down database after e2e test

* chore: remove stray log

* test: refactor getObject test

* chore: add built wrapper for now

* chore: add e2e/ to mise task

* chore: format

* fix: esm jest

* feat: setup database migrator

* feat: minimal template for frontend project

* chore: add prettier-plugin-tailwindcss to workspace

* chore: configure @immich/ui

* feat: sdk for web, hook up sample

* chore: add @oazapfts/runtime dependency

* chore: ignore `yucca-sdk/src/fetch-client.ts` from eslint

* chore: format

* chore: move all CI check stages into mise config

* test: mock $env/dynamic/publish for ui library

* chore: format code

* fix: correct restic API port in e2e test

* chore: move tasks around

* chore: use restic-wrapper from npm

* chore: string

* test: comprehensive e2e tests for restic API

* test: cover new commands in e2e tests

* test: worm-case for prune

* feat: lingui for svelte

* chore: ensure check runs lingui

* chore: ignore locales from checks

* chore: format/lint

* chore: configure nix-ld for mise

* chore: accept any no. of arguments for docker tasks/e2e

* chore: different strategy for e2e clean up

* chore: configure Git Town

Signed-off-by: izzy <me@insrt.uk>

* chore: add default.nix for mise

Signed-off-by: izzy <me@insrt.uk>

* chore: lost changes from parent

Signed-off-by: izzy <me@insrt.uk>

* fix: use valid language code

---------

Signed-off-by: izzy <me@insrt.uk>
2026-01-27 13:46:14 +00:00
Paul Makles 0f07813b18 chore: configure Git Town (#26)
* chore: configure Git Town

Signed-off-by: izzy <me@insrt.uk>

* chore: add default.nix for mise

Signed-off-by: izzy <me@insrt.uk>

---------

Signed-off-by: izzy <me@insrt.uk>
2026-01-27 13:44:46 +00:00