Role: Founder & engineer.
In Colombia, hiring everyday services (plumbing, cleaning, tutoring, errands, electricity, beauty, pet care) still runs over WhatsApp, referrals and numbers taped to street poles. There's no verification, no reputation, no clear prices and no payment protection. Supply and demand already exist. What's missing is trust.
I built Cerkya to fix that.
The product
For people who need something done
You post what you need in about a minute. Verified people nearby send you offers, and you see their reviews before choosing. You pick one, pay protected, and rate the job at the end.
For people who offer services
Providers get steady demand, a reputation that goes with them from job to job, and guaranteed payment for the work they finish.
Where it runs
The app has been live on the App Store and Google Play since October 2026. The requester web app (PWA), the admin panel and the landing page are in production too.
How it's built
Cerkya lives in two repositories: cerkya-app, the Flutter app for iOS and Android, and cerkya-platform, a pnpm TypeScript monorepo with everything else.
Backend
Hono with better-auth and Drizzle on PostgreSQL. Every input and output goes through zod, and the API publishes OpenAPI docs. Redis runs alongside it.
Frontends
- Mobile app: Flutter, one codebase for iOS and Android.
- Requester PWA: React. I chose it over Flutter Web on purpose: canvas rendering hurts bundle size, SEO and accessibility, and the web version has to load fast from a shared link.
- Admin panel: React with Vite.
- Landing: Astro, with an MDX blog.
Geographic matching with H3
Matching a request to providers nearby uses H3 hexagonal cells stored as plain Postgres columns. A radius search is a k-ring of cells around the request, which turns into an indexed lookup. No PostGIS needed.
Protected payments
Payments work escrow-style with Wompi. The app creates a payment intent, Wompi confirms it through a webhook whose checksum is verified, and the money is released only when the job is completed.
Identity verification
Identity verification uses a document plus a selfie. That's what "verified" means when you see an offer.
AI worker
A Python FastAPI worker handles moderation, classification and ranking, and a self-hosted vision worker moderates images. Models come from Cloudflare Workers AI, Cerebras and Amazon Bedrock (Nova Micro), with OpenAI as a fallback. Every provider has its own kill switch, so I can turn any one of them off on its own.
Electronic invoicing (DIAN)
Colombian electronic invoicing is an in-house package: UBL 2.1 documents, CUFE/CUDE codes, XAdES signatures and the SOAP envelope. It's a pure package that reads no environment variables; the app passes in everything it needs.
Operating from Claude (MCP)
A remote admin MCP server exposes accounting tools, so I can run that side of the business from Claude.
Infrastructure
- One VPS managed with Dokploy.
- Cloudflare R2 for files and Cloudflare Pages for the static frontends.
- Backups to R2 every 12 hours, with restores that have actually been tested.
- Monitoring with Beszel and GlitchTip.
- pnpm with a strict lockfile and a dependency audit in CI.
What I learned
- One database, not parallel stores. H3 cells in regular Postgres columns cover geographic search without adding a separate geo system to keep in sync.
- Keep the hard core pure. The DIAN package reads no environment, which makes it easy to test and hard to break by accident.
- Every external AI provider needs an off switch. Per-provider kill switches plus a fallback mean one provider having a bad day doesn't take moderation down with it.
- Pick the web stack for the web. The requester side is a React PWA, not Flutter Web, because a link someone shares has to load fast, be indexable and work with a screen reader.
- Backups only count once you've restored them.
Stack
| Layer | Tech |
|---|---|
| Mobile app | Flutter (iOS and Android) |
| API | Hono, better-auth, Drizzle ORM, PostgreSQL, zod, OpenAPI, Redis |
| Web | React PWA, React + Vite admin, Astro landing with MDX blog |
| AI | Python FastAPI worker, self-hosted vision worker; Workers AI, Cerebras, Bedrock Nova Micro, OpenAI fallback |
| Payments and identity | Wompi escrow-style payments, document + selfie verification |
| Invoicing | In-house DIAN package: UBL 2.1, CUFE/CUDE, XAdES, SOAP |
| Ops | Dokploy on a VPS, Cloudflare R2 and Pages, Beszel, GlitchTip, remote admin MCP server |
