release: v0.19.0

Release v0.19.0. See the `## [0.19.0] — 2026-09-29` section of
[CHANGELOG.md](https://github.com/ralksta/immich-folio/blob/dev/CHANGELOG.md)
for the full list.

Highlights: client proofing links (#683), custom content pages (#738),
asset picker search (#740), concurrent-edit detection (#742), env-locked
settings (#739), an accessibility baseline (#741), three security fixes
with advisories (#737, #755, #759), and a pre-release quality pass
(#780–#797).

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ralksta <ralksta@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Ralf <rohlenbo79@gmail.com>
Co-authored-by: Paul Thies <110185070+ImScheinox@users.noreply.github.com>
Co-authored-by: lancetm714 <108419425+lancetm714@users.noreply.github.com>
Co-authored-by: Lance Martin <lancetaylor95@gmail.com>
This commit is contained in:
Ralksta
2026-09-29 22:50:30 +02:00
committed by GitHub
parent 5f251923f0
commit ad8b09700b
297 changed files with 19398 additions and 1800 deletions

View File

@@ -29,6 +29,15 @@ export interface PublicSubpage {
export interface PublicJournalEntry {
slug: string;
draft: boolean;
/** The entry carries a password of its own. */
isProtected: boolean;
}
export interface PublicContentPage {
slug: string;
draft: boolean;
/** The page carries a password of its own. */
isProtected: boolean;
}
export interface SiteShape {
@@ -38,6 +47,8 @@ export interface SiteShape {
/** Albums that are not part of any subpage. */
standaloneAlbums: PublicAlbum[];
journal: PublicJournalEntry[];
/** Content pages (#722), in or out of the menu — both are public URLs. */
pages?: PublicContentPage[];
/** Whether an album carries its own password. Keyed by Immich album id. */
isAlbumProtected: (albumId: string) => boolean;
aboutEnabled: boolean;
@@ -81,11 +92,19 @@ export function publicPaths(site: SiteShape): string[] {
paths.push(`/${album.slug}`);
}
for (const page of site.pages ?? []) {
// A page outside the menu is still a public page; a draft or a locked
// one is not, and its title would travel with the URL.
if (page.draft || page.isProtected) continue;
paths.push(`/${page.slug}`);
}
if (site.journalEnabled) {
for (const entry of site.journal) {
// Drafts stay visible to the logged-in admin and absent for everyone
// else; a listing is "everyone else".
if (entry.draft) continue;
// else; a listing is "everyone else". A locked entry is left out for
// the reason /journal hides it: its URL leads to a gate that names it.
if (entry.draft || entry.isProtected) continue;
paths.push(`/journal/${entry.slug}`);
}
}