Sketch to Diagram
Sketch an architecture by hand and let Circuitry turn it into a real diagram — shapes with labels become blocks that move as one, arrows become connections that follow, and the whole sketch converts into live workflow nodes, each typed from what you called it.
When you're planning, the fastest way to think is to draw. On any Workflow canvas, switch to drawing mode and sketch the way you would on a whiteboard. Circuitry quietly recognises the structure behind your sketch so it behaves like a diagram instead of loose ink.
Virtual nodes — a shape with a label
Draw a shape (rectangle, ellipse, circle, diamond, triangle) and put a text label inside it — handwrite it with the Write pen (it converts to text as you write) or type it with the Text tool. You can also add the label first and draw the shape around it. Circuitry recognises that the two belong together and groups them into a single block:
- The shape and its label move together as one object — drag either and both follow.
- The label is gently centered inside the shape.
- It's the same gesture you'd use to sketch a button for a UI mock-up.
Recognition is deliberately conservative: it only groups a shape with text that is clearly inside it. Freehand ink inside a shape — a doodle, a face, decoration — never triggers grouping, and unrelated notes that happen to overlap a big frame are left alone. If it ever groups something you didn't mean, just Ungroup (right-click, or ⌘⇧G) — nothing is permanent.
You can turn this off any time in Settings → Drawing → Sketch to Diagram → "Auto-group sketches into nodes" (it's on by default). With it off, you can still group manually with ⌘G.
Group blocks into groups
Blocks nest. Select a few button blocks and group them into a menu bar; group several menu bars into a header. Grouping is hierarchical, so ungrouping peels one level at a time — ungroup the header and the menu bars stay intact; ungroup a menu bar and the buttons stay intact. Your deliberate sub-groups never explode back into loose strokes.
Labels on their own
A block doesn't need a shape around it. Write or type a label on its own — "Fetch API", "Send email" — and it becomes an object you can drag, connect and convert. Handwriting is grouped into one label per phrase as you write, and is read into text when you convert, so you never have to type what you've already written.
Virtual connections — arrows that follow
Draw an arrow from one block toward another. The arrow doesn't need to touch perfectly — if it clearly points from one block to another, Circuitry tags it as a connection. From then on, whenever you move a block, its connections re-anchor to keep touching both ends. Rearrange your sketch freely; the arrows keep up.
You don't need the arrow tool. Draw a plain straight line between two labels and it becomes a connection on its own — the line tidies itself straight and starts following both ends. No arrowhead is added, because you didn't draw one. A line only converts when it clearly runs between two different labels, so illustration strokes, hyphens and stray marks are never swept up.
Select a connection to get a round handle at each end. Drag a handle to re-connect it somewhere else; it snaps to whatever label you drop it near, and keeps a comfortable gap from the writing rather than touching it.
Convert a sketched architecture into nodes
When the sketch captures what you want, make it real. Select your blocks, labels and connections, then press To Node in the selection toolbar. Circuitry:
- Reads each handwritten label into text.
- Creates a real node for each block, keeping its label and position.
- Turns each connection into a real edge between the nodes.
- Infers the node type from the label — a block called "Send email" becomes a Msg node, one called "user database" becomes a DB node.
The whole conversion is a single step you can undo (⌘Z) to bring your sketch back exactly as it was.
When types are inferred, and when they aren't
Circuitry looks at the whole selection before typing anything. If your labels read like a system — several of them match known node types — you get typed nodes. If it reads like a plain diagram of boxes ("Process", "Step two", "Handle it"), every block becomes a neutral Flow node instead, because you're laying out a plan rather than building a workflow. A single incidental keyword in an otherwise generic diagram won't flip it.
Generic diagramming words — process, task, step, node, handle — are deliberately ignored, so they always stay Flow.
Draw the symbol, get the node
Two nodes are drawn as symbols rather than words — that's how they appear on the canvas once converted, and that's how you can sketch them.
| You draw | You get |
|---|---|
| { | Loop |
| } | Then |
Write a lone brace and you get the node whose icon you just drew. It has to be the whole label: a brace inside a longer label is left alone, so "for each {item}" is still a Loop because of the words, and a template like {{input}} is never mistaken for one.
Name the mode, get the mode
Some nodes do many things. Vision and ImgOps each have a long list of operations, so naming the operation tells Circuitry more than naming the node. Write "remove background" and you don't just get a Vision node — you get a Vision node already set to Remove Background. Write "favicon" and you get an ImgOps node set to build a favicon set.
Naming an operation always beats naming the node, so "crop image" is a Crop, not a plain Image.
Vision — reading, reasoning about, and modifying pictures:
| Mode | Words in the label |
|---|---|
| Remove Background | remove background, delete background, strip background, erase background, knock out background, cut out background, background removal, transparent background |
| Recognize Handwriting | handwriting, handwritten |
| Math → LaTeX | equation, formula, math ocr |
| Screenshot → Code | code ocr, code from image, code from screenshot |
| Recognize Text (OCR) | ocr, read text, extract text, text from image |
| Translate Text in Image | translate |
| Chart → Data | chart extract, chart data, extract chart |
| Table → JSON | table extract, extract table |
| Generate Alt Text | alt text, accessibility text |
| Describe Image | describe, description, describe image |
| Visual Q&A | visual q and a, visual q&a, ask about image |
| Extract Structured Data | extract data, extract fields, extract structured data |
| Classify (Open Labels) | classify, classification |
| Count Objects | object count, object counting — or "count the cars in the photo" |
| Tag / Keyword | auto tag, tagging, tag image |
| Content Moderation | moderate, moderation, nsfw, safe search |
| Mock → React Component | image to jsx, screenshot to jsx, image to react, screenshot to react |
| Mock → HTML | image to html, screenshot to html |
| Auto Enhance | enhance, upscale, sharpen, super resolution |
| Apply Filter | apply filter, apply a filter, photo filter |
ImgOps — deterministic image work, no AI:
| Mode | Words in the label |
|---|---|
| Canny Edges (OpenCV) | canny |
| Edge Detection | edge detect, edge detection, find edges |
| Threshold (OpenCV) | threshold, binarise, binarize |
| Find Contours (OpenCV) | contour, contours, find contours |
| Detect Shapes (OpenCV) | detect shapes, shape detection |
| Watermark | watermark |
| Favicon Set (Web) | favicon |
| App Icon Set (iOS / Android) | app icon, app icons |
| Strip Metadata | strip metadata |
| Resize | resize, rescale, scale image |
| Rotate | rotate |
| Flip | flip |
| Crop | crop |
| Convert Format | convert to webp, convert to png, convert to jpg, convert to jpeg, re-encode, webp |
An inferred mode arrives fully configured — a Resize lands with sensible dimensions rather than an empty panel — and you can change it in the node's settings like any other.
Shorthand
You don't have to write labels out in full. Common abbreviations are expanded before anything is matched, so "rm bg from img" reads as "remove background from image" and lands on the right node and mode.
| You write | It reads |
|---|---|
| img | image |
| imgs | images |
| pic | picture |
| pics | pictures |
| thumb | thumbnail |
| bg | background |
| bkg | background |
| exif | metadata |
| viz | visualization |
| tbl | table |
| qry | query |
| pg | postgres |
| kb | knowledge base |
| vec | vector |
| embed | embedding |
| embeds | embeddings |
| three.js | threejs |
| three js | threejs |
| js | javascript |
| ts | typescript |
| py | python |
| sh | shell |
| cmd | command line |
| term | terminal |
| fn | function |
| func | function |
| calc | calculate |
| xform | transform |
| req | request |
| resp | response |
| cond | condition |
| sched | schedule |
| wf | workflow |
| bot | chatbot |
| msg | message |
| notif | notification |
| dir | directory |
| dl | download |
| rm | remove |
| gen | generate |
| doc | document |
| docs | documents |
| txt | text |
| md | markdown |
Nodes that stand alone
A couple of nodes have no connection points at all. Terminal is a real shell you work in, and a Sticky Note is a comment — neither takes part in the flow of a workflow, so neither has anywhere for an arrow to land.
Circuitry won't hand you one of those with an arrow attached to it. If you drew a connection to the box, it converts to the connectable equivalent instead:
| You drew | Loose | With an arrow attached |
|---|---|---|
| terminal, shell, bash, command line, cli, console | Terminal | Code |
| sticky note, note, comment, annotation, memo, todo | Sticky Note | Text |
So a sticky note off to the side of your sketch stays a sticky note, while the same words wired into the flow become a Text node carrying that content onward. Draw whichever reads more naturally; the connection decides.
What each label becomes
Matching ignores capitalisation, and any label that matches nothing becomes a Flow node. Where a label contains two keywords, the one higher in this table wins — so "database table" is a DB node, while a bare "table" is a Sheet.
These are the node types. An operation named from the tables above always wins over anything here.
| Node | Words in the label |
|---|---|
| Vector Store | vector store, vector db, vector database, vector index, embedding, embeddings, rag, retrieval, knowledge base, semantic search |
| MCP | mcp, model context protocol, tool server |
| DB | database, db, sql, postgres, postgresql, mysql, sqlite, mongo, mongodb, supabase, snowflake, bigquery, oracle, dataset, query |
| Sheet | sheet, spreadsheet, data grid, datagrid, table, csv, excel, xlsx, grid, tabular |
| AI Agent | agent, ai agent, llm, assistant, chatbot, chat bot, gpt, copilot |
| Chat | chat, conversation, dialogue |
| Show Message | show message, display message, show result, show output |
| Msg | message, email, e-mail, notify, notification, alert, slack, discord, teams, telegram, whatsapp, twilio, sms, push notification, send message, send mail, send email |
| Webhook | webhook, web hook, incoming http, incoming request, incoming hook, http trigger, listen for |
| Timer | timer, cron, schedule, scheduled, scheduler, interval, periodic, recurring — or "every 5 minutes", "every day" |
| HTTP Request | api, rest, endpoint, url, fetch, curl, http, https, http request, web service, call api, post request, get request, put request, delete request |
| Website | website, web site, landing page, sitemap, multi-page |
| Web | web page, webpage, html, render html, browser, iframe, widget |
| ToVec | tovec, 2vec, vectorize, vectorise, trace image, trace bitmap, trace raster, raster to vector, image to vector |
| SVG | svg, vector graphic, vector graphics, illustration, line art |
| Vision | vision, ocr, read text, extract text, recognize, recognise, caption, classify, object detection, detect objects, analyse image, analyze image, describe image |
| ImgOps | imgops, resize, rescale, crop, rotate, flip, watermark, favicon, app icon, compress image, convert to webp, webp |
| Image | image, picture, photo, thumbnail, screenshot |
| Chart | chart, plot, bar chart, bar graph, line chart, line graph, pie chart, histogram, dataviz, visualize, visualise, visualization, visualisation |
| 3D Scene | 3d, 3d scene, threejs, scene, mesh, render 3d |
| Code | code, script, function, lambda, compute, transform, parse, algorithm, calculate, python, javascript, typescript |
| Terminal | terminal, shell, bash, command line, cli, console — becomes Code if an arrow is attached |
| Then | after loop, once done, once all done, when all done |
| Loop | loop, for each, foreach, iterate, iteration, repeat, map over, batch |
| Switch | switch, router, route by, route to, multi-way, n-way, dispatch by, dispatch on |
| IF | if, else, otherwise, condition, conditional, decision, branch, validate, is valid, check if — or any label ending in a question mark |
| Fork | fork, split, parallel, fan out, concurrent, concurrently |
| Join | join, merge, combine, aggregate, gather, collect result, collect results |
| Wait | wait, delay, sleep, pause, timeout, throttle |
| Call Workflow | sub-workflow, sub-flow, call workflow, invoke workflow, run workflow |
| Procedure | procedure, proc, subroutine, reusable tool, reusable step |
| Response | respond, response, reply to caller, reply to request, send response |
| pdf, print to pdf, export pdf, invoice | |
| Report | report, summary, summarise, summarize, digest, write-up, brief |
| Save | save, persist, write to disk, write to file, store to, store in, export to, output to |
| Files | folder, directory, file list, file tree, list files, each file, all files, glob |
| File Upload | file upload, upload file, upload a file, attach file, attach a file, user upload, user uploads |
| File | read file, write file, file, download, attachment, upload |
| Confirmation | confirm, confirmation, approve, approval, are you sure, yes/no, ask user |
| Form Input | form, user input, input form, fill in, fill out |
| Multiple Choice | multiple choice, choose, choice, pick one, pick an option, select option |
| SetVar | set variable, set var, setvar, assign, remember, store value, counter |
| Params | param, params, parameter, parameters, input, inputs, argument, arguments, config, configuration, settings |
| Text | text, markdown, latex, rich text, article, blog post, draft, prose |
| Sticky Note | sticky note, note, comment, annotation, memo, todo — becomes Text if an arrow is attached |
| Start | start, begin, entry point, kick off, on start |
| Timer | hourly, daily, weekly, nightly, monthly — only when the label says nothing else, so "Daily" is a Timer but "Daily report" is a Report |
Two words are left out on purpose. "then" is the commonest word in a hand-written label ("then save the file"), so it never outranks the node you actually drew. And a bare "file" loses to "upload a file", which is a node that asks the person running the workflow to pick one.
Changing a node's type after conversion
Nothing about the inference is final. Select any node that came out as a neutral Flow node and press Convert to in the selection toolbar — search for the type you want and pick it. The node keeps its label, its position, and every edge already attached to it.
Nodes that were given a real type work the same way, from the right-click menu. So if "query the API" came out as a DB node when you meant an HTTP Request, right-click it and change it — you don't have to redraw anything.
Tip: if you'd rather type everything yourself, sketch with generic labels. A diagram of "Step one, Step two, Step three" converts to plain Flow nodes, and you convert each one by hand.
Related
- The Smart Whiteboard — the full think / plan / direct / communicate picture
- Vector Graphics & Drawing
- Workflows Overview
- iPad Gestures & Touch Controls