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.
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
maininstead of the last release?uv tool install git+https://github.com/gmadevs/Radiowriterinstalls 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
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
| 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
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)
| File | Size | Uploaded | |
|---|---|---|---|
| radiowriter-0.1.3.tar.gz | 1.5 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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