Skip to content

Dolmapp

Every minibüs in İstanbul, finally mapped.

İstanbul's dolmuş network carries millions of trips and none of it is written down: no timetable, no signage, one line code running two directions. Dolmapp turns that local knowledge into something a stranger can use: which line, which direction, where to stand, where to get off, and what it costs.

Year
2026
Platforms
iOS · Android · Web
Scope
Product → Launch
Status
Pre-launch, waitlist open
Dolmapp on an iPhone over a stylised İstanbul minibüs map, with trip and line cards
Mobile app · Website · Design system2026

Role

Product, UX/UI, engineering, launch kit

Stack

  • Expo
  • React Native
  • Tamagui
  • Supabase
  • Redux Toolkit
  • Next.js
  • Remotion
Visit live site↗

Chapters

/A network that lives in people's heads

The problem

The real competitor isn't another app. It's the habit of asking the driver, or the stranger next to you.

The dolmuş is a beloved piece of İstanbul: shared minibuses that leave when they fill up and stop wherever the locals know to stand. It is real infrastructure. It also exists almost entirely as local knowledge.

There is no timetable to read, most stops are unsigned, and every line code runs in two directions. Board the wrong one and you lose 30–45 minutes going away from where you're headed.

Google Maps, Moovit and the official İBB/İETT apps are strong on metro and municipal buses, but the minibüs layer is missing, partial, or not direction-aware. They tell you a minibüs exists. They don't tell you which one to board or where to stand.

dolm.app
Dolmapp landing page section: The dolmuş runs on local knowledge
Fig.The three failure modes (no timetable, no signage, no direction) became the spine of the product and the website.

/Outsiders in their own city

Who it's for

Three riders, one question: which line, which way?

Primary01

The newcomer

Moved neighbourhood, moved city, new job, new campus. Needs the network and has none of the local knowledge it runs on.

Secondary02

The confident local

Knows their own line perfectly and none of the other 339. The network is only legible in fragments.

Supply side03

The driver

Live tracking only exists if drivers publish their position. They need a one-tap shift mode, not another app to learn.

The relief Dolmapp sells isn't “I saved four minutes.” It's “I'm on the right one.”

— Positioning insight

/Before any pixel, the map had to be right

The dataset is the product

Nobody had published the minibüs network in a form an app could route over. So the first product was the data: İstanbul's raw minibüs GeoJSON, re-ordered per direction, with every stop snapped onto its polyline in stop order.

Then the data had to survive a moving minibus. The app pulls the network once, stores it on-device in 500 KB chunks, and ships a bundled copy inside the build as a fallback, so it opens in a tunnel, on a bad connection, exactly where people need it.

340

Minibüs lines mapped

Both directions where they run

9,284

Stops, ordered

Snapped per direction

500 KB

Chunk size on-device

Offline-first cache

83.9%

Stops with corrupted indices

Found and fixed, Jul 28

Source · Dolmapp product docs & dataset integrity handover, July 2026

From raw city data to a phone in a tunnel

  1. 1

    Source

    Raw GeoJSON

    İstanbul's minibüs polylines and stops, around 250k lines of raw geometry.

  2. 2

    Build

    Per-direction ordering

    Scripts split each line into directions and snap every stop onto its polyline, in order.

  3. 3

    Publish

    Supabase + edge functions

    The dataset is versioned and served through edge functions, with flags and overrides on a 15-minute cache.

  4. 4

    Device

    SQLite, chunked

    Pulled once, cached in 500 KB chunks, with a bundled fallback compiled into the build.

  5. 5

    Rider

    Offline trip plan

    Planning runs on the phone. The server is only a fallback.

A transit app that's wrong once gets deleted. Accuracy has to lead, not trail.

The most important finding of the project was a bad one. An integrity audit on 28 July showed 83.9% of stops carried corrupted order indices, the kind of bug that makes a transit app confidently wrong. It was fixed at the source and the dataset re-published before any rider saw it.

/Never the wrong direction

Planning on the phone

Trips are scored on walking distance, direction and stop order, not on a name match, so a suggestion never sends you the wrong way. Multi-leg trips chain up to five rides, with walking legs measured on an on-device pedestrian graph built from OpenStreetMap.

On 23 July the planner was run inside the real app against a desktop reference on 74 randomized pairs across the city. In the 12 cases where the answers differed, the app's pick was equal or faster every time.

74

Citywide pairs replanned on-device

0

Wrong recommendations

0

Missed trips or crashes

33

Trips needing 2+ rides

Source · On-device trip-planner test report, 23 Jul 2026 (point-in-time, before the Jul 28 index fix)

Small decisions that make it trustworthy

Honesty01

Refuse instead of guessing

Kadıköy → Beşiktaş has no minibus-only route. Raw geometry would suggest walking across the Bosphorus; the app says so plainly and suggests a ferry or metro instead.

Live layer02

Never fake “live”

Vehicles only appear where drivers are broadcasting, and are marked explicitly. Routing, stops and fares work with zero drivers online.

Money03

Fare before you board

A distance-based estimate against the current tariff, so the cash is ready before the door opens.

Language04

Stop names as people say them

Türkçe and English UI, but stop names stay in the language riders actually use at the kerb.

/Five moments, one question answered

The app

Scroll to ride through a trip, from “where do I stand?” to “I'm on the right one.”

01 · Plan

Type where you're going

Origin, destination, optional stops in between, and the lines already passing within a short walk.

Dolmapp home: where are you going, with nearby lines

02 · Route

We pick the line and the direction

Every option is scored on walking distance, direction and stop order. Transfers, walks, fare and duration in one card.

A planned trip with transfers, walking legs, fare and duration

03 · Live

Watch it come to you

Where drivers share their location, time your walk instead of standing at an unsigned kerb.

Live vehicles on the map with minutes to arrival

04 · Lines

Browse all 340 lines

Searchable by line code, neighbourhood or stop, on both sides of the Bosphorus.

Library of all 340 lines, searchable and filterable

05 · Stops

Know exactly where to get off

Ordered stops for each direction, with boarding and alighting points marked before you step on board.

One line stop by stop in both directions

Real device captures

Onboarding screen
01Onboarding
Home screen, light
02Home, light
Home screen, dark
03Home, dark
Trip result on the map
04Trip result
Trip details sheet
05Trip details
On-trip mode
06On-trip mode
Line detail with direction toggle
07Line detail
Minibus library
08Library
Network map
09Network map

/Colour that means something on a map

The design system

On a transit map, colour isn't decoration. It's instruction. Every hue in the system maps to one meaning a rider needs at a glance: blue is the ride, teal is where you board, green is where you get off, purple is a transfer. Red is reserved for errors and nothing else.

Big radii and one geometric typeface (Manrope) keep a dense, data-heavy app feeling calm in one hand on a moving bus. The tokens live in one file and are mirrored into the website and a standalone design-system site.

Design tokensClick a swatch to copy

Manrope · Display 34/38 · ExtraBold

Nereye gidiyorsun?

Manrope · Body · caption 12

Sana en yakın duraktan doğru minibüsü bul.

Field

22px

Card

24px

Hero / sheet

28px

Pill

999

/A waitlist, a scroll story, a campaign

Website & launch kit

The marketing site tells the product story the way the app works: the hero phone is built in code, not screenshotted, and a pinned scroll sequence rides through five real moments of a trip. It's a separate Next.js deployment against the same backend, alongside an operations admin for complaints and lost & found.

The launch assets came from the same source of truth: App Store and Play screenshots at every device size, the Play feature graphic, a nine-post Instagram campaign, YouTube channel art and two cut promos rendered with Remotion.

dolm.app
dolm.app hero: Every minibüs in İstanbul, finally mapped
Hero: the phone UI is live code, not a screenshot.
dolm.app
Pinned scroll sequence: Watch it come to you
Pinned scroll story, moment 03 of 05.
dolm.app
Feature bento: everything the network never told you
Feature bento with a live direction-aware pick.
Google Play feature graphic
Play Store feature graphic from the launch kit.
21-second horizontal promo, rendered in code with Remotion.

/Four months from first commit to store builds

Timeline

  1. 17 Apr

    First commit

    Admin panel with feature flags follows two days later.

  2. 21–24 Apr

    Supabase-backed data

    Routes and stops move from files to a published dataset.

  3. 23 Jul

    On-device planner test

    74 citywide pairs, zero wrong recommendations.

  4. 25 Jul

    Planning moves on-device

    Server becomes the fallback; fares consolidated into one table.

  5. 27 Jul

    TestFlight 1.0 (3)

    Web and admin split into their own repository.

  6. 28 Jul

    Dataset integrity fix

    83.9% of stops had corrupted indices; fixed at the source.

  7. 30 Jul

    Android internal 1.0.0 (5)

    Waitlist wired to a real backend.

  8. 8 Aug

    Launch kit rendered

    Store screenshots, campaign posts, promos.

  9. 15 Sep

    Design-system site

    Tokens, screens and brand published as their own site.

Next / Mobile app · Odoo platform

Diet Market