The CLI supporting the planning, post-production and publishing workflow of the Angularidades podcast.
See more Angularidades episodes on YouTube »
- Interactive Fallback Menu: Running
angularidadeswithout arguments opens an elegant dashboard guide. - Scaffolding: Create folder structures and fetch initial captions (
angularidades scaffold [episode], aliases:new,create). - Publishing: Sync metadata and transcripts to YouTube (
angularidades publish [episode], alias:sync). - Dry Run: Safely test configuration and preview YouTube payloads (
angularidades publish [episode] --dry-runor-d). - Diagnostics: Run connectivity, credentials, and alignment checks (
angularidades doctor [episode], aliases:check,validate). - Latest Resolver: Use
latestas the episode parameter (e.g.latestresolves to the most recently created episode folder automatically).
.agents/: Specialized AI agents for planning and publishing.bin/: CLI entry points.episodes/: Work directory organized by episode number.scripts/: Internal logic and YouTube API integrations.
To get started with the Angularidades CLI pipeline, simply install the dependencies:
pnpm installThe setup script will automatically run post-installation to link the angularidades CLI tool globally on your system and set up shell autocompletion. (If you ever need to re-run the setup manually, you can use pnpm run setup).
To enable tab-completion for commands and episode directories, add the autocompletion script to your shell configuration (e.g. ~/.zshrc):
# Load angularidades autocompletions
source <(angularidades completion)Then reload your shell session (source ~/.zshrc). Now, typing angularidades publish [TAB] will dynamically suggest commands, aliases, episode directories, and the latest keyword!
The project provides a unified CLI tool: angularidades. If you haven't linked it yet, you can also use pnpm run youtube:<command> (e.g., pnpm run youtube:publish --dry-run).
- Determine the upcoming episode's Topic or Guest Profile.
- Run the Planner agent pointing to
.agents/planner/system_prompt.md. - Save the output to
episodes/<episode-number>/0_planner/script.md. - Use the generated
script.mdto conduct the interview via teleprompter.
- Scaffolding: Create the episode structure and metadata. It will automatically fetch captions from YouTube:
angularidades scaffold <episode> # e.g., angularidades scaffold 89 (aliases: new, create)
- Diagnostics: Run the Doctor check to ensure all metadata and credentials are ready:
angularidades doctor <episode> # e.g., angularidades doctor latest (aliases: check, validate)
- AI Processing: Instruct the
@publisherAI Agent (your AI Assistant) to process the episode using the planner script and YouTube captions as inputs. The agent will place all generated files (titles, descriptions, LinkedIn posts, and corrected transcripts) into the2_publisher/folder. - Verification: Run a dry-run to verify the payload that will be sent to YouTube:
angularidades publish <episode> --dry-run # e.g., angularidades publish latest -d
- Publishing: Push the metadata and transcripts to the YouTube API:
Note: If no episode is provided, the CLI will prompt you to select one. Running the CLI without a command at all (
angularidades publish <episode> # e.g., angularidades publish latest (alias: sync)
angularidades) will launch the visual overview selection guide.
To verify local changes and prevent regressions, you can run the test suites:
# Run all tests once
pnpm test
# Run tests in interactive watch mode
pnpm run test:watchTo run only the E2E CLI integration test suite:
pnpm run test:e2eThe pipeline automatically attempts to download the existing YouTube captions (giving priority to Spanish ASR or manual tracks) and saves them to 1_recording/captions.sbv. This serves as a source of truth for the Publisher Agent, eliminating manual copy-pasting.
To translate captions to English block-by-block while maximizing token efficiency and ensuring perfect synchronization, use the internal translate-helper.js script:
node scripts/publisher/translate-helper.js dump <episode>Splits the captions into 1_recording/blocks.json and clean text arrays of 100 blocks each (e.g. 1_recording/chunk-0-99.json, chunk-100-199.json, etc.) without timestamps. This minimizes token consumption during translation.
Translate the JSON text arrays to English using the AI agent, saving each chunk as 2_publisher/trans-X-Y.json (e.g., 2_publisher/trans-0-99.json).
node scripts/publisher/translate-helper.js build <episode>Stitches the translated English JSON chunks back together using the original timestamps, performing strict block count validation.
node scripts/publisher/translate-helper.js validate <episode>Displays a side-by-side diagnostic report of Spanish source text and English translations to pinpoint alignment issues.
Note for Contributors: If you are a standard contributor you do not need to continue with this section. You can use the
pnpm run youtube:dry-runcommand to test your changes locally. This full OAuth setup is exclusively for core maintainers of the Angularidades project who have explicit "Editor" or "Manager" permissions on the Angularidades YouTube channel and need to update the CI/CD secrets or publish locally.
To run the automated pnpm run youtube:publish script, you must configure Google Cloud OAuth2 credentials. The project utilizes a "Desktop App" OAuth flow to securely generate a Refresh Token.
1. Create Google Cloud Credentials:
- Go to the Google Cloud Console.
- Enable the YouTube Data API v3 in your project.
- Configure the OAuth consent screen (External). Your email should be added under the Test users section to avoid
Error 403: access_denied. - Go to Credentials > Create Credentials > OAuth client ID.
- Select Application type: Desktop App (This avoids
redirect_urimismatch errors). - Copy the generated Client ID and Client Secret.
2. Generate the Refresh Token:
- Copy
.env.exampleto.envand paste your Client ID and Secret. - Run the included authentication helper script:
node scripts/auth-helper.js
- Click the provided URL, authorize the app, and copy the
codefrom the browser's address bar. - Paste the code back into your terminal to receive your Refresh Token.
- Save all three values in your
.envfile for local use, and upload them to GitHub Secrets for CI/CD automation.











