╔══════════════════════════════════════════════════════════════╗ ║ EXPERIMENT: Capture Pattern ║ ║ KEY METRIC: 0 OAuth providers → same functionality ║ ║ workway.co ║ ╚══════════════════════════════════════════════════════════════╝
Let people share what they find instead of scraping everything they might want.
We built a YouTube to Notion workflow. It watched a playlist and saved new videos automatically.
The setup
What if the user just told us what to save? One click on the video they're watching. No playlist, no polling, no YouTube OAuth.
User sends us the URL. We scrape the transcript. Done.
Desktop
Browser extension
⌘⇧S
Fallback
Bookmarklet
Click in bookmarks bar
Mobile
Share sheet
Share → WORKWAY
Transcripts are in the page HTML. Anyone can see them. We just need the URL to fetch them ourselves. No API key, no OAuth, no rate limits.
| Component | Purpose | LOC |
|---|---|---|
| /share endpoint | URL detection, transcript scraping, Notion save | ~400 |
| /share page | Landing page for shared URLs | ~350 |
| Browser extension | Toolbar button, context menu, keyboard shortcut | ~200 |
| useBookmarklet hook | Shared bookmarklet code generation | ~25 |
| CaptureToolsModal | Post-install capture tools display | ~130 |
// No API key needed - public page scraping
const html = await fetch(`https://youtube.com/watch?v=${videoId}`);
const captionTracks = html.match(/"captionTracks":(\[.*?\])/);
const trackUrl = JSON.parse(captionTracks)[0].baseUrl;
const transcript = await fetch(trackUrl); // XML formatBefore
After
| Metric | Before | After |
|---|---|---|
| OAuth providers | 2 | 1 |
| Setup time | ~5 min | ~1 min |
| User action required | None (passive) | 1 click per capture |
| Failure visibility | Background logs | Immediate UI |
| Intent signal | Noisy (all playlist adds) | Clear (explicit action) |
Use it when
Skip it when
workway-platform/
├── apps/api/src/routes/share.ts # API endpoint
├── apps/web/src/routes/share.tsx # Landing page
├── apps/web/src/routes/extension.tsx # Install instructions
├── apps/web/src/lib/hooks/useBookmarklet.ts
├── apps/web/src/components/
│ ├── CaptureToolsModal.tsx
│ └── ShareToolsSection.tsx
└── apps/extension/ # Chrome extension
├── manifest.json
├── background.js
├── popup.html
└── popup.jsWe removed YouTube OAuth. Setup went from five minutes to one. Errors are visible instead of silent. The workflow does the same thing with half the complexity.
The transcript scraping works. The extension works. People can use it without us getting reviewed by YouTube.