Notes from the build

Notesfrombuildingandrunningtwoproducts.

Engineering write-ups from the team behind CashTrace and Rentisha: M-Pesa reconciliation, KRA eTIMS filing, WhatsApp support in three languages, and what it takes to keep it all running on Google Cloud Run.

Filing to KRA eTIMS on every invoice instead of at month end

Transmitting an invoice to eTIMS at the moment it is issued changes the failure modes. Notes on the device handshake, retry queues for when the gateway is unavailable, and keeping an append-only audit record per invoice.

Writing arrears reminders a rent tribunal would accept

Chasing rent in Kenya is a legal sequence, not a nudge. How Rentisha's escalation is worded, how far apart the steps sit, and what has to be logged for a landlord to rely on it months later.

Tenants message in Sheng, so that is what we classify

Support conversations arrive as a mix of English, Swahili and Sheng, often switching inside one sentence. What that does to intent classification, and how we evaluate a classifier when the training data code-switches.

Running Next.js on Cloud Run from Nairobi

Standalone output, cold starts, and the cost lines that actually move. What we changed after the first month of bills, and the regional choices that mattered more than we expected.

What we put on our security page, and what we leave off

Our security page lists controls we can point at in the codebase, plus a section for gaps we have not closed yet. An argument for why the second list is the more useful one to publish.

Rent collection is a data protection problem

Handling tenant data under the Kenya Data Protection Act 2019: consent captured at onboarding, purpose limitation in practice, and the message frequency caps that keep automated follow-up from turning into harassment.

What advisory work pays for

We are bootstrapped, so consulting revenue funds the product roadmap. What we take on, what we turn down, and how we keep engagements from quietly becoming the whole business.

Choosing dull infrastructure for a two-product company

Postgres, Cloud Run, and a deliberately short list of managed services. The reasoning behind each choice, and the places where it would not survive ten times the load.