# svganimator: Electron Svgator clone → Canaveral monorepo SVG keyframe studio

Source: https://www.michaelchurley.com/blog/svganimator-electron-to-canaveral-keyframe-export-studio  
Published: 2026-05-14  
Author: Michael C. Hurley  
Tags: svganimator, svg, animation, keyframes, lottie, export, canaveral, bun, tanstack-start, tanstack-router, zustand, zod, electron, expo, resvg, blacksmith, freview, fallow, hurleyus

![Migrate arc](/blog/svganimator-electron-to-canaveral-keyframe-export-studio/screenshots/migrate-arc.png)

## Who

I wanted an SVG keyframe studio under my own roof: first as an Electron app with Svgator inspiration docs, then as a product surface inside the Canaveral Bun monorepo.

For operators who care about the honest rename tax: GitHub says **svganimator**, `package.json` says **canaveral**, `appConfig` and the UI eyebrow say **SVG Animator**.

## What

I built **svganimator**, public https://github.com/HurleyUS/svganimator. HEAD `86bb4a2`. **13** commits. **0** stars. Default **main**. Root package name **`canaveral`** **0.1.0**.

**At HEAD (Bun / TanStack / workspaces):**

- `@canaveral/svg`: **963** LOC Zod schemas for elements, keyframes, collaborators, projects; export formats **`svg` | `lottie` | `gif` | `mkv`**; `serializeStandaloneSvg`, `serializeLottie`, `applySvgAnimations`, `createStarterSvgProject`
- `web/src/routes/index.tsx` (~378): SVG Animator studio with projects sidebar, canvas scrubber, invite form, export grid
- `web/src/lib/export-renderer.ts` (~160): GIF/MKV via Resvg frame raster (`fps 30`, `880×720`)
- Zustand `useSvgWorkspaceStore` in `shared/state`
- Electron `desktop/` loads `appConfig.url` with title **SVG Animator**
- Expo `mobile/app/index.tsx` shows starter project element/keyframe counts
- `shared/config` sets `name: "SVG Animator"`, `support@svganimator.localhost`

![Studio layout](/blog/svganimator-electron-to-canaveral-keyframe-export-studio/screenshots/studio-layout.png)

**Deleted on migrate (`f2f6023`):** Electron `src/renderer/**` editor, `electron.vite.config.ts`, and the Svgator `inspiration-docs/` scrape from the May 3 init.

![Export formats](/blog/svganimator-electron-to-canaveral-keyframe-export-studio/screenshots/export-formats.png)

**Honesty gaps:** README + `pub/` + `.env.example` still market **Canaveral**. Seven same-afternoon commits titled Standardize Blacksmith CI gates. `REVIEW.md` is a large fallow dump. No public demo URL.

Sibling surfaces to keep straight: private `HurleyUS/canaveral` (generic launch pad, already packed); local no-git `~/Projects/svganimator` Bun path draw-on app; `tsxsvg` (SKIP / plan-only). This public repo is the SVG Animator product identity on a canaveral-named scaffold.

## Where

Code: [github.com/HurleyUS/svganimator](https://github.com/HurleyUS/svganimator), public.

Run (facts from README/scripts): `bun install`, `cp .env.example .env`, `bun run env:check`, `bun run dev` (Caddy) or `bun run dev:raw` (Vite).

No live product URL. No claimed domain.

## When

- **2026-05-03.** `0965ad7` needs work: Electron + Svgator inspiration-docs (~94 files)
- **2026-05-04.** `3e38809` exports: timeline/properties/exporter panels + tests
- **2026-05-04.** `f2f6023` migrate svganimator to canaveral monorepo
- **2026-05-14 afternoon ET.** Blacksmith CI ×7 + FReview observability + formatter; HEAD `86bb4a2`
- Pack prepared **2026-09-08 ~5:06 PM ET** (draft + assets only)

## Why

I needed the SVG animator product on the same Bun/TanStack/Caddy rails as the rest of the launch pad: shared Zod contracts, web studio, Electron shell, Expo card. The GitHub repo name and the root package name still disagree; the UI sells SVG Animator anyway.

**Engagement:** how many public product repos keep README saying the scaffold name while `appConfig` and the UI sell a different product?
