Contributing to omadesign
Build and contribute to the native Linux app.
How to work on it
git clone https://github.com/michaelmonetized/omadesign.git
cd omadesign
cargo test
cargo run --release --bin omadesign
Rust 2024. Install Git, stable Rust, a C/C++ compiler and pkg-config. The C++
compiler builds the bundled RAW decoder; no installed LibRaw is needed.
cargo is the toolchain. No GTK app, no Electron, no GitHub Actions.
Layout
src/
geom.rs points, bounds, Bézier, hit testing (no UI)
document.rs layers, shapes, command history
compositor.rs tiny-skia renderer + PNG/JPEG export
paint.rs brush, erase, smudge, clone, fill, wand
photo.rs develop pipeline + histograms
trace.rs raster to vector (threshold and color)
boolean.rs union / subtract / intersect / xor
text.rs rustybuzz OpenType + glyph outlines
tools.rs personas, tools, shortcut table
app.rs studio state and document commands
app/
tabs.rs document ownership and tab switching
recovery.rs background recovery snapshots
shortcuts.rs keyboard commands
photo_session.rs photo selection, previews and textures
ui/ chrome, canvas, studios, photo, welcome
jobs.rs background asset, icon and font requests
assets/phosphor/ Phosphor Light (MIT)
docs/ manual, project status, contributing
site/ landing page (TanStack Start)
scripts/ local release + curl installer
Mutations go through Cmd + History. Tests cover geometry, boolean, paint, develop, project round-trip, SVG, export, type, zoom, place, and trace.
Keep file and network work outside the frame loop. Tab switches transfer document state instead of cloning it. Rendering caches are derived from document data and invalidated when that data changes; they do not belong in saved projects.
Project conventions
- Complete tools. Implement the advertised behavior; live text must remain editable.
- No hardcoded UI colors. Chrome reads the Omarchy /
~/.configtheme. Fallback is Catppuccin Mocha, used only when no theme is on disk. - Icons are Phosphor Light. Use the glyphs in
src/ui/icons.rs. - UI font is the desktop font. Resolve it through Omarchy and fontconfig.
- Deep modules.
geomandtexthave no egui types. Tests share the same seams. - Local builds.
./scripts/release.shzig-links glibc 2.35 for aarch64 and x86_64. Build release packages locally; do not add GitHub Actions workflows that use billed runners.
Pull requests
cargo testis green.- If you touched UI, say how you verified it (run the app; there is no browser here).
- If you added a command, it has an undo.
- Do not bump the version unless you are cutting a release.
Every QA pass
Finish each pass with a dated entry in CHANGELOG.md: give it a memorable title,
explain what feels different, and name the bugs that went away. Keep it readable
by someone testing the app, with verification and known limits stated honestly.
Push the tested changes to a branch and open or update its GitHub pull request. Then build and reinstall the same revision for human testing:
cargo build --release --bin omadesign
./scripts/install.sh
The installer also works inside a release tarball. It replaces the binary atomically, so an open session can finish safely. Relaunch omadesign before testing the new build; an already running window still uses the previous one.
Releasing
On the build machine:
# bump version in Cargo.toml
./scripts/release.sh
git tag vX.Y.Z
gh release create vX.Y.Z dist/omadesign-X.Y.Z-*.tar.gz*
Refuse to ship if objdump -T shows GLIBC newer than 2.35.
License
MIT. Phosphor Light is MIT (see assets/phosphor/LICENSE-MIT).