Precise real-world-example news search and spaced-repetition study tools for IB Economics — offline-first, explainable, classic IR (BM25).
Project description
EconLens 🔎
Find precise, current real-world news examples for any IB Economics concept — ranked, explainable, and offline-first.
The hardest marks on IB Economics Paper 1 (b) — the 15-mark Evaluate / Discuss / Examine questions — reward real-world examples (RWE). EconLens turns any syllabus concept into a ranked list of current news stories you can cite, with the date, source, and a link back to the original article.
$ econlens news inflation
🔎 Inflation [macro/inflation]
1. [13.6] US inflation rose at fastest pace in three years as energy costs surge
2026-05-28 · The Guardian — Economics
https://www.theguardian.com/business/2026/may/28/...
2. [ 4.0] US PCE inflation rate hits three-year high …
...
see also: monetary_policy, interest_rates, deflation
Why it's different
- 🎯 Precise, not a keyword dump — each concept has a hand-tuned keyword set
(
must/boost/exclude), so "minimum wage" never returns "minimum balance". - 🔬 Explainable — classic Okapi BM25 ranking with title-field weighting.
Run with
--whyto see exactly which keywords and how recent each result is. Fully deterministic: the same news yields the same ranking, every time. - 🕒 Recency-aware — RWE must be current, so fresher stories get a bounded,
half-life recency bonus, and
--since 30dtrims the search to a window. - 🆓 Offline-first & free — pulls from key-less sources (economics RSS feeds + the free GDELT news API), fetched concurrently so the wait is the slowest single source, not their sum. An optional NewsAPI key adds coverage but is never required.
- 🤖 Scriptable —
--jsonemits structured results (status on stderr) so you can pipe EconLens into other tools. - 🧩 Data-driven — concepts live in a YAML ontology; contributors extend
coverage by editing data, not code. The schema reserves a
coursefield so other curricula (A-Level, AP) can be added later. - 🔒 Copyright-safe — only the headline, link, date, and source are stored; article bodies are never copied. Results always link to the original.
Quickstart
pip install econlens
Or from source:
git clone https://github.com/HarryXin0919/econlens.git
cd econlens
pip install -e . # add .[dev] for tests
# list the concepts (35 across micro / macro / global / development)
econlens concepts
econlens concepts --unit macro
# find real-world examples for a concept
econlens news minimum_wage
econlens news tariffs --why # show which keywords + how recent each match is
econlens news inflation --since 30d # only stories from the last 30 days (also 2w, 3m, 1y)
econlens news inflation --no-gdelt # RSS only (faster; skips the slower GDELT API)
econlens news tariffs --json # structured output for piping into other tools
GDELT can take 10–20 s and feeds occasionally hiccup; EconLens fetches every source concurrently, with a per-source timeout and retries, so one slow source never sinks the search.
Concepts covered (v0.2)
35 core IB Economics concepts:
| Unit | Examples |
|---|---|
| Micro | PED/PES, market failure, externalities, carbon/sugar tax, subsidies, minimum wage, price floors, monopoly, oligopoly, competition policy, labour markets |
| Macro | inflation, deflation, interest rates, monetary & fiscal policy, government debt, unemployment, economic growth, supply-side policy |
| Global | free trade, protectionism, tariffs, exchange rates, balance of payments |
| Development | economic development, poverty & inequality, foreign aid |
Add more by editing econlens/data/ontology.yaml — see CONTRIBUTING.md.
Optional: more sources via NewsAPI
The free GDELT + RSS sources need no setup. To also query NewsAPI
(free tier: 100 requests/day, non-commercial), copy config.example.py to
config_local.py and add your key, or set the NEWSAPI_KEY environment variable.
config_local.py is git-ignored and never committed.
Roadmap
- Phase 1 — concept ontology + multi-source fetch + BM25 ranking (
econlens news) - v0.2 — recency-aware ranking, concurrent fetch,
--since/--json - Phase 2 — syllabus-organised practice questions (
econlens questions) - Phase 3 — spaced-repetition review (SM-2) (
econlens review) - Phase 4 — optional Streamlit web UI
Design & contributing
The ranking model, ontology design, and source handling are documented in
docs/DESIGN.md. To add concepts, keywords, or news sources, see
CONTRIBUTING.md.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file econlens-0.2.1.tar.gz.
File metadata
- Download URL: econlens-0.2.1.tar.gz
- Upload date:
- Size: 25.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d49362ffa09e320d520a464a88aa0396e09744a8416c94a7993c00116c5db8a
|
|
| MD5 |
213afc54cef915b94107567ab91bbbfb
|
|
| BLAKE2b-256 |
510862dc95cfa1738074f3a59ab46ee25b0d850a9bd9b5a934c44cd839f37109
|
Provenance
The following attestation bundles were made for econlens-0.2.1.tar.gz:
Publisher:
publish.yml on HarryXin0919/econlens
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
econlens-0.2.1.tar.gz -
Subject digest:
4d49362ffa09e320d520a464a88aa0396e09744a8416c94a7993c00116c5db8a - Sigstore transparency entry: 1808813760
- Sigstore integration time:
-
Permalink:
HarryXin0919/econlens@d0544438ce35965b9373a8d4869e86efd3d81baf -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/HarryXin0919
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d0544438ce35965b9373a8d4869e86efd3d81baf -
Trigger Event:
push
-
Statement type:
File details
Details for the file econlens-0.2.1-py3-none-any.whl.
File metadata
- Download URL: econlens-0.2.1-py3-none-any.whl
- Upload date:
- Size: 23.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b8ee6cebfb26338fa9d98fddbef9e6e3e29441d53c524683f565f272d391eedf
|
|
| MD5 |
8f7f3b1a3fc330f51bb58ed35ff46277
|
|
| BLAKE2b-256 |
a5afea1381f6b2237da1b1d859bac5f919ea7e3f693627b767c229fc51d23049
|
Provenance
The following attestation bundles were made for econlens-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on HarryXin0919/econlens
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
econlens-0.2.1-py3-none-any.whl -
Subject digest:
b8ee6cebfb26338fa9d98fddbef9e6e3e29441d53c524683f565f272d391eedf - Sigstore transparency entry: 1808813802
- Sigstore integration time:
-
Permalink:
HarryXin0919/econlens@d0544438ce35965b9373a8d4869e86efd3d81baf -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/HarryXin0919
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d0544438ce35965b9373a8d4869e86efd3d81baf -
Trigger Event:
push
-
Statement type: