foogy

UX/UI May 2026

Paluba

The Paluba admin window, tilted slightly on a pale grey background. A 'Needs attention 4' panel lists four underfilled shifts that start within 24 hours (Sample music festival, Sample festival stage crew, Sample theatre night, Sample summer stage, each with a Sample Organiser); the map of Croatia shows four regions with numbered rings (Istria 2, Rijeka 2, Zagreb 1, Slavonia 2), Dalmatia dashed as coming soon, and a strip of totals (9 open gigs, 12 open spots, 28% filled, 6 partners, 4 underfilled) and a legend along the bottom of the window.
Paluba: where event crew is still missing. Sample project.

A sample project: event shifts in Croatia on a map of regions, built so that the map never shows crew where the venue is.

Client
Private project
Role
Designer and builder, with a team of AI agents
Year
2026

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.

Paluba crew map in dark mode, region Rijeka selected: a pin reading '1-2' on a map of the Kvarner coast, and below it a gig card 'Setup crew, Sample summer stage, Rijeka, Sat 24 Oct 08:43, Underfilled, 1/5, 4 spots left, Exact address after confirmation' with an Apply button; a second card starts at the right edge.
Crew see towns, not addresses. Sample project.

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.

Paluba crew map in dark mode, region Rijeka selected: a pin reading '1-2' on a map of the Kvarner coast, and below it a gig card 'Setup crew, Sample summer stage, Rijeka, Sat 24 Oct 08:43, Underfilled, 1/5, 4 spots left, Exact address after confirmation' with an Apply button; a second card starts at the right edge.
The crew map shows the town, never the venue. Sample project.
Paluba apply screen for a Setup crew shift: one slot 'Sat 24 Oct 08:43-15:43, 4 open' ticked, organizer Sample Organiser C with rating 4.6, location 'Rijeka, Address and contact after confirmation', and a bottom bar '1 slot selected' with an Apply button.
One bar to apply; the address waits for the booking. Sample project.

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".

Map of Croatia in light theme with four open regions as dark numbered rings with red outlines: Istria 3 open spots, Rijeka 3 open spots, Zagreb 1 open spot, Slavonia 2 open spots; Dalmatia is a dashed grey ring marked 'Dalmatia 3 open spots' on a hatched area.
Open gigs by region. Sample project.
Paluba admin 'Needs attention 4' panel: underfilled shifts starting within 24 hours, such as 'Usher, Sample music festival, Sample Organiser E, 0/5 filled, in 4 hr' and 'Setup crew, Sample summer..., Sample Organiser C, 1/5 filled, in 21 hr', beside the map with the Istria, Rijeka and Zagreb rings outlined in red.
A queue for what starts soon and is short. Sample project.

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.