← unDrifter

unDrifter — Living Copy Doc for Figma

Current Version: Bumbler (v0.2.0)

> "Go then, there are other worlds than these."

---

Quick Links:

Hosted hub: https://undrifter.com — use your own PUBLIC_URL when self-hosting.

---

What Is unDrifter?

unDrifter extracts structured content from webpages and syncs it to FigJam/Figma as editable text. Think of it as a "Living Copy Doc" — content captured from websites becomes the source of truth for your design system.

Core insight: Don't recreate layouts. Extract the content (headings, paragraphs, lists, quotes, images, links) and let designers work with it natively.

---

Features

Content Capture (Chrome Extension)

CopyDoc in FigJam (Widget)

Content Management (Figma Plugin)

Data Flow

---

Architecture

┌─────────────────────────────────────────────────────────────────────┐

│ USER'S MACHINE │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────┐ │ │ │ Chrome Extension │────▶│ Local Server │◀────│ Figma Plugin │ │ │ │ - Zone capture │ POST│ - Data bridge │ GET │ - Node create│ │ │ │ - DOM extract │ │ - Variables API │ │ - Variables │ │ │ │ - Screenshot │ │ - OAuth handler │ │ - Sync vars │ │ │ └──────────────────┘ └────────▲─────────┘ └──────────────┘ │ │ │ │ │ ┌──────────────────┐ │ │ │ │ FigJam Widget │──GET/PATCH───┘ │ │ │ - Create CopyDoc│ (variables, figjam/items) │ │ │ - Edit sticky │ │ │ │ - Link Figma │ │ │ └──────────────────┘ data/copydoc.json │ └─────────────────────────────────────────────────────────────────────┘

Why this architecture? 1. Figma REST API is read-only — you must use Plugin API to create nodes 2. Chrome extension and plugin can't communicate directly — server bridges them 3. Local-first for privacy — user content never leaves their machine

---

Quick Start

From the repo root you can use a single control surface:

bash

1. Clone and install all dependencies

git clone <repo-url> && cd unDrifter npm run install:all

2. Start server (keep this running)

npm start

3. Build extension, plugin, and widget (once, or after code changes)

npm run build

Then: Load extension/dist in chrome://extensions; link plugin in Figma → Development; import widget in FigJam → Development

Root scripts

CommandDescription
----------------------
npm startStart the local server (port 3001)
npm run stopStop the server (kills process on 3001)
npm run restartStop then start the server
npm run buildBuild extension + plugin + widget
npm run build:widgetBuild FigJam widget only
npm run install:allInstall deps in server, extension, plugin, widget, shared

See SETUP.md for detailed instructions.

---

Usage

1. Capture Content

1. Go to any webpage 2. Click unDrifter extension icon 3. Choose a capture mode: Select (click to select a container), Draw (drag a full-width band), or Full Page (captures everything; scrolls first to load lazy content) 4. Adjust with crop handles if needed (Select/Draw) 5. Confirm each zone 6. Click "Push to FigJam"

2. Inject to Canvas

1. Open FigJam or Figma 2. Run unDrifter plugin 3. Click "Refresh" to load zones 4. Click "Inject All" to create nodes on canvas

3. Paste to Layers

1. Select any text layer in Figma 2. In plugin, click "Paste & Link" on any content 3. Content is pasted and linked to source 4. Use "Sync" to update from source later

4. Create Variables

1. Click "📊 Vars" button in plugin 2. Creates String Variables in "CopyDoc" collection 3. Bind variables to text layers for native editing

5. CopyDoc in FigJam (Widget)

1. Open FigJam, insert the unDrifter Copy widget (Resources → Widgets → Development) 2. Create from FigJam: Add variables (name optional, value) and click Add — creates CopyDoc before any design exists 3. Or Refresh to load variables from extension captures 4. Edit in sticky notes — blur or Enter to save; server updates 5. Link Figma design file (paste URL/key, click Link Figma) 6. In Figma: unDrifter plugin → Sync vars to pull edits into design 7. Bind text layers to CopyDoc variables to see updates on canvas

6. Manage by URL

1. Zones are grouped by source URL in plugin outline 2. Click URL to open in browser (with ?undrifter=load) 3. Extension automatically loads zones for that URL 4. Edit or delete zones directly in extension 5. Changes sync to server in real-time 6. Delete all zones from a URL via plugin UI

---

What's Implemented

FeatureStatus
-----------------
Zone selection with crop handles
DOM extraction (semantic nodes)
Semantic inference (ARIA, classes)
Screenshot capture + injection
Batch zone workflow
Local server (Node.js + Hono)
FigJam + Figma plugin
Outline view with tree structure
Paste & Link to text layers
Component property support
Inspector panel buttons (RelaunchData)
Figma Variables creation
Shared plugin data (cross-plugin)
Link sync (batch update)
Image proxy for external images
Figma OAuth integration
Manual content from plugin
URL-based zone grouping
Delete zones by URL
Zone loading from plugin links
Edit/delete zones in extension
Smart fallback for empty zones
Whitespace normalization
Accessibility text filtering
Single zone injection
Copy content to clipboard
Image placement on canvas
Full Page capture (scroll-to-load, no interaction)
Variable stickies (cloneWidget, Refresh creates)
Status workflow (draft/review/approved)
Multi-instance (CopyDoc per board/file)
Oy branding
Settings view (feature flags)
Injection width from selection
FigJam widget (CopyDoc editor)
Create CopyDoc from FigJam
Variable sync (FigJam → Figma)
File bindings (FigJam ↔ Figma)

AI enrichment (Bumbler) — where you see the AI

Optional local LLM: use Ollama (OLLAMA_HOST, OLLAMA_MODEL, OLLAMA_ENABLED=true) or OpenClaw (OPENCLAW_ENABLED=true, OPENCLAW_URL) in server .env. See docs/AI_FEATURES.md for full API and configuration.

---

What's NOT Implemented (Future)

---

Non-Goals

---

Tech Stack

ComponentStack
------------------
ExtensionMV3 + React + Vite + CRXJS + Zustand
ServerNode.js/Bun + Hono + dotenv
PluginFigma Plugin API + Vite
WidgetFigma Widget API + esbuild
SharedTypeScript types

---

Version History

VersionNameNotes
----------------------
0.1.0ThrockenInitial implementation
0.1.1ThrockenNative Figma integration: Variables, RelaunchData, Component Properties, Shared Plugin Data, crop handles, semantic inference
0.1.2ThrockenURL-based management, zone loading from links, edit/delete in extension, smart fallback, whitespace normalization, a11y filtering, Oy branding
0.2.0BumblerOllama integration: zone-name enrichment (local LLM); Bumbler version naming
0.2.xBumblerSettings tab, layout-width injection, span/div extraction, screenshot to server, nav icon stacking; OpenClaw option; vocabulary + base corpus; create zone from chat; landing Logs tab; extension Out/In level selection; Full Page capture (scroll-to-load, avoids sticky/absolute overlap); expand Show More (skips external links); collapsed body copy extraction; enrich troubleshooting
0.2.xBumblerFigJam widget — create CopyDoc in FigJam, sticky-note UI, edit variables, link to Figma design, sync vars; POST /figjam/items, GET/PATCH /variables, file bindings
0.2.xBumblerMulti-instance — per-board CopyDoc; variable stickies (cloneWidget on Add, Refresh creates); status workflow; full-page capture no-interaction; expand skips gallery/carousel

---

"Long days and pleasant nights, sai."