UX/UI May 2026
Paluba
A sample project: event shifts in Croatia on a map of regions, built so that the map never shows crew where the venue is.
Shifts were a list, and a list does not show where help is missing.
Paluba matches event crew with organisers in Croatia. Its crew screen was a list of shifts with a city filter hard-coded to three cities, so I could not see which regions were short of crew.
A map with exact pins would have told every crew member where the venue is.
The obvious fix was pins on a street map. But the crew screens on dev sent the venue address, the organiser's contact and the meeting point to every crew member before any booking.
Towns, not streets: a map of five regions with no street layer.
I chose a plain SVG map of Croatia's five regions with one pin per town, and I rejected a tiled street map, because pins at town level show nothing a crew member may not see. I took the borders from public-domain Natural Earth and rejected GADM, whose licence is non-commercial. Places resolve from a 43-town table in code, so the first version needed no database migration.
Hiding the address everywhere, and a sign-out that did not sign out.
Hiding the venue on the map was easy; hiding it on every other crew path was not. Until a booking is confirmed, the crew sees the town instead of the venue, and the address, contact and meeting point are removed from every crew response. A privacy check now searches the crew responses for the seeded addresses, phones and venue names. A second thing broke in testing: Sign out returned 415 and the session stayed valid, because the request had no JSON content type; the fix is one header.
Regions first, then the shift, then Apply.
An organiser-side admin sees the open gigs per region and a queue of shifts that start within 24 hours and are underfilled. A crew member opens a region, sees numbered cards that match numbered pins, and applies from one sticky bar. Dalmatia is marked "coming soon".
What it changed
29 commits on top of dev, 40 privacy checks and 17 map checks that pass on a fresh database, and a 42 KB geometry file with no GADM data in it.
As of 22 Oct 2026.
29
commits on the feat/map-first branch that are not in origin/dev
40ok
privacy integration checks, run on a freshly seeded database
17ok
map integration checks, run on a freshly seeded database
5
regions
43
places in the gazetteer
42,355bytes
the generated geometry file (the plan's limit was 80,000), with no GADM data in it
Sources, all on branch feat/map-first at commit d1606b0: git log --oneline origin/dev..HEAD | wc -l (29); pnpm --dir apps/api test:self-check | tail -1 (43 places, 5 regions); npx tsx src/domain/privacy.integration.self-check.ts and npx tsx src/domain/map.integration.self-check.ts in apps/api after reseeding a throwaway database; wc -c apps/web/src/features/map/geo/croatia-regions.generated.ts (42,355); grep -ci gadm apps/web/src/features/map/geo/*.ts (0 for every file). Sample project on invented data.
It is a demo on sample data, and Dalmatia is not open.
Dalmatia shows as coming soon and has no map pins for crew. There are no street maps by design. The branch is not merged into dev, nothing here is live, and the data in every screenshot is invented.