All projects

Bank Sampah

An offline desktop app that runs a neighbourhood waste bank and works out every resident's payout in seconds, where the volunteers used to spend weeks going page by page through spreadsheets. More than 7.4 tonnes of waste have gone through it so far.

Client
A neighbourhood waste bank
Role
Designer and developer, on my own
When
Mar – Sep 2026
The Bank Sampah overview: total weight collected, money paid out, and the material mix
  • Tauri
  • Rust
  • React
  • TypeScript
  • SQLite
  • Tailwind
  • shadcn/ui
  • Cloudflare Pages

What it is

A bank sampah, a waste bank, is how many Indonesian neighbourhoods recycle. On collection days residents bring sorted waste, volunteers weigh it by category and credit each person at that day's price, and the material is later sold on to collectors at a higher one.

This one ran on Excel logbooks: 48 price categories, a weighing for every bag, a payout for every resident, and the sales to collectors on top.

My part

I designed and built it on my own, in my spare time, for the volunteers who run it. It is a Windows app that needs no internet, keeps everything in one SQLite file on the laptop, and updates itself.

Keeping up with the queue

The problem. On a collection day residents queue with their bags while each one is weighed. Whatever the volunteer types has to keep pace with the scale.

What I did.
  • A full-page deposit form with every category in price-list order, arrow keys to move through the grid, and a command palette to jump to a category.
  • A weight field that takes sums, so “2,5+1,75” from two weighings becomes 4.25 kg, with the comma as the decimal point, as Indonesians write it.
  • The payout worked out live as weights go in, split by the collector each item will be sold to.

What changed. A resident's whole deposit goes in as it is weighed, with the amount owed already on screen.

Editing a deposit: weights per category and the live payout
A deposit being edited. Sample data; the names are made up.

Prices, payouts and sales

The problem. Prices change from one collection to the next, collectors pay more for bigger loads, and residents are paid out from their savings twice a year. On the spreadsheets, working out what each resident was owed meant going page by page through every collection at its own prices, and took weeks.

What I did.
  • Each session keeps its own copy of the price list, so changing a price never rewrites an old session.
  • Collector prices in weight tiers, worked out like tax brackets, and a sales manifest for each collector.
  • Semester savings payouts and collector reports that print straight from the app.
  • An import for the old Excel logbooks, so past sessions came along.

What changed. A session closes with every resident's payout and every collector's manifest agreeing with the scale, and the semester payout, worked out from every recorded deposit, is ready in seconds.

Seconds

instead of weeks, to work out every resident's semester payout

A collection session: every deposit with its weights and payout
One collection session. Sample data; the names are made up.

Offline, and it updates itself

The problem. The volunteers work on one laptop, not always online, and nobody there should have to reinstall anything or worry about losing the data.

What I did.
  • Tauri with a local SQLite file; the schema moves forward on its own with migrations as new versions add columns.
  • Signed updates served from Cloudflare Pages: the app checks on start, shows the download, and restarts on the new version.
  • Backups to a cloud database (Turso) and CSV exports, both from the settings page.

What changed. It has been in use since March 2026, and more than 7.4 tonnes of residents' waste have been weighed through it. Its September backup held 10 collection sessions and 407 deposits from 152 residents, with 3,449 weighed items.

7.4+ tonnes

of residents' recyclables weighed in since March 2026

Have a project in mind?

Tell me what you need built, web or mobile, design to backend. I will come back with a plan.

Hiring a software engineer?

I am open to full-time roles. Let’s talk about your team and the work.