notion-bg-gen
Mesh-gradient cover images for Notion pages, from a terminal UI or a one-line command.
Try it without installing anything
If you have uv:
uvx notion-bg-gen
That opens the terminal UI. Type a title, press s, and the cover lands in covers/.
Install it properly
| macOS (recommended) | brew install dj-skn/tap/notion-bg |
| Any platform, with uv | uv tool install notion-bg-gen |
| Any platform, with pipx | pipx install notion-bg-gen |
| Plain pip | pip install notion-bg-gen |
| No Python at all | Download a binary |
Then run:
notion-bg
New to the terminal? The installation guide walks through it one step at a time, including what to do when macOS says the download "cannot be opened".
The terminal UI
Running notion-bg with no arguments opens an interactive app. Everything
updates live, and the preview is the real renderer at a smaller size, so what
you see is what gets written.
| Key | Action |
|---|---|
s |
Save the cover at full resolution |
r |
Shuffle - draw a new random layout |
q |
Quit |
Tab |
Move between fields |
The command line
Every option in the UI is a flag, so covers can be generated in a script, a Makefile, or a CI job.
# One cover, default look
notion-bg generate "Engineering Wiki"
# Pick a palette and a style
notion-bg generate "Roadmap" --palette ocean --style aurora
# A batch, reproducibly
notion-bg generate --from-file titles.txt --seed 7 --out ./covers
# Five variations to choose from
notion-bg generate "Design System" --count 5
Commands
| Command | What it does |
|---|---|
notion-bg |
Open the terminal UI |
notion-bg generate [TEXT]... |
Generate one or more covers |
notion-bg palettes |
List palettes (--json for machine output) |
notion-bg styles |
List styles and sizes (--json too) |
notion-bg config edit |
Add your own palettes and themes |
notion-bg --help |
Full reference |
Options
| Flag | Default | Notes |
|---|---|---|
--palette, -p |
classic |
See notion-bg palettes |
--theme, -t |
dark |
dark or light |
--style, -s |
mesh |
mesh, aurora, blobs, linear |
--size |
cover@2x |
Named size or 2000x800 |
--count, -n |
1 |
Covers per headline |
--out, -o |
covers |
Output directory |
--format, -f |
jpg |
jpg, png, webp |
--quality, -q |
92 |
JPEG and WebP quality |
--grain, -g |
0.35 |
Film grain, 0 to 1 |
--seed |
random | Same seed, same image |
--font |
bundled Inter Bold | Any .ttf or .otf |
--overwrite |
off | Replace instead of numbering |
--dry-run |
off | Report paths, write nothing |
Styles
| Style | Look |
|---|---|
mesh |
Overlapping radial blobs under a heavy blur. The original. |
aurora |
Soft horizontal curtains with a sine warp. |
blobs |
Fewer, tighter, higher-contrast orbs. |
linear |
A clean multi-stop sweep. The restrained option. |
Palettes
classic, sunset, ocean, candy, forest, ember, lavender, mono -
each usable on either theme. Add your own with notion-bg config edit.
Themes
The headline colour is chosen for legibility. If a palette puts a dark field
behind dark text, the ink flips automatically so the title stays readable.
Override it with --text-color when you want the last word.
Sizes
| Name | Pixels | Use |
|---|---|---|
cover |
1500 x 600 | Notion's documented minimum |
cover@2x |
3000 x 1200 | Default. The same band on a HiDPI screen |
wide |
3840 x 1200 | Very wide layouts |
square |
1200 x 1200 | Social cards and thumbnails |
Any WIDTHxHEIGHT works too, up to 10000px a side.
Using it from a script or an agent
generate is built to be driven by something other than a human:
--jsonputs a structured result on stdout and all progress on stderr--seedmakes output byte-for-byte reproducible--dry-runreports the paths it would writepalettes --jsonandstyles --jsonmake the options discoverable- Exit codes are
0success,1render failure,2bad input - A bare
notion-bgin a pipe or a CI job prints help and exits2rather than trying to open a full-screen UI
notion-bg generate "Release Notes" --seed 42 --json
{
"covers": [
{
"path": "covers/release-notes.jpg",
"text": "Release Notes",
"seed": 42,
"palette": "classic",
"theme": "dark",
"style": "mesh",
"width": 3000,
"height": 1200,
"format": "jpg",
"written": true,
"bytes": 1137482
}
],
"count": 1
}
More in the automation guide.
Your own palettes
notion-bg config edit
[palettes.brand]
name = "Brand"
description = "Our colours."
colors = ["#0F172A", "#1E40AF", "#3B82F6", "#93C5FD"]
[themes.midnight]
background = "#020617"
text = "#E2E8F0"
notion-bg generate "Internal Docs" --palette brand --theme midnight
Documentation
- Installation - every platform, written for non-developers
- Quickstart
- CLI reference
- Configuration
- Automation and agents
- Contributing
- Changelog
Contributing
Issues and pull requests are welcome. CONTRIBUTING.md covers
the setup, which is uv sync and pytest.
License
MIT.
The bundled Inter typeface is used under the SIL Open Font License 1.1.
Metadata
Release files for notion-bg-gen 1.0.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 | |
|---|---|---|---|
| notion_bg_gen-1.0.0.tar.gz | 207.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| notion_bg_gen-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 413.7 kB
Release files / notion_bg_gen-1.0.0.tar.gz
| Download URL | notion_bg_gen-1.0.0.tar.gz |
|---|---|
| Size | 207.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
723bd9f96d5722a6bf43ebad6938a1309c75301c9825172bd61705e62e4d8b5b
|
|
BLAKE2b-256 checksum How to use checksums |
e056e6b942f398e485d291ac6f426fb8320d5521d5ec90023c68449c9b211b0a
|
| 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 16, 2026.
Transparency logRelease files / notion_bg_gen-1.0.0-py3-none-any.whl
| Download URL | notion_bg_gen-1.0.0-py3-none-any.whl |
|---|---|
| Size | 206.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8995c77fe53ce74341f2d252b7299de41ae0ed9be7dd9c11d21c3e855967298e
|
|
BLAKE2b-256 checksum How to use checksums |
579236317caab26241e111aa1b76f88cc09bd5da4c9f1808776f495c51ea3bd4
|
| 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 16, 2026.
Transparency log