From granola-pack
Creates secure zip diagnostic bundles for Granola support, collecting macOS system, audio config, network, permissions, and app state info.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin granola-packThis skill is limited to using the following tools:
!`sw_vers 2>/dev/null || uname -a`
Diagnoses and fixes common Granola errors: audio capture failures, transcription issues, calendar sync problems, integrations. macOS/Windows-specific steps with bash diagnostics.
Collects sanitized debug bundle for Deepgram issues with environment info, API tests via curl, SDK checks, and audio analysis via ffprobe. For support tickets.
Syncs Granola meeting transcripts, summaries, and notes to local disk from macOS app auth. Enables bash searches by title, content, date, or attendees.
Share bugs, ideas, or general feedback.
!sw_vers 2>/dev/null || uname -a
!defaults read /Applications/Granola.app/Contents/Info.plist CFBundleShortVersionString 2>/dev/null || echo 'Granola version: check Menu > About'
Collect diagnostic information for Granola support. Produces a zip bundle with system info, audio configuration, network connectivity, and app state — without exposing meeting content, transcripts, or API keys.
set -euo pipefail
DEBUG_DIR="$HOME/Desktop/granola-debug-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$DEBUG_DIR"
echo "Debug directory: $DEBUG_DIR"
macOS:
set -euo pipefail
cd "$DEBUG_DIR"
# OS and hardware
sw_vers > system-info.txt
uname -a >> system-info.txt
sysctl -n hw.memsize | awk '{printf "RAM: %.0f GB\n", $1/1073741824}' >> system-info.txt
# Granola version
defaults read /Applications/Granola.app/Contents/Info.plist CFBundleShortVersionString >> system-info.txt 2>/dev/null || echo "Version: not found" >> system-info.txt
# Granola process status
pgrep -l Granola >> system-info.txt 2>/dev/null || echo "Granola: NOT RUNNING" >> system-info.txt
# Audio configuration (critical for transcription issues)
system_profiler SPAudioDataType > audio-config.txt 2>/dev/null
Windows (PowerShell):
$dir = "$env:USERPROFILE\Desktop\granola-debug-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
New-Item -ItemType Directory -Path $dir
# System info
Get-CimInstance Win32_OperatingSystem | Select Caption, Version > "$dir\system-info.txt"
Get-Process Granola -ErrorAction SilentlyContinue >> "$dir\system-info.txt"
# Audio devices
Get-CimInstance Win32_SoundDevice | Select Name, Status > "$dir\audio-config.txt"
set -euo pipefail
cd "$DEBUG_DIR"
echo "=== Permission Check ===" > permissions.txt
# Check if Granola has microphone access
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \
"SELECT service, allowed FROM access WHERE client='ai.granola.app';" >> permissions.txt 2>/dev/null \
|| echo "Cannot read TCC database (expected on macOS 14+). Check manually:" >> permissions.txt
echo "" >> permissions.txt
echo "Manual verification required:" >> permissions.txt
echo " System Settings > Privacy & Security > Microphone > Granola" >> permissions.txt
echo " System Settings > Privacy & Security > Screen & System Audio Recording > Granola" >> permissions.txt
set -euo pipefail
cd "$DEBUG_DIR"
# Test Granola API connectivity
echo "=== Network Tests ===" > network-test.txt
echo "Timestamp: $(date -u +%Y-%m-%dT%H:%M:%SZ)" >> network-test.txt
# API endpoint
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 https://api.granola.ai/ 2>/dev/null || echo "FAIL")
echo "api.granola.ai: HTTP $HTTP_CODE" >> network-test.txt
# DNS resolution
nslookup api.granola.ai >> network-test.txt 2>&1
# WorkOS auth endpoint (Granola uses WorkOS for authentication)
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 https://api.workos.com/ 2>/dev/null || echo "FAIL")
echo "api.workos.com (auth): HTTP $HTTP_CODE" >> network-test.txt
set -euo pipefail
cd "$DEBUG_DIR"
CACHE_FILE="$HOME/Library/Application Support/Granola/cache-v3.json"
echo "=== Cache Metadata ===" > cache-info.txt
if [ -f "$CACHE_FILE" ]; then
ls -lh "$CACHE_FILE" >> cache-info.txt
# Count documents without exposing content
python3 -c "
import json
from pathlib import Path
try:
raw = json.loads(Path('$CACHE_FILE').read_text())
state = json.loads(raw) if isinstance(raw, str) else raw
data = state.get('state', state)
print(f'Documents: {len(data.get(\"documents\", {}))}')
print(f'Transcripts: {len(data.get(\"transcripts\", {}))}')
print(f'Meetings metadata: {len(data.get(\"meetingsMetadata\", {}))}')
except Exception as e:
print(f'Parse error: {e}')
" >> cache-info.txt 2>/dev/null
else
echo "Cache file not found" >> cache-info.txt
fi
set -euo pipefail
cd "$(dirname "$DEBUG_DIR")"
zip -r "$(basename "$DEBUG_DIR").zip" "$(basename "$DEBUG_DIR")/"
echo "Bundle ready: $(basename "$DEBUG_DIR").zip"
echo "Submit to: help@granola.ai or via in-app support"
Run through this before contacting support:
| Error | Cause | Fix |
|---|---|---|
| Permission denied on TCC database | macOS 14+ security | Use manual permission verification instead |
| Network test fails | Firewall or proxy | Check outbound HTTPS to api.granola.ai and api.workos.com |
| Zip creation fails | Disk full | Free space, or tar instead: tar czf bundle.tar.gz debug-dir/ |
| Cache parse error | Different Granola version | Report the error — it helps support identify the version issue |
Proceed to granola-rate-limits to understand usage limits and plan differences.