Shape light. Repair detail. Direct the image.
A Windows-first AI photo editor built around gpt-image-2, designed for photographers who want fast, prompt-driven edits on large landscape PNG/JPG photos with predictable, local-first workflows.
Photonix is a desktop application — your originals stay on disk, your API key stays on your machine, and edits go directly from the desktop to the provider you configure.
- BYOK provider config — supply your own
baseURLand API key for any OpenAI-compatible image model - Mask-based local edits — paint a region, write a prompt, get a result that respects what you asked to preserve
- Prompt compiler — your free-text prompt is rewritten into a structured edit instruction with explicit preservation and negative constraints
- Image generation mode — separate text-to-image tab with its own gallery, persisted across restarts
- Upload proxy profiles —
fast / recommended / high_qualityso a 36MB landscape PNG never gets uploaded raw - Social export presets —
WeChat Moments / High Quality Mobile / Small File / Archive PNG, plus a custom mode - Built-in landscape and portrait presets — 8 landscape + 4 portrait one-click starting points, plus your own custom presets
- Persistent prompt history — recent prompts stay around across sessions
- Small batch queue — multi-select in Library, run one preset over several photos with retry/cancel per item
- Version history — every accepted edit becomes a version; switch between draft/final/stitched/original; original files are never modified
- Local-first storage — SQLite for metadata; disk for thumbnails, proxies, masks, generations, and edited versions; secrets in a separate file outside the database
Coming soon. Add your own captures into
docs/screenshots/and reference them here.
| Library | Editor |
|---|---|
![]() |
![]() |
| Generate | Settings |
|---|---|
![]() |
![]() |
| Layer | Stack |
|---|---|
| Desktop shell | Tauri 2 |
| Frontend | React 19 + TypeScript + Vite + Tailwind CSS 4 |
| State | Zustand |
| Backend | Rust |
| Database | SQLite (via rusqlite, bundled) |
| HTTP | reqwest (Rust) |
| Image processing | image crate |
| File scanning | walkdir |
Provider integration:
- POST
/images/editsfor prompt+mask edits - POST
/images/generationsfor text-to-image - POST
/chat/completionsfor prompt compilation - All HTTP calls happen in Rust to avoid CORS and keep the API key out of the JS layer
photonix-app/ Desktop application (Tauri + React + Rust)
src/ Frontend
components/{layout,library,editor,settings,generate,ui}/
services/{tauri,prompt,provider}/
stores/ Zustand stores
src-tauri/ Rust backend
src/commands/{edit,prompt,generate,library,secrets}.rs
src/image_core/ Scan + thumbnail/proxy generation
src/storage/ SQLite + migrations + repository
gpt-image-editor-prd-design.md Full product + technical design (MVP1 + MVP2 + §31 Generate)
information-architecture-wireframes.md
storage-and-database-design.md
mvp-development-breakdown.md
schema.sql Initial database schema reference
BRAND.md Naming + tone direction (legacy: "LumaForge")
- Windows 10/11 (primary target)
- Node.js 20+ (developed against 25)
- Rust stable + Visual Studio Build Tools (C++ workload + Windows SDK)
- An API key for an OpenAI-compatible provider that supports
gpt-image-2style image edit/generation
cd photonix-app
npm install
npm run tauri devThe first build pulls all Rust crates and may take 3–5 minutes. Subsequent builds are incremental.
cd photonix-app
npm run tauri buildOutput is in photonix-app/src-tauri/target/release/bundle/.
- Open the Settings screen (gear icon in the left sidebar)
- Provider tab: enter your
baseURL, API key, and confirm the image/text models - Click Save Settings, then Validate Connection
- Editing tab: choose an upload proxy profile (default:
Recommended) - Export tab: pick a default export preset (default:
WeChat Moments)
API keys are stored in an obfuscated file outside the SQLite database. Production-grade Windows Credential Manager integration is part of the §32.6.9 hardening pass before public beta.
- Library → Import a folder of photos (PNG/JPG/WebP/TIFF/BMP)
- Wait for thumbnails (background two-pass downscale; cached on disk)
- Double-click an image → Editor
- Mask tab: paint the region you want edited (
Bbrush /Eerase /[]adjust size) - Prompt tab: type a prompt or pick a Landscape/Portrait preset; toggle preserve identity / preserve composition
- Generate Draft (Ctrl/Cmd + Enter) — Photonix uploads a compressed proxy, not the original
- The new version becomes active; History tab lets you switch between versions
- Export tab: pick a preset, choose a save location
- Sidebar → Generate (sparkle icon)
- Type a prompt, pick size and quality, click Generate (or Ctrl/Cmd + Enter)
- Result lands in the gallery and the preview area
- Export PNG via the toolbar above the preview
- Library → click Select to enter multi-select mode
- Pick the images you want to edit
- Batch Edit (N) → choose a preset or write a prompt
- Start — items run sequentially with status (queued / running / succeeded / failed / canceled)
- Failed items can be retried individually; queued items can be canceled in bulk
MVP1 — shipped: library, mask, prompt compile, edit pipeline, version history, export, settings, BYOK, Generate tab.
MVP2 — shipped: upload proxy profiles, social export presets, 8 + 4 built-in edit presets, persistent prompt history, custom presets, small batch queue, Rust-side compatibility check.
Coming next (M6 hardening):
- Windows Credential Manager /
keyringfor API key storage - Improved error logging and structured diagnostics
- Batch concurrency tuning
- Real-image tuning of the default proxy and export presets
See the design document for the full scope and roadmap:
- Full PRD + Technical Design — covers product goals, MVP1/MVP2 milestones, prompt compiler, large-image strategy, image generation (§31), and MVP2 social landscape edition (§32)
- Information Architecture & Wireframes
- Storage & Database Design
- Original files are never modified.
- Edited results, generations, thumbnails, and proxies live in your local app data directory.
- Prompts and metadata live in a local SQLite database.
- The API key lives in a separate obfuscated file outside the database.
- Image content is sent only to the
baseURLyou configure, only when you trigger an edit or generation.
Released under the MIT License.



