Automating right-to-left localization in Figma

A Figma plugin that mirrors design layouts right-to-left and translates them in one click. Built solo in 2023, still live, still maintained.

About the project

RoleFounder, Creator
YearNovember 2023
DurationOngoing
CompanyRTL Layout
IndustryLocalization, Tooling

The hundreds of hours I didn't want to spend

At Robusta, I was on a project with hundreds of screens. All in English. Then the client asked for Arabic.

If you've designed for Arabic in the MENA region, you know what that sentence actually means. Arabic reads right-to-left, so the layout can't just be translated. It has to be mirrored. Alignment flips, navigation flips, the reading order of every row reverses. And because engineers need an Arabic reference to build against, you end up shipping two of every screen: the English one, and a hand-rebuilt Arabic twin.

I did the math on doing that by hand across hundreds of screens. It was hundreds of hours of work that was almost entirely mechanical: move, flip, re-align, repeat. So I made a different call. Instead of grinding through it, I'd build the thing that made that part of the job disappear.

Why "just flip it" was the wrong mental model

The naive version of this plugin flips every layer on the canvas and calls it done. That breaks immediately.

RTL isn't a mirror. It's a set of rules that depend on what each layer is. A row of nav items flips its order. A horizontal carousel numbered 1·2·3·4 has to become 4·3·2·1, not just slide to the other edge. Some things invert, some reorder, some stay exactly where they are. Getting that right meant defining, for every layer type Figma can throw at you, what "mirroring" actually means.

I had a solid front-end background, so I could write the plugin myself. ChatGPT helped me move faster through parts of the code, before "vibe-coding" was even a phrase. But the syntax was never the hard part. The logic was.

So I started with a proof of concept and one question: does this even work in principle? It did. Then I finished the client project first, since it was my day job, which turned out to be the best thing I could have done. Those hundreds of real screens became my test corpus. Every edge case the plugin couldn't handle, I'd already hit by hand. I fed them back into the logic until the mirroring held up across cases I hadn't anticipated.

Shipping before it was perfect

One thing I couldn't fully solve: icons. Some need to flip in RTL, like a back arrow, and some don't, like a logo or a clock. The plugin had no reliable way to tell them apart, so it left them in place and let the designer make the call.

I could have held the launch until I cracked that. I didn't. A plugin that mirrors 90% perfectly and flags the rest still saves hours on every screen. Shipping it was worth more than polishing an edge case nobody was blocked on.

The moment it stopped being a side project

I launched to the Figma community and got nine users in two weeks. Nobody knew it existed.

Then I posted about it on LinkedIn and Twitter, and it took off: tens of thousands of views, a wave of design reviews. But the number that actually mattered was smaller and quieter. People bought it. It was paid from day one, because the translation ran on Google's API and that costs money, so this wasn't a free install count. It was strangers paying for something I'd built to scratch my own itch.

That surprised me. And the surprise was the signal: I'd found product-market fit.

Pricing was a design problem too

It started as a one-time payment: pay once, lifetime access. Once it was clear people would pay, I wanted to move to a subscription, which raised the real question. What is this worth?

I didn't guess. I treated pricing like any other design problem and researched it. I benchmarked comparable Figma plugins to understand the going rates and the value that justified them. Then I went to the people who'd already proven they'd pay, my lifetime buyers, and asked them to place the plugin on a scale at specific price points: too expensive, fair, a bargain, or so cheap something must be wrong. That landed me on $29/year, with team and enterprise tiers above it.

The tension I didn't see coming was what to do about those early lifetime buyers. Moving to subscriptions risked making the people who believed in it first feel like they'd been pulled off something they were promised. So I didn't move them. Every lifetime license kept its access. That decision was harder than the pricing math, and I'd make it the same way again: honor the early believers rather than squeeze them.

Where it stands

RTL Layout has 10,000+ installs and paying customers across 60+ countries, doing $1,000+ in monthly recurring revenue today. The enterprise customers, Adobe, Publicis Groupe, and HungerStation, all came inbound, off the back of the work itself. It's still live, and I still maintain it.

10k+Installs
$1k+MRR
60+Countries

An amazing community feedback

The feedback made the scale of the old pain obvious in a way my own hours never had. One person emailed me, "you are going to heaven for building this plugin," and it warmed my heart, but it also said everything: you don't write that about a convenience. You write it about a rescue. Someone else went and made a full tutorial for it, unprompted, which is the kind of thing people only do when a tool has actually earned a place in their workflow.

What I'd do differently

I'd build it in public. I only talked about RTL Layout once it was finished. I shipped the whole thing in private and then announced it. Watching how much a single LinkedIn post moved after the fact, I'm sure I left momentum on the table by not bringing people along while I was building. Next time, the building is the marketing.