Case study · 08.2026
kajakipodwarszawą
A map-first guide to 150+ kayak rentals on 14 rivers around Warsaw, with a self-service panel for businesses, online payments and push notifications.
Project facts
- Role
- Product, design & engineering
- Timeline
- ~2 weeks, Aug–Sep 2026
- Scope
- Web app, B2B panel, payments
- Status
- Live
01
Context
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.
02
The Challenge
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:
- Three audiences with different needs: paddlers, rental owners and search engines.
- Low-cost shared hosting: PHP only, with no Node.js or Python runtime and no managed database.
- Customers who are seasonal, log in a few times a year and prefer to decide over the phone.
- A privacy standard strict enough that no cookie banner would be needed.
- A team of one, working evenings and weekends.
03
The Solution
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.
Interactive Map
150+ 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.
Trip Weather
A multi-day forecast on every river and town page, with a plain-language hint on whether to pack a rain jacket.
SEO Landing Pages
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.
Business Panel
Self-service accounts with email activation and password reset. Owners manage their profile, video and promotions themselves.
Online Payments
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.
Push Notifications
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.

04
Key Product Decisions
Static-first, on a deliberately simple stack
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.
Privacy by design, not by banner
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.
Pricing that fits a seasonal business
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.
A visual identity that doesn't look generated
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.
05
The 8-bit Edition
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.

06
Results
- Weeks to Launch
- ~2
- Kayak Rentals
- 150+
- Rivers
- 14
- Towns
- 38
- SEO Landing Pages
- 54
- Issues Caught in Review
- 16
- Cookies
- 0
- Backend Dependencies
- 0
07
Tech Stack
- PHP 8.1
- SQLite
- Vanilla JS
- MapLibre GL
- OpenFreeMap
- Open-Meteo
- Stripe Checkout
- Web Push (VAPID)
- PostHog EU
- PWA
- Hostinger
- Claude Code
08
How AI Changed the Process
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.
Build in one focused loop, review with many agents
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.
Persistent project memory
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.
Guardrails for real-world side effects
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.
09
What's Next
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 and ultimately – following the confirmation of its effectiveness on the domestic market – the solution will be ready for expansion into European and global markets.
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.