-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfeatures.html
More file actions
28 lines (26 loc) · 29.4 KB
/
features.html
File metadata and controls
28 lines (26 loc) · 29.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="en-US" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Features | Foldergram</title>
<meta name="description" content="Verified product features and UI behaviors in the current Foldergram app.">
<meta name="generator" content="VitePress v1.6.4">
<link rel="preload stylesheet" href="/assets/style.D0ri7LhZ.css" as="style">
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
<script type="module" src="/assets/app.Ctsaibyu.js"></script>
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="modulepreload" href="/assets/chunks/theme.DJE1TC2M.js">
<link rel="modulepreload" href="/assets/chunks/framework.ePeAWSvT.js">
<link rel="modulepreload" href="/assets/features.md.C4hW69V4.lean.js">
<link rel="icon" type="image/svg+xml" href="/logo.svg">
<link rel="apple-touch-icon" href="/logo.svg">
<meta name="theme-color" content="#6366f1">
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
</head>
<body>
<div id="app"><div class="Layout" data-v-b831c05f><!--[--><!--]--><!--[--><span tabindex="-1" data-v-9178e81a></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-9178e81a>Skip to content</a><!--]--><!----><header class="VPNav" data-v-b831c05f data-v-2222ab16><div class="VPNavBar" data-v-2222ab16 data-v-3a1adb31><div class="wrapper" data-v-3a1adb31><div class="container" data-v-3a1adb31><div class="title" data-v-3a1adb31><div class="VPNavBarTitle has-sidebar" data-v-3a1adb31 data-v-7c1b0e18><a class="title" href="/" data-v-7c1b0e18><!--[--><!--]--><!--[--><img class="VPImage logo" src="/logo.svg" alt data-v-84be65fe><!--]--><span data-v-7c1b0e18>Foldergram</span><!--[--><!--]--></a></div></div><div class="content" data-v-3a1adb31><div class="content-body" data-v-3a1adb31><!--[--><!--]--><div class="VPNavBarSearch search" data-v-3a1adb31><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-3a1adb31 data-v-b187e594><span id="main-nav-aria-label" class="visually-hidden" data-v-b187e594> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/quick-start" tabindex="0" data-v-b187e594 data-v-4599aa41><!--[--><span data-v-4599aa41>Quick Start</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/installation" tabindex="0" data-v-b187e594 data-v-4599aa41><!--[--><span data-v-4599aa41>Installation</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/configuration" tabindex="0" data-v-b187e594 data-v-4599aa41><!--[--><span data-v-4599aa41>Configuration</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/how-it-works" tabindex="0" data-v-b187e594 data-v-4599aa41><!--[--><span data-v-4599aa41>How It Works</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/api" tabindex="0" data-v-b187e594 data-v-4599aa41><!--[--><span data-v-4599aa41>API</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/security" tabindex="0" data-v-b187e594 data-v-4599aa41><!--[--><span data-v-4599aa41>Security</span><!--]--></a><!--]--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://foldergram.intentdeep.com/" target="_blank" rel="noreferrer" tabindex="0" data-v-b187e594 data-v-4599aa41><!--[--><span data-v-4599aa41>Demo</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-3a1adb31 data-v-df187b99><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-df187b99 data-v-8e7bc7a0 data-v-dc0f6ec6><span class="check" data-v-dc0f6ec6><span class="icon" data-v-dc0f6ec6><!--[--><span class="vpi-sun sun" data-v-8e7bc7a0></span><span class="vpi-moon moon" data-v-8e7bc7a0></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-3a1adb31 data-v-ed584c66 data-v-2b546b40><!--[--><a class="VPSocialLink no-icon" href="https://github.com/foldergram/foldergram" aria-label="github" target="_blank" rel="noopener" data-v-2b546b40 data-v-9ca19b6a><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-3a1adb31 data-v-7fd1485d data-v-5d90fd5a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-5d90fd5a><span class="vpi-more-horizontal icon" data-v-5d90fd5a></span></button><div class="menu" data-v-5d90fd5a><div class="VPMenu" data-v-5d90fd5a data-v-565e72ed><!----><!--[--><!--[--><!----><div class="group" data-v-7fd1485d><div class="item appearance" data-v-7fd1485d><p class="label" data-v-7fd1485d>Appearance</p><div class="appearance-action" data-v-7fd1485d><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-7fd1485d data-v-8e7bc7a0 data-v-dc0f6ec6><span class="check" data-v-dc0f6ec6><span class="icon" data-v-dc0f6ec6><!--[--><span class="vpi-sun sun" data-v-8e7bc7a0></span><span class="vpi-moon moon" data-v-8e7bc7a0></span><!--]--></span></span></button></div></div></div><div class="group" data-v-7fd1485d><div class="item social-links" data-v-7fd1485d><div class="VPSocialLinks social-links-list" data-v-7fd1485d data-v-2b546b40><!--[--><a class="VPSocialLink no-icon" href="https://github.com/foldergram/foldergram" aria-label="github" target="_blank" rel="noopener" data-v-2b546b40 data-v-9ca19b6a><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-3a1adb31 data-v-7b1e48c5><span class="container" data-v-7b1e48c5><span class="top" data-v-7b1e48c5></span><span class="middle" data-v-7b1e48c5></span><span class="bottom" data-v-7b1e48c5></span></span></button></div></div></div></div><div class="divider" data-v-3a1adb31><div class="divider-line" data-v-3a1adb31></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-b831c05f data-v-a3b82d7b><div class="container" data-v-a3b82d7b><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-a3b82d7b><span class="vpi-align-left menu-icon" data-v-a3b82d7b></span><span class="menu-text" data-v-a3b82d7b>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-a3b82d7b data-v-84597ab5><button data-v-84597ab5>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-b831c05f data-v-e0bd508c><div class="curtain" data-v-e0bd508c></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-e0bd508c><span class="visually-hidden" id="sidebar-aria-label" data-v-e0bd508c> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-aef8ce5e><section class="VPSidebarItem level-0" data-v-aef8ce5e data-v-44dbf5ab><div class="item" role="button" tabindex="0" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><h2 class="text" data-v-44dbf5ab>Guide</h2><!----></div><div class="items" data-v-44dbf5ab><!--[--><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/quick-start" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>Quick Start</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/installation" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>Installation</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/configuration" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>Configuration</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-aef8ce5e><section class="VPSidebarItem level-0 has-active" data-v-aef8ce5e data-v-44dbf5ab><div class="item" role="button" tabindex="0" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><h2 class="text" data-v-44dbf5ab>Product</h2><!----></div><div class="items" data-v-44dbf5ab><!--[--><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/how-it-works" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>How It Works</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/features" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>Features</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/media-processing" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>Media Processing</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/security" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>Security</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-aef8ce5e><section class="VPSidebarItem level-0" data-v-aef8ce5e data-v-44dbf5ab><div class="item" role="button" tabindex="0" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><h2 class="text" data-v-44dbf5ab>Reference</h2><!----></div><div class="items" data-v-44dbf5ab><!--[--><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/api" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>API</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/development" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>Development</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/troubleshooting" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>Troubleshooting</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-44dbf5ab data-v-44dbf5ab><div class="item" data-v-44dbf5ab><div class="indicator" data-v-44dbf5ab></div><a class="VPLink link link" href="/faq" data-v-44dbf5ab><!--[--><p class="text" data-v-44dbf5ab>FAQ</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-b831c05f data-v-bf3f1372><div class="VPDoc has-sidebar has-aside" data-v-bf3f1372 data-v-7c2da6bf><!--[--><!--]--><div class="container" data-v-7c2da6bf><div class="aside" data-v-7c2da6bf><div class="aside-curtain" data-v-7c2da6bf></div><div class="aside-container" data-v-7c2da6bf><div class="aside-content" data-v-7c2da6bf><div class="VPDocAside" data-v-7c2da6bf data-v-c3c6bcbc><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-c3c6bcbc data-v-16b74dc6><div class="content" data-v-16b74dc6><div class="outline-marker" data-v-16b74dc6></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-16b74dc6>On this page</div><ul class="VPDocOutlineItem root" data-v-16b74dc6 data-v-8c1c05d6><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-c3c6bcbc></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-7c2da6bf><div class="content-container" data-v-7c2da6bf><!--[--><!--]--><main class="main" data-v-7c2da6bf><div style="position:relative;" class="vp-doc _features" data-v-7c2da6bf><div><h1 id="features" tabindex="-1">Features <a class="header-anchor" href="#features" aria-label="Permalink to "Features""></a></h1><p>This page documents what the current repository actually implements.</p><h2 id="home" tabindex="-1">Home <a class="header-anchor" href="#home" aria-label="Permalink to "Home""></a></h2><p>The home view is the primary feed surface.</p><p>It includes:</p><ul><li>three feed modes: Recent, Rediscover, and Random</li><li>a top Moments or Highlights section</li><li>feed-card avatar rings that can open an App Folder's avatar story in place when that folder has stories</li><li>an active home-feed video player that promotes one visible video card at a time and gives that card play, mute, and fullscreen controls</li><li>a startup scan state when the first index is still being built</li><li>a rebuild notice when the configured gallery root changed</li><li>desktop recommendations for folders based on recency, likes, and recent navigation</li><li>infinite loading for feed pagination</li></ul><h3 id="feed-mode-behavior" tabindex="-1">Feed mode behavior <a class="header-anchor" href="#feed-mode-behavior" aria-label="Permalink to "Feed mode behavior""></a></h3><table tabindex="0"><thead><tr><th>Mode</th><th>What it does</th></tr></thead><tbody><tr><td>Recent</td><td>"Newest posts first, with lighter runs from the same app folder."</td></tr><tr><td>Rediscover</td><td>"Older posts resurface when they are worth another look."</td></tr><tr><td>Random</td><td>"A fresh shuffle that stays steady while you browse."</td></tr></tbody></table><h2 id="reels" tabindex="-1">Reels <a class="header-anchor" href="#reels" aria-label="Permalink to "Reels""></a></h2><p>The dedicated reels view is available at <code>/reels</code>.</p><p>It includes:</p><ul><li>a video-only queue sourced from indexed library posts</li><li>a full-height scroll-snap deck</li><li>wheel, arrow-key, and page-up/page-down navigation in addition to direct scrolling</li><li>infinite loading with prefetch as you approach the end of the current queue</li><li>a desktop action bar for like/favorite toggle, details sidebar, folder shortcut, and original-video link</li><li>loading, empty, and error states</li><li>an app-wide default mode from Settings; the page itself does not expose an inline mode switch</li></ul><h3 id="queue-behavior" tabindex="-1">Queue behavior <a class="header-anchor" href="#queue-behavior" aria-label="Permalink to "Queue behavior""></a></h3><table tabindex="0"><thead><tr><th>Mode</th><th>What it does</th></tr></thead><tbody><tr><td>Recommended</td><td>"Affinity-ranked mix." It scores videos using freshness, likes, recent folder affinity, portrait fit, duration fit, and a deterministic seed, then reduces immediate repeats from the same folder when alternatives exist.</td></tr><tr><td>Recent</td><td>"Newest videos first."</td></tr><tr><td>Random</td><td>"Stable session shuffle."</td></tr></tbody></table><h2 id="explore" tabindex="-1">Explore <a class="header-anchor" href="#explore" aria-label="Permalink to "Explore""></a></h2><p>Explore is a dedicated full-screen shell with a darker visual treatment.</p><p>It combines:</p><ul><li>a random feed source</li><li>client-side ranking that boosts recent folder activity, liked folders, and recently opened folders</li><li>folder search across name, slug, breadcrumb, and path</li><li>local recent-search history stored in <code>localStorage</code></li></ul><p>Explore is a folder-search and serendipity surface, not a separate backend index.</p><h2 id="library" tabindex="-1">Library <a class="header-anchor" href="#library" aria-label="Permalink to "Library""></a></h2><p>Library lists every indexed folder and supports:</p><ul><li>free-text search</li><li>sorting by recent activity, post count, name, or path</li><li>quick navigation into folders</li><li>delete actions from a context menu</li></ul><h3 id="folder-deletion-behavior" tabindex="-1">Folder deletion behavior <a class="header-anchor" href="#folder-deletion-behavior" aria-label="Permalink to "Folder deletion behavior""></a></h3><p>Library supports two delete flows:</p><table tabindex="0"><thead><tr><th>Flow</th><th>Behavior</th></tr></thead><tbody><tr><td>Delete app folder</td><td>Deletes the folder's direct posts and their derivatives. Child app folders are kept. The source folder is only removed if it becomes empty.</td></tr><tr><td>Delete folder subtree</td><td>Removes the source folder subtree from disk, removes matching derivative subtrees, and deletes all affected indexed folders below that path.</td></tr></tbody></table><h2 id="folder-pages" tabindex="-1">Folder pages <a class="header-anchor" href="#folder-pages" aria-label="Permalink to "Folder pages""></a></h2><p>A folder page is available at:</p><ul><li><code>/folders/:slug</code></li><li><code>/:slug</code> as an alias</li></ul><p>Folder pages include:</p><ul><li>a folder header with avatar, posts counts, descriptions, and optional avatar-story opening</li><li>editable folder name and description via an admin "Edit App Folder" flow</li><li>a posts grid</li><li>highlight circles above the posts and reels tabs when the folder has story capsules</li><li>a reels tab when the folder contains videos</li><li>infinite loading</li></ul><p>The reels tab is a filtered view backed by the same folder endpoint using <code>mediaType=video</code>.</p><h2 id="folder-stories-and-highlights" tabindex="-1">Folder stories and highlights <a class="header-anchor" href="#folder-stories-and-highlights" aria-label="Permalink to "Folder stories and highlights""></a></h2><p>Foldergram can reserve <code>AppFolder/stories</code> as a story-style source for that folder.</p><p>In the default reserved-stories mode:</p><ul><li>direct media inside <code>AppFolder/stories</code> becomes the folder's avatar story set</li><li>each direct child folder inside <code>AppFolder/stories</code> becomes one highlight capsule</li><li>nested folders below a highlight are folded into that same capsule instead of becoming separate app folders</li><li>story media is hidden from normal folder, feed, search, and reels surfaces</li><li>the folder header avatar opens the avatar story when one exists</li><li>Home feed cards can open the same avatar story from the folder avatar ring</li><li>the shared stories modal is used for both the home-feed entry point and the folder-page entry points</li></ul><p>If the reserved root has no direct media but highlight capsules do exist, Foldergram can synthesize the avatar story from recent highlight media so the folder still has an avatar-story entry point.</p><h2 id="post-detail-and-modal-flow" tabindex="-1">Post detail and modal flow <a class="header-anchor" href="#post-detail-and-modal-flow" aria-label="Permalink to "Post detail and modal flow""></a></h2><p>The post detail route is <code>/image/:id</code>.</p><p>Behavior depends on how the route is opened:</p><ul><li>from another page, it can render as a modal over the background route</li><li>directly, it renders as a full page</li></ul><p>The detail view includes:</p><ul><li>image detail media sourced from either generated previews or originals, depending on <code>IMAGE_DETAIL_SOURCE</code></li><li>video detail playback that defaults to the generated preview source</li><li>an optional <code>HD</code> toggle for compatible higher-resolution MP4 originals</li><li>previous and next navigation within the same folder and active media filter</li><li>folder link and breadcrumb context</li><li>size, dimensions, MIME type, and duration metadata</li><li>like toggle</li><li>original-file link</li><li>an admin-only "Set as Cover" action to customize the folder avatar, which highlights dynamically if the image is already the cover</li><li>delete action with confirmation for admin sessions only</li></ul><h2 id="likes-and-favorites" tabindex="-1">Likes and Favorites <a class="header-anchor" href="#likes-and-favorites" aria-label="Permalink to "Likes and Favorites""></a></h2><p>Foldergram has two saved-items modes:</p><ul><li>signed-in <code>admin</code> and <code>viewer</code> sessions use shared SQLite likes through <code>GET /api/likes</code></li><li>anonymous public sessions use browser-local favorites stored in <code>localStorage</code></li></ul><p>The saved-items view:</p><ul><li>shows liked or favorited posts ordered by the most recent toggle in that mode</li><li>updates optimistically in the UI</li><li>drops deleted posts automatically when they are removed</li><li>stays intentionally separate between shared likes and local favorites</li></ul><p>There is no shared social layer behind either mode.</p><h2 id="moments" tabindex="-1">Moments <a class="header-anchor" href="#moments" aria-label="Permalink to "Moments""></a></h2><p>Home and <code>/moments/:id</code> expose either:</p><ul><li>date-driven Moments</li><li>fallback Highlights</li></ul><p>The selected set depends on timestamp coverage in the current library. The UI uses the same route name for both and adapts to the returned payload labels.</p><p>This is separate from folder stories and folder highlights sourced from reserved <code>stories/</code> folders.</p><h2 id="settings" tabindex="-1">Settings <a class="header-anchor" href="#settings" aria-label="Permalink to "Settings""></a></h2><p>Settings is the operational control surface for the library.</p><p>It exposes:</p><ul><li>admin-password controls</li><li>viewer password and public access controls</li><li>home and reels default feed-mode controls</li><li>stories-folders mode controls, migration notices, and a save-and-rescan flow</li><li>live scan status</li><li>storage and index status</li><li>last completed scan details</li><li>manual scan</li><li>thumbnail-only rebuild</li><li>library-index rebuild</li></ul><h3 id="access-protection" tabindex="-1">Access protection <a class="header-anchor" href="#access-protection" aria-label="Permalink to "Access protection""></a></h3><p>Settings can optionally enable role-based local access for the app.</p><p>That flow supports:</p><ul><li>turning the admin password on</li><li>changing the admin password</li><li>disabling protection again</li><li>enabling or disabling a separate viewer password</li><li>enabling anonymous public browse mode</li><li>rotating the viewer password without knowing the current one</li><li>signing the current browser session out</li></ul><p>Current non-admin behavior:</p><ul><li>viewers can browse the library and use shared likes</li><li>anonymous public visitors can browse immediately and use browser-local favorites</li><li><code>viewer</code> and <code>anonymous</code> sessions can elevate through <code>Unlock admin</code></li><li>non-admin sessions cannot open Settings</li><li>non-admin sessions cannot use Trash, delete actions, scans, or rebuild actions</li></ul><h3 id="rebuild-actions" tabindex="-1">Rebuild actions <a class="header-anchor" href="#rebuild-actions" aria-label="Permalink to "Rebuild actions""></a></h3><table tabindex="0"><thead><tr><th>Action</th><th>What changes</th></tr></thead><tbody><tr><td>Scan Library</td><td>Runs a normal scan against the current gallery root.</td></tr><tr><td>Regenerate Thumbnails</td><td>Clears generated thumbnails and video poster images, then rebuilds them from indexed media only.</td></tr><tr><td>Rebuild Library Index</td><td>Clears indexed folders, posts, likes, folder scan state, and scan history, then rescans the active gallery root and reuses matching cached derivatives when possible. In lazy derivative mode it does not pre-generate missing thumbnails or previews.</td></tr></tbody></table><h2 id="theme-and-local-ui-preferences" tabindex="-1">Theme and local UI preferences <a class="header-anchor" href="#theme-and-local-ui-preferences" aria-label="Permalink to "Theme and local UI preferences""></a></h2><p>The client also persists a few local browser preferences:</p><ul><li>light or dark theme</li><li>whether videos start muted</li><li>last opened folder</li><li>recently opened folders</li><li>recent explore searches</li></ul><p>These are stored in <code>localStorage</code> and are not synced anywhere else.</p><h2 id="what-is-intentionally-missing" tabindex="-1">What is intentionally missing <a class="header-anchor" href="#what-is-intentionally-missing" aria-label="Permalink to "What is intentionally missing""></a></h2><p>The current repository does <strong>not</strong> implement:</p><ul><li>uploads from the UI</li><li>comments</li><li>messaging</li><li>notifications</li><li>multi-user accounts</li><li>remote multi-user permissions</li><li>cloud sync</li><li>hierarchical album navigation</li></ul></div></div></main><footer class="VPDocFooter" data-v-7c2da6bf data-v-fea9e177><!--[--><!--]--><div class="edit-info" data-v-fea9e177><!----><div class="last-updated" data-v-fea9e177><p class="VPLastUpdated" data-v-fea9e177 data-v-61bce6e2>Last updated: <time datetime="2026-03-28T17:40:54.000Z" data-v-61bce6e2></time></p></div></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-fea9e177><span class="visually-hidden" id="doc-footer-aria-label" data-v-fea9e177>Pager</span><div class="pager" data-v-fea9e177><a class="VPLink link pager-link prev" href="/how-it-works" data-v-fea9e177><!--[--><span class="desc" data-v-fea9e177>Previous page</span><span class="title" data-v-fea9e177>How It Works</span><!--]--></a></div><div class="pager" data-v-fea9e177><a class="VPLink link pager-link next" href="/media-processing" data-v-fea9e177><!--[--><span class="desc" data-v-fea9e177>Next page</span><span class="title" data-v-fea9e177>Media Processing</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-b831c05f data-v-9f6e1f5c><div class="container" data-v-9f6e1f5c><p class="message" data-v-9f6e1f5c>Released under the AGPL-3.0 License.</p><p class="copyright" data-v-9f6e1f5c>Copyright © 2026 Sajjad Ali</p></div></footer><!--[--><!--]--></div></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"api.md\":\"Dq0npsCa\",\"configuration.md\":\"BsBeukw7\",\"development.md\":\"C4QAiDqM\",\"faq.md\":\"BhPUjBTn\",\"features.md\":\"C4hW69V4\",\"how-it-works.md\":\"CLbxPRcv\",\"index.md\":\"CCJ_uVDf\",\"installation.md\":\"BJPcu2wc\",\"media-processing.md\":\"BZnAue5X\",\"quick-start.md\":\"Bi2ZqhxJ\",\"security.md\":\"BwkL2X-x\",\"troubleshooting.md\":\"c84mph4l\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Foldergram\",\"description\":\"Documentation for Foldergram, the local-first photo and video gallery.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/logo.svg\",\"siteTitle\":\"Foldergram\",\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"Quick Start\",\"link\":\"/quick-start\"},{\"text\":\"Installation\",\"link\":\"/installation\"},{\"text\":\"Configuration\",\"link\":\"/configuration\"},{\"text\":\"How It Works\",\"link\":\"/how-it-works\"},{\"text\":\"API\",\"link\":\"/api\"},{\"text\":\"Security\",\"link\":\"/security\"},{\"text\":\"Demo\",\"link\":\"https://foldergram.intentdeep.com/\"}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/foldergram/foldergram\"}],\"sidebar\":[{\"text\":\"Guide\",\"items\":[{\"text\":\"Quick Start\",\"link\":\"/quick-start\"},{\"text\":\"Installation\",\"link\":\"/installation\"},{\"text\":\"Configuration\",\"link\":\"/configuration\"}]},{\"text\":\"Product\",\"items\":[{\"text\":\"How It Works\",\"link\":\"/how-it-works\"},{\"text\":\"Features\",\"link\":\"/features\"},{\"text\":\"Media Processing\",\"link\":\"/media-processing\"},{\"text\":\"Security\",\"link\":\"/security\"}]},{\"text\":\"Reference\",\"items\":[{\"text\":\"API\",\"link\":\"/api\"},{\"text\":\"Development\",\"link\":\"/development\"},{\"text\":\"Troubleshooting\",\"link\":\"/troubleshooting\"},{\"text\":\"FAQ\",\"link\":\"/faq\"}]}],\"outline\":{\"level\":[2,3],\"label\":\"On this page\"},\"footer\":{\"message\":\"Released under the AGPL-3.0 License.\",\"copyright\":\"Copyright © 2026 Sajjad Ali\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
</body>
</html>