Turn images into halftone artwork made from dots, lines, curves, and shapes.
Toniator is a native Linux application for artists and designers who want to explore the patterns behind an image. Open artwork, choose a Pattern, adjust its scale and appearance, and export a PNG or editable SVG. Work in RGB, CMYK, or source colors, with independent Pattern settings for each color channel.
Built with Rust and GTK4, Toniator includes a visual Pattern Wizard, a personal Pattern library, and a headless command-line renderer. It is free software under the GPL-3.0-only license.
Current prerelease: 0.3.3. Download the Linux packages · Windows development build (0.3.2) · native Windows build instructions · known issues.
The same source artwork, rendered as circular marks in two color modes. These are actual 1024×1024 PNG exports from Toniator 0.2.0, with no image editing afterward. Open either image to inspect it at full size.
| RGB — colored marks on black | CMYK — overlapping ink colors on white |
|---|---|
![]() |
![]() |
Toniator also turns vector artwork into new editable geometry: source SVG → exported SVG. See example settings and reproduction commands.
Download one of the x86_64 Linux packages from the
0.3.3 release.
Both include the graphical app and CLI, with application ID
io.github.ricperry.Toniator.
Upgrading from 0.3.1 or earlier: the Flatpak ID changed from
com.sbdd.Toniator. The new Flatpak installs separately and uses a new private
data directory. Existing settings and personal Patterns are not moved or deleted.
Your .toniator projects remain ordinary files and can be opened from their
existing locations if they use a supported format. Keep the old installation
until you have recovered any settings or personal Patterns you need.
In the folder containing your download:
chmod +x Toniator-0.3.3-x86_64.AppImage
./Toniator-0.3.3-x86_64.AppImageThis build requires glibc 2.39 or newer; it was tested on Fedora 44/Wayland. If FUSE mounting is unavailable, run it with:
APPIMAGE_EXTRACT_AND_RUN=1 ./Toniator-0.3.3-x86_64.AppImageWith Flatpak installed, run:
flatpak install --user ./Toniator-0.3.3-x86_64.flatpak
flatpak run io.github.ricperry.ToniatorThe bundle uses the shared GNOME 50 runtime, which Flatpak may download during
installation. It is distributed here on GitHub; it is not a Flathub listing.
Flatpak keeps its own settings, recent files, and personal Patterns under
~/.var/app/io.github.ricperry.Toniator/, separate from a native or AppImage installation.
Download SHA256SUMS alongside the packages to verify their integrity with
sha256sum --ignore-missing -c SHA256SUMS. See the
packaging guide for permissions and build details.
The separate Windows development release
contains unsigned portable GUI and CLI binaries built as version 0.3.2. It is
not a Windows build of this 0.3.3 prerelease; no 0.3.3 Windows package is
provided. To build the current source natively with MSVC and without WSL, follow
the Windows build instructions. The portable package
has no installer or signing, and video tools require the optional
Setup-Media.ps1 download. Extract the complete ZIP, double-click
Toniator.vbs for the GUI, or run Toniator-CLI.cmd from a terminal. The guide
records tested behavior and known limits.
The fixed welcome window appears over the editor. Click the editor behind it, press Escape, or close welcome to begin with an empty document. Recent Files scrolls within its own bounded area.
- Click Start New Project and select an image. The same button opens an
existing
.toniatorproject; Recent Files provides quick access later. - Choose a color mode and edit All channels together or select one channel.
- Use Change… to choose a Pattern. Use it as supplied or edit its layout, placement, and styling in the Pattern Wizard.
- Adjust Feature size, rotation, and appearance. Use Preview / Source to compare the result with your original artwork, and zoom or Fit to inspect it. Zooming and panning refresh the visible viewport at display resolution to keep the enlarged preview sharp.
- Save a
.toniatorproject to keep the source image and editable settings. Export PNG for a raster image or SVG for editable vector geometry.
Personal Patterns can be saved, updated, copied, renamed, and moved to recoverable trash. Saving a Pattern to your library is separate from applying it to artwork.
To customize a Pattern, select its gallery card and choose Customize. The wizard follows four decisions:
- Family — choose guides, scattered points, or a parametric curve.
- Family options — choose the arrangement or algorithm and adjust its settings.
- Drawing — choose placement, shapes, connections, and appearance. Available controls follow the capabilities of your current Pattern.
- Review — compare the preview, go Back to adjust it, or Apply Pattern as one undoable document change. Cancel discards the wizard's private edits after confirmation. Save Pattern… optionally stores a reusable library entry; saving does not apply it to the document.
The wizard preview uses a small, neutral light-to-dark sample to make Patterns easy to compare. It is a study of the Pattern, not a preview of your own artwork. It renders in the background on a bounded sample canvas, including connection Patterns. Moving between wizard pages does not wait for a render. In the main sidebar, Feature size controls pattern fineness across families: smaller values tighten spacing and produce more detail; larger values make the pattern coarser. Scatter separation and cluster spread, spiral pitch, and along-curve point spacing scale together. Spirals adjust their turn count to retain approximately the same outer extent. Saved recipe proportions remain unchanged. The editable minimum is 0.01; zero is rejected. Guide/grid Patterns show every repeated guide as a thin blue 1pt line, revealing the full underlying arrangement. Parametric Patterns show their underlying curve in the same way. Orange 1px indicators show every visible point site, including positions where a drawn mark is too small to see. These overlays are preview aids and are not exported. On Review, construction is also checked in the background at your document's size. Apply requires a successful current check; Back and Cancel remain available. Invalid entries and incomplete choices are checked while editing. In All mode, choices reflect compatible channel settings; select a channel to edit it independently.
Live rendering cancels obsolete requests after edits and reuses unaffected stages from the last accepted render. Unfinished or unaccepted stages are recomputed. Personal Pattern thumbnails also render in the background. Still-image exports offer Cancel export and use the artwork captured when the export started.
Each channel’s Pattern draws one kind of output: shapes, lines, or filled areas. Mix Patterns by choosing different settings or Patterns for individual channels. To combine multiple renders within the same channel, export them separately and composite them in another application. Older experimental multi-layer Patterns are unsupported; their files are not modified or automatically flattened.
For scattered points, Random allows irregular gaps, Poisson disk keeps a minimum distance with irregular spacing, Jittered cells places one point in each cell, and Clustered gathers points into organic groups. Cluster centers are specified per 100 points; spread controls the size of those groups. Changing the variation number gives another repeatable arrangement. Point density controls whether placement follows artwork; Keep points apart adds an exclusion rule. These are separate from how large the drawn marks become.
Enable Relax points (Lloyd) to smooth the arrangement by moving points toward their local cell centers. Follow artwork density makes this relaxation follow the channel's source weighting; otherwise it aims for even spacing. Relaxation steps controls how far the arrangement settles. More relaxation can soften clusters. Turning relaxation off retains its settings for later use.
Use the header information button, About Toniator in the menu, or F1 for the version, license, user guide, source code, and issue-reporting links.
New → Save preset saves the whole design configuration
as a source-free .toniator-preset. Load preset... accepts that format or an
intact .toniator project, applies all channel settings, and keeps your current
artwork and canvas. Loading is one undoable change; saving a Preset does not save
the project. Open artwork before loading a Preset.
Undo and Redo operate on document edits. Close returns to startup; Exit
quits. Both prompt when a document has unsaved changes. The app follows the
system light/dark preference where supported.
Supported still-image inputs: PNG, SVG, JPEG, WebP, BMP, TIFF, OpenEXR, and AVIF. PNG exports offer background, antialiasing, and 1x, 2x, 4x, 8x, or Custom output sizes based on the document canvas, independent of preview zoom. SVG exports keep a transparent background. RGB PNG defaults to black, CMYK to white, and source-color output to transparent.
Toniator supports a Start/End animation workflow and silent video exports.
- Start a project with a video or animated image, or use New → Import image sequence… to review an ordered image list and its frame rate. Still images can also supply the artwork for an animation.
- Edit Start frame with the normal Pattern, channel and appearance controls. In Advanced settings, assign Color with the picker or HEX entry and use Alpha for strength. These controls edit the currently selected frame.
- Select End frame below the canvas. Its first selection copies the Start settings. Make the desired changes, then toggle between frames to inspect them. Each frame retains its settings. Changing one channel's Pattern reinitializes only its dependent End settings, preserving the other channels.
- Choose interpolation in a property's Animation disclosure when needed. Use Animation settings… in the main menu for exact frame rate and source interval. The renderer interpolates supported continuous values between the two states; this version has no playback or scrubbing.
- Export a PNG sequence or lossless FFV1/Matroska video. Optional AV1/WebM provides a smaller lossy sharing file with an opaque background. Choose a destination each time or save a personal folder default. Video uses private temporary PNGs, with recovery options if encoding fails.
Save the .toniator project to retain its source media and animation settings.
Project Preset loading keeps the current artwork and timing. Audio is retained
inside the original source but exports are silent. Variable-rate sources are
sampled at the displayed project rate; frames may repeat or be skipped.
Development builds need FFmpeg and ffprobe on PATH for moving media and video
export. The AppImage and Flatpak bundle their own software tools;
see the packaging guide.
Requirements: Rust 1.94+, a C compiler, pkg-config, GTK 4.12+, GLib
development tools, blueprint-compiler, and the native dav1d development
library for AVIF decoding. On Fedora, install the system dependencies with:
sudo dnf install git gcc pkgconf-pkg-config gtk4-devel glib2-devel \
blueprint-compiler libdav1d-develInstall a current Rust toolchain through rustup, then:
git clone https://github.com/ricperry/Toniator.git
cd Toniator
cargo build --release --locked -p toniator-app -p toniator-cli
./target/release/toniator-appTo open the included sample directly:
./target/release/toniator-app assets/raster-sample.pngFor development, cargo run -p toniator-app builds and launches the application.
For a headless build, use cargo build --release --locked -p toniator-cli;
GTK and Blueprint are unnecessary, but the native dav1d dependency still applies.
For the verified native Windows development build and its current limits, see Windows build notes.
Render a source image using the default circular-mark Pattern:
mkdir -p target/validation/examples
./target/release/toniator render \
--input assets/raster-sample.png \
--output target/validation/examples/halftone.png \
--channel-model cmyk --density 30 --density-aspect 1 \
--rotation 0 --offset-x 0 --offset-y 0 --guard-steps 2Use an .svg output filename for vector export. Render a saved project using
its stored settings with toniator render -i artwork.toniator -o artwork.svg.
Run toniator --help or toniator render --help for the supported commands.
In an AppImage, prepend ./Toniator-0.3.3-x86_64.AppImage --cli in place of
toniator. The Flatpak CLI is available through
flatpak run --command=toniator io.github.ricperry.Toniator; direct CLI file paths must be
accessible inside its sandbox.
The packaging guide covers building AppImage and Flatpak bundles with the GNOME SDK. Release instructions explain GitHub tags, release notes, and uploading the packages.
Toniator is prerelease software. Project formats can change between development versions; obsolete formats are rejected rather than automatically migrated. Document-level Presets store a design configuration; the personal Pattern library stores reusable structural recipes.
Advanced Settings provides independent Fill response and Source weighting groups. Each has its own source component, inversion, gain, offset, black/white points, gamma, contrast and cutoff. Weighting also has its own strength and curve. The Pattern Editor defines whether weighting is used and the geometric min/max bounds; it carries no source mapping or tone settings. Changing a Pattern preserves both channel source configurations. These controls edit the selected Start or End frame; ALL assigns each changed value to every compatible channel. Source interpretation remains separate from paint color. Black must stay below white throughout the selected interpolation. A zero cutoff disables suppression. Fill responses below cutoff produce no output, including where minimum fill or thickness is positive. Weighting cutoff suppresses the mapped sample before curve and strength blending. Built-in Pattern response ranges default to 0–1, with editable minima. X/Y offset is beside Rotation, and multi-output channels have separate Coverage controls.
Artwork-weighted Patterns support Rotation and X/Y offsets. Weighting is recalculated at transformed positions; a notice explains how to restore the original alignment with neutral controls. Both source consumers initially use the channel's matching color component, and Advanced can change them independently. Explicit Luminance remains available for monochrome artwork.
Export video also exposes frame rate and duration, with a live frame count, and 0.5x, 1x, 2x, 4x, 8x, or Custom output sizes based on the document canvas. Video projects initialize timing from their source. Export applies timing changes to the document as one undoable edit; closing the sheet before exporting discards them. Optional first/last frames select an export subset. PNG sequences, lossless FFV1/Matroska and optional AV1/WebM remain available.
Current development persistence uses document schema 10, document-Preset format 3, media container 2, and Pattern format 5. Earlier document schemas are rejected; existing project files are not migrated or overwritten automatically.
Known limitations include slow previews at very fine feature sizes, first-use personal thumbnail latency, and an intermittent reported RGB-to-CMYK crash. Second-launch forwarding, stale Preset actions, wizard dismissal and progress reporting are fixed; dense circular-mark previews also avoid a quadratic lookup. Details and follow-up work are in ISSUES.md. Package workflow checks use an isolated Wayland compositor; they do not claim exhaustive GNOME/Mutter or native file-portal acceptance.
- Known issues and limitations
- Pattern Wizard regression checks
- Example artwork and reproduction commands
- Package installation and build guide
- Release notes
- Architecture and design specifications
The Addendum takes precedence over other design specifications. The GTK app and CLI share the same domain, evaluation, and rendering core. Contributions should preserve that separation and include focused checks and inspection of affected output. GTK controls need meaningful accessibility names, roles, states, and keyboard paths.
Release binaries are distributed through GitHub Releases. Historical implementations, local planning records, and design experiments are not part of the current source tree.

