Posta
A delivery network in one monorepo: landing, operations admin, three mobile apps and an API.

Posta runs a network of independent couriers for local shops. It found clients through social ads and managed them on WhatsApp. That manual process did not scale. Shops, couriers and end customers each needed their own app, and operations needed one place to watch it all.
Three decisions that shaped it.
- 01
End-to-end types from API to admin
Why. The admin imports the AppRouter type from the Hono API and calls it through tRPC. Shared Zod schemas live in one package used by the API and all three mobile apps.
Trade-off. Admin and API are coupled at build time. The mobile apps still call procedures by name, so they lose part of that safety.
- 02
WebSocket for live data, aligned polling for the rest
Why. Courier positions and presence arrive over WebSocket and patch the TanStack Query cache. Everything else polls at multiples of 15 seconds. Timers line up, so tRPC batches their calls into one request.
Trade-off. Two delivery channels to reason about. Polled data can be up to a minute old by design.
- 03
MapLibre with a style built from design tokens
Why. Mapbox charged per map load and needed the client's key. MapLibre with OpenFreeMap tiles needs no key. The style is built in code from the design tokens, so the map uses the product's colors.
Trade-off. We depend on a free tile service with no SLA. The tile URL is configurable, so it can move to a paid or self-hosted server.




Posta
A delivery network in one monorepo: landing, operations admin, three mobile apps and an API.
- Role
- Design and full-stack development
- Stack
- React + TanStack Router/Query, tRPC, Hono, Expo, MapLibre GL, Astro

Posta runs a network of independent couriers for local shops. It found clients through social ads and managed them on WhatsApp. That manual process did not scale. Shops, couriers and end customers each needed their own app, and operations needed one place to watch it all.
Three decisions that shaped it.
End-to-end types from API to admin
Why. The admin imports the AppRouter type from the Hono API and calls it through tRPC. Shared Zod schemas live in one package used by the API and all three mobile apps.
Trade-off. Admin and API are coupled at build time. The mobile apps still call procedures by name, so they lose part of that safety.
WebSocket for live data, aligned polling for the rest
Why. Courier positions and presence arrive over WebSocket and patch the TanStack Query cache. Everything else polls at multiples of 15 seconds. Timers line up, so tRPC batches their calls into one request.
Trade-off. Two delivery channels to reason about. Polled data can be up to a minute old by design.
MapLibre with a style built from design tokens
Why. Mapbox charged per map load and needed the client's key. MapLibre with OpenFreeMap tiles needs no key. The style is built in code from the design tokens, so the map uses the product's colors.
Trade-off. We depend on a free tile service with no SLA. The tile URL is configurable, so it can move to a paid or self-hosted server.



