Open-source, AI-powered podcast analyzer for macOS. Automatically transcribe and analyze podcasts with AI — all local except the LLM call.
Don't want to build from source? A signed and notarized macOS build is available at parsley-app.com. Same code as this repo — you're paying for the convenience of a ready-to-run, code-signed binary.
Bug reports and feature requests go to the parsley-feedback issue tracker.
npm install
npm start
| Summary & Key Topics | Notable Quotes |
|---|---|
![]() | ![]() |
| Key Takeaways | Mentions & Transcript |
|---|---|
![]() | ![]() |
| Episode Processing | Episodes List |
|---|---|
![]() | ![]() |
Install from nodejs.org (LTS version recommended)
Check if installed:
python3 --version
Install NeMo toolkit which includes Parakeet. Recommended: Use a virtual environment:
# Create virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate
# Install NeMo toolkit (note the quotes for zsh)
pip install 'nemo_toolkit[all]'
Or install globally:
# For zsh users (macOS default), use quotes:
pip3 install 'nemo_toolkit[all]'
# Or with --break-system-packages flag:
pip3 install 'nemo_toolkit[all]' --break-system-packages
Note: This is a large download (~2-5GB) and may take 10-20 minutes. The Parakeet model itself (~1.3GB) will download automatically on first use.
For more details, see: NeMo ASR Documentation
You'll need an OpenAI API key for AI analysis:
sk-, not project keys)Note: The app uses GPT-5-mini for analysis. GPT-5-mini is used as a fallback for transcript cleaning.
For faster, free transcript cleaning, install Ollama and pull a Gemma model:
# Install Ollama from https://ollama.ai
# Then pull a Gemma model:
ollama pull gemma2:2b
If Ollama is not available, the app will automatically fall back to cloud LLM for cleaning.
Clone or download this repository
Install Node.js dependencies
npm install
Install Parakeet (see Prerequisites above)
Verify Parakeet installation
python3 -c "import nemo.collections.asr; print('✓ NeMo installed successfully')"
npm startNote for developers: You can also use a .env file for development (see .env.example), but end users should use the Settings tab.
npm start
Or for development mode (with DevTools):
npm run dev
Find the RSS feed URL of your favorite podcast
Paste the RSS feed URL into the "Add Podcast" field in the sidebar
Set the "Lookback Days" (default: 30)
Click "Add Podcast"
Note: Podcast in-app search uses the free Podcast Index API. Set PODCAST_INDEX_API_KEY and PODCAST_INDEX_API_SECRET in your environment (see .env.example). You can still add podcasts by RSS URL without these.
Note: You can cancel processing at any time by clicking the "Cancel" button if an episode gets stuck.
The analysis includes:
parsley/
├── src/
│ ├── main.js # Electron main process
│ ├── preload.js # Preload script for IPC
│ ├── services/
│ │ ├── database.js # SQLite database layer
│ │ ├── podcast.js # RSS feed parser & downloader
│ │ ├── transcription.js # Parakeet integration
│ │ ├── cleaning.js # Transcript cleaning (Ollama/LLM)
│ │ └── analysis.js # OpenAI GPT-5-mini integration
│ └── renderer/
│ ├── index.html # Main UI
│ ├── styles.css # Styling
│ ├── app.js # UI logic
│ └── logo.svg # Parsley logo
├── package.json
├── .env # Your API keys (not in git)
└── README.md
By default, the app uses gpt-5-mini for analysis. To change it, edit src/services/analysis.js:
model: 'gpt-5-mini' // Can use 'gpt-5' for higher quality on Tier 2+ OpenAI accounts
Note: gpt-5-mini is the default because it fits comfortably within OpenAI's Tier 1 rate limits for typical podcast lengths. gpt-5 offers marginally better analysis quality but requires a higher API tier to avoid TPM rate-limit errors on hour-long transcripts.
The app supports two methods for cleaning transcripts:
Ollama (Recommended) - Free, local, fast
gemma2:3 or gemma2Cloud LLM (Fallback) - Uses GPT-5-mini
The default model is nvidia/parakeet-tdt_ctc-1.1b. For better accuracy (but slower), you can use larger models. Edit src/services/transcription.js:
asr_model = nemo_asr.models.EncDecRNNTBPEModel.from_pretrained('nvidia/parakeet-rnnt-1.1b')
Make sure you've installed the NeMo toolkit with quotes (important for zsh):
pip install 'nemo_toolkit[all]'
Verify it's in your Python path:
python3 -c "import nemo.collections.asr"
If using a virtual environment, make sure it's activated:
source venv/bin/activate
NeMo requires PyTorch. Install it:
pip install torch torchaudio
If the app crashes immediately with SIGTRAP or SIGSEGV:
rm -rf ~/Library/Saved\ Application\ State/com.github.Electron.savedState/
rm -rf ~/Library/Saved\ Application\ State/com.parsley.desktop.savedState/
rm -rf ~/Library/Preferences/com.github.Electron.plist
Make sure you're using Electron 32+ (included in package.json)
Try running with: npm start
The app uses Electron 32.2.7 which is compatible with macOS Sequoia (15.x).
Some podcasts may have authentication or geo-restrictions. Try a different episode or podcast.
.envAll data is stored locally in your user data directory:
Mac: ~/Library/Application Support/parsley/
podcasts.db - SQLite databasedownloads/ - Downloaded audio filesLogs: ~/Library/Logs/Parsley/
parsley-YYYY-MM-DD.log - Daily log filesSee VIEW_LOGS.md for details on viewing logs.
For large transcripts (>8000 tokens), the app uses a simple, effective chunking approach:
Sentence-Based Chunking
Rich Analysis Per Chunk
Simple Merge
Key Benefits:
This straightforward approach prioritizes analysis quality over complexity, producing comprehensive insights that capture the full richness of podcast discussions.
This is a personal project but feel free to fork and customize!
MIT
Built with:
43 commits
JavaScript
75.1%
CSS
17.4%
HTML
6.7%
Open-source, AI-powered podcast analyzer for macOS. Automatically transcribe and analyze podcasts with AI — all local except the LLM call.
Don't want to build from source? A signed and notarized macOS build is available at parsley-app.com. Same code as this repo — you're paying for the convenience of a ready-to-run, code-signed binary.
Bug reports and feature requests go to the parsley-feedback issue tracker.
npm install
npm start
| Summary & Key Topics | Notable Quotes |
|---|---|
![]() | ![]() |
| Key Takeaways | Mentions & Transcript |
|---|---|
![]() | ![]() |
| Episode Processing | Episodes List |
|---|---|
![]() | ![]() |
Install from nodejs.org (LTS version recommended)
Check if installed:
python3 --version
Install NeMo toolkit which includes Parakeet. Recommended: Use a virtual environment:
# Create virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate
# Install NeMo toolkit (note the quotes for zsh)
pip install 'nemo_toolkit[all]'
Or install globally:
# For zsh users (macOS default), use quotes:
pip3 install 'nemo_toolkit[all]'
# Or with --break-system-packages flag:
pip3 install 'nemo_toolkit[all]' --break-system-packages
Note: This is a large download (~2-5GB) and may take 10-20 minutes. The Parakeet model itself (~1.3GB) will download automatically on first use.
For more details, see: NeMo ASR Documentation
You'll need an OpenAI API key for AI analysis:
sk-, not project keys)Note: The app uses GPT-5-mini for analysis. GPT-5-mini is used as a fallback for transcript cleaning.
For faster, free transcript cleaning, install Ollama and pull a Gemma model:
# Install Ollama from https://ollama.ai
# Then pull a Gemma model:
ollama pull gemma2:2b
If Ollama is not available, the app will automatically fall back to cloud LLM for cleaning.
Clone or download this repository
Install Node.js dependencies
npm install
Install Parakeet (see Prerequisites above)
Verify Parakeet installation
python3 -c "import nemo.collections.asr; print('✓ NeMo installed successfully')"
npm startNote for developers: You can also use a .env file for development (see .env.example), but end users should use the Settings tab.
npm start
Or for development mode (with DevTools):
npm run dev
Find the RSS feed URL of your favorite podcast
Paste the RSS feed URL into the "Add Podcast" field in the sidebar
Set the "Lookback Days" (default: 30)
Click "Add Podcast"
Note: Podcast in-app search uses the free Podcast Index API. Set PODCAST_INDEX_API_KEY and PODCAST_INDEX_API_SECRET in your environment (see .env.example). You can still add podcasts by RSS URL without these.
Note: You can cancel processing at any time by clicking the "Cancel" button if an episode gets stuck.
The analysis includes:
parsley/
├── src/
│ ├── main.js # Electron main process
│ ├── preload.js # Preload script for IPC
│ ├── services/
│ │ ├── database.js # SQLite database layer
│ │ ├── podcast.js # RSS feed parser & downloader
│ │ ├── transcription.js # Parakeet integration
│ │ ├── cleaning.js # Transcript cleaning (Ollama/LLM)
│ │ └── analysis.js # OpenAI GPT-5-mini integration
│ └── renderer/
│ ├── index.html # Main UI
│ ├── styles.css # Styling
│ ├── app.js # UI logic
│ └── logo.svg # Parsley logo
├── package.json
├── .env # Your API keys (not in git)
└── README.md
By default, the app uses gpt-5-mini for analysis. To change it, edit src/services/analysis.js:
model: 'gpt-5-mini' // Can use 'gpt-5' for higher quality on Tier 2+ OpenAI accounts
Note: gpt-5-mini is the default because it fits comfortably within OpenAI's Tier 1 rate limits for typical podcast lengths. gpt-5 offers marginally better analysis quality but requires a higher API tier to avoid TPM rate-limit errors on hour-long transcripts.
The app supports two methods for cleaning transcripts:
Ollama (Recommended) - Free, local, fast
gemma2:3 or gemma2Cloud LLM (Fallback) - Uses GPT-5-mini
The default model is nvidia/parakeet-tdt_ctc-1.1b. For better accuracy (but slower), you can use larger models. Edit src/services/transcription.js:
asr_model = nemo_asr.models.EncDecRNNTBPEModel.from_pretrained('nvidia/parakeet-rnnt-1.1b')
Make sure you've installed the NeMo toolkit with quotes (important for zsh):
pip install 'nemo_toolkit[all]'
Verify it's in your Python path:
python3 -c "import nemo.collections.asr"
If using a virtual environment, make sure it's activated:
source venv/bin/activate
NeMo requires PyTorch. Install it:
pip install torch torchaudio
If the app crashes immediately with SIGTRAP or SIGSEGV:
rm -rf ~/Library/Saved\ Application\ State/com.github.Electron.savedState/
rm -rf ~/Library/Saved\ Application\ State/com.parsley.desktop.savedState/
rm -rf ~/Library/Preferences/com.github.Electron.plist
Make sure you're using Electron 32+ (included in package.json)
Try running with: npm start
The app uses Electron 32.2.7 which is compatible with macOS Sequoia (15.x).
Some podcasts may have authentication or geo-restrictions. Try a different episode or podcast.
.envAll data is stored locally in your user data directory:
Mac: ~/Library/Application Support/parsley/
podcasts.db - SQLite databasedownloads/ - Downloaded audio filesLogs: ~/Library/Logs/Parsley/
parsley-YYYY-MM-DD.log - Daily log filesSee VIEW_LOGS.md for details on viewing logs.
For large transcripts (>8000 tokens), the app uses a simple, effective chunking approach:
Sentence-Based Chunking
Rich Analysis Per Chunk
Simple Merge
Key Benefits:
This straightforward approach prioritizes analysis quality over complexity, producing comprehensive insights that capture the full richness of podcast discussions.
This is a personal project but feel free to fork and customize!
MIT
Built with:
43 commits
JavaScript
75.1%
CSS
17.4%
HTML
6.7%