Mochamad Firman · Tegal, Indonesia · Remote

I build internal systems for offices and small businesses, and ship them complete — in whatever stack you already run.

Inventory, archive tracking, payments, bookkeeping, loan and return workflows. Delivered with installer, backups, tests and a manual the staff can actually read. PHP, Go, Node, Python or a spreadsheet macro: I work in the stack your business already has, with AI pair-programming to move fast without cutting corners.

PHP / LaravelGoNode / ElectronPythonGoogle Apps ScriptExcel VBAMySQLWindows & Linux deploymentWritten English: fluent · Calls: prefer text
Work with me
52Klines of app code in the largest system
1,123automated tests in that system
5products shipped to v1 since Aug 2026
1government office running it in production
Selected work

Real systems with real users. Screenshots show demo data; client data never leaves their building. Click any image to enlarge.

ARJUNA — physical archive tracking for a land registry office

In production · a district land office in West Java
Laravel 12MySQLBlade + AlpineWindows Service installerOffline-first LAN

Problem

501,335 land title numbers across 26 sub-districts and 352 villages, with their title books and survey documents on shelves. The national system records the data but not where the physical sheet is or who is holding it. Staff spent minutes per lookup and lost track of loans.

What I built

  • Binder → slot → side location model that answers "where is title #X" for every number in a binder's range before a single document is entered
  • Loan, return, overdue and stock-take workflows with printed receipts and QR binder labels
  • Column-mapping importer for inconsistent exports from different offices
  • 19 reports, daily backups, one-click updater, Windows Service installer that survives reboots

Result

5,896 binders imported and labeled. Lookup under a minute. Installed on an office PC with no internet, used from phones over office Wi-Fi. Source handed over with a signed license.

  • 470,989 titles (94%) checked against the shelves; 46,262 recorded as physically missing, a figure the office never had before
  • Zero personal data stored: the importer never reads the 458,940 rows of holder names in the source exports
  • 92% of historical loans linked to their documents automatically; 3,007 flagged for a person to review instead of guessed
  • Village is taken from the code inside the title number, not the typed name: one village spelled two ways in the source (19,371 vs 4,425 records) still lands in one place
Dashboard: documents, loans, overdue, binder healthDocument detail with computed shelf position and pairing statusLoan request: title book and survey document in one cartPrinted two-copy loan receiptStock-take session with discrepancies collected automatically
52,428 lines in app/32,616 lines of tests36 models165 views1,123 tests255 commitsv1.0.2

School Fee Manager — single-file desktop app for private schools

v1.5.4 · licensed, reseller program
GoStandard library onlyVanilla JSEd25519 licensingSingle .exe

Problem

Small private schools track tuition in notebooks and Excel. They have no IT staff, unreliable internet, and cannot afford cloud subscriptions.

What I built

  • One executable, no install, runs on the school PC, shared by several clerks over the LAN
  • Payments, receipts with amount-in-words, arrears, WhatsApp reminders, student cards, Excel import/export
  • Add-on modules (savings, cash book, attendance, admissions) unlocked by signed license codes
  • Automatic daily backups and year-end rollover

Result

Complete product: brochure, narrated demo video, tiered pricing by school level, and a reseller tool that issues license codes and tracks sales, commissions and owner cash flow. Deployable by a non-technical person by double-clicking one file.

Dashboard: receipts, arrears, payment complianceReceive payment: several months in one receiptArrears list, always currentReceipt history with audit trailAttendance module

Boarding House Manager — rent billing and WhatsApp reminders for kost owners

v1.1.0 · licensed, field sales
GoStandard library onlyVanilla JSEd25519 licensingSingle .exe

Problem

Owners of Indonesian boarding houses (kost) track rooms, tenants and monthly rent in notebooks and WhatsApp chats. Every tenant has a different move-in date, so due dates are scattered and late payments slip through.

What I built

  • Room map by floor, check-in with printed rental agreement, check-out with deposit settlement
  • Rent invoices issued automatically from each tenant's move-in date (monthly to yearly), with Wi-Fi, parking and late fees
  • Due-date reminder page: filter "due in exactly N days" or "within N days", then send one by one from the owner's own WhatsApp; the app records who was reminded
  • Add-on modules (cash book, electricity & water meters, bookings, maintenance tickets) unlocked by signed license codes

Result

Owner and caretaker work at the same time from a PC and phones on the kost Wi-Fi, without internet. Shipped with pricing by room count, brochure, narrated demo video and a sales commission scheme.

Dashboard: occupancy, income, arrears, rent due in 7 daysRoom map by floorDue-date remindersNumbered receipt

Neighbourhood Dues — RT/RW fee collection over WhatsApp

v0.3.3 · piloting
GoMulti-tenantChrome extensionMobile-first

Problem

Neighbourhood treasurers chase monthly dues house by house. Residents have no way to check their status without asking.

What I built

  • One server, many neighbourhoods, file-based storage per tenant
  • Reminders sent from the treasurer's own WhatsApp (group announcement with a red/green map image, one-by-one on phone, or batch on laptop via a Chrome extension) — no WhatsApp Business API cost
  • Residents check status by house number, no account needed
  • 60 API tests, Playwright UI tests, extension tested against a mock WhatsApp Web

Result

Runs on the treasurer's laptop over home Wi-Fi today; same binary deploys to a VPS for public access.

Home: paid 64/96, cash in this monthUnpaid list, grouped by months overdueOne-by-one WhatsApp remindersGroup announcement with red/green map imageRecord a paymentCash book

Data clean-up & spreadsheet automation — three portfolio samples

Oct 2026 · code and tests on GitHub
Python + pandasGoogle Apps ScriptExcel VBAUnit testsSynthetic data

Problem

Most small businesses run on exports and spreadsheets: CRM dumps with duplicate customers, order sheets typed by hand, a new Excel file from every branch every month. Cleaning them by hand is slow, and the mistakes end up in reports.

What I built

  • Customer Data Cleaner (Python): normalises names, e-mails, phone numbers to E.164, dates and amounts; removes exact and same-person duplicates; every removed or rejected row is logged with a reason
  • Order Sheet Automation (Google Sheets): a Data Tools menu that imports a CSV, validates every row, builds a summary with a chart and e-mails a daily report
  • Sales Consolidator (Excel): one button merges monthly sheets or a folder of workbooks into a clean master table, flags bad rows and summarises revenue

Result

Nothing is dropped silently: each input row ends up clean, in a duplicates log, or on an issues list with the reason.

  • 200,000 messy rows cleaned in under 4 seconds
  • Google Sheets sample: 126 rows in, 115 clean orders, 11 flagged
  • Excel sample: 127 rows from 3 months, 120 clean, 7 flagged in 0.2 s
Python cleaner: before and after on a messy customer exportGoogle Sheets: summary by month, product and statusGoogle Sheets: every flagged row with the exact reasonExcel: revenue by region and product after consolidationExcel: issues sheet with source sheet, row and reason

Field verification tooling for land-data contractors

2025–2026 · internal tools
ElectronNode.jsOCR (ML Kit)Hardware-locked licensing

Context

Two years as a data-verification lead on national land-registry digitisation projects across four offices. I built the tools my own team needed.

What I built

  • Multi-tab browser wrapper for the registry portal with phone-camera OCR feeding a side-by-side reconciliation view (match / mismatch / suggested fix)
  • Hardware-locked licenses with signed keys and a self-hosted update feed

Why it matters

I know what it's like to be the user of back-office software. I design for the clerk, not the demo.

What I can do for you

Fixed-scope, fixed-price. You see a working version early and pay on delivery.

Internal tool from scratch

Inventory, bookings, archive or asset tracking, member/fee management, simple POS. PHP, Go or Node, MySQL, runs on your server or a $5 VPS. Includes installer, backup, user manual.

from $600 · 2–4 weeks

Fix or extend an existing app

Bugs, errors after an upgrade, slow pages, missing reports, roles and audit logs, a new integration. PHP, Go, Node, Python or Android, whatever it was written in. I read your code first and send a written plan before touching anything.

from $25/hour or fixed quote

Data clean-up, audit & automation

Messy exports into clean data: column mapping, duplicate detection, validation reports, and the script or macro that keeps it clean next month (Python, Google Apps Script, Excel VBA). I've done this for datasets of 200,000+ rows.

from $150

How I work

Everything in writing, so nothing is lost.

  1. Short written brief. I send back a one-page plan: scope, what's out of scope, price, dates. No work starts without it.
  2. Working version early. You get a usable build in the first week, then weekly updates with a changelog you can read.
  3. Tests and docs are part of the job, not an extra. Every business rule gets an automated test; every delivery gets a manual.
  4. AI-assisted, human-owned. I use Claude Code as a pair programmer for speed. I review every line, and I'm the one accountable for it.
  5. Text first. I write English comfortably; I'm not a confident speaker on calls. Chat, email and Loom-style recordings work best, and your project stays documented as a result.
Contact

Replies within one working day, GMT+7.

Emailfizard.studio@gmail.com
WhatsApp+62 857-7755-1485

Tell me what your team does by hand today and what it costs you. That's enough for a first plan.