Skip to main content

Radiowriter

PyPI Licence: AGPL-3.0-only Platform: macOS, Linux, Windows Python 3.11+ Docs Tests Docs build

Find the literature for a Radiopaedia.org article, screen it, and write the article against it.

Search PubMed one line at a time or build the query concept by concept. Rank what comes back by how much it is cited and by where it was published. Sift it down with the filters, keep what is worth keeping in reading lists, then write the article — with the section structure Radiopaedia recommends for that kind of article, the citations resolved for you, their own linter run over your draft, and the formatted HTML their editor expects.

Runs on macOS, Linux and Windows. Nothing leaves your computer except the searches themselves.

Unofficial. Not affiliated with or endorsed by Radiopaedia.org.

Screening the archive

Install

Radiowriter is a Python program that serves a page to your own browser. One command installs it, one command runs it — the same on macOS, Linux and Windows.

uv tool install radiowriter
radiowriter

It opens http://localhost:8501 in your browser. Ctrl+C in the terminal stops it. uv tool upgrade radiowriter updates it, and uv tool uninstall radiowriter removes it — your archive stays where it is.

If you do not have uv

macOS and Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh

Windows, in PowerShell:

powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

pipx install radiowriter does the same job if you already have pipx.

Want what is on main instead of the last release? uv tool install git+https://github.com/gmadevs/Radiowriter installs straight from the repository — no index, no account, whatever is on the branch right now. How releasing works.

First run

It asks for an email address, and says why: PubMed and Unpaywall both want a contact address in every request, so they can warn whoever is calling instead of silently blocking them. There is nothing to register for, and the address stays on your computer.

Three other things are optional and can wait: an NCBI API key (raises the rate limit from 3 to 10 requests a second), a Semantic Scholar key (faster citation lookups), and your library's LibKey ID (direct full-text links through your subscription).

Journal quartiles

They work out of the box. A copy of the SCImago table (2025) ships with the app, and your articles are matched to it by ISSN at first start.

For a newer year, take Download data from scimagojr.com — top right of the table — and drop the CSV into the folder that radiowriter --where prints. Any name starting with scimagojr wins over the bundled copy, so updating is one drag and nothing else.

The bundled copy is SCImago's data, not ours: cut down to the ten columns the app reads and to the rows that are journals, and used under CC BY-NC. radiowriter/data/scimagojr-2025.about.txt records where it came from, when, and exactly what was cut.

This is not the Journal Impact Factor. That one is Clarivate's and lives in the JCR. SCImago gives SJR, which weighs citations by the prestige of the journals making them, and cites/doc (2y), which is computed like an impact factor but over Scopus. Both are shown, both are labelled.

What it does

Building a query in blocks

Search. PubMed syntax on one line, or the block builder: one block per concept, every wording of it inside joined by OR, the blocks joined by AND. The ISSG published search filters for guidelines and evidence syntheses are built in. So is a generator that turns the section headings of a Radiopaedia article into search strategies — Epidemiology becomes prevalence and incidence, MRI becomes the MeSH terms and the words for magnetic resonance. And forty-three imaging modalities are written out for you: pick Doppler ultrasound and you get the MeSH descriptors, doppler, duplex, the colour and the color spelling, and the resistive index — the things a paper says instead of naming the technique.

Screen. The archive, filtered by read, flagged, reading list, journal quartile, and sorted by citations or by SJR. Full text through LibKey if your library has it, through Unpaywall if there is a legal free copy. Reading lists you make, rename and delete; an article can be in several at once, and an article in a list is never purged.

Write. A Markdown editor that knows the twenty-three section structures Radiopaedia recommends and can insert the ones your kind of article should have. Cite with [@27859258] — the identifier itself — and the numbering is worked out at export from the order of first appearance. Radiopaedia's own linter rules run over the draft. Two buttons copy the article and the reference list as rich text, so headings, bold and the <sup> markers survive the paste into their editor.

Where your data lives

One SQLite file, in the place your system keeps user data:

macOS ~/Library/Application Support/Radiowriter
Linux ~/.local/share/radiowriter
Windows %LOCALAPPDATA%\Radiowriter

radiowriter --where prints it. RADIOWRITER_HOME=/some/path radiowriter overrides it, which is how you keep an archive on an external disk.

⇅ Export and backup in the sidebar writes a .nbib (the articles, in PubMed's own format, readable by any reference manager) or a .json (the whole archive, to move it to another computer). The .json deliberately leaves your settings out, so a backup you share does not carry your email or your keys.

Running from source

git clone https://github.com/gmadevs/Radiowriter.git
cd Radiowriter
python3 -m venv .venv && . .venv/bin/activate
pip install -e .
radiowriter

The tests need no network and no configuration:

python3 check_rules.py       # the Radiopaedia linter rules
python3 check_structure.py   # the article structures
python3 check_search.py      # query building, ISSG filters, strategies, lists
python3 check_journals.py    # SCImago, journal matching, Unpaywall, backups
python3 check_app.py         # the interface, driven without a browser

check_mesh_live.py is the one exception: it asks PubMed whether every MeSH term the strategies use still exists. Run it when you change them, or when MeSH changes — once a year, in January.

Documentation

gmadevs.github.io/Radiowriter

Install and first run Getting it going, and the SCImago file
Search PubMed · in blocks The filters, and building a query concept by concept
Screen · journals Reading lists, quartiles, open access
Write Structures, citations, the linter
Backup Moving to another computer
How it works Architecture, storage, the services it calls
Known limitations What it does not do, written down

Licence

AGPL-3.0-only.

The Radiopaedia article structures in radiowriter/data/article-structure.json and the linter rules in radiowriter/data/lint-rules.json are transcriptions of Radiopaedia's own published guidance, not ours.

radiowriter/data/scimagojr-2025.csv.gz is journal metrics from SCImago Journal & Country Rank, derived from Elsevier's Scopus, used under CC BY-NC 4.0. It is redistributed here cut down to the columns the app reads; the numbers are theirs and unmodified. The .about.txt beside it records the download date and the cut. The NonCommercial term applies to that file, whatever you do with the rest of the code.

Metadata

Release files for radiowriter 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for radiowriter 0.1.3
File Size Uploaded
radiowriter-0.1.3.tar.gz 1.5 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for radiowriter 0.1.3
File Interpreter ABI Platform
radiowriter-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 3.1 MB

Release files / radiowriter-0.1.3.tar.gz

Download URL radiowriter-0.1.3.tar.gz
Size 1.5 MB
Tags Source
SHA-256 checksum
How to use checksums
cc2a0f547751a9ede50ca122e3b661e47f289a7345f174422c3c88c6800085ac
BLAKE2b-256 checksum
How to use checksums
1089b2f58d8bff796fde8cc7149c0f500b7f828515bf98fee87c08c99bf4ce1c
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 Sep 27, 2026.

Transparency log

Release files / radiowriter-0.1.3-py3-none-any.whl

Download URL radiowriter-0.1.3-py3-none-any.whl
Size 1.5 MB
Tags Python 3
SHA-256 checksum
How to use checksums
1a316b6ef095a6655747a9cac141ae230e9c27e33333833e098237a1385bff3a
BLAKE2b-256 checksum
How to use checksums
c799cb9c5c25b8e138fbaf60b4751c5ec68086d9e16ae701f2c928c770229b55
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 Sep 27, 2026.

Transparency log

Release history Release notifications | RSS feed

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.4

2 release files

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page