Slideshow
SkillMediaPresent images in linear narrative form
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Slideshow skill
What this skill tells your AI
The instructions your AI receives, as published by simhacker/moollm in skills/slideshow/SKILL.md and read by ahel’s review.
"The camera is the pickaxe. The slideshow is the museum."
"Every image tells a story. The slideshow tells THE story."
The Slideshow skill presents generated images as linear visual narratives. While the Visualizer creates images, the Slideshow presents them — synthesizing metadata from prompts and mining sidecars into scrollable stories.
Philosophy
Images live in directories. Directories accumulate chaos.
A SLIDESHOW.md transforms that chaos into narrative:
- Time-ordered entries create journeys
- Metadata synthesis extracts meaning
- Death-scrollable layout works everywhere
- Encapsulation keeps related files together
Think of it as the museum for your visual mining operation.
Stereo Slideshows: YML + MD
"The left eye sees truth. The right eye sees story. Together: depth perception."
A stereo slideshow maintains two complementary files:
| File | Role | Purpose |
|---|---|---|
SLIDESHOW.yml | Left Eye | Machine-readable source of truth |
SLIDESHOW.md | Right Eye | Human-readable narrative for GitHub |
Why Two Files?
SLIDESHOW.yml (Source of Truth):
- Structured data the compiler can read
- Photo metadata, locations, room references
- No prose, just semantic facts
- Stable structure for tooling
SLIDESHOW.md (Narrative View):
- Rich markdown for GitHub display
- Images inline, captions, stories
- Death-scrollable presentation
- Generated FROM the YML
The SYNC Protocol
┌─────────────────────────────────────────────────────────────────┐
│ STEREO SLIDESHOW SYNC │
├─────────────────────────────────────────────────────────────────┤
│ │
│ SLIDESHOW.yml (left eye) SLIDESHOW.md (right eye) │
│ ┌─────────────────────┐ ┌─────────────────────────┐ │
│ │ id: slideshow/pub │ │ # 📸 Pub Photo Gallery │ │
│ │ name: Pub Gallery │ ───▶ │ > *"Opening quote..."* │ │
│ │ location: room/pub │ SYNC │ │ │
│ │ contents: │ │ ## Shot 1: The Bar │ │
│ │ - dir: bar-shot │ │  │ │
│ │ subject: ... │ │ **Location:** The Bar │ │
│ └─────────────────────┘ └─────────────────────────┘ │
│ │
│ EDIT the YML → SYNC generates MD │
│ The YML is the single source of truth │
│ │
└─────────────────────────────────────────────────────────────────┘
SLIDESHOW.yml Format
# SLIDESHOW.yml — Machine-readable slideshow definition
id: slideshow/pub/photos
name: "Pub Photo Gallery"
type: slideshow
location: room/pub # Links to compiled room
tagline: "Memories from the Gezelligheid Grotto"
# Photo metadata
contents:
- dir: bar-shot-2026-01-19
subject: "Marieke at the bar"
mood: warm
role: ESTABLISHING
image: bar-marieke.png
- dir: palm-cats-2026-01-19
subject: "Palm with the cats"
mood: cozy
role: DETAIL
image: palm-cats.png
# Optional: narrative hints for MD generation
narrative:
opening_quote: "The best nights are the ones you almost remember..."
style_notes: "First-person phone camera, golden hour lighting"
# Compiler uses this to link slideshow to room
compiled:
room_ref: room/pub
photo_count: 2
Photo Directory Structure (Stereo)
Each photo can also be stereo:
photo-directory/
PHOTO.yml # Left eye: metadata, generation settings
PHOTO.md # Right eye: narrative description
main-image.png # The actual image
MINING-*.yml # Mining layer files
PHOTO.yml (metadata):
subject:
primary: "Marieke serving drinks"
secondary: ["Palm", "cats"]
mood: warm
camera:
type: "iPhone 15 Pro"
settings: { aperture: 1.8, iso: 800 }
generation:
provider: dalle3
prompt: "..."
PHOTO.md (narrative):
# Marieke at the Bar
The warm glow of Edison bulbs catches the brass
fixtures as Marieke pours a perfect pint...
Commands
SYNC SLIDESHOW [directory]
Regenerates SLIDESHOW.md from SLIDESHOW.yml.
CREATE STEREO SLIDESHOW FOR [directory]
Creates both YML (from scanning directory) and MD (from YML).
UPDATE SLIDESHOW YML [directory]
Scans for new photos and updates the YML source of truth.
The CREATE Method
Generate a SLIDESHOW.md for a directory of images:
CREATE SLIDESHOW for pub/dons-photos-2026-01-19/
What happens:
- Discover images in directory (
.png,.jpg,.webp) - Find sidecars for each image (
.ymlprompt,-mined.ymlresources) - Order by timestamp in filename or file creation time
- Synthesize narrative descriptions from metadata
- Write SLIDESHOW.md with gallery structure
The LANDING Method
Create a README.md landing page for GitHub display:
LANDING for pub/dons-pub-photos-2026-01-19/
Why README.md?
GitHub renders README.md automatically when you browse a directory, but not SLIDESHOW.md. The landing page is the front door — motivating visitors to read the story.
┌─────────────────────────────────────────────────────────────────┐
│ README.md (Landing Page) SLIDESHOW.md (Story) │
├─────────────────────────────────────────────────────────────────┤
│ ✓ Shown on GitHub automatically ✗ Must click to view │
│ ✓ Metadata table Pure narrative flow │
│ ✓ Character links No links — just story │
│ ✓ Location links No context jumps │
│ ✓ Story summary (fresh!) Full detailed story │
│ → "View the slideshow" The actual experience │
└─────────────────────────────────────────────────────────────────┘
What goes in README.md:
| Section | Content |
|---|---|
| Title + Tagline | Hook the reader |
| Gallery Info | Slide count, date, style, location |
| Featuring | Characters with links to their directories |
| Locations | Rooms with links to their directories |
| Story Summary | Fresh synthesis — "why should I look at these?" |
| Preview | Optional image grid |
| Technical | Mining layers, generator |
Key insight: The story summary is freshly synthesized, not copy-pasted from SLIDESHOW.md. It answers: "What will I experience if I click through?"
Workflow:
1. CREATE SLIDESHOW # Generate the story
2. ORGANIZE INTO dirname # Encapsulate files
3. LANDING # Create GitHub front door
The ORGANIZE Method
Encapsulate a SLIDESHOW.md and its images into a named subdirectory:
ORGANIZE pub/SLIDESHOW.md INTO dons-pub-photos-2026-01-19
Before:
pub/
SLIDESHOW.md
dons-photos-2026-01-19-16-30-00-bar-marieke-palm-cats.png
dons-photos-2026-01-19-16-30-00-bar-marieke-palm-cats.yml
dons-photos-2026-01-19-16-30-00-bar-marieke-palm-cats-mined.yml
...20 more files...
After:
pub/
dons-pub-photos-2026-01-19/
SLIDESHOW.md # Inherits from slideshow skill
bar-marieke-palm-cats.png
bar-marieke-palm-cats.yml
bar-marieke-palm-cats-mined.yml
...all files moved and renamed...
Naming convention: lowercase-dashes, descriptive, date-suffixed if temporal.
SLIDESHOW.md Format
Every SLIDESHOW.md should declare inheritance:
---
inherits: slideshow
title: "Don's Pub Photos — January 19, 2026"
created: 2026-01-19
images: 8
style: first-person-phone-camera
---
Structure
# 📸 Title
> *"Opening quote capturing the vibe"*
Brief description of what this gallery contains.
---
## 📍 Shot 1: Location (Time)
### *"Caption quote"*

**Location:** Where this was taken
**Who's Here:**
- 👩🌷 Character 1 doing something
- 🐒🌴 Character 2 doing something else
📎 **Files:** [Prompt](image-file.yml) | [Resources](image-file-mined.yml)
---
## 📍 Shot 2: Next Location (Time)
...
---
## 📊 Stats Table
| Time | Location | Highlights |
|------|----------|------------|
| 4:30 PM | Bar | Marieke, Palm, cats |
| ... | ... | ... |
---
## 🎨 Style Notes
Notes on artistic direction, visual consistency, mood.
---
*"Closing quote"*
Metadata Synthesis
The SUMMARIZE method transforms raw sidecar data into narrative:
From prompt.yml:
- Scene description → Location
- Characters present → Who's Here
- Time of day → Shot timing
- Artistic style → Style notes
From prompt-mined.yml:
- Dominant colors → Visual palette
- Mood/atmosphere → Emotional tone
- Implied sounds/smells → Sensory details
- Symbolism → Deeper meaning
Output: Human-readable narrative that tells the story.
Integration with Visualizer
The Visualizer creates. The Slideshow presents.
┌─────────────────────────────────────────────────────────────────┐
│ VISUAL PIPELINE │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Context YAML → Visualizer → Image + Sidecars │
│ (rooms, chars) (generate) (.png, .yml) │
│ │
│ Image + Sidecars → Image Miner → Resources │
│ (extract) (-mined.yml) │
│ │
│ All Files → Slideshow → SLIDESHOW.md │
│ (present) (narrative) │
│ │
└─────────────────────────────────────────────────────────────────┘
Visualizer advertises to Slideshow:
# In visualizer/CARD.yml
advertisements:
SLIDESHOW:
delegates_to: slideshow
score: 85
condition: "After generating images, create/update gallery"
Gallery Discovery
Slideshows can be discovered and linked:
# Find all slideshows in adventure-4
find examples/adventure-4 -name "SLIDESHOW.md"
Cross-slideshow navigation:
**Related Galleries:**
- [Palm's Study](../stage/palm-nook/study/palm-study-images/SLIDESHOW.md)
- [Attic Adventures](../attic/dusty-attic-images/SLIDESHOW.md)
Why Encapsulate?
Without encapsulation:
pub/
ROOM.yml
SLIDESHOW.md
guestbook.yml
fireplace.yml
20 image files...
20 prompt files...
20 mining files...
# Chaos. What belongs together?
With encapsulation:
pub/
ROOM.yml
guestbook.yml
fireplace.yml
dons-pub-photos-2026-01-19/
SLIDESHOW.md
all-related-files...
rooftop-telescope-images/
SLIDESHOW.md
all-related-files...
Benefits:
- Files that belong together STAY together
- Directory name is descriptive
- Easy to move, share, archive
- No pollution of parent directory
- SLIDESHOW.md becomes the index
Example Workflow
# 1. Generate images with visualizer
visualize.py character.yml room.yml -p openai
# 2. Mine resources from images
mine.py *.png --depth full
# 3. Create slideshow gallery
CREATE SLIDESHOW for current directory
# 4. Organize into encapsulated directory
ORGANIZE SLIDESHOW.md INTO palm-portrait-session-2026-01-19
# 5. Result: clean, self-contained gallery
Death-Scrollable Design
SLIDESHOW.md targets GitHub rendering:
- Mobile-first: Images scale, text wraps
- Death-scrollable: Just keep scrolling
- Inline images: No external links needed
- Collapsible sections: For detailed metadata
- Emoji headers: Visual navigation
- Tables: Stats and comparisons
James Burke Connections
Every good slideshow tells a story through connections:
How do these images connect?
- Shot 1 introduces the setting
- Shot 3 shows the characters in that setting
- Shot 5 captures the climax
- Shot 8 is the aftermath, full circle
The metadata enables this synthesis — prompts describe intent, mining reveals what emerged.
Commands Reference
| Method | Purpose |
|---|---|
| CREATE | Generate SLIDESHOW.md for directory |
| UPDATE | Add new images to existing gallery |
| SUMMARIZE | Synthesize metadata into narrative |
| ORGANIZE | Encapsulate into subdirectory |
| COMPARE | Cross-image comparison section |
🔧 UPGRADE: Legacy Slideshow Migration
Future feature — not yet implemented
UPGRADE is super flexible. Start with ANYTHING:
- Single file with list of prompts (YML or MD)
- Dir full of loose images (reverse-engineer prompts via mining)
- Just prompts (generate images later!)
- Mixed chaos
- Even empty dirs with just ideas
Input option A — Single prompt list file:
my-ideas.yml (or my-ideas.md)
→ Breaks into individual prompts, removes original, creates full structure
Input option B — Dir of images:
messy-folder/
├── 2026-01-19-dusk-scene-v3.png
├── morning-light-final.png
└── random-sketch.jpg
→ Mines images for prompts (mine prompt mode), structures everything
Input option C — Mixed chaos (images + prompts + whatever):
messy-folder/
├── 2026-01-19-dusk-scene-v3.png # Image → mine for prompt
├── morning-light-final.png # Image → mine for prompt
├── cool-idea.txt # Prompt → generate image later
├── more-prompts.yml # Prompt list → break apart
├── frame-03-arrival.png # Image
├── random-sketch.jpg # Image
└── notes.md # Prompts inline → extract
→ UPGRADE figures it out: images get mined, prompts get structured, everything organized
Output (full structure from any input):
slideshow/
├── README.md # Front cover / title page
├── SLIDESHOW.yml # Machine-readable skeleton
├── SLIDESHOW.md # Formatted narrative view
├── 001-dusk-scene/
│ ├── PHOTO.yml
│ ├── PHOTO.md
│ ├── image.png # Main — NO timestamp, NO index
│ ├── original.png # Secondary (preserved original name)
│ └── PROMPT.yml # Generation prompt (or mined from image)
├── 002-morning-light/
│ ├── image.png # Main
│ ├── PROMPT.yml # Mined via image mining if no prompt existed
│ └── ...
├── 003-future-idea/
│ ├── PHOTO.yml # Metadata ready
│ ├── PROMPT.yml # Prompt waiting
│ └── (no image.png yet) # Generate later!
Naming rules:
- Main image:
image.png— clean, no timestamp, no index prefix - Secondary images: anything NOT matching
image.pngpattern- Brought along, not shown by default
- Original filenames preserved as secondary
- All paths: repo-root relative in compiled output
What UPGRADE does:
Handles any mix — figures out what each file is:
.png/.jpg→ image → mine for prompt.txt/.mdwith prose → prompt → generate image later.ymlwith list → prompt list → break apart- Unknown → bring along as secondary
Then structures everything:
- Cluster related files by name similarity
- Create
001-descriptive-name/directories - Images →
image.png(main), originals as secondary - Mine images for prompts OR use existing prompts
- Generate
PHOTO.yml,PHOTO.mdskeletons - Remove consumed prompt list files
- Generate
README.md,SLIDESHOW.yml,SLIDESHOW.md
Invoke: UPGRADE path/to/anything (when implemented)
Dovetails With
- Visualizer — Creates the images
- Image Mining — Extracts resources
- Storytelling Tools — Narrative structure
- YAML Jazz — Metadata as fuel
- Room — Spatial context
- Character — Who appears
See CARD.yml for full specification.
Signals
- GitHub stars
- 52
- Forks
- 5
- Last commit
- Sep 2026
- Hacker News mentions
- 7
Advanced
- Catalog kind
- skill
- Gateway key
slideshow-simhacker- Source
- github.com/simhacker/moollm