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 (
) - 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.