# ── Global Site Settings ────────────────────────────────────────── # This file controls the visual identity, global behavior, and legal info. # Structure is separated from gallery.yaml (album IDs) for clarity. # Public site title and subtitle (overrides .env if set) title: "My Portfolio" subtitle: "A visual journal" # Interface language of the visitor-facing site: "en", "de", "fr", "es", "it" or "nl". # Any other value still sets and date formatting, but the # interface stays English. The admin panel is always English. lang: "en" # ── SEO & Metadata ─────────────────────────────────────────────── # Optional: Overrides global title/subtitle for search engines and social cards # seo: # title: "My Portfolio | Photography" # description: "A curated selection of my best photography work." # titleTemplate: "%s | My Portfolio" # Template for subpages (%s is replaced with subpage/album title) # noIndex: false # Set to true to hide from search engines # noFollow: false # Set to true to prevent search engines from following links # # Licence your photographs are published under, emitted as structured # # data on album pages. A URL or a short identifier. # license: "https://creativecommons.org/licenses/by-nc-nd/4.0/" # ── Site password (optional) ───────────────────────────────────── # Puts the WHOLE public site behind one password — useful while a portfolio # is still being built, or for a folio only ever shown to clients. # Log in once and the server log prints a scrypt: hash to paste back here. # The SITE_PASSWORD environment variable overrides this value. # /admin keeps its own password and is never behind this gate. The legal # notice and the privacy page stay reachable too; the password page links them. # So does the contact form, which the legal notice links as a contact channel. # sitePassword: "scrypt:..." # What a first-time visitor sees: dark (default), light, or auto to follow # their operating system. Their own choice from the header toggle overrides it. mode: dark # Show the EXIF summary overlay on photo grid hover exifOnHover: true # Which EXIF groups the site may publish at all — the grid overlay, the # lightbox info panel and the album header all follow this. # caption is the description written in Immich; turn it off if you use that # field for private notes. # exif: # camera: true # body, lens, focal length # settings: true # aperture, shutter speed, ISO # location: true # city and country # caption: true # the Immich description # Enable the interactive world map view (/map) map: true # Enable smooth page transitions between routes transitions: true # Show the floating back-to-top arrow on long pages scrollToTop: true # Client proofing & favorite photo selections # proofing: # enabled: true # allowMailto: true # Lightbox zoom to full resolution (1:1), for checking sharpness. Off unless # set: it serves the full-resolution file (location removed). gallery.yaml can # switch it per subpage and per album, either way. # zoom: true # Watermark overlay on the lightbox. opacity is a fraction: 0.5 = 50%. # watermark: # enabled: true # text: "© Your Name" # opacity: 0.5 # position: "bottom-right" # bottom-right | bottom-left | center # ── Theme configuration ────────────────────────────────────────── # Presets: studio-modern (default), studio, minimal, editorial, classic, # noir, monograph, kunsthalle, ma, cyanotype, salon, birch theme: preset: "studio-modern" # accent: "#e60012" # photoFrame: "passepartout" # none, passepartout, shadow # grain: true # heroStyle: "split" # split, fullbleed, minimal, stacked, typographic, mosaic, cover (EXPERIMENTAL) # Note: "mosaic" needs at least 3 hero images in gallery.yaml (optimal: 6) # ── Site URL ───────────────────────────────────────────────────── # The address this portfolio is reachable at, e.g. https://folio.example # Needed for sitemap.xml, the feed and structured data: those are built # without a request, so the host cannot be derived from one. Left empty, # the sitemap stays empty rather than guessing a wrong address. # The SITE_URL environment variable is used when this is not set. # url: "https://folio.example" # ── Grid configuration ─────────────────────────────────────────── grid: columns: 3 gap: 12 aspectRatio: "1" # "1" (square), "3/2", "2/3", "16/9", "auto" layout: "masonry" # masonry, uniform, showcase, filmstrip, editorial-flow, justified (EXPERIMENTAL) # ── Navigation ──────────────────────────────────────────────────── # EXPERIMENTAL: external links appended to the header navigation. # Only http(s) URLs are allowed; they open in a new tab. # navLinks: # - label: "Shop" # url: "https://shop.example.com" # - label: "Instagram" # url: "https://instagram.com/your-handle" # ── Footer & Social ────────────────────────────────────────────── footer: name: "My Photography" instagram: "https://instagram.com/your-handle" email: "hello@example.com" website: "https://example.com" # ── Client proofing ────────────────────────────────────────────── # Hearts on every photo, a selection bar and an export dialog. A subpage's own # `proofing:` in gallery.yaml overrides `enabled` in either direction. # "Send by email" addresses `email`, else footer.email, and is hidden when # neither is set. # proofing: # enabled: true # allowMailto: true # email: "proofs@example.com" # ── Privacy policy ─────────────────────────────────────────────── # The text lives in content/privacy.md, written in the admin panel under # Settings → Legal. /privacy is shown, and linked in the footer, while this is # on (the default) and the file has text. # privacy: # enabled: false # ── Contact form ───────────────────────────────────────────────── # A form at /contact. Messages are stored in content/messages/ and read in # the admin panel under Messages; no mail is sent. With the Impressum on and # no legal.contactUrl, the Impressum links this form as its second channel. contact: enabled: false # A fixed "new message" push, with nothing about the sender. # Pick a topic nobody can guess. CONTACT_NOTIFY_URL overrides this. # notifyUrl: "https://ntfy.sh/your-secret-topic" retentionDays: 90 # messages are deleted after this many days # ── Legal / Impressum (German Law compliance) ──────────────────── # If enabled: true, a link to /impressum will appear in the footer. legal: enabled: false # heading: "Angaben gemäß § 5 ECG" # replaces the default "§ 5 DDG" line name: "Your Full Name" address: "Street and House Number" zipCity: "ZIP Code and City" country: "Germany" email: "legal@example.com" phone: "+49 123 456789" # A contact form counts as the second contact channel next to email, so # phone can be left out. Only http(s) URLs are accepted. # contactUrl: "https://example.com/contact" # contactLabel: "Contact form" # vatId: "DE123456789" # taxId: "12/345/67890" extraInfo: "Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV: Max Mustermann"