# I shipped an AI cartoon generator from Timor-Leste in 2 weeks — here's how

> Source: <https://dev.to/ajitonelson/i-shipped-an-ai-cartoon-generator-from-timor-leste-in-2-weeks-heres-how-1lec>
> Published: 2026-06-18 02:59:44+00:00

TL;DR— I built, an AI app that[FurakToon]

turns a sentence into a beautiful anime or cartoon image in seconds. It speaks

21 languageswith a Southeast-Asia focus, has a monthly free-credit system,

and was built in ~2 weeks for the Mind the Product"Everyone Ships Now"

hackathon. This is the build-in-public story.

I'm building from **Timor-Leste** 🇹🇱. *Furak* means "beautiful" in **Tetum**, our

language — so the app is **FurakToon**: *beautiful cartoons*.

That one constraint shaped the whole product.

Nothing exotic — boring tech, shipped fast:

The image generation? A few API calls. The *product* around it is where the real

work was.

"10 free images a month" sounds trivial until you think about double-spends and

refunds. I pushed the logic into **Postgres functions** so spending is atomic:

```
-- spend_credits(): refill if a new month started, then deduct only if affordable
update public.credits
   set balance = balance - cost
 where user_id = uid and balance >= cost
returning balance into new_bal;   -- null = not enough credits
```

The monthly reset is **lazy** — no cron job. The first action in a new month

tops you back up to 10. And if generation fails *after* charging, the credits are

**refunded** automatically. New users get their 10 via a signup trigger.

I rolled a tiny typed i18n layer: one dictionary per locale, English as the

fallback, with `{placeholder}`

interpolation and `dir="rtl"`

for Arabic. The

locale persists in `localStorage`

and resolves through `useSyncExternalStore`

so

there's no hydration flash. Switching language is instant.

The two **Timor-Leste flag** pieces in the showcase strip aren't decoration —

they're the whole point.

I'm on Supabase's free tier, which **pauses after ~7 days idle**. During judging,

a sleeping DB = a dead demo. So I added:

`/api/health`

probe, andSmall touches, but they're the difference between "demo" and "product."

The hackathon required **Novus.ai**, and I expected to bolt it on and forget it.

Instead it changed how I worked.

I instrumented the real moments — `user_registered`

, `image_generated`

,

`image_downloaded`

, `content_moderation_blocked`

, `generation_blocked_no_credits`

,

`language_switched`

— and suddenly I wasn't guessing. I could *see* where people

dropped off.

Two things genuinely surprised me:

That's the shift: from *"I think this is good"* to *"I can see what's working,
and act on it."*

-

👉 **Live app: furaktoon.fun**

Type an idea, pick anime or cartoon, and make something beautiful — in your

language.

Built for **World Product Day 2026 — "Everyone Ships Now"** by Mind the Product

× Novus.ai. *Furak* means "beautiful" in Tetum 🇹🇱
