Skip to content

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:

Trend monitoring architecture
/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:

Set store permanently
# In ~/.config/last30days/.env
LAST30DAYS_STORE=1

2. Watchlist

The watchlist.py script manages topics researched on a schedule:

Watchlist workflow
# 1. Run baseline research (one-time per topic)
/last30days "topic" --store
# 2. Add to watchlist
python3 scripts/watchlist.py add "topic" --weekly
# 3. Configure Slack delivery
python3 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:

Generate briefings
# Daily digest
python3 scripts/briefing.py generate
# Weekly digest
python3 scripts/briefing.py generate --weekly
# Show a specific date's brief
python3 scripts/briefing.py show --date 2026-06-01

Briefs save to ~/.local/share/last30days/briefs/ as structured markdown.

Scheduling

The watchlist stores the schedule as metadata. The actual cron invocation is your responsibility:

Cron schedule
# Every Monday at 8 AM
0 8 * * 1 cd /path/to/last30days && python3 scripts/watchlist.py run-all

The 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