<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ajito Nelson Lucio da Costa</title>
    <description>The latest articles on DEV Community by Ajito Nelson Lucio da Costa (@ajitonelson).</description>
    <link>https://dev.to/ajitonelson</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3331976%2F36ac0a48-9f33-4f95-95d2-ecc6e604f98d.png</url>
      <title>DEV Community: Ajito Nelson Lucio da Costa</title>
      <link>https://dev.to/ajitonelson</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajitonelson"/>
    <language>en</language>
    <item>
      <title>I shipped an AI cartoon generator from Timor-Leste in 2 weeks — here's how</title>
      <dc:creator>Ajito Nelson Lucio da Costa</dc:creator>
      <pubDate>Thu, 18 Jun 2026 02:59:44 +0000</pubDate>
      <link>https://dev.to/ajitonelson/i-shipped-an-ai-cartoon-generator-from-timor-leste-in-2-weeks-heres-how-1lec</link>
      <guid>https://dev.to/ajitonelson/i-shipped-an-ai-cartoon-generator-from-timor-leste-in-2-weeks-heres-how-1lec</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — I built &lt;strong&gt;&lt;a href="https://www.furaktoon.fun/" rel="noopener noreferrer"&gt;FurakToon&lt;/a&gt;&lt;/strong&gt;, an AI app that&lt;br&gt;
turns a sentence into a beautiful anime or cartoon image in seconds. It speaks&lt;br&gt;
&lt;strong&gt;21 languages&lt;/strong&gt; with a Southeast-Asia focus, has a monthly free-credit system,&lt;br&gt;
and was built in ~2 weeks for the Mind the Product &lt;strong&gt;"Everyone Ships Now"&lt;/strong&gt;&lt;br&gt;
hackathon. This is the build-in-public story.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;I'm building from &lt;strong&gt;Timor-Leste&lt;/strong&gt; 🇹🇱. &lt;em&gt;Furak&lt;/em&gt; means "beautiful" in &lt;strong&gt;Tetum&lt;/strong&gt;, our&lt;br&gt;
language — so the app is &lt;strong&gt;FurakToon&lt;/strong&gt;: &lt;em&gt;beautiful cartoons&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That one constraint shaped the whole product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F88d7gw4cdhzfl24lmpmw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F88d7gw4cdhzfl24lmpmw.png" alt="Home Page" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🖌️ &lt;strong&gt;Type → pick a style → generate.&lt;/strong&gt; Anime or cartoon, 1024×1024, in seconds.&lt;/li&gt;
&lt;li&gt;🧑‍🎨 &lt;strong&gt;Reference faces.&lt;/strong&gt; Upload a photo and the model redraws &lt;em&gt;that person&lt;/em&gt; in
your scene — great for "make me an anime character."&lt;/li&gt;
&lt;li&gt;✨ &lt;strong&gt;AI prompt enhancement.&lt;/strong&gt; One click rewrites your rough idea into a rich
prompt (Llama 3.3 70B).&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;Two-layer safety.&lt;/strong&gt; Every prompt is moderated before anything is generated.&lt;/li&gt;
&lt;li&gt;🪙 &lt;strong&gt;Credits.&lt;/strong&gt; 10 free per month — 1 per image, 2 when you use a reference.&lt;/li&gt;
&lt;li&gt;🖼️ &lt;strong&gt;Personal gallery&lt;/strong&gt;, 🌗 &lt;strong&gt;dark mode by default&lt;/strong&gt;, and &lt;strong&gt;21 languages&lt;/strong&gt;
(Tetum, Indonesian, Malay, Tagalog, Thai, Vietnamese… + RTL Arabic).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr0anl3t8zsuwmmunck6o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr0anl3t8zsuwmmunck6o.png" alt="Create Page" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;Nothing exotic — boring tech, shipped fast:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; (App Router, React 19) + &lt;strong&gt;Tailwind CSS v4&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; — auth, Postgres, Storage, row-level security&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Together AI&lt;/strong&gt; — image models (Flux, SDXL, Gemini Flash Image) + Llama for
text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Novus.ai&lt;/strong&gt; — product analytics (the hackathon's one required piece)&lt;/li&gt;
&lt;li&gt;Built with AI-assisted development the whole way&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Three things that were harder than the AI part
&lt;/h2&gt;

&lt;p&gt;The image generation? A few API calls. The &lt;em&gt;product&lt;/em&gt; around it is where the real&lt;br&gt;
work was.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. A credits system that can't be cheated
&lt;/h3&gt;

&lt;p&gt;"10 free images a month" sounds trivial until you think about double-spends and&lt;br&gt;
refunds. I pushed the logic into &lt;strong&gt;Postgres functions&lt;/strong&gt; so spending is atomic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- spend_credits(): refill if a new month started, then deduct only if affordable&lt;/span&gt;
&lt;span class="k"&gt;update&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;credits&lt;/span&gt;
   &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt;
 &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt;
&lt;span class="n"&gt;returning&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="k"&gt;into&lt;/span&gt; &lt;span class="n"&gt;new_bal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;-- null = not enough credits&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The monthly reset is &lt;strong&gt;lazy&lt;/strong&gt; — no cron job. The first action in a new month&lt;br&gt;
tops you back up to 10. And if generation fails &lt;em&gt;after&lt;/em&gt; charging, the credits are&lt;br&gt;
&lt;strong&gt;refunded&lt;/strong&gt; automatically. New users get their 10 via a signup trigger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgeo384u8vk5bgeaiupwo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgeo384u8vk5bgeaiupwo.png" alt="Profile Page" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 21 languages without a heavyweight library
&lt;/h3&gt;

&lt;p&gt;I rolled a tiny typed i18n layer: one dictionary per locale, English as the&lt;br&gt;
fallback, with &lt;code&gt;{placeholder}&lt;/code&gt; interpolation and &lt;code&gt;dir="rtl"&lt;/code&gt; for Arabic. The&lt;br&gt;
locale persists in &lt;code&gt;localStorage&lt;/code&gt; and resolves through &lt;code&gt;useSyncExternalStore&lt;/code&gt; so&lt;br&gt;
there's no hydration flash. Switching language is instant.&lt;/p&gt;

&lt;p&gt;The two &lt;strong&gt;Timor-Leste flag&lt;/strong&gt; pieces in the showcase strip aren't decoration —&lt;br&gt;
they're the whole point.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The "is the database awake?" problem
&lt;/h3&gt;

&lt;p&gt;I'm on Supabase's free tier, which &lt;strong&gt;pauses after ~7 days idle&lt;/strong&gt;. During judging,&lt;br&gt;
a sleeping DB = a dead demo. So I added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a small &lt;strong&gt;DB-status indicator&lt;/strong&gt; in the footer (green = connected) backed by a
&lt;code&gt;/api/health&lt;/code&gt; probe, and&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;GitHub Action&lt;/strong&gt; that pings the live site every few hours to keep it warm.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small touches, but they're the difference between "demo" and "product."&lt;/p&gt;




&lt;h2&gt;
  
  
  What shipping with Novus taught me
&lt;/h2&gt;

&lt;p&gt;The hackathon required &lt;strong&gt;Novus.ai&lt;/strong&gt;, and I expected to bolt it on and forget it.&lt;br&gt;
Instead it changed how I worked.&lt;/p&gt;

&lt;p&gt;I instrumented the real moments — &lt;code&gt;user_registered&lt;/code&gt;, &lt;code&gt;image_generated&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;image_downloaded&lt;/code&gt;, &lt;code&gt;content_moderation_blocked&lt;/code&gt;, &lt;code&gt;generation_blocked_no_credits&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;language_switched&lt;/code&gt; — and suddenly I wasn't guessing. I could &lt;em&gt;see&lt;/em&gt; where people&lt;br&gt;
dropped off.&lt;/p&gt;

&lt;p&gt;Two things genuinely surprised me:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Novus Cortex built a sitemap of my app by itself&lt;/strong&gt; — Public pages →
Protected Create flow → API routes → Gallery. It understood the architecture
from usage, not from my code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Novus opened pull requests on my repo.&lt;/strong&gt; Real, reviewable changes I could
merge — AI feedback turned into AI contribution.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's the shift: from &lt;em&gt;"I think this is good"&lt;/em&gt; to &lt;em&gt;"I can see what's working,&lt;br&gt;
and act on it."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9b4nfpn62gourx1thojk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9b4nfpn62gourx1thojk.png" alt="Novus Dashboard" width="799" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;-&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fim4qv0z6oey9q4u7sbgr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fim4qv0z6oey9q4u7sbgr.png" alt="Novus Site Map" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons for anyone shipping fast
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pick one sharp constraint.&lt;/strong&gt; "Must work in SE Asian languages" made every
decision easier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put the hard logic in the database.&lt;/strong&gt; Atomic credit spending in Postgres
beat any client-side guard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instrument from day one.&lt;/strong&gt; Analytics isn't a launch chore — it's how you
steer while building.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sweat the "is it actually live" details.&lt;/strong&gt; Keep the DB awake, test in
incognito, default to your best-looking theme.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;Live app: &lt;a href="https://www.furaktoon.fun/" rel="noopener noreferrer"&gt;furaktoon.fun&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
👉 &lt;strong&gt;Code: &lt;a href="https://github.com/ajitonelsonn/FurakToon" rel="noopener noreferrer"&gt;github.com/ajitonelsonn/FurakToon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Type an idea, pick anime or cartoon, and make something beautiful — in your&lt;br&gt;
language.&lt;/p&gt;

&lt;p&gt;Built for &lt;strong&gt;World Product Day 2026 — "Everyone Ships Now"&lt;/strong&gt; by Mind the Product&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Novus.ai. &lt;em&gt;Furak&lt;/em&gt; means "beautiful" in Tetum 🇹🇱&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  EveryoneShipsNow
&lt;/h1&gt;

</description>
      <category>ai</category>
      <category>novus</category>
      <category>webdev</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
