aniketpanjwani/local_media_tools/newsletter-events-write

Claude Code and agent skill by aniketpanjwani/local_media_tools

Trust tier 2
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Generate markdown newsletters from stored events. Use when the user wants to create, write, or generate a newsletter from scraped events.

Install

npx vskill@latest install aniketpanjwani/local_media_tools/newsletter-events-write

SKILL.md

<essential_principles>

How This Skill Works

This skill generates markdown newsletters from events stored in SQLite. The workflow splits responsibility:

  1. CLI tool handles fragile data operations (paths, types, queries)
  2. Claude handles creative generation (interpreting preferences, formatting)
Key Concept: Natural Language Formatting

Users describe how they want newsletters formatted in plain English. You interpret these instructions directly - no templates or structured syntax needed.

Example preference from config:

yaml
formatting_preferences: |
Organize by date with each day as a section header.
Use emojis: 🎵 music, 🎨 art, 🍴 food.
Format: **Title** @ Venue | Time | Price
Data Source

Events are stored in SQLite at ~/.config/local-media-tools/data/events.db. Config is at ~/.config/local-media-tools/sources.yaml.

Output

Generated markdown saved to ./newsletter_YYYY-MM-DD.md in the current working directory. </essential_principles>

<critical>

Use CLI for Data Loading - Never Inline Python

NEVER write inline Python to load events or config. Use the CLI tool:

bash
# Get plugin directory first
PLUGIN_DIR=$(cat ~/.claude/plugins/installed_plugins.json | jq -r '.plugins["newsletter-events@local-media-tools"][0].installPath')
# Load events and preferences (default: next 7 days)
cd "$PLUGIN_DIR" && uv run python scripts/cli_newsletter.py load --days 7

The CLI tool handles:

  • Correct database path resolution
  • Proper date type conversions
  • Loading formatting preferences from config
  • Returning structured JSON

Do NOT:

  • Write inline Python to query the database
  • Hardcode paths to config or database
  • Import schema modules directly

</critical>

<workflow>

Step 0: Get Plugin Directory

bash
cat ~/.claude/plugins/installed_plugins.json | jq -r '.plugins["newsletter-events@local-media-tools"][0].installPath'

Save the output path as PLUGIN_DIR.

Step 1: Load Data with CLI

Run the CLI to get events and formatting preferences:

bash
cd "$PLUGIN_DIR" && uv run python scripts/cli_newsletter.py load --days 7

Or for a specific date range:

bash
cd "$PLUGIN_DIR" && uv run python scripts/cli_newsletter.py load --from 2025-01-01 --to 2025-01-14

Output: JSON containing:

  • newsletter_name - Newsletter title
  • region - Geographic region
  • formatting_preferences - User's natural language formatting instructions
  • date_range - Start and end dates
  • event_count - Number of events
  • events - Array of event objects

If no events found, the CLI returns an error with suggestions.

Step 2: Generate Newsletter (Your Creative Task)

Using the JSON output from Step 1, generate markdown that follows the formatting_preferences.

Your task: Interpret the natural language preferences and apply them creatively:

  • Read the formatting_preferences field
  • Adapt raw event descriptions to match user's desired style
  • Apply emoji rules, formatting patterns, organization
  • Generate readable, well-structured markdown
Available Fields Reference

Each event in the events array has:

FieldDescriptionExample
titleEvent name"Jazz Night"
venueVenue name"The Blue Note"
venue_cityVenue city"Kingston"
dateISO date"2025-01-20"
day_of_weekFull day name"Saturday"
formatted_dateHuman-readable date"January 20"
timeStart time"8:00 PM" or null
descriptionEvent description"Live jazz trio..."
categoryEvent category"music", "art", "food_drink"
pricePrice or null"$15"
is_freeBooleantrue/false
ticket_urlLink to buy ticketsURL or null
event_urlLink to event pageURL or null
source_urlWhere event was foundURL or null
Formatting Guidelines
  1. Read preferences carefully - follow user instructions exactly
  2. Handle nulls gracefully - skip fields that are null/missing
  3. Sort appropriately - events come pre-sorted by date then time
  4. Be creative - adapt descriptions to match user's style

Step 3: Save Output

Write the generated markdown to the current working directory:

./newsletter_YYYY-MM-DD.md

Use today's date for the filename.

Step 4: Display Preview

Show the first ~50 lines of generated markdown so user can review.

Report:

  • Output file path
  • Number of events included
  • Date range covered

</workflow>

<error_handling>

No Events Found

The CLI will return:

json
{
"error": "no_events",
"message": "No events found from 2025-01-01 to 2025-01-07",
"suggestion": "Run /newsletter-events:research to scrape new events, or try a wider date range with --days 14"
}

Report this to the user with the suggestion.

No Formatting Preferences

If formatting_preferences is null or empty, use sensible defaults:

Organize events chronologically by date.
Use section headers for each day (e.g., "## Saturday, January 20").
Include event title, venue, time, and price.
Keep formatting simple and readable.
Database Not Found

The CLI will return:

json
{
"error": "database_not_found",
"message": "Database not found at ~/.config/local-media-tools/data/events.db",
"suggestion": "Run /newsletter-events:research to scrape events first"
}

</error_handling>

<success_criteria> Newsletter generation is complete when:

  • [ ] CLI tool used to load events (not inline Python)
  • [ ] Formatting preferences interpreted correctly
  • [ ] Markdown generated following user's preferences
  • [ ] Output saved to ./newsletter_YYYY-MM-DD.md
  • [ ] Preview displayed to user

</success_criteria>

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
40
Repository forks
14
7-day trend score
19

Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 19 Mar 2026, 7 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/aniketpanjwani/local_media_tools/newsletter-events-write/badge)](https://verified-skill.com/skills/aniketpanjwani/local_media_tools/newsletter-events-write)

Something wrong with this skill or its page? Tell us.