wispr-analytics/SKILL.md
This skill should be used when analyzing Wispr Flow voice dictation history for self-reflection, work patterns, mental health insights, or productivity analytics AND when managing the Wispr Flow dictionary (adding terms, fixing mishears, exporting/importing, suggesting improvements). Triggered by requests like "/wispr-analytics", "analyze my dictations", "what did I dictate today", "wispr reflection", "add to wispr dictionary", "improve dictation", "wispr suggest", "export wispr dictionary", or any request to review voice dictation patterns or manage dictation quality.
npx skillsauth add glebis/claude-skills wispr-analyticsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Extract and analyze Wispr Flow dictation history from the local SQLite database. Combine quantitative metrics with LLM-powered qualitative analysis for self-reflection, work pattern recognition, and mental health awareness.
Wispr Flow stores all dictations in SQLite at:
~/Library/Application Support/Wispr Flow/flow.sqlite
Key table: History with fields: formattedText, timestamp, app, numWords, duration, speechDuration, detectedLanguage, isArchived.
The user has ~8,500+ dictations since Feb 2025, bilingual (Russian/English), across apps: iTerm2, ChatGPT, Arc browser, Claude Desktop, Windsurf, Telegram, Obsidian, Perplexity.
Run scripts/extract_wispr.py to pull data from the database:
# Get today's data as JSON with stats + text samples
python3 scripts/extract_wispr.py --period today --mode all --format json
# Get markdown stats for the last week
python3 scripts/extract_wispr.py --period week --format markdown
# Get text samples only for LLM analysis
python3 scripts/extract_wispr.py --period month --mode mental --texts-only
# Save to file
python3 scripts/extract_wispr.py --period week --format markdown --output /path/to/output.md
today -- current day (default)yesterday -- previous dayweek -- last 7 daysmonth -- last 30 daysYYYY-MM-DD -- specific dateYYYY-MM-DD:YYYY-MM-DD -- date rangeall -- full analysis (default)technical -- filters to coding/AI tool dictationssoft -- filters to communication/writing dictationstrends -- focus on volume/frequency patternsmental -- all text, framed for wellbeing reflectionprosody -- audio-based: pitch/intensity/voice-quality from recorded WAV (separate script scripts/extract_prosody.py; recent dictations only). See "Prosody Mode" below.--compare -- auto-compare with the equivalent previous period (week vs previous week, month vs previous month)--graphs PATH -- generate an HTML dashboard with Chart.js graphs (implies --compare). Graphs include: daily words overlay, hourly activity, category breakdown, top apps, language distribution# Compare this month vs previous month (markdown)
python3 scripts/extract_wispr.py --period month --compare --format markdown
# Generate visual dashboard for week comparison
python3 scripts/extract_wispr.py --period week --compare --graphs /tmp/wispr-week.html
# Compare and save both markdown + graphs
python3 scripts/extract_wispr.py --period month --compare --format markdown --output report.md --graphs report.html
A standalone analysis mode -- a peer of technical/soft/trends/mental -- that analyzes how dictations sounded, not just what was said. It reads the recorded WAV audio stored in History.audio and uses Praat (via parselmouth) to extract prosodic features as gentle affect/energy proxies for self-reflection. Run it via the dedicated script scripts/extract_prosody.py.
pip install praat-parselmouth
librosa/scipy/soundfile are acceptable fallbacks but the script uses parselmouth (Praat) as the gold standard.
Wispr keeps the recorded audio only for recent dictations -- roughly the last ~900 of 16,000+ history rows. Older rows have their audio blob pruned after upload (and builtInAudio is always empty). So prosody is available for recent dictations only; for older periods the audio is gone and only timing-based metrics (rate, pauses) could ever be recovered. The script surfaces this honestly: every report opens with a coverage line (X of Y dictations in this period had retained audio) and logs when --limit truncates coverage.
to_pitch(), unvoiced frames ignored: mean, median, min, max, range, std, and CV (std/mean) as a monotone <-> expressive proxy.feature_failures).numWords / (speechDuration/60) WPM, and pause ratio (duration - speechDuration)/duration (clamped >= 0).# Prosody report for the last week (text)
python3 scripts/extract_prosody.py --period week
# Last month as JSON
python3 scripts/extract_prosody.py --period month --format json
# Specific day, raise the clip cap so coverage isn't truncated
python3 scripts/extract_prosody.py --period 2026-06-11 --limit 600
# Save to a file
python3 scripts/extract_prosody.py --period week --output /tmp/prosody-week.md
Args: --period (same semantics as extract_wispr.py: today/yesterday/week/month/YYYY-MM-DD/YYYY-MM-DD:YYYY-MM-DD), --format text|json, --limit N (cap clips processed, default 300 to bound runtime -- logs to stderr when it truncates), --output PATH. The DB is opened strictly read-only (mode=ro&immutable=1).
Performance: audio analysis is ~15-20s for 300 clips (slow vs SQL). The default --limit 300 keeps single runs fast; raise it for full coverage of a busy period.
Gleb is male, so expect mean F0 roughly 95-150 Hz (observed ~120 Hz). Russian typically shows slightly higher F0 and CV than English in the by-language split. F0 CV usually lands ~0.2-0.3.
Prosody complements the text-based mental mode with acoustic affect/energy proxies, framed the same way -- as reflection invitations, never diagnoses:
Acoustic features are also shaped by microphone, room, a cold, and language -- so always name that uncertainty and compare like-with-like (same language, against the user's recent baseline). See the Prosody Mode template in references/analysis-prompts.md for the full interpretive prompt.
Run the extraction script with the requested period and mode. Use --format json for full data or --texts-only for LLM analysis focus.
Display the quantitative summary first:
Read references/analysis-prompts.md to load the appropriate analysis template for the requested mode. Then analyze the text samples using that template.
For each mode:
Technical: Focus on what was worked on, technical decisions, context-switching patterns, productivity assessment.
Soft: Focus on communication style shifts, language-switching patterns, audience adaptation, interpersonal dynamics.
Trends: Focus on volume changes, time-of-day shifts, app migration, behavioral change hypotheses.
Mental: Focus on energy proxies, sentiment signals, rumination detection, activity pattern changes. Frame all observations as invitations for self-reflection, never as diagnoses. Use language like "you might notice..." or "this pattern could suggest..."
All: Combine all four perspectives into a unified reflection.
Default output location: meta/wispr-analytics/YYYYMMDD-period-mode.md in the vault.
File format:
---
created_date: '[[YYYYMMDD]]'
type: wispr-analytics
period: [period description]
mode: [mode]
---
# Wispr Flow Analytics: [period]
## Quantitative Summary
[stats from Step 2]
## Analysis
[qualitative analysis from Step 3]
## Reflection Prompts
[3-5 questions based on observations]
If the user requests console-only output, skip file creation and display directly.
The extraction script categorizes apps:
Manage Wispr Flow's dictionary for better recognition accuracy. The dictionary JSON is version-controlled in ~/ai_projects/claude-skills/wispr-analytics/data/dictionary.json.
Run scripts/wispr_dictionary.py for all dictionary operations:
# Check database health and dictionary stats
python3 scripts/wispr_dictionary.py check
# List all entries (safe while Wispr is running)
python3 scripts/wispr_dictionary.py list
python3 scripts/wispr_dictionary.py list --filter "claude"
# Export dictionary to JSON (safe while running)
python3 scripts/wispr_dictionary.py export
# Suggest new entries by analyzing ASR vs formatted text differences
python3 scripts/wispr_dictionary.py suggest --days 30 --min-freq 3
# Propose snippets + replacement rules + vocab from dictation logs (safe while running)
python3 scripts/wispr_dictionary.py propose --days 30 --min-freq 3
python3 scripts/wispr_dictionary.py propose --days 90 --min-freq 2 --format json
# Add a single term (requires Wispr Flow to be QUIT)
python3 scripts/wispr_dictionary.py add "Gastown"
python3 scripts/wispr_dictionary.py add "cloud code" "Claude Code"
# Remove an entry (requires Wispr Flow to be QUIT)
python3 scripts/wispr_dictionary.py remove "old term"
# Import from JSON (requires Wispr Flow to be QUIT)
python3 scripts/wispr_dictionary.py import --dry-run
python3 scripts/wispr_dictionary.py import
CRITICAL: Wispr Flow must be quit before any write operations (add, remove, import). The script enforces this automatically. Read operations (export, list, suggest, check) are safe while Wispr is running.
Writing to the SQLite database while Wispr Flow has it open causes index corruption. Always:
pgrep -f "Wispr Flow"check to verify integritysuggest only catches ASR mishears. propose is the broader, human-style review:
it reads recent dictation logs and proposes dictionary additions in three
categories, skipping anything already in the dictionary. It is read-only and
safe while Wispr Flow is running -- it never writes to the database.
# Default: last 30 days, terms seen >= 3 times
python3 scripts/wispr_dictionary.py propose
# Wider net, machine-readable
python3 scripts/wispr_dictionary.py propose --days 90 --min-freq 2 --format json
Flags: --days (history window), --min-freq (minimum occurrences), --format
(text default, or json).
The three categories:
My X trigger phrase + the full expansion.suggest via the find_mishears helper).HTML, LinkedIn, SDK) that may be mis-recognized -- teach Wispr the
spelling.Each proposal prints a frequency count and a ready-to-run add command line.
Snippets are the single highest-leverage, most underused dictionary feature.
A user with 1,600+ dictations/month often has only a handful of snippets. One
My GitHub -> URL snippet saves dictating (and mis-dictating) a URL dozens of
times. Always foreground snippet candidates first.
extract_wispr.py) to understand volume and where snippets pay off.propose (safe while Wispr runs).add lines (snippets need add "My X" "expansion").python3 scripts/wispr_dictionary.py check to verify integrity.When running analytics, also check for dictionary improvement opportunities:
propose to surface snippets, replacement rules, and vocab in one pass
(or suggest for mishears only)asrText vs formattedText for patternsasrText field contains raw speech recognition before formatting -- useful for detecting speech patterns vs formatted output~/ai_projects/claude-skills/wispr-analytics/data/dictionary.json for version controldata-ai
--- name: disk-cleanup description: Scan and clean macOS caches, package-manager data, crash dumps, and app caches to reclaim disk space. Deterministic — a config registry (targets.json) plus two scripts (survey.py read-only, clean.py executor) do all the measuring and deleting; the agent only relays a compressed summary and makes the few human-judgment calls. IMPORTANT — use this skill whenever the user's request on macOS involves: freeing disk space, cleaning/clearing caches, "disk is full", "
development
Generate and edit images using Google's Gemini image generation models (Nano Banana family). Supports style presets, platform-specific sizing (YouTube/slides/blog), variants, image editing via inlineData, reference images for style transfer, and organized output with metadata. Default model is Nano Banana 2 (gemini-3.1-flash-image-preview). Key is auto-decrypted via SOPS.
development
--- name: agency-docs-updater description: End-to-end pipeline for publishing Claude Code lab meetings. Accepts optional args: date (YYYYMMDD, "yesterday", "today") and lab number (e.g. "04"). Examples: "yesterday 04", "20260420 05", "04" (today, lab 04), "" (today, auto-detect lab). --- # Agency Docs Updater Execute ALL steps automatically in sequence. Only pause if a step fails and cannot be recovered. Read `references/learnings.md` before starting for known pitfalls. **Configuration**: pat
tools
This skill should be used when applying proper typography to prose text or files in Russian, English, German, or French — smart quotes per locale («ёлочки», “curly”, „Gänsefüßchen“, « guillemets »), correct dashes (тире, em/en dash, Gedankenstrich, tiret), non-breaking spaces, ranges, ellipsis, and French espaces insécables before ! ? ; :. Fully deterministic via a pinned typograf-based CLI; never apply these rules by hand. Triggers on "типографика", "typograf", "оттипографь", "smart quotes", "fix typography", "неразрывные пробелы".