newsletter-events-list-sources
List all configured event sources (Instagram, web aggregators)
When & Why to Use This Skill
This Claude skill enables users to efficiently list and manage configured event sources, including Instagram accounts and web aggregators, stored in local configuration files. It provides a structured overview of data inputs, facilitating streamlined workflows for event discovery, newsletter curation, and automated content gathering.
Use Cases
- Auditing active Instagram handles and web aggregator URLs to ensure comprehensive coverage for local event newsletters.
- Verifying existing configurations before adding or removing sources to prevent duplicate entries in the event tracking system.
- Reviewing metadata for web sources, such as page limits and source types, to optimize automated scraping and data collection parameters.
- Quickly identifying gaps in event data collection by filtering sources by type (Instagram vs. Web) to ensure a balanced content mix.
| name | newsletter-events-list-sources |
|---|---|
| description | List all configured event sources (Instagram, web aggregators) |
All sources are stored in ~/.config/local-media-tools/sources.yaml.
Source Types
| Type | Filter Keyword | Description |
|---|---|---|
instagram, ig |
@handle accounts | |
| Web | web |
Event aggregator websites |
Note: Facebook events are not configured sources. Pass event URLs directly to /research.
Output Format
Sources are displayed in grouped tables with relevant metadata for each type.
What sources do you want to list?Options:
allor blank - Show all configured sourcesinstagram- Only Instagram accountsweb- Only web aggregators
Provide filter (or press Enter for all):
## Step 1: Parse FilterCheck if user provided a filter keyword:
filter_input = user_input.strip().lower()
# Normalize filter aliases
filter_map = {
"": "all",
"all": "all",
"instagram": "instagram",
"ig": "instagram",
"web": "web",
}
selected_filter = filter_map.get(filter_input, "all")
Step 2: Load Config
from pathlib import Path
import yaml
config_path = Path.home() / ".config" / "local-media-tools" / "sources.yaml"
if not config_path.exists():
print("ERROR: sources.yaml not found. Run /newsletter-events:setup first.")
# STOP HERE
with open(config_path) as f:
config = yaml.safe_load(f)
Step 3: Extract Sources
sources = config.get("sources", {})
instagram_accounts = sources.get("instagram", {}).get("accounts", [])
web_sources = sources.get("web_aggregators", {}).get("sources", [])
Step 4: Check for Empty State
total_sources = len(instagram_accounts) + len(web_sources)
if total_sources == 0:
print("No sources configured.")
print("")
print("To add sources: /newsletter-events:add-source @handle")
# STOP HERE
Step 5: Format and Display Tables
Display each category with appropriate columns:
Instagram Accounts:
| Handle | Name | Type | Location |
|---|---|---|---|
| @localvenue | Local Venue | music_venue | Kingston, NY |
| @themusicbar | The Music Bar | bar | - |
Web Aggregators:
| URL | Name | Type | Max Pages |
|---|---|---|---|
| https://hvmag.com/events | HV Magazine | listing | 50 |
Step 6: Show Summary
Total: N sources configured
- Instagram: X accounts
- Web: Y aggregators
To add sources: /newsletter-events:add-source @handle
To remove sources: /newsletter-events:remove-source @handle
Note: For Facebook events, pass URLs directly to /research
Handling Filtered Views
If a filter was applied but that category is empty:
No instagram sources found.
You have:
- 1 web aggregator
To add Instagram accounts: /newsletter-events:add-source @handle
- [ ] Config loaded successfully
- [ ] Filter applied correctly (if provided)
- [ ] Output formatted as readable tables
- [ ] Empty states handled with helpful messages
- [ ] Summary shows totals
- [ ] Next actions suggested