The Context Aware
Font Editor for Figma

Role

Product Designer &
Frontend Engineer

Timeline

Jan 2026 (1 week)

Team

Self Initiated
(Waterloo Figma Campus Leader)

Skills

Product Design
Figma Plugin Dev
TypeScript
UX Research

Choosing fonts with your own text in view

Choosing a typeface in Figma meant applying fonts one at a time to see how they looked in a design. I designed and built FontContext so people could compare Google Fonts using their selected text, save options, and apply a choice without repeatedly changing the canvas. This was my own project, from observing the problem in workshops to building and publishing the plugin.

Preview, compare, and apply a typeface

1. Selection Synchronization

The plugin acts as a listener, not just a viewer. When you select a text layer on your canvas, FontContext instantly pulls that exact raw text string into the interface. This eliminates the "copy paste" tax. Your design context follows you.

The Live Preview Engine

2. The Live Preview Engine

I replaced the standard search behavior with a dual-mode engine. Toggling the "Eye" icon, the list transforms from a standard directory into a live creative stage where every font in the library renders your synced text.

3. Standardized Favoriting

Once FontContext is launched, you can scroll through the library and curate your own type foundry. Hover over any font and click the heart icon to save it, instantly adding it to your personal collection. Your saved fonts are accessible via the heart tab, which displays a live count badge showing exactly how many fonts you've curated.

4. Adaptive Workspace Layouts

Designers work in different environments. FontContext includes a responsive layout engine that toggles between Vertical (List) and Horizontal (Grid) views, ensuring longform headlines are never clipped.

The Pain Was Always There

3+ years running design workshops, judging hackathons, mentoring at Figma events. Hundreds of first-time Figma users.

Every session, the same scene: someone opens the font dropdown. A thousand names scroll by. They pick one, apply it, squint, undo. Pick another. Undo. 10-30 minutes gone.

After hundreds of these sessions, one frustration came up more than any other:

"I'm trying to envision my brand in this font. But I can't see it. I'm just guessing."

Design students. PMs making decks. Founders building their first landing page. The same struggle.

Workshop photo 1 Waterloo Velocity MVP Hacks
Workshop photo 2 Waterloo Velocity MVP Hacks
Workshop photo 3 Waterloo Velocity MVP Hacks

Validating the Observation

Mapping what designers need versus what the tool provides.

→

Recall vs Recognition

The native picker forces recall. You guess what Playfair Display looks like, apply it, then see if you're wrong. What people actually need is recognition: the ability to see their text in a font before committing to it.

I'd watched this struggle hundreds of times. But I wasn't just observing. Every time I picked a font for my own projects, I felt the same friction.

How might we create a type testing experience that is both contextual and performant, without leaving Figma?

The key shift: one field that infers intent, with the eye icon to override it, instead of separate search and preview inputs.

I Built First

I'm a designer, not an engineer. But I didn't wait for one.

↓

I had a hunch that live preview was the answer. But a hunch means nothing until you build it and feel it. The problem was, I didn't know if I could even render the fonts. So I opened VS Code that night and started small: a light mode MVP, bare bones, just to answer one question: can I render a user's text live across multiple fonts inside a Figma plugin?

The first working version loaded Google Fonts and rendered the text I typed into the preview input. It was slow and visually rough, but it answered the technical question: live text previews were possible inside the plugin.

Early MVP

A working plugin let me test loading behavior and selection changes alongside the interface.

I built the interface and integration logic myself. I used Claude Code and advice from an engineer friend when I needed help with Google Fonts inside Figma’s iframe sandbox, selection synchronization, and the plugin API.

My implementation connected selection changes, preview modes, and the plugin UI. Learning unfamiliar patterns was part of building it, rather than work I handed off.

Before shipping, an engineer friend reviewed the code with me for edge cases and implementation patterns. That feedback helped me check behavior beyond the examples I had been using during development.

What the existing tools left unresolved

Looking around while building.

→

The Two Bar Problem

A real UX challenge with three failed attempts.

↓

The core UX challenge: search and preview are different intents, but both involve typing into a field.

Font Preview fragmented this completely. I watched five people use it for the first time. All five clicked the wrong input field first. Three of them said "wait, which one do I type in?" One person tried typing in both fields to see what would happen. Another person just gave up and closed the plugin.

That's not a design opinion. That's a usability failure.

Hello World preview and search in one input

I tried fixing this three ways.

Two labeled inputs

Search on top, preview below. Same affordance, same action.

Users asked which one to type in. Ambiguous affordances. Good UI makes the next action obvious - this didn't.

Two inputs

Search left, preview dropdown right. Still two text inputs side by side.

Same confusion, different layout. Two inputs, same affordance. Still taxing mental load.

One input, eye toggle

One field. Type a font name to search; type a phrase to preview. The system infers intent.

Eye icon overrides when the guess is wrong. One input, two modes, zero extra choices.

Of the three options, the third made the most sense: one field that syncs whether you type a font name or a phrase to preview.

For the icon in the input I debated between a pencil and an eye. Pencil would mean "edit," but I wasn't building an editor; I was building a previewer. Eye means "visibility," "show/hide." That's exactly what preview mode does. It's the same icon Figma uses in the layers panel, the same icon Photoshop uses for layer visibility. Users already know what it means. Pattern matching.

Eye won.

I tested the final version with four people. Nobody asked how it worked. They just typed and it did what they expected.

Who This Is Actually For

Not just designers. Anyone who touches text in Figma.

↓

I initially thought I was building for workshop students, beginners who didn't know font names yet, people early in their design journey.

Then I tested with twelve people across different skill levels.

Junior Designers (4 people)

Didn't know what fonts existed. They needed to browse, discover, see options rendered. Recognition over recall was everything - they couldn't remember what fonts looked like because they'd never used them before.

"I'm trying to envision my brand in this font, but I can't see it. So I'm just guessing."

Mid-level Designers (4 people)

Already had favorites. They wanted to search fast, curate a personal library, build their own type foundry over time.

"I usually know which fonts I want. But I still have to scroll through Figma's list to find them. This feels... less risky. I can just browse."

Engineers (2 people)

Were updating UI copy. Didn't care about typography theory. Just needed to pick something decent and ship.

"I don't care about typography. I just need something that doesn't look terrible so I can move on."

PMs & Founders (2 people)

Surprised me most. Just needed a font that doesn't look terrible in thirty minutes. No desire to become typography experts.

"I have thirty minutes. I just need a font that doesn't look terrible. I don't want to become a typography expert."

That reframed everything.

Different experience levels, one comparison task

Beginners needed help discovering fonts. Experienced designers wanted to explore beyond their usual choices, while engineers and founders wanted a quick way to find a suitable option.

That range of needs supported a shared preview workflow, with search and favorites available for people who already knew what they wanted.

Keep the scope on choosing a font

Testing with people in different roles clarified the shared task: compare typefaces using their own text, then apply a choice. I had started adding weight, spacing, and style controls, but Figma already handles those after a font is selected. I kept FontContext focused on discovery and preview.

That also meant cutting a partly built code-export feature. A Google Fonts URL and CSS snippet could help developers, but they did not improve the core selection task. This boundary kept the interface focused on the font list, preview, and favorites.

Making browsing feel predictable

With the input resolved and the scope narrowed, I refined the actions around the font list. The list remained the main content, with search and preview above it, favorites at the right edge, and preferences kept secondary.

Separate previewing from saving

With hearts on the left, people sometimes selected a font when they meant to save it. I moved the hearts to the right edge so saving and previewing had distinct targets. I also made the favorites count update immediately; the delayed count had led people to click again because they weren't sure the first click registered.

Keep the font name available in preview mode

Replacing font names with the selected text made comparison easier, but hid the name of each typeface. I added a name annotation above the hovered row, where it would not cover the next option. After trying 100ms and 200ms delays, I settled on 120ms to balance quick access with accidental triggers while scrolling.

Support the text and workspace people already use

A long wedding-invitation headline exposed the limits of the compact list. I added a wider card layout for reading longer samples while keeping the list available for browsing more fonts at once. Theme detection followed Figma's light or dark setting so the plugin fit the surrounding workspace.

Make the preview keep up with scrolling

Those interactions depended on fonts loading reliably. Loading the full library upfront used too much memory. Loading each font only as it appeared reduced that cost, but rapid scrolling created bursts of requests and rate limits.

I switched to virtual scrolling, rendering only the visible rows and a small buffer. Fonts load from the CDN before entering the viewport and are cached in the browser. This let me keep the live preview without loading the entire library at launch.

A shipped plugin used beyond the test sessions

Available on Figma Community.

I published FontContext on Figma Community. One useful sign after launch was seeing someone return to it for their own work.

Sarah, a medtech startup founder new to design, had helped me compare iterations. A few weeks after launch, I saw her using FontContext for her startup’s brandbook: browsing serifs, saving options, and building a personal library. When I asked about picking fonts, she said, "You just preview and pick." That was an example of continued use outside a test session, rather than a measure of adoption across all users.

Final UI: Dark Mode

FontContext dark mode interface

Final UI: Light Mode

FontContext light mode interface

Try FontContext

Live on Figma Community

What V1 Doesn't Have

Version one ships lean, but that means trade offs.

→

What I Took Away

Watch what happens after the test

Seeing Sarah return to FontContext for a brandbook told me something the guided sessions could not: the plugin had a place in her own workflow. I would look for that repeated use when evaluating the next version, alongside whether people can preview and apply fonts without help.

Building exposed constraints the mockup missed

I used Claude to learn unfamiliar implementation patterns, including virtual scrolling and font loading. Building the plugin exposed memory and request limits that were invisible in Figma. I still had to decide what to load, check the behavior, and refine the interaction by using it with people.

Give the plugin one clear job

Weight and spacing controls would have duplicated work Figma already supports. Keeping the plugin focused on comparing and choosing typefaces helped me decide which features to finish and which to leave out, including a partly built code-export feature.