Building a Freelance Platform on Cloudflare Workers: The Good, The Bad, and The Pyodide A developer built aiomniu, a freelance marketplace for AI and tech projects, using Cloudflare Workers with Pyodide for Python backend support. The stack includes FastAPI, Next.js 15, and Cloudflare D1 database, leveraging edge distribution and a generous free tier. The developer highlights challenges with Pyodide's limitations, such as the lack of thread pools and the requirement for async route handlers. Six months ago I sat down to build aiomniu https://aiomniu.top — 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. The stack I ended up with: Cloudflare Workers + Pyodide + FastAPI on the backend, Next.js 15 + OpenNext on the frontend, and Cloudflare D1 for the database. This is what I learned — the parts that worked, the parts that broke, and the parts I'm still not sure were worth it. I did the obvious comparison: | Platform | Cost for MVP | Cold Start | Python Support | |---|---|---|---| | Vercel | Free but DB adds up | Fast | Serverless functions only | | AWS Lambda | Cheap but complex | 200ms-1s | Good via Layers | | Railway | $5/mo | Fast | Native | | Cloudflare Workers | Free tier is generous | Sub-ms | Pyodide Python→Wasm | For me it came down to two things: free tier and edge distribution . Cloudflare Workers gives you 100k requests/day at no cost, and your code runs in 330+ locations. Hard to beat for a bootstrap budget. The catch is that Python on Workers runs through Pyodide — 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. Once you have the pipeline, deployment is one command: uvx --from workers-py pywrangler deploy It reads your pyproject.toml , 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. D1 is Cloudflare's serverless SQLite. It supports proper SQL, joins, indexes, transactions. For an MVP with ~60 tables, it's been rock solid. The best part is local development. I keep a local aiomniu.db file and switch connection logic based on the environment: python db.py def get local conn : conn = sqlite3.connect "aiomniu.db" conn.row factory = sqlite3.Row return conn On Workers, same SQL through D1 async def query all env, sql, params : db = env.DB result = await db.prepare sql .bind params .all return clean nulls dict r for r in result "results" Same SQL. Same schema. Just different connection code. This saved me countless hours during development. The frontend is a separate Worker built with @opennextjs/cloudflare . It converts the Next.js build output into a Workers-compatible bundle. SSG pages pre-render at build time, ISR pages revalidate hourly. The SEO setup is clean — each page uses generateMetadata for dynamic meta tags and JSON-LD: export async function generateMetadata { params } : Promise