Revela

User Journey

This document describes the complete lifecycle of a Revela project from the perspective of a new user.

Setup: This guide assumes Windows with the Standalone version of Revela (no .NET SDK required). Paths use Windows conventions (D:\Revela\). For other platforms or the .NET Tool version, see Installation.

This guide uses the interactive TUI (double-click revela.exe). All actions can also be performed via CLI commands - see CLI Reference.

Phase 1: First Run (Installing Revela)

  1. User downloads revela-standalone-win-x64.zip from GitHub Releases
  2. User extracts to D:\Revela\
  3. User double-clicks revela.exe

TUI detects fresh installation (no revela.json exists):

   ____                _
  |  _ \ _____   _____| | __ _
  | |_) / _ \ \ / / _ \ |/ _` |
  |  _ <  __/\ V /  __/ | (_| |
  |_| \_\___| \_/ \___|_|\__,_|

╭─ First Run ──────────────────────────────────╮
│                                              │
│  Welcome to Revela!                          │
│                                              │
│  This appears to be your first time running  │
│  Revela. The setup wizard will help you      │
│  install themes and plugins.                 │
│                                              │
╰──────────────────────────────────────────────╯

What would you like to do?
  › Start Setup Wizard
    Skip (use menu instead)
    Exit

User selects "Start Setup Wizard" › Revela Setup starts:

╭─ Setup ──────────────────────────────────────╮
│                                              │
│  Welcome to the Revela Setup Wizard!         │
│                                              │
│  This wizard will help you install themes    │
│  and plugins.                                │
│                                              │
│  You can re-run this wizard later via:       │
│  Addons › wizard                             │
│                                              │
╰──────────────────────────────────────────────╯

How would you like to set up Revela?
  › ⭐ Full Installation (recommended)
       Install all 2 themes and 4 plugins
    🔧 Custom Installation
       Choose which packages to install

User selects "Full Installation" › All themes and plugins are installed.

Result: Revela is now configured with themes and plugins. A revela.json file is created next to revela.exe containing the global configuration. Revela closes automatically after installation.

Phase 2: Creating a Project

User double-clicks revela.exe again. The TUI detects no project in the current directory:

╭─ Create Project ─────────────────────────────╮
│                                              │
│  No Project Found                            │
│                                              │
│  This directory (Revela) doesn't contain   │
│  a Revela project. Would you like to create  │
│  one?                                        │
│                                              │
╰──────────────────────────────────────────────╯

What would you like to do?
  › Create New Project
    Skip (use menu instead)
    Exit

User selects "Create New Project" › Folder name prompt:

Folder name: MyPhotos
✓ Project folder created: MyPhotos

Project Setup Wizard starts:

   ____                _
  |  _ \ _____   _____| | __ _
  | |_) / _ \ \ / / _ \ |/ _` |
  |  _ <  __/\ V /  __/ | (_| |
  |_| \_\___| \_/ \___|_|\__,_|

╭─ New Project ────────────────────────────────╮
│                                              │
│  Create a New Revela Project                 │
│                                              │
│  This wizard will help you set up a new      │
│  photo gallery:                              │
│    1. Project settings (name, URL)           │
│    2. Directory paths                        │
│    3. Select a theme                         │
│    4. Image settings (formats, sizes)        │
│    5. Site metadata (title, author)          │
│                                              │
│  You can change these settings later via:    │
│  revela config                               │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 1/5: Project Settings ━━━
Configure your project name and base URL.

Project name: My Photography Portfolio
Base URL: (empty)
━━━ Step 2/5: Directory Paths ━━━
Configure source and output paths

Current source: source
  → Resolves to: D:\Revela\projects\MyPhotos\source
Current output: output
  → Resolves to: D:\Revela\projects\MyPhotos\output

Source directory: source
Output directory: output

✓ Paths configured

Tip: You can use an external folder like D:\OneDrive\Photos as source - Revela reads directly from there without copying. Change paths anytime via TUI › Config › Paths.

Note: The folder name (MyPhotos) is used for the filesystem. The project name (My Photography Portfolio) is the display name shown in the UI and can contain spaces.

User completes the wizard steps.

╭─ Complete ───────────────────────────────────╮
│                                              │
│  ✓ Project created successfully!             │
│                                              │
│  Next steps:                                 │
│    1. Add images to the source/ folder       │
│    2. Run revela generate all to build       │
│    3. View your site in output/              │
│                                              │
│  Tip: Create subfolders in source/ to        │
│  organize galleries                          │
│                                              │
╰──────────────────────────────────────────────╯

Result:

D:\Revela\
├── packages/             (installed themes & plugins)
├── projects/
│   └── MyPhotos/         (your project folder)
│       ├── output/       (empty, for generated site)
│       ├── source/       (empty, ready for photos)
│       ├── project.json  (project configuration)
│       └── site.json     (site metadata)
├── revela.exe
└── revela.json           (global configuration)

Phase 3: Adding Photos

User copies photos into the project's source\ folder:

D:\Revela\projects\MyPhotos\source\
└── 01 Galleries\
    ├── 2024-Vacation\
    │   ├── beach.jpg
    │   └── sunset.jpg
    └── 2025-Wedding\
        ├── church.jpg
        ├── party.jpg
        └── cake.jpg

Note: If you configured an external source folder (e.g., D:\OneDrive\Photos) in Step 2, your photos are already there - no copying needed.

Folder structure becomes gallery structure on the website. The 01 prefix controls the navigation order.

Categories: Top-level folders like 01 Galleries become navigation categories. Subfolders become galleries within that category.

Phase 4: First Build

User runs: revela.exe (TUI)

TUI displays main menu:

   ____                _
  |  _ \ _____   _____| | __ _
  | |_) / _ \ \ / / _ \ |/ _` |
  |  _ <  __/\ V /  __/ | (_| |
  |_| \_\___| \_/ \___|_|\__,_|

╭─ Welcome ────────────────────────────────────╮
│                                              │
│  Version 1.0.0                               │
│  Modern static site generator for            │
│  photographers                               │
│                                              │
│  Project: My Photography Portfolio           │
│                                              │
│  Navigate with ↑↓, select with Enter         │
│                                              │
╰──────────────────────────────────────────────╯

Generate
  › Generate all
    Scan content
    Generate images
    Generate pages
    Generate statistics
Config
    ...

User selects "Generate all" › Pipeline runs:

Pipeline: scan → statistics → pages → images

━━━ Step 1/4: scan ━━━
Scan content and update manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Content scan complete!                      │
│                                              │
│  Project:    My Photography Portfolio        │
│                                              │
│  Statistics:                                 │
│    Galleries: 2                              │
│    Images:    5                              │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 2/4: statistics ━━━
Generate statistics from manifest

╭─ Success ────────────────────────────────────╮
│  Statistics generated                        │
╰──────────────────────────────────────────────╯

━━━ Step 3/4: pages ━━━
Render HTML pages from manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Page rendering complete!                    │
│                                              │
│  Project:  My Photography Portfolio          │
│                                              │
│  Statistics:                                 │
│    Pages:    4                               │
│    Duration: 0.12s                           │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 4/4: images ━━━
Process images from manifest

  Worker 1 ████████████ 100% beach.jpg (30/30)
  Worker 2 ████████████ 100% sunset.jpg (30/30)
  ...

╭─ Success ────────────────────────────────────╮
│                                              │
│  Image processing complete!                  │
│                                              │
│  Project:   My Photography Portfolio         │
│                                              │
│  Statistics:                                 │
│    Processed: 5 images                       │
│    Files:     150 created                    │
│    Size:      24.5 MB (generated)            │
│    Duration:  32.15s                         │
│                                              │
╰──────────────────────────────────────────────╯

✓ Pipeline completed in 32.50s

Result:

D:\Revela\projects\MyPhotos\
├── .cache\
│   └── manifest.json    (tracks processed state)
├── output\
│   ├── galleries\
│   │   ├── 2024-vacation\
│   │   │   └── index.html
│   │   ├── 2025-wedding\
│   │   │   └── index.html
│   │   └── index.html   (category page)
│   ├── _assets\         (theme CSS, JS, fonts)
│   ├── images\
│   │   └── galleries\
│   │       ├── 2024-vacation\
│   │       │   ├── beach\
│   │       │   │   ├── 320.avif, 320.webp, 320.jpg
│   │       │   │   ├── 640.avif, 640.webp, 640.jpg
│   │       │   │   └── ... (all sizes)
│   │       │   └── sunset\
│   │       │       └── ...
│   │       └── 2025-wedding\
│   │           └── ...
│   └── index.html
└── source\

Phase 5: Preview

User selects "Serve" from TUI:

🌐 Serving D:\Revela\projects\MyPhotos\output at http://localhost:8080
   Press Ctrl+C to stop

User opens http://localhost:8080 in browser and reviews the website.

Phase 6: Edit a Photo

User notices beach.jpg is overexposed.

  1. User opens beach.jpg in Lightroom/Photoshop
  2. User edits and exports back to source/2024-Vacation/beach.jpg
  3. User runs TUI › "Generate all"
Pipeline: scan → statistics → pages → images

━━━ Step 1/4: scan ━━━
Scan content and update manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Content scan complete!                      │
│                                              │
│  Project:    My Photography Portfolio        │
│                                              │
│  Statistics:                                 │
│    Galleries: 2                              │
│    Images:    5                              │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 2/4: statistics ━━━
...

━━━ Step 3/4: pages ━━━
...

━━━ Step 4/4: images ━━━
Process images from manifest

  Worker 1 ████████████ 100% beach.jpg (30/30)

╭─ Success ────────────────────────────────────╮
│                                              │
│  Image processing complete!                  │
│                                              │
│  Project:   My Photography Portfolio         │
│                                              │
│  Statistics:                                 │
│    Processed: 1 images                       │
│    Cached:    4 images                       │
│    Files:     30 created                     │
│    Duration:  2.45s                          │
│                                              │
╰──────────────────────────────────────────────╯

✓ Pipeline completed in 3.12s

Incremental Processing: Only beach.jpg is regenerated (30 variants). The other 4 unchanged images are cached. Revela detects changes via LastModified timestamp and/or FileSize.

Phase 7: Add New Photos

User adds a new gallery with 20 photos:

D:\Revela\projects\MyPhotos\source\
└── 01 Galleries/
    ├── 2024-Vacation/
    ├── 2025-Wedding/
    └── 2025-Birthday/        ← NEW
        ├── guests.jpg
        ├── presents.jpg
        └── ... (20 photos)

User runs TUI › "Generate all":

Pipeline: scan → statistics → pages → images

━━━ Step 1/4: scan ━━━
Scan content and update manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Content scan complete!                      │
│                                              │
│  Project:    My Photography Portfolio        │
│                                              │
│  Statistics:                                 │
│    Galleries: 3                              │
│    Images:    25                             │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 2/4: statistics ━━━
...

━━━ Step 3/4: pages ━━━
...

━━━ Step 4/4: images ━━━
Process images from manifest

  Worker 1 ████████████ 100% guests.jpg (30/30)
  Worker 2 ████████████ 100% presents.jpg (30/30)
  ...

╭─ Success ────────────────────────────────────╮
│                                              │
│  Image processing complete!                  │
│                                              │
│  Project:   My Photography Portfolio         │
│                                              │
│  Statistics:                                 │
│    Processed: 20 images                      │
│    Cached:    5 images                       │
│    Files:     600 created                    │
│    Duration:  2m 15s                         │
│                                              │
╰──────────────────────────────────────────────╯

✓ Pipeline completed in 2m 18s

Incremental Processing: Only the 20 new images are processed. The existing 5 images are cached.

Phase 8: Remove a Photo

User decides party.jpg shouldn't be on the website.

  1. User deletes source/01 Galleries/2025-Wedding/party.jpg
  2. User runs TUI › "Generate all"
Pipeline: scan → statistics → pages → images

━━━ Step 1/4: scan ━━━
Scan content and update manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Content scan complete!                      │
│                                              │
│  Project:    My Photography Portfolio        │
│                                              │
│  Statistics:                                 │
│    Galleries: 3                              │
│    Images:    24                             │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 2/4: statistics ━━━
...

━━━ Step 3/4: pages ━━━
...

━━━ Step 4/4: images ━━━
Process images from manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Image processing complete!                  │
│                                              │
│  Project:   My Photography Portfolio         │
│                                              │
│  Statistics:                                 │
│    Processed: 0 images                       │
│    Cached:    24 images                      │
│    Duration:  0.05s                          │
│                                              │
╰──────────────────────────────────────────────╯

✓ Pipeline completed in 1.20s

Note: The deleted image is removed from the manifest, but the generated output files remain on disk. These are called "orphaned files".

Cleaning up orphaned files:

Important: Always run "Generate › Scan content" before cleaning! The clean command uses the manifest to determine which files are orphaned. If the manifest is outdated, you might accidentally delete valid files.

User selects TUI › Clean › Images:

━━━ clean images ━━━
Clean unused image files (orphaned, wrong sizes/formats)

Orphaned folders (source images deleted):
  • party/ (18 files, 2.4 MB)

Will delete: 18 files (2.4 MB)
╭─ Success ────────────────────────────────────╮
│                                              │
│  Cleanup complete!                           │
│                                              │
│  Deleted:                                    │
│    Files:   18                               │
│    Size:    2.4 MB freed                     │
│                                              │
╰──────────────────────────────────────────────╯

Tip: Use --dry-run to preview what would be deleted without actually removing files.

Phase 9: Change Configuration (Add Image Size)

User wants higher resolution for retina displays.

Note: Image sizes are defined by the theme in Configuration/images.json. To customize sizes, extract the configuration file to your project.

  1. User extracts theme configuration via TUI › Theme › Extract:

    ━━━ theme extract ━━━
    Extract a theme or specific files to themes/ folder
    
    Select a theme to extract:
    › Lumina
    
    What would you like to extract?
      Extract entire theme
    › Select specific files
      Cancel
    
    Select files to extract (Space to toggle, Enter to confirm):
      [ ] Templates
      [ ] Assets
      [x] Configuration
            [x] images.json
      [ ] Other
    
    ✓ Extracted 1 file to themes/Lumina/
    
  2. User edits themes/Lumina/Configuration/images.json:

    {
      "sizes": [320, 640, 960, 1280, 1920, 2560],
      "resizeMode": "longest"
    }
    
  3. User runs TUI › "Generate all"

Pipeline: scan → statistics → pages → images

━━━ Step 1/4: scan ━━━
...

━━━ Step 2/4: statistics ━━━
...

━━━ Step 3/4: pages ━━━
...

━━━ Step 4/4: images ━━━
Process images from manifest

  Worker 1 ████████████ 100% beach.jpg (6/6)
  Worker 2 ████████████ 100% sunset.jpg (6/6)
  ...

╭─ Success ────────────────────────────────────╮
│                                              │
│  Image processing complete!                  │
│                                              │
│  Project:   My Photography Portfolio         │
│                                              │
│  Statistics:                                 │
│    Processed: 24 images                      │
│    Files:     144 created                    │
│    Duration:  1m 30s                         │
│                                              │
╰──────────────────────────────────────────────╯

✓ Pipeline completed in 1m 32s

Key Feature: Only missing sizes (1920, 2560) are generated. Existing variants are preserved.

Phase 10: Change Quality Settings

User wants better AVIF quality.

User runs TUI › Config › Image:

━━━ config image ━━━
Configure image processing settings

Current formats:
  • AVIF: 80 (enabled)
  • WebP: 85 (enabled)
  • JPG:  90 (enabled)

Configure formats interactively? [y/N]: y

AVIF quality (0=disable, 1-100): 90
WebP quality (0=disable, 1-100): 85
JPG quality (0=disable, 1-100): 90

✓ Image settings saved to project.json

Problem: How does Revela know existing AVIF files need regeneration?

Current behavior: Quality changes require explicit force rebuild.

User selects: Generate › Generate images › --force

━━━ images ━━━
Process images from manifest

  Worker 1 ████████████ 100% beach.jpg (18/18)
  Worker 2 ████████████ 100% sunset.jpg (18/18)
  ...

╭─ Success ────────────────────────────────────╮
│                                              │
│  Image processing complete!                  │
│                                              │
│  Project:   My Photography Portfolio         │
│                                              │
│  Statistics:                                 │
│    Processed: 24 images                      │
│    Files:     432 created                    │
│    Duration:  45.00s                         │
│                                              │
╰──────────────────────────────────────────────╯

Note: --force regenerates ALL variants for all images. There's currently no format-specific force option.

Phase 11: Add an About Page

User wants to add an "About Me" page to the website.

Step 1: Create the Page

User selects TUI › Create › Page:

━━━ create page ━━━
Create a new page in your project

What type of page would you like to create?
  Gallery page (with images)
› Text page (no images)
  Statistics page

Path (relative to source/): 02 Pages/about
Title: About Me
Description: Learn more about me and my photography

✓ Created source/02 Pages/about/_index.revela

Step 2: Edit the Content

User opens source/02 Pages/about/_index.revela in a text editor:

+++
title = "About Me"
description = "Learn more about me and my photography"
template = "page"
+++

## Hello!

I'm a passionate photographer based in Berlin, Germany.

I specialize in landscape and travel photography, capturing
the beauty of nature and urban environments.

## My Gear

- Canon EOS R5
- RF 24-70mm f/2.8L
- RF 70-200mm f/2.8L

## Contact

Feel free to reach out at **hello@example.com**

Tip: Use Markdown for formatting. The content appears below the title on the generated page.

Step 3: Generate

User runs TUI › "Generate all":

Pipeline: scan → statistics → pages → images

━━━ Step 1/4: scan ━━━
Scan content and update manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Content scan complete!                      │
│                                              │
│  Project:    My Photography Portfolio        │
│                                              │
│  Statistics:                                 │
│    Galleries: 4                              │
│    Images:    24                             │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 2/4: statistics ━━━
...

━━━ Step 3/4: pages ━━━
Render HTML pages from manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Page rendering complete!                    │
│                                              │
│  Project:  My Photography Portfolio          │
│                                              │
│  Statistics:                                 │
│    Pages:    5                               │
│    Duration: 0.14s                           │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 4/4: images ━━━
...

✓ Pipeline completed in 1.35s

Result:

D:\Revela\projects\MyPhotos\
├── output/
│   ├── galleries/
│   │   ├── 2024-vacation/
│   │   └── 2025-wedding/
│   ├── pages/
│   │   ├── about/
│   │   │   └── index.html    ← NEW: About page
│   │   └── index.html        (category page)
│   └── index.html            ← Navigation with categories
└── source/
    ├── 01 Galleries/
    │   ├── 2024-Vacation/
    │   └── 2025-Wedding/
    └── 02 Pages/
        └── about/
            └── _index.revela ← NEW: About page source

How it works:

  • Numeric prefixes (01, 02) control navigation order and are stripped from URLs
  • 01 Galleries/galleries/, 02 Pages/pages/
  • Text pages use template = "page" (no image gallery)
  • The page appears in the navigation automatically
  • Use hidden = true in frontmatter to exclude from navigation (e.g., for Imprint pages)

Phase 12: Add a Statistics Page

User wants to see analytics about their photo collection (cameras, lenses, focal lengths).

Step 1: Create the Statistics Page

User selects TUI › Create › Page:

━━━ create page ━━━
Create a new page in your project

What type of page would you like to create?
  Gallery page (with images)
  Text page (no images)
› Statistics page

Path (relative to source/): 02 Pages/stats
Title: Photo Statistics
Description: Analysis of my camera and lens usage

✓ Created source/02 Pages/stats/_index.revela

Note: The Statistics plugin must be installed. If not present, install via TUI › Addons › Install › Statistics.

Step 2: Generate

User runs TUI › "Generate all":

Pipeline: scan → statistics → pages → images

━━━ Step 1/4: scan ━━━
Scan content and update manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Content scan complete!                      │
│                                              │
│  Project:    My Photography Portfolio        │
│                                              │
│  Statistics:                                 │
│    Galleries: 4                              │
│    Images:    24                             │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 2/4: statistics ━━━
Generate statistics from EXIF data

╭─ Success ────────────────────────────────────╮
│                                              │
│  Statistics generated!                       │
│                                              │
│  Analyzed: 24 images                         │
│  Cameras:  2 models                          │
│  Lenses:   3 models                          │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 3/4: pages ━━━
Render HTML pages from manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Page rendering complete!                    │
│                                              │
│  Project:  My Photography Portfolio          │
│                                              │
│  Statistics:                                 │
│    Pages:    6                               │
│    Duration: 0.16s                           │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 4/4: images ━━━
...

✓ Pipeline completed in 1.42s

Result:

D:\Revela\projects\MyPhotos\
├── output/
│   ├── galleries/
│   ├── pages/
│   │   ├── about/
│   │   └── stats/
│   │       └── index.html    ← NEW: Statistics page
│   └── index.html
└── source/
    ├── 01 Galleries/
    └── 02 Pages/
        ├── about/
        └── stats/
            └── _index.revela ← NEW: Statistics page

The statistics page displays interactive charts:

  • Camera usage - Which cameras were used most
  • Lens usage - Popular lenses in the collection
  • Focal lengths - Distribution of focal lengths
  • Apertures - Most common f-stops
  • Timeline - Photos over time

How it works:

  • Statistics are extracted from EXIF metadata during the "statistics" pipeline step
  • The page uses template = "statistics" which renders the charts
  • Data updates automatically when new photos are added

Phase 13: Customize Favicon

User wants to add a custom favicon to the website.

Step 1: Generate Favicon Files

User visits realfavicongenerator.net:

  1. Uploads logo/image
  2. Configures platform-specific icons
  3. Downloads the generated package

Step 2: Add Favicon Files to Project

User copies the favicon files to source/_static/favicon/:

D:\Revela\projects\MyPhotos\source\
├── _static/
│   └── favicon/              ← NEW
│       ├── favicon.ico
│       ├── favicon.svg
│       ├── favicon-96x96.png
│       ├── apple-touch-icon.png
│       └── site.webmanifest
├── 01 Galleries/
│   ├── 2024-Vacation/
│   └── 2025-Wedding/
└── 02 Pages/
    └── about/

Convention: Files in _static/ are copied 1:1 to the output root. The _ prefix excludes this folder from gallery scanning.

Step 3: Create Favicon Partial

The Lumina theme has an empty Favicon.revela partial by default. User creates an override:

User selects TUI › Theme › Extract:

━━━ theme extract ━━━
Extract a theme or specific files to themes/ folder

Select a theme to extract:
› Lumina

What would you like to extract?
  Extract entire theme
› Select specific files
  Cancel

Select files to extract (Space to toggle, Enter to confirm):
  [ ] Templates
  [ ] Assets
  [ ] Configuration
  [x] Partials
        [x] Favicon.revela

✓ Extracted 1 file to themes/Lumina/

User edits themes/Lumina/Partials/Favicon.revela:

<link rel="icon" type="image/png" href="/favicon/favicon-96x96.png" sizes="96x96" />
<link rel="icon" type="image/svg+xml" href="/favicon/favicon.svg" />
<link rel="shortcut icon" href="/favicon/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png" />
<meta name="apple-mobile-web-app-title" content="My Photography Portfolio" />
<link rel="manifest" href="/favicon/site.webmanifest" />

Tip: Copy the exact HTML provided by your favicon generator. The paths must match your _static/favicon/ structure.

Step 4: Generate

User runs TUI › "Generate all":

Pipeline: scan → statistics → pages → images

━━━ Step 1/4: scan ━━━
...

━━━ Step 2/4: statistics ━━━
...

━━━ Step 3/4: pages ━━━
Render HTML pages from manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Page rendering complete!                    │
│                                              │
│  Project:  My Photography Portfolio          │
│                                              │
│  Statistics:                                 │
│    Pages:    4                               │
│    Duration: 0.15s                           │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 4/4: images ━━━
...

✓ Pipeline completed in 1.50s

Result:

D:\Revela\projects\MyPhotos\
├── output/
│   ├── favicon/              ← Copied from _static/
│   │   ├── favicon.ico
│   │   ├── favicon.svg
│   │   ├── favicon-96x96.png
│   │   ├── apple-touch-icon.png
│   │   └── site.webmanifest
│   ├── index.html            ← Contains favicon links
│   └── ...
├── source/
│   └── _static/
│       └── favicon/
└── themes/
    └── Lumina/
        └── Partials/
            └── Favicon.revela

How it works:

  1. _static/favicon/* files are copied to output/favicon/
  2. The Favicon.revela partial is included in every page's <head>
  3. Project overrides in themes/ take precedence over installed theme files

Phase 14: Output Accidentally Deleted

User accidentally deletes the output folder (D:\Revela\projects\MyPhotos\output\images\).

User runs TUI › "Generate all":

Pipeline: scan → statistics → pages → images

━━━ Step 1/4: scan ━━━
...

━━━ Step 2/4: statistics ━━━
...

━━━ Step 3/4: pages ━━━
...

━━━ Step 4/4: images ━━━
Process images from manifest

  Worker 1 ████████████ 100% beach.jpg (18/18)
  Worker 2 ████████████ 100% sunset.jpg (18/18)
  ...

╭─ Success ────────────────────────────────────╮
│                                              │
│  Image processing complete!                  │
│                                              │
│  Project:   My Photography Portfolio         │
│                                              │
│  Statistics:                                 │
│    Processed: 24 images                      │
│    Files:     432 created                    │
│    Duration:  5m 00s                         │
│                                              │
╰──────────────────────────────────────────────╯

✓ Pipeline completed in 5m 02s

Key Feature: Revela detects missing output files and regenerates them automatically.

Phase 15: Deployment

User is ready to publish:

  1. User runs TUI › "Generate all" (final build)
  2. User copies output/ folder to web server

Deployment options:

  • FTP upload
  • rsync to Linux server
  • GitHub Pages (copy to repo)
  • Netlify/Vercel drag & drop
  • Any static hosting

Phase 16: Months Later - Return to Project

User returns after 3 months with 50 new photos.

D:\Revela\projects\MyPhotos\source\
├── 01 Galleries/
│   ├── 2024-Vacation/
│   ├── 2025-Wedding/
│   ├── 2025-Birthday/
│   └── 2025-Summer/      ← NEW (50 photos)
└── 02 Pages/
    └── about/

User runs TUI › "Generate all":

Pipeline: scan → statistics → pages → images

━━━ Step 1/4: scan ━━━
Scan content and update manifest

╭─ Success ────────────────────────────────────╮
│                                              │
│  Content scan complete!                      │
│                                              │
│  Project:    My Photography Portfolio        │
│                                              │
│  Statistics:                                 │
│    Galleries: 4                              │
│    Images:    74                             │
│                                              │
╰──────────────────────────────────────────────╯

━━━ Step 2/4: statistics ━━━
...

━━━ Step 3/4: pages ━━━
...

━━━ Step 4/4: images ━━━
Process images from manifest

  Worker 1 ████████████ 100% summer01.jpg (18/18)
  Worker 2 ████████████ 100% summer02.jpg (18/18)
  ...

╭─ Success ────────────────────────────────────╮
│                                              │
│  Image processing complete!                  │
│                                              │
│  Project:   My Photography Portfolio         │
│                                              │
│  Statistics:                                 │
│    Processed: 50 images                      │
│    Cached:    24 images                      │
│    Files:     900 created                    │
│    Duration:  6m 00s                         │
│                                              │
╰──────────────────────────────────────────────╯

✓ Pipeline completed in 6m 05s

Incremental Processing: The manifest remembers what was already processed. Only the 50 new images are generated, the existing 24 are cached.

Phase 17: Complete Rebuild (Edge Case)

User wants a fresh start:

TUI › "Clean › All (cache + output)"

╭─ Clean ──────────────────────────────────────╮
│                                              │
│  ⚠ This will delete:                         │
│    • .cache/manifest.json                    │
│    • output/ (all generated files)           │
│                                              │
│  Are you sure? [y/N]                         │
│                                              │
╰──────────────────────────────────────────────╯

User confirms › Clean slate. Next "Generate all" rebuilds everything.

Summary: Change Detection

Scenario Detection Method Action
New image Not in manifest Generate all variants
Changed image LastModified or FileSize differs Regenerate all variants
Deleted image In manifest but not on disk Remove from manifest
New size in config Output file missing Generate missing size only
New format in config Output file missing Generate missing format only
Quality changed Not detected (file exists) Require explicit --force
Output deleted Output file missing Regenerate affected variants
Force rebuild User flag --force Regenerate everything