Skip to content
AlphaMergeCase study 01 — RentoolLive in production
Case study 01 · Marketplace

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.

3
Apps shipped
4
Listing types, one model
3
Locales, RTL default
10min
Merge → live
2

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.

01A signed agreement per rental, not per account
02Hebrew first, Arabic and English equal across the interface
03"Near me" means a map and a bounding box, not a city dropdown
04Rentals, sales, services and jobs, without four codebases
05Two engineers must be able to operate all of it
3

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.

Angular 19 Node 24 Express MongoDB 7 Elasticsearch 8 Redis 7 Socket.io Mapbox Caddy · GCE · GHCR
Request path
Client PWA
Angular · he/en/ar
Admin
Moderation · CMS
↓ same-origin ↓
Caddy
TLS · /api /socket.io /uploads
↓
Express API + Socket.io
JWT 15m + refresh cookie
MongoDB Elastic Redis

The dashed box is optional at runtime — Elasticsearch falls back to Mongo text search.

4

Search & map

Stylised UI, then the real one
rentool — search · he · RTL 4 300 listings indexed
Category
Power tools812 Drills184 Site plant327 Access96 Event kit241
Attributes
Cordless Hammer action Delivery offered
₪ / day
₪40₪180
Saved search active
alerts on
מקדחה נטענת⌕
RentalSaleService
Makita 18V + 2 batteries
Ramat Gan · 2.4 km · ★ 4.9 (31)
₪65 / day
Bosch SDS hammer drill
Tel Aviv · 4.1 km · ★ 4.7 (12)
₪88 / day
DeWalt combi kit
Herzliya · 8.6 km · ★ 5.0 (4)
₪72 / day
Search this area
₪65 · Makita
bbox query · 184 in view
Note 4.1

Filters are per-category attributes, not a fixed schema — so "hammer action" exists for drills and nowhere else.

Note 4.2

The map drives the query. Panning issues a bounding-box search; the result count is the map's, not the page's.

Note 4.3

Free-text is Hebrew-first and RTL — the input, the index analysers and the city labels all agree on direction.

A Hebrew, right-to-left marketplace home page. A search field runs across the top; below it a red hero panel with a drill illustration and a second search field, then three cards — tools, services, jobs — and a row of category tiles.
The live client, Hebrew by default and right to left. Rentals, sales, services and jobs all resolve from the one listing model.
5

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.

Sign agreement — step 3 of 3
Rental agreement · he
Owner — signed
Sign here →
page 2 / 2 · field 4 of 4
Draw signature
signature pad
✓Identity verified
✓Terms accepted v4
·Awaiting signature
Sign & rent
Audit trail — append only
09:14:02Agreement generated · template v4 · he
09:14:40Fields placed by owner · 4 fields
09:18:11Owner signed · ip · user agent
10:02:55Viewed by renter · 3 times
10:04:19Renter signed · certificate stamped
10:04:20PDF sealed · both parties emailed

Declarations are versioned and acceptance records are append-only — so "which terms did they agree to" has one answer, not a current one.

6

Moderation console

Someone sits here daily
Admin/Reports 7 open
Queues Reports7 Listings23 Users4 Support11 Tools Event log Dossiers Segments
SubjectReasonReporterAgeAction
Scaffold tower 6m
listing #48219
Unsafe item 3 reports 4 h HoldClear
Message thread
user #9104 → #7712
Profanity (auto) filter 1 d Review
Mini excavator 1.5t
listing #47880
Wrong category 1 report 2 d Recategorise
Every action writes to the event log with actor, target and context
7

What shipped

Marketplace
Search, filters, attributesSaved searches + alertsFavouritesMap view, locations approximateSimilar listingsThreads, push, installable
Transactions
PDF contracts, required to publishPlaced signature fieldsE-signature + certificateDeclarations both sides signStock, priced per item or per hireRatings 1–5
Beyond listings
Job posts + CV uploadService listingsBlog, CMS, newslettersAds & analyticsImport from Yad2 / FB
Operations
Deploy on mergeBackups + restore plannerServer metricsData export & erasureSegment exportsAudited: datastore auth, pinned images, IAP-only SSH

Building something with the same shape?

Most of this is reusable. The interesting conversation is which parts of it your product actually needs.