OpenBioNews
A free, self-hosted news digest you run on your own computer.
OpenBioNews gathers stories from the sources you choose, groups the same story reported by different outlets into one entry, ranks them by importance, and writes a clean daily digest — as Markdown, a web page, or plain text, and optionally straight to your inbox. It ships tuned for biotech and life sciences, but you can point it at any topic.
- 🆓 Free and open (MIT). No account, no subscription, no server to rent.
- 🔬 Primary sources, cited to the sentence. Track ClinicalTrials.gov, FDA (recalls, approvals, shortages) and SEC EDGAR by company, drug or condition — and every sentence of every brief carries a numbered citation back to the exact source record. It's deterministic (verbatim from the record), so there's nothing to hallucinate — no LLM required. Plus any RSS/Atom feed.
- 🔔 Tells you what changed. Remembers each trial/filing/record between runs and surfaces the diff — a trial gone to Terminated, results posted, a recall reclassified — so you read the change, not the same snapshot twice.
- 🎯 Watch by theme, not just disease. One-tap groups seed your watch list: therapeutic areas and thematic cohorts like AI in drug discovery, NAM, gene/cell therapy, CRISPR, mRNA, ADCs, radiopharma, GLP-1/obesity. Stack several.
- 🖥️ Runs everywhere. Windows, macOS, and Linux — pure Python, no build step.
- 🔌 Bring your own LLM — or none. The cited facts are always deterministic; an optional local model (Ollama) or OpenAI-compatible API only adds a clearly labelled "Why it matters" interpretation on top — so the AI never touches the record, and there's nothing to hallucinate into it. Runs fully offline.
- 🧩 Zero dependencies. The core runs on the Python standard library. If you have Python, you can run it.
- 🥇 Curated, not a firehose. Stories are de-duplicated across outlets and ranked by importance, with a read-time estimate.
- 📬 Optional email delivery. Have it mail you the digest every morning via any SMTP server.
- 🔒 Private. Your feeds and reading habits stay on your machine. With the local or no-LLM modes, nothing is sent anywhere.
- 🪄 One-minute onboarding.
openbionews setupwalks you through it and writes a config customized to you.
Gathering news into a post is deterministic — grouping and de-duplicating stories needs no AI. An LLM is optional and only used to polish the one-line summaries, so even a small local model is plenty.
Quick start
You need Python 3.9 or newer. Check with python3 --version (on Windows,
py --version).
# 1. Get the code
git clone https://github.com/fedor-i/OpenBioNews.git
cd OpenBioNews
# 2. Try it right now, offline, with bundled sample data
python3 -m openbionews run --demo
# 3. Create your own personalized digest (interactive, ~1 minute)
python3 -m openbionews setup
# 4. Build today's digest
python3 -m openbionews run
That's it — your digest is written to the digest/ folder as
digest-YYYY-MM-DD.md (plus a latest.md you can always point to).
Works on Windows, macOS, and Linux
The tool is pure Python and platform-independent. Command names differ slightly:
| macOS / Linux | Windows | |
|---|---|---|
| Run a module | python3 -m openbionews … |
py -m openbionews … |
| Set an env var (this shell) | export KEY=value |
set KEY=value (cmd) · $env:KEY="value" (PowerShell) |
| Schedule it | cron |
Task Scheduler |
After pip install ., the openbionews command works the same on every
platform. Output is written as UTF-8 everywhere.
Optional: install it as a command
pip install .
openbionews setup # now available as a plain command
openbionews run
Onboarding: openbionews setup
The setup wizard is the heart of OpenBioNews. It asks a handful of questions — each with a sensible default you can accept by pressing Enter — and writes a config file customized to you:
- Name your digest (e.g. "My Morning Bio Brief").
- Pick topics. Choose from built-in bundles (Biotech & Pharma, Regulatory (FDA/EMA), Preprints (bioRxiv/medRxiv), Life Science & Research, Health, Science, Tech, World) or add your own RSS URLs.
- Track primary sources. Optionally watch ClinicalTrials.gov, FDA recalls/approvals, and SEC filings by company, condition, or drug — official developments, cited to their source record. Start from a therapeutic-area preset (oncology, cardiometabolic, rare disease, neurology, immunology, infectious disease) to seed the watch list, then tweak (see below).
- Focus it. Optionally keep only stories mentioning certain keywords, or always drop others.
- Choose how summaries are written — no LLM, local Ollama, or an OpenAI-compatible API.
- Pick an output format — Markdown, HTML, text, or an RSS feed you can subscribe to in any reader.
The result is openbionews.config.json in the current folder. Re-run setup
any time to change it, or edit the file directly (see
config.example.json).
Choosing an LLM (or not)
OpenBioNews works three ways. You choose during setup; you can switch any time.
1. No LLM (default) — free, instant, offline
Summaries are the article's own opening sentences. No model, no network, no setup. Great for a fast, private digest.
2. Local model via Ollama — free and private
Install Ollama, pull a small model, and OpenBioNews talks to it on your machine. Nothing leaves your computer.
ollama pull llama3.2 # or qwen2.5, phi3, gemma2 — small models are fine
# choose "Local model via Ollama" in `openbionews setup`
3. Any OpenAI-compatible API
Works with OpenAI, OpenRouter, Groq, Together, LM Studio, llama.cpp's server, vLLM, and more. During setup, give the base URL, model name, and the name of an environment variable that holds your API key. The key is read from the environment and is never written to the config file.
export OPENAI_API_KEY=sk-... # or whatever variable you named
openbionews run
If a summary call ever fails (rate limit, network blip), that story quietly falls back to the no-LLM summary — the run never aborts.
Primary sources — traced to the document
Beyond RSS (which is secondary trade press), OpenBioNews can read official primary records and trace every development back to its source document.
Three connectors are built in. You keep one watch list (companies, conditions, drugs, terms) and switch on whichever official sources you want:
- ClinicalTrials.gov — trial developments (registration, status, phase), cited to the NCT record.
- openFDA drug recalls — enforcement reports (reason, Class I/II/III, status), cited to the FDA record.
- openFDA drug approvals — Drugs@FDA approvals, original and supplemental (new indication), cited to the Drugs@FDA page.
- openFDA drug shortages — current/resolved shortages (reason, status, category), cited to the FDA Drug Shortages database.
- SEC EDGAR — filings (8-K, 10-K, S-1, 424B, 13D/G, DEF 14A, Form 4…), cited
to the filing document. SEC asks for a contact User-Agent — set your email in
connectors.edgar.user_agent.
"watchlist": {
"sponsors": ["Moderna", "Vertex Pharmaceuticals"],
"conditions": ["cystic fibrosis"],
"interventions": ["mRNA-1345"],
"terms": []
},
"connectors": {
"clinicaltrials": { "enabled": true, "recent_days": 30 },
"openfda": { "enabled": true, "recent_days": 30 },
"openfda_approvals": { "enabled": true, "recent_days": 90 },
"openfda_shortages": { "enabled": true, "recent_days": 60, "statuses": ["Current"] },
"edgar": { "enabled": true, "recent_days": 30, "forms": ["8-K"],
"user_agent": "Your Name your@email.com" }
}
The setup wizard builds this for you, and openbionews doctor verifies each
source. Every story renders with a tag and a source line:
### Study of DrugX in Advanced Solid Tumors
*Recruiting · Phase 2 · Acme Bio · ClinicalTrials.gov · 20 Sep*
A phase 2 study evaluating DrugX…
↳ Source: ClinicalTrials.gov NCT01234567
No API keys are required. Because the connectors run on your machine, they can
set the User-Agent SEC requires and are not subject to the browser CORS limits
that constrain the hosted web page — this is the reliable path for SEC data.
Hosted web version — filter in your browser, no install
For people who just want to click and filter, there's a single-page web app
in docs/index.html with two tabs:
- Clinical trials — filter ClinicalTrials.gov by company, condition, drug, status, phase, recency ("updated within N days"), and industry-sponsored only.
- FDA drug recalls — filter openFDA enforcement reports by firm, product, reason, classification (Class I/II/III), status, report-date recency, and voluntary vs. FDA-mandated.
- FDA drug approvals — Drugs@FDA approvals (original + supplemental) by company or drug, within a chosen window.
- FDA drug shortages — current/resolved shortages by drug or company.
- SEC filings — full-text search SEC EDGAR by company/ticker/keyword, filing type (8-K, 10-K, S-1, 424B, 13D/G, DEF 14A, Form 4…), and filed-within recency; each result links to the filing document. (SEC does not reliably allow in-browser cross-origin requests, so when a visitor's browser is blocked, this tab falls back to opening the same search on SEC's official EDGAR site with the filters applied.)
Both query the source live in the browser, show a link to each source record, and support shareable links (copy a link that reproduces the exact filtered view). No server, no backend, no tracking.
Host it free on GitHub Pages:
- Repo → Settings → Pages → Build and deployment.
- Source: GitHub Actions (the included workflow deploys
docs/), or Deploy from a branch →main//docs. - Your page goes live at
https://fedor-i.github.io/OpenBioNews/.
Point a custom domain at it in the same settings page if you like. Because it's static and calls the public APIs directly, it costs nothing to run and scales to any number of visitors.
Commands
| Command | What it does |
|---|---|
openbionews setup |
Interactive onboarding; writes your config. |
openbionews run |
Build today's digest and write it to digest/. |
openbionews run --demo |
Build a digest offline from bundled sample data. |
openbionews run --stdout |
Print the digest instead of writing a file. |
openbionews run --format html |
Override the output format for one run. |
openbionews run --no-summaries |
Headlines and links only. |
openbionews run --email |
Also email the digest (uses your email config). |
openbionews doctor |
Check your config, feeds, LLM, and email. |
openbionews sources |
List the built-in topic bundles and their feeds. |
Use -c path/to/config.json to use a config file somewhere other than the
current directory (or set OPENBIONEWS_CONFIG).
Run it every morning (automation)
OpenBioNews is a plain command, so any scheduler works.
macOS / Linux (cron) — build a digest every weekday at 7am:
0 7 * * 1-5 cd /path/to/OpenBioNews && /usr/bin/python3 -m openbionews run
Windows (Task Scheduler) — create a Basic Task that runs
python -m openbionews run in the project folder on your schedule.
Point your reader, a static-site folder, or an email script at
digest/latest.<ext>. With format: rss (or openbionews run --format rss),
that's digest/latest.xml — a standard RSS feed you can subscribe to in any
feed reader, so a scheduled run keeps your reader up to date automatically.
Email delivery (optional)
Have OpenBioNews mail you the digest every morning. Enable it during
openbionews setup, or set the email block in your config. It works with any
SMTP server (your own, Gmail with an app password, Fastmail, a work relay…).
"email": {
"enabled": true,
"smtp_host": "smtp.gmail.com",
"smtp_port": 587,
"use_tls": true,
"username": "you@gmail.com",
"password_env": "OPENBIONEWS_SMTP_PASSWORD", // password read from this env var
"from_addr": "you@gmail.com",
"to_addrs": ["you@gmail.com"]
}
Set the password in your environment (never in the file) and run:
export OPENBIONEWS_SMTP_PASSWORD=your-app-password # Windows: set / $env:
openbionews run --email
The email is sent as both a formatted HTML version and a plain-text fallback.
Curation & "why it matters"
OpenBioNews doesn't just dump every headline. Stories are:
- De-duplicated across outlets (the same story from five sites becomes one entry that lists all five).
- Ranked by importance — a transparent, deterministic score combining how many outlets carried a story, how fresh it is, and whether the headline contains high-signal words (approval, acquires, phase, recall…).
- Capped to the top
max_items(andmax_per_topic), so you get a focused read with a read-time estimate in the header.
If you use an LLM backend, turn on "why it matters" in setup to add a short significance note under each summary, generated locally or with your own key.
How it works
feeds ─▶ fetch ─▶ filter ─▶ cluster ─▶ rank ─▶ summarize ─▶ render ─▶ digest
(RSS/Atom) (age & (group the (biggest (LLM or (md/html/
keywords) same story first) no-LLM) text)
across
outlets)
Everything except the optional summary step is deterministic: stories are
grouped by how much their headlines overlap (Jaccard similarity of title
tokens), so results are reproducible and need no AI. See
ARCHITECTURE.md for a module-by-module tour.
Customizing sources
Run openbionews sources to see the built-in bundles. To add your own, either
choose "Add your own RSS feed" during setup, or edit the feeds list in your
config:
{
"feeds": [
{ "name": "My Favorite Blog", "url": "https://example.com/feed.xml", "topic": "biotech" }
]
}
Any RSS 2.0 or Atom feed works. Run openbionews doctor to confirm a new feed
is reachable.
Privacy
- No-LLM and Ollama modes send nothing off your machine. OpenBioNews only fetches the feeds you list.
- API mode sends article titles and feed-provided descriptions to the endpoint you configured, only to write summaries. Your API key stays in your environment, never in the config file.
- No telemetry, ever.
Requirements
- Python 3.9+ (standard library only for the core).
- Optional:
feedparserfor wider feed compatibility (pip install .[feeds]). - Optional: Ollama for a free local model.
Contributing
Contributions of every size are welcome — a typo fix, a new feed, or a whole new
primary-source connector. Start with CONTRIBUTING.md, see
where things are headed in ROADMAP.md, and check the
good first issues.
The whole test suite runs with no dependencies:
python3 tests/test_pipeline.py
CI runs it on Linux, macOS and Windows across Python 3.9–3.12 on every pull
request. Releases publish to PyPI automatically (RELEASING.md).
License
MIT. Free to use, modify, and redistribute. This is an independent, community-oriented, open-source tool.
Metadata
Release files for openbionews 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openbionews-0.4.0.tar.gz | 77.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openbionews-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 152.1 kB
Release files / openbionews-0.4.0.tar.gz
| Download URL | openbionews-0.4.0.tar.gz |
|---|---|
| Size | 77.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
824992e1062e441907a1855e1f1a0f960e1f9fb65054e86311417b3307ae4b83
|
|
BLAKE2b-256 checksum How to use checksums |
e217ce15f82ac69e84d79f16e996ed656c0783ba7e623ee82e11e3e881b701c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.
Transparency logRelease files / openbionews-0.4.0-py3-none-any.whl
| Download URL | openbionews-0.4.0-py3-none-any.whl |
|---|---|
| Size | 74.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cffc50c33bd0a7b7d8c937ae8cc76b66cb322a3a14a19e65024eddaf7407877d
|
|
BLAKE2b-256 checksum How to use checksums |
7763f3e5d3acf5b698459c8fb02652c4a9133f508769ffa1a6534d70c81269b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.
Transparency log