Revela

Source Structure

Revela supports two approaches for organizing your photos, and you can combine them in the same project:

📁 Traditional Galleries

Photos belong to one gallery. Images stored directly in the gallery folder.

🔍 Filter Galleries

Photos appear in multiple galleries. All images in a shared _images/ folder.

🔀 Hybrid Approach

Mix both approaches. Some galleries with local images, others with filters.

Traditional Galleries

Each gallery contains its own images directly in the folder.

source/
├── _index.revela          # Homepage
├── events/
│   ├── _index.revela      # Gallery page
│   ├── event-001.jpg
│   └── event-002.jpg
├── portraits/
│   ├── _index.revela
│   └── portrait-001.jpg
└── landscapes/
    ├── _index.revela
    └── mountain.jpg

Characteristics

  • ✅ Simple and intuitive
  • ✅ Each photo belongs to exactly one gallery
  • ✅ Easy to manage manually
  • ❌ Photos cannot appear in multiple galleries

Filter Galleries

All images are stored in a shared _images/ folder. Galleries use filter expressions to select which images to display.

source/
├── _index.revela          # Homepage
├── _images/               # Shared image pool
│   ├── canon-event-001.jpg
│   ├── sony-landscape-002.jpg
│   └── sony-portrait-003.jpg
├── canon/
│   └── _index.revela      # filter = "exif.make == 'Canon'"
├── sony/
│   └── _index.revela      # filter = "exif.make == 'Sony'"
└── portraits/
    └── _index.revela      # filter = "contains(filename, 'portrait')"

The _images/ Folder

The underscore prefix is significant:

  • _images/ is not rendered as a gallery itself
  • Images are accessible via filter expressions and content images (![](path))
  • Subdirectories are supported: _images/screenshots/, _images/portfolio/

Example Front Matter

+++
title = "Canon Photos"
description = "All photos taken with Canon cameras"
filter = "exif.make == 'Canon'"
+++

Hybrid Approach

Combine both approaches in the same project:

source/
├── _images/                   # Shared pool for filter galleries
│   ├── 2024-trip-001.jpg
│   └── 2025-event-001.jpg
│
├── by-year/                   # Filter galleries
│   ├── 2024/
│   │   └── _index.revela      # filter = "year(dateTaken) == 2024"
│   └── 2025/
│       └── _index.revela      # filter = "year(dateTaken) == 2025"
│
└── clients/                   # Traditional galleries (exclusive)
    └── wedding-smith/
        ├── _index.revela
        └── ceremony-001.jpg   # Only in this gallery

Choosing the Right Approach

📷 Simple Portfolio

Use Traditional - each photo belongs to one gallery.

🏷️ Multiple Categories

Use Filter - photos can appear in many galleries based on metadata.

🔒 Client Work

Use Traditional - exclusive galleries for private content.

📅 By Camera / By Year

Use Filter - dynamic views based on EXIF data.

🔀 Mixed Content

Use Hybrid - combine both approaches as needed.

Common Patterns

Homepage with Recent Photos

+++
title = "Welcome"
filter = "all | sort dateTaken desc | limit 6"
+++

Category Landing Page (No Images)

+++
title = "Browse by Camera"
template = "page"
+++

Select a camera brand below.