<?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: 王龙</title>
    <description>The latest articles on DEV Community by 王龙 (@_df88eb1337eb23b75c94ba).</description>
    <link>https://dev.to/_df88eb1337eb23b75c94ba</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%2F3546238%2F8cdf4a41-fd81-4706-984e-7ee0d2571f5c.jpg</url>
      <title>DEV Community: 王龙</title>
      <link>https://dev.to/_df88eb1337eb23b75c94ba</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_df88eb1337eb23b75c94ba"/>
    <language>en</language>
    <item>
      <title>I Built an AI Tool to Reconstruct Matcha-Filtered Images—Here’s What I Learned</title>
      <dc:creator>王龙</dc:creator>
      <pubDate>Thu, 13 Aug 2026 10:50:37 +0000</pubDate>
      <link>https://dev.to/_df88eb1337eb23b75c94ba/i-built-an-ai-tool-to-reconstruct-matcha-filtered-images-heres-what-i-learned-5ad7</link>
      <guid>https://dev.to/_df88eb1337eb23b75c94ba/i-built-an-ai-tool-to-reconstruct-matcha-filtered-images-heres-what-i-learned-5ad7</guid>
      <description>&lt;p&gt;A heavily stylized “matcha” filter can do more than shift colors toward green. It can flatten skin tones, posterize shadows, exaggerate edges, replace texture, and destroy small details.&lt;/p&gt;

&lt;p&gt;That creates an interesting product question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can generative AI turn the remaining visual structure into a natural-looking image again?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I recently built &lt;a href="https://matchafilterremover.online" rel="noopener noreferrer"&gt;Matcha Filter Remover&lt;/a&gt;, a small AI tool that explores exactly that problem. This post is a practical breakdown of what worked, what did not, and the engineering decisions that mattered most.&lt;/p&gt;

&lt;h2&gt;
  
  
  First: reconstruction is not recovery
&lt;/h2&gt;

&lt;p&gt;This was the most important product decision.&lt;/p&gt;

&lt;p&gt;When a destructive filter overwrites pixels, those original pixels are gone. No model can reliably recover the exact source photo from information that no longer exists.&lt;/p&gt;

&lt;p&gt;The tool therefore does &lt;strong&gt;AI reconstruction&lt;/strong&gt;, not original-photo recovery.&lt;/p&gt;

&lt;p&gt;That distinction appears throughout the product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The output is described as a new AI-generated interpretation.&lt;/li&gt;
&lt;li&gt;Exact identity, text, logos, hands, jewelry, and background details are not guaranteed.&lt;/li&gt;
&lt;li&gt;The before/after interface keeps the filtered input visible.&lt;/li&gt;
&lt;li&gt;The product never claims forensic restoration or access to hidden content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not only safer wording. It also sets an honest user expectation for a probabilistic system.&lt;/p&gt;

&lt;h2&gt;
  
  
  The model comparison surprised me
&lt;/h2&gt;

&lt;p&gt;I tested multiple image-editing models with different kinds of matcha-filtered inputs.&lt;/p&gt;

&lt;p&gt;The first test image was a portrait with a strong yellow-green embossed effect. The second was a tiny, low-resolution café scene with severe edge enhancement and very little reliable color information.&lt;/p&gt;

&lt;p&gt;Two models stood out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Seedream 5 Pro&lt;/strong&gt; produced cleaner color reconstruction and stronger overall photographic coherence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nano Banana Pro&lt;/strong&gt; was useful as a fallback, especially when preserving composition, but sometimes left more of the original green cast in the image.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this specific task, Seedream became the primary model and Nano Banana the fallback.&lt;/p&gt;

&lt;p&gt;The key lesson was that “best image model” is too broad a question. A model can be excellent at creative editing but weak at removing a particular destructive visual style. The evaluation set has to resemble the actual user input.&lt;/p&gt;

&lt;p&gt;I also stopped relying on an aggressive pre-classification step. In practice, matcha-filter detection produced too many uncertain or incorrect decisions. A false negative is especially frustrating because the user already knows why they uploaded the image.&lt;/p&gt;

&lt;p&gt;The current workflow instead uses a fixed, conservative reconstruction prompt and lets the image editor handle the full scene.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt design: constrain the invention
&lt;/h2&gt;

&lt;p&gt;A useful prompt for this workflow needs two opposing properties:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remove the strong artificial filter.&lt;/li&gt;
&lt;li&gt;Avoid redesigning the entire image.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The prompt emphasizes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;natural photographic color and lighting;&lt;/li&gt;
&lt;li&gt;preservation of pose, framing, subject placement, and scene structure;&lt;/li&gt;
&lt;li&gt;removal of olive/yellow-green tint, embossed edges, posterization, and false texture;&lt;/li&gt;
&lt;li&gt;realistic skin, fabric, objects, and background;&lt;/li&gt;
&lt;li&gt;no beautification, identity substitution, or unrelated additions;&lt;/li&gt;
&lt;li&gt;no claim that the result is the original photo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not eliminate hallucination, but it gives the model a much narrower job than “make this look good.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The production architecture
&lt;/h2&gt;

&lt;p&gt;The app is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16 and React 19&lt;/strong&gt; for the application;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Workers&lt;/strong&gt; for the runtime;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare D1&lt;/strong&gt; for users, credits, jobs, and payment records;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare R2&lt;/strong&gt; for temporary uploads and generated results;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Queues&lt;/strong&gt; for asynchronous reconstruction jobs;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;fal.ai&lt;/strong&gt; for image-generation models;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google OAuth&lt;/strong&gt; for account access;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe Checkout&lt;/strong&gt; for one-time credit purchases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simplified request flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser upload
  -&amp;gt; authenticated API route
  -&amp;gt; temporary R2 object
  -&amp;gt; D1 job + credit reservation
  -&amp;gt; Cloudflare Queue
  -&amp;gt; primary image model
  -&amp;gt; output safety check
  -&amp;gt; temporary R2 result
  -&amp;gt; authenticated result page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uploads and results are scheduled for deletion within 24 hours. The credit balance itself does not expire.&lt;/p&gt;

&lt;h2&gt;
  
  
  Payments were more than adding a button
&lt;/h2&gt;

&lt;p&gt;Stripe Checkout made card collection straightforward, but reliable fulfillment still required server-side work.&lt;/p&gt;

&lt;p&gt;The live payment flow validates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the Checkout Session belongs to the signed-in user;&lt;/li&gt;
&lt;li&gt;the session is in live mode;&lt;/li&gt;
&lt;li&gt;payment status is paid;&lt;/li&gt;
&lt;li&gt;currency and amount match the selected pack;&lt;/li&gt;
&lt;li&gt;the returned Stripe Price ID matches the server configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Credits are granted through an idempotent ledger entry. If Stripe retries the webhook—or the success page and webhook both request fulfillment—the same Checkout Session cannot grant credits twice.&lt;/p&gt;

&lt;p&gt;The site sells one-time packs rather than subscriptions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8 credits for $4.99&lt;/li&gt;
&lt;li&gt;20 credits for $9.99&lt;/li&gt;
&lt;li&gt;45 credits for $19.99&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Purchased credits remain available until used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safety boundaries belong in the architecture
&lt;/h2&gt;

&lt;p&gt;An image reconstruction tool can be misunderstood if its limits are vague.&lt;/p&gt;

&lt;p&gt;The product explicitly prohibits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explicit content;&lt;/li&gt;
&lt;li&gt;content involving minors;&lt;/li&gt;
&lt;li&gt;non-consensual imagery;&lt;/li&gt;
&lt;li&gt;clothing removal or “see-through” behavior;&lt;/li&gt;
&lt;li&gt;private-content reveal claims;&lt;/li&gt;
&lt;li&gt;attempts to bypass safety controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generated results pass an output safety check before being retained and displayed. A blocked or failed job returns the reserved reconstruction credit through an idempotent refund entry.&lt;/p&gt;

&lt;p&gt;The UI also requires the user to confirm that they are 18+ and own the image or have permission to use it.&lt;/p&gt;

&lt;p&gt;These decisions are not a policy-page afterthought. They affect job state, storage, credit accounting, result delivery, and copy across the entire product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do differently
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Build the evaluation set first
&lt;/h3&gt;

&lt;p&gt;I initially spent too much time tuning around individual examples. A small benchmark containing portraits, objects, indoor scenes, tiny images, text-heavy images, and multiple filter strengths would have made model selection faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Treat copy as part of system design
&lt;/h3&gt;

&lt;p&gt;Phrases such as “remove,” “restore,” and “recover” can imply very different capabilities. The final product repeatedly uses “AI reconstruction” because the system generates plausible pixels rather than retrieves missing ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Test mobile checkout early
&lt;/h3&gt;

&lt;p&gt;One responsive CSS rule accidentally hid all purchase buttons on mobile. Desktop tests passed; mobile end-to-end tests caught it before launch.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Make every credit mutation idempotent
&lt;/h3&gt;

&lt;p&gt;Generation failures, safety blocks, webhook retries, and payment redirects can all repeat. A ledger with unique idempotency keys is much safer than directly incrementing and decrementing a balance in scattered code paths.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Keep temporary media and permanent entitlements separate
&lt;/h3&gt;

&lt;p&gt;Images expire after 24 hours for privacy. Purchased credits do not expire. Mixing those concepts would create confusing product behavior and complicated data retention rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;The project is now live at &lt;a href="https://matchafilterremover.online" rel="noopener noreferrer"&gt;matchafilterremover.online&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is still an experiment in a narrow visual problem, and the output will not be perfect. But that constraint is exactly what made the build interesting: model quality, honest product language, privacy, safety, async processing, and payment integrity all had to work together.&lt;/p&gt;

&lt;p&gt;If you are building a small AI image product, my biggest recommendation is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Evaluate on the real failure cases, and design the product around what the model cannot know.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I would love to hear how other developers evaluate image-editing models or design reliable credit-based AI workflows.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>I Built a Privacy-First QR Code Generator for Print-Ready Batch Workflows</title>
      <dc:creator>王龙</dc:creator>
      <pubDate>Tue, 30 Jun 2026 16:29:07 +0000</pubDate>
      <link>https://dev.to/_df88eb1337eb23b75c94ba/i-built-a-privacy-first-qr-code-generator-for-print-ready-batch-workflows-4pp</link>
      <guid>https://dev.to/_df88eb1337eb23b75c94ba/i-built-a-privacy-first-qr-code-generator-for-print-ready-batch-workflows-4pp</guid>
      <description>&lt;p&gt;I recently built QRForge, a QR code generator focused less on tracking dashboards and more on print-ready workflows.&lt;/p&gt;

&lt;p&gt;Most QR tools I found fell into two buckets: simple one-off generators, or dynamic QR platforms that route scans through their own tracking URLs. I wanted something more boring but useful: direct static QR codes, CSV batch generation, clear previews, and export files that are ready for labels, badges, packaging, or menus.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;QRForge currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static URL QR generation without signup&lt;/li&gt;
&lt;li&gt;CSV upload for batch QR projects&lt;/li&gt;
&lt;li&gt;First-row previews before export&lt;/li&gt;
&lt;li&gt;Named PNG and SVG outputs&lt;/li&gt;
&lt;li&gt;Manifest and error report files&lt;/li&gt;
&lt;li&gt;PDF project summary&lt;/li&gt;
&lt;li&gt;ZIP delivery for print workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main idea is that a user should know what they are about to print before they generate hundreds of QR codes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why static QR codes?
&lt;/h2&gt;

&lt;p&gt;Dynamic QR codes are useful, but they also introduce a dependency: the QR provider has to keep redirecting scans forever.&lt;/p&gt;

&lt;p&gt;For printed materials, that tradeoff matters. A static QR code points directly to the destination URL. Once printed, it does not depend on my app staying online.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;p&gt;The project is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;Cloudflare Workers&lt;/li&gt;
&lt;li&gt;Stripe Checkout for one-time batch exports&lt;/li&gt;
&lt;li&gt;Server-side ZIP generation for print packs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I am still figuring out
&lt;/h2&gt;

&lt;p&gt;The biggest question is positioning.&lt;/p&gt;

&lt;p&gt;I am testing whether “Verified Print Pack” clearly communicates the value: preview the CSV, catch obvious problems, then export a print-ready bundle.&lt;/p&gt;

&lt;p&gt;I’d love feedback from builders, designers, or anyone who has had to generate QR codes for real-world print materials.&lt;/p&gt;

&lt;p&gt;Project: &lt;a href="https://qrcodegenerator.page" rel="noopener noreferrer"&gt;https://qrcodegenerator.page&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sideprojects</category>
      <category>saas</category>
      <category>webdev</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>I revived a small Mayan Tzolk'in calendar calculator and found real user demand</title>
      <dc:creator>王龙</dc:creator>
      <pubDate>Wed, 17 Jun 2026 13:54:27 +0000</pubDate>
      <link>https://dev.to/_df88eb1337eb23b75c94ba/i-revived-a-small-mayan-tzolkin-calendar-calculator-and-found-real-user-demand-i48</link>
      <guid>https://dev.to/_df88eb1337eb23b75c94ba/i-revived-a-small-mayan-tzolkin-calendar-calculator-and-found-real-user-demand-i48</guid>
      <description>&lt;p&gt;I recently revived a small niche web tool I had left untouched for months:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mayanastrologycalculator.com/utm_source=dev.to"&gt;Mayan Astrology Calculator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It converts a Gregorian birth date into a Mayan Tzolk'in calendar reading.&lt;/p&gt;

&lt;p&gt;The Tzolk'in is a 260-day sacred calendar cycle made from 20 day signs and 13 tones. The tool calculates a user's Nawal day sign, Galactic Tone, and a short reflective interpretation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I came back to it
&lt;/h2&gt;

&lt;p&gt;The project had been quiet for a while, but Google Search Console showed that people were still finding it through search.&lt;/p&gt;

&lt;p&gt;Queries like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mayan astrology calculator&lt;/li&gt;
&lt;li&gt;mayan zodiac sign calculator&lt;/li&gt;
&lt;li&gt;mayan birth chart&lt;/li&gt;
&lt;li&gt;mayan calendar calculator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;were still getting impressions and clicks.&lt;/p&gt;

&lt;p&gt;That was enough of a signal to make me revisit the project instead of abandoning it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I added
&lt;/h2&gt;

&lt;p&gt;The original version was mostly a single calculator. I expanded it into a more complete static tool site:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Mayan astrology birth date calculator&lt;/li&gt;
&lt;li&gt;A result page with Nawal and Galactic Tone interpretation&lt;/li&gt;
&lt;li&gt;Today's Mayan date&lt;/li&gt;
&lt;li&gt;A compatibility calculator&lt;/li&gt;
&lt;li&gt;A guide to the 20 Nawal day signs&lt;/li&gt;
&lt;li&gt;A guide to the 13 Galactic Tones&lt;/li&gt;
&lt;li&gt;SEO pages for related search intents&lt;/li&gt;
&lt;li&gt;A simple waitlist for deeper personalized PDF reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The site is built with Next.js and exported as a static site.&lt;/p&gt;

&lt;h2&gt;
  
  
  The interesting part: waitlist validation
&lt;/h2&gt;

&lt;p&gt;I wanted to test whether this could become more than an ad-supported content site.&lt;/p&gt;

&lt;p&gt;Instead of building payments, accounts, and PDF generation immediately, I added a lightweight waitlist CTA on the result page:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Want a deeper personalized Mayan birth chart report?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When users click it, they are invited to email us if they want early access.&lt;/p&gt;

&lt;p&gt;This is intentionally higher friction than a normal email input. If someone actually opens their email client and sends their birth date and result, that is a stronger signal than a passive signup.&lt;/p&gt;

&lt;p&gt;Within a short time, a couple of users actually emailed us with their birth dates and Mayan signatures.&lt;/p&gt;

&lt;p&gt;That changed the question from:&lt;/p&gt;

&lt;p&gt;"Is this just a fun niche calculator?"&lt;/p&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;p&gt;"Is there enough intent here to justify a paid personalized report?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I did not build payments first
&lt;/h2&gt;

&lt;p&gt;It would be tempting to add Stripe immediately.&lt;/p&gt;

&lt;p&gt;But for a niche tool, I think that would be premature.&lt;/p&gt;

&lt;p&gt;Before building a full payment flow, I want to validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do users want deeper reports?&lt;/li&gt;
&lt;li&gt;Would they pay for them?&lt;/li&gt;
&lt;li&gt;What kind of report feels valuable?&lt;/li&gt;
&lt;li&gt;Does a PDF report feel trustworthy enough?&lt;/li&gt;
&lt;li&gt;What methodology explanation is needed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the next step is manual delivery: generate a few early-access PDF reports, send them to interested users, and ask for feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credibility matters
&lt;/h2&gt;

&lt;p&gt;For a tool like this, trust is important.&lt;/p&gt;

&lt;p&gt;The calculator part is deterministic: it converts a Gregorian date into a Tzolk'in signature.&lt;/p&gt;

&lt;p&gt;The interpretation part is reflective. It is not scientific, medical, legal, or psychological advice.&lt;/p&gt;

&lt;p&gt;For the PDF reports, I am adding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A methodology section&lt;/li&gt;
&lt;li&gt;A cultural note&lt;/li&gt;
&lt;li&gt;A clear distinction between calculation and interpretation&lt;/li&gt;
&lt;li&gt;A disclaimer&lt;/li&gt;
&lt;li&gt;A sample report structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think this matters, especially when working with cultural or spiritual systems. The goal is to be useful and respectful, not to pretend to be an official authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;p&gt;The current stack is intentionally simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;Static export&lt;/li&gt;
&lt;li&gt;Cloudflare Pages&lt;/li&gt;
&lt;li&gt;Google Search Console&lt;/li&gt;
&lt;li&gt;Google Analytics&lt;/li&gt;
&lt;li&gt;Plain HTML/PDF templates for early report samples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No database yet. No payment integration yet. No account system.&lt;/p&gt;

&lt;p&gt;The project is still in the validation stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;A few takeaways from this small experiment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Old niche projects may still have search demand.&lt;/li&gt;
&lt;li&gt;Google Search Console can reveal what users actually want.&lt;/li&gt;
&lt;li&gt;A calculator can be more valuable than a blog post because the result is personal.&lt;/li&gt;
&lt;li&gt;High-friction waitlists can be useful when you want stronger intent signals.&lt;/li&gt;
&lt;li&gt;Paid product development should probably start manually before becoming automated.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Feedback welcome
&lt;/h2&gt;

&lt;p&gt;I'd love feedback on the tool and the approach:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mayanastrologycalculator.com/utm_source=dev.to"&gt;Mayan Astrology Calculator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the calculator flow clear?&lt;/li&gt;
&lt;li&gt;Does the result page feel useful?&lt;/li&gt;
&lt;li&gt;Would a paid PDF report make sense here?&lt;/li&gt;
&lt;li&gt;How would you improve trust and credibility for a niche spiritual/calendar tool?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>indiehackers</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Color-Memory Game with Next.js + Cloudflare: Making "Guess the Hue from Memory" Fun and Fair</title>
      <dc:creator>王龙</dc:creator>
      <pubDate>Tue, 09 Jun 2026 16:49:00 +0000</pubDate>
      <link>https://dev.to/_df88eb1337eb23b75c94ba/i-built-a-color-memory-game-with-nextjs-cloudflare-making-guess-the-hue-from-memory-fun-and-392k</link>
      <guid>https://dev.to/_df88eb1337eb23b75c94ba/i-built-a-color-memory-game-with-nextjs-cloudflare-making-guess-the-hue-from-memory-fun-and-392k</guid>
      <description>&lt;p&gt;Hey everyone — I'm Potter, the solo developer behind &lt;a href="https://toon-tone.net/?utm_sorce=https://dev.to/"&gt;Toon Tone&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;💡 The Pitch in One Sentence&lt;br&gt;
You are given the name of an iconic cartoon character and a specific part of them, but only a solid white block is displayed — you must drag the H/S/B (Hue, Saturation, Brightness) sliders to recreate the exact color from your memory. Five rounds, scored from 0–10 based on how close your color is to the target.&lt;/p&gt;

&lt;p&gt;🎨 Why This Exists&lt;br&gt;
We all think we perfectly "remember" pop culture colors — SpongeBob's signature yellow, Pikachu's rosy cheeks, or Mario's red cap.&lt;/p&gt;

&lt;p&gt;But the moment you lose the visual context of the character's lines and shapes, and find yourself staring at a blank color picker, you realize a shocking truth: your visual memory and the actual RGB values are separated by a massive, humbling gulf. That exact psychological gap — the "I know I know this, but I'm completely guessing right now" feeling — is where the fun of &lt;a href="https://toon-tone.net/?utm_sorce=https://dev.to/"&gt;Toon Tone&lt;/a&gt; lives.&lt;/p&gt;

&lt;p&gt;🛠️ Two Core UX and Architectural Decisions&lt;br&gt;
As a solo project, making a simple "guess the color" mechanic feel both intuitive and mathematically fair required some deep thought into the details:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;HSB Sliders Instead of RGB
In daily web development, we are used to dealing with RGB or Hex codes. However, in game design, RGB sliders are an absolute UX nightmare.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When the human brain wants to make a color "a bit more red" or "a lighter blue," we don’t naturally calculate how much to push the Red axis or subtract from the Green axis. We perceive color in a sequence: first we identify what the color is, then how vivid it is, and finally how bright it is.&lt;/p&gt;

&lt;p&gt;Because of this, I strictly went with the HSB (Hue, Saturation, Brightness) model for the sliders:&lt;/p&gt;

&lt;p&gt;Hue helps players anchor "which color" it actually is.&lt;/p&gt;

&lt;p&gt;Saturation controls the vividness and intensity.&lt;/p&gt;

&lt;p&gt;Brightness dictates the light and shadow.&lt;/p&gt;

&lt;p&gt;Player feedback has proved this right: people instinctively set the hue first, then fine-tune the saturation and brightness, perfectly mirroring how the brain extracts visual memories.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scoring System: Brutally Rigid sRGB Euclidean Distance
In color science, using a perceptually uniform algorithm like CIEDE2000 is technically more accurate to how the human eye registers different spectrums. However, during early prototype testing, complex perceptual math just ended up confusing players. People would get frustrated, saying, "I feel like these two colors look almost identical, why did the game dock so many points?"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, I made a very deliberate, hardcore engineering choice: calculating scores based strictly on standard sRGB space Euclidean distance.&lt;/p&gt;

&lt;p&gt;While it might not be a perfect representation of human biology, it brings three massive wins to the table:&lt;/p&gt;

&lt;p&gt;Brutal Fairness: There are no gray areas or hand-waving. Every unit of RGB deviation costs you points, pure and simple.&lt;/p&gt;

&lt;p&gt;High Predictability: Players learn the exact "temperament" of the scoring model within two rounds.&lt;/p&gt;

&lt;p&gt;Instant Performance: The calculation executes in roughly 0.0001ms, meaning zero rendering lag.&lt;/p&gt;

&lt;p&gt;📈 Surprises &amp;amp; Insights from the Game&lt;br&gt;
Content Cadence: I am currently keeping a rhythm of adding 1–2 new character colors every single Friday to steadily grow the pool.&lt;/p&gt;

&lt;p&gt;The Charm of "Blind Color Guessing": Because the game renders only a solid color block without any surrounding illustrations or outlines, it acts as a pure, stripped-down test of isolated visual memory.&lt;/p&gt;

&lt;p&gt;Polarized Difficulty: The hardest color to nail so far is SpongeBob's yellow (almost everyone oversaturates it and gets penalized heavily). On the flip side, the easiest to score high on is Pikachu (those two red cheeks are so deeply burned into collective human DNA that people's memory holds strong).&lt;/p&gt;

&lt;p&gt;The Decay of Memory: The biggest predictor of a high score isn't whether someone has art training — it's whether they have watched or interacted with that specific show recently. "Nostalgia memory" decays at a wildly different rate than "recent recognition memory." This has actually shifted my weekly curation strategy; I now actively look out for what old anime are getting remakes or what's trending on streaming platforms to catch players at the peak of their cultural memory.&lt;/p&gt;

&lt;p&gt;💻 The Ultra-Lean Stack (Next.js + Cloudflare Workers)&lt;br&gt;
As an indie hacker, my top priority for this project was keeping maintenance costs at zero, rendering fast, and eliminating bloat. To achieve that, I built the entire architecture around the Cloudflare ecosystem:&lt;/p&gt;

&lt;p&gt;Framework: Powered entirely by Next.js, which ensures a fantastic developer experience and clean code organization.&lt;/p&gt;

&lt;p&gt;Compute &amp;amp; Deployment: Utilizing Cloudflare's official @cloudflare/next-on-pages, the entire Next.js project is deployed directly on Cloudflare Workers, taking advantage of ultra-low latency edge nodes globally.&lt;/p&gt;

&lt;p&gt;Storage: Combined with Cloudflare KV / D1 to read and store core game configuration and data at maximum performance and near-zero cost.&lt;/p&gt;

&lt;p&gt;Thanks to Cloudflare's edge network, the site loads incredibly fast across the globe. On a standard 4G mobile connection, the initial page load clocks in at around 200ms, delivering a frictionless, instant-play experience.&lt;/p&gt;

&lt;p&gt;🎮 Test Your Own Color Memory!&lt;br&gt;
The site is fully live in English with a clean, distraction-free UI. There are no signups, no paywalls, and no installations required — a full 5-round game takes less than 3 minutes.&lt;/p&gt;

&lt;p&gt;Give it a spin here: &lt;a href="https://toon-tone.net/?utm_sorce=https://dev.to/"&gt;https://toon-tone.net/?utm_sorce=https://dev.to/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you finish a run, drop a screenshot of your scorecard in the comments, or let me know: which character's color made you completely question your own memory?&lt;/p&gt;

</description>
      <category>indiedev</category>
      <category>nextjs</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
