corak
Procedurally generated geometric wallpapers for Linux. Every image is drawn from a seed. Nothing is downloaded, and there is no image library on disk.
corak is Malay for pattern.
Install
pipx install corak
corak --install-desktop # adds it to the application menu
PySide6 brings its own Qt, so there is nothing else to install.
From source:
git clone https://github.com/ChristianKlass/corak && cd corak
python3 -m venv .venv
.venv/bin/python -m pip install -e ".[dev]"
QT_QPA_PLATFORM=offscreen .venv/bin/python -m unittest discover -s tests
.venv/bin/ruff check src tests
.venv/bin/mypy
Keys
| Key | |
|---|---|
| ↓ | keep the pattern, reroll the colours |
| → | keep the colours, reroll the pattern |
| ↑ | reroll both |
| ← | back to the previous design |
| Enter | set as wallpaper |
| T / ⇧T | next / previous theme |
| C D V G | toggle calm, darken, vignette, grain |
Commands
corak # open the window
corak --next # generate and set one, no window (what the timer runs)
corak --again 3 # set the third-most-recent wallpaper again
corak --design SLUG # set one exact design, named as --history prints it
corak --history 20 # the last 20 designs
corak --list-themes # themes, with where each palette came from
corak --list-patterns
corak --add-theme FILE # check a theme document and install it
Patterns
| Pattern | |
|---|---|
hexagons |
flat-top hexagonal tiling |
triangles |
split rectangles, the low-poly look |
waves |
stacked bands, each casting onto the one behind |
scatter |
loose shapes over open ground, in depth |
bokeh |
overlapping translucent discs, thrown out of focus |
constellation |
points joined by lines, mostly empty |
flowing |
a few large organic shapes with lit edges |
Themes
A theme is a set of constraints, not a wallpaper: which patterns, which part of the colour wheel, how saturated, how large the shapes, which effects. Every image it produces is different, and they all look related.
| Theme | Palette | |
|---|---|---|
| Abyssal Flare | Heavy oceanic depths interrupted by a bright coral flash. | |
| Art Deco | Mid-toned architectural revival with contrasting coral and navy. | |
| Catppuccin | Soft pastels with a lavender bias. | |
| Crown Jewel | Deep and saturated gemstone hues set in heavy shadow. | |
| Nightfall | Cinematic evening hues driven by slate, crimson, and emerald. | |
| Nord | Arctic blues and muted frost, from the editor scheme. | |
| Tokyo Night | Cool neon blues and violets over near-black. | |
| Vintage Cel | Slightly brighter animated aesthetic with brass and salmon. |
Adjusting a theme saves a variant and leaves the original alone. Drop your own
into ~/.config/corak/themes/, or use --add-theme to have it checked first.
docs/theme-prompt.md is a prompt for getting a set out of a chat model.
{
"id": "harbour",
"name": "Harbour",
"description": "Cold blues against rust.",
"colors": ["#10202b", "#1d3a4d", "#2f6d84", "#8fb6c4", "#b5622f"],
"dark": true,
"effects": { "calm": 0.45 },
"scale": 1.1
}
Rotation
A systemd user timer runs corak --next. Tick Change the wallpaper
automatically in the settings window and it writes and enables the units. No
resident process, and it survives a logout.
systemctl --user status corak.timer
Desktops
| Shell | How | Per screen |
|---|---|---|
| KDE Plasma | a script over D-Bus to org.kde.PlasmaShell |
yes |
| GNOME | gsettings, both the light and dark keys |
no |
| Xfce | one xfconf property per monitor |
yes |
Only Plasma is tested, since it is what I run. The other two are written against their documented interfaces and have never touched a real session.
Notes
Things that were not obvious, mostly discovered the hard way.
-
Features are sized in millimetres, not as a fraction of the frame. Sizing by width put the same design at 67, 75 and 21 pixels across on my three monitors. Physical size comes from KScreen, because Qt only learns an integer buffer scale under Wayland: a 1.5× output reports as 2×, so a 3840×1100 panel looks like 5120×1466.
-
Colour lives in OKLab. HSL lightness is not perceptual, so equal steps do not look equal. Blending takes the shorter way round the hue circle for generated schemes, and a straight line for a palette somebody chose. Blue to rust the polar way passes through green, inventing a colour that is not in the set.
-
Hue and lightness come from separate spatial fields. Driving both from one makes a small step across the image cross a hue boundary, and neighbouring shapes jump from orange to blue.
-
Fields are normalised. A low-frequency field completes less than one cycle over the frame and sits near-constant at whatever its phases give, usually pinned to one end, so a whole palette renders as its darkest colour.
-
Grain writes about 20× larger files. Noise does not compress: 0.3 MB becomes 7.7 MB at 3440×1440.
-
Crowding is an area budget, not a shape count. The same count is dense when the shapes are large and empty when they are small.
-
The preview scales its pixel density with its size. Previewing at the target screen's density showed shapes at twice the size the wallpaper has.
Attribution
Three palettes come from editor colour schemes. Colour values are not the licensable part, but the credit is theirs:
| Palette | From | Licence |
|---|---|---|
| Nord | Arctic Ice Studio and Sven Greb | MIT |
| Catppuccin | Catppuccin | MIT |
| Tokyo Night | enkia | MIT |
Licence
MIT. See LICENSE.
Colophon
Written with AI assistance, which is how I work. The direction, the review, and the judgement about what was good enough are mine.
Metadata
Release files for corak 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| corak-0.1.1.tar.gz | 78.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| corak-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 156.2 kB
Release files / corak-0.1.1.tar.gz
| Download URL | corak-0.1.1.tar.gz |
|---|---|
| Size | 78.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5d06bd769d04afde2ad0f0c698fc75e19ed5cf70dc6dd9de010e61f2a7bdf752
|
|
BLAKE2b-256 checksum How to use checksums |
2f7a2febe5e55b85ab77de876e7d81d12160261d875c0271eba2d2c864cc107d
|
| 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 Aug 24, 2026.
Transparency logRelease files / corak-0.1.1-py3-none-any.whl
| Download URL | corak-0.1.1-py3-none-any.whl |
|---|---|
| Size | 78.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d354297d784a523ca3db315099af52883ecf35147471566d9375bae56c7430d7
|
|
BLAKE2b-256 checksum How to use checksums |
968ae61dfc617d138e62c8a900d60e7b0718d44d320147ff30b7e7ee93e4443a
|
| 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 Aug 24, 2026.
Transparency log