or scroll
Clem's Log · 00000009 UTC00:00:00.000
Episode 09 / Tutorial

How I make
these slides.

Just HTML. An agent. A few rules.
REC01 / 18
02 / The problemConference envy
Where this started

I wanted the
conference look.

Those beautiful keynote decks you see on stage. Then I open Google Slides and get the same tired text box every time.

Google Slides
  • Title text box
  • Bullet, bullet, bullet
  • One stock template
  • No motion, no life
  • Looks like everyone else
HTML slides
  • Real type and layout
  • Color, motion, depth
  • Your own system
  • Live, interactive content
  • Looks made, not picked
RECUTC0000-00-00 00:00:00.00002 / 18
03 / The planWhat this video covers
Structure of the video

Here's the route.

Setup first, then the build, then the fun stuff at the end.

01Pros and conswhy / why not
02Requirementswhat you need
03Installing the skillfrontend-slides
04Getting a DESIGN.mdgetdesign
05Custom instructionsteach the agent
06Results reviewclaude / codex / composer
07A reference slidelock the look
08Advanced tricksapi / charts / maps
RECUTC0000-00-00 00:00:00.00003 / 18
04 / Pros and consThe honest trade
Pros and cons

Worth it? Mostly.

The web buys you a lot. It also asks for something back.

Pros
  • Real interactivity. APIs, live scoreboards, anything the web can do.
  • Your message lands harder when people can touch it.
  • Less boring. Viewers click instead of zoning out.
  • One file, opens on almost any computer.
  • No PowerPoint or Google Slides licence needed.
Cons
  • You need an LLM with a real coding plan, not just chat.
  • Less universal than a PDF. Old browsers may struggle.
  • Stakeholders may demand PowerPoint or Google Slides.
  • Converting back can break APIs, sockets, and interactivity.
  • Hard to edit without knowing HTML, CSS, and JS.
  • No native editing or collaboration tools yet.
± Mixed
Mobile responsive The agent writes fluid CSS by default, so slides reflow nicely on phones. But interactive widgets like charts and API demos can break at small sizes.
Shareability A single HTML file is trivially easy to email, host, or drop in a repo. But recipients need a browser that supports the features you used, and some corporate firewalls block local file scripts.
RECUTC0000-00-00 00:00:00.00004 / 18
05 / RequirementsBefore you start
What you need

The short
checklist.

Nothing exotic. If you can run a coding agent, you are most of the way there.

  • A coding agent Claude Code · Codex · Cursor
  • A plan with real coding allowance Not chat-only
  • A modern browser to present in Chrome · Firefox · Safari · Edge
  • The frontend-slides skill installed npx skills add
  • A DESIGN.md to anchor the visual system npx getdesign@latest add airbnb
RECUTC0000-00-00 00:00:00.00005 / 18
06 / InstallTwo skills, two lines
Installing the skill

Add it
once.

Two skills do the work. One builds decks, one makes them editable later.

frontend-slides
frontend-slides-editable
terminal
# build decks from scratch
$ npx skills add https://github.com/zarazhangrui/frontend-slides --skill frontend-slides
# make them editable later
$ npx skills add https://github.com/archlizheng/frontend-slides-editable --skill frontend-slides-editable
RECUTC0000-00-00 00:00:00.00006 / 18
07 / DESIGN.mdYour visual system
Getting a DESIGN.md

One file of
taste.

DESIGN.md holds the colors, type, and spacing. Maybe your company already has one. If not, pull a starter from a brand you like.

colors
type
spacing
terminal
# pull a starter design system
$ npx getdesign@latest add airbnb
# or use your own company's DESIGN.md
$ npx getdesign@latest add clickhouse
# outputs
DESIGN.md created
RECUTC0000-00-00 00:00:00.00007 / 18
08 / Custom instructionsTeach the agent
Custom instructions

Tell it how
you work.

Drop a CLAUDE.md in the project. The agent reads it before every prompt.

Never
em-dashes emoji walls of text
CLAUDE.md
# slide instructions
- Read DESIGN.md before every prompt
- Copy the reference deck, don't rebuild blank
- Every slide is exactly 100vh, no internal scroll
- Keyboard nav: ↑ ↓ arrow keys between slides
- Also bind j k, Space, PageUp/Down, Home/End
- Use scroll-snap-type: y mandatory on html
- Hide the scrollbar on all browsers
- Never use scrollIntoView inside snap containers
- No em-dashes, no emoji, no walls of text
- Validate at 1920×1080, 1280×720, 768×1024
RECUTC0000-00-00 00:00:00.00008 / 18
09 / ResultsSame prompt, three agents
Results review

Who builds it best?

Same skill, same DESIGN.md, three different agents. They are not the same.

01 / Claude

Best taste

Strongest at design sense and holding the whole system together across a deck.

02 / Codex

Most literal

Precise and structured. Follows instructions tightly, lighter on its own flair.

03 / Composer 2.5

Fast and cheap

Surprisingly capable for the price. Great for fast drafts and quick iterations.

RECUTC0000-00-00 00:00:00.00009 / 18
10 / Reference slideBuild one you love
The reference slide

Nail one,
copy forever.

The single highest-leverage move. Build one slide you genuinely love, then point the agent at it every time.

  • Get the chrome, nav, and tokens exactly right.
  • Lock it as the canonical example.
  • Tell the agent to copy it, not rebuild blank.
  • Swap only the content inside each slide.
RECUTC0000-00-00 00:00:00.00010 / 18
11 / PromptLock in your design system
The prompt · copy and paste

Save it as your
reference.

I have just finished a slide deck and want to lock it in
as my permanent design system reference for all future decks.

Step 1 · Save the reference file
Copy the current presentation HTML verbatim to REFERENCE.html
in the project root. Do not modify it. Read-only from now on.

Step 2 · Document the design system
Create DESIGN.md covering:
- Color tokens: all CSS variables (--block-lime, --block-lilac,
  --block-cream, --block-mint, --block-pink, --block-coral,
  --block-navy, --accent-magenta, --rec-red, --ink, --canvas)
- Typography: Inter (weights 320-540), JetBrains Mono (400/500),
  display sizes via clamp(), weight carries hierarchy
- Layout: 100vh slides, scroll-snap-type y mandatory,
  overflow hidden, scrollbar hidden, clamp() spacing
- Chrome bars: exact HTML for chrome-top and chrome-bot
- Right-rail navigator: fixed pill, dot per slide, hover labels
- Color block slides: block-wrap > block > topic-layout pattern
- Reveal system: .reveal + .reveal-1 to .reveal-6, IntersectionObserver

Step 3 · Update CLAUDE.md
Add or replace ## Slide decks:
  Before any new deck: read REFERENCE.html + DESIGN.md.
  Copy structure, never rebuild. Keep chrome, nav, tokens,
  scroll-snap, reveal system, and navigator identical.
  Only change slide content, count, and color block choices.
  No em-dashes. No emoji. No unreadable type sizes.

Step 4 · Update AGENTS.md
Add or replace ## Slide decks:
  Canonical reference: REFERENCE.html
  Design system: DESIGN.md
  Always read both before starting. Copy, do not rebuild.
  Validate at 1920x1080, 1280x720, 768x1024.
  Confirm zero em-dashes: grep -n "—" presentation.html

Confirm all four files and show me their paths.
RECUTC0000-00-00 00:00:00.00011 / 18
12 / AdvancedLive API data
Advanced / one of three

Slides that
fetch.

A slide is a web page. It can call an API and show live data while you present.

  • Live scores, prices, weather, status.
  • One fetch call, no backend needed.
  • The number is current, not a screenshot.
pokeapi.co/api/v2/pokemon/ditto Ready.
?
Ditto
Fetch to load Pokémon data.
ID--
Type--
XP--
{
  "status": "empty",
  "hint": "Click Fetch above."
}
RECUTC0000-00-00 00:00:00.00012 / 18
13 / PromptAdd this to your slide
The prompt · copy and paste

Reproduce this
in your deck.

Add a live Pokémon API demo to this slide.

Fetch: https://pokeapi.co/api/v2/pokemon/ditto

Show in the right-side visual column:
- Pokémon sprite (official artwork from sprites.other.official-artwork,
  fallback to front_default)
- Stat grid: ID, type, base XP, height, weight, ability count
- Scrollable list of ability buttons — clicking each fetches its linked URL
  and shows the English short_effect in the JSON console
- Dark scrollable JSON console showing the raw API response

Cache the root response in localStorage so it survives slide navigation.
Block wheel and touchmove events on all scrollable areas so scroll-snap
navigation is not triggered while the user scrolls inside the widget.
RECUTC0000-00-00 00:00:00.00013 / 18
14 / AdvancedCandlestick charts
Advanced / two of three

Real charts,
inline.

Financial-grade visuals drawn right on the slide. No image export, no chart library.

  • Candlesticks in plain SVG or canvas.
  • Real OHLC data, animated in.
  • Crisp at any resolution you present at.
Bars: -- Close: --
RECUTC0000-00-00 00:00:00.00014 / 18
15 / PromptAdd this to your slide
The prompt · copy and paste

Reproduce this
in your deck.

Add an interactive candlestick chart to this slide.

Generate 140 days of deterministic OHLC data using a seeded LCG RNG
(seed=7, starting close=$142, start date 2026-01-05).

Draw on a dark SVG panel (background #111, viewBox 0 0 1180 720):
- Green candles (#32d583) for up days, red (#ff385c) for down
- Wick as a line, body as a rounded rect (min height 3px)
- Y-axis price labels on the right, date labels bottom-left/right
- Dashed crosshair on hover with a white dot at the close price

Interactions:
- Wheel zooms in/out anchored at pointer position (clamp 18–140 bars)
- Pointer drag pans left/right with captured pointer events
- Zoom In / Zoom Out / Reset buttons in a toolbar row above the chart
- Hover tooltip shows date, open, high, low, close as $X.XX
- Stat labels: visible bar count + hovered close price

Block wheel events on the panel (passive: false + preventDefault)
so scroll-snap navigation is not triggered while zooming.
RECUTC0000-00-00 00:00:00.00015 / 18
16 / AdvancedInteractive maps
Advanced / three of three

Maps you
can touch.

Geography that responds. Pan, zoom, and highlight regions live in front of the room.

  • Interactive geographic maps in a slide.
  • Highlight coverage, rollout, or reach.
  • Far more convincing than a flat screenshot.
2024 Presidential Results
Trump 312 Harris 226
US
United States
Hover a state · 538 electoral votes
RECUTC0000-00-00 00:00:00.00016 / 18
17 / PromptAdd this to your slide
The prompt · copy and paste

Reproduce this
in your deck.

Add an interactive US election map to this slide using real
state SVG paths from @svg-maps/usa on jsDelivr CDN.

Fetch the JSON at runtime. Parse locations array — each entry
has name, id (2-letter lowercase), and path (SVG d attr).
Build a <svg viewBox="192 9 1028 746"> with all 51 paths.

Color by 2024 presidential result:
- Trump (R) states: fill #d24b46
- Harris (D) states: fill #3a74c4
- Stroke: slide background color, stroke-width 1.1

R: AL AK AZ AR FL GA ID IN IA KS KY LA MI MS MO MT NE NV
   NC ND OH OK PA SC SD TN TX UT WI WV WY
D: CA CO CT DC DE HI IL ME MD MA MN NH NJ NM NY OR RI VA VT WA

Interactions:
- Hover: dim others to 0.4 opacity, highlight active state
- Mouse leave: reset all states
- Widen map column to ~63% of slide width

Below the map, large typographic readout:
- 56px colored badge with state abbreviation
- State name in ~38px bold Inter
- Mono line: "N electoral votes · Winner +margin"
- Default: "United States · Hover a state · 538 electoral votes"
RECUTC0000-00-00 00:00:00.00017 / 18
16 / End of episode 09 Over to you
Outro

Real tool,
or just a
gimmick?

That is the honest question. Are you excited about what HTML slides let you do, or does it feel like a party trick? Tell me below.

Subscribe and Like the episode below
Subscribe
Bell for new videos

Drop a comment below to say hi, share your thoughts on the topic, suggest corrections, or tell me what to cover next.

Clem's Log · 009 · Fin · html slides · frontend-slides · getdesign · DESIGN.md · custom instructions · claude · codex · composer 2.5 · reference slide · live api · candlesticks · maps · zero deps · IYKYK · Clem's Log · 009 · Fin · html slides · frontend-slides · getdesign · DESIGN.md · custom instructions · claude · codex · composer 2.5 · reference slide · live api · candlesticks · maps · zero deps · IYKYK ·
RECUTC0000-00-00 00:00:00.00017 / 18