Doop
Doop is an open-source multiplayer design canvas and design MCP for Claude Code, Codex, and any AI agent. Design side by side with agents — free in beta.
Fomi frontend developer assessment: a faithful mockup implementation and an original AI image workspace.
Translation pending
DesignGitHub @aslan997OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Two deliverables in one Next.js app:
| Route | What it is |
|---|---|
/ | Short overview with links to both parts |
/implementation | Part A — faithful, responsive build of the supplied image-generator mockup |
/workspace | Part B — Fomi Studio, an original creative-continuity workspace built around Creative Branching |
Both run against a mocked backend. No real AI generation takes place; results come from a local image library.
Requires Node 20+ (developed on Node 22).
npm install
npm run dev # http://localhost:3000
| Command | Purpose |
|---|---|
npm run dev | Development server |
npm run build | Production build |
npm run start | Serve the production build |
npm run lint | ESLint (Next.js core-web-vitals rules) |
npm test | Playwright end-to-end + accessibility tests (run npm run build first) |
Tests use the locally installed Google Chrome. To use Playwright's bundled Chromium instead: npx playwright install chromium and run with PW_CHANNEL="".
POST /api/generate// Part A
{ "collection": "studio", "prompt": "snowy mountain at sunset", "mode": "image",
"model": "fomi-portrait", "aspectRatio": "2:3", "count": 4,
"style": "cinematic", "guidance": 7, "seed": null, "negativePrompt": "" }
// Part B — a branch of an existing image
{ "collection": "workspace", "prompt": "…", "model": "studio-v3", "aspectRatio": "4:5", "count": 4,
"parentGenerationId": "g2", "parentImageId": "g2_0",
"parentLook": { "base": "street", "grade": "golden", "framing": "standard" },
"variation": { "intent": "lighting", "note": "colder" } }
{ generationId, status: "completed", prompt, model, aspectRatio, seed, parentGenerationId, createdAt, images: [{ id, url, width, height, alt, … }] }error.fields maps field → message)error.retryable: true)Behaviour is deterministic: the same prompt and seed return the same images, ranked by prompt keywords. A short simulated delay makes loading states visible. Add "scenario": "error" | "empty" to exercise failure paths — both UIs expose this under Support → Demo controls (Part A) and Settings → Demo controls (Part B).
GET /api/projects/:projectIdReturns the seeded Part B project (atlas-fw26) after a short delay; unknown ids return 404.
Part A: type a prompt and press Generate (or Ctrl+Enter). Image/Video switch modes; the header icons filter the feed (Home, Images, Videos, Saved); history thumbnails jump to their generation; hover a result to save or download; click to preview (←/→, Esc). The moon toggles a dark theme.
Part B: the project opens on a branch (G4). Hover an image → Branch → choose Lighting, Framing, Subject (runs immediately) or Remix (edit the prompt in the composer). The Branches panel shows lineage — click a row or use the arrow keys. Click images to select them (across branches) → Compare. Star to keep; Kept assets in the rail collects them. Shortcuts: [ ] previous/next run, Alt+↑ parent, C compare, Esc clear selection.
State is stored in localStorage; Reset lives in each app's demo controls.
See docs/ARCHITECTURE.md for structure, state management, the mock generators, accessibility, performance and responsive strategy.
Other docs:
localStorage.next build) and output./, /implementation and /workspace on the production URL.The mock API runs as Vercel Functions; its simulated delays (≤3 s) are well within default limits.