“From here, how do we get to Ragunan Zoo?”
Good question.
I paused. This wasn’t a matter of intuition; it was a routing problem.
I opened a navigation app, queried the destination, and switched the mode to public transport. The proposed solution was a multi-hop journey : take the blue commuter line to Manggarai, transfer to the red line toward Bogor, get off at Pasar Minggu, then continue with something called S15A.
S15A?
That identifier triggered a red flag. After a quick lookup, it turned out to be an angkot.
That immediately raised another question. Was there really no direct busway route to Ragunan? Not even a JakLingko alternative? Cost sensitivity was also a concern. There are plenty of public transportation modes in this city: MRT, LRT, Commuter Line, Transjakarta BRT, and Transjakarta non-BRT, but angkot and ride-hailing motorcycles are the two worst options, since they can end up being pricey due to the lack of government subsidization.
At that point, I decided to discard the initial navigation output entirely. Close the app. Start over with a more specialized tool.
I switched to the official Transjakarta application.
It refused to open and forced an update. Fine. Update first, then rerun the query.
Post-update, I defined the problem more explicitly. Assume the train leg was already completed. Starting point: Pasar Minggu Station. Destination: Ragunan. The goal was to find a replacement for the S15A angkot.
Search results came back clean. Instead of S15A, there was a JakLingko option: JAK47, Pasar Minggu–Ragunan. That was acceptable. Same endpoint, better integration.
Solution candidate number one locked in.
Then I expanded the scope. What if we removed the train entirely? What if the journey started directly from Bekasi using Transjakarta, via Vida to Cawang Sentral?
New query. New parameters. Starting point: Cawang Sentral. Destination: Ragunan.
This time, the system returned a different graph traversal. From Cawang Sentral, take route 9 (Pinang Ranti–Pluit) toward Pluit, get off at Pancoran Barat, then transfer to route 5N (Kampung Melayu–Ragunan).
That worked.
At this point, I had two viable route “recipes.” I sent the information and considered the problem solved.
Then, around 1 p.m., a new data point arrived.
She was at Patra Kuningan stop.
Patra Kuningan?
That node was not part of any plan.
I immediately re-opened the Transjakarta app and searched for Patra Kuningan. Turns out, there was a direct route from there: route 6, Ragunan–Galunggung.
So yes, it was still reachable.
But this raised a more interesting question. Had all the careful route planning – that i made before– been completely unused?
I wanted to verify this, not anecdotally, but spatially.
What I needed was an application that could display the coordinates of all these stops at once, so the entire system could be visualized as a rough operational map rather than isolated routes.
I couldn’t find (the right) one.
Well, I actually found some. For example, uMap. But I need something much simpler than uMap. Here’s why.
“There are too many clicks and steps if you want to use uMap.”
You use a search engine, search for uMap, arrive at https://umap.openstreetmap.fr/en/ , click “create a map”, click the marker icon, add some description, then click “close”. Oh, I need the label to be shown by default. But in this uMap instance, the label is hidden by default. So I need to show it. How do I show the label? Right-click the marker, then… umm… think for a few seconds. Ah. “interaction options”! So, click interaction options, click display label, click “always” instead of “never”. Great, now let’s add more place markers. But no. That “always” option is only enabled for that specific place marker. So when you add a new place marker, it’s back to the “hidden label” preference. Oh no. Should I do this one by one? Hmm.
After thinking and tinkering for a few minutes, I finally solved the puzzle. It’s the layer. We should modify the interaction options, specifically display label, at the layer level instead of individual place markers.
But… ah, I give up.
I decided to make my own app. A simpler app.
So I built it: Altilunium Locationpad. Done.
Let’s proceed to my original mission. Here we go :

Once the map was plotted, the situation became clearer.
If they were at Patra Kuningan, the train-based plan was definitively abandoned. There is no realistic path that involves a train and ends up at Patra Kuningan. The expected region after a train transfer would have been Pasar Minggu or its surroundings, and on the map, Patra Kuningan sits far north of that cluster.
The only plausible explanation was this: they chose the busway-only option. Vida to Cawang Sentral, then route 9 toward Pluit. The intended transfer point should have been Pancoran Barat, but they likely stayed on the bus too long and ended up at Patra Kuningan instead.
From a spatial perspective, that overshoot wasn’t catastrophic. Pancoran Barat and Patra Kuningan are not that far apart. The error margin was tolerable.
My original suggestion was to transfer at Pancoran Barat and take route 5N straight to Ragunan.
In reality, from Patra Kuningan they took route 6, Galunggung–Ragunan.
Different edges, same destination.
There’s also another plausible execution path. They may have ignored my plans entirely, taken Vida to Cawang Sentral, and asked the on-site staff, “From here, how do we get to Ragunan Zoo?” The answer would have been operationally valid, though slightly suboptimal: take route 9 toward Pluit, get off at Patra Kuningan, then transfer to Galunggung–Ragunan.
From a rough efficiency calculation, that advice sends passengers a bit too far north. Pancoran Barat is geographically closer to Ragunan and would have minimized backtracking.
But in the end, the system converged.
They arrived in Ragunan.
At 3:50 p.m., the objective was achieved, and the meeting with Masbro finally happened.

Discussion