Files
arah2/.planning/research/FEATURES.md
T

26 KiB
Raw Blame History

Feature Research

Domain: Privacy-respecting, Telegram-first GPS navigation (turn-by-turn navigator as a Telegram Mini App, KL metro first) Researched: 2026-10-22 Confidence: MEDIUM-HIGH (platform API details HIGH — verified against official Telegram docs; ecosystem/competitor findings MEDIUM — web sources; KL-local conventions MEDIUM — single-domain sources plus community knowledge, flagged where LOW)

Feature Landscape

The reference products are Waze, Google Maps, OsmAnd, Organic Maps, and (as the Telegram-native analog) bots that send location/venue cards. Because araharah is a driving assistant delivered inside a chat app, the table-stakes set has two layers: (a) what any turn-by-turn navigator owes the user, and (b) what any Telegram experience owes the user. Both layers must be present or users bounce back to Waze — which, notably, is the dominant nav app among Klang Valley drivers, so the comparison is unavoidable.

Table Stakes (Users Expect These)

Guidance & Routing Core

Feature Why Expected Complexity Notes
Destination search with local POI/spelling tolerance First interaction with the product. Typing "klsentral" or "KLCC" must produce the right place, or the product is dead in 10 seconds HIGH Nominatim is exact-ish but poor at typos; Photon (Komoot) is built for fuzzy/autocomplete over OSM and is the opinionated choice. Hard-constrain to KL-metro viewbox. Add a curated local gazetteer for landmark aliases (see KL section).
Current-location origin (geolocation) No one types their own address; map apps start "from here" MEDIUM Telegram Mini App LocationManager (Bot API 8.0+, Nov 2024) triggers the native permission dialog. MUST have graceful fallback: "Send location" attachment button in chat (Telegram reply keyboard request_location) for denied permissions.
Route calculation + map display of route The literal core value MEDIUM OSRM (per IDEAS.md) is fine for fastest-route + alternatives; Valhalla if toll avoidance/eco-cost is needed via costing options (use_tolls, use_highways). Route = polyline + per-step maneuvers + distance/time.
Alternative routes (2–3 shortlist, tappable) Every consumer nav app shows a route choice screen; showing exactly one route feels broken MEDIUM OSRM alternatives=2; present as compact cards (time, distance, headline difference "saves 8 min via DUKE"). Rams-minimal presentation is a feature here — Waze's route screen is cluttered; ours should be 2–3 cards max.
Turn-by-turn maneuver list + next-maneuver banner Expected shape of driving guidance MEDIUM Next-maneuver banner prominent (distance + arrow icon + street name), full list collapsible. Straightforward rendering of OSRM steps.
Missed-turn detection and automatic recalculation THE signal that an app is "real navigation". Waze's identity is aggressive instant rerouting; users will distrust a navigator that says "you're off route" without fixing it MEDIUM–HIGH Detect by snapping GPS track against route polyline; off-route threshold (~30–50m for a few seconds) triggers re-route from current snapped position. Needs map-matching of moving points — modest but easy to get wrong (jitter, tunnels, elevated highways over regular roads in KL).
ETA display + progression Users sanity-check the ETA constantly ("still 25 min?") LOW Remaining time/distance recomputed from current step position; update on each location fix. Google's "glanceable directions" proved the minimal ETA+maneuver+remaining-time triad is the lock-screen pattern users expect.
Voice guidance (spoken turns) Driving use case; users look at road not screen HIGH Web Speech API (speechSynthesis) works in Android webviews but is historically unreliable in iOS WKWebView — iOS Telegram users may get silence. Include mute-by-default, haptic cues on turns (Telegram HapticFeedback), and consider OS-side TTS test on first launch. Telegram sendVoice (bot TTS → opus message) is a platform-native fallback worth designing for.
Speed limit display ubiquitously expected from Google/Waze on majors MEDIUM OSM maxspeed in Malaysia is patchy off federal/highway routes (research shows OSM completeness in MY is uneven). Ship as "where data exists" — display nothing rather than wrong values. Vector tile + server-side maxspeed lookup.
Live location sharing on request (arrival ETA message) In Telegram context, users send "I'm coming" to whoever is waiting LOW Native: sendLocation(live_period) + editMessageLiveLocation — the bot can update a live-location thread with ETA text; zero new UI.
Destination card (venue message) in chat Before the route, the chat should show WHERE we're going LOW Native sendVenue renders a beautiful native card — free table stakes for the Telegram layer of UX.

Telegram Layer (the chat/webview is the OS)

Feature Why Expected Complexity Notes
/start onboarding + global commands (/help, /settings) Telegram-recommended baseline; the whole product starts here LOW /start → 3-sentence explanation + "OK, where to?" with inline-keyboard examples. Global commands are Telegram ecosystem convention.
Destination follow-up flow via chat ("ketik nama tempat") The bot chat is the search UX in v0 of the funnel LOW Free-text → result list (inline keyboard) → "Open navigation" Mini App button with startapp param carrying the destination ID.
Mini App launch with context (destination preloaded) Users will not re-enter the destination in the webview LOW (if flows designed together) Pass destination via ?startapp= deep-link / initData. Verified.
BackButton wired to app state (route list → guidance → search) Telegram-webview-native navigation; broken/gone BackButton = users swipe the app away entirely LOW Telegram.WebApp.BackButton.show()/onClick(); mandatory per Telegram design guideline to mimic native feel.
Theme integration (light/dark) Telegram Mini App design rule; a nav app opened at night with a white webview chrome is jarring MEDIUM Read themeParams, colorScheme, CSS vars; map tiles stay constant; non-map chrome adapts. Rams palette maps well onto dark mode (Matte Black #1A1A1A is already in the palette).
Respect safe areas + fullscreen + landscape Driving apps are landscape-capable; Telegram 8.0 added full-screen geo tools precisely for this LOW–MEDIUM requestFullscreen(), safeAreaInset, disableVerticalSwipes() (prevent accidental minimize while driving), enableClosingConfirmation() during active guidance ("abandon route?" on close attempt).
Haptics on turn alerts Replaces voice as the "eyes-on-road" cue; platform affordance exists LOW WebApp.HapticFeedback.notificationOccurred().

KL/Malaysia conventions

Feature Why Expected Complexity Notes
Landmark-first search ("KLCC", "Sunway Pyramid", "1U", "Imbi", "PWTC") Local habit: Malaysians navigate to named icons/monuments rather than street addresses; OSM Malaysia completeness is mediocre but major POIs exist MEDIUM Curated gazetteer (a few hundred entries: malls, transport hubs, landmarks, "Seputeh"/"Damansara Heights" colloquial district names) layered ahead of generic geocoding. This is the single most KL-specific correctness feature.
Malay/name abbreviation tolerance ("Jalan"↔"Jln", "Taman"↔"Tmn") Everyday usage; results lists must match even if the user types the short form MEDIUM Query normalization layer (synonym/abbreviation expansion) before geocode. Photon does fuzzy-stem matching; abbreviation mapping must be explicit (Jln, Tmn, Jln Persekutuan → FT-prefixed federal routes, "KL"→"Kuala Lumpur").
Toll-aware route option ("avoid tolls") Klang Valley is dense with tolled highways (Plus, Sprint, LITRAK, DUKE); commuters deliberately avoid them, and toll-free trip prices differ significantly MEDIUM (easy with Valhalla; clunky with OSRM) With Valhalla: use_tolls=0 costing. With OSRM: much harder (no clean toll exclusion) — an argument for Valhalla or OSRM dual-profiles. Present as "Toll / Toll-free" toggle, not a settings menu (Rams).
Traffic-relevant display (congestion-aware ETA) Users compare against Waze; a static ETA in Klang Valley traffic is fiction by definition HIGH Honest scoping: v1 without traffic data should show predicted ETA from road classes, but must not pretend it's live. Minimal honest version: re-ETA from observed pace (moving average of user's own speed = free, accurate-to-them, and privacy-friendly). Live public traffic is a differentiator below.
Speed-camera awareness (AES) (v1.x borderline) Waze popular in MY partly BECAUSE of AES camera pings MEDIUM but data-dependent AES camera locations are partially in OSM; scraping/curating is legally gray. Defer — it's the incident-report family, explicitly out of v1 scope (PROJECT.md). Keep on the record for v2 with the reports cluster.

Differentiators (Competitive Advantage)

These are where araharah wins, and every one of them flows from "privacy-respecting Rams bot + Telegram-native" — that is, they are only differentiators because the competitors (Waze/Google) structurally can't copy them.

Feature Value Proposition Complexity Notes
Radical "no tracking" clarity in-product Users of Waze/Google have no idea what's logged. araharah can SHOW the user the words "we delete your destination when the trip ends, we never associate trips with you" — inside the product, not a privacy policy LOW A /privacy command + a 3-line statement on the Mini App landing + a visible "trip ended, deleted" confirmation. Costs almost nothing. Is the brand promise made visible.
Self-erasing guidance state Server keeps only a short-lived route session token; no history, no profile. Concretely differentiable vs "Google knows everywhere you've been" MEDIUM Architecture-level (stateless routing + ephemeral server-side session). Must be stated in the ARCHITECTURE research, but the feature is the visible promise.
Turn-cards in the chat when guidance is backgrounded (the hybrid) Waze can't message you in a chat; our guidance literally lives where the user already is. Full control: since Telegram webviews pause JS when backgrounded, the bot takes over — sends a chat card with map snapshot + next maneuver + ETA every ~2–3 min or at maneuver points MEDIUM–HIGH Server-side guidance session pushes sendPhoto with a static map snapshot (route + position marker) + text turns. Telegram-native sendLocation(live_period) is a zero-build coarse version. This is the marquee differentiator: navigation that lives in Telegram instead of an app overlay.
Rams-minimal UI (calm navigation) Waze = candy, ads, noise. Google Maps += POI popups. A quiet, high-contrast, icon-first guidance screen is genuinely differentiated and safer while driving (less visual noise = fewer glances) MEDIUM (design-execution risk, already flagged as #1 in PROJECT.md) The design system exists; the feature is fidelity discipline: no banners, no distraction, one maneuver at a time.
Home-screen shortcut access to the navigator "Mini app but behaves like an app" — deep link add to home screen makes araharah launchable without opening a chat (still inside Telegram webview runtime) LOW WebApp.addToHomeScreen() (Bot API 8.0+); pairs with homescreen ?startapp deep-links. Cheap, big UX upside.
Opt-in traffic intelligence ("you make the map better") Privacy-first version of Waze's crowd data: aggregate ONLY opt-in, anonymized, coarse speed pings to weight traffic HIGH (v2-worthy but a v1 architecture stub helps) v1 needs only: measure aggregate performance vs OSM speeds server-side for opt-in users, improve ETA. Frame honestly at opt-in time ("help improve routing, 1-min-placeless pings"). This is the seed of v2 incident reports done right.
Trip-sharing via Telegram (this trip only) Send live-traveling thread to family via the native sendLocation live they already get — no account, no persistent tracking, "share once, expires" LOW Wrapping existing Telegram primitives gives a genuinely safety-valuable sharing flow without building any location-stream backend of our own.
Offline-calm fallback via Vector tiles caching (deferred candidate) KL tunnels/parking; the webview can hold tile caches (WebApp DeviceStorage, Bot API 9.0+) for recent tiles MEDIUM Park as v1.x; note mini-app storage is per-origin and size-limited.

Anti-Features (Commonly Requested, Often Problematic)

Deliberately NOT building these is not laziness, it is the product thesis (Rams: "less, but better"), and several are behaviorally toxic in a driving context specifically.

Feature Why Requested Why Problematic Alternative
In-app ads / POI promo cards / sponsored pins Monetization reflex, Waze does this Directly contradicts the brand promise; adds attention load to a driving surface; builds a profile per user to serve ads (breaks privacy commitment) No monetization in v1 (already decided). If ever needed, transparent supporter banner OFF guidance screens or Bot Stars premium, never on the guidance surface
Gamification: points/levels/candy/moods Waze-heritage feature, social stickiness Depends on incident-report social structure (out of scope); dopamine loops that reward app-time not safe driving; Rams-violating visual noise Emotional payoff via product honesty: "you just helped improve this route for everyone" micro-acknowledgment of opt-in pings
Push notification re-engagement ("You haven't driven with us in a while!") Perfecting DAU metrics Drive-away behavior for a privacy brand, Rams-minimalism violation, no utility Telegram itself is opt-in messaging; only transactional messages (guidance cards, cancellation confirmations)
Live incident reports / social commenting (v1) The emotional appeal of Waze Huge moderation scope, real-time infra, and dilutes perfecting the navigation core first; explicitly deferred in PROJECT.md Out of Scope v1: report nothing. Architecture should leave a clean seam for v2 (opt-in aggregated speeds)
Account/sign-up, phone number request, email Standard SaaS onboarding reflex Anti-differentiator; everything already exists via Telegram identity initData validation server-side, that is ALL (already the plan). Never call requestContact()
Fat JSON payload/feature-rich settings menus (route aversion toggles, max speed preferences, per-type avoidance) Power users request them Rams principle: hidden decision complexity → settings sprawl; driving apps must not bury the ONE decision (route choice) under options Three choices max: fastest / toll-free / shorter-dist; everything else derived from defaults
Offline maps (!) Asked for in every nav product, especially OSM-ecosystem reviewers Architecturally contrary to a Telegram webview app; tiles+lengthy download UX conflicts with chat-first lightweight promise Trip-aware tile prefetch in-session (small radius), not offline product
"Chat with an AI assistant" flavor onboarding LLM-era reflex Confuses the mental model (navigation is stateful precision, chat is flexible) with token costs and latency Deterministic, byte-sized onboarding, command-native
Echoing user's location messages into group chats/social features Attractive for carpool/ETA groups Crosses individual-user privacy boundary for a feature whose users didn't opt in to being broadcast—must be user-initiated share only Trip-sharing feature (differentiator above) — always explicitly user-triggered

Feature Dependencies

Telegram search UX (commands, followup flow)
    └─requires──> Destination search (gazetteer + geocode)
                      └─requires──> KL spec: gazetteer + abbreviations, tolls map defaults
    └──enhances──> Venue message (sendVenue)

Mini App launch (startapp deep-link)
    └─requires──> Telegram search UX (you need a destination to carry)
    & ──requires──> LocationManager (geolocation permission, origin)

LocationManager (origin)
    └─requires──> Privacy UX (permission fallback path)

Route calculation
    └─requires──> Destination search ✔ & Current location ✔
    └──enhances──> Speed limit display (routes intersect maxspeed data)

Toll-free routing option
    └─requires──> Valhalla-like costing (or OSRM multi-profile), tile rendering compatible

Turn-by-turn guidance
    └─requires──> Route calculation
    └──requires──> Missed-turn detection ──requires──> Recalculation
    └──requires──> ETA progression
    └──enhances──> Voice guidance ──requires──> TTS support (with fallback), haptics

Backgrounded chat turn-cards (hybrid guidance)
    └─requires──> Turn-by-turn guidance ✔
    └─requires──> Server-side guidance session (ephemeral state) ← privacy-positive
    └─requires──> Static map snapshot renderer (chat photos)

Mini App theming + BackButton + haptics
    └─no feature deps (platform affordances, standalone wiring)

Home-screen shortcut
    └─enhances──> search entry point (deep link with no chat needed)

Opt-in traffic weighting
    └─requires──> Server aggregator + strong privacy UI statement
    └──conflicts-in-v1──> reliability of guidance focus (scope creep risk)

Incident reports / social / gamification
    └─requires──> Opt-in traffic weighting + moderation + groups model (v2 depends on this base)

Dependency Notes

  • Guidance requires search + geolocation: the funnel must be built in this order or nothing demonstrates value.
  • Recalculation depends on off-route detection, which depends on having route geometry server-side or client-side — the chat-card fallback complicates this (server must re-match); architecture research should treat "guidance session state" as a first-class component.
  • Toll-free routing conflicts with OSRM-only choice — the routing engine decision (STACK research) is constrained by this one feature requiring good costing customization.
  • Voice guidance conflicts with iOS webview reliability — do not make voice the only modality; haptics + turn-cards carry the same information.
  • Privacy features are not feature-isolated: "no tracking" is visible only if the architecture research confirms ephemeral server-side sessions; otherwise it's a lie.

MVP Definition

Launch With (v1)

  • /start onboarding + /help — the Telegram UX starts here; zero-cost
  • Destination search (Photon/gazetteer, KL-bounded, alias + abbreviation normalizer) — a local POI failure here kills everything downstream
  • Venue card in chat (sendVenue) — native, instant trust and clarity that we understood the destination; also "Arrive location" visually in chat
  • Mini App launch with destination in startapp — the webview must not make the user re-input
  • Geolocation via LocationManager + chat location-send fallback — the origin side of the funnel
  • Route draw + alternatives (2–3 cards, time/distance) + Mini App route-choice screen
  • Turn-by-turn guidance screen (next-maneuver banner + collapsible full list)
  • Missed-turn detection + auto recalculation — the "is this real navigation" test
  • ETA + remaining distance progression — minimum viable "live" feel
  • Haptic turn cues — cheap, eyes-free, no TTS risk
  • BackButton, close-confirmation during active guidance, disable swipe-close — platform behavioral hygiene
  • Theme integration (light/dark) + Rams map colors — direct PROJECT.md "design fidelity" requirement
  • Home-screen shortcut + deep link startapp retrieval — one call + one param parse, major retained-UX payoff
  • Privacy statement visible in-product (Mini App onboard + /privacy) — brand promise made concrete

Add After Validation (v1.x)

  • Voice guidance with tested webview TTS + mute-by-default — once driving flow is reliable; important for real point-A-to-point-B daily use
  • Backgrounded chat turn-cards w/ static map snapshot + server-side guidance session — this is the flip-side of the hybrid; requires an ephemeral background session design (authentic differentiator, worth planning as its own phase rather than bolting on)
  • Live-trip share via sendLocation/editMessageLiveLocation — single feature, high family-safety utility
  • Toll-free route toggle (if engine switch justified; Valhalla costing) — matters to many KL commuters; ship once route core is solid
  • Speed limit display where OSM has maxspeed — incremental accuracy on majors
  • Home-screen tiles caching / modest offline trip radius — stub for future robustness

Future Consideration (v2+)

  • Opt-in anonymized crowd speed/aggregated data → smarter ETAs — only after the privacy brand is established and the core trips are proven; the moderation/consent/alert infrastructure for incidents follows this
  • Incident reports + broadcasts (already deferred per PROJECT.md) — big scope including moderation
  • Regional groups/carpool social (already deferred) — unvalidated hypothesis per PROJECT.md Out of Scope
  • Speed-camera (AES) layer — only with legal clarity; lives with the incident family

Feature Prioritization Matrix

Feature User Value Implementation Cost Priority
Telegram onboarding (/start, /help, commands) HIGH LOW P1
KL-accurate destination search w/ aliases HIGH HIGH P1
Mini App launch + BackButton + theme HIGH LOW–MED P1
Geolocation (LocationManager + fallback) HIGH MEDIUM P1
Route + alternatives screen HIGH MEDIUM P1
Turn-by-turn map guidance HIGH MEDIUM–HIGH P1
Missed-turn recalculation HIGH MEDIUM–HIGH P1
ETA progression HIGH LOW P1
Haptic turn cues MED LOW P1
In-product privacy statement MED (brand-critical) LOW P1
Home-screen shortcut MED LOW P1
Venue cards in chat MED LOW P1
Voice guidance HIGH HIGH P2 (v1.x)
Backgrounded chat turn-cards HIGH HIGH P2 (v1.x)
Live-trip share MED–HIGH LOW P2
Toll-free routing toggle MED–HIGH (KL) MEDIUM P2
Speed limit display MED MEDIUM P2
Opt-in traffic weighting MED (sets v2) HIGH P3
Incident reports / social MED HIGH P3 (v2, per scope)

Priority key: P1 = must have for launch; P2 = should have, add when possible; P3 = future consideration.

Competitor Feature Analysis

Feature Waze Google Maps OsmAnd Our Approach
Missed-turn recalculation Instant, aggressive; the fastest in class Instant, calm Good, slower Auto-instant; the "is this real navigation" bar
Alternatives on route screen Up to 3, plus Waze community flavor 2–3 + date/arrival estimates List form 2–3 quiet Rams cards; time + distance + one-line reason
Voice guidance Full characterful TTS Full TTS Yes (recorded + TTS) v1.x; mute-by-default, haptic-first, webview-TTS honest fallback
ETA accuracy in KL traffic Best-in-class (crowd-sourced) Very good Weak (no traffic) v1 honest local self-paced ETA; opt-in aggregate traffic later
Speed limit + cameras Speed limits everywhere + AES pings (crowd) Patchy speed limits, no speeds in MY? infrared source dependence Maxspeed from OSM Show where OSM is confident; no camera layer in v1 (defer with reports)
Social / incident reports Core-identity feature (reports, chat, feeds) Incorporated lightly (accidents/fog/police icons) Community map editor only Deliberately absent v1; opt-in crowd-speed is the v2 social replacement, privacy-first
Privacy story Profiled, sold-into Google ecosystem Full behavioral pipeline Excellent (offline-capable, no tracking) Best-in-class and visible: ephemeral session, stored nothing, stated on every screen entry
Form factor Native app store install Native app Native app Telegram chat + Mini App — zero install, destination search where conversation lives
Toll awareness Routed with tolls, options Good toll toggle OSM routing tagging support Expected KL feature; togglable, one prominent toggle

Sources

  • Telegram Mini App Web Apps platform docs (core.telegram.org/bots/webapps) — BackButton, LocationManager (Bot API 8.0, Nov 2024), full-screen/safe-area/addToHomeScreen/startapp deep-linking/themeParams/HapticFeedback/DeviceStorage, disable/enable vertical swipes, closing confirmation — verified against the current released API docs — HIGH confidence
  • Telegram Bot Features guide (core.telegram.org/bots/features) — commands, global commands (/start,/help,/settings), reply/inline keyboards, sendVenue location/venue messages, live location + editMessageLiveLocation, privacy mode — HIGH confidence
  • Waze vs Google Maps comparisons 2025–2026 (ZDNet 2026-07, PCMag 2026-07, USA Today 2025-07) — rerouting-aggressiveness, speed-limit display behavior, Waze popularity with drivers — MEDIUM confidence (third-party review articles)
  • OSM Malaysia quality studies (ResearchGate "Quality of OSM in Malaysia" preliminary assessment) — OSM completeness in MY described as "...good relative positioning in road features, but still poor in terms of completeness (POI coverage)" — MEDIUM-HIGH confidence (peer-reviewed-adjacent research)
  • Telegram live locations blog (telegram.org/blog/live-locations) — live-location primitive behavior — HIGH confidence
  • Routing engine capability notes (GitHub OSRM/Valhalla issues + ecosystem articles) — OSRM does not have native toll-exclusion costing; Valhalla costing supports use_tolls etc. — MEDIUM confidence (engineer-sourced, not yet doc-fetched)
  • Domain knowledge / training-data reasoning (flagged LOW, verify at phase research): webview TTS iOS reliability (WKWebView speechSynthesis quirks), exact OSM maxspeed completeness levels per KL arterial, exact AES camera data availability in OSM — LOW confidence, needs phase-specific verification before planning voice/speed features

Feature research for: Privacy-respecting Telegram-first GPS navigation app (ararahah, KL metro) Researched: 2026-10-22