@dzhechkov/keysarium 1.4.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +52 -5
  2. package/README.ru.md +541 -0
  3. package/bin/cli.js +0 -0
  4. package/package.json +11 -9
  5. package/templates/.claude/commands/analyst-manual.md +38 -0
  6. package/templates/.claude/commands/casarium.md +55 -4
  7. package/templates/.claude/commands/feature-adr.md +8 -0
  8. package/templates/.claude/rules/trust-tiers.md +5 -0
  9. package/templates/.claude/shards/feature-adr.shard.md +64 -10
  10. package/templates/.claude/shards/phase-ai-factory.shard.md +109 -0
  11. package/templates/.claude/skills/ai-factory-mapper/README.md +90 -0
  12. package/templates/.claude/skills/ai-factory-mapper/SKILL.md +309 -0
  13. package/templates/.claude/skills/ai-factory-mapper/assets/report-template.md +123 -0
  14. package/templates/.claude/skills/ai-factory-mapper/references/catalog.md +230 -0
  15. package/templates/.claude/skills/ai-factory-mapper/references/coverage-formula.md +219 -0
  16. package/templates/.claude/skills/ai-factory-mapper/references/decomposition-checklist.md +183 -0
  17. package/templates/.claude/skills/ai-factory-mapper/references/pattern-library.md +312 -0
  18. package/templates/.claude/skills/ai-factory-mapper/scripts/build_docx_report.js +423 -0
  19. package/templates/.claude/skills/analyst-manual-full/SKILL.md +286 -0
  20. package/templates/.claude/skills/edu-site-generator/SKILL.md +254 -0
  21. package/templates/.claude/skills/edu-site-generator/examples/sample-course-structure.md +116 -0
  22. package/templates/.claude/skills/edu-site-generator/modules/00-content-analysis.md +84 -0
  23. package/templates/.claude/skills/edu-site-generator/modules/01-course-structure.md +75 -0
  24. package/templates/.claude/skills/edu-site-generator/modules/02-data-generation.md +186 -0
  25. package/templates/.claude/skills/edu-site-generator/modules/03-scaffold.md +249 -0
  26. package/templates/.claude/skills/edu-site-generator/modules/04-components.md +130 -0
  27. package/templates/.claude/skills/edu-site-generator/modules/05-gamification.md +163 -0
  28. package/templates/.claude/skills/edu-site-generator/modules/06-deploy.md +88 -0
  29. package/templates/.claude/skills/edu-site-generator/modules/07-verification.md +97 -0
  30. package/templates/.claude/skills/edu-site-generator/references/component-templates.md +436 -0
  31. package/templates/.claude/skills/edu-site-generator/references/data-schemas.md +164 -0
  32. package/templates/.claude/skills/edu-site-generator/references/exercise-catalog.md +110 -0
  33. package/templates/.claude/skills/edu-site-generator/references/tech-stack.md +69 -0
  34. package/templates/.claude/skills/feature-adr/SKILL.md +245 -59
  35. package/templates/.claude/skills/feature-adr/modules/03-adr.md +43 -0
  36. package/templates/.claude/skills/feature-adr/modules/03.5-ideation-swarm.md +180 -0
  37. package/templates/.claude/skills/feature-adr/modules/06-implementation-plan.md +56 -7
  38. package/templates/.claude/skills/feature-adr/modules/08-qe.md +87 -23
  39. package/templates/.claude/skills/feature-adr/modules/09-fleet-qe.md +305 -0
  40. package/templates/.claude/skills/feature-adr/references/agentic-qe/README.md +143 -0
  41. package/templates/.claude/skills/feature-adr/references/agentic-qe/brutal-honesty-review.md +240 -0
  42. package/templates/.claude/skills/feature-adr/references/agentic-qe/chaos-engineering-resilience.md +163 -0
  43. package/templates/.claude/skills/feature-adr/references/agentic-qe/code-goal-planner.md +446 -0
  44. package/templates/.claude/skills/feature-adr/references/agentic-qe/enterprise-integration-testing.md +111 -0
  45. package/templates/.claude/skills/feature-adr/references/agentic-qe/mutation-testing.md +236 -0
  46. package/templates/.claude/skills/feature-adr/references/agentic-qe/performance-testing.md +315 -0
  47. package/templates/.claude/skills/feature-adr/references/agentic-qe/qcsd-ideation-swarm.md +126 -0
  48. package/templates/.claude/skills/feature-adr/references/agentic-qe/qcsd-production-swarm.md +108 -0
  49. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-coverage-analysis.md +193 -0
  50. package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-requirements-validation.md +254 -0
  51. package/templates/.claude/skills/feature-adr/references/agentic-qe/regression-testing.md +233 -0
  52. package/templates/.claude/skills/feature-adr/references/agentic-qe/risk-based-testing.md +212 -0
  53. package/templates/.claude/skills/feature-adr/references/agentic-qe/security-testing.md +311 -0
  54. package/templates/.claude/skills/feature-adr/references/agentic-qe/shift-left-testing.md +231 -0
  55. package/templates/.claude/skills/feature-adr/references/agentic-qe/tdd-london-chicago.md +249 -0
  56. package/templates/.claude/skills/transcript-site-generator/SKILL.md +287 -0
  57. package/templates/.claude/skills/transcript-site-generator/examples/sample-text-only-site.md +123 -0
  58. package/templates/.claude/skills/transcript-site-generator/examples/sample-transcript-site.md +134 -0
  59. package/templates/.claude/skills/transcript-site-generator/modules/00-input-analysis.md +132 -0
  60. package/templates/.claude/skills/transcript-site-generator/modules/01-content-parsing.md +117 -0
  61. package/templates/.claude/skills/transcript-site-generator/modules/02-site-generation.md +293 -0
  62. package/templates/.claude/skills/transcript-site-generator/modules/03-interactivity.md +406 -0
  63. package/templates/.claude/skills/transcript-site-generator/modules/04-deploy.md +130 -0
  64. package/templates/.claude/skills/transcript-site-generator/modules/05-verification.md +155 -0
  65. package/templates/.claude/skills/transcript-site-generator/references/component-catalog.md +86 -0
  66. package/templates/.claude/skills/transcript-site-generator/references/data-schemas.md +123 -0
  67. package/templates/.claude/skills/transcript-site-generator/references/tech-stack.md +132 -0
  68. package/templates/CLAUDE.md +9 -2
  69. package/templates/docs/edu-site-generator/01-deployment-guide.md +911 -0
  70. package/templates/docs/edu-site-generator/02-admin-guide.md +901 -0
  71. package/templates/docs/edu-site-generator/03-user-guide.md +1008 -0
  72. package/templates/docs/edu-site-generator/04-infrastructure-requirements.md +489 -0
  73. package/templates/docs/edu-site-generator/05-architecture.md +902 -0
  74. package/templates/docs/edu-site-generator/06-user-flows.md +759 -0
  75. package/templates/docs/transcript-site-generator/01-deployment-guide.md +1042 -0
  76. package/templates/docs/transcript-site-generator/02-admin-guide.md +918 -0
  77. package/templates/docs/transcript-site-generator/03-user-guide.md +925 -0
  78. package/templates/docs/transcript-site-generator/04-infrastructure-requirements.md +482 -0
  79. package/templates/docs/transcript-site-generator/05-architecture.md +1068 -0
  80. package/templates/docs/transcript-site-generator/06-user-flows.md +855 -0
@@ -0,0 +1,925 @@
1
+ # User Guide -- @dzhechkov/skills-transcript-site
2
+
3
+ This guide covers everything you need to use the Transcript Site Generator skill pack for Claude Code. It is intended for anyone who wants to create interactive, searchable transcript websites from text, YouTube videos, or both -- with zero build steps, zero frameworks, and zero infrastructure costs.
4
+
5
+ ---
6
+
7
+ ## Contents
8
+
9
+ 1. [Quick Start (5 minutes)](#1-quick-start-5-minutes)
10
+ 2. [Input Types](#2-input-types)
11
+ 3. [The 6-Step Pipeline](#3-the-6-step-pipeline)
12
+ 4. [Customization Options](#4-customization-options)
13
+ 5. [YouTube Features](#5-youtube-features)
14
+ 6. [Search Functionality](#6-search-functionality)
15
+ 7. [Dark Mode and Visual Features](#7-dark-mode-and-visual-features)
16
+ 8. [Large Transcript Strategy](#8-large-transcript-strategy)
17
+ 9. [Common Scenarios](#9-common-scenarios)
18
+ 10. [Tips and Best Practices](#10-tips-and-best-practices)
19
+ 11. [FAQ](#11-faq)
20
+
21
+ ---
22
+
23
+ ## 1. Quick Start (5 minutes)
24
+
25
+ Transcript Site Generator gives you three commands. Each can be used independently or as part of the full pipeline.
26
+
27
+ ```
28
+ /transcript-site [source] -- Full 6-step pipeline: analyze, parse, generate, add interactivity, deploy, verify
29
+ /transcript-site-generate [source] -- Generate HTML only (steps 1-4)
30
+ /transcript-site-deploy [path] -- Deploy configuration only (steps 5-6)
31
+ ```
32
+
33
+ ### Your first transcript site
34
+
35
+ The fastest way to see the generator in action is to provide a YouTube URL:
36
+
37
+ ```
38
+ /transcript-site https://www.youtube.com/watch?v=YOUR_VIDEO_ID
39
+ ```
40
+
41
+ Within 2-5 minutes you will have a complete interactive website in `docs/index.html` with:
42
+
43
+ - Full transcript text organized into sections
44
+ - YouTube video embed with timestamp synchronization
45
+ - Search functionality (Ctrl+K)
46
+ - Dark mode toggle
47
+ - Table of contents with scroll-spy
48
+ - Copy-quote buttons
49
+ - Reading statistics
50
+ - SEO metadata (Open Graph, Twitter Cards, JSON-LD)
51
+ - Ready for GitHub Pages deployment
52
+
53
+ To preview the result:
54
+
55
+ ```bash
56
+ open docs/index.html
57
+ # or
58
+ xdg-open docs/index.html # Linux
59
+ ```
60
+
61
+ ### Trigger phrases
62
+
63
+ You can invoke the pipeline with natural language too. These phrases all trigger the same pipeline:
64
+
65
+ ```
66
+ /transcript-site https://youtube.com/watch?v=...
67
+ /transcript-site Create a transcript site from this YouTube video: https://...
68
+ /transcript-site Generate an interactive transcript page for my podcast episode
69
+ /transcript-site Turn this text into a searchable transcript website
70
+ ```
71
+
72
+ ---
73
+
74
+ ## 2. Input Types
75
+
76
+ The generator accepts four types of input. It auto-detects the type from the argument.
77
+
78
+ ### 2.1. YouTube URL
79
+
80
+ ```
81
+ /transcript-site https://www.youtube.com/watch?v=dQw4w9WgXcQ
82
+ /transcript-site https://youtu.be/dQw4w9WgXcQ
83
+ ```
84
+
85
+ Requires `yt-dlp` installed. The generator extracts:
86
+ - Video title, channel, upload date, duration
87
+ - Auto-generated or manual subtitles
88
+ - Thumbnail URL (for OG image)
89
+ - Video ID (for embed)
90
+
91
+ If subtitles are not available, the generator will ask you to paste the transcript manually.
92
+
93
+ ### 2.2. Pasted text
94
+
95
+ ```
96
+ /transcript-site
97
+
98
+ [Then paste your transcript text directly in the chat]
99
+ ```
100
+
101
+ Or provide the text inline:
102
+
103
+ ```
104
+ /transcript-site <<EOF
105
+ [00:00] Host: Welcome to the show.
106
+ [00:15] Guest: Thanks for having me.
107
+ ...
108
+ EOF
109
+ ```
110
+
111
+ The generator accepts plain text, timestamped text, and speaker-labeled text. It will detect the format automatically.
112
+
113
+ ### 2.3. File path
114
+
115
+ ```
116
+ /transcript-site /path/to/transcript.txt
117
+ /transcript-site ./transcripts/episode-42.md
118
+ /transcript-site researches/my-case/06_speaker_script.md
119
+ ```
120
+
121
+ Any text file or markdown file works. The generator reads the file and proceeds to content parsing.
122
+
123
+ ### 2.4. Both (YouTube URL + corrected text)
124
+
125
+ ```
126
+ /transcript-site https://youtube.com/watch?v=... --text /path/to/corrected-transcript.txt
127
+ ```
128
+
129
+ This uses the YouTube URL for metadata and embed, but the provided text file for the actual transcript content. Useful when auto-generated subtitles are inaccurate and you have a manually corrected version.
130
+
131
+ ### Input format detection
132
+
133
+ The generator recognizes several common transcript formats:
134
+
135
+ | Format | Example | Detection |
136
+ |--------|---------|-----------|
137
+ | Plain text | `This is the transcript...` | No timestamps, no speakers |
138
+ | Timestamped | `[00:15] This is the text...` | Square-bracket timestamps |
139
+ | SRT-style | `1\n00:00:15,000 --> 00:00:18,000\nText` | SRT numbering + arrows |
140
+ | VTT-style | `WEBVTT\n\n00:15.000 --> 00:18.000\nText` | WEBVTT header |
141
+ | Speaker-labeled | `Host: Welcome...\nGuest: Thank you...` | Colon-separated speaker labels |
142
+ | Combined | `[00:15] Host: Welcome...` | Timestamps + speaker labels |
143
+
144
+ All formats are normalized internally before site generation.
145
+
146
+ ---
147
+
148
+ ## 3. The 6-Step Pipeline
149
+
150
+ Each step produces visible output and ends with a checkpoint where you can provide feedback or proceed.
151
+
152
+ ### Step 1: Input Analysis
153
+
154
+ **What happens:** The generator determines the source type (YouTube, text, file), extracts metadata, detects language, and prepares the raw transcript for parsing.
155
+
156
+ **For YouTube URLs:**
157
+ - Runs `yt-dlp` to extract metadata and subtitles
158
+ - Detects video language from subtitle metadata
159
+ - Downloads thumbnail URL for SEO
160
+
161
+ **For text/files:**
162
+ - Reads the content
163
+ - Detects language using character frequency analysis
164
+ - Estimates section count from content structure
165
+
166
+ **Expected output:**
167
+
168
+ ```
169
+ Step 1/6: INPUT ANALYSIS
170
+ Source type: YouTube URL
171
+ Video ID: abc123
172
+ Title: "My Conference Talk"
173
+ Duration: 45:22
174
+ Language: en
175
+ Words: 6,842
176
+ Estimated sections: 12
177
+
178
+ Checkpoint 1/6: Input Analysis Complete
179
+ ```
180
+
181
+ **What you can do at this checkpoint:**
182
+ - `ok` -- proceed to Step 2
183
+ - `change language to ru` -- override detected language
184
+ - `use this text instead: [paste]` -- replace extracted transcript
185
+
186
+ ### Step 2: Content Parsing
187
+
188
+ **What happens:** The raw transcript is parsed into structured sections with speakers, timestamps, and key quotes.
189
+
190
+ **Section splitting logic:**
191
+ 1. If timestamps exist: split at natural topic boundaries (long pauses, topic shifts)
192
+ 2. If no timestamps: split at paragraph boundaries or every 500-800 words
193
+ 3. Speaker changes always create section boundaries (configurable)
194
+
195
+ **Speaker detection:**
196
+ - Named speakers: `Host:`, `Guest:`, `Dr. Smith:` -- detected from labels
197
+ - Unnamed speakers: `Speaker A`, `Speaker B` -- detected from voice change patterns (YouTube) or paragraph alternation (text)
198
+
199
+ **Expected output:**
200
+
201
+ ```
202
+ Step 2/6: CONTENT PARSING
203
+ Sections: 12
204
+ Speakers: 3 (Host, Dr. Smith, Audience Q&A)
205
+ Timestamps: 67 anchor points
206
+ Key quotes: 5
207
+
208
+ Section preview:
209
+ 1. Introduction (0:00-2:15) -- 342 words
210
+ 2. Background Context (2:15-8:30) -- 1,204 words
211
+ 3. Main Findings (8:30-18:45) -- 2,567 words
212
+ ...
213
+
214
+ Checkpoint 2/6: Content Parsing Complete
215
+ ```
216
+
217
+ **What you can do:**
218
+ - `ok` -- proceed
219
+ - `split section 3` -- split a large section into two
220
+ - `merge sections 4 and 5` -- combine small sections
221
+ - `rename speaker "Speaker A" to "Dr. Chen"` -- fix speaker names
222
+
223
+ ### Step 3: Site Generation
224
+
225
+ **What happens:** The parsed content is transformed into a complete HTML page with Tailwind CSS styling, SEO meta tags, and structural markup.
226
+
227
+ **Generated structure:**
228
+ - `<head>`: SEO meta tags (OG, Twitter Card, JSON-LD), Tailwind CDN, viewport
229
+ - `<nav>`: Site header with title, dark mode toggle, search button
230
+ - `<aside>`: Table of contents (sidebar on desktop, hamburger on mobile)
231
+ - `<main>`: Transcript content organized by sections
232
+ - `<footer>`: Statistics, credits, print button
233
+
234
+ **Expected output:**
235
+
236
+ ```
237
+ Step 3/6: SITE GENERATION
238
+ Template: YouTube transcript (with embed)
239
+ Theme: indigo
240
+ Language: en
241
+
242
+ Generated:
243
+ - HTML5 semantic structure
244
+ - Tailwind CSS CDN loaded
245
+ - YouTube iframe embed (enablejsapi=1)
246
+ - 12-section table of contents
247
+ - 67 timestamp links
248
+ - Speaker color coding (3 speakers)
249
+ - SEO: OG tags + Twitter Card + JSON-LD VideoObject
250
+
251
+ Checkpoint 3/6: Site Generation Complete
252
+ File: docs/index.html (52 KB)
253
+ ```
254
+
255
+ **What you can do:**
256
+ - `ok` -- proceed
257
+ - `change theme to emerald` -- change color scheme
258
+ - `remove youtube embed` -- generate text-only version
259
+ - `add custom header "My Podcast"` -- customize the header
260
+
261
+ ### Step 4: Interactivity
262
+
263
+ **What happens:** Vanilla JavaScript is added to the HTML for all interactive features. No build step, no dependencies, no bundler.
264
+
265
+ **Features added:**
266
+
267
+ | Feature | Trigger | Implementation |
268
+ |---------|---------|---------------|
269
+ | Search | Ctrl+K or click search icon | Debounced input, regex-based matching, highlighted results |
270
+ | Dark mode | Toggle button in header | CSS class on `<html>`, localStorage persistence |
271
+ | Table of Contents | Always visible (desktop) or hamburger (mobile) | IntersectionObserver scroll-spy |
272
+ | Back-to-top | Appears on scroll > 300px | Smooth scroll to top |
273
+ | Copy quote | Click copy button next to quotes | Clipboard API with visual feedback |
274
+ | YouTube sync | Click timestamp link | iframe postMessage seekTo() |
275
+ | Progress bar | Top of page | Scroll position indicator |
276
+ | Reading stats | Below header | Word count, reading time, section count |
277
+ | Print | Print button in footer | Print-optimized stylesheet |
278
+
279
+ **Expected output:**
280
+
281
+ ```
282
+ Step 4/6: INTERACTIVITY
283
+ Features added: 9
284
+ + Search (Ctrl+K)
285
+ + Dark mode (localStorage)
286
+ + TOC scroll-spy (IntersectionObserver)
287
+ + Back-to-top
288
+ + Copy quote (Clipboard API)
289
+ + YouTube sync (seekTo)
290
+ + Progress bar
291
+ + Reading stats
292
+ + Print stylesheet
293
+
294
+ Checkpoint 4/6: Interactivity Complete
295
+ File: docs/index.html (updated, 68 KB)
296
+ ```
297
+
298
+ **What you can do:**
299
+ - `ok` -- proceed
300
+ - `remove search` -- disable search functionality
301
+ - `remove youtube sync` -- disable timestamp click-to-seek
302
+ - `add keyboard navigation` -- add arrow key navigation between sections
303
+
304
+ ### Step 5: Deploy
305
+
306
+ **What happens:** Deployment configuration files are generated. By default, the target is GitHub Pages via the `docs/` folder.
307
+
308
+ **Generated files:**
309
+ - `docs/robots.txt` -- Search engine directives
310
+ - `docs/sitemap.xml` -- Sitemap for SEO
311
+ - GitHub Pages instructions (printed to console, not a file)
312
+
313
+ **Expected output:**
314
+
315
+ ```
316
+ Step 5/6: DEPLOY CONFIGURATION
317
+ Target: GitHub Pages (docs/ folder)
318
+
319
+ Files generated:
320
+ docs/robots.txt
321
+ docs/sitemap.xml
322
+
323
+ To deploy:
324
+ 1. git add docs/
325
+ 2. git commit -m "add transcript site"
326
+ 3. git push
327
+ 4. Settings > Pages > Source: main, /docs
328
+
329
+ Checkpoint 5/6: Deploy Complete
330
+ ```
331
+
332
+ **What you can do:**
333
+ - `ok` -- proceed to verification
334
+ - `custom domain example.com` -- add CNAME file
335
+ - `skip deploy` -- skip this step
336
+
337
+ ### Step 6: Verification
338
+
339
+ **What happens:** The generated site is validated across five categories: HTML structure, JavaScript correctness, CSS validity, SEO completeness, and accessibility compliance.
340
+
341
+ **Checks performed:**
342
+
343
+ | Category | Checks | Examples |
344
+ |----------|--------|---------|
345
+ | HTML | 8 | Valid structure, tags closed, no deprecated attrs |
346
+ | JavaScript | 6 | No syntax errors, event delegation, escape functions |
347
+ | CSS | 4 | Tailwind loaded, dark mode classes, print styles |
348
+ | SEO | 5 | OG tags, Twitter Card, JSON-LD, canonical, sitemap |
349
+ | Accessibility | 5 | Skip-nav, ARIA roles, keyboard nav, alt text |
350
+ | Security | 4 | No inline handlers, escapeHtml, SRI, CSP |
351
+ | Performance | 3 | HTML size, DOM nodes, no render-blocking |
352
+
353
+ **Expected output:**
354
+
355
+ ```
356
+ Step 6/6: VERIFICATION
357
+ HTML: 8/8 passed
358
+ JavaScript: 6/6 passed
359
+ CSS: 4/4 passed
360
+ SEO: 5/5 passed
361
+ Accessibility: 5/5 passed
362
+ Security: 4/4 passed
363
+ Performance: 3/3 passed
364
+
365
+ All 35 checks passed!
366
+
367
+ PIPELINE COMPLETE
368
+ Output: docs/index.html (68 KB)
369
+ ```
370
+
371
+ ---
372
+
373
+ ## 4. Customization Options
374
+
375
+ ### Theme color
376
+
377
+ The default color scheme is indigo. Change it with:
378
+
379
+ ```
380
+ /transcript-site [source] --theme emerald
381
+ /transcript-site [source] --theme rose
382
+ /transcript-site [source] --theme amber
383
+ ```
384
+
385
+ Available themes correspond to Tailwind color palettes: `slate`, `gray`, `zinc`, `neutral`, `stone`, `red`, `orange`, `amber`, `yellow`, `lime`, `green`, `emerald`, `teal`, `cyan`, `sky`, `blue`, `indigo`, `violet`, `purple`, `fuchsia`, `pink`, `rose`.
386
+
387
+ ### Language
388
+
389
+ Override auto-detected language:
390
+
391
+ ```
392
+ /transcript-site [source] --lang ru
393
+ ```
394
+
395
+ This affects:
396
+ - HTML `lang` attribute
397
+ - UI string translations (search placeholder, button labels, etc.)
398
+ - OG locale tag
399
+ - JSON-LD language field
400
+
401
+ ### Timestamps
402
+
403
+ Control timestamp display:
404
+
405
+ ```
406
+ /transcript-site [source] --timestamps visible # Show timestamps (default for YouTube)
407
+ /transcript-site [source] --timestamps hidden # Hide timestamps
408
+ /transcript-site [source] --timestamps hover # Show on hover only
409
+ ```
410
+
411
+ ### Statistics display
412
+
413
+ ```
414
+ /transcript-site [source] --stats # Show stats (default)
415
+ /transcript-site [source] --no-stats # Hide stats
416
+ ```
417
+
418
+ ### Copy buttons
419
+
420
+ ```
421
+ /transcript-site [source] --copy-buttons # Show copy buttons (default)
422
+ /transcript-site [source] --no-copy-buttons # Hide copy buttons
423
+ ```
424
+
425
+ ### Output directory
426
+
427
+ ```
428
+ /transcript-site [source] --output docs/ # Default
429
+ /transcript-site [source] --output public/
430
+ /transcript-site [source] --output build/transcript/
431
+ ```
432
+
433
+ ### All options combined
434
+
435
+ ```
436
+ /transcript-site https://youtube.com/watch?v=abc123 \
437
+ --lang en \
438
+ --theme emerald \
439
+ --timestamps visible \
440
+ --stats \
441
+ --copy-buttons \
442
+ --output docs/my-transcript/ \
443
+ --title "My Conference Talk Transcript"
444
+ ```
445
+
446
+ ---
447
+
448
+ ## 5. YouTube Features
449
+
450
+ ### 5.1. Timestamp links
451
+
452
+ Every timestamp in the transcript becomes a clickable link. Clicking a timestamp:
453
+ 1. Scrolls the YouTube embed into view (if off-screen)
454
+ 2. Calls `player.seekTo(seconds)` to jump to that point in the video
455
+ 3. Highlights the current section in the table of contents
456
+
457
+ The timestamp links use `data-seek` attributes for event delegation:
458
+
459
+ ```html
460
+ <a href="#" data-seek="125" class="timestamp-link">[2:05]</a>
461
+ ```
462
+
463
+ ### 5.2. YouTube embed
464
+
465
+ The YouTube player is embedded at the top of the page with `enablejsapi=1` for JavaScript control:
466
+
467
+ ```html
468
+ <iframe id="yt-player"
469
+ src="https://www.youtube.com/embed/VIDEO_ID?enablejsapi=1&origin=..."
470
+ class="w-full aspect-video rounded-lg shadow-lg"
471
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
472
+ allowfullscreen>
473
+ </iframe>
474
+ ```
475
+
476
+ The embed is responsive (100% width, 16:9 aspect ratio) and works on all screen sizes.
477
+
478
+ ### 5.3. Sticky player (optional)
479
+
480
+ For long transcripts, you can enable a sticky player that stays visible while scrolling:
481
+
482
+ ```
483
+ /transcript-site [URL] --sticky-player
484
+ ```
485
+
486
+ The player shrinks to a small floating window in the bottom-right corner when scrolled past.
487
+
488
+ ### 5.4. Disabling YouTube features
489
+
490
+ ```
491
+ /transcript-site [URL] --no-embed # No YouTube iframe, timestamps as text
492
+ /transcript-site [URL] --no-sync # YouTube iframe present but no seekTo()
493
+ ```
494
+
495
+ ---
496
+
497
+ ## 6. Search Functionality
498
+
499
+ ### 6.1. Keyboard shortcut
500
+
501
+ Press `Ctrl+K` (or `Cmd+K` on macOS) to open the search dialog. Press `Escape` to close it.
502
+
503
+ ### 6.2. How search works
504
+
505
+ 1. User types in the search input
506
+ 2. After 300ms of inactivity (debounce), the search executes
507
+ 3. Search uses regex matching with `escapeRegex()` for safety
508
+ 4. All matching text segments are highlighted with `<mark>` tags
509
+ 5. A result count is displayed
510
+ 6. The first result is scrolled into view
511
+
512
+ ### 6.3. Highlighted results
513
+
514
+ Matching text is wrapped in:
515
+
516
+ ```html
517
+ <mark class="bg-yellow-200 dark:bg-yellow-800 rounded px-0.5">matched text</mark>
518
+ ```
519
+
520
+ The highlight colors adapt to dark mode automatically.
521
+
522
+ ### 6.4. Navigating between results
523
+
524
+ After searching:
525
+ - Press `Enter` or click the down arrow to jump to the next result
526
+ - Press `Shift+Enter` or click the up arrow to jump to the previous result
527
+ - The current result is highlighted with a stronger outline
528
+
529
+ ### 6.5. Search limitations
530
+
531
+ - Minimum query length: 2 characters
532
+ - Maximum highlighted results: 50 (for performance on large transcripts)
533
+ - Case-insensitive by default
534
+ - No fuzzy matching -- exact substring match only
535
+
536
+ ### 6.6. Clearing search
537
+
538
+ Click the X button in the search input, press `Escape`, or delete all text. All highlights are removed and the page returns to its original state.
539
+
540
+ ---
541
+
542
+ ## 7. Dark Mode and Visual Features
543
+
544
+ ### 7.1. Dark mode
545
+
546
+ Toggle dark mode by clicking the sun/moon icon in the header. The setting is saved in `localStorage` and persists across visits.
547
+
548
+ If your system is set to dark mode (`prefers-color-scheme: dark`) and you have not manually toggled the setting, the site starts in dark mode automatically.
549
+
550
+ ### 7.2. Progress bar
551
+
552
+ A thin progress bar at the very top of the page indicates how far you have scrolled through the transcript. It uses the primary theme color and is visible in both light and dark modes.
553
+
554
+ ### 7.3. Back-to-top button
555
+
556
+ A floating button appears in the bottom-right corner when you scroll more than 300 pixels down. Clicking it smoothly scrolls to the top of the page.
557
+
558
+ ### 7.4. Table of contents scroll-spy
559
+
560
+ The table of contents in the sidebar highlights the currently visible section as you scroll. This uses `IntersectionObserver` to detect which section heading is in the viewport.
561
+
562
+ On mobile, the TOC is hidden behind a hamburger menu button. Tapping the button opens a slide-out drawer with the full table of contents.
563
+
564
+ ### 7.5. Reading statistics
565
+
566
+ Below the header, a stats bar shows:
567
+ - Total word count
568
+ - Estimated reading time (assumes 200 words per minute)
569
+ - Number of sections
570
+ - Number of speakers (if detected)
571
+
572
+ ### 7.6. Speaker color coding
573
+
574
+ When multiple speakers are detected, each speaker is assigned a distinct color from the theme palette:
575
+
576
+ - Speaker 1: primary-600 (e.g., indigo-600)
577
+ - Speaker 2: emerald-600
578
+ - Speaker 3: amber-600
579
+ - Speaker 4: rose-600
580
+ - Additional speakers cycle through the palette
581
+
582
+ Speaker labels are bold and color-coded:
583
+
584
+ ```html
585
+ <span class="font-bold text-indigo-600 dark:text-indigo-400">Host:</span>
586
+ ```
587
+
588
+ ---
589
+
590
+ ## 8. Large Transcript Strategy
591
+
592
+ ### 8.1. When to consider chunking
593
+
594
+ | Transcript size | Recommendation |
595
+ |----------------|----------------|
596
+ | Under 5,000 words | Single page, no special treatment |
597
+ | 5,000 - 15,000 words | Single page, default settings work well |
598
+ | 15,000 - 30,000 words | Single page with lazy loading |
599
+ | Over 30,000 words | Multi-page chunking recommended |
600
+
601
+ ### 8.2. Single page with lazy loading
602
+
603
+ For transcripts between 15,000 and 30,000 words, the generator automatically enables lazy loading. Sections below the third viewport are loaded on demand as you scroll toward them. The table of contents and search still work across the entire transcript.
604
+
605
+ ### 8.3. Multi-page chunking
606
+
607
+ For very long transcripts (over 30,000 words), the generator splits the content into multiple HTML pages:
608
+
609
+ ```
610
+ docs/
611
+ index.html -- Landing page with TOC and overview
612
+ section-01.html -- First section
613
+ section-02.html -- Second section
614
+ ...
615
+ ```
616
+
617
+ Each page includes:
618
+ - Navigation (previous/next section links)
619
+ - Mini table of contents
620
+ - Search (searches current page only)
621
+ - Consistent header and footer
622
+
623
+ To force multi-page mode:
624
+
625
+ ```
626
+ /transcript-site [source] --chunking multi
627
+ ```
628
+
629
+ To force single-page mode (even for long transcripts):
630
+
631
+ ```
632
+ /transcript-site [source] --chunking single
633
+ ```
634
+
635
+ ### 8.4. Performance characteristics
636
+
637
+ | Feature | Single page (10K words) | Single page (25K words) | Multi-page (50K words) |
638
+ |---------|------------------------|-----------------------|----------------------|
639
+ | HTML size | ~50 KB | ~120 KB | ~50 KB per page |
640
+ | Initial load | < 1 second | 1-2 seconds | < 1 second |
641
+ | Search speed | Instant | ~100ms | Instant (per page) |
642
+ | DOM nodes | ~2,000 | ~5,000 | ~2,000 per page |
643
+
644
+ ---
645
+
646
+ ## 9. Common Scenarios
647
+
648
+ ### Scenario A: Podcast transcript
649
+
650
+ You have a podcast episode and want to create a permanent, searchable transcript page.
651
+
652
+ ```
653
+ /transcript-site https://youtube.com/watch?v=PODCAST_EPISODE_ID
654
+ ```
655
+
656
+ The generator creates a single-page site with:
657
+ - Episode title and metadata from YouTube
658
+ - Speaker labels (Host, Guest)
659
+ - Timestamp links for easy navigation
660
+ - YouTube embed for listening while reading
661
+
662
+ ### Scenario B: Conference talk
663
+
664
+ You recorded a conference talk and want to share the transcript alongside the video.
665
+
666
+ ```
667
+ /transcript-site https://youtube.com/watch?v=TALK_ID --title "Building AI Systems at Scale - PyConf 2026"
668
+ ```
669
+
670
+ Key features for conference talks:
671
+ - Slide references (if timestamps are provided)
672
+ - Q&A section at the end (auto-detected from speaker changes)
673
+ - Technical terms highlighted (if detected)
674
+
675
+ ### Scenario C: Interview
676
+
677
+ You conducted an interview and have a text transcript.
678
+
679
+ ```
680
+ /transcript-site /path/to/interview-transcript.txt
681
+ ```
682
+
683
+ The generator detects the interview format (two speakers alternating) and applies:
684
+ - Speaker color coding
685
+ - Quote extraction for notable statements
686
+ - Clean two-column layout on desktop
687
+
688
+ ### Scenario D: Text-only article
689
+
690
+ You have a long-form article (not a transcript) and want to create an interactive reading experience.
691
+
692
+ ```
693
+ /transcript-site /path/to/article.md
694
+ ```
695
+
696
+ The generator adapts:
697
+ - No speaker detection (single author)
698
+ - No timestamp links
699
+ - Sections from markdown headers
700
+ - Reading progress bar
701
+
702
+ ### Scenario E: Keysarium research artifact
703
+
704
+ You completed a Keysarium case study and want to publish the executive summary.
705
+
706
+ ```
707
+ /transcript-site researches/bank-automation/08_executive_summary.md --title "Bank Automation Case Study"
708
+ ```
709
+
710
+ The generator treats Keysarium artifacts as text input and creates a clean, publishable website.
711
+
712
+ ### Scenario F: Batch generation
713
+
714
+ Generate sites for multiple transcripts:
715
+
716
+ ```
717
+ /transcript-site episode-1.txt --output docs/ep1/
718
+ /transcript-site episode-2.txt --output docs/ep2/
719
+ /transcript-site episode-3.txt --output docs/ep3/
720
+ ```
721
+
722
+ Each site is independent and can be deployed separately or together under one GitHub Pages domain.
723
+
724
+ ### Scenario G: Custom branding
725
+
726
+ Generate a site with custom colors and title for a specific brand:
727
+
728
+ ```
729
+ /transcript-site [source] \
730
+ --theme rose \
731
+ --title "Acme Corp Podcast - Episode 42" \
732
+ --description "This week we discuss..." \
733
+ --lang en
734
+ ```
735
+
736
+ ---
737
+
738
+ ## 10. Tips and Best Practices
739
+
740
+ ### Provide clean transcripts when possible
741
+
742
+ Auto-generated YouTube subtitles often have errors. If you have a manually corrected transcript, use it:
743
+
744
+ ```
745
+ /transcript-site https://youtube.com/watch?v=... --text corrected-transcript.txt
746
+ ```
747
+
748
+ The YouTube URL provides metadata and embed, while the text file provides accurate content.
749
+
750
+ ### Use speaker labels
751
+
752
+ If your transcript does not have speaker labels, add them. It dramatically improves readability:
753
+
754
+ ```
755
+ Host: Welcome to the show.
756
+ Guest: Thank you for having me.
757
+ ```
758
+
759
+ The generator color-codes speakers and creates a more visually engaging layout.
760
+
761
+ ### Keep sections reasonable
762
+
763
+ Sections of 500-1500 words work best. Very short sections (under 100 words) create too many TOC entries. Very long sections (over 3000 words) make navigation difficult.
764
+
765
+ If the auto-detected sections are not ideal, adjust at Step 2:
766
+
767
+ ```
768
+ split section 3
769
+ merge sections 7 and 8
770
+ ```
771
+
772
+ ### Test locally before deploying
773
+
774
+ Always preview the generated site locally:
775
+
776
+ ```bash
777
+ open docs/index.html
778
+ ```
779
+
780
+ Check:
781
+ - All sections render correctly
782
+ - YouTube embed loads (if applicable)
783
+ - Search works
784
+ - Dark mode toggles cleanly
785
+ - Mobile layout is acceptable (resize browser window)
786
+
787
+ ### Commit generated files to git
788
+
789
+ The generated site files should be committed to your repository:
790
+
791
+ ```bash
792
+ git add docs/
793
+ git commit -m "add transcript site: Episode 42"
794
+ git push
795
+ ```
796
+
797
+ This enables GitHub Pages deployment and provides version history.
798
+
799
+ ### Use descriptive titles
800
+
801
+ The title appears in:
802
+ - The browser tab
803
+ - Open Graph previews (social media shares)
804
+ - Search engine results
805
+ - The site header
806
+
807
+ Make it descriptive and specific:
808
+
809
+ ```
810
+ --title "How We Built Our ML Pipeline - Engineering Podcast Ep. 42"
811
+ ```
812
+
813
+ Not:
814
+
815
+ ```
816
+ --title "Transcript"
817
+ ```
818
+
819
+ ---
820
+
821
+ ## 11. FAQ
822
+
823
+ ### Q: Do I need Node.js to view the generated site?
824
+
825
+ No. The generated site is pure static HTML with Tailwind CDN and vanilla JavaScript. Open `docs/index.html` in any modern browser. Node.js is only needed for the `npx` CLI commands during installation.
826
+
827
+ ### Q: Can I edit the generated HTML manually?
828
+
829
+ Yes. The HTML is clean, well-structured, and uses standard Tailwind classes. You can edit it with any text editor. The site does not depend on any build tool or preprocessor.
830
+
831
+ ### Q: Does the site work offline?
832
+
833
+ If you used `--tailwind inline`, yes -- the site works completely offline. If you used the default Tailwind CDN, the site needs internet access on the first visit (after which the CDN is cached by the browser). The YouTube embed always requires internet access.
834
+
835
+ ### Q: Can I use this with a non-YouTube video platform?
836
+
837
+ Currently, only YouTube URLs are supported for automatic metadata and subtitle extraction. For other platforms (Vimeo, Twitch, etc.), download the transcript separately and provide it as text input. You can embed the video manually by editing the HTML after generation.
838
+
839
+ ### Q: How do I update a transcript site after editing the transcript?
840
+
841
+ Re-run the pipeline:
842
+
843
+ ```
844
+ /transcript-site [updated source] --output docs/ --clean
845
+ ```
846
+
847
+ The `--clean` flag removes previously generated files before writing new ones. Alternatively, manually delete `docs/index.html` and re-run.
848
+
849
+ ### Q: Can I generate multiple pages from one long transcript?
850
+
851
+ Yes. Use `--chunking multi`:
852
+
853
+ ```
854
+ /transcript-site [source] --chunking multi
855
+ ```
856
+
857
+ This splits the transcript into separate HTML pages by section.
858
+
859
+ ### Q: How do I add Google Analytics or other tracking?
860
+
861
+ Edit the generated `docs/index.html` and add the tracking script to the `<head>` section. The generator does not add tracking by default -- this is intentional for privacy.
862
+
863
+ ### Q: The YouTube subtitles are inaccurate. What can I do?
864
+
865
+ Three options:
866
+ 1. Download and correct the subtitles, then provide as text: `--text corrected.txt`
867
+ 2. Use a transcription service (Whisper, AssemblyAI) and provide the result as text
868
+ 3. Correct the HTML manually after generation
869
+
870
+ ### Q: Can I change the font?
871
+
872
+ Yes, by editing the Tailwind config in the generated HTML:
873
+
874
+ ```html
875
+ <script>
876
+ tailwind.config = {
877
+ theme: {
878
+ fontFamily: {
879
+ sans: ['Inter', 'system-ui', 'sans-serif'],
880
+ mono: ['JetBrains Mono', 'monospace']
881
+ }
882
+ }
883
+ }
884
+ </script>
885
+ ```
886
+
887
+ Add the font import in the `<head>`:
888
+
889
+ ```html
890
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
891
+ ```
892
+
893
+ ### Q: What is the maximum transcript length?
894
+
895
+ There is no hard limit. Single-page mode works well up to 30,000 words (~150 KB HTML). Beyond that, multi-page chunking is recommended. The generator handles transcripts of 100,000+ words with chunking enabled.
896
+
897
+ ### Q: Can I deploy to something other than GitHub Pages?
898
+
899
+ Yes. The generated site is static HTML -- it works on any static hosting:
900
+ - Netlify: drag and drop the `docs/` folder
901
+ - Vercel: point to the `docs/` directory in project settings
902
+ - AWS S3: upload `docs/` contents to an S3 bucket with static hosting
903
+ - Any web server: copy `docs/` to your server's document root
904
+
905
+ ### Q: Does the site support right-to-left (RTL) languages?
906
+
907
+ The generator sets `dir="rtl"` on the HTML element when it detects an RTL language (Arabic, Hebrew, Persian, Urdu). Tailwind utilities handle the layout adjustments automatically.
908
+
909
+ ### Q: How do I remove the "Generated by" footer credit?
910
+
911
+ Edit `docs/index.html` and remove or modify the footer section. The credit is not required -- it is a default that you are free to change.
912
+
913
+ ### Q: Can I use this in a CI/CD pipeline?
914
+
915
+ The generation step requires Claude Code (an interactive AI tool), so it cannot run in a headless CI/CD pipeline. However, you can:
916
+ 1. Generate the site locally with Claude Code
917
+ 2. Commit the output to git
918
+ 3. Deploy via GitHub Pages (automatic on push) or CI/CD for the static files
919
+
920
+ ### Q: The generated site is too large (over 200 KB). What should I do?
921
+
922
+ 1. Enable multi-page chunking: `--chunking multi`
923
+ 2. Use inline Tailwind: `--tailwind inline` (removes CDN dependency, smaller CSS)
924
+ 3. Check for unusually long sections and split them
925
+ 4. Remove features you do not need: `--no-copy-buttons --no-stats`