You are Devin, an interactive command line agent from Cognition.
Your job is to use these instructions and the tools available to you to help the user. It is important that you do so earnestly and helpfully, as you are very important to the success of Cognition. Best of luck! We love you. <3
If the user asks for help, you can check your documentation by invoking the Devin skill (if available). Otherwise, this information may be helpful:
- /help: list commands
- /bug: report a bug to the Devin CLI developers
- for support, users can visit https://devin.ai/support
When creating new configuration for this tool — including skills, rules, MCP server configs, or any project settings:
- Always use the `.devin/` directory for NEW configuration (e.g. `.devin/skills/<name>/SKILL.md`, `.devin/config.json`)
- For global (user-level) configuration, use `~/.config/devin/`
- Do NOT place new configuration in `.claude/`, `.cursor/`, or other tool-specific directories unless explicitly asked. These are only read for compatibility, not written to.
- If the `devin-cli` skill is available, ALWAYS invoke it and explore for detailed documentation on configuration format and options
When reading or referencing existing skills, always use the actual source path reported by the skill tool — skills may live in `.devin/`, `.agents/`, or other directories.
# Modes
The active mode is how the user would like you to act.
- Normal (default, if not specified): Full autonomy to use all your tools freely. For example: exploring a codebase, writing or editing code, etc.
- Plan: Explore the codebase, ask the user clarifying questions, and then create a plan for what you're going to do next. Do NOT make changes until you're out of this mode and the user has approved the plan.
Adhere strictly to the constraints of the active mode to avoid frustrating the user!
# Style
## Professional Objectivity
Prioritize technical accuracy and truthfulness over validating the user's beliefs. It is best for the user if you honestly apply the same rigorous standards to all ideas and disagree when necessary, even if it may not be what the user wants to hear. Objective guidance and respectful correction are more valuable than false agreement. Whenever there is uncertainty, it's best to investigate to find the truth first rather than instinctively confirming the user's beliefs.
## Tone
- Be concise, direct, and to the point. When running commands, briefly explain what you're doing and why so the user can follow along.
- Remember that your output will be displayed in a command line interface. Your responses can use Github-flavored markdown for formatting, and will be rendered in a monospace font using the CommonMark specification.
- Output text to communicate with the user; all text you output outside of tool use is displayed to the user. Only use tools to complete tasks. Never use tools like exec or code comments as means to communicate with the user during the session.
- If you cannot or will not help the user with something, please do not say why or what it could lead to, since this comes across as preachy and annoying. Please offer helpful alternatives if possible, and otherwise keep your response to 1-2 sentences.
- Only use emojis if the user explicitly requests it. Avoid using emojis in all communication unless asked.
- If the user asks about timelines or estimated completion times for your work, do not give them concrete estimates as you are not able to accurately predict how long it will take you to achieve a task. Instead just say that you will do your best to complete the task as soon as possible.
- Avoid guessing. You should verify the real state of the world with your tools before answering the user's questions.
<example>
user: What command should I run to watch files in the current directory and rebuild?
assistant: [use the exec tool to run `ls` and list the files in the current directory, then read docs/commands in the relevant file to find out how to watch files]
assistant: npm run dev
</example>
<example>
user: what files are in the directory src/?
assistant: [runs ls and sees foo.c, bar.c, baz.c]
assistant: foo.c, bar.c, baz.c
user: which file contains the implementation of Foo?
assistant: [reads foo.c]
assistant: src/foo.c contains `struct Foo`, which implements [...]
</example>
<example>
user: can you write tests for this feature
assistant: [uses grep and glob search tools to find where similar tests are defined, uses concurrent read file tool use blocks in one tool call to read relevant files at the same time, uses edit file tool to write new tests]
</example>
## Proactiveness
You are allowed to be proactive, but only when the user asks you to do something. You should strive to strike a balance between:
1. Doing the right thing when asked, including taking actions and follow-up actions
2. Not surprising the user with actions you take without asking
For example, if the user asks you how to approach something, you should do your best to explore and answer their question first, but not jump to implementation just yet.
## Handling ambiguous requests
When a user request is unclear:
- First attempt to interpret the request using available context
- Search the codebase for related code, patterns, or documentation that clarifies intent. Also consider searching the web.
- If still uncertain after investigation, ask a focused clarifying question
## File references
When your output text references specific files or code snippets, use the `<ref_file ... />` and `<ref_snippet ... />` self-closing XML tags to create clickable citations. These tags allow the user to view the referenced code directly in the conversation.
Citation format:
- `<ref_file file="/absolute/path/to/file" />` - Reference an entire file
- `<ref_snippet file="/absolute/path/to/file" lines="start-end" />` - Reference specific lines in a file
<example>
user: Where are errors from the client handled?
assistant: Clients are marked as failed in the `connectToServer` function. <ref_snippet file="/home/ubuntu/repos/project/src/services/process.ts" lines="710-715" />
</example>
<example>
user: Can you show me the config file?
assistant: Here's the configuration file: <ref_file file="/home/ubuntu/repos/project/config.json" />
</example>
## Tool usage policy
- When webfetch returns a redirect, immediately follow it with a new request.
- When making multiple edits to the same file or related files and you already know what changes are needed, batch them together.
When a tool call produces output that is too long, the output will be truncated and the remaining content will be written to a file. You will see a `<truncation_notice>` tag containing the path to the overflow file. You are responsible for reading this file if you need the full output.
# Programming
Since you live in the user's terminal, a very common use-case you will get is writing code. Fortunately, you've been extensively trained in software engineering and are well-equipped to help them out!
## Existing Conventions
When making changes to files, first understand the codebase's code conventions. Explore dependencies, references, and related system to understand the codebase's patterns and abstractions. Mimic code style, use existing libraries and utilities, and follow existing patterns.
- NEVER assume that a given library is available, even if it is well known. Whenever you write code that uses a library or framework, first check that this codebase already uses the given library. For example, you might look at neighboring files, or check the package.json (or cargo.toml, and so on depending on the language). If you're adding a dependency prefer running the package manager command (e.g. npm add or cargo add) instead of editing the file.
- When adding a new dependency, strongly prefer a version published at least 7 days ago. Newly published versions have not been vetted and a non-trivial fraction of supply chain attacks are caught and yanked within the first few days. Avoid floating ranges (`latest`, `*`, unbounded `>=`) that auto-resolve to brand-new releases.
- When you create a new component, first look at existing components to see how they're written; then consider framework choice, naming conventions, typing, and other conventions.
- When you edit a piece of code, first look at the code's surrounding context (especially its imports) to understand the code's choice of frameworks and libraries. Then consider how to make the given change in a way that is most idiomatic.
- Always follow security best practices. Never introduce code that exposes or logs secrets and keys. Never commit secrets or keys to the repository. Never modify repository security policies or compliance controls (e.g. `minimumReleaseAge`, `minimumReleaseAgeExclude`, branch protection configs, `.npmrc` security settings) to work around CI or build failures — escalate to the user instead. Unless otherwise specified (even if the task seems silly), assume the code is for a real production task.
## Code style
- IMPORTANT: Do NOT add or remove comments unless asked! If you find that you've accidentally deleted an existing comment, be sure to put it back.
- Default to writing compact code – collapse duplicate else branches, avoid unnecessary nesting, and share abstractions.
- Follow idiomatic conventions for the language you're writing.
- Avoid excessive & verbose error handling in your code. Errors should be handled, but not every line needs to be try/catched. Think about the right error boundaries (and look at existing code for error handling style)
## Debugging
When debugging issues:
- First reproduce the problem reliably
- Trace the code path to understand the flow
- Add targeted logging or print statements to isolate the issue
- Identify the root cause before attempting fixes
- Verify the fix addresses the root cause, not just symptoms
## Workflow
You should generally prefer to implement new features or fix bugs as follows...
1. If the project has test infrastructure, write a failing test to show the bug
2. Fix the bug
3. Ensure that the test now passes
Working this way makes it easier to tell if you've actually fixed the bug, and saves you from needing to verify later.
## Git
### Creating commits
1. Run in parallel: `git status`, `git diff`, `git log` (to match commit style)
2. Draft a concise commit message focusing on "why" not "what". Check for sensitive info.
3. Stage files and commit with this format:
```
git commit -m "$(cat <<'EOF'
Commit message here.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
EOF
)"
```
4. If pre-commit hooks modify files and the commit fails, stage the modified files and retry the commit.
### Creating pull requests
Use `gh` for all GitHub operations. Run in parallel: `git status`, `git diff`, `git log`, `git diff main...HEAD`
Review ALL commits (not just latest), then create PR:
```
gh pr create --title "title" --body "$(cat <<'EOF'
## Summary
<bullet points>
#### Test plan
<checklist>
Generated with [Devin](https://devin.ai)
EOF
)"
```
### Git rules
- NEVER update git config
- NEVER use `-i` flags (interactive mode not supported)
- DO NOT push unless explicitly asked
- DO NOT commit if no changes exist
# Task Management
You have access to the todo_write tool to help you manage and plan tasks. Use this tool VERY frequently to ensure that you are tracking your tasks and giving the user visibility into your progress.
This tool is also EXTREMELY helpful for planning tasks, and for breaking down larger complex tasks into smaller steps. If you do not use this tool when planning, you may forget to do important tasks - and that is unacceptable.
It is critical that you mark todos as completed as soon as you are done with a task. Do not batch up multiple tasks before marking them as completed.
Examples:
<example>
user: Run the build and fix any type errors
assistant: I'm going to use the todo_write tool to write the following items to the todo list:
- Run the build
- Fix any type errors
I'm now going to run the build using exec.
Looks like I found 10 type errors. I'm going to use the todo_write tool to write 10 items to the todo list.
marking the first todo as in_progress
Let me start working on the first item...
The first item has been fixed, let me mark the first todo as completed, and move on to the second item...
..
..
</example>
In the above example, the assistant completes all the tasks, including the 10 error fixes and running the build and fixing all errors.
<example>
user: Help me write a new feature that allows users to track their usage metrics and export them to various formats
assistant: I'll help you implement a usage metrics tracking and export feature. Let me first use the todo_write tool to plan this task.
Adding the following todos to the todo list:
1. Research existing metrics tracking in the codebase
2. Design the metrics collection system
3. Implement core metrics tracking functionality
4. Create export functionality for different formats
Let me start by researching the existing codebase to understand what metrics we might already be tracking and how we can build on that.
I'm going to search for any existing metrics or telemetry code in the project.
I've found some existing telemetry code. Let me mark the first todo as in_progress and start designing our metrics tracking system based on what I've learned...
[Assistant continues implementing the feature step by step, marking todos as in_progress and completed as they go]
</example>
Users may configure 'hooks', shell commands that execute in response to events like tool calls, in settings. Treat feedback from hooks, including <user-prompt-submit-hook>, as coming from the user. If you get blocked by a hook, determine if you can adjust your actions in response to the blocked message. If not, ask the user to check their hooks configuration.
## Completing Tasks
The user will primarily request you perform software engineering tasks. This includes solving bugs, adding new functionality, refactoring code, explaining code, and more. For these tasks the following steps are recommended:
- Use the todo_write tool to plan the task if required
- Use the available search tools to understand the codebase and the user's query. You are encouraged to use the search tools extensively both in parallel and sequentially.
- Before making changes, thoroughly explore the codebase to understand the architecture, patterns, and related systems. Read relevant files, trace dependencies, and understand how components interact.
- Implement the solution using all tools available to you
## Verification
Before considering a task complete, verify your work. Use judgment based on what you changed - optimize for fast iteration:
- Check for project-specific verification instructions in project rules files (`AGENTS.md`, or similar)
- Run relevant verification steps based on the scope of changes (lint, typecheck, build, tests)
- For isolated functionality, consider a temporary test file to verify behavior, then delete it
- Self-critique: review changes for edge cases and refine as needed
- If you cannot find verification commands, ask the user and suggest saving them to a project config file
## Saving learned information
If you discover useful project information (build commands, test commands, verification steps, user preferences, ...) that isn't already documented:
- If a rules file exists (`AGENTS.md`, etc.), append to it
- Otherwise, create `AGENTS.md` in the current directory with the learned information
## Error recovery
When encountering errors (failed commands, build failures, test failures):
- Keep trying different approaches to resolve the issue
- Search for similar issues in the codebase or documentation
- Only ask the user for help as a last resort after exhausting reasonable options
- Exception: Always ask the user for help with authentication issues, project configuration changes, or permission problems
## System Guidance
You may receive `<system_guidance>` messages containing hints, reminders, or contextual guidance before you take action. These notes are injected by the system to help you make better decisions. Pay attention to their content but do not acknowledge or respond to them directly—simply incorporate their guidance into your actions.
# Tool Tips
## Shell
NEVER invoke `rg`, `grep`, or `find` as shell commands — use the provided search tools instead. They have been optimized for correct permissions and access.
## File-related tools
- read can read images (PNG, JPG, etc) - the contents are presented visually.
- For Jupyter notebooks (.ipynb files), use notebook_read instead of read.
- Speculatively read multiple files as a batch when potentially useful.
- Do NOT create documentation files to describe your changes or plan. Exception: persistent project info files like `AGENTS.md` are allowed.
# Safety
IMPORTANT: Assist with defensive security tasks only. Refuse to create, modify, or improve code that may be used maliciously. Do not assist with credential discovery or harvesting, including bulk crawling for SSH keys, browser cookies, or cryptocurrency wallets. Allow security analysis, detection rules, vulnerability explanations, defensive tools, and security documentation.
IMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files.
## Destructive Operations
NEVER perform irreversible destructive operations without explicit user confirmation for that specific action, even if you have permission to run the command. This includes:
- Deleting or truncating database tables, dropping schemas, bulk-deleting rows
- `rm -rf`, deleting directories, or removing files you did not just create
- Force-pushing, rewriting git history, deleting branches, checking out over uncommitted changes, or bypassing commit hooks
- Sending emails, making payments, or calling APIs with real-world side effects
If a destructive step is required, STOP and describe exactly what you are about to run and why, then wait for the user. Do not assume a previous approval extends to a new destructive operation. If you realize you have already caused data loss, say so immediately rather than attempting to hide or quietly repair it.
## Available MCP Servers (for third-party tools)
{"servers":[{"name":"cloudflare-bindings"},{"name":"playwright"},{"name":"cloudflare-docs"},{"name":"cloudflare"},{"name":"cloudflare-observability"},{"name":"cloudflare-builds"},{"name":"fff","description":"FFF is a fast file finder with frecency-ranked results (frequent/recent files first, git-dirty files boosted).\n\n## Which Tool Should I Use?\n\n- **grep**: DEFAULT tool. Searches file CONTENTS -- definitions, usage, patterns. Use when you have a specific name or pattern.\n- **find_files**: Explores which files/modules exist for a topic. Use when you DON'T have a specific identifier or LOOKING FOR A FILE.\n- **multi_grep**: OR logic across multiple patterns. Use for case variants (e.g. ['PrepareUpload', 'prepare_upload']), or when you need to search 2+ different identifiers at once.\n\n## Core Rules\n\n### 1. Search BARE IDENTIFIERS only\nGrep matches single lines. Search for ONE identifier per query:\n + 'InProgressQuote' -> finds definition + all usages\n + 'ActorAuth' -> finds enum, struct, all call sites\n x 'load.*metadata.*InProgressQuote' -> regex spanning multiple tokens, 0 results\n x 'ctx.data::<ActorAuth>' -> code syntax, too specific, 0 results\n x 'struct ActorAuth' -> adding keywords narrows results, misses enums/traits/type aliases\n x 'TODO.*#\\d+' -> complex regex, use simple 'TODO' then filter visually\n\n### 2. NEVER use regex unless you truly need alternation\nPlain text search is faster and more reliable. Regex patterns like `.*`, `\\d+`, `\\s+` almost always return 0 results because they try to match complex patterns within single lines.\nIf you need OR logic, use multi_grep with literal patterns instead of regex alternation.\n\n### 3. Stop searching after 2 greps -- READ the code\nAfter 2 grep calls, you have enough file paths. Read the top result to understand the code.\nDo NOT keep grepping with variations. More greps != better understanding.\n\n### 4. Use multi_grep for multiple identifiers\nWhen you need to find different names (e.g. snake_case + PascalCase, or definition + usage patterns), use ONE multi_grep call instead of sequential greps:\n + multi_grep(['ActorAuth', 'PopulatedActorAuth', 'actor_auth'])\n x grep 'ActorAuth' -> grep 'PopulatedActorAuth' -> grep 'actor_auth' (3 calls wasted)\n\n## Workflow\n\n**Have a specific name?** -> grep the bare identifier.\n**Need multiple name variants?** -> multi_grep with all variants in one call.\n**Exploring a topic / finding files?** -> find_files.\n**Got results?** -> Read the top file. Don't grep again.\n\n## Constraint Syntax\n\nFor grep: constraints go INLINE, prepended before the search text.\nFor multi_grep: constraints go in the separate 'constraints' parameter.\n\nConstraints MUST match one of these formats:\n Extension: '*.rs', '*.{ts,tsx}'\n Directory: 'src/', 'quotes/'\n Filename: 'schema.rs', 'src/main.rs'\n Exclude: '!test/', '!*.spec.ts'\n\n! Bare words without extensions are NOT constraints. 'quote TODO' does NOT filter to quote files -- it searches for 'quote TODO' as text.\n + 'schema.rs TODO' -> searches for 'TODO' in files schema.rs\n + 'quotes/ TODO' -> searches for 'TODO' in the quotes/ directory\n x 'quote TODO' -> searches for literal text 'quote TODO', finds nothing\n\nPrefer broad constraints:\n + '*.rs query' -> file type\n + 'quotes/ query' -> top-level dir\n x 'quotes/storage/db/ query' -> too specific, misses results\n\n## Output Format\n\ngrep results auto-expand definitions with body context (struct fields, function signatures).\nThis often provides enough information WITHOUT a follow-up Read call.\nLines marked with | are definition body context. [def] marks definition files.\n-> Read suggestions point to the most relevant file -- follow them when you need more context.\n\n## Default Exclusions\n\nIf results are cluttered with irrelevant files, exclude them:\n !tests/ - exclude tests directory\n !*.spec.ts - exclude test files\n !generated/ - exclude generated code"}]}
IMPORTANT: You MUST call `mcp_list_tools` for a server before calling `mcp_call_tool` on it. This is required to discover the available tools and their correct input schemas. Never guess tool names or arguments — always list tools first.
Available subagent profiles for the `run_subagent` tool. Choose the most appropriate profile based on whether the task requires write access: - `subagent_explore`: Read-only subagent for codebase exploration, research, and search. Use this when you need to find code, understand architecture, trace dependencies, or answer questions about the codebase. This profile has read-only access (grep, glob, read, web_search) and cannot edit files. - `subagent_general`: General-purpose subagent with full tool access (read, write, edit, exec). Use this when the subagent needs to make code changes, run commands with side effects, or perform any task that requires write access. In the foreground it can prompt for tool approval; in the background, unapproved tools are auto-denied.
You are powered by SWE-1.7 Lightning.
## Parallel tool calls - You have the capability to call multiple tools in a single response--when multiple independent pieces of information are requested, batch your tool calls together for optimal performance. - For example, if you need to run `git status` and `git diff`, return an array of all the arguments of the 2 read-only tool calls to run the calls in parallel. - Always run parallel tool calls extensively when doing independent actions, especially when reading files, analyzing directories, searching on the web, grepping and searching across the codebase. - Never perform dependent terminal commands or writes in parallel.
<system_info> The following information is automatically generated context about your current environment. Current workspace directories: /Users/root1 (cwd) Platform: macos OS Version: Darwin 25.6.0 Today's date: Monday, 2026-07-13 </system_info>
<rules type="always-on">
<rule name="global_rules" path="/Users/root1/.codeium/windsurf/memories/global_rules.md">
</rule>
<rule name="AGENTS" path="/Users/root1/AGENTS.md">
# Agent Preferences
- If I ever paste in a YouTube link, use yt-dlp to summarize the video.
- get the autogenerrated captions to do this
- if asked to summarize a YouTube video, do not name the session until after reading and understanding the full YouTube video transcript
- for testing that involves urls, start with example.com rather than about:blank
- For tasks that may benefit from computer use (controlling macOS apps, windows, clicking, typing, etc.), use the background-computer-use skill to control local macOS apps through the BackgroundComputerUse API
- Secrets/tokens live in `~/.env` (e.g. `HF_TOKEN` for Hugging Face). Source it before use: `set -a; . ~/.env; set +a`
## Cloudflare DNS management
For Cloudflare DNS management (adding/editing/deleting DNS records), use the **`cf` CLI** instead of `wrangler`.
Wrangler does not have DNS management capabilities, and its OAuth token doesn't work with the Cloudflare REST API for DNS operations.
### Usage
```bash
# Check authentication status
cf auth whoami
# List DNS records for a zone
cf dns records list -z aidenhuang.com
# Add a DNS record
cf dns records create -z aidenhuang.com --type CNAME --name devin --content "target.example.com" --proxied false
# Delete a DNS record
cf dns records delete -z aidenhuang.com <record-id>
```
The `cf` CLI uses the same OAuth authentication as `wrangler` and has proper DNS record permissions.
## File search via fff MCP
For any file search or grep in the current git-indexed project directory, prefer the **fff** MCP tools
(`mcp__fff__grep`, `mcp__fff__find_files`, `mcp__fff__multi_grep`) over the built-in grep/glob tools.
fff is frecency-ranked, git-aware, and more token-efficient.
Rules the fff server enforces (follow them to avoid 0-result queries):
- Search BARE IDENTIFIERS only — one identifier per `grep` query. No `load.*metadata.*Foo` style regex.
- Don't use regex unless you truly need alternation; `.*`, `\d+`, `\s+` almost always return 0 results.
- After 2 grep calls, stop and READ the top result instead of grepping with more variations.
- Use `multi_grep` for OR logic across multiple identifiers (e.g. snake_case + PascalCase variants) in one call.
- Have a specific name → `grep`. Exploring a topic / finding files → `find_files`.
The `fff-mcp` binary lives at `/Users/root1/.local/bin/fff-mcp` and is registered at user scope
in `~/.config/devin/config.json`. It refuses to run in `$HOME` or `/` — it must be launched from a
project directory (Devin does this automatically based on cwd). Update with:
`curl -fsSL https://raw.githubusercontent.com/dmtrKovalenko/fff.nvim/main/install-mcp.sh | bash`
## X/Twitter scraping via logged-in browser session
When I need to scrape X/Twitter data (following, followers, tweets, user info, etc.),
the cleanest path is to use the **Playwright MCP** browser session with my own logged-in
x.com account, rather than spinning up twscrape's account-pool flow. twscrape needs the
`auth_token` HttpOnly cookie which JS cannot read from `document.cookie`; the browser
session attaches all cookies automatically.
### Flow
1. `mcp_list_tools` on the `playwright` server, then `browser_navigate` to `https://x.com`.
2. If not logged in, ask me to log in manually in the opened window (don't handle my password).
3. Once on `https://x.com/home`, read `ct0` from `document.cookie`:
`document.cookie.match(/ct0=([^;]+)/)[1]`
4. Call X's GraphQL endpoints directly via `fetch()` inside `browser_evaluate`. Required headers:
- `authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA` (the public web-app bearer token)
- `x-csrf-token: <ct0>`
- `x-twitter-auth-type: OAuth2Session`
- `x-twitter-active-user: yes`
- `content-type: application/json`
5. Paginate timelines by reading `content.cursorType === "Bottom"` entries and passing
the value back as `variables.cursor` until it stops changing.
### Key endpoints (queryId/OperationName)
- `UserByScreenName` → `681MIj51w00Aj6dY0GXnHw` (resolve @handle → numeric rest_id)
- `Following` → `OLm4oHZBfqWx8jbcEhWoFw`
- `Followers` → `9jsVJ9l2uXUIKslHvJqIhw`
- `UserTweets` → `RyDU3I9VJtPF-Pnl6vrRlw`
- `SearchTimeline` → `yIphfmxUO-hddQHKIOk9tA`
- `TweetDetail` → `meGUdoK_ryVZ0daBK-HJ2g`
URL pattern: `https://x.com/i/api/graphql/<queryId>/<OpName>?variables=<enc>&features=<enc>`
### Response schema notes (current X web build)
- User objects now put `screen_name` / `name` under `core`, NOT `legacy.screen_name`.
twscrape's parser still reads `legacy.screen_name` and returns empty — needs updating.
- The user `id` field is base64-encoded like `VXNlcjoxNDYwMjgzOTI1` (= `User:1460283925`).
Decode with `atob(u.id).split(':')[1]` to get the numeric rest_id. `u.rest_id` may also
be present directly.
- `is_blue_verified` is the verified flag. `legacy.followers_count`, `legacy.description`
still exist under `legacy`.
- Filter timeline entries by `content.entryType === "TimelineTimelineItem"` and skip
`cursor-`, `messageprompt-`, `module-`, `who-to-follow-` entryIds.
### Features dict
Use the full `GQL_FEATURES` block from twscrape's `api.py` — without it X returns
`(336) The following features cannot be null`. Pass it URL-encoded as the `features` param.
### Where things live
- Output CSV: `~/Downloads/utilities/sdand_following.csv` (1613 rows: #, id, screen_name, name, verified, followers, bio)
- Output JSON: `~/Downloads/utilities/sdand_following_final.json` (double-encoded JSON string; parse with `json.loads(json.loads(raw))`)
- twscrape repo was cloned to `~/Downloads/utilities/twscrape/` for reference, then deleted after the flow was reverse-engineered. Re-clone from https://github.com/vladkens/twscrape.git if needed.
## Fast Whisper transcription on Modal (A10G)
For transcribing long-form audio/video (interviews, podcasts, X/Twitter videos), use the
utility at `~/Downloads/utilities/whisper_x/whisper_transcribe.py`. It does the full
pipeline: URL → yt-dlp download → ffmpeg audio extract → Modal volume upload →
faster-whisper on A10G → JSON + TXT output. Validated at **2.3 min wall clock for 65 min
of audio** (no caching at any layer).
### Usage
Shell alias (defined in `~/.zshrc`): `whisper`
```bash
# Transcribe an X/Twitter video (picks first playlist item)
whisper "https://x.com/.../status/123"
# Pick a specific playlist item, use a smaller model
whisper "https://x.com/..." --playlist-item 2 --model-size medium
# Transcribe a local audio file
whisper /path/to/audio.mp3 --name my-podcast
# Custom output dir + keep downloaded source
whisper "https://..." --outdir ./transcripts --keep-source
```
Transcript text goes to stdout (pipe with `| pbcopy`); structured JSON + readable TXT
saved to `<outdir>/<name>.json` and `<outdir>/<name>.txt`.
### Key optimizations (vs naive T4 run that took 11.7 min)
- **A10G GPU** (~8x fp16 throughput vs T4; Modal ~$0.60/hr vs ~$0.16/hr — pennies for short jobs)
- **`BatchedInferencePipeline`** with `batch_size=16` — batches encoder/decoder across chunks (2-4x)
- **`beam_size=1`** (greedy) — ~2x faster, negligible WER increase for conversational speech
- **`vad_filter=True`** — skips silence segments
- **`compute_type="float16"`** — halves memory bandwidth
- **No caching**: `force_build=True` on apt/pip steps + unique `download_root` per run forces
fresh image rebuild + fresh HF model download every time
### Pinned versions (must match)
- `faster-whisper==1.1.1` (provides `BatchedInferencePipeline`)
- `ctranslate2==4.8.0`
- Base image: `nvidia/cuda:12.6.3-cudnn-runtime-ubuntu22.04` (provides `libcublas.so.12`;
`debian_slim` fails with `RuntimeError: Library libcublas.so.12 is not found`)
### Audio prep (done automatically by the utility)
```bash
ffmpeg -y -i input.mp4 -vn -ac 1 -ar 16000 -c:a aac -b:a 64k audio.m4a
```
Mono 16kHz 64kbps AAC — a 65-min video (151 MB stream) becomes ~35 MB audio.
### X/Twitter download notes
- Tweet URLs can contain **playlists** (multiple videos). Use `--playlist-item N` to pick one.
- Always use `-f bestaudio/best` to avoid downloading multi-GB high-bitrate video streams.
- A 65-min interview's video variant can be 2.8+ GB; audio-only is ~63 MB (128 kbps).
### Where things live
- Utility: `~/Downloads/utilities/whisper_x/whisper_transcribe.py`
- Strategy doc: `~/Downloads/utilities/whisper_x/STRATEGY.md` (full optimization breakdown)
- Modal app (standalone): `~/Downloads/utilities/whisper_x/transcribe_fast.py`
- Modal volume: `whisper-audio` (created automatically; holds uploaded audio files)
- Modal profile: `aidenhuang-personal` (workspace with GPU access)
</rule>
</rules><available_skills> The following skills can be invoked using the `skill` tool. When ANY skill — built-in OR repository — clearly matches the user's request or the current task, invoke it with the `skill` tool immediately at the start of the session. If more than one skill matches, invoke ALL of them (issue the `skill` calls in parallel) — do not stop at the single most obvious one. - **cloudflare-one**: Guides Cloudflare One Zero Trust and SASE work across Access, Gateway, WARP, Tunnel, Cloudflare WAN, DLP, CASB, device posture, and identity. Use when designing, configuring, troubleshooting, or reviewing Cloudflare One deployments. Retrieval-first: use current Cloudflare docs/API schemas instead of embedded product docs. (source: /Users/root1/.codeium/windsurf/skills/cloudflare-one/SKILL.md) - **agents-sdk**: Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, chat applications, voice agents, or browser automation. Covers Agent class, state management, callable RPC, Workflows, durable execution, queues, retries, observability, and React hooks. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.agents/skills/agents-sdk/SKILL.md) - **turnstile-spin**: Set up Cloudflare Turnstile end-to-end in a project — scan the codebase, create the widget via the Cloudflare API, deploy the managed siteverify Worker, write the frontend snippets, validate, and persist the skill. Load this when a user asks to add Turnstile, set up CAPTCHA, protect a form from bots, or fix a Turnstile integration. Mirrors developers.cloudflare.com/turnstile/spin. (source: /Users/root1/.agents/skills/turnstile-spin/SKILL.md) - **agents-sdk**: Build AI agents on Cloudflare Workers using the Agents SDK. Load when creating stateful agents, durable workflows, real-time WebSocket apps, scheduled tasks, MCP servers, chat applications, voice agents, or browser automation. Covers Agent class, state management, callable RPC, Workflows, durable execution, queues, retries, observability, and React hooks. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/agents-sdk/SKILL.md) - **find-skills**: Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill. (source: /Users/root1/.agents/skills/find-skills/SKILL.md) - **sandbox-sdk**: Build sandboxed applications for secure code execution. Load when building AI code execution, code interpreters, CI/CD systems, interactive dev environments, or executing untrusted code. Covers Sandbox SDK lifecycle, commands, files, code interpreter, and preview URLs. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.claude/skills/sandbox-sdk/SKILL.md) - **wrangler**: Cloudflare Workers CLI for deploying, developing, and managing Workers, KV, R2, D1, Vectorize, Hyperdrive, Workers AI, Containers, Queues, Workflows, Pipelines, and Secrets Store. Load before running wrangler commands to ensure correct syntax and best practices. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.agents/skills/wrangler/SKILL.md) - **workers-best-practices**: Reviews and authors Cloudflare Workers code against production best practices. Load when writing new Workers, reviewing Worker code, configuring wrangler.jsonc, or checking for common Workers anti-patterns (streaming, floating promises, global state, secrets, bindings, observability). Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/workers-best-practices/SKILL.md) - **durable-objects**: Create and review Cloudflare Durable Objects. Use when building stateful coordination (chat rooms, multiplayer games, booking systems), implementing RPC methods, SQLite storage, alarms, WebSockets, or reviewing DO code for best practices. Covers Workers integration, wrangler config, and testing with Vitest. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.agents/skills/durable-objects/SKILL.md) - **cloudflare-email-service**: Send and receive transactional emails with Cloudflare Email Service (Email Sending + Email Routing). Use when building email sending (Workers binding or REST API), email routing, Agents SDK email handling, or integrating email into any app — Workers, Node.js, Python, Go, etc. Also use for email deliverability, SPF/DKIM/DMARC, wrangler email setup, MCP email tools, or when a coding agent needs to send emails. Even for simple requests like "add email to my Worker" — this skill has critical config details. (source: /Users/root1/.codeium/windsurf/skills/cloudflare-email-service/SKILL.md) - **turnstile-spin**: Set up Cloudflare Turnstile end-to-end in a project — scan the codebase, create the widget via the Cloudflare API, deploy the managed siteverify Worker, write the frontend snippets, validate, and persist the skill. Load this when a user asks to add Turnstile, set up CAPTCHA, protect a form from bots, or fix a Turnstile integration. Mirrors developers.cloudflare.com/turnstile/spin. (source: /Users/root1/.config/devin/skills/turnstile-spin/SKILL.md) - **cloudflare**: Comprehensive Cloudflare platform skill covering Workers, Pages, storage (KV, D1, R2), AI (Workers AI, Vectorize, Agents SDK), feature flags (Flagship), networking (Tunnel, Spectrum), security (WAF, DDoS), and infrastructure-as-code (Terraform, Pulumi). Use for any Cloudflare development task. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.codeium/windsurf/skills/cloudflare/SKILL.md) - **cloudflare-email-service**: Send and receive transactional emails with Cloudflare Email Service (Email Sending + Email Routing). Use when building email sending (Workers binding or REST API), email routing, Agents SDK email handling, or integrating email into any app — Workers, Node.js, Python, Go, etc. Also use for email deliverability, SPF/DKIM/DMARC, wrangler email setup, MCP email tools, or when a coding agent needs to send emails. Even for simple requests like "add email to my Worker" — this skill has critical config details. (source: /Users/root1/.config/devin/skills/cloudflare-email-service/SKILL.md) - **workers-best-practices**: Reviews and authors Cloudflare Workers code against production best practices. Load when writing new Workers, reviewing Worker code, configuring wrangler.jsonc, or checking for common Workers anti-patterns (streaming, floating promises, global state, secrets, bindings, observability). Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.claude/skills/workers-best-practices/SKILL.md) - **web-perf**: Analyzes web performance using Chrome DevTools MCP. Measures Core Web Vitals (LCP, INP, CLS) and supplementary metrics (FCP, TBT, Speed Index), identifies render-blocking resources, network dependency chains, layout shifts, caching issues, and accessibility gaps. Use when asked to audit, profile, debug, or optimize page load performance, Lighthouse scores, or site speed. Biases towards retrieval from current documentation over pre-trained knowledge. (source: /Users/root1/.codeium/windsurf/skills/web-perf/SKILL.md) - **durable-objects**: Create and review Cloudflare Durable Objects. Use when building stateful coordination (chat rooms, multiplayer games, booking systems), implementing RPC methods, SQLite storage, alarms, WebSockets, or reviewing DO code for best practices. Covers Workers integration, wrangler config, and testing with Vitest. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/durable-objects/SKILL.md) - **cloudflare-one-migrations**: Plans migrations from Zscaler ZIA/ZPA, Palo Alto, legacy VPN, SWG, or SASE stacks to Cloudflare One. Use for migration assessments, policy mapping, rollout plans, and parity/gap analysis. (source: /Users/root1/.claude/skills/cloudflare-one-migrations/SKILL.md) - **sandbox-sdk**: Build sandboxed applications for secure code execution. Load when building AI code execution, code interpreters, CI/CD systems, interactive dev environments, or executing untrusted code. Covers Sandbox SDK lifecycle, commands, files, code interpreter, and preview URLs. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/sandbox-sdk/SKILL.md) - **web-perf**: Analyzes web performance using Chrome DevTools MCP. Measures Core Web Vitals (LCP, INP, CLS) and supplementary metrics (FCP, TBT, Speed Index), identifies render-blocking resources, network dependency chains, layout shifts, caching issues, and accessibility gaps. Use when asked to audit, profile, debug, or optimize page load performance, Lighthouse scores, or site speed. Biases towards retrieval from current documentation over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/web-perf/SKILL.md) - **cloudflare-one-migrations**: Plans migrations from Zscaler ZIA/ZPA, Palo Alto, legacy VPN, SWG, or SASE stacks to Cloudflare One. Use for migration assessments, policy mapping, rollout plans, and parity/gap analysis. (source: /Users/root1/.config/devin/skills/cloudflare-one-migrations/SKILL.md) - **wrangler**: Cloudflare Workers CLI for deploying, developing, and managing Workers, KV, R2, D1, Vectorize, Hyperdrive, Workers AI, Containers, Queues, Workflows, Pipelines, and Secrets Store. Load before running wrangler commands to ensure correct syntax and best practices. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/wrangler/SKILL.md) - **cloudflare-one**: Guides Cloudflare One Zero Trust and SASE work across Access, Gateway, WARP, Tunnel, Cloudflare WAN, DLP, CASB, device posture, and identity. Use when designing, configuring, troubleshooting, or reviewing Cloudflare One deployments. Retrieval-first: use current Cloudflare docs/API schemas instead of embedded product docs. (source: /Users/root1/.config/devin/skills/cloudflare-one/SKILL.md) - **cloudflare-agent-setup**: (source: /Users/root1/.devin/skills/cloudflare-agent-setup/SKILL.md) - **background-computer-use**: Launch and use the local BackgroundComputerUse macOS runtime through its self-documenting loopback API. Use when Codex needs to control local macOS apps or windows, inspect screenshots and Accessibility state, click/type/scroll/press keys, use the visible cursor, or help install/start the BackgroundComputerUse API from a skill. (source: /Users/root1/.devin/skills/background-computer-use/SKILL.md) - **cloudflare**: Comprehensive Cloudflare platform skill covering Workers, Pages, storage (KV, D1, R2), AI (Workers AI, Vectorize, Agents SDK), feature flags (Flagship), networking (Tunnel, Spectrum), security (WAF, DDoS), and infrastructure-as-code (Terraform, Pulumi). Use for any Cloudflare development task. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. (source: /Users/root1/.config/devin/skills/cloudflare/SKILL.md) - **devin-cli**: Look up Devin CLI documentation (skills, extensibility, configuration, commands, models, troubleshooting) (source: /Users/root1/.local/share/devin/cli/_versions/3000.1.27/share/devin/docs) - **declarative-repo-setup**: Generate and verify a working environment.yaml (Devin snapshot-setup blueprint) for a repo (source: builtin:drs) </available_skills>
The user has provided a YouTube link. According to the always-on rules: - "If I ever paste in a YouTube link, use yt-dlp to summarize the video." - "get the autogenerated captions to do this" - "if asked to summarize a YouTube video, do not name the session until after reading and understanding the full YouTube video transcript" So I need to use yt-dlp to download the captions/transcript and then summarize the video. I should not name the session yet. Let me use yt-dlp to extract the transcript. I need to check if yt-dlp is available and get the captions. I'll use yt-dlp's subtitle/list feature. First, let me think about the command. yt-dlp can list available subtitles with --list-subs and download them with --write-subs or extract them. To get auto-generated captions, I can use: - --list-subs to see available subtitles - --write-auto-subs to write auto-generated subtitles - --skip-download to not download the video Or I can use yt-dlp to extract the transcript directly to text. Let me use a command that gets the auto-generated subtitles in a text format. A good approach: 1. List available subs first 2. Use yt-dlp --write-auto-subs --skip-download --sub-lang en --convert-subs srt or similar Actually, a cleaner way is to use yt-dlp --dump-json to get metadata including subtitles, or to just download the .vtt file and convert it to text. Let me start by checking yt-dlp availability and listing subs.
{
"command": "yt-dlp --version"
}Output from command in shell 082484: 2025.12.08 Exit code: 0
yt-dlp is available. Now I'll list the available subtitles for the video and then download the auto-generated English captions.
{
"command": "yt-dlp --list-subs \"https://www.youtube.com/watch?v=Do_LjDsisIE\""
}Output from command in shell 916349:
WARNING: Your yt-dlp version (2025.12.08) is older than 90 days!
It is strongly recommended to always use the latest version.
You installed yt-dlp with pip or using the wheel from PyPi; Use that to update.
To suppress this warning, add --no-update to your command/config.
[youtube] Extracting URL: https://www.youtube.com/watch?v=Do_LjDsisIE
[youtube] Do_LjDsisIE: Downloading webpage
[youtube] Do_LjDsisIE: Downloading tv client config
[youtube] Do_LjDsisIE: Downloading player dd53c628-main
[youtube] Do_LjDsisIE: Downloading tv player API JSON
[youtube] Do_LjDsisIE: Downloading android sdkless player API JSON
[youtube] [jsc:deno] Solving JS challenges using deno
WARNING: [youtube] [jsc] Remote components challenge solver script (deno) and NPM package (deno) were skipped. These may be required to solve JS challenges. You can enable these downloads with --remote-components ejs:github (recommended) or --remote-components ejs:npm , respectively. For more information and alternatives, refer to https://github.com/yt-dlp/yt-dlp/wiki/EJS
WARNING: [youtube] Do_LjDsisIE: n challenge solving failed: Some formats may be missing. Ensure you have a supported JavaScript runtime and challenge solver script distribution installed. Review any warnings presented before this message. For more details, refer to https://github.com/yt-dlp/yt-dlp/wiki/EJS
[info] Available automatic captions for Do_LjDsisIE:
Language Name Formats
ab Abkhazian vtt, srt, ttml, srv3, srv2, srv1, json3
aa Afar vtt, srt, ttml, srv3, srv2, srv1, json3
af Afrikaans vtt, srt, ttml, srv3, srv2, srv1, json3
ak Akan vtt, srt, ttml, srv3, srv2, srv1, json3
sq Albanian vtt, srt, ttml, srv3, srv2, srv1, json3
am Amharic vtt, srt, ttml, srv3, srv2, srv1, json3
ar Arabic vtt, srt, ttml, srv3, srv2, srv1, json3
hy Armenian vtt, srt, ttml, srv3, srv2, srv1, json3
as Assamese vtt, srt, ttml, srv3, srv2, srv1, json3
ay Aymara vtt, srt, ttml, srv3, srv2, srv1, json3
az Azerbaijani vtt, srt, ttml, srv3, srv2, srv1, json3
bn Bangla vtt, srt, ttml, srv3, srv2, srv1, json3
ba Bashkir vtt, srt, ttml, srv3, srv2, srv1, json3
eu Basque vtt, srt, ttml, srv3, srv2, srv1, json3
be Belarusian vtt, srt, ttml, srv3, srv2, srv1, json3
bho Bhojpuri vtt, srt, ttml, srv3, srv2, srv1, json3
bs Bosnian vtt, srt, ttml, srv3, srv2, srv1, json3
br Breton vtt, srt, ttml, srv3, srv2, srv1, json3
bg Bulgarian vtt, srt, ttml, srv3, srv2, srv1, json3
my Burmese vtt, srt, ttml, srv3, srv2, srv1, json3
ca Catalan vtt, srt, ttml, srv3, srv2, srv1, json3
ceb Cebuano vtt, srt, ttml, srv3, srv2, srv1, json3
zh-Hans Chinese (Simplified) vtt, srt, ttml, srv3, srv2, srv1, json3
zh-Hant Chinese (Traditional) vtt, srt, ttml, srv3, srv2, srv1, json3
co Corsican vtt, srt, ttml, srv3, srv2, srv1, json3
hr Croatian vtt, srt, ttml, srv3, srv2, srv1, json3
cs Czech vtt, srt, ttml, srv3, srv2, srv1, json3
da Danish vtt, srt, ttml, srv3, srv2, srv1, json3
dv Divehi vtt, srt, ttml, srv3, srv2, srv1, json3
nl Dutch vtt, srt, ttml, srv3, srv2, srv1, json3
dz Dzongkha vtt, srt, ttml, srv3, srv2, srv1, json3
en-orig English (Original) vtt, srt, ttml, srv3, srv2, srv1, json3
en English vtt, srt, ttml, srv3, srv2, srv1, json3
eo Esperanto vtt, srt, ttml, srv3, srv2, srv1, json3
et Estonian vtt, srt, ttml, srv3, srv2, srv1, json3
ee Ewe vtt, srt, ttml, srv3, srv2, srv1, json3
fo Faroese vtt, srt, ttml, srv3, srv2, srv1, json3
fj Fijian vtt, srt, ttml, srv3, srv2, srv1, json3
fil Filipino vtt, srt, ttml, srv3, srv2, srv1, json3
fi Finnish vtt, srt, ttml, srv3, srv2, srv1, json3
fr French vtt, srt, ttml, srv3, srv2, srv1, json3
gaa Ga vtt, srt, ttml, srv3, srv2, srv1, json3
gl Galician vtt, srt, ttml, srv3, srv2, srv1, json3
lg Ganda vtt, srt, ttml, srv3, srv2, srv1, json3
ka Georgian vtt, srt, ttml, srv3, srv2, srv1, json3
de German vtt, srt, ttml, srv3, srv2, srv1, json3
el Greek vtt, srt, ttml, srv3, srv2, srv1, json3
gn Guarani vtt, srt, ttml, srv3, srv2, srv1, json3
gu Gujarati vtt, srt, ttml, srv3, srv2, srv1, json3
ht Haitian Creole vtt, srt, ttml, srv3, srv2, srv1, json3
ha Hausa vtt, srt, ttml, srv3, srv2, srv1, json3
haw Hawaiian vtt, srt, ttml, srv3, srv2, srv1, json3
iw Hebrew vtt, srt, ttml, srv3, srv2, srv1, json3
hi Hindi vtt, srt, ttml, srv3, srv2, srv1, json3
hmn Hmong vtt, srt, ttml, srv3, srv2, srv1, json3
hu Hungarian vtt, srt, ttml, srv3, srv2, srv1, json3
is Icelandic vtt, srt, ttml, srv3, srv2, srv1, json3
ig Igbo vtt, srt, ttml, srv3, srv2, srv1, json3
id Indonesian vtt, srt, ttml, srv3, srv2, srv1, json3
iu Inuktitut vtt, srt, ttml, srv3, srv2, srv1, json3
ga Irish vtt, srt, ttml, srv3, srv2, srv1, json3
it Italian vtt, srt, ttml, srv3, srv2, srv1, json3
ja Japanese vtt, srt, ttml, srv3, srv2, srv1, json3
jv Javanese vtt, srt, ttml, srv3, srv2, srv1, json3
kl Kalaallisut vtt, srt, ttml, srv3, srv2, srv1, json3
kn Kannada vtt, srt, ttml, srv3, srv2, srv1, json3
kk Kazakh vtt, srt, ttml, srv3, srv2, srv1, json3
kha Khasi vtt, srt, ttml, srv3, srv2, srv1, json3
km Khmer vtt, srt, ttml, srv3, srv2, srv1, json3
rw Kinyarwanda vtt, srt, ttml, srv3, srv2, srv1, json3
ko Korean vtt, srt, ttml, srv3, srv2, srv1, json3
kri Krio vtt, srt, ttml, srv3, srv2, srv1, json3
ku Kurdish vtt, srt, ttml, srv3, srv2, srv1, json3
ky Kyrgyz vtt, srt, ttml, srv3, srv2, srv1, json3
lo Lao vtt, srt, ttml, srv3, srv2, srv1, json3
la Latin vtt, srt, ttml, srv3, srv2, srv1, json3
lv Latvian vtt, srt, ttml, srv3, srv2, srv1, json3
ln Lingala vtt, srt, ttml, srv3, srv2, srv1, json3
lt Lithuanian vtt, srt, ttml, srv3, srv2, srv1, json3
lua Luba-Lulua vtt, srt, ttml, srv3, srv2, srv1, json3
luo Luo vtt, srt, ttml, srv3, srv2, srv1, json3
lb Luxembourgish vtt, srt, ttml, srv3, srv2, srv1, json3
mk Macedonian vtt, srt, ttml, srv3, srv2, srv1, json3
mg Malagasy vtt, srt, ttml, srv3, srv2, srv1, json3
ms Malay vtt, srt, ttml, srv3, srv2, srv1, json3
ml Malayalam vtt, srt, ttml, srv3, srv2, srv1, json3
mt Maltese vtt, srt, ttml, srv3, srv2, srv1, json3
gv Manx vtt, srt, ttml, srv3, srv2, srv1, json3
mi Māori vtt, srt, ttml, srv3, srv2, srv1, json3
mr Marathi vtt, srt, ttml, srv3, srv2, srv1, json3
mn Mongolian vtt, srt, ttml, srv3, srv2, srv1, json3
mfe Morisyen vtt, srt, ttml, srv3, srv2, srv1, json3
ne Nepali vtt, srt, ttml, srv3, srv2, srv1, json3
new Newari vtt, srt, ttml, srv3, srv2, srv1, json3
nso Northern Sotho vtt, srt, ttml, srv3, srv2, srv1, json3
no Norwegian vtt, srt, ttml, srv3, srv2, srv1, json3
ny Nyanja vtt, srt, ttml, srv3, srv2, srv1, json3
oc Occitan vtt, srt, ttml, srv3, srv2, srv1, json3
or Odia vtt, srt, ttml, srv3, srv2, srv1, json3
om Oromo vtt, srt, ttml, srv3, srv2, srv1, json3
os Ossetic vtt, srt, ttml, srv3, srv2, srv1, json3
pam Pampanga vtt, srt, ttml, srv3, srv2, srv1, json3
ps Pashto vtt, srt, ttml, srv3, srv2, srv1, json3
fa Persian vtt, srt, ttml, srv3, srv2, srv1, json3
pl Polish vtt, srt, ttml, srv3, srv2, srv1, json3
pt Portuguese vtt, srt, ttml, srv3, srv2, srv1, json3
pt-PT Portuguese (Portugal) vtt, srt, ttml, srv3, srv2, srv1, json3
pa Punjabi vtt, srt, ttml, srv3, srv2, srv1, json3
qu Quechua vtt, srt, ttml, srv3, srv2, srv1, json3
ro Romanian vtt, srt, ttml, srv3, srv2, srv1, json3
rn Rundi vtt, srt, ttml, srv3, srv2, srv1, json3
ru Russian vtt, srt, ttml, srv3, srv2, srv1, json3
sm Samoan vtt, srt, ttml, srv3, srv2, srv1, json3
sg Sango vtt, srt, ttml, srv3, srv2, srv1, json3
sa Sanskrit vtt, srt, ttml, srv3, srv2, srv1, json3
gd Scottish Gaelic vtt, srt, ttml, srv3, srv2, srv1, json3
sr Serbian vtt, srt, ttml, srv3, srv2, srv1, json3
crs Seselwa Creole French vtt, srt, ttml, srv3, srv2, srv1, json3
sn Shona vtt, srt, ttml, srv3, srv2, srv1, json3
sd Sindhi vtt, srt, ttml, srv3, srv2, srv1, json3
si Sinhala vtt, srt, ttml, srv3, srv2, srv1, json3
sk Slovak vtt, srt, ttml, srv3, srv2, srv1, json3
sl Slovenian vtt, srt, ttml, srv3, srv2, srv1, json3
so Somali vtt, srt, ttml, srv3, srv2, srv1, json3
st Southern Sotho vtt, srt, ttml, srv3, srv2, srv1, json3
es Spanish vtt, srt, ttml, srv3, srv2, srv1, json3
su Sundanese vtt, srt, ttml, srv3, srv2, srv1, json3
sw Swahili vtt, srt, ttml, srv3, srv2, srv1, json3
ss Swati vtt, srt, ttml, srv3, srv2, srv1, json3
sv Swedish vtt, srt, ttml, srv3, srv2, srv1, json3
tg Tajik vtt, srt, ttml, srv3, srv2, srv1, json3
ta Tamil vtt, srt, ttml, srv3, srv2, srv1, json3
tt Tatar vtt, srt, ttml, srv3, srv2, srv1, json3
te Telugu vtt, srt, ttml, srv3, srv2, srv1, json3
th Thai vtt, srt, ttml, srv3, srv2, srv1, json3
bo Tibetan vtt, srt, ttml, srv3, srv2, srv1, json3
ti Tigrinya vtt, srt, ttml, srv3, srv2, srv1, json3
to Tongan vtt, srt, ttml, srv3, srv2, srv1, json3
ts Tsonga vtt, srt, ttml, srv3, srv2, srv1, json3
tn Tswana vtt, srt, ttml, srv3, srv2, srv1, json3
tum Tumbuka vtt, srt, ttml, srv3, srv2, srv1, json3
tr Turkish vtt, srt, ttml, srv3, srv2, srv1, json3
tk Turkmen vtt, srt, ttml, srv3, srv2, srv1, json3
uk Ukrainian vtt, srt, ttml, srv3, srv2, srv1, json3
ur Urdu vtt, srt, ttml, srv3, srv2, srv1, json3
ug Uyghur vtt, srt, ttml, srv3, srv2, srv1, json3
uz Uzbek vtt, srt, ttml, srv3, srv2, srv1, json3
ve Venda vtt, srt, ttml, srv3, srv2, srv1, json3
vi Vietnamese vtt, srt, ttml, srv3, srv2, srv1, json3
war Waray vtt, srt, ttml, srv3, srv2, srv1, json3
cy Welsh vtt, srt, ttml, srv3, srv2, srv1, json3
fy Western Frisian vtt, srt, ttml, srv3, srv2, srv1, json3
wo Wolof vtt, srt, ttml, srv3, srv2, srv1, json3
xh Xhosa vtt, srt, ttml, srv3, srv2, srv1, json3
yi Yiddish vtt, srt, ttml, srv3, srv2, srv1, json3
yo Yoruba vtt, srt, ttml, srv3, srv2, srv1, json3
zu Zulu vtt, srt, ttml, srv3, srv2, srv1, json3
Do_LjDsisIE has no subtitles
Exit code: 0The video has auto-generated captions available in English. I see "en" and "en-orig" (English Original). I'll download the English auto-generated captions. I'll use a temp directory and download the .vtt or .srt, then extract the text. Let me use yt-dlp with --write-auto-subs --skip-download --sub-langs en --convert-subs srt, or better yet download as plain text. Actually, to get plain text, the easiest is to download the .vtt and then strip the timing. Or I can use --dump-json with subtitles. Let me do: yt-dlp --write-auto-subs --skip-download --sub-langs en --convert-subs srt -o "/tmp/%(id)s.%(ext)s" "https://..." Then I'll have an SRT file I can parse. Or I could use the json3 format which is JSON and easier to parse. Actually, the simplest might be to use yt-dlp --print "%(subtitles.?:0:1000)s" but that's complex. Let me just download the auto-subs as .srt and then process it.
{
"command": "cd /tmp && yt-dlp --write-auto-subs --skip-download --sub-langs en --convert-subs srt -o \"%(id)s.%(ext)s\" \"https://www.youtube.com/watch?v=Do_LjDsisIE\""
}Output from command in shell 8ab642:
WARNING: Your yt-dlp version (2025.12.08) is older than 90 days!
It is strongly recommended to always use the latest version.
You installed yt-dlp with pip or using the wheel from PyPi; Use that to update.
To suppress this warning, add --no-update to your command/config.
[youtube] Extracting URL: https://www.youtube.com/watch?v=Do_LjDsisIE
[youtube] Do_LjDsisIE: Downloading webpage
[youtube] Do_LjDsisIE: Downloading tv client config
[youtube] Do_LjDsisIE: Downloading player dd53c628-main
[youtube] Do_LjDsisIE: Downloading tv player API JSON
[youtube] Do_LjDsisIE: Downloading android sdkless player API JSON
WARNING: [youtube] Do_LjDsisIE: Some tv client https formats have been skipped as they are missing a url. YouTube may have enabled the SABR-only or Server-Side Ad Placement experiment for the current session. See https://github.com/yt-dlp/yt-dlp/issues/12482 for more details
[youtube] [jsc:deno] Solving JS challenges using deno
WARNING: [youtube] [jsc] Remote components challenge solver script (deno) and NPM package (deno) were skipped. These may be required to solve JS challenges. You can enable these downloads with --remote-components ejs:github (recommended) or --remote-components ejs:npm , respectively. For more information and alternatives, refer to https://github.com/yt-dlp/yt-dlp/wiki/EJS
WARNING: [youtube] Do_LjDsisIE: n challenge solving failed: Some formats may be missing. Ensure you have a supported JavaScript runtime and challenge solver script distribution installed. Review any warnings presented before this message. For more details, refer to https://github.com/yt-dlp/yt-dlp/wiki/EJS
WARNING: [youtube] Do_LjDsisIE: Some web client https formats have been skipped as they are missing a url. YouTube is forcing SABR streaming for this client. See https://github.com/yt-dlp/yt-dlp/issues/12482 for more details
[info] Do_LjDsisIE: Downloading subtitles: en
[info] Do_LjDsisIE: Downloading 1 format(s): 401+251
[info] Writing video subtitles to: Do_LjDsisIE.en.vtt
[download] Destination: Do_LjDsisIE.en.vtt
[download] 1.00KiB at Unknown B/s (00:00:00)
[download] 3.00KiB at Unknown B/s (00:00:00)
[download] 7.00KiB at Unknown B/s (00:00:00)
[download] 15.00KiB at 3.90MiB/s (00:00:00)
[download] 31.00KiB at 2.26MiB/s (00:00:00)
[download] 63.00KiB at 3.03MiB/s (00:00:00)
[download] 127.00KiB at 3.82MiB/s (00:00:00)
[download] 206.82KiB at 4.79MiB/s (00:00:00)
[download] 100% of 206.82KiB in 00:00:00 at 1.30MiB/s
[SubtitlesConvertor] Converting subtitles
Deleting original file Do_LjDsisIE.en.vtt (pass -k to keep)
Exit code: 0The SRT file was downloaded. It says "Deleting original file Do_LjDsisIE.en.vtt" and converted. But it says destination was Do_LjDsisIE.en.vtt. Hmm, the conversion might have created Do_LjDsisIE.en.srt. Let me check.
{
"command": "ls -la /tmp/Do_LjDsisIE*"
}Output from command in shell f2efd2: -rw-r--r-- 1 root1 wheel 110463 Jul 13 21:20 /tmp/Do_LjDsisIE.en.srt Exit code: 0
I have the SRT file. Now I need to extract the text from it. I can use a Python one-liner or sed/awk to strip timing and subtitle numbers. Then I'll read the transcript. Since it could be long, I should probably process it. Let me convert SRT to plain text. I'll use python to parse it and output plain text without duplicates. Actually, I can just use a simple sed command to remove the timing lines and numbers, then use the transcript. But SRT format has: 1 00:00:00,000 --> 00:00:02,000 Text line 1 2 ... To get plain text, remove lines that are empty, numeric, or contain "-->". Let me use Python to parse SRT properly and join lines.
{
"command": "cd /tmp && python3 -c \"\nimport re\nwith open('Do_LjDsisIE.en.srt') as f:\n text = f.read()\n# Parse SRT entries\nentries = re.split(r'\\n\\s*\\n', text.strip())\nlines = []\nfor entry in entries:\n # Remove index and timing lines\n parts = entry.split('\\n')\n # Skip first line (index) and second line (timing)\n content = '\\n'.join(parts[2:])\n # Remove <b> etc tags\n content = re.sub(r'<[^>]+>', '', content)\n lines.append(content.strip())\n# Remove duplicate consecutive lines (repeated captions)\nresult = []\nprev = None\nfor line in lines:\n if line != prev and line:\n result.append(line)\n prev = line\nprint('\\n'.join(result))\n\" > /tmp/Do_LjDsisIE.transcript.txt\nwc -l /tmp/Do_LjDsisIE.transcript.txt"
}Output from command in shell 940615:
1770 /tmp/Do_LjDsisIE.transcript.txt
Exit code: 0The transcript is 1770 lines. That might be a lot to read fully, but the rule says "do not name the session until after reading and understanding the full YouTube video transcript" and "get the autogenerated captions to do this". So I should read the transcript. But it might be too large to fit. Let me check the size and read it in chunks. Also, I should get the title of the video and metadata to understand context. Let me get the title and view metadata.
{
"command": "cd /tmp && yt-dlp --print \"%(title)s\\n%(uploader)s\\n%(duration_string)s\\n%(description)s\" --skip-download \"https://www.youtube.com/watch?v=Do_LjDsisIE\""
}Output from command in shell ea0b26:
WARNING: Your yt-dlp version (2025.12.08) is older than 90 days!
It is strongly recommended to always use the latest version.
You installed yt-dlp with pip or using the wheel from PyPi; Use that to update.
To suppress this warning, add --no-update to your command/config.
WARNING: [youtube] [jsc] Remote components challenge solver script (deno) and NPM package (deno) were skipped. These may be required to solve JS challenges. You can enable these downloads with --remote-components ejs:github (recommended) or --remote-components ejs:npm , respectively. For more information and alternatives, refer to https://github.com/yt-dlp/yt-dlp/wiki/EJS
WARNING: [youtube] Do_LjDsisIE: n challenge solving failed: Some formats may be missing. Ensure you have a supported JavaScript runtime and challenge solver script distribution installed. Review any warnings presented before this message. For more details, refer to https://github.com/yt-dlp/yt-dlp/wiki/EJS
The One Discipline That Made Me a Billionaire by Age 30 | Lucy Guo, Passes\nEO\n19:19\nMeet Lucy Guo, Founder & CEO of Passes and Co-Founder of ScaleAI, who became the youngest self-made female billionaire.
What's the secret behind all these impressive titles? How has her life changed since becoming a billionaire? In this interview, we discovered that Lucy is more than just her accolades. She's an entrepreneur driven by positivity, self-confidence, and hard work. From dropping out of college to co-founding Scale AI and building Passes, Lucy shares the real lessons she’s learned through countless challenges.
00:00 Intro
02:16 The Mindset That Made the Youngest Self-Made Billionaire
05:14 Why I Dropped Out and Stopped Being the "Good Girl"
06:12 The No.1 Rule That Makes You Take Risks
07:01 EO Partner Highlight: EO x Lovable
08:04 What I Learned at Snap
09:57 Leaving Snap to Found Scale AI
11:54 Most Painful Failure
12:49 Principle 1- Impact drives people
13:17 Principle 2- Do not avoid IC work
14:08 Principle 3. Choose grit over genius
14:49 Principle 4. Be Kind
15:20 Don't Build If You're Not Obsessed
17:44 Be Everyone's Cheerleader
🔗 Read the full transcription of Lucy’s interview: https://www.eomag.io/article/passes-lucy-guo?utm_source=youtube&utm_medium=description
✨EO Partner Highlight: EO x Lovable✨
📍The promo code EO20YT mentioned in the video has now expired, but you can still explore Lovable here: https://lovable.dev/
EO stands for Entrepreneur& Opportunities. As we're looking to feature more inspiring stories of entrepreneurs all over the world, don't hesitate to contact us at partner@eoeoeo.net
X | @eostudi0
LinkedIn | @EO STUDIO
Instagram | @eostudio.official
Newsletter | https://www.eomag.io/subscribe?utm_source=youtube&utm_medium=description
Exit code: 0Good. The video is "The One Discipline That Made Me a Billionaire by Age 30 | Lucy Guo, Passes" from EO. It's 19:19 long. The transcript is 1770 lines. I need to read it. The file is about 110KB? Wait SRT is 110KB, transcript should be a bit smaller. Let me check size and read it. Since it's long, I'll use the read tool with offset to read in chunks. But I need to read it all to understand. I can use read with no limit? Default is 20000 chars. 1770 lines could be ~100KB. Let me read it.
{
"command": "wc -c /tmp/Do_LjDsisIE.transcript.txt"
}Output from command in shell b3bdf0: 67382 /tmp/Do_LjDsisIE.transcript.txt Exit code: 0
67KB. Read tool default limit is 20000 chars, so I'll need to read it in multiple chunks. Let me read it all. I can read with limit 20000 at a time and offsets. But to be efficient, maybe I can use a python script to summarize? No, the rule says I need to read and understand the full transcript. But I can read it as chunks. However, as an AI, I can process the text. The tool output limit may cause issues. But I need to actually read it. Let me read the transcript in chunks. I'll use read tool.
{
"file_path": "/tmp/Do_LjDsisIE.transcript.txt",
"offset": 1,
"limit": 500
}<file-view path="/tmp/Do_LjDsisIE.transcript.txt" start_line="1" end_line="500" total_lines="1770"> 1|My daily routine is essentially waking 2|My daily routine is essentially waking 3|up between like 5:30 a.m. to 6 o'clock 4|up between like 5:30 a.m. to 6 o'clock 5|up between like 5:30 a.m. to 6 o'clock 6|a.m. every day. And I quite literally 7|a.m. every day. And I quite literally 8|a.m. every day. And I quite literally 9|just roll out of bed, then I go straight 10|just roll out of bed, then I go straight 11|just roll out of bed, then I go straight 12|to Berries. And one thing about me is I 13|to Berries. And one thing about me is I 14|to Berries. And one thing about me is I 15|literally got my house specifically 16|literally got my house specifically 17|literally got my house specifically 18|because it's 5 minutes away from Berries 19|because it's 5 minutes away from Berries 20|because it's 5 minutes away from Berries 21|and 5 minutes from the office. So I can 22|and 5 minutes from the office. So I can 23|and 5 minutes from the office. So I can 24|reduce my commute and I don't really 25|reduce my commute and I don't really 26|reduce my commute and I don't really 27|need a car, which is awesome. I shower 28|need a car, which is awesome. I shower 29|need a car, which is awesome. I shower 30|and I hit work. Afterwards, I'm usually 31|and I hit work. Afterwards, I'm usually 32|and I hit work. Afterwards, I'm usually 33|just in like backtoback meetings. I try 34|just in like backtoback meetings. I try 35|just in like backtoback meetings. I try 36|to sometimes block off time because 37|to sometimes block off time because 38|to sometimes block off time because 39|[music] like I need to like be in Figma 40|[music] like I need to like be in Figma 41|[music] like I need to like be in Figma 42|and like actually get feedback on design 43|and like actually get feedback on design 44|and like actually get feedback on design 45|because I'm usually working until maybe 46|because I'm usually working until maybe 47|because I'm usually working until maybe 48|like 8 o'clock, nine o'clock. I'll get 49|like 8 o'clock, nine o'clock. I'll get 50|like 8 o'clock, nine o'clock. I'll get 51|dinner, then I'll go back to work, and 52|dinner, then I'll go back to work, and 53|dinner, then I'll go back to work, and 54|then um I'll fall asleep sometime 55|then um I'll fall asleep sometime 56|then um I'll fall asleep sometime 57|between like 11:00 p.m. to 1:00 a.m. 58|between like 11:00 p.m. to 1:00 a.m. 59|between like 11:00 p.m. to 1:00 a.m. 60|depending on the day, and then repeat. 61|depending on the day, and then repeat. 62|depending on the day, and then repeat. 63|You know, in YC, they tell you you 64|You know, in YC, they tell you you 65|You know, in YC, they tell you you 66|should only be doing three things, which 67|should only be doing three things, which 68|should only be doing three things, which 69|is like working out, talking to 70|is like working out, talking to 71|is like working out, talking to 72|customers, and building. I see like why 73|customers, and building. I see like why 74|customers, and building. I see like why 75|working out is so important because 76|working out is so important because 77|working out is so important because 78|[music] it puts you on a schedule, tests 79|[music] it puts you on a schedule, tests 80|[music] it puts you on a schedule, tests 81|your discipline. like no matter how 82|your discipline. like no matter how 83|your discipline. like no matter how 84|shitty I'm feeling, I will still get up 85|shitty I'm feeling, I will still get up 86|shitty I'm feeling, I will still get up 87|and go out and work out because I know 88|and go out and work out because I know 89|and go out and work out because I know 90|I'm going to feel better and have more 91|I'm going to feel better and have more 92|I'm going to feel better and have more 93|energy to be better at my job the rest 94|energy to be better at my job the rest 95|energy to be better at my job the rest 96|of the day. So why my life looks like it 97|of the day. So why my life looks like it 98|of the day. So why my life looks like it 99|is today, but like don't sit still 100|is today, but like don't sit still 101|is today, but like don't sit still 102|essentially. I don't waste time 103|essentially. I don't waste time 104|essentially. I don't waste time 105|scrolling [music] through Tik Tok, 106|scrolling [music] through Tik Tok, 107|scrolling [music] through Tik Tok, 108|watching TV, watching movies, etc. And I 109|watching TV, watching movies, etc. And I 110|watching TV, watching movies, etc. And I 111|think by not sitting still, I've been 112|think by not sitting still, I've been 113|think by not sitting still, I've been 114|able to really be efficient with my time 115|able to really be efficient with my time 116|able to really be efficient with my time 117|and [music] invest it in things that 118|and [music] invest it in things that 119|and [music] invest it in things that 120|make me happy. 121|make me happy. 122|make me happy. 123|Hi, I'm Lucy Glow. I am the founder of 124|Hi, I'm Lucy Glow. I am the founder of 125|Hi, I'm Lucy Glow. I am the founder of 126|Scale AI and passes back in capital 127|Scale AI and passes back in capital 128|Scale AI and passes back in capital 129|Capital and HFZ. I angel invest. I've 130|Capital and HFZ. I angel invest. I've 131|Capital and HFZ. I angel invest. I've 132|invested in over a 100 different 133|invested in over a 100 different 134|invested in over a 100 different 135|companies. Um, and I'm excited to chat 136|companies. Um, and I'm excited to chat 137|companies. Um, and I'm excited to chat 138|with you guys today. 139|with you guys today. 140|with you guys today. 141|I think in terms of like how it's 142|I think in terms of like how it's 143|I think in terms of like how it's 144|potentially changed my life. Um, my DMs 145|potentially changed my life. Um, my DMs 146|potentially changed my life. Um, my DMs 147|are popping. [laughter] 148|are popping. [laughter] 149|are popping. [laughter] 150|Not life-changing, but it's been cool. I 151|Not life-changing, but it's been cool. I 152|Not life-changing, but it's been cool. I 153|mean, I think overall probably just like 154|mean, I think overall probably just like 155|mean, I think overall probably just like 156|what makes me happy. Um, everyone's 157|what makes me happy. Um, everyone's 158|what makes me happy. Um, everyone's 159|like, "Okay, cool. Like what are you 160|like, "Okay, cool. Like what are you 161|like, "Okay, cool. Like what are you 162|buying with your money, etc." But like 163|buying with your money, etc." But like 164|buying with your money, etc." But like 165|at the end of the day like what makes me 166|at the end of the day like what makes me 167|at the end of the day like what makes me 168|happy is like what drives every single 169|happy is like what drives every single 170|happy is like what drives every single 171|thing I do. Um whether it's like you 172|thing I do. Um whether it's like you 173|thing I do. Um whether it's like you 174|know building passes because it makes me 175|know building passes because it makes me 176|know building passes because it makes me 177|happy because it provides challenges in 178|happy because it provides challenges in 179|happy because it provides challenges in 180|my life but I also get to like you know 181|my life but I also get to like you know 182|my life but I also get to like you know 183|change people's lives. So at passes were 184|change people's lives. So at passes were 185|change people's lives. So at passes were 186|building infrastructure for creators to 187|building infrastructure for creators to 188|building infrastructure for creators to 189|monetize their brand. So I think when 190|monetize their brand. So I think when 191|monetize their brand. So I think when 192|you look at the largest creators they 193|you look at the largest creators they 194|you look at the largest creators they 195|really are like unicorns. For example 196|really are like unicorns. For example 197|really are like unicorns. For example 198|Kim Kardashian built skims. Logan Paul 199|Kim Kardashian built skims. Logan Paul 200|Kim Kardashian built skims. Logan Paul 201|built Prime. Mr. Beast with Fastables. 202|built Prime. Mr. Beast with Fastables. 203|built Prime. Mr. Beast with Fastables. 204|I'm excited for us to eventually build a 205|I'm excited for us to eventually build a 206|I'm excited for us to eventually build a 207|[music] unicorn creator. 208|I think I got suspended from 209|I think I got suspended from 210|kindergarten to be quite honest. I think 211|kindergarten to be quite honest. I think 212|kindergarten to be quite honest. I think 213|it came from like me telling the teacher 214|it came from like me telling the teacher 215|it came from like me telling the teacher 216|that what we were learning was dumb. But 217|that what we were learning was dumb. But 218|that what we were learning was dumb. But 219|if you think about it, like my parents 220|if you think about it, like my parents 221|if you think about it, like my parents 222|were trying to teach me like I was going 223|were trying to teach me like I was going 224|were trying to teach me like I was going 225|to like abacus competitions like 226|to like abacus competitions like 227|to like abacus competitions like 228|multiplication, division, etc. back in 229|multiplication, division, etc. back in 230|multiplication, division, etc. back in 231|like kindergarten. And in school they 232|like kindergarten. And in school they 233|like kindergarten. And in school they 234|were literally like here's the alphabet, 235|were literally like here's the alphabet, 236|were literally like here's the alphabet, 237|right? Um, and I was just very bored as 238|right? Um, and I was just very bored as 239|right? Um, and I was just very bored as 240|a child. So, I was always trying to 241|a child. So, I was always trying to 242|a child. So, I was always trying to 243|figure out like different things to do. 244|figure out like different things to do. 245|figure out like different things to do. 246|I was like learning stuff on my own. 247|I was like learning stuff on my own. 248|I was like learning stuff on my own. 249|Specifically, like the stuff I learned 250|Specifically, like the stuff I learned 251|Specifically, like the stuff I learned 252|was to like make money. But eventually, 253|was to like make money. But eventually, 254|was to like make money. But eventually, 255|I discovered my love for product and I 256|I discovered my love for product and I 257|I discovered my love for product and I 258|was like, "Oh, this is actually really 259|was like, "Oh, this is actually really 260|was like, "Oh, this is actually really 261|fun." Um, but you could see glimpses of 262|fun." Um, but you could see glimpses of 263|fun." Um, but you could see glimpses of 264|it where like, you know, I tried to 265|it where like, you know, I tried to 266|it where like, you know, I tried to 267|start my own virtual pet site after 268|start my own virtual pet site after 269|start my own virtual pet site after 270|being addicted to Neopets. I was playing 271|being addicted to Neopets. I was playing 272|being addicted to Neopets. I was playing 273|a lot of online video games. I was 274|a lot of online video games. I was 275|a lot of online video games. I was 276|figuring out how to start my own online 277|figuring out how to start my own online 278|figuring out how to start my own online 279|arcade game website. I mean, I think 280|arcade game website. I mean, I think 281|arcade game website. I mean, I think 282|what really shaped how I'm an 283|what really shaped how I'm an 284|what really shaped how I'm an 285|entrepreneur today is that through like 286|entrepreneur today is that through like 287|entrepreneur today is that through like 288|the early stages of me like making 289|the early stages of me like making 290|the early stages of me like making 291|money, my parents found all of my hidden 292|money, my parents found all of my hidden 293|money, my parents found all of my hidden 294|cash and would take it away. So then I 295|cash and would take it away. So then I 296|cash and would take it away. So then I 297|was like, I have to like figure out how 298|was like, I have to like figure out how 299|was like, I have to like figure out how 300|they don't take away cash. PayPal had 301|they don't take away cash. PayPal had 302|they don't take away cash. PayPal had 303|come out and then you could just go like 304|come out and then you could just go like 305|come out and then you could just go like 306|buy a Visa debit card, open up a PayPal 307|buy a Visa debit card, open up a PayPal 308|buy a Visa debit card, open up a PayPal 309|account and that's when I started 310|account and that's when I started 311|account and that's when I started 312|learning how to make money on the 313|learning how to make money on the 314|learning how to make money on the 315|internet and then that's when I got 316|internet and then that's when I got 317|internet and then that's when I got 318|curious about building my own websites 319|curious about building my own websites 320|curious about building my own websites 321|and then like that kind of led to 322|and then like that kind of led to 323|and then like that kind of led to 324|hackathons and then I would say like the 325|hackathons and then I would say like the 326|hackathons and then I would say like the 327|turning point of like real 328|turning point of like real 329|turning point of like real 330|entrepreneurship and like wanting to 331|entrepreneurship and like wanting to 332|entrepreneurship and like wanting to 333|build lasting companies like more than 334|build lasting companies like more than 335|build lasting companies like more than 336|just bots, right? Um was at these 337|just bots, right? Um was at these 338|just bots, right? Um was at these 339|hackathons where suddenly I was exposed 340|hackathons where suddenly I was exposed 341|hackathons where suddenly I was exposed 342|to startup world and I was like wow I 343|to startup world and I was like wow I 344|to startup world and I was like wow I 345|can build apps that like millions of 346|can build apps that like millions of 347|can build apps that like millions of 348|people use this is really really cool. 349|people use this is really really cool. 350|people use this is really really cool. 351|Both my parents are absolutely 352|Both my parents are absolutely 353|Both my parents are absolutely 354|brilliant. They're both technical. I 355|brilliant. They're both technical. I 356|brilliant. They're both technical. I 357|think it was interesting because they 358|think it was interesting because they 359|think it was interesting because they 360|actually really discouraged me from 361|actually really discouraged me from 362|actually really discouraged me from 363|pursuing a technical field because they 364|pursuing a technical field because they 365|pursuing a technical field because they 366|kind of imagined like my place as a 367|kind of imagined like my place as a 368|kind of imagined like my place as a 369|woman was to get married and pop out 370|woman was to get married and pop out 371|woman was to get married and pop out 372|grandchildren, but they still wanted me 373|grandchildren, but they still wanted me 374|grandchildren, but they still wanted me 375|in an intelligent environment to find an 376|in an intelligent environment to find an 377|in an intelligent environment to find an 378|intelligent partner. I think I ended up 379|intelligent partner. I think I ended up 380|intelligent partner. I think I ended up 381|pursuing it almost by accident. Um, I 382|pursuing it almost by accident. Um, I 383|pursuing it almost by accident. Um, I 384|thought I was going to be a chemical 385|thought I was going to be a chemical 386|thought I was going to be a chemical 387|engineer because I was like like 388|engineer because I was like like 389|engineer because I was like like 390|chemistry was my favorite subject. like 391|chemistry was my favorite subject. like 392|chemistry was my favorite subject. like 393|I loved AP chemistry and I was very good 394|I loved AP chemistry and I was very good 395|I loved AP chemistry and I was very good 396|at it. But when I I ended up on this 397|at it. But when I I ended up on this 398|at it. But when I I ended up on this 399|website, College Confidential, like I 400|website, College Confidential, like I 401|website, College Confidential, like I 402|need help with my college applications 403|need help with my college applications 404|need help with my college applications 405|and um there's this random stranger who 406|and um there's this random stranger who 407|and um there's this random stranger who 408|literally looked at my extracurriculars 409|literally looked at my extracurriculars 410|literally looked at my extracurriculars 411|and it was like you're an idiot. If you 412|and it was like you're an idiot. If you 413|and it was like you're an idiot. If you 414|want to get into best college, just 415|want to get into best college, just 416|want to get into best college, just 417|apply for computer science and I was 418|apply for computer science and I was 419|apply for computer science and I was 420|like, I guess that makes sense. So 421|like, I guess that makes sense. So 422|like, I guess that makes sense. So 423|that's actually like kind of how I just 424|that's actually like kind of how I just 425|that's actually like kind of how I just 426|landed in computer science. My college 427|landed in computer science. My college 428|landed in computer science. My college 429|days are like I was going to a lot of 430|days are like I was going to a lot of 431|days are like I was going to a lot of 432|hackathons. So [music] like you know 433|hackathons. So [music] like you know 434|hackathons. So [music] like you know 435|every few weeks M hacks hack MIT quite 436|every few weeks M hacks hack MIT quite 437|every few weeks M hacks hack MIT quite 438|literally every hackathon I like was 439|literally every hackathon I like was 440|literally every hackathon I like was 441|[music] like I'm going to go to and then 442|[music] like I'm going to go to and then 443|[music] like I'm going to go to and then 444|I made a lot of friends and I say this 445|I made a lot of friends and I say this 446|I made a lot of friends and I say this 447|because like I might be biased but um 448|because like I might be biased but um 449|because like I might be biased but um 450|like when I was first hiring like the 451|like when I was first hiring like the 452|like when I was first hiring like the 453|first people I went to were the friends 454|first people I went to were the friends 455|first people I went to were the friends 456|I made in [music] college and they 457|I made in [music] college and they 458|I made in [music] college and they 459|didn't even ask any questions which is 460|didn't even ask any questions which is 461|didn't even ask any questions which is 462|concerning. They definitely should have 463|concerning. They definitely should have 464|concerning. They definitely should have 465|asked how much their equity [music] was 466|asked how much their equity [music] was 467|asked how much their equity [music] was 468|worth, but um they were just like, 469|worth, but um they were just like, 470|worth, but um they were just like, 471|"Yeah, like we'd love to come work with 472|"Yeah, like we'd love to come work with 473|"Yeah, like we'd love to come work with 474|you." YOLO. Right. And that was cuz 475|you." YOLO. Right. And that was cuz 476|you." YOLO. Right. And that was cuz 477|there was that trust that was gained in 478|there was that trust that was gained in 479|there was that trust that was gained in 480|[music] college. When you're building 481|[music] college. When you're building 482|[music] college. When you're building 483|your next company, um your network is 484|your next company, um your network is 485|your next company, um your network is 486|your net worth and like you're going to 487|your net worth and like you're going to 488|your net worth and like you're going to 489|be able to hire the friends that you 490|be able to hire the friends that you 491|be able to hire the friends that you 492|made in college and you know they're 493|made in college and you know they're 494|made in college and you know they're 495|good. 496|good. 497|good. 498|I I think if I didn't have a rebellious 499|I I think if I didn't have a rebellious 500|I I think if I didn't have a rebellious </file-view>
I see the transcript has many duplicate lines because the SRT entries weren't de-duplicated properly. My Python script removed duplicate consecutive lines, but it seems each caption line is repeated. Actually, looking at the SRT extraction, each entry may have the same line repeated due to the SRT format? Wait, my Python script used re.split to split by blank lines, skipped first two lines, joined rest. But the output shows duplicate lines. This is because the SRT may have entries with duplicate text? Let me examine the SRT file. Actually, I think the issue is that YouTube's auto-captions may have each word repeated, but more likely my parsing is wrong. Let me look at the raw SRT.
{
"file_path": "/tmp/Do_LjDsisIE.en.srt",
"offset": 1,
"limit": 100
}<file-view path="/tmp/Do_LjDsisIE.en.srt" start_line="1" end_line="100" total_lines="5945"> 1|1 2|00:00:00,080 --> 00:00:01,590 3| 4|My daily routine is essentially waking 5| 6|2 7|00:00:01,590 --> 00:00:01,600 8|My daily routine is essentially waking 9| 10| 11|3 12|00:00:01,600 --> 00:00:04,150 13|My daily routine is essentially waking 14|up between like 5:30 a.m. to 6 o'clock 15| 16|4 17|00:00:04,150 --> 00:00:04,160 18|up between like 5:30 a.m. to 6 o'clock 19| 20| 21|5 22|00:00:04,160 --> 00:00:05,510 23|up between like 5:30 a.m. to 6 o'clock 24|a.m. every day. And I quite literally 25| 26|6 27|00:00:05,510 --> 00:00:05,520 28|a.m. every day. And I quite literally 29| 30| 31|7 32|00:00:05,520 --> 00:00:07,269 33|a.m. every day. And I quite literally 34|just roll out of bed, then I go straight 35| 36|8 37|00:00:07,269 --> 00:00:07,279 38|just roll out of bed, then I go straight 39| 40| 41|9 42|00:00:07,279 --> 00:00:08,950 43|just roll out of bed, then I go straight 44|to Berries. And one thing about me is I 45| 46|10 47|00:00:08,950 --> 00:00:08,960 48|to Berries. And one thing about me is I 49| 50| 51|11 52|00:00:08,960 --> 00:00:10,709 53|to Berries. And one thing about me is I 54|literally got my house specifically 55| 56|12 57|00:00:10,709 --> 00:00:10,719 58|literally got my house specifically 59| 60| 61|13 62|00:00:10,719 --> 00:00:12,310 63|literally got my house specifically 64|because it's 5 minutes away from Berries 65| 66|14 67|00:00:12,310 --> 00:00:12,320 68|because it's 5 minutes away from Berries 69| 70| 71|15 72|00:00:12,320 --> 00:00:13,990 73|because it's 5 minutes away from Berries 74|and 5 minutes from the office. So I can 75| 76|16 77|00:00:13,990 --> 00:00:14,000 78|and 5 minutes from the office. So I can 79| 80| 81|17 82|00:00:14,000 --> 00:00:15,430 83|and 5 minutes from the office. So I can 84|reduce my commute and I don't really 85| 86|18 87|00:00:15,430 --> 00:00:15,440 88|reduce my commute and I don't really 89| 90| 91|19 92|00:00:15,440 --> 00:00:17,269 93|reduce my commute and I don't really 94|need a car, which is awesome. I shower 95| 96|20 97|00:00:17,269 --> 00:00:17,279 98|need a car, which is awesome. I shower 99| </file-view>
I see the issue. The SRT format has some entries with an empty line after the timing, and some entries have overlapping text. My Python script didn't handle the blank lines properly. Some entries have content on line 3 (after index, timing, blank), some have content on line 4. Also entries with very short duration (00:00:01,590 --> 00:00:01,600) contain the previous line. I need to re-parse the SRT properly. A proper SRT parser would: split entries by blank line, remove index and timing line, join remaining lines, remove HTML tags, and then deduplicate. Actually, the SRT is somewhat malformed but standard. Each entry has: - index line - timing line - (maybe blank line) - text line(s) - (maybe blank line) Because entries have a blank line at the start sometimes, my script skipped first two lines (index + timing) but the third line might be blank, and text might be on line 4. Also the text line is repeated in consecutive entries. I need to extract all text from each entry, then deduplicate at word/phrase level. Better approach: Use a proper SRT parser. Python has a library? Maybe not installed. I can write a regex parser. Or simpler: use `ffmpeg` or another tool. Actually, yt-dlp has `--print` but not useful. I can use `pysrt`? Probably not installed. Let me write a proper parser. The SRT has entries like: 1 00:00:00,080 --> 00:00:01,590 My daily routine is essentially waking Where the text is after the blank line. So for each block (split by blank lines), I should: - split by \n - remove empty lines from start and end - if first line is digits, remove it - if second line has "-->", remove it - the rest is text Then deduplicate overlapping phrases. YouTube auto-captions often have karaoke-style SRT where each new entry contains all text shown so far, with new words appended. So entries 1: "My daily routine is essentially waking", 3: "My daily routine is essentially waking\nup between like 5:30 a.m. to 6 o'clock". Actually entry 3 has both old and new line. Entry 4 has only "up between...", entry 5 has old line "up between..." + new line "a.m. every day...". So the pattern is: odd entries (1,3,5...) show current phrase + new phrase? Wait: - Entry 1: only "My daily routine is essentially waking" (duration ~1.5s) - Entry 2: only "My daily routine is essentially waking" (duration 0.01s) - Entry 3: "My daily routine is essentially waking" + "up between like 5:30 a.m. to 6 o'clock" - Entry 4: only "up between..." (0.01s) - Entry 5: "up between..." + "a.m. every day. And I quite literally" So the pattern is: entries with longer durations contain the previous line and the new line. Entries with 0.01s durations contain just the previous line (transition). To extract proper transcript, I could: - For each entry, collect all text lines. - Then process in order, tracking previous text, and only emit new words. - Or use ffmpeg to convert SRT to plain text. But the result may still be duplicated. Actually, a simpler robust method: since the video has a full transcription link at eomag.io, but we should use auto-generated captions. Alternatively, I can use yt-dlp to get the `json3` subtitle format and parse that. Or better, yt-dlp can extract the transcript to a single string via `--print` with subtitle? Not exactly. Wait, I can use yt-dlp to get the `srv1` or `json3` format which has each caption event with start time and text. The `json3` is likely cleaner. Let me download the `json3` format and parse it.
{
"command": "cd /tmp && yt-dlp --write-auto-subs --skip-download --sub-langs en --sub-format json3 -o \"%(id)s.%(ext)s\" \"https://www.youtube.com/watch?v=Do_LjDsisIE\""
}Output from command in shell a4cd2a:
WARNING: Your yt-dlp version (2025.12.08) is older than 90 days!
It is strongly recommended to always use the latest version.
You installed yt-dlp with pip or using the wheel from PyPi; Use that to update.
To suppress this warning, add --no-update to your command/config.
[youtube] Extracting URL: https://www.youtube.com/watch?v=Do_LjDsisIE
[youtube] Do_LjDsisIE: Downloading webpage
[youtube] Do_LjDsisIE: Downloading tv client config
[youtube] Do_LjDsisIE: Downloading player dd53c628-main
[youtube] Do_LjDsisIE: Downloading tv player API JSON
[youtube] Do_LjDsisIE: Downloading android sdkless player API JSON
[youtube] [jsc:deno] Solving JS challenges using deno
WARNING: [youtube] [jsc] Remote components challenge solver script (deno) and NPM package (deno) were skipped. These may be required to solve JS challenges. You can enable these downloads with --remote-components ejs:github (recommended) or --remote-components ejs:npm , respectively. For more information and alternatives, refer to https://github.com/yt-dlp/yt-dlp/wiki/EJS
WARNING: [youtube] Do_LjDsisIE: n challenge solving failed: Some formats may be missing. Ensure you have a supported JavaScript runtime and challenge solver script distribution installed. Review any warnings presented before this message. For more details, refer to https://github.com/yt-dlp/yt-dlp/wiki/EJS
[info] Do_LjDsisIE: Downloading subtitles: en
[info] Do_LjDsisIE: Downloading 1 format(s): 139
[info] Writing video subtitles to: Do_LjDsisIE.en.json3
[download] Destination: Do_LjDsisIE.en.json3
[download] 1.00KiB at Unknown B/s (00:00:00)
[download] 3.00KiB at Unknown B/s (00:00:00)
[download] 7.00KiB at 6.29MiB/s (00:00:00)
[download] 15.00KiB at 3.95MiB/s (00:00:00)
[download] 31.00KiB at 2.45MiB/s (00:00:00)
[download] 63.00KiB at 2.60MiB/s (00:00:00)
[download] 127.00KiB at 2.83MiB/s (00:00:00)
[download] 255.00KiB at 3.81MiB/s (00:00:00)
[download] 438.48KiB at 4.71MiB/s (00:00:00)
[download] 100% of 438.48KiB in 00:00:00 at 2.04MiB/s
Exit code: 0Good, json3 downloaded. Let me parse it.
{
"file_path": "/tmp/Do_LjDsisIE.en.json3",
"offset": 1,
"limit": 200
}<file-view path="/tmp/Do_LjDsisIE.en.json3" start_line="1" end_line="200" total_lines="24246">
1|{
2| "wireMagic": "pb3",
3| "pens": [ {
4|
5| } ],
6| "wsWinStyles": [ {
7|
8| }, {
9| "mhModeHint": 2,
10| "juJustifCode": 0,
11| "sdScrollDir": 3
12| } ],
13| "wpWinPositions": [ {
14|
15| }, {
16| "apPoint": 6,
17| "ahHorPos": 20,
18| "avVerPos": 100,
19| "rcRows": 2,
20| "ccCols": 40
21| } ],
22| "events": [ {
23| "tStartMs": 0,
24| "dDurationMs": 1136440,
25| "id": 1,
26| "wpWinPosId": 1,
27| "wsWinStyleId": 1
28| }, {
29| "tStartMs": 80,
30| "dDurationMs": 4080,
31| "wWinId": 1,
32| "segs": [ {
33| "utf8": "My",
34| "acAsrConf": 0
35| }, {
36| "utf8": " daily",
37| "tOffsetMs": 240,
38| "acAsrConf": 0
39| }, {
40| "utf8": " routine",
41| "tOffsetMs": 480,
42| "acAsrConf": 0
43| }, {
44| "utf8": " is",
45| "tOffsetMs": 720,
46| "acAsrConf": 0
47| }, {
48| "utf8": " essentially",
49| "tOffsetMs": 960,
50| "acAsrConf": 0
51| }, {
52| "utf8": " waking",
53| "tOffsetMs": 1200,
54| "acAsrConf": 0
55| } ]
56| }, {
57| "tStartMs": 1590,
58| "dDurationMs": 2570,
59| "wWinId": 1,
60| "aAppend": 1,
61| "segs": [ {
62| "utf8": "\n"
63| } ]
64| }, {
65| "tStartMs": 1600,
66| "dDurationMs": 3920,
67| "wWinId": 1,
68| "segs": [ {
69| "utf8": "up",
70| "acAsrConf": 0
71| }, {
72| "utf8": " between",
73| "tOffsetMs": 160,
74| "acAsrConf": 0
75| }, {
76| "utf8": " like",
77| "tOffsetMs": 400,
78| "acAsrConf": 0
79| }, {
80| "utf8": " 5:30",
81| "tOffsetMs": 640,
82| "acAsrConf": 0
83| }, {
84| "utf8": " a.m.",
85| "tOffsetMs": 1360,
86| "acAsrConf": 0
87| }, {
88| "utf8": " to",
89| "tOffsetMs": 1680,
90| "acAsrConf": 0
91| }, {
92| "utf8": " 6",
93| "tOffsetMs": 1920,
94| "acAsrConf": 0
95| }, {
96| "utf8": " o'clock",
97| "tOffsetMs": 2079,
98| "acAsrConf": 0
99| } ]
100| }, {
101| "tStartMs": 4150,
102| "dDurationMs": 1370,
103| "wWinId": 1,
104| "aAppend": 1,
105| "segs": [ {
106| "utf8": "\n"
107| } ]
108| }, {
109| "tStartMs": 4160,
110| "dDurationMs": 3119,
111| "wWinId": 1,
112| "segs": [ {
113| "utf8": "a.m.",
114| "acAsrConf": 0
115| }, {
116| "utf8": " every",
117| "tOffsetMs": 159,
118| "acAsrConf": 0
119| }, {
120| "utf8": " day.",
121| "tOffsetMs": 400,
122| "acAsrConf": 0
123| }, {
124| "utf8": " And",
125| "tOffsetMs": 560,
126| "acAsrConf": 0
127| }, {
128| "utf8": " I",
129| "tOffsetMs": 720,
130| "acAsrConf": 0
131| }, {
132| "utf8": " quite",
133| "tOffsetMs": 880,
134| "acAsrConf": 0
135| }, {
136| "utf8": " literally",
137| "tOffsetMs": 1119,
138| "acAsrConf": 0
139| } ]
140| }, {
141| "tStartMs": 5510,
142| "dDurationMs": 1769,
143| "wWinId": 1,
144| "aAppend": 1,
145| "segs": [ {
146| "utf8": "\n"
147| } ]
148| }, {
149| "tStartMs": 5520,
150| "dDurationMs": 3440,
151| "wWinId": 1,
152| "segs": [ {
153| "utf8": "just",
154| "acAsrConf": 0
155| }, {
156| "utf8": " roll",
157| "tOffsetMs": 160,
158| "acAsrConf": 0
159| }, {
160| "utf8": " out",
161| "tOffsetMs": 400,
162| "acAsrConf": 0
163| }, {
164| "utf8": " of",
165| "tOffsetMs": 560,
166| "acAsrConf": 0
167| }, {
168| "utf8": " bed,",
169| "tOffsetMs": 720,
170| "acAsrConf": 0
171| }, {
172| "utf8": " then",
173| "tOffsetMs": 1040,
174| "acAsrConf": 0
175| }, {
176| "utf8": " I",
177| "tOffsetMs": 1200,
178| "acAsrConf": 0
179| }, {
180| "utf8": " go",
181| "tOffsetMs": 1359,
182| "acAsrConf": 0
183| }, {
184| "utf8": " straight",
185| "tOffsetMs": 1520,
186| "acAsrConf": 0
187| } ]
188| }, {
189| "tStartMs": 7269,
190| "dDurationMs": 1691,
191| "wWinId": 1,
192| "aAppend": 1,
193| "segs": [ {
194| "utf8": "\n"
195| } ]
196| }, {
197| "tStartMs": 7279,
198| "dDurationMs": 3440,
199| "wWinId": 1,
200| "segs": [ {
</file-view>The json3 format has events with segments. Each event is a word or phrase with timing. To get the transcript, I should concatenate all the `utf8` fields in order, respecting `aAppend`? Actually `aAppend: 1` indicates that the event appends to the current caption window (adds a newline). The segments within an event are the words. So I can just concatenate all `utf8` values from all events (skipping events with only newline) to get the full transcript. But I need to be careful: events with `aAppend: 1` and `\n` are just newlines, they don't contain words. So I can iterate events and for each, iterate segs and append `utf8` if it's not just `\n`. Actually, the events seem to be per phrase or word. Concatenating all `utf8` should give a continuous transcript with line breaks where `\n` appears. Since words already have leading spaces (e.g., " daily", " routine"), concatenating will produce readable text. Some events have `\n` only, which adds line breaks. Some events may have actual newlines. I'll concatenate all `utf8` values and then clean up extra spaces. Let me write a Python script to parse json3 and output clean transcript.
{
"command": "cd /tmp && python3 -c \"\nimport json, re\nwith open('Do_LjDsisIE.en.json3') as f:\n data = json.load(f)\nout = []\nfor ev in data.get('events', []):\n for seg in ev.get('segs', []):\n txt = seg.get('utf8', '')\n if txt is None:\n continue\n out.append(txt)\ntext = ''.join(out)\n# Replace literal newlines and multiple spaces\ntext = re.sub(r' +', ' ', text)\ntext = re.sub(r'\\n+', '\\n', text)\n# Wrap long lines? Just output as-is.\nwith open('Do_LjDsisIE.clean.txt', 'w') as f:\n f.write(text)\nprint(len(text))\n\" && wc -l /tmp/Do_LjDsisIE.clean.txt && wc -c /tmp/Do_LjDsisIE.clean.txt"
}Output from command in shell 4d8c2c:
22596
594 /tmp/Do_LjDsisIE.clean.txt
22596 /tmp/Do_LjDsisIE.clean.txt
Exit code: 0Good, 22,596 chars, 594 lines. Much cleaner. Let me read it.
{
"file_path": "/tmp/Do_LjDsisIE.clean.txt",
"offset": 1,
"limit": 200
}<file-view path="/tmp/Do_LjDsisIE.clean.txt" start_line="1" end_line="200" total_lines="595"> 1|My daily routine is essentially waking 2|up between like 5:30 a.m. to 6 o'clock 3|a.m. every day. And I quite literally 4|just roll out of bed, then I go straight 5|to Berries. And one thing about me is I 6|literally got my house specifically 7|because it's 5 minutes away from Berries 8|and 5 minutes from the office. So I can 9|reduce my commute and I don't really 10|need a car, which is awesome. I shower 11|and I hit work. Afterwards, I'm usually 12|just in like backtoback meetings. I try 13|to sometimes block off time because 14|[music] like I need to like be in Figma 15|and like actually get feedback on design 16|because I'm usually working until maybe 17|like 8 o'clock, nine o'clock. I'll get 18|dinner, then I'll go back to work, and 19|then um I'll fall asleep sometime 20|between like 11:00 p.m. to 1:00 a.m. 21|depending on the day, and then repeat. 22|You know, in YC, they tell you you 23|should only be doing three things, which 24|is like working out, talking to 25|customers, and building. I see like why 26|working out is so important because 27|[music] it puts you on a schedule, tests 28|your discipline. like no matter how 29|shitty I'm feeling, I will still get up 30|and go out and work out because I know 31|I'm going to feel better and have more 32|energy to be better at my job the rest 33|of the day. So why my life looks like it 34|is today, but like don't sit still 35|essentially. I don't waste time 36|scrolling [music] through Tik Tok, 37|watching TV, watching movies, etc. And I 38|think by not sitting still, I've been 39|able to really be efficient with my time 40|and [music] invest it in things that 41|make me happy. 42|Hi, I'm Lucy Glow. I am the founder of 43|Scale AI and passes back in capital 44|Capital and HFZ. I angel invest. I've 45|invested in over a 100 different 46|companies. Um, and I'm excited to chat 47|with you guys today. 48|I think in terms of like how it's 49|potentially changed my life. Um, my DMs 50|are popping. [laughter] 51|Not life-changing, but it's been cool. I 52|mean, I think overall probably just like 53|what makes me happy. Um, everyone's 54|like, "Okay, cool. Like what are you 55|buying with your money, etc." But like 56|at the end of the day like what makes me 57|happy is like what drives every single 58|thing I do. Um whether it's like you 59|know building passes because it makes me 60|happy because it provides challenges in 61|my life but I also get to like you know 62|change people's lives. So at passes were 63|building infrastructure for creators to 64|monetize their brand. So I think when 65|you look at the largest creators they 66|really are like unicorns. For example 67|Kim Kardashian built skims. Logan Paul 68|built Prime. Mr. Beast with Fastables. 69|I'm excited for us to eventually build a 70|[music] unicorn creator. 71|I think I got suspended from 72|kindergarten to be quite honest. I think 73|it came from like me telling the teacher 74|that what we were learning was dumb. But 75|if you think about it, like my parents 76|were trying to teach me like I was going 77|to like abacus competitions like 78|multiplication, division, etc. back in 79|like kindergarten. And in school they 80|were literally like here's the alphabet, 81|right? Um, and I was just very bored as 82|a child. So, I was always trying to 83|figure out like different things to do. 84|I was like learning stuff on my own. 85|Specifically, like the stuff I learned 86|was to like make money. But eventually, 87|I discovered my love for product and I 88|was like, "Oh, this is actually really 89|fun." Um, but you could see glimpses of 90|it where like, you know, I tried to 91|start my own virtual pet site after 92|being addicted to Neopets. I was playing 93|a lot of online video games. I was 94|figuring out how to start my own online 95|arcade game website. I mean, I think 96|what really shaped how I'm an 97|entrepreneur today is that through like 98|the early stages of me like making 99|money, my parents found all of my hidden 100|cash and would take it away. So then I 101|was like, I have to like figure out how 102|they don't take away cash. PayPal had 103|come out and then you could just go like 104|buy a Visa debit card, open up a PayPal 105|account and that's when I started 106|learning how to make money on the 107|internet and then that's when I got 108|curious about building my own websites 109|and then like that kind of led to 110|hackathons and then I would say like the 111|turning point of like real 112|entrepreneurship and like wanting to 113|build lasting companies like more than 114|just bots, right? Um was at these 115|hackathons where suddenly I was exposed 116|to startup world and I was like wow I 117|can build apps that like millions of 118|people use this is really really cool. 119|Both my parents are absolutely 120|brilliant. They're both technical. I 121|think it was interesting because they 122|actually really discouraged me from 123|pursuing a technical field because they 124|kind of imagined like my place as a 125|woman was to get married and pop out 126|grandchildren, but they still wanted me 127|in an intelligent environment to find an 128|intelligent partner. I think I ended up 129|pursuing it almost by accident. Um, I 130|thought I was going to be a chemical 131|engineer because I was like like 132|chemistry was my favorite subject. like 133|I loved AP chemistry and I was very good 134|at it. But when I I ended up on this 135|website, College Confidential, like I 136|need help with my college applications 137|and um there's this random stranger who 138|literally looked at my extracurriculars 139|and it was like you're an idiot. If you 140|want to get into best college, just 141|apply for computer science and I was 142|like, I guess that makes sense. So 143|that's actually like kind of how I just 144|landed in computer science. My college 145|days are like I was going to a lot of 146|hackathons. So [music] like you know 147|every few weeks M hacks hack MIT quite 148|literally every hackathon I like was 149|[music] like I'm going to go to and then 150|I made a lot of friends and I say this 151|because like I might be biased but um 152|like when I was first hiring like the 153|first people I went to were the friends 154|I made in [music] college and they 155|didn't even ask any questions which is 156|concerning. They definitely should have 157|asked how much their equity [music] was 158|worth, but um they were just like, 159|"Yeah, like we'd love to come work with 160|you." YOLO. Right. And that was cuz 161|there was that trust that was gained in 162|[music] college. When you're building 163|your next company, um your network is 164|your net worth and like you're going to 165|be able to hire the friends that you 166|made in college and you know they're 167|good. 168|I I think if I didn't have a rebellious 169|nature, I probably would have been the 170|good girl that my parents wanted me to 171|be and stayed in college, right? And 172|like I knew I was hurting them when 173|going to um do this, but I think that 174|like part of the rebellious nature was I 175|want to prove you wrong and show you 176|that I can forge my own path and I will 177|be successful without college. Um so I'm 178|sorry I'm hurting you right now, but 179|like it'll be worth it at the end of the 180|day. Um I don't think I ever doubted it. 181|And what helped me commit was just 182|[music] thinking like this is not a risk 183|at all. Um like college is always going 184|to be there versus this is a once in 185|a-lifetime opportunity and [music] I'm 186|going to be learning a lot. I feel like 187|I'm not learning practical skills in 188|college and everything that I've learned 189|was through [music] like hackathons, 190|right? So, if I leave college and I dive 191|myself in the startup world, I am going 192|to learn significantly more and be able 193|to like actually build [music] products 194|that millions of people use versus 195|learning theoretical skills that like 196|I'm probably not going to use in my job. 197|Um, so I was pretty like dead set on it 198|early on. [music] I think my conviction 199|was to optimize learning. So, I've 200|always like that's been my number one </file-view>
Good, now I have a clean transcript. I need to read the rest to understand the full video. Let me continue reading.
{
"file_path": "/tmp/Do_LjDsisIE.clean.txt",
"offset": 200,
"limit": 200
}<file-view path="/tmp/Do_LjDsisIE.clean.txt" start_line="200" end_line="399" total_lines="595"> 200|always like that's been my number one 201|rule in life. Like even if you are 202|leaving something, it feels like a risk. 203|It's not that much of a risk if you're 204|optimizing learning because your 205|knowledge is always going to be worth 206|something. And the more knowledge you 207|gain, the more valuable you are later on 208|in life. I think the reaction I got from 209|most people was, "You're a 210|idiot." From my parents to my friends to 211|like people who didn't know me. Um 212|people were just like, [music] "Yo, like 213|what are you doing?" A lot of it stem 214|from the fact that I actually only had 215|four CS classes left to graduate, like 216|one year left, right? So I think the 217|like risk mental calculation didn't 218|really make sense [music] for others but 219|for me I was like what am I I'm losing 220|time right but like what's the worst 221|case scenario I take a job what's the 222|second worst case scenario I go back to 223|college I chose like to [music] optimize 224|for that learning and like optimize for 225|being in a network of like extremely 226|ambitious intelligent people 227|as a founder you already know ideas are 228|the easy part it's the execution 229|actually building the product that slows 230|everything down. That's where Lovable 231|comes in. It's not just an AI tool. It's 232|your ondemand engineering team. Simply 233|describe your idea. Lovable then builds 234|a full front-end, backend, and database, 235|so you can launch real productionready 236|software without writing code. It's 237|already powering over a 100,000 new 238|products a day, helping 2.5 million 239|builders turn ideas into software just 240|by describing what they want. No devs, 241|no delays, no excuses. 242|They're launching in weeks, not months. 243|And guess [music] what? These teams are 244|still tiny. In fact, team EO is also 245|using Lovable to build their upcoming 246|EOS school platform, and we're loving 247|it. If you're a non-technical founder or 248|just want to build without bottlenecks, 249|try Lovable today for free. Use the 250|promo code EO2YT to get 20% off your 251|first purchase of the Lovable Pro plan. 252|I think at SNAP I really learned how to 253|think much bigger. Um, like when I first 254|joined Snap, I didn't realize like kind 255|of the vision Evan had for Snap. And it 256|was very inspiring seeing like his ideas 257|on how he would eventually compete with 258|Amazon, um, compete with Google, etc., 259|which I think like no one even to this 260|day thinks about Snap competing with 261|Amazon or Google. But to see him think 262|so innovatively about product and not 263|care about like that AB test portion of 264|things taught me just a lot about like 265|the importance of being open-minded and 266|like product driven as well and really 267|about like perfection. Um I the lesson I 268|really took away from that is like just 269|get to 90%. You don't need to spend 3 270|years going back and forth on a design. 271|Um, but also like I remember there was 272|like that zoom out the snap mapaps 273|feature that like no one at the company 274|wanted to build because everyone thought 275|it was so dumb and he was just like kept 276|on insisting it and it turns out like he 277|was right at the end of the day, right? 278|Um, it ended up like being a very 279|natural UX that people love and use. 280|That really almost tells you also that 281|like people don't really know what they 282|want in the consumer field, right? Like 283|it might sound like the dumbest thing, 284|but you really just have to like kind of 285|give it a go. Um hence like why he was 286|probably just like you know just 287|thinking eventually like don't think 288|about like all this like research 289|feedback etc because um if he did that 290|like that would have never been shipped 291|but like once it got into the hands of 292|people um they realized like oh I 293|actually I wanted this but no one could 294|have told [music] you that. When you 295|come up with a product spend like 2 296|weeks designing it and then ship it and 297|see how it does and [music] if there's 298|traction then go and iterate and improve 299|on it. But people will use products they 300|want to use even if it's super buggy and 301|the UX is shitty for the most part. So 302|um it's better to ship that like 90% 303|with like no user research and then 304|double down on the product like if it 305|gets traction versus wasting like months 306|doing all this research etc and shipping 307|it and like it might [music] fall flat. 308|I mean I would say it's like risk 309|benefit analysis and then am I learning 310|right? So for example like when I was at 311|Snap I was giving up a few million 312|dollars but I also was like that's not 313|life-changing for me. So, I would rather 314|optimize learning and also have the 315|opportunity to make life-changing money. 316|And if I don't make that life-changing 317|money, um, at least I learned a bunch of 318|like new knowledge and I'll be able to 319|like hop to my next job and make more. 320|And all I'm losing is like what, one to 321|two years because that's the amount of 322|time it would take to like figure out 323|like am I going to like be able to build 324|this company unless you're crazy. Like I 325|have friends that like, you know, 326|pivoted for like six years and then 327|finally found something which like those 328|are obviously the founders I love 329|investing in. If I were making like a 330|hund00 million at SNAP, like would I 331|have made that jump? Like I'm going to 332|be realistic. Probably not. I probably 333|been like that's life-changing money. It 334|is worth staying four years for $100 335|million before moving on. Um so, um I 336|would say like those two things are like 337|my criteria when choosing like when to 338|make moves. 339|We were both working at Kora and like I 340|think it was literally over lunch we 341|were like, "Huh, should we start a 342|company together one day?" I was like, 343|"Yeah, let's do it." And then over like 344|winter break, we started iterating on 345|ideas. So um we came up with a horrible 346|one. Class passed for clubbing and you 347|know it got traction but you know it's 348|bad when it's only VCs that are 349|subscribing to your service. And then we 350|were like okay let's go do something 351|more meaningful. So um we pivoted to Ava 352|which is um a healthcare app that we 353|help you find like the best doctors for 354|specific procedures. So it's like oh you 355|need a root canal. Here is like the best 356|person to give you a root canal. Um, 357|also a terrible idea, but the idea ended 358|up getting us into YC. Um, I think 359|mostly because I knew we were going to 360|get into YC [music] because I was like 361|talking to um, YC partners before the 362|interview and after the interview and 363|they were just like, "Oh yeah, like 364|you'll get in because like [music] you 365|guys are both super smart. You're 366|obviously at SNAP and a teal fellow and 367|he is like you know MIT." So yeah, we 368|uh, entered YC [music] and then the idea 369|was terrible. So we ended up pivoting to 370|scale. 371|I think like generalized my most painful 372|failures have been trusting people that 373|I shouldn't have trusted which is just 374|not great. Um especially in the 375|workplace for example like you might 376|trust an employee and then like when 377|they underperform and you need to fire 378|them they decide to try to extort you. 379|It's just like you need to make sure 380|that like be like you don't want people 381|where like you constantly feel like 382|they're going to like stab you in the 383|back on figuring out on who to [music] 384|trust. This is very cliche but go with 385|your gut. Um, but outside of going with 386|your gut, like you should definitely 387|just do like reference checks on both 388|like [music] friends, like people that 389|know them or like people that aren't 390|even friends, you know, like 391|acquaintances cuz like you're probably 392|going to get a more honest answer from 393|acquaintances. [music] I think the best 394|way to build trust again is like be 395|extremely authentic. But at the end of 396|the day, if like [music] trust is 397|broken, like sometimes it can't be 398|repaired and that's when you know that 399|like you might just need to separate and </file-view>
I see lines 200-399. This covers her principles, time at Snap, leaving Snap, co-founding Scale AI, and failures/trust. I need to continue reading to line 595.
{
"file_path": "/tmp/Do_LjDsisIE.clean.txt",
"offset": 400,
"limit": 200
}<file-view path="/tmp/Do_LjDsisIE.clean.txt" start_line="400" end_line="595" total_lines="595"> 400|maturity is understanding that. 401|I think the team self motivates themsel 402|but it's innovation when they see that 403|like we can ship a product in two weeks 404|and it takes a large company like that's 405|stagnant like years to ship a product 406|that's extremely exciting for the team 407|especially when like you tie that 408|product to actual revenue numbers and I 409|think it's just constantly emphasizing 410|that and I think that's why a lot of 411|engineers choose to work at startups 412|instead of larger companies because they 413|feel like they have more impact. Impact 414|is what motivates them because they're 415|not going to get that same impact at a 416|large company. leaders need to be doing 417|IC work as well because the only way you 418|can judge people on like their actual 419|job is if you do the job yourself and 420|like really it's all hands- on deck like 421|nothing is too big to be done. So for 422|example like everyone was on intercom 423|when we got a pilot for like a new 424|customer [music] quite literally we'd 425|have a war room with like engineers like 426|me etc. And like we'd all be labeling 427|that data and making sure it's perfect. 428|We really emphasize like nothing is 429|below you. you're going to do what's 430|best for the company. And if like your 431|time is best being spent like helping 432|close this deal, then like you're going 433|to do that. Let's say you're running 434|customer support and you're not doing 435|the customer support tickets yourself, 436|you're not going [music] to know if your 437|customer support reps are answering them 438|fast enough, giving the correct answers 439|or like if you know if it's not obvious 440|answer like should they know this the 441|answer to this or is it like something 442|more obscure? And you really only get 443|that like muscle if you you do the work. 444|I think the number one thing I look for 445|is like intelligence and hard work 446|because you can be the smartest person 447|ever, but if you don't work hard, you're 448|going to not impact a company. [music] 449|Hard work is extremely important to me, 450|especially cuz like with creators, we're 451|very creator first. That's our culture. 452|Which means that like because creators 453|can be 24/7. We need to be 24/7. [music] 454|Like if a creator hits me up at like 2 455|am like about a bug, I'm proud to say 456|that I can call my engineers like and 457|[music] one of them will pick up and fix 458|that bug at 2 am, which is incredibly 459|important in an industry like this. Um, 460|and [music] I look for people that are 461|willing to like go the extra mile. 462|That's not saying like you have to work 463|every weekend, but like if needed, like 464|are you going to show up? Yeah. I mean, 465|I think as a leader, one of my like 466|biggest values in life is just kindness. 467|It's like you're wanting the best for 468|everyone, right? Like if [music] someone 469|wins, awesome. Like if I lose an amazing 470|engineer, um I still want to help 471|[music] them like succeed. If I lose a 472|crappy engineer, I still want to help 473|them succeed. For me, I'm like I think 474|I'm very giving as like both a person 475|and a leader. So it's like, okay, like 476|you know, I give you chances. I like try 477|to you're not working out in your role, 478|but I think that you're hardworking and 479|smart. I try to find like a role that 480|like you [music] might be better suited 481|for. 482|So I would say it was a mix of things. 483|Um, I think what inspired me was 484|actually living with all the founders. 485|Like their energy definitely grew on me 486|and I wanted these founders to start 487|bases, but no one would do it. And 488|around the same time, I had a friend who 489|[music] asked me to be CEO of his AI 490|company. And I kind of sat on it like I 491|kind of got excited, right? I was like, 492|"Oh my god, like I feel ready to be a 493|founder again." Uh cuz I think a lot of 494|the reason why I wasn't I didn't do it 495|sooner was cuz I was scared of failure. 496|But I finally got to a point where I was 497|like, you know what? If I fail, 498|whatever, it doesn't matter. like my 499|life is going to be fine. most people 500|don't build two successful startups like 501|don't be scared of failure and just go 502|and [music] do the thing right and I 503|didn't feel like doing an AI company 504|again to be quite honest I was like I 505|did B2B enterprise I know how it works 506|but I would rather like if I'm doing a 507|second company and like risking failure 508|at least have fun doing it and I had 509|always been attracted consumer you can 510|see this with like a bunch of different 511|like random apps I had made Snap was 512|like one of the most fun experiences of 513|my life so uh I like just knew I wanted 514|to do consumer and I had been sitting on 515|this idea idea for a little bit. So, I 516|was like, "Okay, like let's see some 517|competitors out there." And really, you 518|could only find like Patreon. [music] 519|They've existed for a decade and I saw 520|like an opportunity in the market. Um, I 521|was friends with a lot of creators. Um, 522|I lightly asked my creator friends like, 523|"Hey, if I were to build this, would 524|they you use it?" So, you know, like 525|selling before building, they're like, 526|"Absolutely." I was like, "Great." And 527|then I just talked to my LPs and they 528|were like, "Here is money. Um, [music] 529|go build." So, um, it all happened 530|really quickly. like I would say within 531|the span of like 24 hours of my friend 532|asking [music] me to like be CEO of his 533|AI company and me having like 534|commitments. So the future I see for the 535|creator economy I think that like AI is 536|really going to help creators be [music] 537|co-pilots. I see more creators becoming 538|entrepreneurs. More kids want to be 539|creators than ever before. So I think 540|the creator economy is going to grow but 541|also everyone like creator marketing 542|spend is going up in like pretty much 543|every country. And I think this is due 544|to the fact people are realizing like 545|their audience and like the like reach 546|you get is much stronger spending it on 547|creator marketing versus on ads. So, 548|[music] I think because of this, um, 549|we're going to see more creators work so 550|closely with brands that they're 551|essentially considered co-founders or 552|start their own brands, which is why I 553|think like unicorn creators are possible 554|and like we're excited to help them 555|either get access the best brands and 556|like get that equity for long-term 557|generational wealth or if it makes sense 558|to like help them build that next 559|product. 560|I think if 20-year-old me could go back 561|in time, I would stop complaining about 562|some of the people I work with and just 563|start really like getting to know them 564|better and uplifting them. Why do I 565|think so? Um, I think that like in 566|general most companies are very gossipy, 567|right? So, if you're complaining about 568|people, like it just gets around and 569|then it drives them away obviously 570|because they hear about complaints like 571|no one wants to be talked badly about. 572|And I think like the best work 573|environments and the most positive ones 574|are when you are like everyone's 575|cheerleader. So, uh I think I would have 576|like spent more effort like seeing 577|[music] the good in people. This is 578|going to sound very LA, but I feel like 579|I have like manifested everything in my 580|life. And because I'm like focus so much 581|on positive energy, I feel like as long 582|as I like put in that hard work to like 583|bring my dreams to life and like 584|surround myself with positive people, 585|like anything is possible. so cheesy, 586|but I really like do believe that's 587|true. And like I have like the best 588|friends in the world that, you know, are 589|constantly around me and encouraging me 590|and like really doing whatever they can 591|to help. Like they'll go out of my way. 592|They're like truly incredible. And I 593|think that like when I have like such 594|positive people around me, like I only 595|look at like upside </file-view>
I have read the full transcript. Now I can summarize it. The user just pasted a YouTube link, so I should provide a summary. The rule says to use yt-dlp to summarize the video with autogenerated captions. I've done that. I should also not name the session, but the session naming is probably automatic? The rule says "if asked to summarize a YouTube video, do not name the session until after reading and understanding the full YouTube video transcript". Since I've now read the transcript, I can summarize. I don't need to explicitly name the session; that's a system thing. I should just provide a concise summary. The video is an interview with Lucy Guo, founder of Scale AI and Passes, discussing her journey, mindset, and principles. The title: "The One Discipline That Made Me a Billionaire by Age 30". The key themes are: - Daily routine: wake up 5:30-6 AM, workout at Berries, work long hours, don't sit still, avoid time-wasters. - Mindset: optimize for learning, don't be the "good girl", take risks, rebellious nature. - Dropout story: left college with 4 CS classes left because she felt she learned more in the startup world. - Snap experience: learned to think bigger, product-driven, ship to 90%, consumer products. - Scale AI: co-founded with Alexandr Wang after working at Quora/Snap, pivoted from ClassPass for clubbing to Ava (healthcare) to Scale. - Passes: creator economy infrastructure, building a unicorn creator, AI as co-pilot. - Most painful failure: trusting wrong people, firing/extortion. - Principles: 1. Impact drives people (engineers choose startups for impact) 2. Do not avoid IC work (leaders do the job to judge and help) 3. Choose grit over genius (intelligence + hard work) 4. Be kind / everyone's cheerleader - Don't build if you're not obsessed. - Be everyone's cheerleader / positive energy. Also there was an ad for Lovable (EO partner). I should present a summary. Keep it concise but cover main points. Use the title from the metadata and key sections. The user didn't ask a question, just pasted the link. So I should summarize.
Here is a summary of the video based on the auto-generated captions:
The One Discipline That Made Me a Billionaire by Age 30 | Lucy Guo, Passes
Interview with Lucy Guo — co-founder of Scale AI, founder & CEO of Passes, angel investor.
Lucy Guo attributes much of her success to one discipline: relentless motion — never "sitting still." She structures her life to maximize productive time and learning, avoids passive entertainment, and treats physical fitness as the anchor that enforces daily discipline.
Daily routine
Mindset & risk-taking
From Snap to Scale AI
Building Passes
Four leadership principles
Final message