Econ Dashboard
Economists have to stay current: papers, working-paper series, newsletters, data releases, commentary, all scattered across platforms, easy to miss and easier to forget. This pipeline turns the 15+ sources I checked by hand into one verified morning read, searchable forever.
Staying current was a job of its own
I followed 15+ economics sources by hand across four surfaces: a bookmarks folder, 7 Substack newsletters in my inbox, NBER's weekly abstracts email, and 2 YouTube channels. Checked daily, with no memory of what I had already seen and no way to search across any of it.
Fetch, rank, label, serve
Fetch
46 sources (RSS, an undocumented NBER JSON API, arXiv, World Bank API, RePEc digests, a Google News proxy for scraper-blocking sites) land in a local SQLite archive with full-text search.
Rank
Cross-source phrase-surge detection builds a weekly trending panel; a scored daily shortlist displays the exact reasons every pick was chosen.
Label
The LLM is used only where semantics genuinely need it: labelling trend clusters the data already found, and scoring papers 0-10 for the development-economics x AI intersection, justification shown beside every paper.
Serve
A vanilla-JS dashboard, no framework and no build step, installable as a PWA. A scheduled job pre-fetches everything at 6:30am, before I'm up.
Items are classified once and cached, so a page reload never re-bills the API, and unparseable dates raise instead of defaulting: that rule exists because a lenient parser once reported "0 posts in 30 days" for a feed that publishes daily. That bug is now a regression test.
Failures are loud; the LLM never decides
Human in the loop throughout: I choose the sources, papers scored 4-6 are left to my judgment, saving and note-taking are manual, and nothing is auto-published anywhere.
Measured from real runs
Time saved per day: not measured. API cost: bounded by design to roughly one labelling call per fetch plus one-time scoring per new paper. And one real data-integrity incident, 248 duplicate rows from a mid-project hashing change, was detected, fixed, migration-tested, and documented.
Stack
Public code, keys and personal reading data excluded, on GitHub.