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 only accessible via filter expressions
  • You can use any name: _photos/, _pool/, _shared/

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.