A map-first guide to 162 kayak rentals on 14 rivers around Warsaw, with a self-service panel for businesses, online payments and push notifications.
Within 150 km of Warsaw there are more than 150 kayak rentals spread across a dozen rivers. Most are small, family-run, seasonal businesses. Their information is scattered across outdated websites, social media profiles and phone numbers passed on by word of mouth.
For someone planning a weekend on the water, there was no single place to compare rivers, find a rental on the right stretch and check the forecast before setting off.
The goal was to build the reference guide to kayaking around Warsaw. It had to be useful enough for paddlers to come back to, and valuable enough for rental owners to pay for visibility. The work came with a clear set of constraints:
One service with three layers: a public, map-first guide for paddlers, a generated SEO layer for search engines and AI assistants, and a self-service panel where businesses manage their presence and pay for promotion.
162 pins across 14 rivers and 38 towns, each with a phone number, website and business profile. Deep links lead straight to any river, town or rental.
A multi-day forecast on every river and town page, with a plain-language hint on whether to pack a rain jacket.
54 pages generated from the database, one for each river and town, with structured data, social cards and an llms.txt file for AI assistants.
Self-service accounts with email activation and password reset. Owners manage their profile, video and promotions themselves.
Stripe Checkout for profiles and promotions. Payments are confirmed by webhook, verified again with Stripe on return, and each receipt is saved to the account.
Paddlers follow a river, a town or a single rental. Businesses pay to reach them, with daily and weekly limits that protect subscribers from spam.
Public pages are generated as static HTML from a single SQLite database, with a small plain-PHP API behind the panel. There's no framework and no backend dependencies. The service runs on low-cost hosting, loads fast and costs almost nothing to operate. Components that would normally come from a library, such as Web Push encryption and VAPID signing, were built in-house and validated against the reference test vectors in RFC 8291.
The site sets no cookies, so it needs no consent banner. Analytics runs in PostHog's EU region without persistent identifiers, fonts are self-hosted and YouTube videos load only on click. Spam protection uses rate limits, a honeypot field and timing checks instead of a third-party CAPTCHA. Password rules follow NIST SP 800-63B.
Every rental gets a free pin. A full business profile is a one-time fee of 299 PLN, with no subscription. Promotions are sold per push notification and priced by reach, from 10 PLN for a rental's own followers to 100 PLN for all subscribers, plus a surcharge for links that lead off the site.
The classic edition has its own typography and a palette in which every colour pairing is checked for a11y contrast. On top of that, the whole service has a second, fully functional skin, described below.
Available at /8bit/ and switchable from the theme menu, the 8-bit edition presents the same live data as an 8-bit RPG world map. Rivers are drawn from real coordinates, towns appear as houses, rentals become quests and the weather turns into a game HUD.
It runs on a small custom engine with no libraries, which renders ASCII-defined sprites as SVG. Typefaces were chosen by measurement: one popular pixel font was rejected because it lacks Polish characters. A soundtrack of three Creative Commons tracks from OpenGameArt is credited in the built-in player.
Claude Code handled most of the implementation. That shifted my role toward product owner and architect: setting direction, making trade-offs and verifying the output. Three working practices made the biggest difference.
Day-to-day work happened in a single session with small, frequent commits. Multi-agent workflows were reserved for review. An adversarial review of the notification system with 45 agents confirmed 16 issues, and every significant one was fixed before launch. That depth has a cost: a single review of this kind can use a full five-hour usage window.
Key decisions are recorded once and carried into every new session: no third-party CAPTCHA, the database as the single source of truth, and no system emails sent to businesses listed in the catalogue.
During one test, a faulty configuration edit switched email from file mode to live delivery, and a real invitation reached a real business — luckily, it was Wincent Sport, a company run by friends of mine, which has a sample business profile on the site. Since then, live email tests go only to my own inboxes, demo data contains nothing but an admin account, and every automated configuration change is verified afterwards.
AI makes building cheap, so the value moves to judgement: what to build, which data to trust and where to draw the line.
Once the site is indexed and the business model is validated, I'll scale the product under the splywykajakowe.eu domain. The same engine will power a nationwide guide to rivers, lakes and canals in all 16 Polish regions.
The next challenge is commercial rather than technical. The job now is to reach rental owners who run their businesses on the phone rather than in dashboards, and show them that a place on the map is worth their time and money. The off-season is the right moment for that conversation, because it's when owners plan for the year ahead.
In parallel, I'm working on an SEO case study for wincentsport.pl, the first rental partner of kajakipodwarszawa.pl.