Commit Graph
228 Commits
Author SHA1 Message Date
bo0tzz 200cb8cba4 perf(server): use a createdAt range for "recently added" time buckets
With orderBy=createdAt (the Recently added page), getTimeBucket filtered on
date_trunc('MONTH', createdAt AT TIME ZONE 'UTC'), which has no matching
index (only the localDateTime month expression is indexed), so every bucket
request read all of the user's assets. Use the equivalent half-open UTC
range instead so asset_createdAt_idx can be combined with the owner index.
Results are identical.

Median per bucket, PG 14:

| user        | before | after   |
|-------------|--------|---------|
| 10k assets  | 29 ms  | 4.5 ms  |
| 200k assets | 152 ms | 28 ms   |
| 600k assets | 149 ms | 98 ms   |
2026-10-13 14:21:47 +02:00
bo0tzz 2aa89ac975 perf(server): stop aggregating every album asset when loading a shared link
SharedLinkRepository.get (shared link page load, /shared-links/me, and the
OpenGraph tags rendered for /share/:key) json_agg'd every asset of the
album, with its full exif row, ordered by fileCreatedAt. The only things
used from it are the asset count and the first/last localDateTime.

Load the album without assets and fill assetCount/startDate/endDate from
getMetadataForIds, which is what GET /albums/:id already uses. The counts
now also respect the default visibility filter, and the dates are
formatted the same as on /albums/:id.

150k-asset album link, PG 14:

|                        | before          | after  |
|------------------------|-----------------|--------|
| query                  | 4.2-6.5 s       | ~0.26 s (metadata aggregate) |
| JSON built by postgres | 261 MB          | -      |
| GET /shared-links/me   | -               | 0.28 s, 961 B |
2026-10-13 14:20:09 +02:00
56319b76fc fix: run workflow steps in their configured order (#32240)
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-10-08 21:39:38 +02:00
Jason Rasmussen c0506fe723 fix: person without assets (#32114) 2026-10-05 21:12:47 +02:00
Daniel Dietzler 28e375c058 fix: assetTagFilter any matching (#32008) 2026-10-02 17:40:23 +02:00
Mees Frensel fd97f3e5a6 fix(server): include album owner for album shared links (#31837) 2026-10-01 18:54:08 +02:00
Jonathan Jogenfors de6dcf669c fix(server): make library exclusion matching consistently case-insensitive (#31970) 2026-10-01 12:02:49 +02:00
Jason RasmussenandDaniel Dietzler 1741650348 feat: bulk person management (#31949)
* feat: bulk person access

* chore: wip

* chore: cleanup and minor UX improvements

* chore: pr feedback

---------

Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-09-30 17:15:24 -04:00
Jonathan Jogenfors a010802431 chore(server): better xmp testing (#31928) 2026-09-30 11:29:14 +02:00
Jason Rasmussen aec7c0d97b feat: auto-sync name changes to connected users (#31923)
* feat: auto-sync name changes to connected users

* fix: rename to faceId

* fix: pr feedback

* fix: mobile build
2026-09-29 18:12:25 -04:00
Daniel Dietzler 4408f49d15 fix: person management ids validation and permissions (#31898) 2026-09-29 18:02:33 +02:00
76c08fa230 fix: library watcher should respect ignore patterns (#31418)
* fix: chokidar should respect ignore patterns

* fix: chokidar mock

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-09-28 15:51:19 -04:00
c12d5e6d35 feat: people management (#31620)
Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-09-28 21:29:15 +02:00
Mees Frensel 5f0c9a5996 fix(server): emit sidecarwrites and assetupdates consequently (#31777)
* fix(server): emit sidecarwrites and assetupdates consequently

* fix medium test
2026-09-28 14:36:05 -04:00
bo0tzzandDaniel Dietzler 8ede1d54d8 fix(server): exclude hidden assets from large files search (#31479)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-09-28 18:21:44 +02:00
Jordan BrockandDaniel Dietzler 54987c764a fix(server): write tag updates to exif table (#31425)
Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
2026-09-28 15:52:25 +00:00
Alex d6d0947383 feat: birthday memories (#30831) 2026-09-22 04:30:43 -05:00
Jason Rasmussen 54e7ffa4e6 feat: asset face v3 (#31591) 2026-09-16 16:27:01 -04:00
Jason Rasmussen 99fd561144 chore: transition to nullable user.oauthId (#31560) 2026-09-15 09:33:15 -04:00
Daniel Dietzler 7b51c50a96 feat: people merge improvements (#31456) 2026-09-14 19:10:25 +02:00
Daniel Dietzler ef9718e93d fix: feature face update ignores soft-deleted faces (#31533) 2026-09-14 09:47:02 -04:00
Daniel Dietzler 221ddd31c4 feat: server imports linting (#31537) 2026-09-14 14:51:31 +02:00
Jason Rasmussen 9abb605b62 fix: sync client disconnect (#31461) 2026-09-11 14:48:55 -04:00
Daniel Dietzler 2a62622041 feat: NestJS 12 and ESM (#31237) 2026-09-10 13:22:29 +02:00
Daniel Dietzler 399217bf5f fix: face detection of edited assets (#31240) 2026-09-03 15:40:30 +02:00
Daniel Dietzler 0628f8b966 fix: do not move faces of users other than the current owner (#31145) 2026-08-31 16:11:04 +02:00
Timon 8b3d6b320b feat(server): new search API (#30179) 2026-08-27 20:39:55 +02:00
andy.mp3andDaniel Dietzler 1db4677cf8 feat: same-second photos now sub-sort by filename (#29528)
* Update sorting

Updates the sorting to sort
1. First by timeCreatedAt, but then
2. By filename.

* Push tsts

* Sync SQL

* Formatting fixes

---------

Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
2026-08-27 13:46:10 -04:00
Daniel Dietzler c7d24321bf feat: allow users to re-run facial recognition for their group (#30965) 2026-08-27 16:38:07 +02:00
Jordan Brock 1b3aa9cd51 fix(server): correct tag create operations (#30877) 2026-08-24 17:57:32 +02:00
shenlongandshenlong-tanwen 6b7b0fe3a6 fix: remove partner assets from existing memories (#28950)
* fix: remove partner assets from existing memories

* move tests to be medium tests

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-08-24 14:55:47 +00:00
Lin, Chiang-Yu b26b0cc806 fix(server): let a second metadata extraction replace stored AV metadata (#30900)
`upsertExif` writes derived audio, video and keyframe metadata with an
`ON CONFLICT DO UPDATE`, but every column in those three update lists
assigns the stored row back to itself:

    bitrate: ref('asset_audio.bitrate')

`SET bitrate = asset_audio.bitrate` is a self-assignment, so once a row
exists nothing can change it. Re-running metadata extraction re-reads the
file, builds a fresh snapshot, and then quietly discards it. The rest of the
file already uses `excluded` for this, as does `plugin.repository.ts`.

`asset_video.frameCount` had a second problem: it is supplied on insert but
was missing from the update list, so it would have stayed stale even after
the reference was corrected.

Extraction is meant to be repeatable. Probing improves between releases, a
file can be repaired or replaced, and a fix to how a stream is chosen is
worthless if it cannot reach the assets that were already imported. An
`upsert` that silently degrades to insert-only defeats all of that.

Metadata extraction is the only caller that passes these three objects, and
it passes a complete snapshot or nothing: each object is built from a single
probe behind a guard, and `upsertExif` skips the branch entirely when the
object is absent. So taking the incoming row cannot write partial values
over good ones. The other three callers pass `exif` only, and every other
reference to these tables is a read.
2026-08-22 17:58:05 +00:00
Jordan BrockandRay 79c4c00f70 feat(web): tag renaming v2 (#27909)
* implement updated rename tag feature

* Fix tag update handler

* Ensure toast displays updated tag name

* Ensure toast displays updated tag name

* Handle updates to tag closure table, prevent slash in API filename, test case updates

* delete child tags on parent delete

* Update frontend for better handling of nested tags

* pr checklist fixes

* fix unit test for tag controller

* Hide path for top-level tags

* regenerate SQL files

* name updates optional for tag update operations

* e2e tests for new tag api changes

* changes from code review, additional test coverage

* test fixes, web component refactor

* test assets

* test asset updates

* open-api rebuild

* update unit tests

* fix tag dto tests

* Update web/src/lib/modals/TagEditModal.svelte

Fix missing color bug

Co-authored-by: Ray <3608878+Pecacheu@users.noreply.github.com>

* fix tag e2e test

* remove closure table bug fixes

* remove nullish from tag name update schema

* regenerate openapi and sql

* fix test and e2e test

* simplify tag repository update process

* minor fix and sql regenerate

* fix tests, regen open-api, update dto

* Remove unused function

* Remove accidental test asset ref

* re-add test assets

* pin submodule to main branch commit

* Update test cases based on feedback

* Server fixes based on feedback

* regenerate sql

---------

Co-authored-by: Ray <3608878+Pecacheu@users.noreply.github.com>
2026-08-21 14:55:11 -04:00
Jason Rasmussen 2f48a8aab4 refactor: memory e2e (#30906) 2026-08-21 12:15:17 -04:00
HolegotsandDaniel Dietzler 57ce9b2221 fix(server): correct asset dimensions from exif metadata (#29244)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-08-21 13:32:17 +02:00
Jason Rasmussen 4c26a7ca76 refactor: activity e2e (#30896) 2026-08-21 12:57:50 +02:00
Jason Rasmussen c7531a36f9 refactor: partner e2e (#30895) 2026-08-20 17:32:51 -04:00
Jason RasmussenandDaniel Dietzler 11b1aa5ecf feat: cluster groups (#30739)
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-08-20 20:03:00 +02:00
Jason Rasmussen 7cd0a7d30c refactor: e2e tests (#30870) 2026-08-19 14:31:57 -04:00
Jason Rasmussen c63824bcea refactor: library e2e (#30867) 2026-08-19 11:49:41 -04:00
Jason Rasmussen d2759ec41e refactor: library e2e (#30865) 2026-08-19 10:36:35 -04:00
Jonathan JogenforsandJason Rasmussen 2018e4f8c4 chore(server): migrate library e2e tests (#27277)
* migrate library e2e tests

* fix: real storage repo

---------

Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-08-19 13:14:40 +00:00
Brandon Wees 93d2d30fe0 feat: rotate an API key (#30801)
* feat: rotate an API key

* fix: test response

* chore: create new api key scope

* chore: code review
2026-08-18 16:07:39 -04:00
YarosandDaniel Dietzler 80a90fabf3 fix(server): update ocr & faces after asset edit (#29303)
* fix: update ocr & faces after asset edit

* chore: remove client-side refresh

* fix(server): sync asset OCR visibility changes

* chore: prettier format

* test: missing updatedAt

* chore: remove comment

* chore: fix test

* chore: update migration timestamp

* chore(server): AssetOcrSyncReset

* chore: migration timestamps

---------

Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
2026-08-18 14:32:21 +00:00
PriyanshuandpriyanshuANDcoad b0a9468da7 fix(server): guard createAll against empty values list (#30837)
Co-authored-by: priyanshuANDcoad <priyanshu23154050@akgec.ac.in>
2026-08-18 13:56:37 +02:00
Jason Rasmussen 342a9472c4 refactor: duplicate e2e (#30773) 2026-08-14 21:00:13 +00:00
Jason Rasmussen 14241ac7bc chore(server): remove unused code (#30772)
chore(server): remove unnused code
2026-08-14 16:58:14 -04:00
Daniel Dietzler 199723261c fix: owner cascade delete album (#30692) 2026-08-11 23:05:18 +02:00
Jason Rasmussen 00d10dab63 refactor: e2e user tests (#30716) 2026-08-11 12:39:25 -04:00
Daniel Dietzler 5ad1e4e0f7 fix: medium tests dependencies (#30612) 2026-08-07 11:36:20 +02:00