← All work

Plainbill — Simple Bill Maker for Small Shops

Live on Google Play: make a shop bill in seconds and print it on any cheap Bluetooth thermal printer, or share it as a PDF on WhatsApp. No inventory, no POS, no account; any currency and any language on the slip. Expo + Kotlin native modules.

ExpoReact NativeKotlinESC/POSBluetoothSQLite

Overview

Every billing app on the Play Store wants you to set up inventory before you can make your first bill. Small shops don't want that. They avoid POS systems because of the cost, the setup and, in markets like Pakistan, the paperwork that comes with them. Most still write bills by hand.

Plainbill does just the bill. Type the items, print the slip, done. It's built for small shops anywhere: any currency, any language typed on the bill, and the cheap Bluetooth thermal printers that sit on shop counters around the world.

Live on Google Play: Plainbill on the Play Store. Making, printing and sharing today's bills is free forever, with no ads and no sign-up.

What it does

  • A bill in seconds. Item, quantity and rate, with totals adding up as you type. Discount as an amount or a percentage, an optional previous balance, an optional tax line, and an optional customer name (walk-in by default).
  • Scan to add. Product barcodes and QR codes add an item in one tap, and items you've billed before are suggested as you type, with no inventory to set up.
  • Print or share. 58 mm and 80 mm Bluetooth thermal printers of any brand, full-page A4, A5 and Letter bills, or the bill as an image or PDF on WhatsApp.
  • Your shop on every bill. Name, phone, address, and an optional tax or registration number with your own label (NTN, GSTIN, VAT no.), in your own currency.
  • Plainbill Pro, a one-time purchase. Every past bill searchable and ready to reprint, monthly totals, your logo and footer, several shops with their own numbering, backup and restore, and CSV export for the accountant. The moment a shopkeeper needs an old slip is the moment Pro makes sense.

The interesting engineering

  • Every slip is printed as an image. Cheap thermal printers only know ASCII and a few code pages, so Urdu, Arabic or Bengali typed by the shopkeeper would print as garbage. Plainbill renders the slip, converts it to 1-bit pixels and sends it as an ESC/POS raster image (GS v 0). Whatever you see in the preview is exactly what prints, on any brand.
  • Two ways to turn pixels into ink. Text uses a plain threshold so it stays crisp; logos use Floyd–Steinberg dithering so they stay recognisable on a 203-dpi printer.
  • Built for unreliable printers. Data goes out in small chunks with short pauses so budget printers don't drop bytes, and if the standard Bluetooth connection fails, the app tries two fallbacks, including the old channel-1 method many no-name printer clones still need.
  • Money as whole numbers. Every amount is stored in the currency's smallest unit, never as a floating-point number, and formatted per currency, so a yen bill has no decimals and a dinar bill has three.
  • Tested without the hardware. The raster encoder is pure Kotlin with JVM unit tests and fixture slips, and the bill maths, slip layout, saved items, shops, history and backup each have their own test script, so most of the print path was verified before a printer was ever connected.
  • Private by design. Bills stay in a local database on the phone. No account, no analytics, no ads; Bluetooth is used only to talk to the printer you paired.

Stack

Expo (React Native) with local Expo modules in Kotlin for Bluetooth ESC/POS printing, Google Play Billing and in-app updates; SQLite for bills, expo-camera for barcode scanning, and expo-print for A4/A5/Letter PDFs. Signed release builds are published to Google Play worldwide.

My role

Solo: the product, built with a shopkeeper as the first tester; the design, the React Native app, the native Android printing and billing modules, the Play Store listing and the release.

Next step

Have a project that needs to actually ship?

Tell me what you're building. I'll reply within one working day with an honest take on scope, timeline, and whether I'm the right person for it.