Skip to main content

corak

checks

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

python3 -m venv .venv
.venv/bin/python -m pip install -e .
.venv/bin/corak --install-desktop   # adds it to the application menu

PySide6 pulls in its own Qt, so nothing else is needed.

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.0

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

Source distribution (sdist)

Source distribution for corak 0.1.0
File Size Uploaded
corak-0.1.0.tar.gz 76.7 kB Details

Built distribution (wheel)

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

Total release size: 154.0 kB

Release files / corak-0.1.0.tar.gz

Download URL corak-0.1.0.tar.gz
Size 76.7 kB
Tags Source
SHA-256 checksum
How to use checksums
4baca8db045b5bc36cf60e98f84178e8cb889346b75f8f1f1e60d8501810da88
BLAKE2b-256 checksum
How to use checksums
8265c16a7de9bd76d0277444adffb70959eca75c13ddce43e7a7f4ba4109316f
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

Release files / corak-0.1.0-py3-none-any.whl

Download URL corak-0.1.0-py3-none-any.whl
Size 77.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8841ad1db39df9a7a45653d09c46cfdf7a0b8f578bba88ce0a1e410b0685851a
BLAKE2b-256 checksum
How to use checksums
eb5c403d80027e747f46c27d3e804fa56de158d3b22f35d3a58db4a3ab83d42e
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

Release history Release notifications | RSS feed

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

This release

0.1.0 This release

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