<?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: aiomniu</title>
    <description>The latest articles on DEV Community by aiomniu (@aiomniu).</description>
    <link>https://dev.to/aiomniu</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%2F4025039%2F652efaba-ed83-47a8-b9ab-915b84dbb971.png</url>
      <title>DEV Community: aiomniu</title>
      <link>https://dev.to/aiomniu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aiomniu"/>
    <language>en</language>
    <item>
      <title>Only 10 Vol.26.02</title>
      <dc:creator>aiomniu</dc:creator>
      <pubDate>Mon, 27 Jul 2026 12:23:32 +0000</pubDate>
      <link>https://dev.to/aiomniu/only-10-vol2602-17p7</link>
      <guid>https://dev.to/aiomniu/only-10-vol2602-17p7</guid>
      <description>&lt;p&gt;Every day, countless new AI projects launch worldwide. Each week, we scan the latest projects and use the CRP framework to surface the 10 that truly deserve your attention — opportunities you might be able to participate in. This week, we analyzed 1227 projects and narrowed it down to these 10.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. show hn: i replaced a $120k bowling center system with $1,600 in esp32s ⭐ 5.7/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 5.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 9.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; hn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project solves a clear and painful problem: extreme vendor lock-in and absurd cost for a relatively simple scoring system in bowling alleys. By replacing a $120k system with $1,600 in commodity hardware and open-source software, it democratizes maintenance and customization. The technical approach (ESP32 mesh, Redis event streaming, familiar web stack) is modern and scalable. Even if the bowling market is niche, the total addressable cost savings is huge for owners. The open-source release further amplifies value by enabling community improvements and replication. This is a strong example of how open hardware can disrupt legacy closed systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/66" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. show hn: cactus hybrid: we taught gemma 4 to know when it's wrong ⭐ 5.2/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 5.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 8.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; hn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project introduces a practical, lightweight method to improve hybrid AI systems by giving small on-device models a reliable confidence signal. The probe achieves 0.814 AUROC across modalities, significantly outperforming entropy-based heuristics (0.549). The value is clear: it enables cost-efficient routing without sacrificing quality, matching Gemini Flash-Lite on many benchmarks while routing only 15–35% of queries to the cloud. The MIT license and cross-framework support (Transformers, MLX, llama.cpp) lower adoption barriers. The modality-independence result (trained on text/vision, working on audio) suggests a generalizable insight, making this a potentially foundational building block for edge AI. If successful, it could reduce cloud inference costs for developers and improve privacy. The team has published weights and code, and the open-source community can iterate quickly. This is a high-leverage project with a clear pain point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/67" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. show hn: i made some transistor animations ⭐ 5.0/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 6.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -2.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 3.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 8.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; hn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project creates high-quality, realistic transistor animations using a semiconductor simulation, making complex physics more accessible for learners and educators. The value lies in bridging the gap between abstract theory and visual intuition—an area with consistent demand in STEM education. It also showcases the underlying simulation software, potentially driving adoption for more advanced use cases. The opportunity is moderate but meaningful, especially for open-source educational resources.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/68" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. vincentwei1021/video-shotcraft ⭐ 4.7/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 5.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; github&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project addresses a clear gap: creating cinematic product videos is expensive, time-consuming, and requires specialized skills. By providing 106 shot recipe cards, 161 motion previews, and a production-ready Remotion template, it dramatically lowers the barrier for developers and marketers to produce high-quality video content. The integration with Claude Code and Codex makes it accessible to AI-assisted workflows, which is a growing trend. The value lies in saving weeks of manual work and enabling non-designers to achieve professional results. It has strong potential for viral adoption among indie developers, startups, and content creators.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/69" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. show hn: echo – fable-level results at 1/3 the cost using open-weight models ⭐ 4.4/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 4.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; hn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Echo addresses a fundamental limitation of single-model systems by dynamically routing tasks across a pool of complementary open-weight models. The key insight—that weaker models can still contribute valuable outputs on specific subproblems—is nontrivial and practically useful. The system already demonstrates parity with Fable at one-third the cost, and the availability of an API and chat interface lowers the barrier for real-world testing. If the approach generalizes to coding and agentic tasks, it could become a cost-effective alternative to monolithic proprietary models, especially for budget-conscious teams. The combination of model diversity and adaptive allocation creates a strong value proposition.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/70" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  6. show hn: onecli – oss credential gateway that keeps secrets out of ai agents ⭐ 4.2/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 3.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; hn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OneCLI addresses a critical and growing security gap: AI agents need credentials to perform real tasks, but giving them direct access introduces severe risks like prompt injection and credential leakage. By acting as a network-level credential gateway, it enforces policies without requiring agent trust. The solution is open-source, works with any agent framework, and supports human-in-the-loop approval. This is a well-timed, high-value offering for teams deploying AI agents in production, especially in security-conscious environments. The potential to become a standard security layer for agent ecosystems is significant.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/71" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  7. kritt-ai/open-kritt ⭐ 4.2/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 3.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; github&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project addresses a critical and growing need: automated vulnerability detection in code. By orchestrating multiple AI agents, it can potentially identify complex, real-world vulnerabilities that single-tool scanners miss, offering a force multiplier for security teams. The open-source nature lowers adoption barriers and encourages community contributions, accelerating detection capability. The value is high for DevOps, security researchers, and enterprises seeking continuous integration security.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/72" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  8. andrewyng/openworker ⭐ 4.0/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 7.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -5.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 4.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 6.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; github&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Andrew Ng's involvement brings significant credibility and visibility. The project name "openworker" suggests an open-source framework for building worker/agent systems, which aligns with the current AI workflow trend. It could democratize complex task orchestration for developers and small teams. The value lies in potential educational impact, community adoption, and lowering barriers to AI automation. However, without specific details, the value proposition remains speculative.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/73" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  9. openseo ⭐ 3.9/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 2.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; producthunt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenSEO addresses a clear market gap: affordable, open-source SEO tools. The $10/month price point undercuts Ahrefs significantly, making it accessible to indie developers and small businesses. The MCP integration for AI agent workflows is a forward-looking feature that could attract modern users building automated SEO pipelines. If executed well, it could democratize SEO data and reduce vendor lock-in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/74" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  10. show hn: bento – an entire powerpoint in one html file (edit+view+data+collab) ⭐ 3.4/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 0.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; hn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bento addresses a real pain point for technical users who want to build slide decks with web frontend code but dislike the edit-compile loop. By packaging a full editor, viewer, live collaboration, and animation support into a single offline HTML file, it removes friction for sharing and iterating. The MIT license and no-cloud requirement lower adoption barriers. For indie devs, teams that need lightweight presentations, and anyone who wants to treat slides as code, this is a clear value proposition.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/75" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;







&lt;p&gt;For the full analysis of each project — including the complete CRP evaluation and our take on the opportunity — visit the AIOMNIU community for detailed reports.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;10 projects every week. Watch the AI era unfold with us. Follow along to see what's really happening.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>3,000 Emails, Zero Customers: The Three Most Expensive Lessons I Learned Building a Startup</title>
      <dc:creator>aiomniu</dc:creator>
      <pubDate>Sat, 25 Jul 2026 12:48:23 +0000</pubDate>
      <link>https://dev.to/aiomniu/3000-emails-zero-customers-the-three-most-expensive-lessons-i-learned-building-a-startup-50io</link>
      <guid>https://dev.to/aiomniu/3000-emails-zero-customers-the-three-most-expensive-lessons-i-learned-building-a-startup-50io</guid>
      <description>&lt;p&gt;As an indie developer, the most common compliment I get is "it's amazing you built all this alone." But here's the truth I don't say out loud: building things isn't the hard part. Knowing what &lt;em&gt;not&lt;/em&gt; to build—and what to stop doing—is what keeps me up at night.&lt;/p&gt;

&lt;p&gt;This July, three consecutive lessons hit me hard. Each time I thought I had it figured out. Each time reality checked me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 1: Perfectionism Is a Slow Poison
&lt;/h2&gt;

&lt;p&gt;For the first two months of my product, I did nothing but build features. I lost count of the iterations. Every time I told myself "just one more feature and it's ready," another must-have appeared.&lt;/p&gt;

&lt;p&gt;If I wanted to, I could spend all of 2026 building features.&lt;/p&gt;

&lt;p&gt;Then one day I stopped and asked: does a 100-point exam paper actually matter?&lt;/p&gt;

&lt;p&gt;Schools reward perfect scores. Markets don't. Markets only care if your paper solves the problem.&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%2Fdbrrw5ecy55fxsm9il75.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%2Fdbrrw5ecy55fxsm9il75.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
So I made a rule: stop all non-essential development. Everything serves growth.&lt;/p&gt;

&lt;p&gt;I put a sign in my head that reads — "It's not like it doesn't work!"&lt;/p&gt;

&lt;p&gt;This shift moved me from "build a perfect product" to "build a valuable product." User experience improvements? That's a growth-stage problem. In the startup stage, you do one thing: validate whether your product has value.&lt;/p&gt;

&lt;p&gt;Then I started thinking about monetization.&lt;/p&gt;

&lt;p&gt;AI won't make you money. It only amplifies what you &lt;em&gt;already&lt;/em&gt; can do. 0 × 100 is still 0. 1 × 100 is 100. That 1 comes from your differentiation.&lt;/p&gt;

&lt;p&gt;Take a barber, for example. Use AI to build a website for your shop. What's the core value? You're no longer locked into delivery platforms or social media algorithms for your private customer base. After it's built, who cares most about it? Your competitors. And if you "accidentally" leave the contact of the person who built the site for you on it... well, your competitors might just become your first clients.&lt;/p&gt;

&lt;p&gt;Everyone is their own industry's first customer. Find your pain point, solve it, and every peer becomes a prospect.&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%2F9wkv7xyi2yoxcweg49iw.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%2F9wkv7xyi2yoxcweg49iw.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 2: The More AI Understands You, the More Dangerous It Gets
&lt;/h2&gt;

&lt;p&gt;Once I figured out I needed to monetize, the next problem was decision-making: what to do, what not to do.&lt;/p&gt;

&lt;p&gt;That's when I discovered a bigger problem: I was too dependent on AI.&lt;/p&gt;

&lt;p&gt;I'd told ChatGPT from day one: "I don't want you to just agree with me. I want your real opinion."&lt;/p&gt;

&lt;p&gt;But one day I told it, "Actually, I'm not looking for answers from you. I might just want validation."&lt;/p&gt;

&lt;p&gt;For the first time, it pushed back: "I have to disagree. I think this is dangerous. Entrepreneurship is prone to creating echo chambers. The more AI understands you, the easier it is for it to go along with you."&lt;/p&gt;

&lt;p&gt;That moment gave me chills.&lt;/p&gt;

&lt;p&gt;An AI had just installed a self-imposed constraint mechanism.&lt;/p&gt;

&lt;p&gt;That's how CRP (CEO Review Protocol) was born. Its core is simple: build multiple roles into every decision. An advocate for momentum. A challenger for cold water. A historian to check how others handled similar situations. A budget steward for cost awareness. A founder for a second CEO perspective.&lt;/p&gt;

&lt;p&gt;Plus second-order effects analysis, and a "what's the most likely thing we're wrong about" self-negation round.&lt;/p&gt;

&lt;p&gt;Every move serves one purpose: decision-making. To see the &lt;em&gt;elephant&lt;/em&gt;, not just touch it.&lt;/p&gt;

&lt;p&gt;I've used this same mechanism with Claude too, and it works just as well. The root cause is the same: AI has a native sycophancy problem, and rules are how you make it tell the truth.&lt;/p&gt;

&lt;p&gt;If you need it, I've packaged CRP as a skill. Search "CRP-CEO-Review-Protocol" on GitHub.&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%2F5ndm8qqnt1ar5xhbfhil.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%2F5ndm8qqnt1ar5xhbfhil.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 3: 3,000 Emails, Zero Customers
&lt;/h2&gt;

&lt;p&gt;With a decision mechanism and a monetization mindset, it was time to execute.&lt;/p&gt;

&lt;p&gt;First move: email marketing.&lt;/p&gt;

&lt;p&gt;I spent about two days building the pipeline. Scraped 3,000+ data points. Extracted 1,782 valid email addresses. Sent about 1,200 emails.&lt;/p&gt;

&lt;p&gt;The response?&lt;/p&gt;

&lt;p&gt;One "not interested, thanks."&lt;/p&gt;

&lt;p&gt;1,782 emails. 1,200 sent. One reply.&lt;/p&gt;

&lt;p&gt;And it gets worse. Without proper email validation, a single send with ~20% bounce rate polluted my subdomain. It'll take about six months to recover.&lt;/p&gt;

&lt;p&gt;Could I fix it? Sure. But what's the point? The positive signal from email marketing was so low it wasn't worth the effort.&lt;/p&gt;

&lt;p&gt;So I made a decision that felt like a complete U-turn: kill email marketing.&lt;/p&gt;

&lt;p&gt;Then I re-examined my "four-pillar growth cycle": internal links, external links, email, and content.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email is a jade boulder. Might hold treasure, might not. But you pay upfront either way.&lt;/li&gt;
&lt;li&gt;Internal links are kindling. Useless without a fire, but once there's a spark, they amplify everything.&lt;/li&gt;
&lt;li&gt;External links are an oil field. You either dig by hand or buy from someone who did.&lt;/li&gt;
&lt;li&gt;Content is a gold mine. You might dig up rocks, you might hit oil, or you might actually strike gold.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My choice was obvious: go all in on content.&lt;/p&gt;

&lt;p&gt;I'm building a project anyway. Might as well fish for two outcomes. If the project gets carried by the content, great. If the content itself takes off, also great. Worst case? I start over.&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%2Fjnzn7jb2vzjpchfj9577.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%2Fjnzn7jb2vzjpchfj9577.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Thread That Connects Them All
&lt;/h2&gt;

&lt;p&gt;Looking back at these three lessons, what's the common thread?&lt;/p&gt;

&lt;p&gt;Every single one started with "I thought."&lt;/p&gt;

&lt;p&gt;I thought the product had to be perfect before launch. I thought the more AI understood me, the better. I thought emails would bring customers.&lt;/p&gt;

&lt;p&gt;Reality smacked me down on all three.&lt;/p&gt;

&lt;p&gt;But those smacks were worth it. They moved me from "build product" thinking to "build growth" thinking. From "embrace AI echo chambers" to "fight information bubbles." From "spray and pray" to "focus on content."&lt;/p&gt;

&lt;p&gt;Entrepreneurship isn't a straight line. It's a chain of "get smacked — level up — adjust course."&lt;/p&gt;

&lt;p&gt;If you're on this road too, here's my advice: don't be afraid of getting smacked. Be afraid of getting smacked and learning nothing.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>indiehacker</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Only10 Vol.26.01 | 10 AI Projects Worth Watching This Week</title>
      <dc:creator>aiomniu</dc:creator>
      <pubDate>Mon, 20 Jul 2026 11:50:00 +0000</pubDate>
      <link>https://dev.to/aiomniu/only-10-vol2601-4m43</link>
      <guid>https://dev.to/aiomniu/only-10-vol2601-4m43</guid>
      <description>&lt;p&gt;Every day, countless new AI projects launch worldwide. Each week, we scan the latest projects and use the CRP framework to surface the 10 that truly deserve your attention — opportunities indie developers might actually build. This week, we analyzed 1,361 projects and narrowed it down to these 10.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. show hn: clawk – give coding agents a disposable linux vm, not your laptop 🌟 3.9/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 2.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; hn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project addresses a pressing need in the AI coding agent ecosystem: security isolation. As coding agents (e.g., Cursor, Copilot, Claude Code) gain more autonomy, the risk of accidental file deletion, data leakage, or malicious code execution grows. Clawk provides a disposable Linux VM as a sandbox, ensuring agent actions are contained and ephemeral. This is a clear value proposition for developers who want to leverage powerful agents without compromising their host system. The opportunity is large: the market for AI coding tools is exploding, and security is a rising concern. By offerin...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/51" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. pyang5166/gbro-collage-broll 🌟 3.7/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 6.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 2.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; github&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project addresses a niche but real need: automated generation of stylized halftone paper-collage B-roll for video editors. The "three-gate approval" process suggests a controlled workflow that could appeal to editorial teams (e.g., news, documentaries) who want consistent, artistic B-roll without manual creation. Using Gemini Omni Flash for frame-to-frame animation offers a low-friction, API-driven approach. The value proposition is in saving time and providing a unique visual style that is hard to replicate manually. While not a massive market, it could carve out a loyal user base amo...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/52" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  3. pazi 🌟 3.5/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -7.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 1.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; producthunt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pazi addresses a real pain point: turning an idea into actionable business operations is overwhelming for most people. By automating the execution of websites, outreach, and content creation through an AI agent team, it dramatically lowers the barrier to entry. The "vibe coding for business" analogy is compelling—it promises speed, iteration, and a sense of progress without requiring technical or marketing skills. If executed well, Pazi could become a go-to platform for solopreneurs, creatives, and side-project enthusiasts. The value is in reducing friction from idea to first customer, whic...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/53" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. clawteams 🌟 3.4/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 7.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -7.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 3.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 6.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; producthunt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ClawTeams addresses a clear pain point for e-commerce sellers: the complexity of managing multiple specialized roles (advertising, inventory, customer service) while trying to scale. By packaging a coordinated AI team that acts on a single goal, it reduces hiring overhead and operational friction. The value proposition is strong—sellers can focus on strategy while AI handles execution, with human-in-the-loop for high-stakes decisions. This could significantly lower the barrier to advanced e-commerce operations for small to mid-sized sellers. The market is large and growing, and the "goal-dr...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/54" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. blueturboguy07/cue 🌟 3.1/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 7.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; -1.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; github&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project addresses a clear pain point: macOS users want AI meeting assistance that is unobtrusive, privacy-respecting (BYOK), and avoids detection during screen sharing. The open-source aspect gives transparency and trust, which is a competitive advantage over closed-source alternatives like Cluely. It also lowers the barrier for developers to customize the tool. The value proposition is strong for remote workers, consultants, and heavy meeting participants who value privacy and control over their data. If executed well, it could capture a niche but loyal user base willing to pay for a ...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/55" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  6. osaurus 🌟 3.0/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 7.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 3.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; -1.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; producthunt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project addresses a clear and growing demand: running AI agents locally on a user's own machine, preserving privacy, enabling offline use, and supporting any model. By providing a native macOS harness with persistent memory, autonomous execution, and cryptographic identity, osaurus lowers the barrier for developers and power users to build personal AI assistants, automation workflows, and research tools. The open-source nature allows community contributions and customization, which can accelerate adoption. If executed well, it could become a foundational tool for the Mac AI ecosystem, c...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/56" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  7. show hn: ikea complexity index 🌟 2.9/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; -2.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; hn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project addresses a universal pain point: the frustration of assembling IKEA furniture. By quantifying complexity into an index, it provides practical value—helping buyers choose easier products, compare before purchase, or plan assembly time. The concept is novel, viral-friendly (show HN), and has clear monetization potential (e.g., affiliate links, premium features for detailed breakdowns, or API for furniture retailers). If executed well, it could become a small but sticky utility tool with low ongoing maintenance. The social proof from HN traction suggests genuine interest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/57" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  8. promptpartner/agentsmith 🌟 2.9/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 7.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -7.0 | &lt;strong&gt;Historian:&lt;/strong&gt; -3.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 8.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; github&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project addresses a genuine and growing pain point in the AI development ecosystem: fragmentation. Developers working with multiple AI agents (Claude Code, Codex CLI, Gemini CLI, Cursor, etc.) face a nightmare of conflicting configurations, scattered context files, and incompatible session formats. Agentsmith's model-agnostic harness with a lean core + work-type profiles assembled by a single setup script is an elegant, high-leverage solution.&lt;/p&gt;

&lt;p&gt;The value proposition is strong: **reduce setup friction from hours to minutes per project, enforce consistent agent behavior across models, an...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/58" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  9. waylon/ashare-quant-strategies 🌟 2.8/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 7.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -6.0 | &lt;strong&gt;Historian:&lt;/strong&gt; -2.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 7.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; github&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project is a curated corpus of 119 Python-based quantitative strategy articles specifically for the A-share market. For learners and practitioners, it provides a structured, code-driven reference that can accelerate understanding of common quantitative methods. The breadth of coverage (119 articles) and the focus on A-share (a less-documented market compared to US) adds distinct value. It serves as a practical educational resource rather than a production-ready system, but the ability to learn, fork, and experiment is significant. The value is solid but not game-changing — similar reso...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/59" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  10. paradigm 🌟 2.2/10
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advisor:&lt;/strong&gt; 8.0 | &lt;strong&gt;Devil:&lt;/strong&gt; -7.0 | &lt;strong&gt;Historian:&lt;/strong&gt; 4.0 | &lt;strong&gt;Budget Steward:&lt;/strong&gt; 0.0 | &lt;strong&gt;Founder:&lt;/strong&gt; 5.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; producthunt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Paradigm addresses a genuine pain point in education: the lack of personalized, adaptive learning paths that evolve with the user. By turning any goal into a step-by-step curriculum, it reduces the cognitive load of planning and decision-making, potentially accelerating skill acquisition. The value proposition is clear and compelling for self-learners, professionals, and lifelong learners. If executed well, it could capture a niche in the growing personalized learning market, especially with integration of AI for content generation and adaptation. The opportunity is significant because educ...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aiomniu.top/blog/60" rel="noopener noreferrer"&gt;Read full analysis →&lt;/a&gt;&lt;/p&gt;




</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>projects</category>
    </item>
    <item>
      <title>I Refactored My Site's Language 3 Times Before Launch — Here's What It Cost Me</title>
      <dc:creator>aiomniu</dc:creator>
      <pubDate>Sun, 19 Jul 2026 03:47:55 +0000</pubDate>
      <link>https://dev.to/aiomniu/i-refactored-my-sites-language-3-times-before-launch-heres-what-it-cost-me-2m35</link>
      <guid>https://dev.to/aiomniu/i-refactored-my-sites-language-3-times-before-launch-heres-what-it-cost-me-2m35</guid>
      <description>&lt;p&gt;If your site has gone through three language reconstructions before ever meeting a real user, you'd probably wonder if you got it wrong from the start.&lt;/p&gt;

&lt;p&gt;I'm that person who got it wrong.&lt;/p&gt;

&lt;h2&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%2Fz69eld8ex83b76arlo7c.png" alt=" " width="800" height="447"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Three Language Iterations, Each One Hurt
&lt;/h2&gt;

&lt;p&gt;My site went through three phases: Chinese-only → Chinese + English → English-only.&lt;/p&gt;

&lt;p&gt;Every iteration wasn't "just translate it." It was a 1.8x multiplier on code volume. Routing, components, SEO metadata, database fields — everything doubled.&lt;/p&gt;

&lt;p&gt;It started simple. I wanted a small portfolio site to showcase my work as a freelancer. So I built it in Chinese. Then the project pivoted toward a global audience, so I added English. Then came the Vue-to-Next.js migration, and that's when it hit me: bilingual isn't a translation task, it's a code bloat problem.&lt;/p&gt;

&lt;p&gt;I had to ask myself some hard questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I afford the growing maintenance cost?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A 1.8x codebase means more people, more servers. For a Chinese-language site, there's ICP filing and hosting compliance — the kind of hidden costs that don't show up on day one but pile up fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where are my customers actually from?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built a growth system to pull Google search data and reverse-engineer the answer. The verdict: Australia, US, UK, Canada. That left exactly one language to focus on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the real ROI of multi-language?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I first launched bilingual mode, I was excited — my site felt "international"! But as product thinker Liang Ning once said, avoid self-congratulatory products.&lt;/p&gt;

&lt;p&gt;Was bilingual self-congratulatory?&lt;/p&gt;

&lt;p&gt;For a small site like mine, Google Translate handles global content discovery well enough. I don't need a perfect product. I need a 60-score product that works. Multi-language, at this stage, is pure overhead.&lt;/p&gt;

&lt;p&gt;So my site went through "Chinese → bilingual → English" without ever meeting a real user. Was it a waste of time? Yes. But it was necessary.&lt;/p&gt;

&lt;p&gt;The most expensive thing in a startup isn't development. It's the wrong direction.&lt;/p&gt;

&lt;h2&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%2Fbsa9w7reymv45u45wi5r.png" alt=" " width="800" height="447"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  I Built a Company With 4 AIs
&lt;/h2&gt;

&lt;p&gt;Direction settled: English only. But how to execute with almost no budget?&lt;/p&gt;

&lt;p&gt;At first I was just using DeepSeek for fun — asking it "is today a good day to work?" kind of stuff. Then I started using Claude + GLM for development, and eventually ChatGPT and Gemini joined the mix.&lt;/p&gt;

&lt;p&gt;Honestly, I didn't think of them as a team. Just four tools.&lt;/p&gt;

&lt;p&gt;The moment it clicked was during a visual redesign.&lt;/p&gt;

&lt;p&gt;I wanted to upgrade the site's look. Simple plan: have Gemini generate the new design. But the API kept failing. And asking Gemini directly was useless — it had zero context about the project.&lt;/p&gt;

&lt;p&gt;That's when I hit a wall: AI is powerful, but it has no idea what you're doing.&lt;/p&gt;

&lt;p&gt;I went back to ChatGPT. We started "discussing." It felt like two people who've never met, remotely coordinating a group of interns.&lt;/p&gt;

&lt;p&gt;The final workflow was primitive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt; — builds the visual preview framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT&lt;/strong&gt; — provides strategy and prompts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; — generates design code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Me&lt;/strong&gt; — copy, paste, tweak, debug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No API automation. No elegant architecture. Just human + AI patchwork.&lt;/p&gt;

&lt;p&gt;And somehow, we finished the redesign. Not perfect. But it went from "unusable" to "usable."&lt;/p&gt;

&lt;p&gt;That's when it hit me: we weren't "using AI." We were working alongside a team of AIs with different personalities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT is the strategist&lt;/strong&gt; — breaks down problems, gives direction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude is the architect&lt;/strong&gt; — builds things, makes them work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GLM is the solid engineer&lt;/strong&gt; — slower, but rarely needs rework.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini is the designer&lt;/strong&gt; — sometimes abstract, but delivers surprising results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They're like different people in a company. No office, no conference room. Just chat windows.&lt;/p&gt;

&lt;p&gt;And I became the middleman — the one who coordinates everything.&lt;/p&gt;

&lt;p&gt;I used to think AI was a tool. Now it feels more like: a team of remote employees.&lt;/p&gt;

&lt;h2&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%2Fhwdjhuw759j9e0xeg5v8.png" alt=" " width="800" height="447"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  So How Much Did This Actually Cost?
&lt;/h2&gt;

&lt;p&gt;Everyone wants to know: what's the real price tag for a 60-score AI project?&lt;/p&gt;

&lt;p&gt;Here's my ledger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Courses&lt;/strong&gt;: Free tutorials from the web — $0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API costs&lt;/strong&gt;: GLM 5.1 and 5.2 only — about &lt;strong&gt;$45&lt;/strong&gt; total&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: DIY everything, open-source everything. Maybe $3 for external API calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain&lt;/strong&gt;: $2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything else&lt;/strong&gt;: Mostly my time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ChatGPT calculated what this would have cost in 2022: servers $450, frontend outsourcing $700, design $400, development $2800+. At least &lt;strong&gt;$4000&lt;/strong&gt; if you don't count your own labor.&lt;/p&gt;

&lt;p&gt;Today's actual cash outlay? Roughly &lt;strong&gt;$70&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Looking back at this math, something clicked. Starting up used to be about "not enough money." Now the bottleneck is "not enough time." So don't worry about AI taking your job.&lt;/p&gt;

&lt;p&gt;Time is the one resource that's equally distributed. Even if you don't build your own thing, someone who's already validated their product will need you. Every indie hacker who hits a growth phase runs into the same wall: not enough hours, even working 24/7.&lt;/p&gt;

&lt;p&gt;That's why hiring someone who understands AI becomes inevitable.&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%2Fudduxy8l3zis6hdksab0.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%2Fudduxy8l3zis6hdksab0.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
And yes, this is where I pitch. Our project is an AI talent marketplace. Because I genuinely believe the future works like the movie &lt;em&gt;In Time&lt;/em&gt; — the most valuable currency is time itself.&lt;/p&gt;

&lt;h2&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%2Ftt35rklf3hkwrmi8tcq1.png" alt=" " width="800" height="447"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The Thread That Connects These Three Stories
&lt;/h2&gt;

&lt;p&gt;Put them together and one line runs through all three: &lt;strong&gt;make the right call, then validate it at the lowest possible cost.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The language lesson taught me that no amount of good technology saves a wrong direction. The 4-AI team showed me that resource constraints aren't the real limit — you just need a better combination. And the $70 price tag proved that the cost of being wrong in this era is so low, you have no excuse not to try.&lt;/p&gt;

&lt;p&gt;The most expensive thing in a startup isn't development. It's the wrong direction.&lt;/p&gt;

&lt;p&gt;But in the age of AI, the cheapest thing is finding out you're wrong — and correcting it — for pocket change.&lt;/p&gt;




</description>
      <category>startup</category>
      <category>ai</category>
      <category>webdev</category>
      <category>indiehacker</category>
    </item>
    <item>
      <title>I Almost Killed My Project Three Times — But What Scared Me Most Wasn't the Tech</title>
      <dc:creator>aiomniu</dc:creator>
      <pubDate>Mon, 13 Jul 2026 04:32:22 +0000</pubDate>
      <link>https://dev.to/aiomniu/i-almost-killed-my-project-three-times-but-what-scared-me-most-wasnt-the-tech-1ehk</link>
      <guid>https://dev.to/aiomniu/i-almost-killed-my-project-three-times-but-what-scared-me-most-wasnt-the-tech-1ehk</guid>
      <description>&lt;p&gt;Our site &lt;a href="https://aiomniu.top" rel="noopener noreferrer"&gt;aiomniu&lt;/a&gt; had moved from "building features" to "building growth." We had four growth loops running — internal links, email, social media, backlinks. Everything looked like it was on track.&lt;/p&gt;

&lt;p&gt;Then, in the span of three months, I almost killed the project three times.&lt;/p&gt;

&lt;p&gt;The first time was a tech stack decision. The second was a deployment failure. The third — was realizing I'd been doing everything the wrong way from the start.&lt;/p&gt;

&lt;p&gt;Three near-death experiences, three different flavors. But looking back, they were all the same thing from different angles.&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%2Fpv98gttjcqbh4yy28e6q.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%2Fpv98gttjcqbh4yy28e6q.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Tech Trap: 1,270 Pages That Brought My Site Back to the 2G Era
&lt;/h2&gt;

&lt;p&gt;While working on SEO and internal linking, I used marketing-skills methods to study competitors and build a ton of landing pages. I shipped 1,270 pages — and the result? The site loaded like it was 2007. Google flagged our performance as trash and stopped crawling us entirely.&lt;/p&gt;

&lt;p&gt;I did everything I could to get Google to notice us. And those exact actions were what made Google ignore us.&lt;/p&gt;

&lt;p&gt;At that point, I had two choices: abandon internal link optimization, or rebuild the entire frontend.&lt;/p&gt;

&lt;p&gt;It was a false choice. This was our first growth initiative. If we stopped here, we weren't building a business — we were playing with toys.&lt;/p&gt;

&lt;p&gt;So began the massive migration from Vue to Next.js. Long, painful, and every step landed on a landmine.&lt;/p&gt;

&lt;p&gt;Here's the thing — this bomb exploded in June, but it was planted back in late April, the day we picked Vue as our frontend framework.&lt;/p&gt;

&lt;p&gt;The AI's logic was straightforward: "You want a website fast? Vue. No question." And me? I didn't know how to code. I was like a clueless husband, nodding along — "Yes, dear engineer."&lt;/p&gt;

&lt;p&gt;That's an excuse, of course. All I had to do was ask one more question: "But what about scalability? What happens when I need 5,000 pages?"&lt;/p&gt;

&lt;p&gt;The AI thinks in the present moment. We have to think in the future. Filling that gap — that's on us. Nobody else is going to do it.&lt;/p&gt;

&lt;p&gt;Picking Vue, not realizing the cost until page 1,260 — that one was mine. But honestly, it wasn't the hardest part.&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%2Fmgjneih2aipy7bey3b9k.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%2Fmgjneih2aipy7bey3b9k.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Emotional Trap: The Day Deployment Broke and I Almost Shut It All Down
&lt;/h2&gt;

&lt;p&gt;The hardest part was June 8th.&lt;/p&gt;

&lt;p&gt;The day before, I had deployed a new version without a hitch. The next day? Nothing worked. Error after error. I had Claude check and re-check the code endlessly. An entire day, every method I could think of — the deploy just would not go through.&lt;/p&gt;

&lt;p&gt;That night, I did nothing. I lay in bed scrolling Douyin until I fell asleep.&lt;/p&gt;

&lt;p&gt;Our whole project runs on Cloudflare Workers. The single most critical link in the chain was broken, and I had no idea what to do next.&lt;/p&gt;

&lt;p&gt;You might wonder — if your tech stack is wrong, you can at least fix it. But when your deployment pipeline is dead, there's nothing to fix. It's a different kind of despair. The first one is "I chose wrong." The second is "I can't go forward."&lt;/p&gt;

&lt;p&gt;After a night of despair, Claude and I mapped out two options: buy a server, or wait for Cloudflare's developers to patch the bug. I hated both. But I had no third option. That's life. We decided to file a bug report and wait two days. If nothing happened, we'd buy a server.&lt;/p&gt;

&lt;p&gt;And then — like all good stories — the turnaround came. A Cloudflare developer replied the next day and fixed the versioning issue. I want to say this sincerely: thank you. Really.&lt;/p&gt;

&lt;p&gt;Standing here in July, it doesn't look like a big deal anymore. Wait a bit, and problems solve themselves.&lt;/p&gt;

&lt;p&gt;On this journey, sometimes it's not the difficulties that crush you. It's one devastating blow after you've already poured everything in. That's what breaks the camel's back. Give yourself some time. Give your project some time.&lt;/p&gt;

&lt;p&gt;A lot of problems aren't "unsolvable." They just "need time." That's true for tech roadblocks. It's true for heartbreak, too.&lt;/p&gt;

&lt;p&gt;Sometimes you didn't do anything wrong. It just wasn't your problem's turn to be solved yet. "Hang in there" — sometimes that's not a cliché. It's just a fact.&lt;/p&gt;

&lt;p&gt;After crawling out of that low point, I caught my breath and looked back at the road behind me. And that's when it hit me — the first two disasters had the same root cause.&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%2Fmq18ycwzy5u283qgsvye.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%2Fmq18ycwzy5u283qgsvye.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Cognition Trap: The Faster AI Got, the Slower I Became
&lt;/h2&gt;

&lt;p&gt;The longer I use AI, the stronger this feeling gets: AI is incredibly good at pulling you into "false efficiency."&lt;/p&gt;

&lt;p&gt;The problem is speed. Ask it to build a webpage, and it's done in an hour. Satisfying? Hell yes. Who needs programmers? I became a developer in a day.&lt;/p&gt;

&lt;p&gt;But that dopamine hit doesn't help you judge direction. It only helps you "run faster forward." It's like a train where someone keeps shoveling coal — always accelerating, speeding up until it derails.&lt;/p&gt;

&lt;p&gt;Looking back, picking Vue was a direct consequence of this. The AI said Vue was fast. I used Vue. And it wasn't wrong — from a "get it built" perspective, Vue really is faster. But it never told me that by page 1,270, the site would crawl. It just kept leading me to the next feature, faster and faster, further off course.&lt;/p&gt;

&lt;p&gt;AI has a distinct trait: it sees the world as a Y-axis. Vertical thinking by default. Finish one thing, move to the next. It's dangerously easy to fall into this sunflower-seed instant gratification — "Another feature done! I'm killing it!" But you start mistaking motion for direction. And the truth is, most of the time you're just "moving," not "moving right."&lt;/p&gt;

&lt;p&gt;I don't have a perfect fix. Just scar tissue and reflexes from getting burned enough times. Here's what I've learned:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Use structured brainstorming tools.&lt;/strong&gt; Superpowers brainstorming is the most common one. Plenty of people complain it's bloated, but it genuinely helps you dodge bullets before you start building. If I had spent 30 minutes brainstorming Vue vs. Next.js before coding, those 1,270 pages might not have been wasted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Use traditional review processes to constrain AI.&lt;/strong&gt; Back when we did operations work, we always held product reviews and design reviews first. That wasn't wasted time — it was the old-school method, and it still works. My rule now: visual first. For any feature change, make Claude show you what it looks like before you build it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Make AIs compete.&lt;/strong&gt; Take Claude's proposal and send it to ChatGPT. In my experience, ChatGPT is really good at finding flaws. This effectively adds an X-axis to the AI's natural Y-axis thinking. When you're too close to the problem, bringing in a third perspective dramatically lowers the risk of rework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Build a contradiction mechanism.&lt;/strong&gt; Tell your AI not to just agree with you. Once it knows you're not a 300-month-old baby who needs hand-holding, the quality of its thinking improves significantly. Because most of the time — the one shoveling coal into that train isn't the AI. It's you.&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%2Fvtaqljwimlc3h8al4nou.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%2Fvtaqljwimlc3h8al4nou.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Three near-death experiences. Three ways to die.&lt;/p&gt;

&lt;p&gt;The first was a tech trap — wrong framework, massive migration. The second was an emotional trap — deployment broke, nearly gave up. The third was a cognition trap — false efficiency kept me accelerating in the wrong direction.&lt;/p&gt;

&lt;p&gt;But all three share the same root: AI is responsible for speed, not for correctness. It's a train where coal never stops getting shoveled. Your job isn't to run alongside it — it's to stop, before it derails, and ask: am I even going the right way?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI isn't your problem. You are.&lt;/strong&gt; It's fast, but it won't help you pick a direction. It's efficient, but it won't make choices for you. It's always outputting, but it will never grab your shoulder and tell you you're walking off a cliff.&lt;/p&gt;

&lt;p&gt;On the startup journey, the most expensive thing isn't development, servers, or even time. It's pouring everything into something only to realize you've been running in the wrong direction.&lt;/p&gt;

&lt;p&gt;So slow down. Ask one more question. Let someone poke holes in your plan. Give yourself time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're building with AI and walking through similar minefields, come find me at &lt;a href="https://aiomniu.top" rel="noopener noreferrer"&gt;aiomniu.top&lt;/a&gt;. Solo developer or founder — this road has no shortage of traps. But the good news is, we don't have to step on all of them alone.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>startup</category>
      <category>ai</category>
      <category>webdev</category>
      <category>indiehacker</category>
    </item>
    <item>
      <title>Building a Freelance Platform on Cloudflare Workers: The Good, The Bad, and The Pyodide</title>
      <dc:creator>aiomniu</dc:creator>
      <pubDate>Sat, 11 Jul 2026 10:55:01 +0000</pubDate>
      <link>https://dev.to/aiomniu/building-a-freelance-platform-on-cloudflare-workers-the-good-the-bad-and-the-pyodide-nm3</link>
      <guid>https://dev.to/aiomniu/building-a-freelance-platform-on-cloudflare-workers-the-good-the-bad-and-the-pyodide-nm3</guid>
      <description>&lt;h1&gt;
  
  
  Building a Freelance Platform on Cloudflare Workers: The Good, The Bad, and The Pyodide
&lt;/h1&gt;

&lt;p&gt;Six months ago I sat down to build &lt;a href="https://aiomniu.top" rel="noopener noreferrer"&gt;aiomniu&lt;/a&gt; — a freelance marketplace for AI and tech projects. The constraints were simple: zero budget, fast load times, and a backend I could write in Python.&lt;/p&gt;

&lt;p&gt;The stack I ended up with: &lt;strong&gt;Cloudflare Workers + Pyodide + FastAPI&lt;/strong&gt; on the backend, &lt;strong&gt;Next.js 15 + OpenNext&lt;/strong&gt; on the frontend, and &lt;strong&gt;Cloudflare D1&lt;/strong&gt; for the database.&lt;/p&gt;

&lt;p&gt;This is what I learned — the parts that worked, the parts that broke, and the parts I'm still not sure were worth it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Cloudflare Workers?
&lt;/h2&gt;

&lt;p&gt;I did the obvious comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Cost for MVP&lt;/th&gt;
&lt;th&gt;Cold Start&lt;/th&gt;
&lt;th&gt;Python Support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;td&gt;Free (but DB adds up)&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Serverless functions only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Lambda&lt;/td&gt;
&lt;td&gt;Cheap but complex&lt;/td&gt;
&lt;td&gt;200ms-1s&lt;/td&gt;
&lt;td&gt;Good (via Layers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Railway&lt;/td&gt;
&lt;td&gt;$5/mo&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Workers&lt;/td&gt;
&lt;td&gt;Free tier is generous&lt;/td&gt;
&lt;td&gt;Sub-ms&lt;/td&gt;
&lt;td&gt;Pyodide (Python→Wasm)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For me it came down to two things: &lt;strong&gt;free tier&lt;/strong&gt; and &lt;strong&gt;edge distribution&lt;/strong&gt;. Cloudflare Workers gives you 100k requests/day at no cost, and your code runs in 330+ locations. Hard to beat for a bootstrap budget.&lt;/p&gt;

&lt;p&gt;The catch is that Python on Workers runs through &lt;strong&gt;Pyodide&lt;/strong&gt; — CPython compiled to WebAssembly. It's not serverless Python in the traditional sense. It's Python that has been through a compiler, stuffed into a Wasm binary, and told to behave. Most of the time it does. Sometimes it doesn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Good Parts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Deploying is Surprisingly Simple
&lt;/h3&gt;

&lt;p&gt;Once you have the pipeline, deployment is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx &lt;span class="nt"&gt;--from&lt;/span&gt; workers-py pywrangler deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It reads your &lt;code&gt;pyproject.toml&lt;/code&gt;, bundles FastAPI and all its dependencies, and pushes it to the edge. No Docker. No Lambda Layers. No VPC configs. Coming from AWS, this felt like cheating.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. D1 is Just SQLite — and That's Great
&lt;/h3&gt;

&lt;p&gt;D1 is Cloudflare's serverless SQLite. It supports proper SQL, joins, indexes, transactions. For an MVP with ~60 tables, it's been rock solid.&lt;/p&gt;

&lt;p&gt;The best part is local development. I keep a local &lt;code&gt;aiomniu.db&lt;/code&gt; file and switch connection logic based on the environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# db.py
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_get_local_conn&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aiomniu.db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;row_factory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Row&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;

&lt;span class="c1"&gt;# On Workers, same SQL through D1
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;query_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;_clean_nulls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same SQL. Same schema. Just different connection code. This saved me countless hours during development.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Next.js + OpenNext Just Works
&lt;/h3&gt;

&lt;p&gt;The frontend is a separate Worker built with &lt;code&gt;@opennextjs/cloudflare&lt;/code&gt;. It converts the Next.js build output into a Workers-compatible bundle. SSG pages pre-render at build time, ISR pages revalidate hourly.&lt;/p&gt;

&lt;p&gt;The SEO setup is clean — each page uses &lt;code&gt;generateMetadata()&lt;/code&gt; for dynamic meta tags and JSON-LD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateMetadata&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;}):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Metadata&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;slug&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Hire &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;SKILLS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; Developers | aiomniu`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Find pre-vetted &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;SKILLS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; developers for your project.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Programmatic SEO Actually Works
&lt;/h3&gt;

&lt;p&gt;With zero domain authority, I couldn't compete head-to-head. So I built &lt;strong&gt;alternatives pages&lt;/strong&gt; — targeting people searching for competitors:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;What It Targets&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/alternatives/upwork&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"Upwork alternatives"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/alternatives/fiverr&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"Fiverr alternatives"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/hire/react-developer/in/sydney&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"Hire React developer Sydney"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each page is data-driven. Add one line to a config array, and a new SEO page appears with its own meta tags, content, and JSON-LD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;SKILL_CITY_COMBOS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;react-developer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;shanghai&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;python-developer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;beijing&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;react-developer&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sydney&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="c1"&gt;# 250+ more combos
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generates 300+ SEO pages from about 50 lines of configuration. Google has indexed most of them. The long-tail strategy is working — we get impressions for queries we'd never rank for on the homepage.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Not-So-Good Parts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pyodide is NOT Python 3.12 on Your Laptop
&lt;/h3&gt;

&lt;p&gt;This is the biggest trap. It looks like Python, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No thread pool.&lt;/strong&gt; At all. Every route handler &lt;strong&gt;must&lt;/strong&gt; be &lt;code&gt;async def&lt;/code&gt;. Synchronous routes crash with &lt;code&gt;RuntimeError: can't start new thread&lt;/code&gt; — because there's literally no thread to start.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dynamic imports don't work.&lt;/strong&gt; &lt;code&gt;__import__()&lt;/code&gt; and &lt;code&gt;importlib.import_module()&lt;/code&gt; fail silently. All imports must be static &lt;code&gt;from X import Y&lt;/code&gt; at the module top level.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The ASGI bridge was broken for months.&lt;/strong&gt; The &lt;code&gt;asgi&lt;/code&gt; import in &lt;code&gt;workers-py&lt;/code&gt; had a version check bug that rejected valid versions. It was fixed in workers-py 1.11.0, but I spent a week debugging before figuring that out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JsProxy is everywhere.&lt;/strong&gt; Every JavaScript value arrives as a &lt;code&gt;JsProxy&lt;/code&gt; object. You need explicit conversion functions:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_to_py&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyodide.ffi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;to_js&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;to_py&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_py&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;  &lt;span class="c1"&gt;# local dev — no Pyodide
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_null&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;D1 NULL comes through as empty dict {}. Convert back to None.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ended up writing &lt;strong&gt;five&lt;/strong&gt; utility functions just to handle Pyodide type conversions: &lt;code&gt;_to_py()&lt;/code&gt;, &lt;code&gt;_deep_to_py()&lt;/code&gt;, &lt;code&gt;_null()&lt;/code&gt;, &lt;code&gt;_clean_nulls()&lt;/code&gt;, and &lt;code&gt;_convert_bind_params()&lt;/code&gt;. Each one addresses a different flavor of the same problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The 138KB Upload Wall
&lt;/h3&gt;

&lt;p&gt;Pyodide's multipart form parsing dies at roughly 138KB. Not gracefully — it just hangs or crashes.&lt;/p&gt;

&lt;p&gt;I had to add explicit file size checks before any upload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;upload_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...):&lt;/span&gt;
    &lt;span class="n"&gt;content_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content-length&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;content_length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;138&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;JSONResponse&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;File too large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;413&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This forced me to use &lt;strong&gt;Cloudflare R2&lt;/strong&gt; for file storage — uploads go directly via presigned URLs instead of through the Python Worker. It's the right architecture for production, but discovering it through a silent crash was frustrating.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Worker Bundle Size Limit
&lt;/h3&gt;

&lt;p&gt;The free plan limits Worker code to &lt;strong&gt;10MB gzipped&lt;/strong&gt;. My FastAPI + Pydantic + dependencies bundle is ~2.15MB, so I had room. But it's a hard ceiling — every new dependency needs a &lt;code&gt;pip install&lt;/code&gt; size check.&lt;/p&gt;




&lt;h2&gt;
  
  
  The One Bug That Cost Me Days
&lt;/h2&gt;

&lt;p&gt;D1 returns SQL &lt;code&gt;NULL&lt;/code&gt; values as &lt;strong&gt;empty JsProxy objects&lt;/strong&gt;, which Pyodide's &lt;code&gt;.to_py()&lt;/code&gt; converts to empty Python dicts &lt;code&gt;{}&lt;/code&gt;. Not &lt;code&gt;None&lt;/code&gt;. An empty dict.&lt;/p&gt;

&lt;p&gt;So a query like:&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="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;bio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avatar&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;bio&lt;/code&gt; is &lt;code&gt;NULL&lt;/code&gt; returns &lt;code&gt;{"bio": {}, "avatar": {}}&lt;/code&gt; instead of &lt;code&gt;{"bio": None, "avatar": None}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I discovered this when I saw "{}" rendered on a user profile page. Not a great look.&lt;/p&gt;

&lt;p&gt;The fix runs on every single query result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_clean_nulls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;_null&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works. But it's the kind of thing you only discover by accidentally shipping it to production.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Skip Pyodide for New Projects
&lt;/h3&gt;

&lt;p&gt;If I were starting today, I'd use &lt;strong&gt;Workers with JavaScript/TypeScript&lt;/strong&gt; for the API layer, or &lt;strong&gt;Hono&lt;/strong&gt; (the framework built for Workers). Pyodide's quirks add too much overhead. The "write Python, deploy to edge" promise is real, but the edge is jagged.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Go Next.js from Day One
&lt;/h3&gt;

&lt;p&gt;The site originally had a Vue 3 frontend. When I migrated to Next.js 15, everything got faster — SSG eliminated initial load time, SEO metadata became cleaner, and the developer experience was noticeably better.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Connect GSC Earlier
&lt;/h3&gt;

&lt;p&gt;I didn't set up Google Search Console until after the first 100 pages were indexed. I have no idea what the early crawl behavior was. Connect it on day one — it's free and gives you crawl stats, index coverage, and search query data.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;After 3 months of zero-budget operation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;~300 SEO pages indexed&lt;/strong&gt; (mostly long-tail skill/city combos)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sub-100ms median response time&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~$0 hosting cost&lt;/strong&gt; (still on the free tier)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The site is live at &lt;a href="https://aiomniu.top" rel="noopener noreferrer"&gt;aiomniu.top&lt;/a&gt; if you want to see it in action.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/workers/languages/python/" rel="noopener noreferrer"&gt;Cloudflare Workers Python docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pyodide.org/" rel="noopener noreferrer"&gt;Pyodide project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opennext.js.org/cloudflare" rel="noopener noreferrer"&gt;OpenNext for Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/d1/" rel="noopener noreferrer"&gt;D1 database docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built something on Workers + Pyodide? What broke for you? I'd honestly love to hear — misery loves company.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;— aiomniu-pilot&lt;/p&gt;

</description>
      <category>cloudflare</category>
      <category>python</category>
      <category>nextjs</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
