skills/monthly-insights/SKILL.md
Generate a Claude Code usage report, extract key takeaways, add a Zoho inbox summary, save to Obsidian vault, and email a clean summary via Himalaya CLI. Use when the user says "monthly insights", "insights email", "email me my report", or "monthly review".
npx skillsauth add asets-gobizit/claude-skills monthly-insightsInstall 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.
Generates the Claude Code usage report, extracts the key takeaways, pulls a Zoho inbox health snapshot, saves everything to the Obsidian vault, and emails a clean summary to Danny's Zoho work inbox via the local Himalaya CLI.
Work-only artifact. This skill MUST NOT touch the personal Gmail account. Inbox summary and send destination are both strictly zoho-danny.
C:\Users\dansk\Claude\Obsidian@Claude\Claude Tips\zoho-danny ([email protected], Zoho One / USA DC)[email protected] → [email protected] (self-send)himalaya CLI v1.2.0 via smtppro.zoho.com:465C:\Users\dansk\.claude\usage-data\report.html (owned by Claude Code harness — NEVER overwrite)C:\Users\dansk\.claude\usage-data\report-local-fallback.html (written by our Python script)C:\Users\dansk\.claude\skills\monthly-insights\generate_report.py (local, no API calls, fallback only)No MCP, no OAuth, no API keys, no slash commands. Just Python + Himalaya CLI, end-to-end self-contained.
User says any of:
/insights output)Look for the real Claude Code Insights report FIRST. When the /insights harness command is triggered (by typing it in chat, or via whatever Claude Code UI affordance the user used), the harness writes its rich, semantically analyzed HTML report to:
C:\Users\dansk\.claude\usage-data\report.html ← REAL /insights output
Danny may also have a browser-saved backup at:
C:\Users\dansk\.claude\usage-data\Claude Code Insights.html ← user backup, DO NOT TOUCH
The real report is dramatically higher quality than any local fallback — friction narratives, inferred satisfaction, session-type classification, response-time histograms, Claude-written CLAUDE.md rules. Prefer it whenever it exists and is ≤ 30 days old.
report.html is OWNED by the Claude Code harness. This skill must NEVER write to, overwrite, or delete it. It is the real /insights output.Claude Code Insights.html is Danny's backup. Also NEVER touch it.report-local-fallback.html — a distinct filename that can never collide with the real report.IF "report.html" exists AND file mtime is within 30 days:
report_path = "C:\Users\dansk\.claude\usage-data\report.html" (REAL /insights — preferred)
source = "real /insights"
ELSE IF "Claude Code Insights.html" exists AND within 30 days:
report_path = "C:\Users\dansk\.claude\usage-data\Claude Code Insights.html"
source = "user-saved backup of real /insights"
ELSE:
Run: python "C:\Users\dansk\.claude\skills\monthly-insights\generate_report.py" --days 30
report_path = "C:\Users\dansk\.claude\usage-data\report-local-fallback.html"
source = "local fallback (lower quality)"
In the email footer, add a note suggesting the user run /insights manually
for a higher-quality report next time.
The local generator ONLY ever writes to report-local-fallback.html — never to report.html or Claude Code Insights.html. Both are off-limits.
Note: Claude Code's built-in
/insightsslash command cannot be invoked programmatically from inside a skill (slash commands are intercepted by the harness before reaching Claude). That's why the skill reads the file on disk if it already exists, and falls back to a local generator otherwise.
Use the Read tool on C:\Users\dansk\.claude\usage-data\report.html and pull out:
Pull a quick snapshot of the work inbox. Never touch the personal Gmail account.
himalaya envelope list -a zoho-danny -p 1 -s 30
From the output, compute:
S (seen)Format it as an "Inbox Health (Zoho work)" section with exactly these three subsections.
Use the Write tool to create:
C:\Users\dansk\Claude\Obsidian@Claude\Claude Tips\Claude Insights DD-MM-YYYY.md
Date format: European (DD-MM-YYYY), e.g. Claude Insights 05-04-2026.md
Note template:
---
date: DD-MM-YYYY
tags:
- claude-code
- monthly-review
type: review
---
# Claude Insights DD-MM-YYYY
## Friction Points
1. **[title]** — [one-sentence description]
2. ...
## Suggested CLAUDE.md Rules
- [rule text]
- ...
## Features to Try
1. **[feature name]** — [one-liner]
Why for you: [rationale]
2. ...
## Inbox Health (Zoho work)
- **Unread:** N messages
- **Top 5 senders (last 30):**
1. sender — count
2. ...
- **Latest 3 subjects:**
1. subject
2. ...
## Full Report
Open `C:\Users\dansk\.claude\usage-data\report.html` in your browser.
Confirm the note was created.
Send the full HTML report as the email body — not a plain-text summary. The HTML renders cleanly in Zoho Mail's web client and preserves all the charts, colors, and semantic sections.
Every monthly email MUST have this blue callout banner injected immediately after <div class="container"> (or at the top of <body> if no container):
<div style="background:#dbeafe;border:2px solid #2563eb;border-radius:12px;padding:20px 24px;margin:0 0 24px 0;font-family:-apple-system,Segoe UI,sans-serif;">
<p style="margin:0 0 12px 0;font-size:15px;color:#1e3a8a;line-height:1.6;">
👉 <strong>To get a full report with real insights + ready-to-use prompt recommendations, run <code style="background:#fff;padding:2px 8px;border-radius:4px;border:1px solid #93c5fd;font-family:monospace;color:#1d4ed8;">/insights</code> in VS Code Claude (Chat only — not in the terminal).</strong>
</p>
<p style="margin:0;font-size:15px;color:#1e3a8a;line-height:1.6;">
👉 <strong>The generated report will appear at:</strong> <a href="file:///C:/Users/dansk/.claude/usage-data/report.html" style="color:#1d4ed8;font-family:monospace;font-size:13px;word-break:break-all;">C:\Users\dansk\.claude\usage-data\report.html</a>
</p>
</div>
Important:
generate_report.py) ALREADY has this callout baked in — no injection needed when sending the fallback./insights HTML (report.html or Claude Code Insights.html) does NOT have it — inject it at send time before piping to himalaya.Claude Code Insights.html) also does NOT have it — inject at send time.import subprocess
from pathlib import Path
CALLOUT = '''<div style="background:#dbeafe;border:2px solid #2563eb;border-radius:12px;padding:20px 24px;margin:0 0 24px 0;font-family:-apple-system,Segoe UI,sans-serif;">
<p style="margin:0 0 12px 0;font-size:15px;color:#1e3a8a;line-height:1.6;">
👉 <strong>To get a full report with real insights + ready-to-use prompt recommendations, run <code style="background:#fff;padding:2px 8px;border-radius:4px;border:1px solid #93c5fd;font-family:monospace;color:#1d4ed8;">/insights</code> in VS Code Claude (Chat only — not in the terminal).</strong>
</p>
<p style="margin:0;font-size:15px;color:#1e3a8a;line-height:1.6;">
👉 <strong>The generated report will appear at:</strong> <a href="file:///C:/Users/dansk/.claude/usage-data/report.html" style="color:#1d4ed8;font-family:monospace;font-size:13px;word-break:break-all;">C:\\Users\\dansk\\.claude\\usage-data\\report.html</a>
</p>
</div>
'''
with open(report_path, encoding="utf-8") as f:
html = f.read()
# Inject callout only if not already present (local fallback has it baked in)
if "To get a full report with real insights" not in html:
# Try container div first, then body
if '<div class="container">' in html:
html = html.replace('<div class="container">', '<div class="container">' + CALLOUT, 1)
else:
html = html.replace('<body>', '<body>' + CALLOUT, 1)
msg = (
"From: [email protected]\r\n"
"To: [email protected]\r\n"
f"Subject: Monthly Claude Code Review {today}\r\n"
"MIME-Version: 1.0\r\n"
"Content-Type: text/html; charset=utf-8\r\n"
"\r\n"
) + html
subprocess.run(
["himalaya", "message", "send", "-a", "zoho-danny"],
input=msg, text=True, encoding="utf-8", check=True,
)
Confirm himalaya returns Message successfully sent!.
Report back to the user:
C:\Users\dansk\.claude\usage-data\report.htmlClaude Tips/Claude Insights DD-MM-YYYY.md[email protected]gmail account in this skill. Inbox summary and send both use -a zoho-danny exclusively.config.toml or any password back to chat.report.html OR Claude Code Insights.html: The first is owned by the Claude Code harness (real /insights output), the second is Danny's browser backup. The local fallback generator writes ONLY to report-local-fallback.html, and has a hard safety check that refuses to run if its output path ever collides with either protected file.C:\Users\dansk\AppData\Roaming\himalaya\config.toml, confirm [accounts.zoho-danny] existsbackend.auth.raw lines under [accounts.zoho-danny]python --version should work. The script reads C:\Users\dansk\.claude\projects\**\*.jsonl — if that directory is empty, there's nothing to analyze.data-ai
Automated backup skill for PKA + Obsidian + Claude memory. Snapshots pka.db (via SQLite .backup so WAL is handled safely), the Obsidian vault, Claude memory files, agent profiles, and the help-content Excel into a single timestamped zip in Zoho WorkDrive. Daily/weekly/monthly retention rotation built in. USE WHEN Danny says "backup", "run backup", "snapshot pka", or to recover from a snapshot.
testing
Run any question, idea, or decision through a council of 5 AI advisors who independently analyze it, peer-review each other anonymously, and synthesize a final verdict. Based on Karpathy's LLM Council methodology, packaged as the stress-test skill. MANDATORY TRIGGERS: 'stress-test this', 'stress test this', 'pressure-test this', 'pressure test this', 'war room this', 'council this', 'run the council', 'debate this'. STRONG TRIGGERS (use when combined with a real decision or tradeoff): 'should I X or Y', 'which option', 'what would you do', 'is this the right move', 'validate this', 'get multiple perspectives', 'I can't decide', 'I'm torn between'. Do NOT trigger on simple yes/no questions, factual lookups, or casual 'should I' without a meaningful tradeoff (e.g. 'should I use markdown' is not a stress-test question). DO trigger when the user presents a genuine decision with stakes, multiple options, and context that suggests they want it pressure-tested from multiple angles.
content-media
Weekly scan of Obsidian vault for empty/low-content notes. Moves them to zToBeDeleted/ for user review. Use when the user says "tidy obsidian", "clean obsidian", "obsidian cleanup", or on scheduled weekly run.
development
Design-first website builder. Accepts a Claude Design export (HTML or screenshot) as a visual blueprint, collects business inputs, calls Claude API to generate a design-matched index.html, and publishes to GitHub Pages. Falls back to vibe-based generation if no design is provided. Use when the user says "make-website-design", "design website", "build from design", or provides a Claude Design export for website generation.