How to Monitor Topics Over Time with /last30days's Watchlist and Briefings
Purpose
One-off research tells you what happened in the last 30 days. But for competitor monitoring, industry trends, or client intelligence, I need the same research on a recurring schedule with change detection. This post shows how to set that up.
The Three-Layer Stack
/last30days provides three components for trend monitoring:
/last30days <topic> --store │ ▼┌──────────────────┐│ SQLite Store │ Persists every finding│ (store.py) │ Deduplicates on source_url└────────┬─────────┘ │ ▼┌──────────────────┐│ Watchlist │ Manages recurring topics│ (watchlist.py) │ Slack/webhook delivery└────────┬─────────┘ │ ▼┌──────────────────┐│ Briefings │ Daily or weekly digests│ (briefing.py) │ Structured markdown output└──────────────────┘1. The Store Flag
The --store flag persists every finding to a SQLite database at ~/.local/share/last30days/research.db. It deduplicates on source_url, so the same URL across runs updates the existing row rather than creating duplicates.
Set LAST30DAYS_STORE=1 in .env for always-on storage:
# In ~/.config/last30days/.envLAST30DAYS_STORE=12. Watchlist
The watchlist.py script manages topics researched on a schedule:
# 1. Run baseline research (one-time per topic)/last30days "topic" --store
# 2. Add to watchlistpython3 scripts/watchlist.py add "topic" --weekly
# 3. Configure Slack deliverypython3 scripts/watchlist.py config delivery "https://hooks.slack.com/services/..."
# 4. Run recurring (via cron: 0 8 * * 1)python3 scripts/watchlist.py run-one "topic"Watchlist subcommands: add, remove, list, run-one, run-all. Built-in delivery fires only when new findings appear. It hardcodes --quick and --lookback-days 90 for efficiency.
3. Briefings
The briefing.py script reads the SQLite store and emits structured digests:
# Daily digestpython3 scripts/briefing.py generate
# Weekly digestpython3 scripts/briefing.py generate --weekly
# Show a specific date's briefpython3 scripts/briefing.py show --date 2026-06-01Briefs save to ~/.local/share/last30days/briefs/ as structured markdown.
Scheduling
The watchlist stores the schedule as metadata. The actual cron invocation is your responsibility:
# Every Monday at 8 AM0 8 * * 1 cd /path/to/last30days && python3 scripts/watchlist.py run-allThe pattern: cron runs watchlist.py run-one or run-all, which invokes the engine with the store flag, then delivers new findings via Slack or webhook.
Summary
In this post, I explained how /last30days’s three-layer monitoring stack — store + watchlist + briefings — turns one-off research into a recurring intelligence pipeline. The key point is to run a baseline once, add to watchlist, then let cron handle the recurring schedule.
Final Words + More Resources
My intention with this article was to help others share my knowledge and experience. If you want to contact me, you can contact by email: Email me
Here are also the most important links from this article along with some further resources that will help you in this scope:
Oh, and if you found these resources useful, don’t forget to support me by starring the repo on GitHub!
Comments