EcoMap
Residents of Uzbekistan pin ecological violations on a map with a photo and a geotag — and operators see them within minutes.
EcoMap is a civic-tech reporting platform. Anyone can drop a marker on the city map, attach photos of the violation, and follow the case until it's resolved. A Telegram bot handles authentication and notifies the relevant operators; an admin console keeps the queue under control.
Built solo across two iterations — a v1 on Supabase, then a full rewrite on a self-hosted Bun · Elysia · Drizzle · Better Auth monorepo. The migration is the technical story: deliberate move off BaaS lock-in to an in-house stack I control end-to-end.
What it does
5 signals
- 01 · MapPin-and-photo reporting on a Leaflet map
Citizens drop a marker, attach photos, describe the violation. Each report has a detail page with media, location and a 'Help solve' affordance. Geotags are normalised on the server; images run through sharp before storage.
- 02 · AuthTelegram authentication on the web
Login via the Telegram bot using postMessage + a cross-origin session cookie. The flow handles duplicate accounts, syncs Telegram profile data into the local user record, and uses USE_SECURE_COOKIES rather than NODE_ENV for production behaviour.
- 03 · StackType-safe fullstack via Eden Treaty
Elysia.js API exported into the Next.js client through Eden Treaty — end-to-end types without codegen. One source of truth for request and response shapes; refactors propagate across the four apps in the monorepo.
- 04 · JobsBackground processing off the HTTP path
A dedicated jobs app processes photo derivatives, AI categorisation and Telegram notifications via a queue. Long-running work is moved off the request cycle; the queue is run under systemd.
- 05 · i18nTrilingual UX from day one
Russian, Uzbek and English are first-class — next-intl drives the locale-aware routing and there's an explicit fix for the infinite-redirect edge case BaaS adapters tend to hit.
Stack
Domain ecomap.uz is held; public launch and a build-in-public write-up of the Supabase → monorepo migration are queued. Reach out if you'd like a code walk-through.
Open to Senior / Staff engineering roles and selective freelance — production AI, platform, and full-stack work.
Get in touch