
Built out of our own headache
In Bali, villas and rooms are rented through Telegram groups and private messages: photos in a thread, prices in any currency, nothing you can search. We went through that ourselves while looking for places, so four of us started Willi to fix it.
I was the developer behind the whole product: the AI pipeline, search, payments, front end, backend, database and infrastructure. I also took part in the product decisions about where Willi should go. In eight months it grew to 5,000 daily users at its peak and several thousand listings.
From a chat message to a listing
Willi reads rental chats and sends every new message through an AI pipeline I built. First it decides whether the message is a listing, someone looking for a place, or noise. Then it pulls out the type, price, currency, rental period, bedrooms, amenities, dates and location, from Russian, English or a mix of both, including phrasing like “15 million for 5 months”.
The address gets geocoded, prices go into one comparable format, the description is translated both ways, and the photos are compressed and uploaded. A chat message ends up as a card you can search and filter.
Duplicates for almost nothing
The same villa gets posted in a dozen chats by the owner and three agents. I matched them by perceptual hashes of the photos, which still match after an image is re-saved or slightly changed, so duplicates drop out at almost no cost.
A feed that keeps itself fresh
Chat listings go stale fast: a villa gets rented and nobody deletes the post. I wrote the ranking that decides what sits higher in the feed. It weighs how well a card fits you (budget across currencies and rental periods, type, bedrooms, bathrooms, amenities), whether the owner is verified, whether the listing is promoted, and how fresh it is.
Older cards sink, a new post of the same place lifts it back up, and listings past their age leave the feed on their own.
Search and matching on the map
Search runs on PostgreSQL with PostGIS: real distances from you to each place and a radius on the map. Exact matches come first, close alternatives after.
It works both ways. Someone looking for a place can post a request with a budget, dates and area, and a background queue sends matching listings through the bot, with a deep link straight to the card.
Inside Telegram, payments included
There is no sign-up: the backend checks Telegram's signed initData and only then opens a session. Owners pay through Telegram invoices for extra listings and promotion, and every payment moves through explicit states, so a purchase is never applied twice or lost.
Payments worked; the business model was harder. People used Willi and thanked us for it, but we didn't want to charge renters, and an Airbnb-style commission puts you up against Airbnb. We haven't found a model we like yet, so Willi is on pause for now.
Stack






















