BioCartoon
BioCartoon is a free and open-source tool for creating biology figures with illustrations. We compile existing open biology-focused illustration resources and introduce our own illustrations in a single database with a graphical interface for search and figure generation.
This repository holds the icon database and the biocartoon command-line interface. The desktop app, web app, and website are in biocartoon-app.
Usage
Web application: app.biocartoon.com
Install Desktop application: www.biocartoon.com/download
Resources:
15,393 icons and 6 templates across 8 resources.
- "DNA colored" by DBCLS, Bioicons (https://togotv.dbcls.jp/en/pics.html), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Lymphocyte" by DBCLS, Bioicons (https://togotv.dbcls.jp/en/pics.html), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "heart" by Servier, Bioicons (https://smart.servier.com/), CC-BY-3.0 (https://creativecommons.org/licenses/by/3.0/)
- "Mouse" by DBCLS, Bioicons (https://togotv.dbcls.jp/en/pics.html), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Human male" by DBCLS, Bioicons (https://togotv.dbcls.jp/en/pics.html), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "DNA" by Resolve to Save Lives, Health Icons (https://healthicons.org/icon/filled/body/dna), CC0
- "Cell Nuclei" by Resolve to Save Lives, Health Icons (https://healthicons.org/icon/filled/body/cell-nuclei), CC0
- "Heart" by Resolve to Save Lives, Health Icons (https://healthicons.org/icon/filled/body/heart-organ), CC0
- "Rat" by Resolve to Save Lives, Health Icons (https://healthicons.org/icon/filled/zoonoses/animal-rat), CC0
- "Person" by Resolve to Save Lives, Health Icons (https://healthicons.org/icon/filled/people/person), CC0
- "DNA" by Ryan Kissinger, NIAID NIH BioArt Source (https://bioart.niaid.nih.gov/bioart/123), public domain
- "T Cell" by Ryan Kissinger, NIAID NIH BioArt Source (https://bioart.niaid.nih.gov/bioart/508), public domain
- "Human Heart" by Ryan Kissinger, NIAID NIH BioArt Source (https://bioart.niaid.nih.gov/bioart/228), public domain
- "Lab Mouse" by Ryan Kissinger, NIAID NIH BioArt Source (https://bioart.niaid.nih.gov/bioart/279), public domain
- "Human Male Outline Type VI" by Ryan Kissinger, NIAID NIH BioArt Source (https://bioart.niaid.nih.gov/bioart/238), public domain
- "dna" by Alan Seng, OpenMoji (https://openmoji.org/library/emoji-1F9EC/), CC-BY-SA-4.0 (https://creativecommons.org/licenses/by-sa/4.0/)
- "kiwi fruit" by Marius Schnabel, OpenMoji (https://openmoji.org/library/emoji-1F95D/), CC-BY-SA-4.0 (https://creativecommons.org/licenses/by-sa/4.0/)
- "anatomical heart" by Tonia Reinhardt, OpenMoji (https://openmoji.org/library/emoji-1FAC0/), CC-BY-SA-4.0 (https://creativecommons.org/licenses/by-sa/4.0/)
- "mouse" by Sofie Ascherl, OpenMoji (https://openmoji.org/library/emoji-1F401/), CC-BY-SA-4.0 (https://creativecommons.org/licenses/by-sa/4.0/)
- "person" by Johanna Wellnitz, OpenMoji (https://openmoji.org/library/emoji-1F9D1/), CC-BY-SA-4.0 (https://creativecommons.org/licenses/by-sa/4.0/)
- "DNA 3D" by David Eccles, Reactome Icon Library (https://reactome.org/icon-lib/R-ICO-012630), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Cell generic 01" by Cristoffer Sevilla, Reactome Icon Library (https://reactome.org/icon-lib/R-ICO-012548), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Heart" by Cristoffer Sevilla, Reactome Icon Library (https://reactome.org/icon-lib/R-ICO-014671), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Mosquito" by Cristoffer Sevilla, Reactome Icon Library (https://reactome.org/icon-lib/R-ICO-014760), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Male body with organs" by Cristoffer Sevilla, Reactome Icon Library (https://reactome.org/icon-lib/R-ICO-013956), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "DNA" by John Chilton, SciDraw (https://scidraw.io/drawing/dna-8709d1cf), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "cell" by Hu, SciDraw (https://scidraw.io/drawing/cell-7d505ae8), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Heart" by John Chilton, SciDraw (https://scidraw.io/drawing/heart-d090dc66), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Mouse" by Tom Baden, SciDraw (https://scidraw.io/drawing/mouse-2902704e), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Human silhouette" by Zane Mitrevica, SciDraw (https://scidraw.io/drawing/human-silhouette-a5894ef6), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "dna", Servier Medical Art (https://smart.servier.com/smart_image/dna/), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Empty cell", Servier Medical Art (https://smart.servier.com/smart_image/cell-red-blue/), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Heart", Servier Medical Art (https://smart.servier.com/smart_image/heart-organ/), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "Mouse", Servier Medical Art (https://smart.servier.com/smart_image/mouse/), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
- "African man", Servier Medical Art (https://smart.servier.com/smart_image/african-adult-man/), CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)
Command-Line Interface and MCP server
The biocartoon command searches the published catalog from a shell:
pip install biocartoon
If your shell then says biocartoon: command not found, pip put the program in a folder that is
not on your PATH (pip names it in a warning near the end of its output): add that folder to PATH,
or install with pipx install biocartoon or uv tool install biocartoon, which handle PATH for you.
The package is the compiled program alone, with no Python dependencies. To build it from source
instead, run cd catalog && cargo build --release (giving target/release/biocartoon). This
build searches icons; its MCP server also lists the shared slide templates. The BioCartoon desktop
editor ships a fuller biocartoon that adds templates to search and the app command.
On Windows, the build also needs the Visual Studio Build Tools with the C++ workload
(winget install Microsoft.VisualStudio.2022.BuildTools --override "--passive --wait --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended"),
and must run from PowerShell or cmd: Git Bash's own link command shadows the MSVC linker.
-
biocartoon search "TERM": icons and templates matching TERM, best first. With no TERM it pages through everything.--icons/--templates: only that kind--tags T,...: icons and templates with one of these tags (a whole tag, any case)--source S: icons from a collection (a code or name frombiocartoon --sources)--author A: icons by an author (part of the name, any case)--category C: icons in a category (a slug frombiocartoon --categories)--subcategory S: icons in a subcategory (a slug frombiocartoon --categories)--source-category [S:]C: icons in a collection's own category (frombiocartoon --source-categories)--license L: icons under a license (CC-BY-4.0,CC0-1.0, ...)--file-type svg|png: icons published as SVG, or as a PNG only
Repeat a filter for several values: an icon matching any of them passes. An icon has to pass every filter given.
--sql: run TERM as read-only SQL on the catalog.
-
biocartoon get ID: everything about one icon: license, credit, PNG/SVG URLs, colour variants -
biocartoon fetch ID: download the SVG, or the PNG when the source publishes no SVG (--pngor--svgfor that type only,--out FILE|DIR,--max-side Nfor a smaller PNG) -
biocartoon sync: download the newest published catalog -
biocartoon bulk-download: the whole catalog into one folder with a README (contents, licenses, and the equivalent curl/sqlite3 commands, which it also prints as it goes); running it again fetches only what is missing--files all|metadata|artwork|icons|templates: what to get (comma-separate several;artworkis icons and templates; defaultall)--metadata-ext sqlite|csv|tsv|xlsx|json: the icon and template catalogs' format (defaultsqlite)--artwork-ext png|svg: sets both of the next two (templates have no SVG, so they come as PNG)--icons-ext svg|png: defaultsvg, with a PNG where the source publishes no SVG--templates-ext png|biocartoon: the thumbnail (default), or a.biocartoonfile the editor opens--output-dir DIR(default./biocartoon-catalog),--jobs N(parallel downloads, default 8),--limit N(the first N of each, to try it out)
-
biocartoon upload FILE...: submit images files/folders to the database (approval required to merge in);--tags T,...adds words to find them by -
biocartoon app CMD [JSON]: drive the running desktop editor (editor's build only) --- requires the desktop app -
biocartoon mcp: serve the same tools over MCP, mostly for agents (e.g.,claude mcp add biocartoon -- biocartoon mcp) -
biocartoon --version: the program's version, and when the local catalog was published and downloaded -
biocartoon --sources: list icon sources forbiocartoon search --source S -
biocartoon --categories: list icon categories forbiocartoon search --category C -
biocartoon --source-categories: list the collections' own categories forbiocartoon search --source-category S:C
Examples
Find an icon, check its license, and download it:
$ biocartoon search mitochondria --icons --limit 2
BA001199 bioart Mitochondria (Cells and Organelles; 2084x2084) matched: title,description
BA000413 bioart Damaged Mitochondria (Cells and Organelles; 1705x1174) matched: title,tags,description
$ biocartoon get BA001505 # credit, license, PNG/SVG URLs, colour variants
$ biocartoon fetch BA001505 --out ~/Desktop # the SVG
$ biocartoon fetch BA001505 --max-side 512 --out neuron.png # a smaller PNG
Contribute your own illustrations (held for review before they are published):
biocartoon upload figures/ --license CC-BY-4.0 --credit "Your Name" --dry-run # check first
biocartoon upload figures/ --license CC-BY-4.0 --credit "Your Name" --category cells --tags "neuron, axon"
Narrow a search by collection, category, author, license or file type:
biocartoon --sources # codes: BA, BI, SV, SD, HI, RE, OM, ...
biocartoon --categories # slugs: cells, cells.cell_types, ...
biocartoon search "pyramidal neuron" --source BA # NIH BioArt only
biocartoon search neuron --source BA --source SD # BioArt or SciDraw
biocartoon search mitochondria --category cells.organelles_and_cell_components
biocartoon search --category viruses --sort az --limit 40 --offset 40 # page 2 of all viruses
biocartoon search neuron --subcategory cell_types --file-type svg # SVG cell types
biocartoon search --license CC0-1.0 --license PD --category cells # free of attribution
biocartoon search --author kissinger --source BA --sort popular # one illustrator
biocartoon search --source-category "BA:Cellular Processes" --source-category "BA:Proteins"
biocartoon --categories --source SD # what SciDraw covers
Icons, templates or both (templates need the editor's build of biocartoon):
biocartoon search "cell" # icons, then templates
biocartoon search "cell" --icons
biocartoon search "cell" --templates
Query the catalog with SQL (read-only):
biocartoon search --sql # the schema
biocartoon search "select license, count(*) as n from assets group by license order by n desc"
# warning: running the search term as SQL; pass --no-sql to search for the words instead
biocartoon search --sql "select id, title from assets where svg_key is not null and title like '%ribosome%'"
biocartoon search "with dendrites" --no-sql # words, even though it starts with WITH
From a script: every command takes --json, and search results come back as
{"icons": [...], "templates": [...]}:
# download the SVG of the best match that has one (Servier and uploads are PNG only)
mkdir -p icons
for t in neuron astrocyte microglia; do
id=$(biocartoon search "$t" --icons --limit 10 --json | jq -r '[.icons[] | select(.svg_url)][0].id')
biocartoon fetch "$id" --svg --out icons/
done
biocartoon get BA001505 --json | jq -r .credit # the attribution line to print
Drive the running desktop editor (editor's build only):
biocartoon app state # page size and every item on the slide
biocartoon app insert_asset '{"asset":"BA001505","x":200,"y":120,"width":300}'
biocartoon app move_items '{"ids":[3],"dx":48}'
biocartoon app render '{"path":"slide.png"}'
Download the whole catalog (well over 1 GB), or parts of it:
biocartoon bulk-download # everything, into ./biocartoon-catalog
biocartoon bulk-download --files metadata --metadata-ext xlsx # the catalogs as spreadsheets
biocartoon bulk-download --files icons --icons-ext png --output-dir icons/
biocartoon bulk-download --files templates --templates-ext biocartoon # templates to open in the editor
Keep the local catalog current, and connect an assistant:
biocartoon sync
claude mcp add biocartoon -- biocartoon mcp
Repository Structure
catalog/ Rust crate biocartoon-catalog: the catalog library, the `biocartoon` CLI and MCP server
src/catalog.rs the SQLite catalog and the search over it (shared with the editor, so ranking matches)
src/query.rs synchronous catalog access for the CLI and MCP server
src/cli.rs the `biocartoon` commands
src/mcp.rs the MCP server (`biocartoon mcp`)
src/taxonomy.rs BioCartoon's own categories, mapped from each source's
src/templates.rs the published slide templates
src/upload.rs `biocartoon upload`: submits images to the submissions Worker
pyproject.toml packages the binary for PyPI (`pip install biocartoon`)
data/ Python pipeline that builds and publishes the catalog
scrape_sources.py download Bioicons, Health Icons, OpenMoji, Reactome, SciDraw, Servier
scrape_bioart.py download NIH NIAID BioArt Source
rasterize.py render SVGs to PNGs
build_assets_db.py build data/assets.sqlite (the master database) from the scrapes
upload_r2.py upload asset files to the R2 bucket (resumable)
uploads.py collect approved community contributions from the bucket
publish_catalog.py publish the trimmed, gzipped catalog to R2 for the app and CLI
sync.py incremental sync of new upstream assets (add-only)
publish_poll.py runs publishes queued with "Publish catalog now" on the review page
refresh_credits.py rewrite every asset's credit line
readme_stats.py regenerate the resources table above
config.py bucket names, URLs and other brand-dependent settings
requirements.txt Python packages for the pipeline (`pip install -r data/requirements.txt`)
schedule/ installs a weekly launchd job that runs sync.py (+ the publish poller)
worker/ Cloudflare Workers (TypeScript) for community contributions
src/submit.ts api.biocartoon.com: validate, rate-limit and hold submissions for review
src/review.ts review.biocartoon.com: approve or reject (behind Cloudflare Access)
src/publish.ts copies an approved submission into the public bucket
src/publish_requests.ts the "Publish catalog now" queue the Mac polls
src/stars.ts star counts on catalog assets
migrations/ D1 database schema
test/ unit tests (`npm test`)
.github/workflows/ CI tests and the PyPI release
Database Structure
The catalog is published as two gzipped SQLite files, built from the master database
(data/assets.sqlite) by data/publish_catalog.py. File keys (svg_key, png_key, json_key,
thumb_key) are paths in the public bucket, so a file lives at https://assets.biocartoon.com/<key>.
assets.sqlite.gz
One row per icon in the assets table. Only rows that are uploaded to the bucket and have a PNG are published.
Indexes cover source, license, category and the unique pair (source, source_id).
assets_fts is an FTS5 full-text index (Porter stemming) over title, description, tags,
category and variant, joined to assets by rowid:
SELECT a.id, a.title, a.license, a.png_key
FROM assets_fts JOIN assets a ON a.rowid = assets_fts.rowid
WHERE assets_fts MATCH 'mitochondria' ORDER BY rank LIMIT 10;
templates.sqlite.gz
One row per slide template in the templates table.
A meta key–value table (k, v) is reserved for catalog metadata.
License
Copyright (c) 2026 Joseph Rich. This repository is open source under the BSD 2-Clause License. The editor in biocartoon-app is under the GNU AGPL v3.0. Third-party illustrations and icons keep their own licenses --- see NOTICE.md.
Contributing
Contributions are welcome --- see CONTRIBUTING.md. Contributors keep the copyright in their work, and artists are credited under the name they choose.
Other Links
Website: www.biocartoon.com
Database and CLI source code: github.com/josephrich98/biocartoon
Application and website source code: github.com/josephrich98/biocartoon-app
Icon SQLite database: assets.biocartoon.com/catalog/assets.sqlite.gz
Template SQLite database: assets.biocartoon.com/catalog/templates.sqlite.gz
Support
If biocartoon is useful to you, you can buy me a coffee ☕