Flek — a civic map, built and running in public by Lukas JandaFlek — a civic map, built and running in public by Lukas Janda

Flek — a civic map, built and running in public

Lukas Janda

Lukas Janda

A flek is a spot, a place, and a stain. You walk past something that needs ten minutes of attention — a bin nobody empties, a bench with a broken slat, a corner that collects litter. You tap it onto the map, and later someone, maybe you, claims it with a before and an after photo.
This is the one piece of my work with no NDA on it. You can open the app, read every line of the code, and run the tests.

No accounts, by construction

There is no user table. A device generates an anonymous id on first use, keeps it locally, and sends it as a header. That is the entire identity model.
It sounds like a simplification and it is the opposite — it shapes everything downstream. Rate limiting, moderation and abuse handling all have to work without knowing who anyone is. The moderation screen had to be built so that acting on reported content never exposes who submitted it. Proving that a place was genuinely improved, when you know nothing about who says so, is the actual design problem.

Claims need evidence

Improving a place takes a before photo and an after photo, taken close enough to it and far enough apart in time. Proximity and GPS accuracy are checked server-side — the client is not trusted about where it is.

One place decides what leaves the server

api/src/domain/public.ts is twenty-one lines and it is the single place that decides which fields may appear in a response. Whitelists, not blacklists: a column added later stays private until it is named there.
That file exists because of a bug. A detail route was doing SELECT * and returning device tokens — and a device token is that device's login. The fix was not to patch the endpoint but to make it impossible to make that mistake again in one of the others.

Stack

Cloudflare Workers, D1 and R2 on the server; Vue 3, TypeScript and MapLibre in a PWA on the device, with an IndexedDB queue so the app works outdoors on a bad connection. 288 tests. No framework on the server, no ORM, no state library.
Like this project

Posted Oct 6, 2026

A map of small neglected places and a record of people quietly fixing them. Live at flekit.com, open source, no accounts — a device-generated id is the whole identity model.