Skip to content

Commit b021282

Browse files
committed
Revise slides to match personal voice, add export tooling
- Rewrote slide text to remove marketing language and match natural speaking style (direct opinions with caveats, first person, grounded openers, specific credit to collaborators) - Add voice guide (VOICE_GUIDE.md) and voice research - Add PDF export script (export-slides.mjs) using Playwright - Export PDF at 960x540 viewport with 2x DPR for readable text - Add export and editing instructions to slides_outline.md
1 parent 1306a05 commit b021282

7 files changed

Lines changed: 514 additions & 48 deletions

VOICE_GUIDE.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Stan Lo — Talk Voice Guide
2+
3+
Guidelines for keeping this presentation authentic to Stan's communication style.
4+
Derived from reading 13 blog posts, 6 past conference talks, and podcast appearances.
5+
6+
## Non-Negotiable Rules
7+
8+
1. **Start grounded.** Open with what is, not what could be. No theatrical hooks.
9+
2. **Show the learning arc.** "I didn't know X. I investigated. Here's what I found."
10+
3. **Be direct about opinions, then qualify.** "I think X." Then: "But here's the caveat."
11+
4. **Name people.** Every collaborator by name. Not "the team helped" — say who.
12+
5. **Show real things.** Code, tool output, screenshots. Not abstract slides.
13+
6. **Humor is dry and incidental.** One quiet aside, not a setup-punchline bit.
14+
7. **Do not oversell.** If something is limited, say so. If the future is uncertain, say so.
15+
8. **End practically.** Give the audience something to try, install, or contribute to.
16+
9. **Short sections, move quickly.** Respect the audience's time.
17+
10. **Never perform expertise.** Let the work demonstrate competence.
18+
19+
## Voice Details
20+
21+
- **"I" for opinions, "we" for community.** Precise about this distinction.
22+
- **No exclamation marks** in technical explanations.
23+
- **Contractions used naturally** (isn't, don't, I'd, we'll).
24+
- **Parenthetical asides** are natural and frequent — like spoken clarifications.
25+
- **No marketing language.** No "game-changer," "exciting," "huge," "revolutionary."
26+
- **Controversial takes:** state the opinion, acknowledge the other side honestly, stay practical.
27+
- **Credits others conspicuously.** Names, handles, specific contributions.
28+
29+
## What Stan Does NOT Do
30+
31+
- Dramatic openers or rhetorical questions
32+
- "Imagine you're a..." analogies
33+
- Soundbite quotes ("The best way to X is to Y")
34+
- Self-deprecation as comedy
35+
- Overselling limited features
36+
- Performing humility or confidence
37+
- Culture-war framing on polarizing topics
38+
39+
## Opening Style
40+
41+
Stan opens with context-setting, not hooks:
42+
- "IRB 1.6 has been released and will become Ruby 3.2's built-in IRB version."
43+
- "For a decade, I was a Ruby-only developer."
44+
- "This is a quick & unpolished collection of my Ruby debugging tips."
45+
46+
## Past Talk Patterns
47+
48+
- **Strongest format:** Build-from-scratch, progressive demos
49+
- **Running examples:** One concrete example throughout (e.g., Fibonacci)
50+
- **Titles make clear promises:** "in under 300 lines," "best investment for your productivity"
51+
- **Always pragmatic:** "here's how this helps you" not abstract architecture

export-slides.mjs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { chromium } from 'playwright';
2+
import { PDFDocument } from 'pdf-lib';
3+
import { writeFileSync } from 'fs';
4+
import { resolve } from 'path';
5+
6+
const htmlPath = process.argv[2];
7+
if (!htmlPath) { console.error('Usage: node export-slides.mjs <path-to-html> [output.pdf]'); process.exit(1); }
8+
9+
const outputPath = process.argv[3] || htmlPath.replace(/\.html$/, '.pdf');
10+
const absPath = resolve(htmlPath);
11+
12+
const browser = await chromium.launch();
13+
const context = await browser.newContext({
14+
viewport: { width: 960, height: 540 },
15+
deviceScaleFactor: 2,
16+
});
17+
const page = await context.newPage();
18+
await page.goto('file://' + absPath, { waitUntil: 'networkidle' });
19+
await page.waitForTimeout(2000);
20+
21+
// Hide UI elements
22+
await page.evaluate(() => {
23+
['.nav-dots', '.progress-bar', '.edit-hotzone', '.edit-toggle', '.edit-banner'].forEach(sel => {
24+
const el = document.querySelector(sel);
25+
if (el) el.style.display = 'none';
26+
});
27+
});
28+
29+
const slideCount = await page.evaluate(() => document.querySelectorAll('.slide').length);
30+
console.log(`Found ${slideCount} slides`);
31+
32+
// Screenshot each slide
33+
const screenshots = [];
34+
for (let i = 0; i < slideCount; i++) {
35+
await page.evaluate((idx) => {
36+
const slides = document.querySelectorAll('.slide');
37+
slides[idx].scrollIntoView({ behavior: 'instant' });
38+
slides[idx].classList.add('visible');
39+
}, i);
40+
await page.waitForTimeout(400);
41+
const buf = await page.screenshot({ type: 'png' });
42+
screenshots.push(buf);
43+
console.log(` Captured slide ${i + 1}/${slideCount}`);
44+
}
45+
46+
await browser.close();
47+
48+
// Build PDF from screenshots
49+
const pdfDoc = await PDFDocument.create();
50+
for (const png of screenshots) {
51+
const img = await pdfDoc.embedPng(png);
52+
const pageWidth = 960;
53+
const pageHeight = 540;
54+
const pdfPage = pdfDoc.addPage([pageWidth, pageHeight]);
55+
pdfPage.drawImage(img, { x: 0, y: 0, width: pageWidth, height: pageHeight });
56+
}
57+
58+
const pdfBytes = await pdfDoc.save();
59+
writeFileSync(outputPath, pdfBytes);
60+
console.log(`\nPDF saved to: ${outputPath} (${(pdfBytes.length / 1024 / 1024).toFixed(1)} MB)`);

research/stan_past_talks.md

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# Stan Lo - Conference Talk History & Presentation Style
2+
3+
## Complete Talk List (Chronological)
4+
5+
### 1. RubyKaigi 2017 - "I quit my job to write my own language: Goby"
6+
- **Conference:** RubyKaigi 2017, Hiroshima, Japan (September 18-20, 2017)
7+
- **Bio at the time:** Ruby/Rails developer, cat and boxing lover, junior language designer
8+
- **Topic:** Personal journey of creating the Goby programming language (Ruby-inspired, written in Go). Started by following a book to write the "monkey" language, then gradually expanded -- added a VM and compiler inspired by Ruby 1.9, created file and HTTP libraries, built a web server -- until deciding to quit his job to develop Goby full-time.
9+
- **Key quote:** "That day, for no particular reason, I decided to write my own language."
10+
- **Video:** https://www.youtube.com/watch?v=GRNlTWzoC74
11+
- **Slides:** https://www.slideshare.net/LoStan/goby-and-its-compiler
12+
- **Presentation page:** https://rubykaigi.org/2017/presentations/_st0012.html
13+
14+
### 2. RubyKaigi 2018 - "What would your own version of Ruby look like?"
15+
- **Conference:** RubyKaigi 2018, Sendai, Japan (May 31 - June 2, 2018)
16+
- **Bio at the time:** Ruby/Rails developer at Ticketsolve, Goby language developer
17+
- **Topic:** Explored what developers might change about Ruby if designing their own version. Used the Goby language as a case study to discuss language design choices, philosophy, and trade-offs. Discussed how Goby differs from Ruby through distinct design decisions and unique features.
18+
- **Slides:** Available on SlideShare
19+
- **Video:** Available on RubyKaigi YouTube channel
20+
- **Presentation page:** https://rubykaigi.org/2018/presentations/_st0012.html
21+
22+
### 3. RubyKaigi 2022 - "ruby/debug - The best investment for your productivity"
23+
- **Conference:** RubyKaigi 2022 (September 8, 2022)
24+
- **Duration:** 26 minutes
25+
- **Bio at the time:** Senior developer at Shopify, major contributor to Ruby debugger, Ruby DX Team
26+
- **Topic:** Demonstrated three powerful debugging techniques using ruby/debug: step-debugging, frame navigation, and breakpoint commands. Showed how combining these techniques reduces context switching. Demonstrated scriptable breakpoints to automate debugging workflows.
27+
- **Video:** https://youtu.be/gseo4vdmSjE
28+
- **Slides:** https://st0012.dev/assets/slides/2022-09-08-rubykaigi.pdf (also on GitHub: st0012/slides)
29+
- **Presentation page:** https://rubykaigi.org/2022/presentations/_st0012.html
30+
31+
### 4. LRUG (London Ruby User Group) November 2022 - "ruby/debug - The best investment for your productivity"
32+
- **Conference:** LRUG, November 14, 2022
33+
- **Topic:** Same material as RubyKaigi 2022, adapted for the meetup format. Demonstrated the same 3 debugging techniques (step-debugging, frame navigation, breakpoint commands) and scriptable breakpoints.
34+
- **Video:** MP4 recording available via LRUG
35+
- **Slides:** https://st0012.dev/assets/slides/2022-11-14-lrug.pdf
36+
- **LRUG page:** https://lrug.org/meetings/2022/november/
37+
38+
### 5. RubyKaigi 2023 - "Build a mini Ruby debugger in under 300 lines"
39+
- **Conference:** RubyKaigi 2023, Matsumoto, Japan (May 11, 2023)
40+
- **Duration:** 25 minutes
41+
- **Topic:** Live-coded / walked through building a functional Ruby debugger from scratch in under 300 lines. Covered TracePoint, binding manipulation, and architecture decisions behind ruby/debug. Used a Fibonacci implementation as the running example throughout demos.
42+
- **Key learning outcomes:** Running programs with debugger, setting breakpoints, stepping through code, all in under 300 lines.
43+
- **Video:** https://youtu.be/7uLFVL2KNXo
44+
- **Slides:** https://st0012.dev/assets/slides/2023-05-11-rubykaigi.pdf (also on GitHub: st0012/slides)
45+
- **Presentation page:** https://rubykaigi.org/2023/presentations/_st0012.html
46+
47+
### 6. Ruby World Conference 2025 - RubyPrize 2025 Acceptance Talk
48+
- **Conference:** Ruby World Conference, November 6, 2025
49+
- **Topic:** RubyPrize acceptance speech. Content details not fully public yet.
50+
- **Slides:** https://st0012.dev/assets/slides/2025-11-06-ruby-world-conference.pdf (also on GitHub: st0012/slides)
51+
- **Video:** Not yet published
52+
53+
### 7. RubyKaigi 2026 - "The future of Ruby documentation" (UPCOMING)
54+
- **Conference:** RubyKaigi 2026, Hakodate, Hokkaido (April 22-24, 2026)
55+
- **Scheduled:** Day 2 (April 23), 17:20-17:50, Large Hall
56+
- **Duration:** 30 minutes
57+
- **Language:** English
58+
- **Topic:** Ruby documentation's biggest update in years. Three key initiatives: (1) transitioning from RDoc markup to GitHub Flavored Markdown, (2) embedding RBS type signatures into docs, (3) preparing documentation for AI integration with LLM-compatible formats and agent tooling.
59+
- **Presentation page:** https://rubykaigi.org/2026/presentations/_st0012.html
60+
61+
## Years NOT Speaking at RubyKaigi
62+
63+
- **2019, 2020, 2021** - No RubyKaigi talks (2020/2021 were pandemic years)
64+
- **2024** - Not a speaker at RubyKaigi 2024
65+
- **2025** - Not a speaker at RubyKaigi 2025
66+
67+
## Podcast Appearances
68+
69+
- **Code and the Coding Coders who Code it, Episode 43** - Discussed his journey from Taiwan to London, work on debug gem and IRB, Ruby LSP, Sorbet/Prism integration, and maintaining Ruby documentation. https://podcast.drbragg.dev/episodes/episode-43-stan-lo/
70+
71+
## Slides Repository
72+
73+
All slide decks are hosted on GitHub: https://github.com/st0012/slides
74+
- `2022-09-08-rubykaigi/`
75+
- `2022-11-14-lrug/`
76+
- `2023-05-11-rubykaigi/`
77+
- `2025-11-06-ruby-world-conference/`
78+
79+
(2017 and 2018 slides were on SlideShare, predating the GitHub repository.)
80+
81+
---
82+
83+
## Presentation Style Analysis
84+
85+
### Talk Structure Patterns
86+
87+
1. **"Build-something-from-scratch" format** (2017, 2023): Stan's strongest talks walk the audience through building something step by step. The 2017 Goby talk traced the journey of building an entire language; the 2023 debugger talk built a functional debugger from scratch. This "let's build it together" approach demystifies complex internals.
88+
89+
2. **Practical demo-driven** (2022): The ruby/debug talk was structured around demonstrating 3 specific techniques, then showing how they compose together. Not theoretical -- shows real workflows.
90+
91+
3. **Personal narrative arc** (2017, 2018): Early talks used personal storytelling ("I quit my job...") as the backbone. The journey provides emotional engagement alongside the technical content.
92+
93+
### Distinctive Characteristics
94+
95+
- **Accessibility focus:** Makes complex internals (debugger architecture, language design, documentation systems) approachable. Titles like "in under 300 lines" set a clear, achievable scope.
96+
- **Running examples:** Uses a single concrete example (Fibonacci in the debugger talk) throughout the entire presentation, building features incrementally against the same code.
97+
- **Humor and personality:** The 2017 talk had a Forrest Gump-style recurring line ("That day, for no particular reason..."). Lighthearted tone even on technical topics.
98+
- **Pragmatic framing:** Talks are pitched as "here's how this helps you" rather than "here's how it works." The 2022 title literally says "best investment for your productivity."
99+
- **Compact scope:** Talks typically cover one tool or concept in depth rather than surveying multiple topics. 25-30 minute format.
100+
101+
### Topic Evolution
102+
103+
| Era | Focus | Role |
104+
|-----|-------|------|
105+
| 2017-2018 | Goby language design | Independent developer / Ticketsolve |
106+
| 2022-2023 | ruby/debug debugger | Shopify Ruby DX Team, debugger contributor |
107+
| 2025-2026 | RDoc / Ruby documentation | Shopify Ruby DX Team, RDoc maintainer, Ruby committer |
108+
109+
Each era reflects his current primary open-source focus. The 2026 talk represents a natural evolution as he's now the RDoc maintainer pushing major modernization.
110+
111+
### What Makes His Talks Work
112+
113+
1. **He builds the thing he's talking about** -- whether it's a language, a debugger, or a documentation system. This gives him deep authority and lets him explain "why" not just "what."
114+
2. **Clear promise in the title** -- "in under 300 lines," "the best investment for your productivity," "the future of Ruby documentation." Audience knows exactly what they'll get.
115+
3. **Progressive complexity** -- starts simple, adds features one at a time, ends with a complete working system.
116+
4. **Developer empathy** -- frames everything in terms of developer pain points and workflows, not abstract architecture.
117+
118+
---
119+
120+
## Relevant Blog Posts (st0012.dev)
121+
122+
These posts provide context for his expertise and how he communicates technical ideas in writing:
123+
124+
- **ruby/debug cheatsheet** (Sep 2022) - https://st0012.dev/2022/09/08/ruby-debug-cheatsheet/
125+
- **Setup ruby/debug with VSCode** (Aug 2022) - https://st0012.dev/2022/08/08/setup-ruby-debug-with-vscode/
126+
- **From byebug to ruby/debug** (Aug 2022) - https://st0012.dev/2022/08/08/from-byebug-to-ruby-debug/
127+
- **What's new in Ruby 3.2's IRB?** (Dec 2022) - https://st0012.dev/2022/12/09/whats-new-in-ruby-3-2-irb/
128+
- **A RDoc Maintainer's View on Ruby's Documentation** (Nov 2024) - https://st0012.dev/2024/11/02/a-rdoc-maintainer-s-view-on-ruby-s-documentation/
129+
- **Ruby 3.4 Documentation: A Step Towards Better Ruby Documentation** (Dec 2024) - https://st0012.dev/2024/12/26/ruby-3-4-docs/
130+
- **My RDoc roadmap for 2026** (Jan 2026) - https://st0012.dev/2026/01/12/my-rdoc-roadmap-for-2026/
131+
- **Ruby Skills: Teaching Claude Code About Ruby's Tooling** (Jan 2026) - https://st0012.dev/2026/01/24/ruby-skills-teaching-claude-code-about-ruby-tooling-and-ecosystem/
132+
- **My Ruby Debugging Tips in 2025** (Mar 2025) - https://st0012.dev/2025/03/13/my-ruby-debugging-tips-in-2025/
133+
- **AI and Open Source: A Maintainer's Take** (Dec 2025) - https://st0012.dev/2025/12/30/ai-and-open-source-a-maintainer-s-take-end-of-2025/

0 commit comments

Comments
 (0)