-
-
Dashboard — collected / outstanding / remaining, income chart
-
Statement — money in, money out, net
-
Due detail — line items with a metered reading
-
Unit detail — tenant, deposit & advance, outstanding across dues
-
Ledger - all the transaction with tenant
-
Paywall — your own dark-mode one, with real prices
Inspiration
In Kathmandu, a landlord with eight rooms keeps rent in a notebook. Who paid, who didn't, what the electricity meter read last month, how much deposit is still owed back when someone moves out. It works, until it doesn't — a month gets skipped, a meter reading is misremembered, and a tenant and a landlord disagree about what was paid with no record either can point to.
Every rent app I found was built for someone with a portfolio and an accountant. Nobody had built the one for the person with six rooms and a biro.
What it does
RentDera replaces that notebook.
Add your properties, units and tenants once. Each month's dues generate themselves from the lease — rent, plus metered electricity and water calculated from readings you enter. Record payments as they arrive, full or partial, cash or eSewa or bank transfer, and share a receipt on WhatsApp. The dashboard says what's collected, what's outstanding, and which unit is late.
It also handles the parts most rent apps skip, because they're the parts real ledgers are made of:
- Money that predates the app. Deposits taken at move-in, advances paid ahead, arrears carried over from paper — recordable even for months the app never billed.
- Money going out. Expenses and a monthly statement, so a landlord can finally answer "did I make anything this month" instead of guessing.
- Bikram Sambat dates, alongside Gregorian. That's the calendar Nepal actually uses, and an app that only speaks AD quietly tells people it wasn't built for them.
- Nepali and English, throughout.
How I built it
Expo SDK 57 / React Native 0.86 on the New Architecture, NativeWind and TanStack
Query, in a pnpm Turborepo. Behind it, two Rust services: rentdera-api for the
ledger and notils-praman, a shared identity service issuing JWTs the API verifies
over JWKS — built to carry a second product later, not just this one.
RevenueCat for subscriptions, with the entitlement keyed to the Praman user id rather than an anonymous device id, so a purchase belongs to a person and a future referral can be attributed to one.
One rule shaped most of it: the server owns arithmetic. Every figure the app displays is computed server-side. The client sums exactly one thing — a total across dues that has no endpoint — and does it in integer paisa, never floats. It's a ledger. Being off by a rupee is the whole failure.
Challenges I ran into
Google Play bills Nepal in US dollars. The Nepalese rupee isn't a Play buyer currency, so the NPR prices in my own PRD could not be entered at all. Found it only by reading Google's supported-locations table line by line. The whole pricing model had to be rebuilt around USD for Nepal, INR for India, with tax worked backwards so the number on the buyer's screen is the one I chose.
A paid subscription the app refused to notice. RevenueCat's entitlement was
created as Rentdera Pro; the app matched on pro. A real purchase completed,
Google took the money, and the app behaved as though nothing had happened — paywall
still up, feature still locked, and no error at any layer. Identifiers in RevenueCat
can't be renamed. The fix was a new entitlement and a fallback that reports the
mismatch instead of swallowing it.
Built With
- amplitude
- axum
- biome
- expo-router
- expo.io
- google-play-billing
- jwt
- nativewind
- neon
- pnpm
- postgresql
- react-native
- render
- revenuecat
- rust
- tailwindcss
- tanstack-query
- turborepo
- typescript
- zod
Log in or sign up for Devpost to join the conversation.