A vibe coded paint app.
- Brush, pencil, line, rectangle, ellipse, eraser, paint bucket, text, magic wand & color picker — soft brush strokes, crisp pencil lines, straight segments, outlined or filled shapes, flood-fill on the active layer, in-place text, color-based selection, and an eyedropper (K) to sample colors from the canvas
- Text tool — click to place (T); type in place; Enter finishes, Shift+Enter inserts a new line, Esc cancels; toolbar supports font family, size, bold/italic/underline, and left/center/right alignment
- Shape modifiers — Shift constrains lines to 45°, rectangles to squares, ellipses to circles; Alt draws from center
- Shape style — outline, filled, or filled with outline (rectangle & ellipse)
- Toolbar — tool picker on the left, brush width above the canvas
- Document size — the canvas has its own dimensions; crop and resize operations shrink or grow the document, not just the window
- Zoom & pan — scroll wheel zooms toward the cursor; Space+drag or middle-mouse drag pans; macOS: ⌘+/- zoom, ⌘0 fit, ⌘1 100% · Windows/Linux: Ctrl+/- zoom, Ctrl+0 fit, Ctrl+1 100%
- Canvas background — separate from layers; choose via the background color well or when creating a new image (includes transparent)
- Color wells — classic overlapping primary and background swatches with swap and reset; click a well, then pick a preset (background well includes transparent)
- Color picker — double-click either well to open a full picker with hue/saturation wheel, HSV and RGB sliders, alpha, hex input, and foreground/background preview with swap
- Layers — stack transparent layers (top of list = front), show/hide, reorder, opacity, blend modes, duplicate, merge down, and rename; eraser clears pixels on the active layer
- Undo & redo — step through stroke history on the active layer (toolbar buttons or ⌘Z / ⌘⇧Z)
- Selection tools — rectangle, ellipse, and lasso select with custom toolbar icons
- Marching ants — animated selection outline with resize handles and proper edge/corner cursors
- Selection editing — select all, deselect, invert, move, delete; switch rectangle ↔ ellipse after creating a box selection; zero-area selections deselect automatically
- Edit menu — selection commands with keyboard shortcuts (macOS menu bar; in-window on Windows and Linux)
- Image menu — crop to selection, auto crop, resize image, resize canvas (with anchor), flip horizontal/vertical, rotate 90° CW/CCW, rotate 180°, and flatten layers (macOS menu bar; in-window on Windows and Linux)
- AI Enhance — toolbar sparkle button enhances the active layer (or selection) via Grok (xAI cloud). Preview before apply; undoable. Configure your API key in Settings.
- File menu — New, Open, Save, and Save As (macOS menu bar; in-window on Windows and Linux)
- Image formats — Save As supports PNG, JPEG, BMP, GIF, and WebP; macOS uses the system save panel format menu
- Document title — filename in the window title;
*prefix when there are unsaved changes
- Desktop — macOS, Windows, and Linux
- macOS native menus — File, Edit, and Image live in the system menu bar with standard keyboard shortcuts
- Keyboard shortcuts — undo/redo, zoom (⌘+/- / ⌘0 / ⌘1 on Mac), tools, and document commands; see menus for the full list
Third-party assets are tracked in ATTRIBUTIONS.md and assets/ATTRIBUTIONS.yaml.
Rough order of obvious next steps:
- Color picker — full HSV/RGB/hex dialog on double-click
- Brush size — adjustable width
- Eraser — paint back to transparent/background
- Undo / redo — history for brush strokes
- New / clear — reset the canvas
- Save & open — PNG export and import
- Selection tools — rectangle, ellipse, and lasso select with move, resize, and reshape
- Image menu — crop, resize, flip, rotate, and flatten
- More tools — fill bucket (G) and magic wand (W); tolerance follows brush size
- Toolbar — tool buttons on the side
- Zoom & pan — scroll to zoom, Space or middle-mouse to pan, keyboard zoom shortcuts
- Layers — stack and edit images independently
Download VibePaint-<version>-macos.dmg from Releases.
- Open the DMG
- Drag VibePaint into Applications
- First launch only: in Applications, right-click VibePaint → Open → click Open again
macOS blocks unsigned apps downloaded from the internet until you confirm once. After that, double-click works normally. More detail: docs/macos-distribution.md.
Alternative: download VibePaint-<version>-macos.app.zip, unzip, move VibePaint.app to Applications, then right-click → Open.
Requires Flutter with desktop support enabled.
flutter pub get
flutter run -d macos # or windows / linuxUse the arm64 Flutter SDK from flutter.dev (the default), then:
flutter doctor # confirm macOS desktop toolchain is OK
flutter pub get
flutter run -d macosRelease build locally:
flutter build macos --release
open build/macos/Build/Products/Release/VibePaint.appInstall a /Applications/VibePaint.app stub that opens your local Flutter build (same pattern as Panorama). The launcher’s version is taken from pubspec.yaml each time you install:
./scripts/macos/install-mac.shBuild and refresh the Applications entry in one step:
./scripts/macos/build-and-install.shAfter that, Cmd+Space “VibePaint” launches the repo build, and Open With keeps working through the Applications stub.
- Open Settings (VibePaint menu on macOS, File menu on Windows/Linux, or the gear toolbar button).
- Enter your xAI API key, save, and test.
- Draw on the active layer, then click the sparkle AI Enhance toolbar button.
- Review the preview — Apply, Regenerate, or Cancel.
Grok uses grok-imagine-image-quality via POST /v1/images/edits.
Optional DMG (create-dmg via Homebrew for a nicer layout; otherwise hdiutil):
scripts/macos/package_dmg.sh \
build/macos/Build/Products/Release/VibePaint.app \
VibePaint-local-macos.dmgPackage Linux release artifacts locally (after flutter build linux --release):
scripts/linux/package_release.sh \
--bundle build/linux/x64/release/bundle \
--version 1.0.3 \
--output-dir .Requires flatpak-builder for the Flatpak bundle and snapcraft for the Snap package; .deb, .rpm, .pkg.tar.zst, AppImage, and tarball are always produced.
CI runs on every push and pull request to master.
To publish a release with Windows, Linux, and macOS binaries:
Automatic (recommended): open Actions → Release → Run workflow and click Run workflow. The version auto-increments the patch number from the latest v* tag (or uses pubspec.yaml for the first release), updates pubspec.yaml, and creates the GitHub release.
You can optionally enter a specific version (e.g. 0.2.0) to override auto-increment.
Manual tag:
git tag v0.1.0
git push origin v0.1.0| Platform | Artifact |
|---|---|
| macOS | VibePaint-<version>-macos.dmg (drag into Applications) and VibePaint-<version>-macos.app.zip |
| Windows | VibePaint-<version>-win-x64-setup.exe (installer) or VibePaint-<version>-win-x64.zip (portable) |
| Linux | VibePaint-<version>-linux-x64.AppImage, .deb, .rpm, .pkg.tar.zst, .flatpak, .snap, -aur.tar.gz, and .tar.gz |
Download artifacts from Releases.
| Format | Best for | Install |
|---|---|---|
| AppImage | Any distro, no install | chmod +x VibePaint-*-linux-x64.AppImage && ./VibePaint-*-linux-x64.AppImage |
| .deb | Debian, Ubuntu, Mint, Pop!_OS | sudo apt install ./VibePaint-*-linux-x64.deb |
| .rpm | Fedora, RHEL, openSUSE | sudo dnf install ./VibePaint-*-linux-x64.rpm |
| .pkg.tar.zst | Arch Linux | sudo pacman -U ./VibePaint-*-linux-x64.pkg.tar.zst |
| AUR bundle | Arch (yay/paru) | Extract VibePaint-*-linux-x64-aur.tar.gz, then makepkg -si |
| Flatpak | Sandboxed install on any distro with Flatpak | flatpak install --user ./VibePaint-*-linux-x64.flatpak |
| Snap | Ubuntu and other distros with Snap | sudo snap install ./VibePaint-*-linux-x64.snap --dangerous |
| .tar.gz | Portable / manual | Extract, then run bundle/vibepaint from the extracted folder |
.deb, .rpm, and .pkg.tar.zst packages install to /opt/vibepaint and add a VibePaint entry to your application menu.
No Apple Developer account is required. macOS builds are unsigned; users open once via right-click → Open. Windows builds are unsigned; on first launch use More info → Run anyway if SmartScreen appears.
MIT — see LICENSE.

0 comments
log in to comment.