Standalone reference integrations that consume the Gumnut Photos API
The gumnut-ai/demos repository contains standalone, self-contained example apps that integrate with the Gumnut Photos API. Each demo lives in its own subdirectory, runs against your own Gumnut library using a personal API key, and is small enough to read end-to-end — designed to be forked and adapted.
Browser-only triage UI for cleaning up a Person’s face cluster. Useful when one Person has been polluted by look-alikes (often a parent/child or sibling pair) and you want to sweep through the worst-fitting faces and reassign them. Single static HTML file — no build step, no server, no dependencies beyond a browser.
This demo mutates your library. Each reassignment calls PATCH /api/faces/{id} and is real and immediate. There is an in-session Undo, but it only walks back history within the open tab.
Endpoints used
GET /api/people and GET /api/people/{id} (with cluster_metrics) — header data and candidate Persons.
GET /api/faces (with cluster_assignment, paginated) — every face on the
subject Person, with distances and the top-K nearest other named Persons.
See People and Faces for the suggestion rules.
GET /api/assets — parent-asset thumbnails for each face.
PATCH /api/faces/{id} — reassignments and detaches.
Local web app to browse Gumnut assets and inspect their geo metadata (latitude, longitude, city, state, country, country_code, sublocation, place_name, timezone, display_label). Pages of 100 assets load via cursor-based pagination, and an “Only with coordinates” toggle hides assets without lat/lon. A small Hono server proxies the API so your key never leaves the local backend.Endpoints used
GET /api/assets — paginated asset list with metadata, proxied through the local server.
Asset thumbnails — also proxied so the API key only travels server-side.
Native macOS app that one-way syncs photos and videos from local folders — including NAS and other network volumes — into a Gumnut library. Files are content-addressed by SHA-256 and checked against the library in bulk, so only missing files upload and re-running is always safe. The app runs sandboxed with read-only access to your local files, so it can never modify or delete anything on disk. Every run ends in a plan you approve before anything is sent. Unlike the other demos, this is a full Xcode app (a Swift package plus a SwiftUI app) rather than a browser or local-web tool; it requires Xcode 16+ on macOS 15+.
This demo mutates your library. Each upload calls POST /api/assets and is real and immediate. There is no undo, so review the plan before you approve a run.
Confirm the target library in that plan: an all_libraries key can also reach
libraries you have joined as a collaborator.
Endpoints used
GET /api/users/me — validate the API key.
GET /api/libraries — list libraries and confirm the upload target.
POST /api/assets/exist — bulk existence check (up to 5,000 checksums per request) so already-present files are skipped.
POST /api/assets — multipart upload of each missing file, with file_created_at preserved.
Each demo has its own README.md with the exact commands. In general:
Clone the demos repo: git clone https://github.com/gumnut-ai/demos.git
cd into the demo’s subdirectory.
Follow the demo’s README — typically a single command (./run.sh, npm run dev, etc.).
You’ll need a Gumnut API key. See API Keys
for how to create one. An all_libraries key can reach libraries you own and
libraries you join later, subject to your current role and the key’s actions.
For a demo that should use a fixed library, choose a selected_libraries key
with only that library. Check its target before approving any upload or edit.
See the contributing notes in the demos repo for the bar new demos should meet.
{"docsConfig":{"theme":"palm","$schema":"https://mintlify.com/docs.json","name":"Gumnut AI","description":"Gumnut is an AI-powered, open alternative to Google and Apple Photos — and an open platform for building on your library through a REST API, native SDKs, a hosted MCP server, and Immich compatibility.","colors":{"primary":"#5A4CD6","light":"#8E80F0","dark":"#5A4CD6"},"logo":{"light":"https://mintcdn.com/gumnutai/g7uvIAJIK6-HCQWp/logo/gumnut-logotype-horizontal-light.svg?fit=max\u0026auto=format\u0026n=g7uvIAJIK6-HCQWp\u0026q=85\u0026s=2a6ec085314f83e9fb98e806c60a6667","dark":"https://mintcdn.com/gumnutai/g7uvIAJIK6-HCQWp/logo/gumnut-logotype-horizontal-dark.svg?fit=max\u0026auto=format\u0026n=g7uvIAJIK6-HCQWp\u0026q=85\u0026s=a067b12c8fb73332dc59ffbc25ef7074"},"favicon":"https://mintcdn.com/gumnutai/Hs-Y3ah5ynxxRsxf/favicon.ico?fit=max\u0026auto=format\u0026n=Hs-Y3ah5ynxxRsxf\u0026q=85\u0026s=56f919e27dd1e3fa1b120b9c062d919f","background":{"color":{"light":"#FFFFFF","dark":"#171717"}},"navbar":{"primary":{"type":"button","label":"Dashboard","href":"https://app.gumnut.ai"}},"footer":{"links":[{"header":"Product","items":[{"label":"Home","href":"https://www.gumnut.ai"},{"label":"Features","href":"https://www.gumnut.ai"},{"label":"Developers","href":"https://www.gumnut.ai"},{"label":"FAQ","href":"https://www.gumnut.ai"}]},{"header":"Developers","items":[{"label":"Getting Started","href":"/guides/getting-started/introduction"},{"label":"API Docs","href":"/api-reference"},{"label":"SDK Docs","href":"/guides/sdks/overview"},{"label":"MCP Docs","href":"/guides/mcp/overview"}]},{"header":"Company","items":[{"label":"About","href":"https://www.gumnut.ai/about"},{"label":"Blog","href":"https://blog.gumnut.ai/"},{"label":"Support","href":"https://www.gumnut.ai/contact"},{"label":"Privacy Policy","href":"https://www.gumnut.ai/privacy"}]}]},"fonts":{"family":"Inter"},"icons":{"library":"lucide"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Gumnut Home","icon":"house","href":"https://www.gumnut.ai"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"gumnutai","hasAudioNarration":false,"actualSubdomain":"gumnutai","customDomains":["docs.gumnut.ai"],"gitSource":{"type":"github","owner":"gumnut-ai","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae8c0c0ed2f58cb10ef20c8","collectionId":"5db12b46-c623-4b05-a046-0adc109226f3","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae8c0c0ed2f58cb10ef20c8"},"feedback":{"agentFeedback":true},"entitlements":{},"buildId":"6ae8c0c0ed2f58cb10ef20c8","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"API reference","count":81},{"language":"default","tag":"Guides","count":36},{"language":"default","tag":"assets","count":19},{"language":"default","tag":"libraries","count":11},{"language":"default","tag":"Product features","count":10},{"language":"default","tag":"APIs","count":9},{"language":"default","tag":"albums","count":7},{"language":"default","tag":"people","count":7},{"language":"default","tag":"stacks","count":7},{"language":"default","tag":"library-invitations","count":6}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"guides/demos/overview","slug":"/guides/demos/overview","pageMetadata":{"title":"Demos","description":"Standalone reference integrations that consume the Gumnut Photos API","href":"/guides/demos/overview"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Standalone reference integrations that consume the Gumnut Photos API\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`https://github.com/gumnut-ai/demos`,children:_jsx(_components.code,{children:`gumnut-ai/demos`})}),` repository contains standalone, self-contained example apps that integrate with the Gumnut Photos API. Each demo lives in its own subdirectory, runs against your own Gumnut library using a personal API key, and is small enough to read end-to-end — designed to be forked and adapted.`]}),`\n`,_jsx(Heading,{level:`2`,id:`available-demos`,children:`Available demos`}),`\n`,_jsx(Heading,{level:`3`,id:`face-cleanup`,children:`face-cleanup`}),`\n`,_jsx(_components.p,{children:`Browser-only triage UI for cleaning up a Person’s face cluster. Useful when one Person has been polluted by look-alikes (often a parent/child or sibling pair) and you want to sweep through the worst-fitting faces and reassign them. Single static HTML file — no build step, no server, no dependencies beyond a browser.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`This demo mutates your library. Each reassignment calls `,_jsx(_components.code,{children:`PATCH /api/faces/{id}`}),` and is real and immediate. There is an in-session Undo, but it only walks back history within the open tab.`]})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Endpoints used`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`GET /api/people`}),` and `,_jsx(_components.code,{children:`GET /api/people/{id}`}),` (with `,_jsx(_components.code,{children:`cluster_metrics`}),`) — header data and candidate Persons.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`GET /api/faces`}),` (with `,_jsx(_components.code,{children:`cluster_assignment`}),`, paginated) — every face on the\nsubject Person, with distances and the top-K nearest other named Persons.\nSee `,_jsx(_components.a,{href:`/guides/apis/faces-and-people`,children:`People and Faces`}),` for the suggestion rules.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`GET /api/assets`}),` — parent-asset thumbnails for each face.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`PATCH /api/faces/{id}`}),` — reassignments and detaches.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.a,{href:`https://github.com/gumnut-ai/demos/tree/main/face-cleanup`,children:`Demo source and README →`})}),`\n`,_jsx(Heading,{level:`3`,id:`geoviewer`,children:`geoviewer`}),`\n`,_jsxs(_components.p,{children:[`Local web app to browse Gumnut assets and inspect their geo metadata (`,_jsx(_components.code,{children:`latitude`}),`, `,_jsx(_components.code,{children:`longitude`}),`, `,_jsx(_components.code,{children:`city`}),`, `,_jsx(_components.code,{children:`state`}),`, `,_jsx(_components.code,{children:`country`}),`, `,_jsx(_components.code,{children:`country_code`}),`, `,_jsx(_components.code,{children:`sublocation`}),`, `,_jsx(_components.code,{children:`place_name`}),`, `,_jsx(_components.code,{children:`timezone`}),`, `,_jsx(_components.code,{children:`display_label`}),`). Pages of 100 assets load via cursor-based pagination, and an “Only with coordinates” toggle hides assets without lat/lon. A small `,_jsx(_components.a,{href:`https://hono.dev`,children:`Hono`}),` server proxies the API so your key never leaves the local backend.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Endpoints used`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`GET /api/assets`}),` — paginated asset list with metadata, proxied through the local server.`]}),`\n`,_jsx(_components.li,{children:`Asset thumbnails — also proxied so the API key only travels server-side.`}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.a,{href:`https://github.com/gumnut-ai/demos/tree/main/geoviewer`,children:`Demo source and README →`})}),`\n`,_jsx(Heading,{level:`3`,id:`macos-upload-client`,children:`macos-upload-client`}),`\n`,_jsx(_components.p,{children:`Native macOS app that one-way syncs photos and videos from local folders — including NAS and other network volumes — into a Gumnut library. Files are content-addressed by SHA-256 and checked against the library in bulk, so only missing files upload and re-running is always safe. The app runs sandboxed with read-only access to your local files, so it can never modify or delete anything on disk. Every run ends in a plan you approve before anything is sent. Unlike the other demos, this is a full Xcode app (a Swift package plus a SwiftUI app) rather than a browser or local-web tool; it requires Xcode 16+ on macOS 15+.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`This demo mutates your library. Each upload calls `,_jsx(_components.code,{children:`POST /api/assets`}),` and is real and immediate. There is no undo, so review the plan before you approve a run.\nConfirm the target library in that plan: an `,_jsx(_components.code,{children:`all_libraries`}),` key can also reach\nlibraries you have joined as a collaborator.`]})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Endpoints used`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`GET /api/users/me`}),` — validate the API key.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`GET /api/libraries`}),` — list libraries and confirm the upload target.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`POST /api/assets/exist`}),` — bulk existence check (up to 5,000 checksums per request) so already-present files are skipped.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`POST /api/assets`}),` — multipart upload of each missing file, with `,_jsx(_components.code,{children:`file_created_at`}),` preserved.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.a,{href:`https://github.com/gumnut-ai/demos/tree/main/macos-upload-client`,children:`Demo source and README →`})}),`\n`,_jsx(Heading,{level:`2`,id:`running-a-demo`,children:`Running a demo`}),`\n`,_jsxs(_components.p,{children:[`Each demo has its own `,_jsx(_components.code,{children:`README.md`}),` with the exact commands. In general:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Clone the `,_jsx(_components.a,{href:`https://github.com/gumnut-ai/demos`,children:`demos repo`}),`: `,_jsx(_components.code,{children:`git clone https://github.com/gumnut-ai/demos.git`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`cd`}),` into the demo’s subdirectory.`]}),`\n`,_jsxs(_components.li,{children:[`Follow the demo’s README — typically a single command (`,_jsx(_components.code,{children:`./run.sh`}),`, `,_jsx(_components.code,{children:`npm run dev`}),`, etc.).`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`You’ll need a Gumnut API key. See `,_jsx(_components.a,{href:`/guides/authentication/api-keys`,children:`API Keys`}),`\nfor how to create one. An `,_jsx(_components.code,{children:`all_libraries`}),` key can reach libraries you own and\nlibraries you join later, subject to your current role and the key’s actions.\nFor a demo that should use a fixed library, choose a `,_jsx(_components.code,{children:`selected_libraries`}),` key\nwith only that library. Check its target before approving any upload or edit.`]}),`\n`,_jsx(Heading,{level:`2`,id:`contributing-a-demo`,children:`Contributing a demo`}),`\n`,_jsxs(_components.p,{children:[`See the `,_jsx(_components.a,{href:`https://github.com/gumnut-ai/demos#contributing`,children:`contributing notes`}),` in the demos repo for the bar new demos should meet.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Demos","description":"Standalone reference integrations that consume the Gumnut Photos API","href":"/guides/demos/overview"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Available demos","slug":"available-demos","depth":2,"children":[{"title":"face-cleanup","slug":"face-cleanup","depth":3,"children":[]},{"title":"geoviewer","slug":"geoviewer","depth":3,"children":[]},{"title":"macos-upload-client","slug":"macos-upload-client","depth":3,"children":[]}]},{"title":"Running a demo","slug":"running-a-demo","depth":2,"children":[]},{"title":"Contributing a demo","slug":"contributing-a-demo","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"gumnutai","siteName":"Gumnut AI","title":"Demos - Gumnut AI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-31T18:53:51.714Z","originalFileLocation":"guides/demos/overview.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Standalone reference integrations that consume the Gumnut Photos API\">\u003cmeta data-mint-head name=\"application-name\" content=\"Gumnut AI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/gumnutai/HakcV-TGKbGh8wwG/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/gumnutai/HakcV-TGKbGh8wwG/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/gumnutai/HakcV-TGKbGh8wwG/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/gumnutai/HakcV-TGKbGh8wwG/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/gumnutai/HakcV-TGKbGh8wwG/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/gumnutai/HakcV-TGKbGh8wwG/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/gumnutai/HakcV-TGKbGh8wwG/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/gumnutai/HakcV-TGKbGh8wwG/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/gumnutai/HakcV-TGKbGh8wwG/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Demos - Gumnut AI\">\u003cmeta data-mint-head property=\"og:description\" content=\"Standalone reference integrations that consume the Gumnut Photos API\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Gumnut AI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.gumnut.ai/guides/demos/overview\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://gumnutai.mintlify.app/_mintlify/api/og/v2?division=More\u0026amp;title=Demos\u0026amp;description=Standalone+reference+integrations+that+consume+the+Gumnut+Photos+API\u0026amp;theme=ab5c00f5c5bf5a1e2e63ce76\u0026amp;signature=5c00ac0f99ee041480badbfce57136ea0071e872777ca3119aa51cc83f9b5ed5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Demos - Gumnut AI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Standalone reference integrations that consume the Gumnut Photos API\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://gumnutai.mintlify.app/_mintlify/api/og/v2?division=More\u0026amp;title=Demos\u0026amp;description=Standalone+reference+integrations+that+consume+the+Gumnut+Photos+API\u0026amp;theme=ab5c00f5c5bf5a1e2e63ce76\u0026amp;signature=5c00ac0f99ee041480badbfce57136ea0071e872777ca3119aa51cc83f9b5ed5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/gumnutai/HakcV-TGKbGh8wwG/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Gumnut AI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#5A4CD6\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.gumnut.ai/guides/demos/overview\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/demos/overview.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.gumnut.ai/#organization\",\"name\":\"Gumnut AI\",\"url\":\"https://docs.gumnut.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/gumnutai/g7uvIAJIK6-HCQWp/logo/gumnut-logotype-horizontal-light.svg?fit=max\u0026auto=format\u0026n=g7uvIAJIK6-HCQWp\u0026q=85\u0026s=2a6ec085314f83e9fb98e806c60a6667\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.gumnut.ai#website\",\"name\":\"Gumnut AI\",\"url\":\"https://docs.gumnut.ai\",\"publisher\":{\"@id\":\"https://docs.gumnut.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.gumnut.ai/guides/demos/overview#webpage\",\"url\":\"https://docs.gumnut.ai/guides/demos/overview\",\"name\":\"Demos\",\"description\":\"Standalone reference integrations that consume the Gumnut Photos API\",\"dateModified\":\"2026-10-31T18:53:51.714Z\",\"isPartOf\":{\"@id\":\"https://docs.gumnut.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.gumnut.ai/guides/demos/overview#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.gumnut.ai/guides/demos/overview#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Gumnut AI\",\"item\":\"https://docs.gumnut.ai\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Demos\",\"item\":\"https://docs.gumnut.ai/guides/demos/overview\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.gumnut.ai/guides/demos/overview#article\",\"headline\":\"Demos\",\"name\":\"Demos\",\"description\":\"Standalone reference integrations that consume the Gumnut Photos API\",\"url\":\"https://docs.gumnut.ai/guides/demos/overview\",\"mainEntityOfPage\":{\"@id\":\"https://docs.gumnut.ai/guides/demos/overview#webpage\"},\"dateModified\":\"2026-10-31T18:53:51.714Z\",\"publisher\":{\"@id\":\"https://docs.gumnut.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.gumnut.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Gumnut AI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Gumnut AI","nav":{"global":{"anchors":[{"anchor":"Gumnut Home","icon":"house","href":"https://www.gumnut.ai"}]},"tabs":[{"tab":"Guides","groups":[{"group":"Getting started","pages":[{"title":"Introduction","href":"/guides/getting-started/introduction"},{"title":"Quickstart","href":"/guides/getting-started/quickstart"},{"title":"Import from Google Photos or iCloud","href":"/guides/getting-started/import-from-google-or-apple"}]},{"group":"Product features","pages":[{"title":"Libraries and sharing","href":"/guides/product/libraries"},{"title":"Uploads and processing","href":"/guides/product/uploads"},{"title":"Albums","href":"/guides/product/albums"},{"title":"Searching and filtering","href":"/guides/product/search-and-filtering"},{"title":"Faces and people","href":"/guides/product/people"},{"title":"Map view","href":"/guides/product/map"},{"title":"Stacks and bursts","href":"/guides/product/stacks"},{"title":"Photo editing and versions","href":"/guides/product/editing"},{"title":"AI assistants and integrations","href":"/guides/product/ai-assistants"},{"title":"Duplicate Detection","href":"/guides/product/duplicate-detection"}]},{"group":"Authentication","pages":[{"title":"Authentication","href":"/guides/authentication/overview"},{"title":"API Keys","href":"/guides/authentication/api-keys"},{"title":"OAuth","href":"/guides/authentication/oauth"}]},{"group":"APIs","pages":[{"title":"API Overview","href":"/guides/apis/overview"},{"title":"Versioning and editing assets","href":"/guides/apis/asset-versioning"},{"title":"Named Creates and Retries","href":"/guides/apis/named-creates"},{"title":"Library Sharing","href":"/guides/apis/library-sharing"},{"title":"People and Faces","href":"/guides/apis/faces-and-people"},{"title":"Requests \u0026 Responses","href":"/guides/apis/requests-and-responses"},{"title":"Pagination \u0026 Filtering","href":"/guides/apis/pagination-and-filtering"},{"title":"Syncing with Events","href":"/guides/apis/syncing-with-events"},{"title":"Rate Limiting","href":"/guides/apis/rate-limiting"}]},{"group":"SDKs","pages":[{"title":"SDKs Overview","href":"/guides/sdks/overview"},{"title":"TypeScript SDK","href":"/guides/sdks/typescript"},{"title":"Python SDK","href":"/guides/sdks/python"}]},{"group":"MCP","pages":[{"title":"MCP Overview","href":"/guides/mcp/overview"},{"title":"MCP Setup","href":"/guides/mcp/setup"},{"title":"MCP Troubleshooting","href":"/guides/mcp/troubleshooting"}]},{"group":"Immich","pages":[{"title":"Immich Overview","href":"/guides/immich/overview"},{"title":"Immich Compatibility","href":"/guides/immich/compatibility"},{"title":"Faces and People","href":"/guides/immich/faces-and-people"},{"title":"Immich Troubleshooting","description":"Troubleshooting Gumnut-specific issues when using Immich apps","href":"/guides/immich/troubleshooting"}]},{"group":"More","pages":[{"title":"Demos","href":"/guides/demos/overview"}]}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/overview"}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api-reference/oauth/generate-oauth-authorization-url"}]}]},"basePath":"","title":"Demos - Gumnut AI","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":[],"chunks":[]}