TL;DR — I built FurakToon, an AI app that
turns a sentence into a beautiful anime or cartoon image in seconds. It speaks
21 languages with 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.
Why I built this
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.
What it does
- 🖌️ Type → pick a style → generate. Anime or cartoon, 1024×1024, in seconds.
- 🧑🎨 Reference faces. Upload a photo and the model redraws that person in your scene — great for "make me an anime character."
- ✨ AI prompt enhancement. One click rewrites your rough idea into a rich prompt (Llama 3.3 70B).
- 🛡️ Two-layer safety. Every prompt is moderated before anything is generated.
- 🪙 Credits. 10 free per month — 1 per image, 2 when you use a reference.
- 🖼️ Personal gallery, 🌗 dark mode by default, and 21 languages (Tetum, Indonesian, Malay, Tagalog, Thai, Vietnamese… + RTL Arabic).
The stack
Nothing exotic — boring tech, shipped fast:
- Next.js 16 (App Router, React 19) + Tailwind CSS v4
- Supabase — auth, Postgres, Storage, row-level security
- Together AI — image models (Flux, SDXL, Gemini Flash Image) + Llama for text
- Novus.ai — product analytics (the hackathon's one required piece)
- Built with AI-assisted development the whole way
Three things that were harder than the AI part
The image generation? A few API calls. The product around it is where the real
work was.
1. A credits system that can't be cheated
"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.
2. 21 languages without a heavyweight library
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.
3. The "is the database awake?" problem
I'm on Supabase's free tier, which pauses after ~7 days idle. During judging,
a sleeping DB = a dead demo. So I added:
- a small DB-status indicator in the footer (green = connected) backed by a
/api/healthprobe, and - a GitHub Action that pings the live site every few hours to keep it warm.
Small touches, but they're the difference between "demo" and "product."
What shipping with Novus taught me
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:
- Novus Cortex built a sitemap of my app by itself — Public pages → Protected Create flow → API routes → Gallery. It understood the architecture from usage, not from my code.
- Novus opened pull requests on my repo. Real, reviewable changes I could merge — AI feedback turned into AI contribution.
That's the shift: from "I think this is good" to "I can see what's working,
and act on it."
-
Lessons for anyone shipping fast
- Pick one sharp constraint. "Must work in SE Asian languages" made every decision easier.
- Put the hard logic in the database. Atomic credit spending in Postgres beat any client-side guard.
- Instrument from day one. Analytics isn't a launch chore — it's how you steer while building.
- Sweat the "is it actually live" details. Keep the DB awake, test in incognito, default to your best-looking theme.
Try it
👉 Live app: furaktoon.fun
👉 Code: github.com/ajitonelsonn/FurakToon
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 🇹🇱
























