A touch-native, multi-layer image editor for Android — sketch, paint, retouch, and composite with layers, blend modes, curves, text, and stencils. Built entirely in Kotlin + Jetpack Compose.
Graffux is the standalone 2D editor extracted from GraffitiXR (an AR mural-projection app). It hosts the shared editor stack as the single source of truth; GraffitiXR consumes the same modules for its 2D work and adds AR on top.
- Layers — add image or blank layers, reorder, rename, toggle visibility, duplicate, link, flatten.
- Transform — move / scale / rotate by gesture, or type exact values in the numeric transform panel.
- Adjustments — opacity, brightness, contrast, saturation, colour balance, curves, invert.
- Paint — brush and eraser with size + feathering; OpenCV-backed Liquify.
- Effects — Canny edge outline, sketch, ML Kit subject isolation, multi-layer stencil generation.
- Text — parametric text layers with Google Fonts.
- Artboard — a fixed document size (social / print / custom presets) with a visible frame.
- Export & share — save the composite to the gallery, or hand it to another app (e.g. GraffitiXR).
The UI is driven by AzNavRail — the rail hosts the design tools; the canvas is its full-screen background.
MVI: a pure EditorReducer maps EditorIntents to the next EditorUiState; EditorViewModel
orchestrates side effects (history, persistence, OpenCV) around each dispatch.
| Module | Responsibility |
|---|---|
:app |
The Graffux application shell — MainActivity hosts the AzNavRail + the shared editor. |
:feature:editor |
The editor: reducer, view-model, canvas, panels, brush/stroke engine, export. |
:core:common |
Models (Layer, EditorUiState, GraffitiProject), serialization, shared utilities. |
:core:domain |
Repository interfaces. |
:core:data |
Project + settings persistence. |
:core:design |
Design system: theme, strings, reusable components. |
:core:nativebridge |
JNI bridge to the native (OpenCV) world used by Liquify and drawing. |
The :core:* and :feature:editor modules keep the com.hereliesaz.graffitixr namespace — they are
the shared single source of truth. Only :app is Graffux-specific (com.hereliesaz.graffux).
Graffux is growing toward a full, touch-first design tool. Near-term:
- Bind layers to the artboard (letterbox) and export at exact document pixels.
- Snapping, smart guides, and align / distribute.
- Vector layers (shapes, pen, live text) alongside the raster engine.
See the repository for license details.