← Mockups

Gerobak · PRD v2.0.1

Download source Markdown

# Gerobak: Product Requirements Document

| | |
|---|---|
| **Status** | **v2.0.1 · Ready for tech design**, except F-16 and F-18, which wait for a CTO effort check. Owner question open: Q7; neither blocks the demo |
| **Date** | 2026-10-28 |
| **Owner** | Product owner (decisions), Pia (PM) |
| **Market** | Bali, Indonesia. Canggu and Seminyak first |
| **Current phase** | Phase 0: demo for the Bali counterpart |
| **Mockups** | `../mockups-v3/index.html` (the GitHub app design, D29). Earlier sets kept as history: `../mockups/`, `../mockups-v2/`, `../opendesign/` |
| **Replaces** | v0.9 (2026-10-25). The v0.9 features that were removed are kept in section 13 (Phase 3) so none of the thinking is lost |

Indonesian words in **bold** are the labels used in the app. **(proposed)** marks a default that Pia set and the pilot should test.

---

## Changelog

### v2.0.1 (2026-11-01): Phase 0 rules after CTO review
- The seller enters a variable item's **unit price for one portion** each time it sells. The line amount is unit price × portions; whole rupiah only, from Rp 1 to Rp 5.000.000 per portion. A blank or invalid amount blocks saving. Fixed-price sales keep the three-tap path.
- In Diikuti, tab counts cover all followed carts in each status and do not change with search. Search only filters the selected tab. Buka sorts by distance; Tutup sorts by most recent open time. A status change moves the cart between tabs while preserving the search text.
- Onboarding location means the seller's **labelled usual selling area**; the live map position comes from the phone while Buka. Step 1 stays as an on-device draft if the seller leaves; no shop appears to admin until step 2 is saved.
- Mockup sizing: body 14–15 px, numbers 13–14 px, secondary 11–12 px (11 only for nonessential detail), controls at least 44 px; the collapsed map occupies at least 55% of the 800 px phone screen. This is the target for the app screens too.
- Sales lists show exact rupiah, with aligned right edges. Use at least 100 px for the amount column. A cart with a fixed-price item shows the lowest available fixed price as *mulai*; an all-variable cart shows *Harga sesuai pesanan*. The Peta sheet lists only open followed carts and links to the full tabbed Diikuti view.
- Kai estimates D37–D41 add 11–15 engineer-days to Phase 0; no new recurring cost. F-18 remains outside the prior 55–65-day estimate.

### v2.0 (2026-11-01): compact screens and variable prices
- **D37:** Penjualan uses aligned columns for time/day, item or portions, and takings. Seven-day details use the same columns; a variable-price sale contributes the amount entered at sale time.
- **D38:** Use a denser type and spacing scale on mockups, with the map given more of the phone height. Keep primary actions at least 44 px high and core text legible.
- **D39:** Diikuti has Buka and Tutup tabs and a name/dish search within the selected tab. Status changes move the cart to the matching tab; the search is preserved.
- **D40:** Seller setup has two steps: shop identity (name, photo, cart type, location) then menu. Keep entered values when moving back or when validation fails. At least one menu item is needed to finish.
- **D41:** Each menu item has either a fixed price or *Harga sesuai pesanan*. The latter has no shown numeric price; the seller enters its actual amount when recording the sale. That amount is required, positive and included in totals. The three-tap path still applies to fixed-price items.

### v1.9 (2026-11-01): open map, reviews on the cart page, sales per menu, no demo in admin
Owner: four changes.
- **The admin demo page is gone (D33).** The admin console is now just Penjual and Pantau visibilitas. The Phase 0 simulation stays, but it is no longer an admin screen: the team turns it on before the demo, and nothing about it is visible to sellers, buyers or admins.
- **7 hari terakhir opens per day (D34).** Tap a day and it shows which menu sold, how many portions and how much each dish took; the day's totals stay in the row. Days with no sales open to a plain "Tidak ada penjualan hari itu."
- **Reviews show on the cart page (D35, Q8 closed).** Average, count and the latest reviews are on the cart page from Phase 0, with "Ulasan baru" until there are 3. Writing a review stays P1, because it needs proof of a visit.
- **Peta opens without an account (D36).** The map, list and search work signed out. Opening a cart, Ikuti, ulasan, saved places and alerts ask for sign-in, once, on top of the same map. D4 is superseded; the sign-in-before-map rule no longer applies.
- Mockups: `admin-demo.html` removed; new states in `seller-sales.html` (05, 06), `buyer-cart.html` (07) and `buyer-map.html` (05, 06). No other look change.

### v1.8.3 (2026-11-01): Manrope is the typeface (D32)
Owner: "Much better. Now explore alternative fonts." Five typefaces were drawn on the real screens (`../mockups-v3/font-lab.html`), and the Owner chose **Manrope**.
- Manrope replaces Plus Jakarta Sans in every mockup. Sizes, weights, colours and spacing are unchanged, so no acceptance test changes.
- A **Typeface switch** at the bottom right of every mockup page flips the whole page live between Manrope, Plus Jakarta Sans, Inter, DM Sans and Nunito Sans. It is a static, script-free switch and starts again at Manrope on each page.
- Checked with Manrope: no text spills past the phone edge on any of the 13 pages, no row or button clips its text, and the 7-day list and price columns still line up.
- The app itself still ships Plus Jakarta Sans. Bundling Manrope is a build change for the CTO, not a product change.
- Q9 is closed.

### v1.8.2 (2026-11-01): section headings stand apart (D31)
Owner: improve “Menu”, “7 hari terakhir”, “Hari ini · 13 porsi · Rp 252 rb”, and similar section headings.
- Section headings sit on white bands with a divider separating their content; headings remain smaller than screen titles.
- “Hari ini” is a separate heading, with portions and sales total on the next line.
- The same treatment covers menu setup, saved places, followed/nearby groups, and admin sections. Headings already inside white cards use a divider without adding another card.
- Existing GitHub styling, features, priorities and acceptance tests stay unchanged. Design-system section 06 documents the pattern, with a before/after of the Penjualan screen.
- Adds **Q9** (typeface) and the `font-lab.html` page: the Penjualan and Gerobak screens in Plus Jakarta Sans, Inter, Manrope, DM Sans and Nunito Sans, same sizes and weights. No decision yet.
- Published on the same preview link (gerobak-v1-mockups-static-mockups-for-gerobak-v1-vj8y6xxayq.openbot.site) on 2026-11-01, replacing v1.8.1 there; all 13 pages checked, and the D30 version is kept in `../mockups-v3-before-d31/`.


### v1.8.1 (2026-11-01): headings get their own white surface
Owner: "Di sekitar Anda", "Siomay Mas Joko", "Halo, Rizky" and "Isi toko Anda" still blended into the background. The text was already dark and bold (about 16:1 contrast), but each heading sat on the same grey-blue ground as everything around it (D30).
- Screen titles sit in a white header band under a white status bar, with a hairline divider and a soft shadow. Titles are 28 px, with a small blue overline (for example "Profil" or the shop name).
- The map sheet has a white head with "Di sekitar Anda" (24 px) and the search box. The list stays below on the ground.
- The cart page shows the name, status and tags on a white block under the photo. The menu sits below.
- Admin page titles sit on a white title bar.
- Applied to all 12 pages. The design-system page shows the before and after.
- Look only: no feature, priority or acceptance test changed. The rest of the D29 GitHub design stays.

### v1.8 (2026-11-01): mockups follow the GitHub app design
Owner: the existing app design on GitHub is much better than the redesigns. Keep it; only fix headings and titles that blend into the background (D29).
- New mockups in `../mockups-v3/`: every P0 screen rebuilt in the app's own style (blue, rounded white cards, map with a bottom sheet, round BUKA/TUTUP disc, Habis buttons, Plus Jakarta Sans).
- Heading fix: screen titles 26 px weight 800 in navy; sheet titles 22 px; card titles 17 px; small labels 12 px bold dark grey; secondary text darkened from #8C949F to #4F5B6B.
- D29 replaces the visual parts of D22, D23 (bar instead of disc, Habis switch, tab named Toko saya), D24 and D28. The seller's third tab stays **Akun**, opening on Toko saya, as F-16.AC1 says.
- One phone per state (Android 360 × 800). iOS uses the same screens; only sign-in adds Sign in with Apple.
- The GitHub dark-mode setting is left out (not in scope). The GitHub "Studio demo" panel becomes the admin Demo page.
- No feature, priority or acceptance test changed.

### v1.7 (2026-11-01): OpenDesign redesign proposal
Owner requested OpenDesign and chose **Create a new system**. D28 keeps the blue brand and existing P0 scope, with a new layout and component proposal.
- New source: `../opendesign/mockups/gerobak-redesign/index.html`; reusable system in `../opendesign/design-systems/gerobak-product/`.
- Solid white headers, white outlined groups, 6 px cards/buttons and 4 px chips. Android 360 × 800 and iOS 393 × 852 remain side by side. Body sizes remain 16/17 with 13 secondary copy.
- Buyer, seller and admin pages include their main failure states. Photos and maps are labelled placeholders/illustrations; all data is illustrative.
- Seller onboarding and information ownership (D27), visibility control (D26), freshness rules, three-tap cash sale and sign-in requirements are unchanged.
- No new P0 feature or acceptance criterion. Reviews remain P1 and Q7/Q8 remain open. The new visual system is a review proposal; no claim of app implementation or real-device timing verification.
- Published 2026-11-01 on the existing preview link (the server allows one site), after a browser check of all 12 pages. The earlier v2 mockups stay in `../mockups-v2/` as history and can be republished.

### v1.6.1 (2026-11-01): seller information belongs to the seller
Owner clarification (D27): sellers supply and maintain all their shop information. Admins read it and decide whether the seller may appear to buyers; they never create or edit seller details.
- F-01 moves from the admin console into the seller app. Field agents coach the seller; they do not enter information through the console.
- F-08 shows seller-provided details read-only, with **Tampil ke pembeli** as its only seller-management change.
- F-12 accepts a new seller number after its one-time code; the seller then completes their shop information. Returning sellers keep their existing account.
- Admin editing on a seller's behalf is removed from Phase 1 too. Corrections come from the seller.
- D26 visibility timing and hidden-seller behaviour stay unchanged. This is a product clarification; revised onboarding effort still needs the CTO check.

### v1.6 (2026-11-01): the admin console gets simpler: one visibility switch
Owner: the admin console is too much for now (D26). **No P0 feature was added or removed**: F-08 got smaller, and F-18 gained one rule about hidden sellers.
- **Removed:** the **Daftar menu** page. The dish list is fixed and ships with the app; adding or renaming a dish is P1.
- **Removed:** editing a seller's profile and menu from the console, and the separate **Nonaktifkan** flow.
- **Added:** one **Tampil ke pembeli** switch per seller. Off hides the seller from the buyer map and lists within 1 minute, stops them tapping Buka, and their phone says *Disembunyikan admin*.
- **F-18** doesn't count hidden sellers as Buka or Hilang, and names them in one line under the numbers.
- **Mockups:** `admin-sellers.html` (one switch, dish-list screen removed), `admin-monitor.html` and `admin-demo.html` (nav without Daftar menu). Demo script gains a step: the admin hides and restores Pak Made.

### v1.5 (2026-11-01): admin visibility monitor
- **New F-18 Pantau visibilitas (P0):** the Owner asked for a quality-control screen where admins see which sellers are visible to buyers. One live list and map of all real sellers, problems first, with a likely reason and a one-tap WhatsApp to the seller (D25).
- Mockup: `../mockups-v2/admin-monitor.html` (laptop, 2 states).
- Effort not yet checked by the CTO.

### v1.4.1 (2026-11-01): solid headers, cards, smaller corners
Look only. **No requirement, feature or acceptance test changed.**
- Owner feedback: some content blended into the background, especially headers, and corners were too round (D24).
- **Headers:** every screen title sits on a white bar with a divider line, including the status bar area.
- **Cards:** content groups (cart title block, profile header, stats, lists, status) sit on white cards with a thin outline.
- **Corners:** cards 8, buttons 8, the big BUKA button 10, chips 6, tags 4, sheets 16 (were 16–28 and full pills).
- Sign-in and the location explanation are full white screens.

### v1.4 (2026-11-01): design redone from scratch for Android and iOS
The Owner asked to research the design from scratch, for both platforms. **No requirement or acceptance test changed**; three layout calls changed (D23).
- **New mockups:** `../mockups-v2/` (open `index.html`). Every screen state is drawn on Android (360 × 800 dp) and iOS (393 × 852 pt) side by side. The v1 folder stays as history.
- **One design, two native skins (D22):** shared colours and content; each platform's own fonts (Roboto, SF Pro), bars, back, tabs, switches, segmented controls and sheets. Brand blue stays (D19).
- **Research page** (`research.html`): who and where, the platform rules we follow (48 dp / 44 pt touch targets, 16 / 17 body text), map-app patterns, and what changed from v1.
- **iOS sign-in shows Sign in with Apple next to Google** (Apple's App Review guideline 4.8), in Phase 1 with the iOS app.
- **Research supports Q7 option B:** on both platforms "Always" location is a second, separate step after "while using".

### v1.3 (2026-11-01): blue stays; layout and sizing revamp
Look only. **No requirement, feature or acceptance test changed.**
- The Owner tried a black-and-white style (D20), then chose to **keep the app's blue** (D19 stands) and fix **layout and sizing** instead (D21). D20 is withdrawn.
- **Real phone size:** mockups are now drawn at 360 × 780, a common Android size, instead of 300 wide, which squeezed every screen.
- **Type scale:** body 15–16 px, secondary text 13 px, nothing below 12 px. Titles 20 / 24 / 28 px.
- **Lists:** each row is photo, name and one line of facts, then status. Nothing wraps; long text ends with "…". Rows are at least 72 px tall.
- **Spacing:** one 8-point grid, 16 px side margins, 16 px between blocks.
- **Tap targets:** buttons 52 px, small buttons, chips and round buttons 44 px.
- **Seller home:** the BUKA/TUTUP button grows to 200 px, with room around it.

### v1.2.1 (2026-11-01): mockups follow the app's blue look
Mockups only. **No requirement, feature or acceptance test changed.**
- The Owner asked for the mockups to follow the current app's blue colours (D19, replaces D10).
- Every mockup page is recoloured: grey-blue ground `#F4F7FB`, blue for action `#1E6BFF`, navy `#0D1B2E` for the dark button and active chips, green `#12A37D` for open, white cards. Titles are less heavy, as in the app.
- The values come from screenshots of the current demo app. Where a shade differs, the app's own colour wins in the build.

### v1.2 (2026-10-29): sellers set up their own page
The Owner asked for a page where the seller sets up the menu with photos and descriptions, sees how many people follow them, and sees reviews like Google reviews.

- **New F-16 Toko saya (P0):** in the seller's Akun tab. Cart photos (up to 5), a short description, and a photo and description per menu item. Shows the follower count. The seller can add, change and delete menu items themselves; before, only the field agent could (D17).
- **New F-17 Ulasan (proposed P1, Q8):** star ratings and short reviews, only from buyers who were near the cart while it was open; the seller can reply and report but not delete (D18). Reviews were in Phase 3 (section 13); this brings them forward to the pilot.
- **F-02 and F-05:** a menu item now has an optional description; the cart page shows the cart description, item photos and descriptions, and the follower count.
- **Mockups:** new `seller-toko.html` (6 screens; screens 4–6 are P1).
- **Effort:** F-16 waits for Kai's estimate. Ready status for everything else is unchanged.

### v1.1 (2026-10-28): CTO pressure test folded in · Ready
Kai's check: nothing blocks the demo. About 55–65 engineer-days in total (CTO estimate, section 13.1). Changes:

- **Two apps, Pembeli and Penjual** (D11, closes Q5). The Play Store allows one "location while closed" feature per app, and the seller app needs it for Buka.
- **Acceptance tests made testable:**
  - F-04.AC6: the pin updates within 30 s of the cart's latest position, not of every movement. F-04.AC3: Habis items don't count as available.
  - F-08.AC1: the cart leaves the map within 1 minute; the seller's phone is signed out the next time it connects.
  - F-11.AC1: **Tunai is preselected**, so one cash sale is 3 taps: + Penjualan, item, Simpan (D13).
  - F-13.AC1: admins see exact counts; the "hide under 3" rule applies to what sellers see in membership. Defined what counts as a search and which area it counts in (D15).
  - F-03.AC2: tested on a real phone. F-07.AC1: the seller's own views don't count. F-10.AC1: a freshness rule and a ±100 m tolerance.
- **Moved to P1, invisible in the demo** (D14): editing a sale (delete stays), and changing the dish list (there is no console page for it in Phase 0; D26).
- **New:** F-09.AC4, the simulation stops on its own after 2 hours, to stay inside the current hosting budget (D16).
- **Share links** use a free temporary address in the demo; an own web address comes with the pilot (D12).
- **Phase 1** now lists the paid items for the Owner and the pilot-only work (maps, street names, store listing).
- **No P0 feature was added or removed.** D3 is unchanged; Kai recommends a change, which is open as Q7 for the Owner.

### v1.0.1 (2026-10-28): mockups follow the existing app
Mockups only. **No requirement, feature or acceptance test changed.**

- The mockups now continue the **existing app's design system** (D10) instead of a new one: cream ground, white borderless cards, coral for action, ink pills, pastel emoji tiles, heavy display type.
- Colours, radii and weights are sampled from the app's own screens. Where a value differs by a shade, the app's token wins in the build.
- Restyled pages: sign-in (buyer and seller), the map with the app's header and pins, the cart page, the seller home with the round BUKA/TUTUP control, and the design system page.

### v1.0 (2026-10-28): visibility first
The Owner refocused the product: **Gerobak is first a visibility app.** Buyers see the carts around them. Sellers get a new distribution channel just by broadcasting where they are. Anything that is hard on day one is removed.

- **Kept:** onboarding, profile and menu, Buka/Tutup with live location, map and nearby list, cart page, follow.
- **New:**
  - **F-10 Dekat Anda**: a push when a followed cart is near the buyer (D3)
  - **F-11 Catat penjualan**: the seller records a sale in 3 taps (D5)
  - **F-13 demand signals**: buyer searches and cart page views counted by area and hour (D6)
  - **one global notification switch** (D7)
- **Sign-in is asked at the first action**, not before the map (D36, supersedes D4).
- **Removed for now (moved to Phase 3, section 13):**
  - Teriak (shout) and the yes/no claim
  - QR ordering and QRIS payment
  - Transaksi, Keuangan, cash drawer, Cek awal, Stok perkiraan
  - Jadwal pintar, Rencana hari ini, Peta keramaian, the heatmap and forecast
  - Komunitas, Reviews, the sponsored Populer row
  - Pengingat, seller tiers and billing, the Free 4-hour limit
- **Simplified:**
  - The seller app has 3 tabs (Beranda, Penjualan, Akun) instead of 5.
  - The buyer app has 3 tabs (Peta, Diikuti, Profil).
  - The notifications drop from 16 kinds to 2.
- **Membership** for sellers (demand locations, sales history and more) is planned for Phase 2 (D8). Phase 0 and the pilot are free (D1).

---

## 1. Summary

Gerobak shows **where street-food carts (*gerobak*) are right now**.

- **Buyers** open a map, see the open carts around them with what they sell, follow their favourites, and get a push when a favourite opens or comes near.
- **Sellers** tap **Buka** and appear on the map. It's a new way to be found, far beyond the bell's range. They record each sale in 3 taps and see their day's takings.
- **Gerobak** builds a data asset as a side effect: where carts go, what sells where and when, and what buyers look for. Later a paid **seller membership** turns that data into insights (Phase 2).

---

## 2. Problem

| Who | Problem today | Tag |
|---|---|---|
| Buyers | Roaming carts are found by sound (the bakso bell, the nasi goreng "tek-tek") or by luck. You can't tell what's nearby or when your favourite cart passes | Assumption (from v0.9 and the Owner) |
| Sellers | Their only "marketing" is a bell with a short range and a habitual route. Regulars (*langganan*) lose track of a cart that moves | Assumption |
| Sellers | Many keep no record of sales, so they can't tell which spots and hours pay off | Assumption, to validate in the pilot |
| Market | Delivery apps (GoFood, GrabFood) serve fixed shops. Roaming carts are largely unserved | Assumption |

**Opportunity:** a digital bell with a much bigger reach. Every Buka, sale and search becomes data that sellers will later pay to see.

---

## 3. Options considered

| Option | Pros | Cons | Result |
|---|---|---|---|
| **A. Visibility first** (map, follow, alerts, simple sales record) | Easiest to explain and build; useful from the first cart; builds data from day one | Less "wow" than shouting; earns nothing until membership | **Chosen by the Owner (D0)** |
| B. Shout and claim (v0.9 Teriak) | New and exciting; the buyer gets the cart to come to them | Needs many active sellers answering live, or shouts go unanswered | Phase 3 |
| C. Cashier and books (v0.9 Transaksi and Keuangan) | Used daily | Competes with free tools (BukuWarung, Qasir); payments and merchant onboarding are heavy | Only the 3-tap sale record is kept (F-11) |

**Cons accepted:** no buyer-to-seller call in v1, and no revenue before membership.

---

## 4. Goals and metrics

| ID | Goal | Metric | Target |
|---|---|---|---|
| G1 | Buyers find open carts near them, and what each one sells, in seconds | Time from opening the app to seeing the first cart; share of sessions that open a cart page | To validate in the pilot |
| G2 | Sellers get a new channel: more people see them | Cart page views per seller per day; new followers per seller per week | To validate |
| G3 | Followed carts bring buyers back | Share of buyers with at least 1 follow; share of pushes that are tapped | To validate |
| G4 | Build the data asset | Share of Buka hours with location; sales recorded per Buka day; searches per day | To validate |
| G5 | Phase 0: the demo convinces the Bali counterpart | Every step of the demo script (section 12) works on two Android phones twice in a row, with a reset in between | Pass |

No targets are set yet because there is no real data. The pilot sets them.

---

## 5. Users

| ID | Persona | Needs |
|---|---|---|
| P1 | **Local buyer**: lives or works in Bali and buys from carts often | Know when their usual cart is open and near; find something new close by |
| P2 | **Tourist buyer**: in a villa or guesthouse, curious about street food | See what's around, prices, and whether it contains pork |
| P3 | **Roaming seller**: push cart or motorbike cart moving through neighbourhoods | Be found; keep regulars; little typing |
| P4 | **Regular-spot seller**: the same corner most evenings | Let people know they're open |
| P5 | **Field agent**: our Bali team member who helps sellers sign up in person | Coach sellers through setting up their own shop and menu |
| P6 | **Admin**: runs the platform and the demo | Read seller information, control who buyers can see, run the demo |

For now one seller = one cart = one phone. The owner is the seller.

---

## 6. Journeys

### J1: A buyer finds a cart nearby (P1, P2)
1. Opens Gerobak, signs in with Google and accepts the terms (F-12).
2. The map centres on them and shows open carts within 3 km (F-04).
3. Searches "bakso", or taps a pin or row → cart page (F-05).
4. Sees the menu, prices, pork label and last seen → walks there.

**Unhappy paths**
- **Location denied:** the map opens on Batu Bolong, Canggu, with a banner, *"Aktifkan lokasi untuk melihat gerobak di sekitar Anda"*.
- **No carts within 3 km:** *"Belum ada gerobak buka di sekitar Anda"*, plus the followed carts.
- **The cart hasn't reported in a while:** dimmed, *"terakhir terlihat 14 menit lalu"*. After 30 minutes it's hidden.
- **No signal:** the last map stays, with *"Tidak ada koneksi"*.
- **Declines the terms:** signed out, back to the sign-in screen.

### J2: A buyer follows a cart and gets alerts (P1)
1. Taps **Ikuti** on a cart page (F-06).
2. First follow only: a short screen explains why the app needs location. The phone asks for permission (F-10).
3. "Always allowed" → alerts near wherever they are. Otherwise → save a spot (Rumah or Kantor).
4. Later: *"Bakso Pak Made buka"*, and *"Bakso Pak Made 300 m dari Anda"* → tap → the map flies to the cart.

**Unhappy paths**
- **Denies location and skips saving a spot:** "open" alerts only, and Profil shows a reminder.
- **Notifications blocked on the phone:** a banner in Profil with a button to the phone's settings.
- **Too many alerts:** turn off **Notifikasi gerobak favorit**, or unfollow the cart.
- **Takes the permission away later:** the app switches to the saved spot and says so once.

### J3: A seller opens and is visible (P3, P4)
1. Signs in once with phone number and code (F-12). Stays signed in.
2. Taps **BUKA** (F-03) → appears on buyers' maps within a minute and followers get a push.
3. Moves around. The position keeps updating, even with the screen off.
4. Taps **Habis** on an item that's sold out (F-02).
5. Taps **TUTUP** → disappears from the map.

**Unhappy paths**
- **Location off on the phone:** Buka is refused, with a button to turn location on.
- **No signal for a while:** the cart shows as "last seen" and positions upload later.
- **The phone kills the app in the background:** onboarding asks to remove battery limits. If the cart goes 30 minutes without reporting, it's hidden, and the seller sees *"Gerobak Anda tidak terlihat. Buka aplikasi."* when they return.
- **Forgets to tap Tutup:** after 30 minutes without a report, the cart is hidden. At midnight Bali time it's closed automatically **(proposed)**.

### J4: A seller records a sale (P3, P4)
1. While Buka, opens **Penjualan** and taps **+ Penjualan** (F-11).
2. Taps items (one tap = one portion), picks **Tunai** or **QRIS**, then **Simpan**.
3. Beranda shows *"Hari ini: 23 porsi · Rp 345.000"* (F-07).

**Unhappy paths**
- **Not Buka:** the button is disabled, with *"Buka dulu untuk mencatat penjualan"*.
- **No signal:** the sale is saved on the phone and uploaded later.
- **A mistake:** delete the sale the same day and record it again. Editing a sale comes in P1 (D14).

### J5: A seller sets up their shop, with coaching if needed (P3, P4, P5)
1. In the seller app, the seller verifies their phone number and accepts the terms (F-12).
2. They complete shop details first: name, cart photo, type, location and payment methods. Next they add at least one menu item, choosing a fixed or variable price and the pork flag (F-01).
3. They save. The admin can read the submitted information and control **Tampil ke pembeli**, without changing any detail (F-08).

**Unhappy paths**
- **The number is already registered:** sign in to the existing shop; never create a second shop for the same number.
- **A required detail is missing:** keep the entered information and highlight what must be completed.
- **The dish isn't in the list:** use **Lainnya** for now; adding dishes is P1.
- **A detail is wrong:** the seller corrects it in **Toko saya**; an admin may contact them but cannot make the correction.

### J6: The presenter runs the demo (P6)
See the demo script in section 12.

---

## 7. Features

Priorities: **P0** is needed for Phase 0, **P1** comes next, **P2** later.

### F-01 · Seller-provided onboarding (P0)
*As a seller, I want to enter my own shop information, so buyers and admins see the details I provide.*
- All shop details come from the seller app, including the name, phone, cart type, payment methods, photos, descriptions, menu, prices and pork flags. A field agent may coach the seller in person.
- **F-01.AC1:** Given a seller has verified their number and accepted the terms, when they complete step 1 with name, cart photo, cart type and location, then step 2 with at least one menu item, a fixed price or variable-price choice, and pork flag, then their shop is created and the admin sees the same submitted information read-only. The location is a labelled usual selling area, not the live map position.
- **F-01.AC2:** Given a phone number already belongs to a shop, when its owner signs in, then that existing shop opens and no duplicate shop is created.
- **F-01.AC3:** Given the seller adds photos, when they save, then the same photos are available in their shop information for the admin to read and on the buyer page when visibility permits.
- **F-01.AC5:** Given a new seller, when they complete step 1 and go to step 2, then their shop details remain filled if they go back; they cannot finish without at least one valid menu item. If they leave before step 2, step 1 stays on that phone; no shop is created or visible to admin until step 2 is saved.
- **F-01.AC4:** Given required details are missing, when the seller saves, then the incomplete fields are identified and their entered information is retained.

### F-02 · Seller profile and menu (P0)
*As a seller, I want buyers to see what I sell and the prices, so they come to me.*
- **Profile:** name, cart photo, cart type (*berkeliling* roaming, *menetap* regular spot, fixed), payment methods accepted (Tunai, QRIS, as information only).
- **Profile** also has an optional description (up to 160 characters) and up to 5 cart photos (F-16).
- **Menu item:** name, either a fixed price (Rp) or *Harga sesuai pesanan*, one dish from the dish list, contains pork yes/no; photo and description (up to 80 characters) optional.
- **Pork label:** *Mengandung babi* if any item contains pork, otherwise *Tanpa babi*.
- **Dish list:** three levels (kind, group, dish), from v0.9 section 7.2. It drives search.
- **F-02.AC1:** Given a seller, when they tap **Habis** on an item, then buyers see it marked Habis within 1 minute.
- **F-02.AC2:** Given any item contains pork, when a buyer opens the cart page, then *Mengandung babi* shows next to the name.
- **F-02.AC3:** Given a seller, when they tap **Habis** again, then the item is available again.

- **F-02.AC4:** Given a seller selects *Harga sesuai pesanan* for an item, when buyers see that item, then it shows that label and no numeric price or misleading starting price. The seller can switch between fixed and variable pricing when editing.

### F-03 · Buka / Tutup and live location (P0)
*As a seller, I want to be on the map whenever I'm selling, without thinking about it.*
- **Buka:** one big button on Beranda, with no form (D2). **Tutup:** the same button.
- **While Buka,** the position is shared even with the screen off. This live position comes from the phone; it is separate from the usual selling area entered during onboarding. Android shows *"Anda terlihat di peta"*.
- **Freshness** (carried over from v0.9):
  - position updated every 5 minutes or after 150 m of movement
  - **LIVE** up to 10 minutes since the last update
  - **STALE**, dimmed, from 10 to 30 minutes
  - hidden after 30 minutes
- **F-03.AC1:** Given a signed-in seller with location on, when they tap BUKA, then the cart appears on buyers' maps within 1 minute.
- **F-03.AC2:** Given Buka with the screen off for 20 minutes while moving, when a buyer looks, then the pin has moved and is LIVE. Tested on a real phone: Phone B for the demo; before the pilot, also on the low-cost Android models the pilot sellers use (field agents list them; To validate).
- **F-03.AC3:** Given Buka and no update for 10–30 minutes, when a buyer looks, then the pin is dimmed with *"terakhir terlihat N menit lalu"*. After 30 minutes it's hidden.
- **F-03.AC4:** Given location is off on the phone, when the seller taps BUKA, then it's refused with a button to turn location on.
- **F-03.AC5:** Given Buka, when the seller taps TUTUP, then the cart disappears from buyers' maps within 1 minute.
- **F-03.AC6:** Given positions recorded with no signal, when the signal returns, then they upload with their original times.

### F-04 · Map and Di sekitar Anda (P0)
*As a buyer, I want to see the open carts around me and what they sell, in seconds, without filling in a form first (D36).*
- **Map:** full screen, centred on the buyer, can be dragged and zoomed. Shows open carts within 3 km, plus followed carts at any distance (with a small heart on the pin).
- **Bottom sheet, Di sekitar Anda:** Diikuti first, then carts within 3 km by distance. Each row: name, distance, the lowest available fixed item price as *mulai* when one exists (otherwise *Harga sesuai pesanan*), main dishes, LIVE or STALE.
- **Search:** filters by cart name or menu, e.g. "keju" finds martabak keju.
- **F-04.AC1:** Given location allowed, when the buyer opens Peta, then the map centres on them and shows open carts within 3 km.
- **F-04.AC2:** Given a followed cart is open 8 km away, when the buyer opens Peta, then it's in the Diikuti section of the list.
- **F-04.AC3:** Given the buyer types "bakso", when results show, then only carts with an available bakso item are listed. An item marked Habis doesn't count as available.
- **F-04.AC4:** Given location denied, when the buyer opens Peta, then the map opens on Batu Bolong, Canggu, with a banner to turn on location.
- **F-04.AC5:** Given no open carts within 3 km, when the buyer opens Peta, then the empty state *"Belum ada gerobak buka di sekitar Anda"* shows.
- **No account needed:** the map, list and search open for a visitor who has not signed in. Only public facts show: name, distance, the lowest available fixed item price as *mulai* when one exists or *Harga sesuai pesanan*, main dishes, LIVE/STALE. Opening a cart, Ikuti, ulasan, saved places and alerts ask for sign-in (F-12.AC4).
- **F-04.AC7:** Given a visitor has not signed in, when they open Peta, then the map, the Di sekitar Anda list and search work, and tapping a cart or Ikuti asks them to sign in without losing the map.
- **F-04.AC6:** Given the map is open, when a cart sends a new position, then its pin moves within 30 seconds. (Carts send a position every 5 minutes or 150 m, so a pin can be up to 5 minutes behind the real cart. Accepted.)

### F-05 · Cart page (P0)
*As a buyer, I want to know if a cart is worth walking to.*
- **Content:**
  - photo, name, cart type, pork label, payment methods
  - LIVE, or last seen; distance
  - the cart's description and follower count (*"214 pengikut"*)
  - menu with prices, Habis labels, and each item's photo and description when set
- **Actions:**
  - **Lihat di peta**
  - **Ikuti**, or **Diikuti** to unfollow
  - **Bagikan**: a share link that opens a web page with the cart's name and menu. Phase 0 uses a free temporary web address; from the pilot, Gerobak's own address, and the link opens the app when it's installed (D12)
- **F-05.AC1:** Given a buyer taps a pin or row, when the cart page opens, then it shows all the content above.
- **F-05.AC2:** Given a cart is Tutup, when a follower opens its page, then it shows *"Tutup"* and the time it was last open.
- **F-05.AC3:** Given a buyer taps Bagikan, when the share sheet opens, then it includes a link to the cart's page.

### F-06 · Ikuti and the "open" alert (P0)
*As a regular, I want to know when my favourite cart is selling.*
- **Ikuti** from the cart page or the list. Followed carts appear in **Diikuti** under separate **Buka** and **Tutup** tabs, with a search for cart name or dish inside the selected tab.
- **Push:** *"Bakso Pak Made buka di Gg. Nyepi"* on the first Buka of the day.
- **One global switch** in Profil, **Notifikasi gerobak favorit**, on by default, for both F-06 and F-10 alerts (D7).
- **F-06.AC1:** Given a buyer follows a cart and the switch is on, when the cart opens for the first time that day, then the buyer gets one push. The second Buka that day sends no push.
- **F-06.AC2:** Given the switch is off, when a followed cart opens or comes near, then no push is sent.
- **F-06.AC3:** Given the switch is turned back on, when a followed cart next opens or comes near, then the push is sent again (still at most 1 of each per cart per day).
- **F-06.AC4:** Given the switch is on but notifications are blocked on the phone, when the buyer opens Profil, then a banner, *"Notifikasi diblokir di pengaturan HP"*, shows with a button to the phone's settings.
- **F-06.AC5:** Given a buyer taps the push, when the app opens, then the map flies to that cart.

### F-07 · Seller stats, light (P0)
*As a seller, I want proof that Gerobak brings me customers, so I keep using it.*
- **Beranda, today:**
  - *"Dilihat 48 kali"*: cart page views, counting each buyer at most once an hour
  - *"+3 pengikut"*: new followers
  - *"23 porsi · Rp 345.000"*: from F-11
- **Penjualan:** the last 7 days, one row per day, with portions and total.
- **F-07.AC1:** Given 2 buyers opened the cart page today, one of them twice in the same hour, when the seller opens Beranda, then *"Dilihat 2 kali"* shows. The seller's own views never count.
- **F-07.AC2:** Given sales recorded on 3 of the last 7 days, when the seller opens Penjualan, then 7 rows show, with zero on the days without sales.

### F-08 · Admin console (P0)
*As an admin, I want to read seller-provided information and control who buyers can see, so I can check quality without changing their details.*
- **Sellers:** list and search by name or phone. Open a read-only detail view of the seller’s name, phone, cart type, payment methods, photos, descriptions and menu, including prices and pork flags. No **+ Penjual baru**, edit or save-details controls (D27).
- **One switch per seller, Tampil ke pembeli:**
  - **On:** the seller behaves normally (F-03, F-04).
  - **Off:** hidden from the buyer map and lists within 1 minute, can't Buka, and the seller's phone says *Disembunyikan admin* the next time it connects. The account, number and menu stay, so switching it back on restores everything. If the seller was Buka, they come back only when they tap Buka again.
- **Demo codes:** each seller's demo sign-in code is shown in the list, since there is no SMS in the demo.
- **Not in the console (D26, D27):** creating sellers or editing any seller detail. Sellers enter and correct their own information. There is no **Daftar menu** page. The dish list is fixed and ships with the app; a new dish is requested from Pia or Kai and is P1.
- **F-08.AC1:** Given an admin switches a seller off while the seller is Buka, when buyers look, then the cart is gone from the map within 1 minute. The seller can't Buka, and their phone shows *Disembunyikan admin* the next time it connects.
- **F-08.AC2:** Given a seller is switched off, when the admin switches them back on, then the seller can Buka again and appears on the map at their next Buka, not before.

- **F-08.AC3:** Given a seller has saved shop information, when an admin opens its details, then the submitted values are displayed read-only with no creation or editing controls; only **Tampil ke pembeli** can change seller management state.
- **F-08.AC4:** Given an admin changes **Tampil ke pembeli**, when the seller information is read again, then every profile and menu value remains unchanged.

### F-09 · Demo simulation (Phase 0 only, no admin screen) (D33)
*As the presenter, I want a busy, believable map anywhere in Canggu and Seminyak, without a demo panel in the admin console.*
- **Carts:** 20–30 simulated carts with real-looking menus and photos, moving along real roads (push cart about 4 km/h, motorbike about 20 km/h). Buyers see them exactly like real carts.
- **Turning it on:** the team starts the simulation before the demo. There is **no screen for it in the admin console, the seller app or the buyer app**.
- **Auto-stop:** the simulation stops on its own 2 hours after it starts, and simulated carts send positions at the same pace as real ones, so a forgotten simulation can't run up the hosting bill (D16).
- **No fake history** is needed.
- **F-09.AC1:** Given the simulation is running, when a buyer opens Peta in Canggu, then at least 10 carts are visible and moving.
- **F-09.AC2:** Given a followed simulated cart, when it moves within 500 m of the buyer, then the F-10 push arrives.
- **F-09.AC3:** Given the simulation runs for 2 hours, when the time is up, then it stops on its own and simulated carts disappear from the map.
- **F-09.AC4:** Given any admin, seller or buyer screen, when it is open, then there is no control for the simulation anywhere.

### F-10 · Dekat Anda: followed cart near you (P0)
*As a regular, I want a push when my favourite cart is near me.*
- **What "near" means** depends on the buyer's location setting (D3):
  - **Always allowed:** within about 500 m of where the buyer is.
  - **Only while using the app, or denied:** within about 500 m of a saved spot, **Rumah** or **Kantor** (up to 2).
  - **Neither:** no "near" alerts. Following and "open" alerts still work.
- **First follow:** a short explanation screen, *"Agar kami bisa memberi tahu saat gerobak favorit Anda lewat di dekat Anda"*, then the phone asks for permission. If refused, the app offers to save a spot, pre-filled with the current spot. The buyer can skip.
- **Privacy:**
  - Sellers never see buyers.
  - The buyer's position is used only to check distance to followed carts.
  - No history of where the buyer has been is kept.
- **Limits:** at most 1 "near" push per cart per day (Bali time). Controlled by the global switch (F-06).
- **Timing (accepted):** when the buyer's app is closed, Android updates their position only a few times an hour, so a "near" push can arrive 10–20 minutes late or miss a cart that passes quickly. A permanent notification on the buyer's phone to avoid this is not acceptable.
- **F-10.AC1:** Given always-on location, a buyer position no more than 30 minutes old, and a followed open cart, when the cart comes within 500 m of the buyer, or the buyer comes within 500 m of the cart, then the buyer gets one push, e.g. *"Bakso Pak Made 300 m dari Anda"*. The test passes between 400 and 600 m, since background positions are coarse.
- **F-10.AC2:** Given location denied and a saved spot, when a followed cart comes within 500 m of that spot, then the push names the spot (*"…dari Rumah"*).
- **F-10.AC3:** Given a push already sent today for that cart, when it comes near again, then no second push is sent.
- **F-10.AC4:** Given the permission is taken away, when the buyer next opens the app, then a one-time message says alerts now use the saved spot, or asks the buyer to save one.
- **F-10.AC5:** Given a buyer denied location and skipped saving a spot, when they open Profil, then a reminder offers to save one.

- **F-06.AC6:** Given followed carts, when the buyer switches Buka/Tutup, then only carts with the selected status show. Both tab counts show all followed carts in that status and stay unchanged by search. Search filters the selected tab by cart name or dish; a status change moves a cart between tabs while keeping the search text. Buka sorts by nearest first; Tutup by most recent open time. An empty result names the other tab when it has carts.

### F-11 · Catat penjualan: record a sale (P0)
*As a seller, I want to record a sale in seconds, so I know my takings without a notebook.*
- **Recording:** **+ Penjualan** → tap menu items (one tap = one portion, with −) → **Simpan**. **Tunai is preselected**; tap **QRIS** if the buyer paid by QR (a label only; no payment runs through the app) (D13).
- **Stored:** items, total, method, time, and the cart's position. Fixed prices fill automatically; variable-price items require an amount during each sale.
- **Only while Buka**, so every sale has a place.
- **Works offline;** uploads later with the original time.
- **7 hari terakhir:** every day in the last 7 days, including days with no sales.
  - Tap a day and it opens to **which menu sold, how many portions, and how much each dish took**, highest portions first.
  - The day's portions and total stay in the day row; tap again to close. One day open at a time.
  - A day with no sales opens to *"Tidak ada penjualan hari itu."*
- **Today's list:** newest first, with aligned time, item and amount columns. Seven-day rows and expanded dish rows align their portions and takings columns. Each sale can be deleted the same day. Editing a sale is P1 (D14).
- **Seller data is private:** buyers and other sellers never see it (D8).
- **F-11.AC1:** Given the cart is Buka, when the seller taps **+ Penjualan**, 1 item and **Simpan**, then a Tunai sale of a fixed-price item is saved with items, total, method, time and location, in 3 taps. A QRIS sale takes 1 more tap.
- **F-11.AC9:** Given a variable-price item is selected for a sale, when the seller enters the whole-rupiah unit price for one portion (Rp 1–5.000.000) and saves, then that unit price is stored on the sale line; its amount equals unit price × portions and contributes to the sale total, day total and dish takings. Blank, zero, negative, decimal or over-limit amounts prevent saving and preserve entered items.
- **F-11.AC10:** Given the seller views today's list or seven-day details, then time/day, item/portions and amount use consistent aligned columns; exact rupiah amounts align at the right edge in a column at least 100 px wide; abbreviated *rb* amounts are not mixed with exact amounts on the same screen.
- **F-11.AC2:** Given no signal, when the seller saves a sale, then it's kept and uploaded later with its original time.
- **F-11.AC3:** Given sales today, when the seller opens Beranda, then they see today's portions and total.
- **F-11.AC4:** Given a sale saved today, when the seller deletes it, then the totals update.
- **F-11.AC6:** Given a sale saved offline and the upload is retried, when the signal returns, then the sale is counted once, never twice.
- **F-11.AC7:** Given the last 7 days, when the seller taps a day, then it shows each dish that sold that day with its portions and takings, and the dishes add up to the day's total.
- **F-11.AC8:** Given a day with no sales, when the seller taps it, then it opens to *"Tidak ada penjualan hari itu."* and no dish rows.
- **F-11.AC5:** Given the cart is Tutup, when the seller opens Penjualan, then **+ Penjualan** is disabled, with *"Buka dulu untuk mencatat penjualan"*.

### F-12 · Sign-in and consent (P0)
*As the business, we want buyers and sellers identified before they act, and the map itself open to anyone (D36, supersedes D4).*
- **Buyer:** the map opens without an account. Google sign-in is asked at the first action (F-12.AC4). Apple sign-in comes with iOS in Phase 1.
- **Seller:** phone number and a one-time code. New numbers complete seller onboarding after verification; existing numbers open their saved shop. Long-lived sign-in, so they're never signed out mid-shift.
- **Consent at first sign-in:** in plain words, what is collected and why (see section 9). Declining signs them out.
- **F-12.AC1:** Given a new buyer, when they open the app, then the map shows straight away; sign-in and consent are asked at the first action.
- **F-12.AC2:** Given a buyer declines the terms, when they tap Tolak, then they're signed out.
- **F-12.AC4:** Given a visitor who has not signed in, when they open a cart, tap Ikuti, open ulasan, save a place or set an alert, then one sign-in prompt appears naming what they tapped; after sign-in they continue where they were, and "Nanti saja" returns to the map signed out.
- **F-12.AC3:** Given a new seller verifies their number and accepts the terms, when sign-in completes, then they enter F-01 to provide their own shop information; an existing seller opens their existing shop.

### F-13 · Demand signals (P0, no screen)
*As the business, we want to know what buyers look for, where and when, so membership can show demand later (D6, D8).*
- **Counted, by area (about 460 m cells) and hour:**
  - every search: a term the buyer submits or stops typing for a moment, not every keystroke; capitals ignored
  - every cart page view
  - every follow
- **Which area:** where the buyer is, not where the map is looking. If the buyer's location is unknown, the search is counted without an area.
- **Which words:** only terms that match a dish in the dish list or a cart name are counted by name. Anything else counts as **lainnya**, and the words aren't kept, because free text can contain personal details (D15).
- **Kept only as counts per area.** Individual searches are not shown to anyone.
- **Who sees what:** admins see exact counts. In the membership (Phase 2), sellers see areas only when a count is 3 or more.
- **F-13.AC1:** Given a buyer in Canggu searches "kopi" at 19.10, when the admin views the demand counts, then the count of "kopi" for the buyer's area and the 19.00 hour has gone up by exactly 1.
- **F-13.AC2:** Given a buyer searches a term that matches no dish and no cart name, when the admin views the counts, then **lainnya** has gone up by 1 and the term itself isn't shown or kept.

### F-16 · Toko saya: the seller sets up their page (P0)
*As a seller, I want to show buyers my cart and my food the way I like, and see that people follow me, without waiting for an agent.*
- **Where:** seller app, Akun tab, **Toko saya**. The seller completes the two-step setup (F-01), with field-agent coaching if needed; afterwards they edit their own page and menu here.
- **Profile:** up to 5 cart photos (the first is the cover), name, description (160 characters), payment methods.
- **Menu:** add, change or delete an item: photo, name, fixed or variable price, description (80 characters), dish from the list, pork yes/no. The pork label on the cart page follows automatically.
- **Followers:** the total, and new followers this week. No names: sellers never see who follows them.
- **Lihat:** opens the cart page as buyers see it.
- **F-16.AC1:** Given a signed-in seller, when they open Akun → Toko saya, then they see their photos, description, follower count and menu.
- **F-16.AC2:** Given the seller changes the description or a photo and taps Simpan, when a buyer opens the cart page, then the change shows within 1 minute.
- **F-16.AC3:** Given the seller adds an item with a photo and description, when a buyer opens the cart page, then the item shows with both, and search finds it by name or dish.
- **F-16.AC4:** Given the seller marks an item as containing pork, when a buyer opens the cart page, then *Mengandung babi* shows.
- **F-16.AC5:** Given 214 buyers follow the cart, when the seller opens Toko saya, then *"214 Pengikut"* shows, and no buyer names.

- **F-16.AC6:** Given a seller edits a menu item, when they choose fixed or variable pricing and save, then buyers see the matching price display; existing recorded sales keep the amount used when each sale was saved.

### F-17 · Ulasan: star reviews (display P0, writing P1) (D35)
*As a buyer, I want to know if a cart is good before I walk over. As a seller, I want good reviews to bring me new buyers.*
- **Writing (P1):** the rules below, from the pilot. Phase 0 only shows reviews.
- **Who can review:** a signed-in buyer who has been within about 100 m of the cart while it was Buka, in the last 7 days. This keeps out reviews from people who never bought (Assumption: being near is a fair stand-in for buying).
- **What:** 1–5 stars, optional text (300 characters), first name shown. One review per buyer per cart; the buyer can change it.
- **Shown (Phase 0):** on the cart page, the average, the count, the three tags with the most mentions and the latest two reviews with a "Lihat semua" link. With fewer than 3 reviews, *"Ulasan baru"* instead of an average. In the map list next to the name, the average once it exists (P1).
- **Example reviews in Phase 0** are marked as example data, like every other number in the demo.
- **Seller:** sees all reviews in Toko saya, can reply once per review and report one. Can't delete.
- **Admin:** hides reported reviews that break the rules.
- **F-17.AC1:** Given a buyer was within 100 m of the cart while it was Buka in the last 7 days, when they open its page, then **Ulas** is available.
- **F-17.AC2:** Given a buyer was never near the cart while Buka, when they open its page, then **Ulas** is locked with the reason.
- **F-17.AC3:** Given a cart has 3 or more reviews, when a buyer opens its page, then the average and count show.
- **F-17.AC4:** Given a review, when the seller replies, then the reply shows under it on the cart page.
- **F-17.AC5:** Given a review is reported and an admin hides it, then it no longer shows and no longer counts in the average.

### F-18 · Pantau visibilitas: admin quality control (P0)
*As an admin, I want to see at a glance which sellers who are Buka buyers can actually see, so field agents can fix problems the same evening.*
- **Where:** admin console, new page **Pantau visibilitas**. Real sellers only; simulated carts hidden unless the admin turns them on. Sellers switched off in **Penjual** (F-08) never count as Buka or Hilang; they are named in one line under the numbers.
- **Top bar:** Buka now · Terlihat · Terlambat (10–30 min) · Buka tapi hilang (> 30 min) · share of Buka time visible today.
- **List, problems first:** seller and number, status for buyers with minutes since the last position, last position and time, likely reason, share of today's Buka time visible, and a **WhatsApp** button.
- **Status rules** are exactly the buyer map's (F-03): Terlihat ≤ 10 min, Terlambat 10–30 min, Hilang > 30 min while Buka.
- **Likely reason** (a best guess, labelled as such): location off on the phone, app stopped by the phone, no signal, unknown.
- **Map:** every Buka seller's last position, coloured by status.
- **One seller's day:** a timeline of Tutup / terlihat / terlambat / hilang, and the events behind it.
- **WhatsApp:** opens a chat on the admin's own phone or laptop with a prepared message. The admin sends it; nothing is sent automatically.
- **F-18.AC1:** Given a seller is Buka and sent a position 4 minutes ago, when the admin opens the page, then the seller shows as *Terlihat · 4 mnt*.
- **F-18.AC2:** Given a seller is Buka and the last position is 14 minutes old, when the admin looks, then the seller shows as *Terlambat · 14 mnt*.
- **F-18.AC3:** Given a seller is Buka and the last position is more than 30 minutes old, when the admin looks, then the seller shows as *Hilang*, is listed at the top and is counted in "Buka tapi hilang".
- **F-18.AC4:** Given the page is open, when a seller's status changes, then the page shows it within 1 minute without a reload.
- **F-18.AC5:** Given a seller turned off location on the phone, when the seller goes missing, then the likely reason says *Lokasi HP dimatikan*.
- **F-18.AC6:** Given the admin taps WhatsApp on a row, when the chat opens, then it is addressed to that seller's number with the prepared message, unsent.
- **F-18.AC7:** Given a seller was Buka 4 hours today and visible for 3, when the admin looks, then "Terlihat hari ini" shows 75%.
- **F-18.AC8:** Given a seller is switched off in Penjual, when the admin opens Pantau visibilitas, then that seller is not counted as Buka, Terlihat, Terlambat or Hilang, and is listed by name as hidden.

### F-14 · Jadwal by hand and Bagikan ke WhatsApp (P1)
The seller sets today's stops (a time and a point on the map) by hand. Followers see them on the cart page. **Bagikan ke WhatsApp** shares the list. Taken from v0.9 section 7.10, without Jadwal pintar.

### F-15 · Pengumuman, one line (P1)
One short message on the cart page, e.g. *"Hari ini sampai jam 21.00 di Berawa"*, shown in followers' Diikuti list. No push in v1.

---

## 8. Notifications

| Notification | Trigger | Recipient | Limit |
|---|---|---|---|
| Followed cart open (F-06) | First Buka of the day | Followers with the switch on | 1 per cart per day |
| Followed cart near (F-10) | Cart within about 500 m of the buyer or the saved spot | Followers with the switch on | 1 per cart per day |

---

## 9. Privacy, data and consent

| Data | Rule |
|---|---|
| Seller position | Shared while Buka; stored as a trail for later insights; kept 90 days **(proposed)** |
| Seller sales (F-11) | The seller's own data. Never shown to buyers or other sellers. Later shown back to the seller in membership. Onboarding says this plainly, because sellers may worry about tax |
| Buyer position | Used only to place the map and check distance to followed carts. No history of where a buyer has been |
| Buyer searches, views, follows (F-13) | Counted per area and hour. Search words that match no dish or cart name are counted as *lainnya* and not kept. Shown later to sellers in membership as demand by area, never per person. Areas with too few counts are hidden from sellers **(proposed: under 3)**; admins see exact counts |
| Consent | Recorded at first sign-in. Indonesia's personal data law (UU PDP) applies; full compliance before the public launch |

**Consent text, outline (to be finalised with a legal check before the pilot):**
- **Buyers:** *"Kami memakai lokasi Anda untuk menampilkan gerobak di sekitar Anda dan memberi tahu saat gerobak favorit Anda dekat. Pencarian Anda dihitung secara anonim per area untuk membantu penjual tahu di mana pembeli mencari."* (We use your location to show carts near you and to tell you when a favourite cart is close. Your searches are counted anonymously by area, to help sellers know where buyers are looking.)
- **Sellers:** *"Lokasi gerobak Anda tampil di peta saat Buka. Catatan penjualan Anda hanya untuk Anda dan tidak dibagikan ke siapa pun."* (Your cart's location shows on the map while you're Buka. Your sales records are for you only and aren't shared with anyone.)

---

## 10. Configurable defaults

| Setting | Default |
|---|---|
| Nearby radius | 3 km; followed carts at any distance |
| Position update | every 5 min or 150 m |
| LIVE / STALE / hidden | ≤ 10 min / 10–30 min / > 30 min |
| Auto-close if Tutup is forgotten | 30 min without an update (hidden), closed at midnight WITA **(proposed)** |
| "Near" distance | 500 m **(proposed)**, tested within ±100 m; buyer position at most 30 min old |
| Saved spots | up to 2 **(proposed)** |
| Push limits | 1 "open" and 1 "near" per cart per day |
| Page view counting | 1 per buyer per cart per hour |
| Sales changes | delete, same day only (editing is P1) |
| Demand count privacy | hide areas under 3 **(proposed)** |
| Seller trail retention | 90 days **(proposed)** |
| Default map spot without location | Batu Bolong, Canggu |
| Demo simulation auto-stop | 2 hours after start |

---

## 11. Mockups

Static pages in `../mockups-v3/`. Open `index.html`. The design is the GitHub app's, with the D29–D31 heading work and Manrope (D32). One Android phone per state; iOS differs only at sign-in.

| Page | Covers |
|---|---|
| `design-system.html` | App colours, type, parts; before/after of the heading fix |
| `font-lab.html` | Q9: the Penjualan and Gerobak screens in five typefaces, same sizes and weights |
| `buyer-start.html` | F-12.AC1–AC2, iOS Apple sign-in |
| `buyer-map.html` | F-04.AC1–AC7, F-03.AC3, F-13, F-12.AC4 (signed-out map and the sign-in prompt) |
| `buyer-cart.html` | F-05, F-17.AC3, F-02, F-03.AC3, F-06 first follow, F-10 permission and saved spot |
| `buyer-follow.html` | F-06 Diikuti and switch, F-06.AC4, F-10 "near" push |
| `seller-start.html` | F-12.AC3, F-01.AC1–AC4 |
| `seller-home.html` | F-03.AC1/AC4/AC5, F-02, F-07, F-08.AC1 seller view |
| `seller-sales.html` | F-11.AC1–AC8, F-07.AC2 (05 and 06: a day opened per menu, and a day with no sales) |
| `seller-shop.html` | F-16.AC1–AC5 |
| `admin-sellers.html` | F-08.AC1–AC4 |
| `admin-monitor.html` | F-18.AC1–AC8 |


The frontend builds from these. Changes go through the CTO.

---

## 12. Phase 0 demo script

**Setup:**
- **Phone A:** buyer app, used by the counterpart.
- **Phone B:** seller app, Pak Made's bakso cart, used by the presenter.
- **Laptop:** admin console (Penjual, Pantau visibilitas). The simulation is running; it has no screen to start it from (D33).

**Steps:**
1. The counterpart opens the app and sees the map straight away, with carts moving around and the list within 3 km. They search "martabak". They tap a cart; the sign-in prompt appears and they sign in with Google and accept, then land on that cart page (D36).
2. They open a simulated cart's page: menu, prices, pork label, LIVE. They tap **Ikuti**, see the location explanation and allow "always". The presenter explains the fallback (saved Rumah or Kantor) on the mockup.
3. They also follow **Pak Made** from a shared link; his page shows *Tutup*. Phone B taps **BUKA**. Within a minute Pak Made appears on Phone A's map, and Phone A gets *"Bakso Pak Made buka di …"*.
4. Before the session the team set a followed simulated cart to come near Phone A. Phone A gets *"… 300 m dari Anda"*. Tapping it flies the map to the cart.
5. Phone A searches "bakso": only carts with available bakso show.
6. Phone B marks *Bakso urat* **Habis**. Phone A sees it within a minute.
7. Phone B records 3 sales (Tunai, QRIS). Beranda shows *"3 porsi · Rp …"* and *"Dilihat N kali"*, and the 7-day list fills.
8. Phone B taps **TUTUP**. The cart disappears from Phone A.
9. On the laptop, the admin switches Pak Made **off** in Penjual. Phone A's map drops him within a minute and Phone B says *Disembunyikan admin*. The admin switches him back on; Phone B can Buka again.
10. **The vision slide (not built):** the membership that sellers will pay for, with demand by area, best spots and hours.

---

## 13. Phases

| Phase | Scope | Exit |
|---|---|---|
| **0: Demo** (now) | F-01 to F-13, plus F-18 (admin monitor). Android only. Simulated carts plus Pak Made. No billing. Demo codes, no SMS | Demo script passes twice in a row (G5) |
| **1: Bali pilot** | Real sellers signing themselves up with field-agent coaching in Canggu. Real SMS or WhatsApp codes. Production maps and street names. Gerobak's own web address for share links. Both apps on the Play Store. iOS buyer app with Apple sign-in. Account deletion, privacy policy, UU PDP. P1 features F-14 and F-15, plus editing a sale, the dish list (D14, D26). Admin editing of seller details is excluded (D27). Set targets for G1–G4 | To be set after the demo |
| **2: Seller membership** (D8) | Paid plan for sellers: demand by area (from F-13), sales history and best spots and hours (from F-11 and the trail), and more. Pricing to be decided | To be set |
| **3: Later** | From v0.9: Teriak and the yes/no claim; QR ordering and QRIS; cash drawer and spending; Jadwal pintar and Rencana hari ini; Peta keramaian, the heatmap and forecast; Komunitas; Reviews, unless F-17 comes forward (Q8); sponsored Populer row and paid boosts; Pengingat by menu; juragan fleets | — |

### 13.1 Effort and cost (CTO estimate, 2026-10-28)
All numbers are **Kai's estimates**, in engineer-days, not quotes.

| F | Effort | Main risk |
|---|---|---|
| F-01 Onboarding | 3 d | Large phone photos |
| F-02 Profile and menu | 3 d | Dish list too thin for search |
| F-03 Buka/Tutup | **8–10 d** | Cheap Android phones stop the app in the background, so carts vanish |
| F-04 Map, list, search | 4–5 d | Free public maps can't carry the pilot |
| F-05 Cart page | 3 d | Without an own address, the link opens a web page but not the app |
| F-06 Ikuti + "open" push | 4–5 d | Street names in the push need a lookup service (free one is enough for the demo) |
| F-07 Stats | 2 d | — |
| F-08 Admin | 3 d | — |
| F-09 Demo carts | 5 d | Hosting cost if left running (guarded by F-09.AC4) |
| F-10 Dekat Anda | **6–8 d** with "always" · 3 d without | Store review and refusals (Q7) |
| F-11 Catat penjualan | 4 d | Offline sales counted twice (F-11.AC6) |
| F-12 Sign-in + consent | 5 d | Built in-house |
| F-13 Demand signals | 2–3 d | Personal details in search words (handled by D15) |
| F-18 Pantau visibilitas | **not estimated yet** | Needs live positions per seller; the live list and the buyer map must use the same status rules |

**Total:** about 55–65 days, including about 6 days of groundwork. D14 saves about 2–3 days. **F-18 is not in this total**; Kai has not estimated it yet.

**Running cost:** Phase 0 fits the current hosting plan of about $5 a month, with the auto-stop. **Paid items for the Owner later** (Estimated): Google Play account $25 once; SMS or WhatsApp codes, per message, from the pilot; own web address about $10–20 a year; Apple $99 a year for iOS.

---

## 14. Non-goals (for now)
- Payments of any kind through the app.
- Buyers calling or shouting for a cart.
- Seller tiers or billing in Phase 0 and the pilot (D1).
- Bookkeeping: spending, cash drawer, stock, profit.
- Social features: posts and comments. Reviews only as F-17, if Q8 brings them in.
- Delivery.
- Markets outside Bali.
- Selling data to anyone except sellers (D8).

---

## 15. Constraints
- One person, one phone at the cart: big buttons, sunlight, wet hands, at most a few taps per sale.
- Formal Indonesian ("Anda") and English; follows the phone language.
- Bali time (WITA) for every day boundary.
- Phase 0 is Android only.
- Two apps: **Gerobak** for buyers and **Gerobak Penjual** for sellers (D11).
- Phase 0 running cost stays within the current hosting plan (about $5 a month).

---

## 16. Assumptions (to validate)

| ID | Assumption | How we test it |
|---|---|---|
| A1 | Sellers will keep the app Buka for their whole shift | Share of selling hours with location in the pilot (F-18 shows it per seller) |
| A2 | Sellers will record most sales if they see their day's total | Recorded sales vs the seller's own estimate, by interview |
| A3 | Buyers will sign in before seeing anything | Drop-off at the sign-in screen |
| A4 | A meaningful share of buyers allows "always" location | Permission rates |
| A5 | 500 m is the right "near" distance | Push tap rate; buyer interviews |
| A6 | Sellers will pay later for demand and sales insights | Willingness-to-pay interviews during the pilot |

---

## 17. Risks

| Risk | Impact | Mitigation |
|---|---|---|
| Cheap Android phones stop the seller app in the background | Carts vanish from the map; the whole product fails | Battery-limit prompt at onboarding; seller warning; test on real phones; the demo leans on simulated carts |
| "Always" location is refused or rejected by app review (D3) | F-10 works only with saved spots; the pilot launch could slip | CTO finding: on Android 11 and later the buyer must turn it on in the phone's Settings, and Google treats "nearby" alerts as a convenience, which risks rejection. No effect on the demo, which installs the app directly. Saved-spot fallback built in. Decision open as Q7 |
| "Near" pushes arrive late when the app is closed | Buyers miss a cart that passes quickly | Accepted; measured in the pilot with A5 |
| The sign-in prompt at the first tap loses curious visitors (D36) | Fewer buyers | The map is free to view, so drop-off now sits at the first tap instead of at launch. Watch drop-off (A3) and which action triggers it |
| Sellers don't record sales at rush hour | Thin sales data for membership | 3 taps; same-day total as the reward; field agents coach |
| Sellers fear tax visibility | They refuse sign-up or stop recording | Private by default; say it plainly at onboarding |
| Cold start: few carts, so few buyers | Empty map | Hyper-local launch, field agents, simulated carts only in the demo |
| Free public maps can't be used at scale | Pilot blocked | CTO plan before Phase 1 |

---

## 18. Open questions

| ID | Question | Owner | Status |
|---|---|---|---|
| Q1 | Can buyers browse without signing in? | Owner | **Closed:** yes for the map, list and search; no for any action (D36) |
| Q2 | Demo first, or straight to a pilot? | Owner | **Closed:** demo first |
| Q3 | Who buys the historical data? | Owner | **Closed:** sellers, through membership (D8) |
| Q4 | Membership price and what's in it | Owner | Open; decide during the pilot |
| Q5 | One app with a seller mode, or two apps? | CTO and Pia | **Closed:** two apps (D11) |
| Q6 | Consent wording legal check | Owner | Open; before the pilot |
| Q8 | Reviews (F-17): P1 for the pilot, or P0 so the counterpart sees them in the demo? | Owner | **Closed:** reviews show on the cart page from Phase 0, with example data; writing them stays P1 (D35) |
| Q7 | Keep "always" location for buyers in P0 (D3), or use saved spots + live location while the app is open in P0 and move "always" to P1, gated on Play approval? | Owner | Open. CTO and Pia lean to the move: same demo, about 4–5 days saved, no store risk carried into the pilot. Doesn't block the demo |
| Q9 | Typeface: keep Plus Jakarta Sans, or switch? | Owner | **Closed:** Manrope (D32) |

---

## 19. Decision log

| ID | Date | Decision | Why | Cons accepted | By |
|---|---|---|---|---|---|
| D0 | 2026-10-28 | Gerobak v1 is a visibility app; hard day-one features removed | The core value is seeing carts; ship it simply | Less "wow"; no buyer-to-seller call | Owner |
| D1 | 2026-10-28 | Everything free in Phase 0 and the pilot; no tiers | Need sellers before charging | No revenue yet | Pia |
| D2 | 2026-10-28 | Buka is one tap, never blocked by a form | Never block the core action | No opening cash count | Pia |
| D3 | 2026-10-28 | "Near" uses the buyer's live location by default, with saved spots as the fallback | Feels like magic for those who allow it | Harder to build, store review risk, more refusals. Pia objected once | Owner |
| D4 | 2026-10-28 | Buyers must sign in before the map | Data is the key asset | Loses some curious buyers. Pia leaned the other way | Owner — **superseded by D36, 2026-11-01** |
| D5 | 2026-10-28 | Sellers record sales by hand (F-11) | Builds sales history for membership | Depends on sellers' discipline | Owner |
| D6 | 2026-10-28 | Count searches, views and follows by area and hour (F-13) | Demand data without shouts, no extra typing | Needs clear consent | Pia |
| D7 | 2026-10-28 | One global alert switch; no per-cart switches | Simpler | Can't silence one cart without unfollowing | Owner |
| D8 | 2026-10-28 | Data is sold back to sellers through a membership (Phase 2), not to outside buyers | Clear value, simple consent | Smaller data revenue for now | Owner |
| D9 | 2026-10-28 | Followed carts are shown at any distance; others within 3 km | Regulars want their cart wherever it is | Followed list can grow long | Pia (kept from v0.9) |
| D10 | 2026-10-28 | *(Replaced by D19)* The mockups continue the existing app's design system; no new visual language | The demo must look like the product the counterpart already saw; the frontend can reuse the app's tokens | Some app tokens are sampled, not copied, so a few shades may shift in the build | Pia |
| D11 | 2026-10-28 | Two apps: buyer and seller | Play allows one "location while closed" feature per app; the seller app needs it for Buka. Matches the mockups | Two store listings to maintain | Pia, on CTO advice |
| D12 | 2026-10-28 | Share links use a free temporary address in Phase 0; own address from the pilot | No purchase needed for the demo | In the demo, the link opens a web page, not the app | Pia |
| D13 | 2026-10-28 | Tunai is preselected when recording a sale | Keeps a sale at 3 taps; cash is the common case | A QRIS sale needs 1 more tap; a seller may forget to switch | Pia |
| D14 | 2026-10-28 | Editing a sale and editing the dish list move to P1 | Neither shows in the demo; saves 2–3 days | A wrong sale is deleted and re-entered | Pia |
| D15 | 2026-10-28 | Searches count where the buyer is; only dish and cart names are kept, others as *lainnya* | Real demand, with no personal details stored | Unusual searches lose their words | Pia, on CTO advice |
| D17 | 2026-10-29 | Sellers edit their own photos, description and menu (F-16), P0 | Owner request; sellers keep their page fresh without an agent | Some photos or prices may be wrong; seller corrects them after admin contact (D27) | Owner, shaped by Pia |
| D18 | 2026-10-29 | Reviews only from buyers who were near the cart while Buka; sellers reply and report but can't delete | Keeps reviews honest without purchases in the app | Some real buyers can't review; regulars who never came near can't either | Pia |
| D19 | 2026-11-01 | The mockups follow the current app's blue colours; replaces D10's cream and coral | Owner's call: one look across the app and the mockups, with no restyle of the app needed | The cream and coral look is dropped | Owner |
| D20 | 2026-11-01 | *(Withdrawn; Owner kept blue, see D21)* New design system "Hitam, putih, satu sinyal": black and white, flat, one lime signal colour for "open now", greyscale map | Owner asked for clean, modern, minimalist and original; no Indonesian super-app uses black plus lime (Assumption, unchecked), and black on white reads best in sun | Kai's demo app must be restyled; lime is pale on white, so it is only ever a fill behind black text | Owner brief, Pia's design |
| D21 | 2026-11-01 | Keep the blue; revamp layout and sizing: 360 × 780 screens, type scale with nothing under 12 px, one-line list rows, 8-point spacing, 44–52 px tap targets | Owner: the problem is layout and sizing, not colour | Less fits on one screen; long names and dish lists are cut with "…" in lists (shown in full on the cart page) | Owner, Pia's design |
| D22 | 2026-11-01 | Design redone from research: one design, two native skins (Android Material 3 habits, iOS HIG habits), system fonts, real screen sizes; blue brand kept | Owner asked for a from-scratch revamp for Android and iOS; users expect their platform's own controls | Two sets of screens to keep in step; the frontend builds platform-specific bars and controls | Owner request, Pia's design |
| D23 | 2026-11-01 | Seller home: status card in words + one full-width 64-high BUKA/TUTUP button at the bottom (replaces the round disc); Habis is a switch per item; third seller tab is Toko saya (account settings inside it) | Thumb reach, status not by colour alone, native on/off control | The round disc's character is gone; account settings are one level deeper | Pia |
| D24 | 2026-11-01 | Solid white header bars with a divider; content grouped on outlined white cards; corners cut to 4–10 (sheets 16) | Owner: content blended into the background and corners were too round | Looks a little more boxed than stock iOS | Owner feedback, Pia's design |
| D30 | 2026-11-01 | Every heading gets its own white surface (header band, sheet head, cart title block, admin title bar); titles 24–28 px | Owner: headings still blended in; the cause was the shared grey ground, not the text colour | More white at the top of each screen; slightly less map visible under the sheet head | Owner, Pia (Kai diagnosis) |
| D29 | 2026-11-01 | Mockups follow the existing GitHub app design; only headings, titles and labels get stronger weight and darker colour. Replaces the visual parts of D22–D24 and D28 | Owner: the GitHub design is much better; its only problem is headings blending into the background | The round BUKA disc and Habis buttons come back; the v2 and OpenDesign work is kept only as history | Owner, Pia |
| D28 | 2026-11-01 | New OpenDesign product-system proposal; blue remains, hierarchy and layouts redesigned | Owner requested OpenDesign and chose Create a new system | Visual proposal needs review; illustration data does not verify working app behaviour | Owner direction, Pia design |
| D27 | 2026-11-01 | Sellers supply and maintain all shop information; admin reads it and changes buyer visibility only. Setup is in the seller app, not the console | Owner clarification: all details come from seller information first | Admin must ask the seller to correct errors; onboarding effort needs a revised CTO check | Owner |
| D26 | 2026-11-01 | Remove the admin **Daftar menu** page, editing sellers on their behalf and the separate Nonaktifkan flow; one **Tampil ke pembeli** switch per seller; the dish list is fixed in Phase 0 | Owner: keep it simple, just enable or disable from the buyer view | No admin-side menu fixes before the demo, so a wrong dish goes through Pia or Kai; hiding is a blunt tool (no reason field yet) | Owner request, Pia's design |
| D36 | 2026-11-01 | **Peta opens without an account.** Map, list and search work signed out; opening a cart, Ikuti, ulasan, saved places and alerts ask for sign-in once, on top of the same map. Supersedes D4 | Owner: the map is the product, so a visitor should see it before filling in anything. Sign-in still comes before any action that creates data | Guests see cart names and positions; reviews and cart details sit behind sign-in, so they reach fewer people; more first sessions end in a sign-in prompt | Owner |
| D35 | 2026-11-01 | **Reviews show on the cart page in Phase 0** (average, count, tags, latest two, "Ulasan baru" under 3). Writing them stays P1. Q8 closed | Owner: reviews are the reason a buyer walks over, and the counterpart should see them in the demo; writing needs proof of a visit and moderation | Phase 0 reviews are example data; a cart with no reviews looks empty | Owner |
| D34 | 2026-11-01 | **7 hari terakhir opens per day**: which menu sold, portions and takings per dish, highest portions first; zero days say "Tidak ada penjualan hari itu." | Owner: a seller needs to know what actually sold, not only the day total | The list gets longer when a day is open; the numbers only add up if every sale stores its items (F-11 already does) | Owner |
| D33 | 2026-11-01 | **No demo page in the admin console.** The admin has Penjual and Pantau visibilitas only; the Phase 0 simulation is turned on by the team before the demo, with no UI for it | Owner: a demo panel in the live console is a risk and adds a screen nobody uses after the demo | The team needs another way to start the simulation; presenter must remember it before each session | Owner |
| D32 | 2026-11-01 | **Manrope** is the app typeface, replacing Plus Jakarta Sans. Sizes, weights, colours and spacing stay as they are | Owner chose it from five options drawn on the real screens; it carries the 18 px heading weight with more character than Jakarta and keeps prices and times crisp | Long names run a little wider; the app must bundle one new font file | Owner |
| D31 | 2026-11-01 | Section headings get their own white bands joined to their content; **Hari ini** becomes a heading with the totals on the next line; headings inside a card use a divider instead of a second surface | Section headings still read as background under the D30 screen-title fix | More white on screen; two heading treatments to keep straight | Pia, after the Owner's request |
| D25 | 2026-11-01 | Add F-18, an admin visibility monitor, as P0; admins message sellers by hand via WhatsApp, no automatic alerts yet | Owner: quality control, for now done by people; protects the core promise that open carts are on the map; also measures A1 | Someone must check the page each evening; reasons are best guesses | Owner request, Pia's design |
| D16 | 2026-10-28 | The demo simulation stops on its own after 2 hours | Keeps hosting within about $5 a month | The presenter restarts it for long sessions | Pia |

---

## 20. Glossary

| Term | Meaning |
|---|---|
| **Gerobak** | Street-food cart (push cart or motorbike cart); also the product name |
| **Buka / Tutup** | Open / closed: the seller's switch for being on the map |
| **Habis** | Sold out |
| **Ikuti / Diikuti** | Follow / followed |
| **Dekat Anda** | "Near you": the alert when a followed cart is close |
| **Di sekitar Anda** | "Around you": the list of carts within 3 km |
| **Catat penjualan / Penjualan** | Record a sale / Sales tab |
| **Tunai / QRIS** | Cash / Indonesia's standard payment QR. Here only a label for how the buyer paid |
| **LIVE / STALE** | The cart's position is fresh / a bit old (dimmed) |
| **WITA** | Central Indonesia Time (UTC+8), Bali's time zone |
| **Field agent** | Team member who helps sellers sign up in person |
| **Membership** | The future paid plan for sellers (Phase 2) |


D31 · 2026-11-01 · Owner requested clearer section headings. White section bands and a separate sales summary extend D30. Accepted trade-off: slightly more vertical space in exchange for clearer grouping. No scope change.

D32 · 2026-11-01 · Owner: “explore alternative fonts”. Five typefaces (Plus Jakarta Sans, Inter, Manrope, DM Sans, Nunito Sans) were set on the real Penjualan and Gerobak screens at mockups-v3/font-lab.html, with a script-free Typeface switch on every page. Owner chose Manrope. Accepted trade-offs: long names run slightly wider; the app must bundle one new font file. Sizes, weights, colours and spacing unchanged, so no acceptance test changed and no feature or priority changed.

| D37 | 2026-11-01 | Aligned sales columns | Seller can scan amounts quickly | Longer names truncate in narrow rows | Owner |
| D38 | 2026-11-01 | Denser type and spacing, larger map viewport | More map visible on a phone | Less room for verbose copy | Owner |
| D39 | 2026-11-01 | Diikuti Buka/Tutup tabs with search | Faster access to relevant carts | Extra tap to see the other status | Owner |
| D40 | 2026-11-01 | Two-step seller setup: identity and location, then menu | Less crowded form | One more transition | Owner |
| D41 | 2026-11-01 | Fixed or variable price per item; amount entered at sale | Supports products priced by order | Variable sale needs extra input | Owner |

D33–D36 · 2026-11-01 · Owner asked for four changes: no demo in admin, 7-day sales opened per menu, reviews on the cart page, and Peta open without an account. Accepted trade-offs: the simulation needs another way to start; a day opened makes the sales list longer; Phase 0 reviews are example data; guests see less of a cart until they sign in, and D4 no longer applies. No other requirement changed.