Azis Abdul Bachar

Sep – Oct 2026 · Private repository

Bejo POS

A point-of-sale system for a single-outlet food and beverage business in the Indonesian market: customers order on the web, the cashier runs the counter from an Android app, the owner runs the numbers from a backoffice, .

  • 86commits between 21 September and 18 October 2026
  • 27features specified as PRDs, implemented one at a time
  • 2apps: Go backend with web, and an Android POS
  • 48database migrations, each with an up and a down

What is in it

  • Menu management with photos, categories, and sold-out toggles and daily stock that cashiers can set from the POS
  • Customer web ordering: a single page with a two-column photo grid, item notes, order types, scheduled pickup, and order tracking
  • Order lifecycle with notifications, cancellation, and a live queue (new, preparing, ready) with status shortcuts
  • Backoffice for the owner: dashboard, finance, expenses with receipt attachments, funds and recurring savings, and ingredient stock with cost of goods (HPP)
  • Android POS in Jetpack Compose: new sale with a quick menu, and Bluetooth receipt printing with print settings
  • Two roles, admin and cashier, with sign-in by phone or email

The parts

PartStackWhat it does
bejo-appGo, Chi, Templ, sqlx, PostgreSQL, Tailwind, HTMX, Alpine.jsBackend and web: the backoffice, customer web ordering and the POS JSON API. About 445 Go files, 141 test files and 48 migrations.
androidKotlin, Jetpack Compose, Retrofit, MoshiThe cashier's POS app: 113 Kotlin files. It takes orders at the counter and prints receipts over Bluetooth.
docs and localMarkdown, Traefik27 PRDs, each with a phased task list that records deviations found during implementation, plus a deployment guide for Dokploy and a Traefik setup mirroring production routing.

How it was built

The backend reuses the architecture I developed for YourSpace: entity, use case, repository, controller, with all wiring in one file. The code was ported and adapted, not imported, so the two projects stay independent modules. What is new here is HTMX and Alpine.js for partial updates and local state, and an Android app in Jetpack Compose.

Every feature starts as a PRD with scope and decisions, and a decision index is the source of truth for what is in or out. Money is integer rupiah throughout, the interface is in Bahasa Indonesia, and the design system never conveys order status by colour alone: each status has an icon and a label, and touch targets are at least 48px.