Rentool — renting real equipment from real neighbours.
A rental marketplace for the Israeli market: power tools, site plant, access equipment, garden machinery and event kit, by the day, week or month. Three apps, three languages, and a contract that has to hold up after the drill comes back broken.
The problem
Peer-to-peer rental is not classifieds with a date picker. A sale ends when money changes hands; a rental starts a relationship with a return date, a deposit, a condition dispute and a piece of equipment worth more than the transaction. The platform has to be the thing both sides point at when they disagree.
Architecture
One monorepo, three deployables, one shared package for the models and i18n both frontends need. The API owns everything stateful; the frontends are static bundles behind Caddy, which proxies the API, sockets and uploads from the same origin — so there is no CORS surface to get wrong.
Every external dependency degrades instead of failing. No Elasticsearch falls back to Mongo text search. No Cloudinary writes to local disk. No SMTP logs the mail. That property is what lets a new developer run the whole thing in one command.
The dashed box is optional at runtime — Elasticsearch falls back to Mongo text search.
Search & map
Stylised UI, then the real onealerts on
Filters are per-category attributes, not a fixed schema — so "hammer action" exists for drills and nowhere else.
The map drives the query. Panning issues a bounding-box search; the result count is the map's, not the page's.
Free-text is Hebrew-first and RTL — the input, the index analysers and the city labels all agree on direction.
The hard problem — contracts
This is the part that made Rentool a platform rather than a listings site. Every rental carries a mandatory PDF agreement. The owner places signature fields on their own document; the renter signs in the browser; the platform stamps a certificate and keeps an append-only audit trail. Six months later, when one side says it never happened, the record is what answers.
Declarations are versioned and acceptance records are append-only — so "which terms did they agree to" has one answer, not a current one.
Moderation console
Someone sits here dailylisting #48219 Unsafe item 3 reports 4 h HoldClear
user #9104 → #7712 Profanity (auto) filter 1 d Review
listing #47880 Wrong category 1 report 2 d Recategorise
What shipped
Building something with the same shape?
Most of this is reusable. The interesting conversation is which parts of it your product actually needs.