A local-first vector design app in the browser. Draw on an infinite dot-grid canvas with text, images, lines, shapes, icons and freehand strokes, then export to SVG, PNG or WEBP (or copy a PNG straight to the clipboard).
Everything is stored locally in the browser via Dexie (IndexedDB) — projects autosave and reload where you left off. No account, no server, no uploads.
| Shortcut | Action |
|---|---|
V T I L R O P | Select / Text / Image / Line / Shape / Icon / Pen |
P (repeated) | Cycle pen → highlighter → eraser |
E | Eraser |
Ctrl/⌘ + Z / Shift + Ctrl/⌘ + Z | Undo / redo |
Ctrl/⌘ + D | Duplicate |
Ctrl/⌘ + A | Select all |
Ctrl/⌘ + C / Ctrl/⌘ + V | Copy / paste |
Ctrl/⌘ + = / - / 0 | Zoom in / out / reset |
Delete / Backspace | Delete selection |
Esc | Exit text editing, then clear selection |
| Arrow keys | Nudge (hold Shift for a larger step) |
| Space (hold) | Pan |
npm install
npm run dev # start the dev server
npm run build # type-check and build to dist/
npm run preview # preview the production build
The app is a static SPA and deploys to Vercel with no
configuration beyond the included vercel.json. Import the repository, and
Vercel detects Vite, runs npm run build, and serves dist/.
Stock image search is served by the api/pixabay.ts serverless function at
/api/pixabay. vercel.json routes /api/:path* to that function before the
SPA catch-all rewrite, so API requests are not swallowed by /(.*) -> /index.html.
api/pixabay.ts reads its Pixabay API key from PIXABAY_KEY via
process.env.PIXABAY_KEY. You must set PIXABAY_KEY as an environment
variable in the Vercel project (Project Settings → Environment Variables) for
the deployed proxy to work — without it the function returns HTTP 500
PIXABAY_KEY environment variable is not set. Set it for the environments you
deploy to (Production, Preview, Development, as needed). Locally, put it in an
untracked .env file (already in .gitignore — never commit it).
Vite + React + TypeScript, Tailwind CSS v4 and shadcn/ui (Base UI), Zustand for state, Dexie for persistence, and a custom SVG rendering engine.
A local-first vector design app in the browser. Draw on an infinite dot-grid canvas with text, images, lines, shapes, icons and freehand strokes, then export to SVG, PNG or WEBP (or copy a PNG straight to the clipboard).
Everything is stored locally in the browser via Dexie (IndexedDB) — projects autosave and reload where you left off. No account, no server, no uploads.
| Shortcut | Action |
|---|---|
V T I L R O P | Select / Text / Image / Line / Shape / Icon / Pen |
P (repeated) | Cycle pen → highlighter → eraser |
E | Eraser |
Ctrl/⌘ + Z / Shift + Ctrl/⌘ + Z | Undo / redo |
Ctrl/⌘ + D | Duplicate |
Ctrl/⌘ + A | Select all |
Ctrl/⌘ + C / Ctrl/⌘ + V | Copy / paste |
Ctrl/⌘ + = / - / 0 | Zoom in / out / reset |
Delete / Backspace | Delete selection |
Esc | Exit text editing, then clear selection |
| Arrow keys | Nudge (hold Shift for a larger step) |
| Space (hold) | Pan |
npm install
npm run dev # start the dev server
npm run build # type-check and build to dist/
npm run preview # preview the production build
The app is a static SPA and deploys to Vercel with no
configuration beyond the included vercel.json. Import the repository, and
Vercel detects Vite, runs npm run build, and serves dist/.
Stock image search is served by the api/pixabay.ts serverless function at
/api/pixabay. vercel.json routes /api/:path* to that function before the
SPA catch-all rewrite, so API requests are not swallowed by /(.*) -> /index.html.
api/pixabay.ts reads its Pixabay API key from PIXABAY_KEY via
process.env.PIXABAY_KEY. You must set PIXABAY_KEY as an environment
variable in the Vercel project (Project Settings → Environment Variables) for
the deployed proxy to work — without it the function returns HTTP 500
PIXABAY_KEY environment variable is not set. Set it for the environments you
deploy to (Production, Preview, Development, as needed). Locally, put it in an
untracked .env file (already in .gitignore — never commit it).
Vite + React + TypeScript, Tailwind CSS v4 and shadcn/ui (Base UI), Zustand for state, Dexie for persistence, and a custom SVG rendering engine.