Checking…
0z 0v
Ready

Get started

Point every client at this hub: capture in Chrome, design in Figma, browse data below. Same URL everywhere—then zones and variables stay in sync.

These downloads are built for this site

FigJam? Import widget/manifest.json (FigJam → Resources → Widgets → Development). See Setup or How it works.

What you get

  • Structured copy — Headings, paragraphs, lists, and screenshots from the live page (or full-page scroll capture).
  • Figma-native workflow — Inject into frames, paste & link text to the hub, sync when the source changes.
  • One hub URL — Extension, plugin, and FigJam widget all talk to the same server; variables and zones stay aligned.
For developers — hub internals

Server (this hub)

Stores captures and serves the API. Chat with Gwen, space picker, counts, and Figma OAuth status sit in the slim bar under the nav. Per-user Figma link: use the Figma tab.

Gwen (optional)

Optional: Ollama Cloud powers Gwen—no GPU on this machine needed.

MOSME — a mixture of specialists behind one guide: heavier reasoning and tools run only when your question needs them (product pattern; not the same as neural mixture-of-experts).

Backend: Ollama Cloud

Model: Configured

Host: ollama.com

AI Features doc →

FigJam widget

Variables and stickies on the board; sync into Figma when you link files.

widget/ · How it works

Shared types

One schema for zones and metadata across extension, server, and Figma clients.

shared/

MOSME

Mixture-of-specialists: two focused roles per round on this hub’s AI backend. Same API as Gwen’s MOSME option — useful for longer sessions.

Checking AI…

MOSME docs

Browser (Chrome)

Capture a region, a full-width band, or a full-page scroll. Each zone is structured copy plus a screenshot—then push to this hub.

unDrifter Chrome extension popup showing Select, Draw, and Full Page modes, plus settings for screenshot, AI enrichment, exclude hero or sticky, and show trace.
What you see after clicking the toolbar icon: pick a mode, then interact with the page. Toggles match capture behavior (screenshot, enrichment, layout filters).

Install

Load unpacked from a zip or build extension/dist when this server doesn’t ship a build.

Extension zip isn’t on this server yet. Fix the deploy (repo-root build); see the yellow note above.

Capture modes

Full-page scrolls only—no accordion clicks—so modals and galleries stay predictable. Select and Draw can expand “show more” content where you need it.

extension/ — source and build instructions when no zip is on this hub.

When this server has extension/dist, a zip button appears here. Otherwise build from the repo: cd extension && npm run build.

Zones on this hub

When you push from the extension, each capture lands here as a zone: structured copy, optional screenshot, and normalized source URL. The plugin reads the same JSON—this list is the handoff before you open Figma.

Stored on this hub. Browse without the plugin.
Loading…

Figma

OAuth connects your files; the plugin reads the same hub as Chrome. Inject frames, paste & link text to the doc, and sync when the site changes.

Connect Figma (OAuth)

One-time consent so the plugin can use Figma’s API on your behalf.

Use Log in · Join in the header first—then you can connect Figma.

Plugin zip

Import from Figma’s Development menu, or build plugin/ when no zip is listed.

Plugin zip isn’t on this server yet. Fix the deploy (repo-root build); see the yellow note above.

Hub URL & auth

Connection

Use Log in · Join in the header, then open Account for an API key, then connect Figma below.

When this server has a built plugin, a zip button appears here. Otherwise: cd plugin && npm run build from the repo root.

CopyDoc variables

String variables on this hub mirror the plugin’s CopyDoc collection. Edit here or from FigJam stickies; in Figma use Sync vars so bound text layers pick up changes.

Hub is source of truth; plugin sync updates Figma.
Loading…

How it works

unDrifter is one hub (this server) that holds zones and variables. The Chrome extension captures live copy and screenshots; the Figma / FigJam plugin and FigJam widget read the same API—inject, paste & link, sync, and edit without juggling files.

Full-page capture scrolls only (no accordion clicks), so you avoid surprise modals. Use Inject for layout, Paste & link for text tied to the doc, Sync when the site changes, and variables when you want Figma-native bindings.

How the pieces connect

Interactive map: extension and FigJam feed the server; the plugin pulls zones and variables into Figma. Orbit the scene—click a node for detail. The numbered pipeline below spells out the same flow in text.

Pipeline

  1. Hub URL — Every client points at this base URL (localhost, LAN, or hosted HTTPS).
  2. Extension → hub — Captures POST to /zones. Hosted zips often bake the URL; otherwise see Setup.
  3. Plugin / widget → hub — Figma manifests allow listed hosts only; same REST surface as the extension.
  4. One doc — Mismatched URLs mean empty lists; align extension, plugin, and widget.
  5. Accounts — When enabled, Chrome and Figma don’t share cookies; use an API key from Account for those clients.
  6. Tester zipsAccount → Downloads lists copy-paste URLs for the Chrome extension and Figma plugin .zip files.

Where Gwen runs

Only the server calls the LLM. Configure env on the hub; extension and Figma never hit Ollama directly.

Ollama CloudOLLAMA_HOST=https://ollama.com plus API key. Fits hosted hubs without a local GPU.

Local Ollamaollama serve on your machine or LAN; set OLLAMA_HOST accordingly. Zones and screenshots still live on the unDrifter server.

OpenClaw — Optional gateway for enrichment and chat. Streaming (SSE) is Ollama-only today; OpenClaw uses the JSON chat path.

MOSME — product-side mixture of specialists (one guide, multiple focused skills) keeps heavy work optional; different idea from neural mixture-of-experts in model training.

Installing clients

Tester / dev paths for now—not in the public stores. Use Download on Browser and Figma when this hub ships zips, or build from source. Keep the same hub URL everywhere.

  • Chrome extension — build extension/; the Browser tab shows a zip when this server can read extension/dist.
  • Figma plugin — build plugin/; the Figma tab shows a zip when builds are on this server.
  • FigJam widget — FigJam → Development → Import widget from manifestwidget/manifest.json after npm run build in widget/. See Setup.

Privacy & deployment

All-in-one laptop (server + local Ollama + dev clients) is the simplest offline-friendly path. Hosted hub + extension + Figma is equally valid, with Ollama Cloud or reachable local Ollama. Captured content stays where this server stores data; only the LLM route changes.

Docs

Long-form guides live on separate pages. Start with Setup, skim Readme for the big picture, then dig into AI Features when you wire Gwen.

  • Readme — Product story, features, architecture
  • Setup — Server, extension, plugin, widget
  • Agents — Context for AI assistants and contributors
  • AI Features — Ollama Cloud vs local, OpenClaw, enrichment
  • REST API — On this hub: routes and curl

Account

Hosted hubs: your plan and usage live here too, plus API keys, project spaces, and the activity log. OAuth for Figma files is separate—use Figma.

Your plan & usage

Gwen credits, vision, MOSME rounds, and how your zones, spaces, and API keys compare to plan limits.

API keys & sign-in

Use Log in · Join in the header. Chrome and Figma don’t share your browser login—after you sign in, create an API key here for those apps. How it works explains why.

Extension & plugin (tester zips)

Use full URLs when sharing in chat or email. Click a field to select, then copy. Opening the link in a new tab usually starts the download.

Link to this section (opens Account → Downloads):

No zip builds are available from this server right now. This hub was likely built without client bundles—fix the deploy (repo-root build:clients:hosted) or set UNDRIFTER_ALLOW_DEV_DOWNLOADS=true in production if zips exist on disk.

Session

Loading…

Project spaces

Each space is its own zones + variables. The Hub picker follows the space you mark active.

    Activity log

    Hosted + signed in: your API lines. Legacy / local: full server log.

    Loading…

    REST API

    Same routes the extension and Figma clients use. Replace https://localhost:3001 with your hub URL; add -H "Authorization: Bearer undrifter_…" when this hub requires an API key.

    Routes

    • GET /zones — Fetch zones
    • POST /zones — Push zones from extension
    • GET /variables — Variable items (FigJam widget, plugin sync)
    • PATCH /variables — Update variable values (FigJam widget edits)
    • POST /figjam/items — Create CopyDoc items from FigJam (name, value)
    • GET /file-bindings — FigJam ↔ Figma file bindings
    • POST /file-bindings — Link FigJam board to Figma design file
    • GET /screenshots/:file — Zone screenshot image
    • GET /auth/status — Auth status
    • GET /logs — Server log buffer (legacy: full; hosted accounts: your request lines only, requires session or API key)
    • GET /enrich/status — Enrich provider (Ollama/OpenClaw) config
    • POST /enrich/zone-name — Suggest zone name
    • POST /enrich/semantics — Enrich children (role, component)
    • POST /enrich/clean-structure — Clean structure, dedupe, headline/body/cta slots
    • GET /enrich/structure-examples — List good/bad examples used to train Gwen
    • POST /enrich/structure-examples — Submit good or bad before/after (body: {"kind":"good"|"bad","childrenBefore":[],"childrenAfter":[]})
    • POST /enrich/chat — Chat with Gwen (body: {"message":"..."})
    • POST /enrich/chat/stream — Same body; text/event-stream (Ollama only). Deltas: data: {"t":"…"}; event: done with full reply.
    • POST /enrich/chat/mosme — MOSME dual specialists. Body: {"message":"…","rounds":1} (rounds 1–3). Response data.transcript (Ollama + both model env vars required).
    • POST /billing/stripe/checkout-session — Start Stripe Checkout (body optional {"tier":"starter"|"pro"|"team"}; session cookie; Stripe must be configured).
    • POST /billing/stripe/portal — Stripe Customer Portal (existing subscribers).
    • POST /billing/stripe/webhook — Stripe webhooks only (signature verification).
    • POST /enrich/create-zone — Create zone from description (body: {"description":"...", "zoneName":"..."} optional)

    Examples

    GET /zones — Fetch all zones
    curl -sk https://localhost:3001/zones
    Response
    {
      "success": true,
      "data": [
        { "id": "...", "name": "Hero", "order": 1, "bounds": {...}, "source": {...}, "children": [...] }
      ]
    }
    GET /enrich/status — Enrich provider status (Ollama/OpenClaw)
    curl -sk https://localhost:3001/enrich/status
    Response
    {
      "enabled": true,
      "model": "your-ollama-tag",
      "host": "http://localhost:11434"
    }
    POST /enrich/clean-structure — Structure naming (body: JSON)
    curl -sk -X POST https://localhost:3001/enrich/clean-structure \\
      -H "Content-Type: application/json" \\
      -d '{"children": [ ... ]}'
    Response
    {
      "success": true,
      "data": { "children": [...], "changes": "Renamed 3 cards; applied slots." }
    }
    POST /zones — Create zones (extension)
    curl -sk -X POST https://localhost:3001/zones \\
      -H "Content-Type: application/json" \\
      -d '{"zones": [{ "name": "Hero", "order": 1, "bounds": {...}, "source": {...}, "children": [] }]}'
    Zone screenshot