Mithradevi T
Config Makeathon 2026 — Case Study

How Dotlet was built,
what broke, and what changed.

A full account of building a vector creation tool — from the first idea to the final submission. Including the errors, the features that didn't make it, and what was learned along the way.

Try Dotlet live
What Dotlet is
01

Dotlet is a browser-based vector creation tool. You place dots on a grid, they merge into smooth organic shapes in real time, and you export a clean SVG or PNG. No pen tool. No anchor points. No prior experience needed.

It was built for anyone who has ever had a clear idea for an icon, a logo, or a symbol — and then opened a design tool and immediately felt out of their depth. The gooey filter engine is the heart of it: an SVG feGaussianBlur and feColorMatrix pipeline that turns separate overlapping dots into one continuous organic shape, automatically, in real time.

The Problem
02

Most vector design tools were built for people who already know how to design.

The pen tool, bezier curves, anchor points, node editing — these are skills that take weeks to learn before you can make something that looks intentional. That learning curve quietly keeps a lot of people out. Not because they don't have ideas. Because the tool asks for technical knowledge before it lets you be creative.

Students
Building a first portfolio with no design background and no budget for a designer
Small business owners
Who need a simple logo but can't justify paying an agency for something quick
Community organisers
Who want a symbol to represent a cause, with limited time and no training
Self-taught designers
Who have the visual sense but haven't yet learned a vector tool's interface

None of these people are missing creativity. They're missing a tool that meets them where they are. Dotlet was built to be that tool.

Ideation and Concept Exploration
03
Figma Agent

Before any spec was written, the Figma design agent was used to explore what this tool could feel like.

Layout testing

Side panel vs floating controls were compared visually. The floating palette direction was chosen — the canvas stays clear, controls appear when needed.

Branding exploration

Name, color direction, and visual identity were all explored at this stage using the Figma agent — ahead of any code. The sticker-sheet color theme (blue #4A7FD4, soft sky background) came from extracting a reference image at this point.

Learning: doing this before locking a requirements document meant the FRD was grounded in layout decisions that had already been visually tested — not made in the abstract.

The FRD — Before a Single Line of Code
04

Writing a full Functional Requirements Document before opening Figma Make was the single decision that made everything else go more smoothly.

Why the FRD mattered

Most AI-assisted builds start with a vague prompt and iterate until something looks right. The FRD forced the opposite: define what the tool is, what it does, how it behaves, and what it will never do — before writing any code. Every Figma Make prompt that followed was specific because the spec was specific. The tool built what was actually meant, not what was accidentally implied.

Where it started — and what changed

The FRD began as an adaptation of an existing reference project — "Gooey Icon Builder." The project was renamed twice (Dottles, then Dotlet), and almost every concept in the original spec was reconsidered before being rewritten or replaced.

The scope was widened deliberately: from "icon tool" to "icons, logos, custom shapes, symbols, and decorative marks — anything that would otherwise require a path editor." The grid expanded from 3 presets to 5. The shape palette doubled from 4 types to 8. The entire vocabulary was replaced so that every term in the spec, the UI labels, and the code matched — no ambiguity between what the FRD said and what Figma Make built.

The out-of-scope list as product reasoning

Most specs list what to build. This one also listed what not to build — and crucially, why. Every exclusion was written with a reason tied to the product's core premise. That reasoning became the test for every new feature idea that came up during the build.

Freeform path / bezier editing

Reintroduces the exact precision barrier the product exists to remove. If users need a pen tool, they already have a pen tool.

AI-generated shape input

Conflicts with a hands-on, skill-free creation model. The tool should respond to what the user places, not generate for them.

Raster image import

Outside the defined vector-first workflow. Dotlet creates from scratch — it doesn't convert or embed.

Animation / motion export

Dotlet is a static vector tool. Motion would require a second rendering pipeline with no connection to the gooey filter engine.

!

Governing principle — the product must not reintroduce a technical skill requirement at any stage of the workflow. This rule was written in the FRD before any code was written. It was used again when the Font Builder was evaluated — and it's why the Font Builder was eventually cut.

Prompt Engineering — Spec to Build
05
Figma Make

The FRD needed to become prompts that Figma Make could act on precisely. This step had its own learning curve.

!

First mistake — vague prompts produced inconsistent output

CausePrompts like "make the canvas feel like Figma" gave too much room to interpret. Output didn't match intent.
FixRewrote prompts to include exact values — formulas, pixel dimensions, layer naming conventions. Removed all descriptive language.
LearnThat single change measurably reduced the number of correction rounds per feature. Precision in specification produces precision in output.

"Use less credits" appeared repeatedly throughout the build. Short, targeted prompts for isolated changes became the working habit — one feature at a time, not one giant request.

Approach that worked

A reverse-engineered Figma Make output was used to match the expected prompt structure exactly. The FRD was translated into directives specifying exact values — corner radius ratios, exponential curve formulas, SVG namespace declarations — not descriptions of feel.

Building Dotlet
06
Tech stack — what was actually used and why
FM
Figma Make
The entire application was built through Figma Make — not scaffolded locally then imported. Every feature was implemented as a structured, isolated prompt. The build stayed inside Make from first line to final export.
FA
Figma Agent
Used alongside Make for ongoing ideation — testing layout variations, checking design decisions, and exploring directions without using Make credits for non-code questions.
TS
React + TypeScript
The default Figma Make project base. TypeScript was meaningful here — the dot data model, cluster IDs, tool types, and history stack all benefited from strict typing. Type errors caught real issues early, particularly around the per-dot color override added midway through the build.
VT
Vite + Tailwind CSS
Vite's fast HMR made iterative canvas work practical — changes to dot geometry, filter values, and export logic reflected instantly. Tailwind was used for all UI layout and palette styling.
Web Audio API — custom sound engine
No external sound library. The entire audio system was written from scratch using the browser's native Web Audio API. Each sound is a purpose-built synthesis: the draw sound is pink noise filtered through a bandpass to sit in the frequency range of graphite on paper; the eraser is a short sine-wave squeak; the save chime is a three-note C5–E5–G5 arpeggio with a long natural decay. Volume was tuned down after the first pass was too intrusive. Mute state persists via localStorage so the preference survives page refreshes.
SVG
SVG filters + Canvas API
The gooey filter engine runs entirely as SVG — feGaussianBlur and feColorMatrix applied live in the browser with no canvas rasterization during drawing. The Canvas API is only used at export time to rasterize the SVG into a high-resolution PNG.

Features were built incrementally — each as its own scoped prompt rather than one large request. Click any stage to expand it.

The Export Pipeline — 5 Real Errors
07
Figma Make
SVG filters
Canvas API

The export pipeline was the most error-prone part of the build. Each problem was different — click to see the cause and fix.

Cross-cutting pattern: every export error was code that worked correctly in the live canvas context making different assumptions in the export context. The fix was always: stop duplicating logic, make export reuse the same source of truth as the canvas.

Product decision: the Crisp/Gooey toggle was removed

Exports now always capture exactly what is on the canvas — current Spread, Crispness, and Outline settings. If sliders are at zero, export is naturally crisp. One code path, one source of truth.

SVG for Figma — a third export path

Figma's SVG importer ignores filter elements — a known Figma limitation. Workaround: render to PNG via the same canvas pipeline, encode as base64, embed in an SVG wrapper. The file has a .svg extension but the artwork is raster — Figma imports it and sees the correct gooey shape.

Built, Then Removed
08

Two features were implemented and then cut — deliberately, and for different reasons.

Font Builder + vector tracing
Removed

A marching-squares + Catmull-Rom bezier tracing pipeline was built to convert the rendered gooey shape into real editable vector paths. A Font Builder mode was designed on top — draw each letter on the dot grid, export as a working .ttf font via opentype.js. The tracing worked in principle. The Font Builder did not reach a working state in the available time.

Shipping a partially working feature would have been dishonest about what Dotlet actually does
Removed cleanly from the app and from all documentation
The vector-tracing concept remains documented as a future direction — not a current claim
Supabase accounts and file storage
Removed

A full account system was designed and partially built — email OTP sign-in, canvas save and load, a file manager with per-file thumbnails. During implementation, real configuration problems appeared.

Email flow defaulted to a magic link instead of a 6-digit code — Supabase Site URL was set to localhost:3000 (placeholder), so clicking the link produced "This site can't be reached"
The app hadn't been published yet so there was no stable redirect URL
More fundamentally: adding a login requirement worked against the core premise — that anyone can open Dotlet in a browser and start creating with nothing in the way
Removed to enable publishing to the Figma Community without a backend dependency
Asset Production with Figma Weave
09
Figma Weave
Google Imagen 4
Kling 3
Ideogram V2

Figma Weave was used to generate the visual assets for the submission — keeping the creative workflow inside one platform.

1

Thumbnail — first attempt failed

The model hallucinated a fake design tool UI with nonsense text. Lesson: never ask an image model to render text or UI. Fix: described pure abstract visuals only ("organic blue blobs, no text, no UI") and added all text manually in Figma Design afterward.

2

Pixel art sun character

Generated with Google Imagen 4. Then animated with Kling 3 — subtle sun ray rotation, flowers swaying, clouds drifting. Iterated motion prompts to add a pixel art dinosaur running through the field as the primary motion subject.

3

Halftone dot art icon set

16 icons in a 4×4 grid, Ben-Day dot style on mint green. Generated with Ideogram V2. Animated with Kling 3 using a breathing/pulse motion — each icon gently expanding and contracting in staggered timing.

4

1-bit Mac OS bitmap portrait style

Explored as a visual direction — black and white only, checkerboard dithering, early Macintosh aesthetic.

5

Submission video assets

All promotional video elements assembled from the Weave workflow output — keeping Make (build), Weave (assets), and the design agent (ideation) as three distinct Figma tools in one submission.

Closing Reflection
10
What this build taught

Every stage that went well had one thing in common: the intent was made specific before the AI was asked to act on it. The FRD, the scope decisions, the precise build prompts — each of these worked because they removed interpretation before it could happen.

Every stage that hit problems had the opposite in common: something left vague, something assumed, something that worked in one context (the live canvas) and was copied rather than shared into another context (the export pipeline).

The two features that were removed — the Font Builder and the account system — both reflect the same instinct that shaped the product itself. It is better to do one thing well and honestly than to do more and deliver less of it.

Dotlet does one thing: it lets anyone make a vector graphic without needing to know what a bezier curve is. That part works. Everything else can come later.