Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Screenwright banner

Screenwright

An AI-powered tool for creating tutorial videos from your iOS app codebase. Analyzes your Expo or React Native project and generates video content plans, then orchestrates the full video creation pipeline.

Features

  • AI Content Generation: Analyzes your codebase to generate tutorial video ideas
  • Video Pipeline: Plan → Script → Record → Composite
  • Smart Onboarding: Automatically checks and installs required tools
  • API Key Management: Securely stores OpenRouter and ElevenLabs API keys
  • Project Configuration: .instructions folder for project-specific settings

Installation

# Clone and installcd instructionsCreator/cli
bun install
# Optional: Link globally for use anywhere
bun link

Prerequisites

  • macOS with Xcode installed
  • Xcode Command Line Tools: xcode-select --install
  • Node.js 18+ and Bun (for running from source)
  • FFmpeg (auto-installed during onboarding)
  • AXe CLI (auto-installed during onboarding)
  • API keys from OpenRouter and ElevenLabs (configured during onboarding)

Quick Start

1. Onboard (First Time Setup)

screenwright onboard

This will:

  • Check for required tools (Xcode, FFmpeg, AXe CLI)
  • Install missing tools automatically
  • Prompt for API keys (OpenRouter, ElevenLabs)
  • Store configuration in ~/.screenwright/config.json

Example:

$ screenwright onboard
Tool Check Results:
✓ Xcode (/Applications/Xcode.app)
✓ simctl
✓ FFmpeg (7.1.1)
✗ AXe CLI
Install: npm install -g @axe-devtools/cli
Installing Missing Tools...
✔ AXe CLI installed
==================================================
API Keys Configuration
==================================================
Screenwright uses AI services for video creation.
OpenRouter API Key (for AI planning and script generation)
Get your key at: https://openrouter.ai/keys
This is used for: Planning, Script generation
Cost: ~$0.01 per video (varies by model)
Enter OpenRouter API Key (or press Enter to skip): [sk-or-...]
ElevenLabs API Key (for AI voiceover generation)
Get your key at: https://elevenlabs.io/app/settings/api-keys
This is used for: Voiceover audio generation
Cost: ~$0.30 per 1k characters (varies by voice)
Enter ElevenLabs API Key (or press Enter to skip): [xxxxxxxx...]
✔ API keys saved!
Onboarding Complete!
Next steps:
screenwright init Initialize a project
screenwright content generate Generate content ideas

Onboarding Options:

  • --skip-tools - Skip tool checking and only configure API keys
  • --skip-keys - Skip API key configuration
  • --force - Re-run onboarding even if already completed

2. Initialize Your Project

cd /path/to/your/project
screenwright init

This creates a .instructions folder in your project root with:

  • config.json - Your project configuration
  • .gitignore - Ensures cache files aren't committed
  • videos.json - Stores content ideas and videos

Commands

screenwright onboard

Set up Screenwright - check tools, install dependencies, and configure API keys.

screenwright onboard [options]

Options:

  • -s, --skip-tools - Skip tool checking and only configure API keys
  • -k, --skip-keys - Skip API key configuration
  • -f, --force - Re-run onboarding even if already completed

screenwright config:keys

Show or update API keys configuration.

screenwright config:keys # Show API key status
screenwright config:keys --update # Update API keys

screenwright init

Initialize the .instructions folder in your project.

screenwright init [--force]

Options:

  • -f, --force - Reinitialize even if .instructions already exists

What it does:

  • Detects your project type (Expo, React Native, or native iOS)
  • Creates .instructions/config.json with default preferences
  • Creates .instructions/.gitignore to exclude cache files

screenwright config

Manage .instructions configuration.

screenwright config # Show configuration summary
screenwright config --show # Show full configuration
screenwright config --get <key># Get a configuration value
screenwright config --set <key>=<value># Set a configuration value

screenwright info

Show information about the current project.

screenwright info

Content Commands

screenwright content generate

Generate video content ideas by analyzing your project codebase.

screenwright content generate [options]

Options:

  • -n, --max-ideas <number> - Maximum number of ideas to generate (default: 10)
  • -c, --max-categories <number> - Maximum number of categories (default: 3)

What it does:

  • Analyzes your project structure to identify features and screens
  • Generates tutorial video ideas organized by category
  • Saves ideas to .instructions/videos.json

Example:

$ screenwright content generate
Generating content ideas...
✓ Generated 8 content ideas!
Generated Categories:
Getting Started
Learn the basics of using MyApp
• Getting Started with MyApp
A quick introduction to MyApp and its main features
Core Features
Learn how to use MyApp's main features • Creating a Post Learn how to create and share posts on MyApp • Searching for Content Learn how to search and find content on MyApp

screenwright content list

List all generated content ideas.

screenwright content list [options]

Options:

  • -c, --category <name> - Filter by category

Video Commands

screenwright videos

List all videos.

screenwright videos

screenwright video create <ideaId>

Create a new video from a content idea.

screenwright video create <ideaId>

screenwright video status <videoId>

Show detailed status of a video.

screenwright video status <videoId>

screenwright video plan <videoId>

Generate recording plan using AI (analyzes simulator, tests interactions).

screenwright video plan <videoId>

screenwright video script <videoId>

Generate voiceover script with precise timestamps.

screenwright video script <videoId>

screenwright video record <videoId>

Record the video on simulator.

screenwright video record <videoId>

screenwright video composite <videoId>

Combine video and audio.

screenwright video composite <videoId>

screenwright video all <videoId>

Run all stages (plan, script, record, composite).

screenwright video all <videoId>

This runs the complete video creation pipeline:

  1. Plan: Uses AI to analyze the simulator and generate a detailed recording plan
  2. Script: Generates a voiceover script with precise timestamps
  3. Record: Executes the recording on the simulator
  4. Composite: Combines the video with AI-generated voiceover

screenwright video delete <videoId>

Delete a video.

screenwright video delete <videoId>

Video Pipeline Architecture

The video creation system consists of four stages, each building on the previous:

Stage 1: Plan

  • AI Agent: Uses OpenRouter API with vision capabilities
  • Process:
    • Takes screenshots of the simulator
    • Lists UI elements with coordinates
    • Tests each interaction (tap, swipe, type)
    • Generates a detailed recording plan with exact coordinates
  • Output: Recording plan with setup steps and recording steps

Stage 2: Script

  • AI Agent: Uses OpenRouter API
  • Process:
    • Analyzes the recording plan
    • Generates a natural, conversational voiceover script
    • Calculates precise timestamps for each action
  • Output: Voiceover script with timestamped actions

Stage 3: Record

  • Tool: Uses AXe CLI for simulator control
  • Process:
    • Executes setup steps before recording
    • Starts screen recording
    • Executes actions at precise timestamps
    • Stops recording
  • Output: Silent video file

Stage 4: Composite

  • Tool: Uses FFmpeg
  • Process:
    • Generates AI voiceover using ElevenLabs
    • Combines video and audio
    • Outputs final video file
  • Output: Final video with voiceover

Required API Keys:

  • OPENROUTER_API_KEY - For AI agents (planner, scriptwriter)
  • ELEVENLABS_API_KEY - For voiceover generation

Configuration

Project Configuration (.instructions/config.json)

Stored in your project root:

{
"version": "1.0.0",
"projectPath": "/Users/john/my-app",
"projectType": "expo",
"createdAt": "2024-01-15T10:30:00.000Z",
"lastUpdated": "2024-01-15T10:30:00.000Z",
"preferences": {
"defaultDevice": "iPhone 15 Pro",
"defaultUseCache": true,
"defaultClean": false
}
}

Global Configuration (~/.screenwright/config.json)

API keys stored globally:

{
"openrouterApiKey": "sk-or-...",
"elevenlabsApiKey": "...",
"onboardedAt": "2024-01-15T10:30:00.000Z"
}

SDK

Screenwright also provides an SDK for programmatic access:

npm install @screenwright/sdk
import*asscreenwrightfrom'@screenwright/sdk';// Generate content ideasconstcategories=awaitscreenwright.generateAndSaveContentIdeas(projectPath,{maxIdeas: 10,maxCategories: 3});// Create a videoconstvideo=awaitscreenwright.createVideo(projectPath,idea);// Check video statusconststatus=awaitscreenwright.getVideo(projectPath,videoId);

Development

Building from Source

# Build SDKcd sdk && bun run build
# Build CLIcd cli && bun run build

Running in Development Mode

cd cli
bun run dev

Project Structure

instructionsCreator/
├── sdk/ # @screenwright/sdk
│ ├── src/
│ │ ├── index.ts # Main exports
│ │ ├── types.ts # Core types
│ │ ├── types-video.ts # Video types
│ │ └── utils/
│ │ ├── detect.ts
│ │ ├── config.ts
│ │ ├── video-storage.ts
│ │ ├── content-generator.ts
│ │ └── onboard.ts
│ ├── dist/ # Built SDK
│ ├── package.json
│ └── tsconfig.json
└── cli/ # screenwright CLI
├── src/
│ └── cli.ts # CLI entry point (uses SDK)
├── dist/ # Built CLI
└── package.json

Workflow Example

# 1. First-time setup
screenwright onboard
# 2. Initialize projectcd my-expo-app
screenwright init
# 3. Generate content ideas
screenwright content generate
# 4. List content ideas
screenwright content list
# 5. Create a video from an idea
screenwright video create idea_xxxxx
# 6. Generate recording plan
screenwright video plan video_xxxxx
# 7. Generate script
screenwright video script video_xxxxx
# 8. Record the video
screenwright video record video_xxxxx
# 9. Composite final video
screenwright video composite video_xxxxx
# OR run all stages at once
screenwright video all video_xxxxx

Troubleshooting

"Xcode not installed" Error

xcode-select --install
xcode-select -p

"Could not detect project type" Error

Screenwright looks for specific project indicators:

  • Expo: package.json contains "expo" dependency OR app.json exists
  • React Native: package.json contains "react-native" dependency
  • Native iOS: ios/ directory contains .xcodeproj or .xcworkspace

API Key Issues

# Check API key status
screenwright config:keys
# Update API keys
screenwright config:keys --update

License

MIT

Acknowledgments

Built with:

About

Screenwright

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Screenwright banner

Screenwright

An AI-powered tool for creating tutorial videos from your iOS app codebase. Analyzes your Expo or React Native project and generates video content plans, then orchestrates the full video creation pipeline.

Features

  • AI Content Generation: Analyzes your codebase to generate tutorial video ideas
  • Video Pipeline: Plan → Script → Record → Composite
  • Smart Onboarding: Automatically checks and installs required tools
  • API Key Management: Securely stores OpenRouter and ElevenLabs API keys
  • Project Configuration: .instructions folder for project-specific settings

Installation

# Clone and installcd instructionsCreator/cli
bun install
# Optional: Link globally for use anywhere
bun link

Prerequisites

  • macOS with Xcode installed
  • Xcode Command Line Tools: xcode-select --install
  • Node.js 18+ and Bun (for running from source)
  • FFmpeg (auto-installed during onboarding)
  • AXe CLI (auto-installed during onboarding)
  • API keys from OpenRouter and ElevenLabs (configured during onboarding)

Quick Start

1. Onboard (First Time Setup)

screenwright onboard

This will:

  • Check for required tools (Xcode, FFmpeg, AXe CLI)
  • Install missing tools automatically
  • Prompt for API keys (OpenRouter, ElevenLabs)
  • Store configuration in ~/.screenwright/config.json

Example:

$ screenwright onboard
Tool Check Results:
✓ Xcode (/Applications/Xcode.app)
✓ simctl
✓ FFmpeg (7.1.1)
✗ AXe CLI
Install: npm install -g @axe-devtools/cli
Installing Missing Tools...
✔ AXe CLI installed
==================================================
API Keys Configuration
==================================================
Screenwright uses AI services for video creation.
OpenRouter API Key (for AI planning and script generation)
Get your key at: https://openrouter.ai/keys
This is used for: Planning, Script generation
Cost: ~$0.01 per video (varies by model)
Enter OpenRouter API Key (or press Enter to skip): [sk-or-...]
ElevenLabs API Key (for AI voiceover generation)
Get your key at: https://elevenlabs.io/app/settings/api-keys
This is used for: Voiceover audio generation
Cost: ~$0.30 per 1k characters (varies by voice)
Enter ElevenLabs API Key (or press Enter to skip): [xxxxxxxx...]
✔ API keys saved!
Onboarding Complete!
Next steps:
screenwright init Initialize a project
screenwright content generate Generate content ideas

Onboarding Options:

  • --skip-tools - Skip tool checking and only configure API keys
  • --skip-keys - Skip API key configuration
  • --force - Re-run onboarding even if already completed

2. Initialize Your Project

cd /path/to/your/project
screenwright init

This creates a .instructions folder in your project root with:

  • config.json - Your project configuration
  • .gitignore - Ensures cache files aren't committed
  • videos.json - Stores content ideas and videos

Commands

screenwright onboard

Set up Screenwright - check tools, install dependencies, and configure API keys.

screenwright onboard [options]

Options:

  • -s, --skip-tools - Skip tool checking and only configure API keys
  • -k, --skip-keys - Skip API key configuration
  • -f, --force - Re-run onboarding even if already completed

screenwright config:keys

Show or update API keys configuration.

screenwright config:keys # Show API key status
screenwright config:keys --update # Update API keys

screenwright init

Initialize the .instructions folder in your project.

screenwright init [--force]

Options:

  • -f, --force - Reinitialize even if .instructions already exists

What it does:

  • Detects your project type (Expo, React Native, or native iOS)
  • Creates .instructions/config.json with default preferences
  • Creates .instructions/.gitignore to exclude cache files

screenwright config

Manage .instructions configuration.

screenwright config # Show configuration summary
screenwright config --show # Show full configuration
screenwright config --get <key># Get a configuration value
screenwright config --set <key>=<value># Set a configuration value

screenwright info

Show information about the current project.

screenwright info

Content Commands

screenwright content generate

Generate video content ideas by analyzing your project codebase.

screenwright content generate [options]

Options:

  • -n, --max-ideas <number> - Maximum number of ideas to generate (default: 10)
  • -c, --max-categories <number> - Maximum number of categories (default: 3)

What it does:

  • Analyzes your project structure to identify features and screens
  • Generates tutorial video ideas organized by category
  • Saves ideas to .instructions/videos.json

Example:

$ screenwright content generate
Generating content ideas...
✓ Generated 8 content ideas!
Generated Categories:
Getting Started
Learn the basics of using MyApp
• Getting Started with MyApp
A quick introduction to MyApp and its main features
Core Features
Learn how to use MyApp's main features • Creating a Post Learn how to create and share posts on MyApp • Searching for Content Learn how to search and find content on MyApp

screenwright content list

List all generated content ideas.

screenwright content list [options]

Options:

  • -c, --category <name> - Filter by category

Video Commands

screenwright videos

List all videos.

screenwright videos

screenwright video create <ideaId>

Create a new video from a content idea.

screenwright video create <ideaId>

screenwright video status <videoId>

Show detailed status of a video.

screenwright video status <videoId>

screenwright video plan <videoId>

Generate recording plan using AI (analyzes simulator, tests interactions).

screenwright video plan <videoId>

screenwright video script <videoId>

Generate voiceover script with precise timestamps.

screenwright video script <videoId>

screenwright video record <videoId>

Record the video on simulator.

screenwright video record <videoId>

screenwright video composite <videoId>

Combine video and audio.

screenwright video composite <videoId>

screenwright video all <videoId>

Run all stages (plan, script, record, composite).

screenwright video all <videoId>

This runs the complete video creation pipeline:

  1. Plan: Uses AI to analyze the simulator and generate a detailed recording plan
  2. Script: Generates a voiceover script with precise timestamps
  3. Record: Executes the recording on the simulator
  4. Composite: Combines the video with AI-generated voiceover

screenwright video delete <videoId>

Delete a video.

screenwright video delete <videoId>

Video Pipeline Architecture

The video creation system consists of four stages, each building on the previous:

Stage 1: Plan

  • AI Agent: Uses OpenRouter API with vision capabilities
  • Process:
    • Takes screenshots of the simulator
    • Lists UI elements with coordinates
    • Tests each interaction (tap, swipe, type)
    • Generates a detailed recording plan with exact coordinates
  • Output: Recording plan with setup steps and recording steps

Stage 2: Script

  • AI Agent: Uses OpenRouter API
  • Process:
    • Analyzes the recording plan
    • Generates a natural, conversational voiceover script
    • Calculates precise timestamps for each action
  • Output: Voiceover script with timestamped actions

Stage 3: Record

  • Tool: Uses AXe CLI for simulator control
  • Process:
    • Executes setup steps before recording
    • Starts screen recording
    • Executes actions at precise timestamps
    • Stops recording
  • Output: Silent video file

Stage 4: Composite

  • Tool: Uses FFmpeg
  • Process:
    • Generates AI voiceover using ElevenLabs
    • Combines video and audio
    • Outputs final video file
  • Output: Final video with voiceover

Required API Keys:

  • OPENROUTER_API_KEY - For AI agents (planner, scriptwriter)
  • ELEVENLABS_API_KEY - For voiceover generation

Configuration

Project Configuration (.instructions/config.json)

Stored in your project root:

{
"version": "1.0.0",
"projectPath": "/Users/john/my-app",
"projectType": "expo",
"createdAt": "2024-01-15T10:30:00.000Z",
"lastUpdated": "2024-01-15T10:30:00.000Z",
"preferences": {
"defaultDevice": "iPhone 15 Pro",
"defaultUseCache": true,
"defaultClean": false
}
}

Global Configuration (~/.screenwright/config.json)

API keys stored globally:

{
"openrouterApiKey": "sk-or-...",
"elevenlabsApiKey": "...",
"onboardedAt": "2024-01-15T10:30:00.000Z"
}

SDK

Screenwright also provides an SDK for programmatic access:

npm install @screenwright/sdk
import*asscreenwrightfrom'@screenwright/sdk';// Generate content ideasconstcategories=awaitscreenwright.generateAndSaveContentIdeas(projectPath,{maxIdeas: 10,maxCategories: 3});// Create a videoconstvideo=awaitscreenwright.createVideo(projectPath,idea);// Check video statusconststatus=awaitscreenwright.getVideo(projectPath,videoId);

Development

Building from Source

# Build SDKcd sdk && bun run build
# Build CLIcd cli && bun run build

Running in Development Mode

cd cli
bun run dev

Project Structure

instructionsCreator/
├── sdk/ # @screenwright/sdk
│ ├── src/
│ │ ├── index.ts # Main exports
│ │ ├── types.ts # Core types
│ │ ├── types-video.ts # Video types
│ │ └── utils/
│ │ ├── detect.ts
│ │ ├── config.ts
│ │ ├── video-storage.ts
│ │ ├── content-generator.ts
│ │ └── onboard.ts
│ ├── dist/ # Built SDK
│ ├── package.json
│ └── tsconfig.json
└── cli/ # screenwright CLI
├── src/
│ └── cli.ts # CLI entry point (uses SDK)
├── dist/ # Built CLI
└── package.json

Workflow Example

# 1. First-time setup
screenwright onboard
# 2. Initialize projectcd my-expo-app
screenwright init
# 3. Generate content ideas
screenwright content generate
# 4. List content ideas
screenwright content list
# 5. Create a video from an idea
screenwright video create idea_xxxxx
# 6. Generate recording plan
screenwright video plan video_xxxxx
# 7. Generate script
screenwright video script video_xxxxx
# 8. Record the video
screenwright video record video_xxxxx
# 9. Composite final video
screenwright video composite video_xxxxx
# OR run all stages at once
screenwright video all video_xxxxx

Troubleshooting

"Xcode not installed" Error

xcode-select --install
xcode-select -p

"Could not detect project type" Error

Screenwright looks for specific project indicators:

  • Expo: package.json contains "expo" dependency OR app.json exists
  • React Native: package.json contains "react-native" dependency
  • Native iOS: ios/ directory contains .xcodeproj or .xcworkspace

API Key Issues

# Check API key status
screenwright config:keys
# Update API keys
screenwright config:keys --update

License

MIT

Acknowledgments

Built with:

About

Screenwright

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Screenwright banner

Screenwright

An AI-powered tool for creating tutorial videos from your iOS app codebase. Analyzes your Expo or React Native project and generates video content plans, then orchestrates the full video creation pipeline.

Features

  • AI Content Generation: Analyzes your codebase to generate tutorial video ideas
  • Video Pipeline: Plan → Script → Record → Composite
  • Smart Onboarding: Automatically checks and installs required tools
  • API Key Management: Securely stores OpenRouter and ElevenLabs API keys
  • Project Configuration: .instructions folder for project-specific settings

Installation

# Clone and installcd instructionsCreator/cli
bun install
# Optional: Link globally for use anywhere
bun link

Prerequisites

  • macOS with Xcode installed
  • Xcode Command Line Tools: xcode-select --install
  • Node.js 18+ and Bun (for running from source)
  • FFmpeg (auto-installed during onboarding)
  • AXe CLI (auto-installed during onboarding)
  • API keys from OpenRouter and ElevenLabs (configured during onboarding)

Quick Start

1. Onboard (First Time Setup)

screenwright onboard

This will:

  • Check for required tools (Xcode, FFmpeg, AXe CLI)
  • Install missing tools automatically
  • Prompt for API keys (OpenRouter, ElevenLabs)
  • Store configuration in ~/.screenwright/config.json

Example:

$ screenwright onboard
Tool Check Results:
✓ Xcode (/Applications/Xcode.app)
✓ simctl
✓ FFmpeg (7.1.1)
✗ AXe CLI
Install: npm install -g @axe-devtools/cli
Installing Missing Tools...
✔ AXe CLI installed
==================================================
API Keys Configuration
==================================================
Screenwright uses AI services for video creation.
OpenRouter API Key (for AI planning and script generation)
Get your key at: https://openrouter.ai/keys
This is used for: Planning, Script generation
Cost: ~$0.01 per video (varies by model)
Enter OpenRouter API Key (or press Enter to skip): [sk-or-...]
ElevenLabs API Key (for AI voiceover generation)
Get your key at: https://elevenlabs.io/app/settings/api-keys
This is used for: Voiceover audio generation
Cost: ~$0.30 per 1k characters (varies by voice)
Enter ElevenLabs API Key (or press Enter to skip): [xxxxxxxx...]
✔ API keys saved!
Onboarding Complete!
Next steps:
screenwright init Initialize a project
screenwright content generate Generate content ideas

Onboarding Options:

  • --skip-tools - Skip tool checking and only configure API keys
  • --skip-keys - Skip API key configuration
  • --force - Re-run onboarding even if already completed

2. Initialize Your Project

cd /path/to/your/project
screenwright init

This creates a .instructions folder in your project root with:

  • config.json - Your project configuration
  • .gitignore - Ensures cache files aren't committed
  • videos.json - Stores content ideas and videos

Commands

screenwright onboard

Set up Screenwright - check tools, install dependencies, and configure API keys.

screenwright onboard [options]

Options:

  • -s, --skip-tools - Skip tool checking and only configure API keys
  • -k, --skip-keys - Skip API key configuration
  • -f, --force - Re-run onboarding even if already completed

screenwright config:keys

Show or update API keys configuration.

screenwright config:keys # Show API key status
screenwright config:keys --update # Update API keys

screenwright init

Initialize the .instructions folder in your project.

screenwright init [--force]

Options:

  • -f, --force - Reinitialize even if .instructions already exists

What it does:

  • Detects your project type (Expo, React Native, or native iOS)
  • Creates .instructions/config.json with default preferences
  • Creates .instructions/.gitignore to exclude cache files

screenwright config

Manage .instructions configuration.

screenwright config # Show configuration summary
screenwright config --show # Show full configuration
screenwright config --get <key># Get a configuration value
screenwright config --set <key>=<value># Set a configuration value

screenwright info

Show information about the current project.

screenwright info

Content Commands

screenwright content generate

Generate video content ideas by analyzing your project codebase.

screenwright content generate [options]

Options:

  • -n, --max-ideas <number> - Maximum number of ideas to generate (default: 10)
  • -c, --max-categories <number> - Maximum number of categories (default: 3)

What it does:

  • Analyzes your project structure to identify features and screens
  • Generates tutorial video ideas organized by category
  • Saves ideas to .instructions/videos.json

Example:

$ screenwright content generate
Generating content ideas...
✓ Generated 8 content ideas!
Generated Categories:
Getting Started
Learn the basics of using MyApp
• Getting Started with MyApp
A quick introduction to MyApp and its main features
Core Features
Learn how to use MyApp's main features • Creating a Post Learn how to create and share posts on MyApp • Searching for Content Learn how to search and find content on MyApp

screenwright content list

List all generated content ideas.

screenwright content list [options]

Options:

  • -c, --category <name> - Filter by category

Video Commands

screenwright videos

List all videos.

screenwright videos

screenwright video create <ideaId>

Create a new video from a content idea.

screenwright video create <ideaId>

screenwright video status <videoId>

Show detailed status of a video.

screenwright video status <videoId>

screenwright video plan <videoId>

Generate recording plan using AI (analyzes simulator, tests interactions).

screenwright video plan <videoId>

screenwright video script <videoId>

Generate voiceover script with precise timestamps.

screenwright video script <videoId>

screenwright video record <videoId>

Record the video on simulator.

screenwright video record <videoId>

screenwright video composite <videoId>

Combine video and audio.

screenwright video composite <videoId>

screenwright video all <videoId>

Run all stages (plan, script, record, composite).

screenwright video all <videoId>

This runs the complete video creation pipeline:

  1. Plan: Uses AI to analyze the simulator and generate a detailed recording plan
  2. Script: Generates a voiceover script with precise timestamps
  3. Record: Executes the recording on the simulator
  4. Composite: Combines the video with AI-generated voiceover

screenwright video delete <videoId>

Delete a video.

screenwright video delete <videoId>

Video Pipeline Architecture

The video creation system consists of four stages, each building on the previous:

Stage 1: Plan

  • AI Agent: Uses OpenRouter API with vision capabilities
  • Process:
    • Takes screenshots of the simulator
    • Lists UI elements with coordinates
    • Tests each interaction (tap, swipe, type)
    • Generates a detailed recording plan with exact coordinates
  • Output: Recording plan with setup steps and recording steps

Stage 2: Script

  • AI Agent: Uses OpenRouter API
  • Process:
    • Analyzes the recording plan
    • Generates a natural, conversational voiceover script
    • Calculates precise timestamps for each action
  • Output: Voiceover script with timestamped actions

Stage 3: Record

  • Tool: Uses AXe CLI for simulator control
  • Process:
    • Executes setup steps before recording
    • Starts screen recording
    • Executes actions at precise timestamps
    • Stops recording
  • Output: Silent video file

Stage 4: Composite

  • Tool: Uses FFmpeg
  • Process:
    • Generates AI voiceover using ElevenLabs
    • Combines video and audio
    • Outputs final video file
  • Output: Final video with voiceover

Required API Keys:

  • OPENROUTER_API_KEY - For AI agents (planner, scriptwriter)
  • ELEVENLABS_API_KEY - For voiceover generation

Configuration

Project Configuration (.instructions/config.json)

Stored in your project root:

{
"version": "1.0.0",
"projectPath": "/Users/john/my-app",
"projectType": "expo",
"createdAt": "2024-01-15T10:30:00.000Z",
"lastUpdated": "2024-01-15T10:30:00.000Z",
"preferences": {
"defaultDevice": "iPhone 15 Pro",
"defaultUseCache": true,
"defaultClean": false
}
}

Global Configuration (~/.screenwright/config.json)

API keys stored globally:

{
"openrouterApiKey": "sk-or-...",
"elevenlabsApiKey": "...",
"onboardedAt": "2024-01-15T10:30:00.000Z"
}

SDK

Screenwright also provides an SDK for programmatic access:

npm install @screenwright/sdk
import*asscreenwrightfrom'@screenwright/sdk';// Generate content ideasconstcategories=awaitscreenwright.generateAndSaveContentIdeas(projectPath,{maxIdeas: 10,maxCategories: 3});// Create a videoconstvideo=awaitscreenwright.createVideo(projectPath,idea);// Check video statusconststatus=awaitscreenwright.getVideo(projectPath,videoId);

Development

Building from Source

# Build SDKcd sdk && bun run build
# Build CLIcd cli && bun run build

Running in Development Mode

cd cli
bun run dev

Project Structure

instructionsCreator/
├── sdk/ # @screenwright/sdk
│ ├── src/
│ │ ├── index.ts # Main exports
│ │ ├── types.ts # Core types
│ │ ├── types-video.ts # Video types
│ │ └── utils/
│ │ ├── detect.ts
│ │ ├── config.ts
│ │ ├── video-storage.ts
│ │ ├── content-generator.ts
│ │ └── onboard.ts
│ ├── dist/ # Built SDK
│ ├── package.json
│ └── tsconfig.json
└── cli/ # screenwright CLI
├── src/
│ └── cli.ts # CLI entry point (uses SDK)
├── dist/ # Built CLI
└── package.json

Workflow Example

# 1. First-time setup
screenwright onboard
# 2. Initialize projectcd my-expo-app
screenwright init
# 3. Generate content ideas
screenwright content generate
# 4. List content ideas
screenwright content list
# 5. Create a video from an idea
screenwright video create idea_xxxxx
# 6. Generate recording plan
screenwright video plan video_xxxxx
# 7. Generate script
screenwright video script video_xxxxx
# 8. Record the video
screenwright video record video_xxxxx
# 9. Composite final video
screenwright video composite video_xxxxx
# OR run all stages at once
screenwright video all video_xxxxx

Troubleshooting

"Xcode not installed" Error

xcode-select --install
xcode-select -p

"Could not detect project type" Error

Screenwright looks for specific project indicators:

  • Expo: package.json contains "expo" dependency OR app.json exists
  • React Native: package.json contains "react-native" dependency
  • Native iOS: ios/ directory contains .xcodeproj or .xcworkspace

API Key Issues

# Check API key status
screenwright config:keys
# Update API keys
screenwright config:keys --update

License

MIT

Acknowledgments

Built with:

About

Screenwright

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Screenwright banner

Screenwright

An AI-powered tool for creating tutorial videos from your iOS app codebase. Analyzes your Expo or React Native project and generates video content plans, then orchestrates the full video creation pipeline.

Features

  • AI Content Generation: Analyzes your codebase to generate tutorial video ideas
  • Video Pipeline: Plan → Script → Record → Composite
  • Smart Onboarding: Automatically checks and installs required tools
  • API Key Management: Securely stores OpenRouter and ElevenLabs API keys
  • Project Configuration: .instructions folder for project-specific settings

Installation

# Clone and installcd instructionsCreator/cli
bun install
# Optional: Link globally for use anywhere
bun link

Prerequisites

  • macOS with Xcode installed
  • Xcode Command Line Tools: xcode-select --install
  • Node.js 18+ and Bun (for running from source)
  • FFmpeg (auto-installed during onboarding)
  • AXe CLI (auto-installed during onboarding)
  • API keys from OpenRouter and ElevenLabs (configured during onboarding)

Quick Start

1. Onboard (First Time Setup)

screenwright onboard

This will:

  • Check for required tools (Xcode, FFmpeg, AXe CLI)
  • Install missing tools automatically
  • Prompt for API keys (OpenRouter, ElevenLabs)
  • Store configuration in ~/.screenwright/config.json

Example:

$ screenwright onboard
Tool Check Results:
✓ Xcode (/Applications/Xcode.app)
✓ simctl
✓ FFmpeg (7.1.1)
✗ AXe CLI
Install: npm install -g @axe-devtools/cli
Installing Missing Tools...
✔ AXe CLI installed
==================================================
API Keys Configuration
==================================================
Screenwright uses AI services for video creation.
OpenRouter API Key (for AI planning and script generation)
Get your key at: https://openrouter.ai/keys
This is used for: Planning, Script generation
Cost: ~$0.01 per video (varies by model)
Enter OpenRouter API Key (or press Enter to skip): [sk-or-...]
ElevenLabs API Key (for AI voiceover generation)
Get your key at: https://elevenlabs.io/app/settings/api-keys
This is used for: Voiceover audio generation
Cost: ~$0.30 per 1k characters (varies by voice)
Enter ElevenLabs API Key (or press Enter to skip): [xxxxxxxx...]
✔ API keys saved!
Onboarding Complete!
Next steps:
screenwright init Initialize a project
screenwright content generate Generate content ideas

Onboarding Options:

  • --skip-tools - Skip tool checking and only configure API keys
  • --skip-keys - Skip API key configuration
  • --force - Re-run onboarding even if already completed

2. Initialize Your Project

cd /path/to/your/project
screenwright init

This creates a .instructions folder in your project root with:

  • config.json - Your project configuration
  • .gitignore - Ensures cache files aren't committed
  • videos.json - Stores content ideas and videos

Commands

screenwright onboard

Set up Screenwright - check tools, install dependencies, and configure API keys.

screenwright onboard [options]

Options:

  • -s, --skip-tools - Skip tool checking and only configure API keys
  • -k, --skip-keys - Skip API key configuration
  • -f, --force - Re-run onboarding even if already completed

screenwright config:keys

Show or update API keys configuration.

screenwright config:keys # Show API key status
screenwright config:keys --update # Update API keys

screenwright init

Initialize the .instructions folder in your project.

screenwright init [--force]

Options:

  • -f, --force - Reinitialize even if .instructions already exists

What it does:

  • Detects your project type (Expo, React Native, or native iOS)
  • Creates .instructions/config.json with default preferences
  • Creates .instructions/.gitignore to exclude cache files

screenwright config

Manage .instructions configuration.

screenwright config # Show configuration summary
screenwright config --show # Show full configuration
screenwright config --get <key># Get a configuration value
screenwright config --set <key>=<value># Set a configuration value

screenwright info

Show information about the current project.

screenwright info

Content Commands

screenwright content generate

Generate video content ideas by analyzing your project codebase.

screenwright content generate [options]

Options:

  • -n, --max-ideas <number> - Maximum number of ideas to generate (default: 10)
  • -c, --max-categories <number> - Maximum number of categories (default: 3)

What it does:

  • Analyzes your project structure to identify features and screens
  • Generates tutorial video ideas organized by category
  • Saves ideas to .instructions/videos.json

Example:

$ screenwright content generate
Generating content ideas...
✓ Generated 8 content ideas!
Generated Categories:
Getting Started
Learn the basics of using MyApp
• Getting Started with MyApp
A quick introduction to MyApp and its main features
Core Features
Learn how to use MyApp's main features • Creating a Post Learn how to create and share posts on MyApp • Searching for Content Learn how to search and find content on MyApp

screenwright content list

List all generated content ideas.

screenwright content list [options]

Options:

  • -c, --category <name> - Filter by category

Video Commands

screenwright videos

List all videos.

screenwright videos

screenwright video create <ideaId>

Create a new video from a content idea.

screenwright video create <ideaId>

screenwright video status <videoId>

Show detailed status of a video.

screenwright video status <videoId>

screenwright video plan <videoId>

Generate recording plan using AI (analyzes simulator, tests interactions).

screenwright video plan <videoId>

screenwright video script <videoId>

Generate voiceover script with precise timestamps.

screenwright video script <videoId>

screenwright video record <videoId>

Record the video on simulator.

screenwright video record <videoId>

screenwright video composite <videoId>

Combine video and audio.

screenwright video composite <videoId>

screenwright video all <videoId>

Run all stages (plan, script, record, composite).

screenwright video all <videoId>

This runs the complete video creation pipeline:

  1. Plan: Uses AI to analyze the simulator and generate a detailed recording plan
  2. Script: Generates a voiceover script with precise timestamps
  3. Record: Executes the recording on the simulator
  4. Composite: Combines the video with AI-generated voiceover

screenwright video delete <videoId>

Delete a video.

screenwright video delete <videoId>

Video Pipeline Architecture

The video creation system consists of four stages, each building on the previous:

Stage 1: Plan

  • AI Agent: Uses OpenRouter API with vision capabilities
  • Process:
    • Takes screenshots of the simulator
    • Lists UI elements with coordinates
    • Tests each interaction (tap, swipe, type)
    • Generates a detailed recording plan with exact coordinates
  • Output: Recording plan with setup steps and recording steps

Stage 2: Script

  • AI Agent: Uses OpenRouter API
  • Process:
    • Analyzes the recording plan
    • Generates a natural, conversational voiceover script
    • Calculates precise timestamps for each action
  • Output: Voiceover script with timestamped actions

Stage 3: Record

  • Tool: Uses AXe CLI for simulator control
  • Process:
    • Executes setup steps before recording
    • Starts screen recording
    • Executes actions at precise timestamps
    • Stops recording
  • Output: Silent video file

Stage 4: Composite

  • Tool: Uses FFmpeg
  • Process:
    • Generates AI voiceover using ElevenLabs
    • Combines video and audio
    • Outputs final video file
  • Output: Final video with voiceover

Required API Keys:

  • OPENROUTER_API_KEY - For AI agents (planner, scriptwriter)
  • ELEVENLABS_API_KEY - For voiceover generation

Configuration

Project Configuration (.instructions/config.json)

Stored in your project root:

{
"version": "1.0.0",
"projectPath": "/Users/john/my-app",
"projectType": "expo",
"createdAt": "2024-01-15T10:30:00.000Z",
"lastUpdated": "2024-01-15T10:30:00.000Z",
"preferences": {
"defaultDevice": "iPhone 15 Pro",
"defaultUseCache": true,
"defaultClean": false
}
}

Global Configuration (~/.screenwright/config.json)

API keys stored globally:

{
"openrouterApiKey": "sk-or-...",
"elevenlabsApiKey": "...",
"onboardedAt": "2024-01-15T10:30:00.000Z"
}

SDK

Screenwright also provides an SDK for programmatic access:

npm install @screenwright/sdk
import*asscreenwrightfrom'@screenwright/sdk';// Generate content ideasconstcategories=awaitscreenwright.generateAndSaveContentIdeas(projectPath,{maxIdeas: 10,maxCategories: 3});// Create a videoconstvideo=awaitscreenwright.createVideo(projectPath,idea);// Check video statusconststatus=awaitscreenwright.getVideo(projectPath,videoId);

Development

Building from Source

# Build SDKcd sdk && bun run build
# Build CLIcd cli && bun run build

Running in Development Mode

cd cli
bun run dev

Project Structure

instructionsCreator/
├── sdk/ # @screenwright/sdk
│ ├── src/
│ │ ├── index.ts # Main exports
│ │ ├── types.ts # Core types
│ │ ├── types-video.ts # Video types
│ │ └── utils/
│ │ ├── detect.ts
│ │ ├── config.ts
│ │ ├── video-storage.ts
│ │ ├── content-generator.ts
│ │ └── onboard.ts
│ ├── dist/ # Built SDK
│ ├── package.json
│ └── tsconfig.json
└── cli/ # screenwright CLI
├── src/
│ └── cli.ts # CLI entry point (uses SDK)
├── dist/ # Built CLI
└── package.json

Workflow Example

# 1. First-time setup
screenwright onboard
# 2. Initialize projectcd my-expo-app
screenwright init
# 3. Generate content ideas
screenwright content generate
# 4. List content ideas
screenwright content list
# 5. Create a video from an idea
screenwright video create idea_xxxxx
# 6. Generate recording plan
screenwright video plan video_xxxxx
# 7. Generate script
screenwright video script video_xxxxx
# 8. Record the video
screenwright video record video_xxxxx
# 9. Composite final video
screenwright video composite video_xxxxx
# OR run all stages at once
screenwright video all video_xxxxx

Troubleshooting

"Xcode not installed" Error

xcode-select --install
xcode-select -p

"Could not detect project type" Error

Screenwright looks for specific project indicators:

  • Expo: package.json contains "expo" dependency OR app.json exists
  • React Native: package.json contains "react-native" dependency
  • Native iOS: ios/ directory contains .xcodeproj or .xcworkspace

API Key Issues

# Check API key status
screenwright config:keys
# Update API keys
screenwright config:keys --update

License

MIT

Acknowledgments

Built with:

About

Screenwright

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Screenwright banner

Screenwright

An AI-powered tool for creating tutorial videos from your iOS app codebase. Analyzes your Expo or React Native project and generates video content plans, then orchestrates the full video creation pipeline.

Features

  • AI Content Generation: Analyzes your codebase to generate tutorial video ideas
  • Video Pipeline: Plan → Script → Record → Composite
  • Smart Onboarding: Automatically checks and installs required tools
  • API Key Management: Securely stores OpenRouter and ElevenLabs API keys
  • Project Configuration: .instructions folder for project-specific settings

Installation

# Clone and installcd instructionsCreator/cli
bun install
# Optional: Link globally for use anywhere
bun link

Prerequisites

  • macOS with Xcode installed
  • Xcode Command Line Tools: xcode-select --install
  • Node.js 18+ and Bun (for running from source)
  • FFmpeg (auto-installed during onboarding)
  • AXe CLI (auto-installed during onboarding)
  • API keys from OpenRouter and ElevenLabs (configured during onboarding)

Quick Start

1. Onboard (First Time Setup)

screenwright onboard

This will:

  • Check for required tools (Xcode, FFmpeg, AXe CLI)
  • Install missing tools automatically
  • Prompt for API keys (OpenRouter, ElevenLabs)
  • Store configuration in ~/.screenwright/config.json

Example:

$ screenwright onboard
Tool Check Results:
✓ Xcode (/Applications/Xcode.app)
✓ simctl
✓ FFmpeg (7.1.1)
✗ AXe CLI
Install: npm install -g @axe-devtools/cli
Installing Missing Tools...
✔ AXe CLI installed
==================================================
API Keys Configuration
==================================================
Screenwright uses AI services for video creation.
OpenRouter API Key (for AI planning and script generation)
Get your key at: https://openrouter.ai/keys
This is used for: Planning, Script generation
Cost: ~$0.01 per video (varies by model)
Enter OpenRouter API Key (or press Enter to skip): [sk-or-...]
ElevenLabs API Key (for AI voiceover generation)
Get your key at: https://elevenlabs.io/app/settings/api-keys
This is used for: Voiceover audio generation
Cost: ~$0.30 per 1k characters (varies by voice)
Enter ElevenLabs API Key (or press Enter to skip): [xxxxxxxx...]
✔ API keys saved!
Onboarding Complete!
Next steps:
screenwright init Initialize a project
screenwright content generate Generate content ideas

Onboarding Options:

  • --skip-tools - Skip tool checking and only configure API keys
  • --skip-keys - Skip API key configuration
  • --force - Re-run onboarding even if already completed

2. Initialize Your Project

cd /path/to/your/project
screenwright init

This creates a .instructions folder in your project root with:

  • config.json - Your project configuration
  • .gitignore - Ensures cache files aren't committed
  • videos.json - Stores content ideas and videos

Commands

screenwright onboard

Set up Screenwright - check tools, install dependencies, and configure API keys.

screenwright onboard [options]

Options:

  • -s, --skip-tools - Skip tool checking and only configure API keys
  • -k, --skip-keys - Skip API key configuration
  • -f, --force - Re-run onboarding even if already completed

screenwright config:keys

Show or update API keys configuration.

screenwright config:keys # Show API key status
screenwright config:keys --update # Update API keys

screenwright init

Initialize the .instructions folder in your project.

screenwright init [--force]

Options:

  • -f, --force - Reinitialize even if .instructions already exists

What it does:

  • Detects your project type (Expo, React Native, or native iOS)
  • Creates .instructions/config.json with default preferences
  • Creates .instructions/.gitignore to exclude cache files

screenwright config

Manage .instructions configuration.

screenwright config # Show configuration summary
screenwright config --show # Show full configuration
screenwright config --get <key># Get a configuration value
screenwright config --set <key>=<value># Set a configuration value

screenwright info

Show information about the current project.

screenwright info

Content Commands

screenwright content generate

Generate video content ideas by analyzing your project codebase.

screenwright content generate [options]

Options:

  • -n, --max-ideas <number> - Maximum number of ideas to generate (default: 10)
  • -c, --max-categories <number> - Maximum number of categories (default: 3)

What it does:

  • Analyzes your project structure to identify features and screens
  • Generates tutorial video ideas organized by category
  • Saves ideas to .instructions/videos.json

Example:

$ screenwright content generate
Generating content ideas...
✓ Generated 8 content ideas!
Generated Categories:
Getting Started
Learn the basics of using MyApp
• Getting Started with MyApp
A quick introduction to MyApp and its main features
Core Features
Learn how to use MyApp's main features • Creating a Post Learn how to create and share posts on MyApp • Searching for Content Learn how to search and find content on MyApp

screenwright content list

List all generated content ideas.

screenwright content list [options]

Options:

  • -c, --category <name> - Filter by category

Video Commands

screenwright videos

List all videos.

screenwright videos

screenwright video create <ideaId>

Create a new video from a content idea.

screenwright video create <ideaId>

screenwright video status <videoId>

Show detailed status of a video.

screenwright video status <videoId>

screenwright video plan <videoId>

Generate recording plan using AI (analyzes simulator, tests interactions).

screenwright video plan <videoId>

screenwright video script <videoId>

Generate voiceover script with precise timestamps.

screenwright video script <videoId>

screenwright video record <videoId>

Record the video on simulator.

screenwright video record <videoId>

screenwright video composite <videoId>

Combine video and audio.

screenwright video composite <videoId>

screenwright video all <videoId>

Run all stages (plan, script, record, composite).

screenwright video all <videoId>

This runs the complete video creation pipeline:

  1. Plan: Uses AI to analyze the simulator and generate a detailed recording plan
  2. Script: Generates a voiceover script with precise timestamps
  3. Record: Executes the recording on the simulator
  4. Composite: Combines the video with AI-generated voiceover

screenwright video delete <videoId>

Delete a video.

screenwright video delete <videoId>

Video Pipeline Architecture

The video creation system consists of four stages, each building on the previous:

Stage 1: Plan

  • AI Agent: Uses OpenRouter API with vision capabilities
  • Process:
    • Takes screenshots of the simulator
    • Lists UI elements with coordinates
    • Tests each interaction (tap, swipe, type)
    • Generates a detailed recording plan with exact coordinates
  • Output: Recording plan with setup steps and recording steps

Stage 2: Script

  • AI Agent: Uses OpenRouter API
  • Process:
    • Analyzes the recording plan
    • Generates a natural, conversational voiceover script
    • Calculates precise timestamps for each action
  • Output: Voiceover script with timestamped actions

Stage 3: Record

  • Tool: Uses AXe CLI for simulator control
  • Process:
    • Executes setup steps before recording
    • Starts screen recording
    • Executes actions at precise timestamps
    • Stops recording
  • Output: Silent video file

Stage 4: Composite

  • Tool: Uses FFmpeg
  • Process:
    • Generates AI voiceover using ElevenLabs
    • Combines video and audio
    • Outputs final video file
  • Output: Final video with voiceover

Required API Keys:

  • OPENROUTER_API_KEY - For AI agents (planner, scriptwriter)
  • ELEVENLABS_API_KEY - For voiceover generation

Configuration

Project Configuration (.instructions/config.json)

Stored in your project root:

{
"version": "1.0.0",
"projectPath": "/Users/john/my-app",
"projectType": "expo",
"createdAt": "2024-01-15T10:30:00.000Z",
"lastUpdated": "2024-01-15T10:30:00.000Z",
"preferences": {
"defaultDevice": "iPhone 15 Pro",
"defaultUseCache": true,
"defaultClean": false
}
}

Global Configuration (~/.screenwright/config.json)

API keys stored globally:

{
"openrouterApiKey": "sk-or-...",
"elevenlabsApiKey": "...",
"onboardedAt": "2024-01-15T10:30:00.000Z"
}

SDK

Screenwright also provides an SDK for programmatic access:

npm install @screenwright/sdk
import*asscreenwrightfrom'@screenwright/sdk';// Generate content ideasconstcategories=awaitscreenwright.generateAndSaveContentIdeas(projectPath,{maxIdeas: 10,maxCategories: 3});// Create a videoconstvideo=awaitscreenwright.createVideo(projectPath,idea);// Check video statusconststatus=awaitscreenwright.getVideo(projectPath,videoId);

Development

Building from Source

# Build SDKcd sdk && bun run build
# Build CLIcd cli && bun run build

Running in Development Mode

cd cli
bun run dev

Project Structure

instructionsCreator/
├── sdk/ # @screenwright/sdk
│ ├── src/
│ │ ├── index.ts # Main exports
│ │ ├── types.ts # Core types
│ │ ├── types-video.ts # Video types
│ │ └── utils/
│ │ ├── detect.ts
│ │ ├── config.ts
│ │ ├── video-storage.ts
│ │ ├── content-generator.ts
│ │ └── onboard.ts
│ ├── dist/ # Built SDK
│ ├── package.json
│ └── tsconfig.json
└── cli/ # screenwright CLI
├── src/
│ └── cli.ts # CLI entry point (uses SDK)
├── dist/ # Built CLI
└── package.json

Workflow Example

# 1. First-time setup
screenwright onboard
# 2. Initialize projectcd my-expo-app
screenwright init
# 3. Generate content ideas
screenwright content generate
# 4. List content ideas
screenwright content list
# 5. Create a video from an idea
screenwright video create idea_xxxxx
# 6. Generate recording plan
screenwright video plan video_xxxxx
# 7. Generate script
screenwright video script video_xxxxx
# 8. Record the video
screenwright video record video_xxxxx
# 9. Composite final video
screenwright video composite video_xxxxx
# OR run all stages at once
screenwright video all video_xxxxx

Troubleshooting

"Xcode not installed" Error

xcode-select --install
xcode-select -p

"Could not detect project type" Error

Screenwright looks for specific project indicators:

  • Expo: package.json contains "expo" dependency OR app.json exists
  • React Native: package.json contains "react-native" dependency
  • Native iOS: ios/ directory contains .xcodeproj or .xcworkspace

API Key Issues

# Check API key status
screenwright config:keys
# Update API keys
screenwright config:keys --update

License

MIT

Acknowledgments

Built with:

About

Screenwright

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Screenwright banner

Screenwright

An AI-powered tool for creating tutorial videos from your iOS app codebase. Analyzes your Expo or React Native project and generates video content plans, then orchestrates the full video creation pipeline.

Features

  • AI Content Generation: Analyzes your codebase to generate tutorial video ideas
  • Video Pipeline: Plan → Script → Record → Composite
  • Smart Onboarding: Automatically checks and installs required tools
  • API Key Management: Securely stores OpenRouter and ElevenLabs API keys
  • Project Configuration: .instructions folder for project-specific settings

Installation

# Clone and installcd instructionsCreator/cli
bun install
# Optional: Link globally for use anywhere
bun link

Prerequisites

  • macOS with Xcode installed
  • Xcode Command Line Tools: xcode-select --install
  • Node.js 18+ and Bun (for running from source)
  • FFmpeg (auto-installed during onboarding)
  • AXe CLI (auto-installed during onboarding)
  • API keys from OpenRouter and ElevenLabs (configured during onboarding)

Quick Start

1. Onboard (First Time Setup)

screenwright onboard

This will:

  • Check for required tools (Xcode, FFmpeg, AXe CLI)
  • Install missing tools automatically
  • Prompt for API keys (OpenRouter, ElevenLabs)
  • Store configuration in ~/.screenwright/config.json

Example:

$ screenwright onboard
Tool Check Results:
✓ Xcode (/Applications/Xcode.app)
✓ simctl
✓ FFmpeg (7.1.1)
✗ AXe CLI
Install: npm install -g @axe-devtools/cli
Installing Missing Tools...
✔ AXe CLI installed
==================================================
API Keys Configuration
==================================================
Screenwright uses AI services for video creation.
OpenRouter API Key (for AI planning and script generation)
Get your key at: https://openrouter.ai/keys
This is used for: Planning, Script generation
Cost: ~$0.01 per video (varies by model)
Enter OpenRouter API Key (or press Enter to skip): [sk-or-...]
ElevenLabs API Key (for AI voiceover generation)
Get your key at: https://elevenlabs.io/app/settings/api-keys
This is used for: Voiceover audio generation
Cost: ~$0.30 per 1k characters (varies by voice)
Enter ElevenLabs API Key (or press Enter to skip): [xxxxxxxx...]
✔ API keys saved!
Onboarding Complete!
Next steps:
screenwright init Initialize a project
screenwright content generate Generate content ideas

Onboarding Options:

  • --skip-tools - Skip tool checking and only configure API keys
  • --skip-keys - Skip API key configuration
  • --force - Re-run onboarding even if already completed

2. Initialize Your Project

cd /path/to/your/project
screenwright init

This creates a .instructions folder in your project root with:

  • config.json - Your project configuration
  • .gitignore - Ensures cache files aren't committed
  • videos.json - Stores content ideas and videos

Commands

screenwright onboard

Set up Screenwright - check tools, install dependencies, and configure API keys.

screenwright onboard [options]

Options:

  • -s, --skip-tools - Skip tool checking and only configure API keys
  • -k, --skip-keys - Skip API key configuration
  • -f, --force - Re-run onboarding even if already completed

screenwright config:keys

Show or update API keys configuration.

screenwright config:keys # Show API key status
screenwright config:keys --update # Update API keys

screenwright init

Initialize the .instructions folder in your project.

screenwright init [--force]

Options:

  • -f, --force - Reinitialize even if .instructions already exists

What it does:

  • Detects your project type (Expo, React Native, or native iOS)
  • Creates .instructions/config.json with default preferences
  • Creates .instructions/.gitignore to exclude cache files

screenwright config

Manage .instructions configuration.

screenwright config # Show configuration summary
screenwright config --show # Show full configuration
screenwright config --get <key># Get a configuration value
screenwright config --set <key>=<value># Set a configuration value

screenwright info

Show information about the current project.

screenwright info

Content Commands

screenwright content generate

Generate video content ideas by analyzing your project codebase.

screenwright content generate [options]

Options:

  • -n, --max-ideas <number> - Maximum number of ideas to generate (default: 10)
  • -c, --max-categories <number> - Maximum number of categories (default: 3)

What it does:

  • Analyzes your project structure to identify features and screens
  • Generates tutorial video ideas organized by category
  • Saves ideas to .instructions/videos.json

Example:

$ screenwright content generate
Generating content ideas...
✓ Generated 8 content ideas!
Generated Categories:
Getting Started
Learn the basics of using MyApp
• Getting Started with MyApp
A quick introduction to MyApp and its main features
Core Features
Learn how to use MyApp's main features • Creating a Post Learn how to create and share posts on MyApp • Searching for Content Learn how to search and find content on MyApp

screenwright content list

List all generated content ideas.

screenwright content list [options]

Options:

  • -c, --category <name> - Filter by category

Video Commands

screenwright videos

List all videos.

screenwright videos

screenwright video create <ideaId>

Create a new video from a content idea.

screenwright video create <ideaId>

screenwright video status <videoId>

Show detailed status of a video.

screenwright video status <videoId>

screenwright video plan <videoId>

Generate recording plan using AI (analyzes simulator, tests interactions).

screenwright video plan <videoId>

screenwright video script <videoId>

Generate voiceover script with precise timestamps.

screenwright video script <videoId>

screenwright video record <videoId>

Record the video on simulator.

screenwright video record <videoId>

screenwright video composite <videoId>

Combine video and audio.

screenwright video composite <videoId>

screenwright video all <videoId>

Run all stages (plan, script, record, composite).

screenwright video all <videoId>

This runs the complete video creation pipeline:

  1. Plan: Uses AI to analyze the simulator and generate a detailed recording plan
  2. Script: Generates a voiceover script with precise timestamps
  3. Record: Executes the recording on the simulator
  4. Composite: Combines the video with AI-generated voiceover

screenwright video delete <videoId>

Delete a video.

screenwright video delete <videoId>

Video Pipeline Architecture

The video creation system consists of four stages, each building on the previous:

Stage 1: Plan

  • AI Agent: Uses OpenRouter API with vision capabilities
  • Process:
    • Takes screenshots of the simulator
    • Lists UI elements with coordinates
    • Tests each interaction (tap, swipe, type)
    • Generates a detailed recording plan with exact coordinates
  • Output: Recording plan with setup steps and recording steps

Stage 2: Script

  • AI Agent: Uses OpenRouter API
  • Process:
    • Analyzes the recording plan
    • Generates a natural, conversational voiceover script
    • Calculates precise timestamps for each action
  • Output: Voiceover script with timestamped actions

Stage 3: Record

  • Tool: Uses AXe CLI for simulator control
  • Process:
    • Executes setup steps before recording
    • Starts screen recording
    • Executes actions at precise timestamps
    • Stops recording
  • Output: Silent video file

Stage 4: Composite

  • Tool: Uses FFmpeg
  • Process:
    • Generates AI voiceover using ElevenLabs
    • Combines video and audio
    • Outputs final video file
  • Output: Final video with voiceover

Required API Keys:

  • OPENROUTER_API_KEY - For AI agents (planner, scriptwriter)
  • ELEVENLABS_API_KEY - For voiceover generation

Configuration

Project Configuration (.instructions/config.json)

Stored in your project root:

{
"version": "1.0.0",
"projectPath": "/Users/john/my-app",
"projectType": "expo",
"createdAt": "2024-01-15T10:30:00.000Z",
"lastUpdated": "2024-01-15T10:30:00.000Z",
"preferences": {
"defaultDevice": "iPhone 15 Pro",
"defaultUseCache": true,
"defaultClean": false
}
}

Global Configuration (~/.screenwright/config.json)

API keys stored globally:

{
"openrouterApiKey": "sk-or-...",
"elevenlabsApiKey": "...",
"onboardedAt": "2024-01-15T10:30:00.000Z"
}

SDK

Screenwright also provides an SDK for programmatic access:

npm install @screenwright/sdk
import*asscreenwrightfrom'@screenwright/sdk';// Generate content ideasconstcategories=awaitscreenwright.generateAndSaveContentIdeas(projectPath,{maxIdeas: 10,maxCategories: 3});// Create a videoconstvideo=awaitscreenwright.createVideo(projectPath,idea);// Check video statusconststatus=awaitscreenwright.getVideo(projectPath,videoId);

Development

Building from Source

# Build SDKcd sdk && bun run build
# Build CLIcd cli && bun run build

Running in Development Mode

cd cli
bun run dev

Project Structure

instructionsCreator/
├── sdk/ # @screenwright/sdk
│ ├── src/
│ │ ├── index.ts # Main exports
│ │ ├── types.ts # Core types
│ │ ├── types-video.ts # Video types
│ │ └── utils/
│ │ ├── detect.ts
│ │ ├── config.ts
│ │ ├── video-storage.ts
│ │ ├── content-generator.ts
│ │ └── onboard.ts
│ ├── dist/ # Built SDK
│ ├── package.json
│ └── tsconfig.json
└── cli/ # screenwright CLI
├── src/
│ └── cli.ts # CLI entry point (uses SDK)
├── dist/ # Built CLI
└── package.json

Workflow Example

# 1. First-time setup
screenwright onboard
# 2. Initialize projectcd my-expo-app
screenwright init
# 3. Generate content ideas
screenwright content generate
# 4. List content ideas
screenwright content list
# 5. Create a video from an idea
screenwright video create idea_xxxxx
# 6. Generate recording plan
screenwright video plan video_xxxxx
# 7. Generate script
screenwright video script video_xxxxx
# 8. Record the video
screenwright video record video_xxxxx
# 9. Composite final video
screenwright video composite video_xxxxx
# OR run all stages at once
screenwright video all video_xxxxx

Troubleshooting

"Xcode not installed" Error

xcode-select --install
xcode-select -p

"Could not detect project type" Error

Screenwright looks for specific project indicators:

  • Expo: package.json contains "expo" dependency OR app.json exists
  • React Native: package.json contains "react-native" dependency
  • Native iOS: ios/ directory contains .xcodeproj or .xcworkspace

API Key Issues

# Check API key status
screenwright config:keys
# Update API keys
screenwright config:keys --update

License

MIT

Acknowledgments

Built with:

About

Screenwright

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Screenwright banner

Screenwright

An AI-powered tool for creating tutorial videos from your iOS app codebase. Analyzes your Expo or React Native project and generates video content plans, then orchestrates the full video creation pipeline.

Features

  • AI Content Generation: Analyzes your codebase to generate tutorial video ideas
  • Video Pipeline: Plan → Script → Record → Composite
  • Smart Onboarding: Automatically checks and installs required tools
  • API Key Management: Securely stores OpenRouter and ElevenLabs API keys
  • Project Configuration: .instructions folder for project-specific settings

Installation

# Clone and installcd instructionsCreator/cli
bun install
# Optional: Link globally for use anywhere
bun link

Prerequisites

  • macOS with Xcode installed
  • Xcode Command Line Tools: xcode-select --install
  • Node.js 18+ and Bun (for running from source)
  • FFmpeg (auto-installed during onboarding)
  • AXe CLI (auto-installed during onboarding)
  • API keys from OpenRouter and ElevenLabs (configured during onboarding)

Quick Start

1. Onboard (First Time Setup)

screenwright onboard

This will:

  • Check for required tools (Xcode, FFmpeg, AXe CLI)
  • Install missing tools automatically
  • Prompt for API keys (OpenRouter, ElevenLabs)
  • Store configuration in ~/.screenwright/config.json

Example:

$ screenwright onboard
Tool Check Results:
✓ Xcode (/Applications/Xcode.app)
✓ simctl
✓ FFmpeg (7.1.1)
✗ AXe CLI
Install: npm install -g @axe-devtools/cli
Installing Missing Tools...
✔ AXe CLI installed
==================================================
API Keys Configuration
==================================================
Screenwright uses AI services for video creation.
OpenRouter API Key (for AI planning and script generation)
Get your key at: https://openrouter.ai/keys
This is used for: Planning, Script generation
Cost: ~$0.01 per video (varies by model)
Enter OpenRouter API Key (or press Enter to skip): [sk-or-...]
ElevenLabs API Key (for AI voiceover generation)
Get your key at: https://elevenlabs.io/app/settings/api-keys
This is used for: Voiceover audio generation
Cost: ~$0.30 per 1k characters (varies by voice)
Enter ElevenLabs API Key (or press Enter to skip): [xxxxxxxx...]
✔ API keys saved!
Onboarding Complete!
Next steps:
screenwright init Initialize a project
screenwright content generate Generate content ideas

Onboarding Options:

  • --skip-tools - Skip tool checking and only configure API keys
  • --skip-keys - Skip API key configuration
  • --force - Re-run onboarding even if already completed

2. Initialize Your Project

cd /path/to/your/project
screenwright init

This creates a .instructions folder in your project root with:

  • config.json - Your project configuration
  • .gitignore - Ensures cache files aren't committed
  • videos.json - Stores content ideas and videos

Commands

screenwright onboard

Set up Screenwright - check tools, install dependencies, and configure API keys.

screenwright onboard [options]

Options:

  • -s, --skip-tools - Skip tool checking and only configure API keys
  • -k, --skip-keys - Skip API key configuration
  • -f, --force - Re-run onboarding even if already completed

screenwright config:keys

Show or update API keys configuration.

screenwright config:keys # Show API key status
screenwright config:keys --update # Update API keys

screenwright init

Initialize the .instructions folder in your project.

screenwright init [--force]

Options:

  • -f, --force - Reinitialize even if .instructions already exists

What it does:

  • Detects your project type (Expo, React Native, or native iOS)
  • Creates .instructions/config.json with default preferences
  • Creates .instructions/.gitignore to exclude cache files

screenwright config

Manage .instructions configuration.

screenwright config # Show configuration summary
screenwright config --show # Show full configuration
screenwright config --get <key># Get a configuration value
screenwright config --set <key>=<value># Set a configuration value

screenwright info

Show information about the current project.

screenwright info

Content Commands

screenwright content generate

Generate video content ideas by analyzing your project codebase.

screenwright content generate [options]

Options:

  • -n, --max-ideas <number> - Maximum number of ideas to generate (default: 10)
  • -c, --max-categories <number> - Maximum number of categories (default: 3)

What it does:

  • Analyzes your project structure to identify features and screens
  • Generates tutorial video ideas organized by category
  • Saves ideas to .instructions/videos.json

Example:

$ screenwright content generate
Generating content ideas...
✓ Generated 8 content ideas!
Generated Categories:
Getting Started
Learn the basics of using MyApp
• Getting Started with MyApp
A quick introduction to MyApp and its main features
Core Features
Learn how to use MyApp's main features • Creating a Post Learn how to create and share posts on MyApp • Searching for Content Learn how to search and find content on MyApp

screenwright content list

List all generated content ideas.

screenwright content list [options]

Options:

  • -c, --category <name> - Filter by category

Video Commands

screenwright videos

List all videos.

screenwright videos

screenwright video create <ideaId>

Create a new video from a content idea.

screenwright video create <ideaId>

screenwright video status <videoId>

Show detailed status of a video.

screenwright video status <videoId>

screenwright video plan <videoId>

Generate recording plan using AI (analyzes simulator, tests interactions).

screenwright video plan <videoId>

screenwright video script <videoId>

Generate voiceover script with precise timestamps.

screenwright video script <videoId>

screenwright video record <videoId>

Record the video on simulator.

screenwright video record <videoId>

screenwright video composite <videoId>

Combine video and audio.

screenwright video composite <videoId>

screenwright video all <videoId>

Run all stages (plan, script, record, composite).

screenwright video all <videoId>

This runs the complete video creation pipeline:

  1. Plan: Uses AI to analyze the simulator and generate a detailed recording plan
  2. Script: Generates a voiceover script with precise timestamps
  3. Record: Executes the recording on the simulator
  4. Composite: Combines the video with AI-generated voiceover

screenwright video delete <videoId>

Delete a video.

screenwright video delete <videoId>

Video Pipeline Architecture

The video creation system consists of four stages, each building on the previous:

Stage 1: Plan

  • AI Agent: Uses OpenRouter API with vision capabilities
  • Process:
    • Takes screenshots of the simulator
    • Lists UI elements with coordinates
    • Tests each interaction (tap, swipe, type)
    • Generates a detailed recording plan with exact coordinates
  • Output: Recording plan with setup steps and recording steps

Stage 2: Script

  • AI Agent: Uses OpenRouter API
  • Process:
    • Analyzes the recording plan
    • Generates a natural, conversational voiceover script
    • Calculates precise timestamps for each action
  • Output: Voiceover script with timestamped actions

Stage 3: Record

  • Tool: Uses AXe CLI for simulator control
  • Process:
    • Executes setup steps before recording
    • Starts screen recording
    • Executes actions at precise timestamps
    • Stops recording
  • Output: Silent video file

Stage 4: Composite

  • Tool: Uses FFmpeg
  • Process:
    • Generates AI voiceover using ElevenLabs
    • Combines video and audio
    • Outputs final video file
  • Output: Final video with voiceover

Required API Keys:

  • OPENROUTER_API_KEY - For AI agents (planner, scriptwriter)
  • ELEVENLABS_API_KEY - For voiceover generation

Configuration

Project Configuration (.instructions/config.json)

Stored in your project root:

{
"version": "1.0.0",
"projectPath": "/Users/john/my-app",
"projectType": "expo",
"createdAt": "2024-01-15T10:30:00.000Z",
"lastUpdated": "2024-01-15T10:30:00.000Z",
"preferences": {
"defaultDevice": "iPhone 15 Pro",
"defaultUseCache": true,
"defaultClean": false
}
}

Global Configuration (~/.screenwright/config.json)

API keys stored globally:

{
"openrouterApiKey": "sk-or-...",
"elevenlabsApiKey": "...",
"onboardedAt": "2024-01-15T10:30:00.000Z"
}

SDK

Screenwright also provides an SDK for programmatic access:

npm install @screenwright/sdk
import*asscreenwrightfrom'@screenwright/sdk';// Generate content ideasconstcategories=awaitscreenwright.generateAndSaveContentIdeas(projectPath,{maxIdeas: 10,maxCategories: 3});// Create a videoconstvideo=awaitscreenwright.createVideo(projectPath,idea);// Check video statusconststatus=awaitscreenwright.getVideo(projectPath,videoId);

Development

Building from Source

# Build SDKcd sdk && bun run build
# Build CLIcd cli && bun run build

Running in Development Mode

cd cli
bun run dev

Project Structure

instructionsCreator/
├── sdk/ # @screenwright/sdk
│ ├── src/
│ │ ├── index.ts # Main exports
│ │ ├── types.ts # Core types
│ │ ├── types-video.ts # Video types
│ │ └── utils/
│ │ ├── detect.ts
│ │ ├── config.ts
│ │ ├── video-storage.ts
│ │ ├── content-generator.ts
│ │ └── onboard.ts
│ ├── dist/ # Built SDK
│ ├── package.json
│ └── tsconfig.json
└── cli/ # screenwright CLI
├── src/
│ └── cli.ts # CLI entry point (uses SDK)
├── dist/ # Built CLI
└── package.json

Workflow Example

# 1. First-time setup
screenwright onboard
# 2. Initialize projectcd my-expo-app
screenwright init
# 3. Generate content ideas
screenwright content generate
# 4. List content ideas
screenwright content list
# 5. Create a video from an idea
screenwright video create idea_xxxxx
# 6. Generate recording plan
screenwright video plan video_xxxxx
# 7. Generate script
screenwright video script video_xxxxx
# 8. Record the video
screenwright video record video_xxxxx
# 9. Composite final video
screenwright video composite video_xxxxx
# OR run all stages at once
screenwright video all video_xxxxx

Troubleshooting

"Xcode not installed" Error

xcode-select --install
xcode-select -p

"Could not detect project type" Error

Screenwright looks for specific project indicators:

  • Expo: package.json contains "expo" dependency OR app.json exists
  • React Native: package.json contains "react-native" dependency
  • Native iOS: ios/ directory contains .xcodeproj or .xcworkspace

API Key Issues

# Check API key status
screenwright config:keys
# Update API keys
screenwright config:keys --update

License

MIT

Acknowledgments

Built with:

About

Screenwright

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Screenwright banner

Screenwright

An AI-powered tool for creating tutorial videos from your iOS app codebase. Analyzes your Expo or React Native project and generates video content plans, then orchestrates the full video creation pipeline.

Features

  • AI Content Generation: Analyzes your codebase to generate tutorial video ideas
  • Video Pipeline: Plan → Script → Record → Composite
  • Smart Onboarding: Automatically checks and installs required tools
  • API Key Management: Securely stores OpenRouter and ElevenLabs API keys
  • Project Configuration: .instructions folder for project-specific settings

Installation

# Clone and installcd instructionsCreator/cli
bun install
# Optional: Link globally for use anywhere
bun link

Prerequisites

  • macOS with Xcode installed
  • Xcode Command Line Tools: xcode-select --install
  • Node.js 18+ and Bun (for running from source)
  • FFmpeg (auto-installed during onboarding)
  • AXe CLI (auto-installed during onboarding)
  • API keys from OpenRouter and ElevenLabs (configured during onboarding)

Quick Start

1. Onboard (First Time Setup)

screenwright onboard

This will:

  • Check for required tools (Xcode, FFmpeg, AXe CLI)
  • Install missing tools automatically
  • Prompt for API keys (OpenRouter, ElevenLabs)
  • Store configuration in ~/.screenwright/config.json

Example:

$ screenwright onboard
Tool Check Results:
✓ Xcode (/Applications/Xcode.app)
✓ simctl
✓ FFmpeg (7.1.1)
✗ AXe CLI
Install: npm install -g @axe-devtools/cli
Installing Missing Tools...
✔ AXe CLI installed
==================================================
API Keys Configuration
==================================================
Screenwright uses AI services for video creation.
OpenRouter API Key (for AI planning and script generation)
Get your key at: https://openrouter.ai/keys
This is used for: Planning, Script generation
Cost: ~$0.01 per video (varies by model)
Enter OpenRouter API Key (or press Enter to skip): [sk-or-...]
ElevenLabs API Key (for AI voiceover generation)
Get your key at: https://elevenlabs.io/app/settings/api-keys
This is used for: Voiceover audio generation
Cost: ~$0.30 per 1k characters (varies by voice)
Enter ElevenLabs API Key (or press Enter to skip): [xxxxxxxx...]
✔ API keys saved!
Onboarding Complete!
Next steps:
screenwright init Initialize a project
screenwright content generate Generate content ideas

Onboarding Options:

  • --skip-tools - Skip tool checking and only configure API keys
  • --skip-keys - Skip API key configuration
  • --force - Re-run onboarding even if already completed

2. Initialize Your Project

cd /path/to/your/project
screenwright init

This creates a .instructions folder in your project root with:

  • config.json - Your project configuration
  • .gitignore - Ensures cache files aren't committed
  • videos.json - Stores content ideas and videos

Commands

screenwright onboard

Set up Screenwright - check tools, install dependencies, and configure API keys.

screenwright onboard [options]

Options:

  • -s, --skip-tools - Skip tool checking and only configure API keys
  • -k, --skip-keys - Skip API key configuration
  • -f, --force - Re-run onboarding even if already completed

screenwright config:keys

Show or update API keys configuration.

screenwright config:keys # Show API key status
screenwright config:keys --update # Update API keys

screenwright init

Initialize the .instructions folder in your project.

screenwright init [--force]

Options:

  • -f, --force - Reinitialize even if .instructions already exists

What it does:

  • Detects your project type (Expo, React Native, or native iOS)
  • Creates .instructions/config.json with default preferences
  • Creates .instructions/.gitignore to exclude cache files

screenwright config

Manage .instructions configuration.

screenwright config # Show configuration summary
screenwright config --show # Show full configuration
screenwright config --get <key># Get a configuration value
screenwright config --set <key>=<value># Set a configuration value

screenwright info

Show information about the current project.

screenwright info

Content Commands

screenwright content generate

Generate video content ideas by analyzing your project codebase.

screenwright content generate [options]

Options:

  • -n, --max-ideas <number> - Maximum number of ideas to generate (default: 10)
  • -c, --max-categories <number> - Maximum number of categories (default: 3)

What it does:

  • Analyzes your project structure to identify features and screens
  • Generates tutorial video ideas organized by category
  • Saves ideas to .instructions/videos.json

Example:

$ screenwright content generate
Generating content ideas...
✓ Generated 8 content ideas!
Generated Categories:
Getting Started
Learn the basics of using MyApp
• Getting Started with MyApp
A quick introduction to MyApp and its main features
Core Features
Learn how to use MyApp's main features • Creating a Post Learn how to create and share posts on MyApp • Searching for Content Learn how to search and find content on MyApp

screenwright content list

List all generated content ideas.

screenwright content list [options]

Options:

  • -c, --category <name> - Filter by category

Video Commands

screenwright videos

List all videos.

screenwright videos

screenwright video create <ideaId>

Create a new video from a content idea.

screenwright video create <ideaId>

screenwright video status <videoId>

Show detailed status of a video.

screenwright video status <videoId>

screenwright video plan <videoId>

Generate recording plan using AI (analyzes simulator, tests interactions).

screenwright video plan <videoId>

screenwright video script <videoId>

Generate voiceover script with precise timestamps.

screenwright video script <videoId>

screenwright video record <videoId>

Record the video on simulator.

screenwright video record <videoId>

screenwright video composite <videoId>

Combine video and audio.

screenwright video composite <videoId>

screenwright video all <videoId>

Run all stages (plan, script, record, composite).

screenwright video all <videoId>

This runs the complete video creation pipeline:

  1. Plan: Uses AI to analyze the simulator and generate a detailed recording plan
  2. Script: Generates a voiceover script with precise timestamps
  3. Record: Executes the recording on the simulator
  4. Composite: Combines the video with AI-generated voiceover

screenwright video delete <videoId>

Delete a video.

screenwright video delete <videoId>

Video Pipeline Architecture

The video creation system consists of four stages, each building on the previous:

Stage 1: Plan

  • AI Agent: Uses OpenRouter API with vision capabilities
  • Process:
    • Takes screenshots of the simulator
    • Lists UI elements with coordinates
    • Tests each interaction (tap, swipe, type)
    • Generates a detailed recording plan with exact coordinates
  • Output: Recording plan with setup steps and recording steps

Stage 2: Script

  • AI Agent: Uses OpenRouter API
  • Process:
    • Analyzes the recording plan
    • Generates a natural, conversational voiceover script
    • Calculates precise timestamps for each action
  • Output: Voiceover script with timestamped actions

Stage 3: Record

  • Tool: Uses AXe CLI for simulator control
  • Process:
    • Executes setup steps before recording
    • Starts screen recording
    • Executes actions at precise timestamps
    • Stops recording
  • Output: Silent video file

Stage 4: Composite

  • Tool: Uses FFmpeg
  • Process:
    • Generates AI voiceover using ElevenLabs
    • Combines video and audio
    • Outputs final video file
  • Output: Final video with voiceover

Required API Keys:

  • OPENROUTER_API_KEY - For AI agents (planner, scriptwriter)
  • ELEVENLABS_API_KEY - For voiceover generation

Configuration

Project Configuration (.instructions/config.json)

Stored in your project root:

{
"version": "1.0.0",
"projectPath": "/Users/john/my-app",
"projectType": "expo",
"createdAt": "2024-01-15T10:30:00.000Z",
"lastUpdated": "2024-01-15T10:30:00.000Z",
"preferences": {
"defaultDevice": "iPhone 15 Pro",
"defaultUseCache": true,
"defaultClean": false
}
}

Global Configuration (~/.screenwright/config.json)

API keys stored globally:

{
"openrouterApiKey": "sk-or-...",
"elevenlabsApiKey": "...",
"onboardedAt": "2024-01-15T10:30:00.000Z"
}

SDK

Screenwright also provides an SDK for programmatic access:

npm install @screenwright/sdk
import*asscreenwrightfrom'@screenwright/sdk';// Generate content ideasconstcategories=awaitscreenwright.generateAndSaveContentIdeas(projectPath,{maxIdeas: 10,maxCategories: 3});// Create a videoconstvideo=awaitscreenwright.createVideo(projectPath,idea);// Check video statusconststatus=awaitscreenwright.getVideo(projectPath,videoId);

Development

Building from Source

# Build SDKcd sdk && bun run build
# Build CLIcd cli && bun run build

Running in Development Mode

cd cli
bun run dev

Project Structure

instructionsCreator/
├── sdk/ # @screenwright/sdk
│ ├── src/
│ │ ├── index.ts # Main exports
│ │ ├── types.ts # Core types
│ │ ├── types-video.ts # Video types
│ │ └── utils/
│ │ ├── detect.ts
│ │ ├── config.ts
│ │ ├── video-storage.ts
│ │ ├── content-generator.ts
│ │ └── onboard.ts
│ ├── dist/ # Built SDK
│ ├── package.json
│ └── tsconfig.json
└── cli/ # screenwright CLI
├── src/
│ └── cli.ts # CLI entry point (uses SDK)
├── dist/ # Built CLI
└── package.json

Workflow Example

# 1. First-time setup
screenwright onboard
# 2. Initialize projectcd my-expo-app
screenwright init
# 3. Generate content ideas
screenwright content generate
# 4. List content ideas
screenwright content list
# 5. Create a video from an idea
screenwright video create idea_xxxxx
# 6. Generate recording plan
screenwright video plan video_xxxxx
# 7. Generate script
screenwright video script video_xxxxx
# 8. Record the video
screenwright video record video_xxxxx
# 9. Composite final video
screenwright video composite video_xxxxx
# OR run all stages at once
screenwright video all video_xxxxx

Troubleshooting

"Xcode not installed" Error

xcode-select --install
xcode-select -p

"Could not detect project type" Error

Screenwright looks for specific project indicators:

  • Expo: package.json contains "expo" dependency OR app.json exists
  • React Native: package.json contains "react-native" dependency
  • Native iOS: ios/ directory contains .xcodeproj or .xcworkspace

API Key Issues

# Check API key status
screenwright config:keys
# Update API keys
screenwright config:keys --update

License

MIT

Acknowledgments

Built with:

About

Screenwright

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages