{"slug": "i-shipped-an-ai-cartoon-generator-from-timor-leste-in-2-weeks-here-s-how", "title": "I shipped an AI cartoon generator from Timor-Leste in 2 weeks — here's how", "summary": "A developer in Timor-Leste built FurakToon, an AI cartoon generator that turns sentences into anime or cartoon images in seconds, in about two weeks for the Mind the Product 'Everyone Ships Now' hackathon. The app supports 21 languages with a Southeast Asian focus, uses a monthly free-credit system with atomic spending logic in Postgres functions, and includes a lazy monthly reset and automatic refunds on failed generations. The developer also integrated Novus.ai for analytics, which revealed user behavior insights that shaped product decisions.", "body_md": "TL;DR— I built, an AI app that[FurakToon]\n\nturns a sentence into a beautiful anime or cartoon image in seconds. It speaks\n\n21 languageswith a Southeast-Asia focus, has a monthly free-credit system,\n\nand was built in ~2 weeks for the Mind the Product\"Everyone Ships Now\"\n\nhackathon. This is the build-in-public story.\n\nI'm building from **Timor-Leste** 🇹🇱. *Furak* means \"beautiful\" in **Tetum**, our\n\nlanguage — so the app is **FurakToon**: *beautiful cartoons*.\n\nThat one constraint shaped the whole product.\n\nNothing exotic — boring tech, shipped fast:\n\nThe image generation? A few API calls. The *product* around it is where the real\n\nwork was.\n\n\"10 free images a month\" sounds trivial until you think about double-spends and\n\nrefunds. I pushed the logic into **Postgres functions** so spending is atomic:\n\n```\n-- spend_credits(): refill if a new month started, then deduct only if affordable\nupdate public.credits\n   set balance = balance - cost\n where user_id = uid and balance >= cost\nreturning balance into new_bal;   -- null = not enough credits\n```\n\nThe monthly reset is **lazy** — no cron job. The first action in a new month\n\ntops you back up to 10. And if generation fails *after* charging, the credits are\n\n**refunded** automatically. New users get their 10 via a signup trigger.\n\nI rolled a tiny typed i18n layer: one dictionary per locale, English as the\n\nfallback, with `{placeholder}`\n\ninterpolation and `dir=\"rtl\"`\n\nfor Arabic. The\n\nlocale persists in `localStorage`\n\nand resolves through `useSyncExternalStore`\n\nso\n\nthere's no hydration flash. Switching language is instant.\n\nThe two **Timor-Leste flag** pieces in the showcase strip aren't decoration —\n\nthey're the whole point.\n\nI'm on Supabase's free tier, which **pauses after ~7 days idle**. During judging,\n\na sleeping DB = a dead demo. So I added:\n\n`/api/health`\n\nprobe, andSmall touches, but they're the difference between \"demo\" and \"product.\"\n\nThe hackathon required **Novus.ai**, and I expected to bolt it on and forget it.\n\nInstead it changed how I worked.\n\nI instrumented the real moments — `user_registered`\n\n, `image_generated`\n\n,\n\n`image_downloaded`\n\n, `content_moderation_blocked`\n\n, `generation_blocked_no_credits`\n\n,\n\n`language_switched`\n\n— and suddenly I wasn't guessing. I could *see* where people\n\ndropped off.\n\nTwo things genuinely surprised me:\n\nThat's the shift: from *\"I think this is good\"* to *\"I can see what's working,\nand act on it.\"*\n\n-\n\n👉 **Live app: furaktoon.fun**\n\nType an idea, pick anime or cartoon, and make something beautiful — in your\n\nlanguage.\n\nBuilt for **World Product Day 2026 — \"Everyone Ships Now\"** by Mind the Product\n\n× Novus.ai. *Furak* means \"beautiful\" in Tetum 🇹🇱", "url": "https://wpnews.pro/news/i-shipped-an-ai-cartoon-generator-from-timor-leste-in-2-weeks-here-s-how", "canonical_source": "https://dev.to/ajitonelson/i-shipped-an-ai-cartoon-generator-from-timor-leste-in-2-weeks-heres-how-1lec", "published_at": "2026-06-18 02:59:44+00:00", "updated_at": "2026-06-18 03:21:20.073264+00:00", "lang": "en", "topics": ["artificial-intelligence", "generative-ai", "developer-tools", "ai-products", "machine-learning"], "entities": ["FurakToon", "Timor-Leste", "Mind the Product", "Novus.ai", "Postgres", "Supabase", "Tetum", "World Product Day 2026"], "alternates": {"html": "https://wpnews.pro/news/i-shipped-an-ai-cartoon-generator-from-timor-leste-in-2-weeks-here-s-how", "markdown": "https://wpnews.pro/news/i-shipped-an-ai-cartoon-generator-from-timor-leste-in-2-weeks-here-s-how.md", "text": "https://wpnews.pro/news/i-shipped-an-ai-cartoon-generator-from-timor-leste-in-2-weeks-here-s-how.txt", "jsonld": "https://wpnews.pro/news/i-shipped-an-ai-cartoon-generator-from-timor-leste-in-2-weeks-here-s-how.jsonld"}}