Pienten Suomi 2.0
A few years ago, Mari, the creator of Pienten Helsinki had an idea. What if there was a dedicated, community-driven map of all the interesting, family-friendly places to visit in Finland. The idea came about when we were on our many roadtrips and it seemed like the first time we ever heard of places was when we were literally passing their roadside sign.
There are thousands of small animal farms, public beaches, hiking paths, things to do and see, but for the most part, finding them was harder than actually visting them.
So she set about to collect these interesting family-friendly places from here readers. Thus Pienten Suomi (literally Finland for the little ones) was born. In its intial phase, it was a shared Google Maps. Every. Single. Entry. was updated by hand, and there were already hundreds of them!
Pienten Suomi v.1
I’ll get to the point (I promise!) but to set the stage for how Pienten Suomi 1.0 was born, I need to tell you about myself. In 2023, I turned 40. I am an university drop-out who had last sat at lecture in 2005. This had always bothered me, and it reached its climax as I hit my first middle-age crisis. So I signed up for school and started studying for a BBA in Information technology.
Why is this relevant, you ask? You see, during the first year my classes were basically programming and web development. I’m studying for a BBA, so I’m not and will never call myself an engineer or a programmer. But I learned just enough of the basics to be able to create something.
…with a little help from AI!
Yes, I was vibecoding before it was thing. Before it was cool.
At this point I’d hade a few web development classes, the most advanced being about React. So, with the help of the basics I’d learned from school, and some vibecoding with Gemini 1.5 and ChatGPT 3, I managed to get something resembling an actual app!
It was based on React, Vite and used Mapbox GL. It was beautiful!

Issues and Missed Potential
With Pienten Suomi 1.0, I had reached the limits of my own coding skills and AI was at this point nowhere near good enough to help me actually realize the vision.
While the map worked (sort-of) the site had a ton of usability issues, such as:
- The destinations were maintained by GeoJSON files on Mapbox. There was no true database. Adding a new place meant logging into Mapbox.
- There was no form connected to the map database (since there wasn’t one). The only form was a Google form that had to be sorted manually.
- There was way to filter by any attribute (since there was no data model)
None the less, it was still a marked improvement of the original.
Pienten Suomi 2.0 – The Realization of the Original Vision
AI Coding assistants have evolved rapidly since the spring 2024, and in early 2026 I was confident enough to give Pienten Suomi a new shot. Using Claude Code (mostly Sonnet 4.6) I started planning a rebuild of Pienten Suomi.
As Claude put it, the biggest issues were:
Key limitations of the current app (v1):
- Mapbox lock-in — 800+ destinations live inside Mapbox Studio as vector tile layers. Not portable, not queryable, costs money at scale.
- No real backend —
/tiplinks to a Google Form. No pipeline from suggestion → review → published destination.- Data is static — adding a destination requires Mapbox Studio access. No CMS, no structured editing.
- No filtering/discovery — users can only browse the map or search by place name. No “free playgrounds near Tampere” type queries.
- No destination detail pages — every destination is only a map popup. SEO dead-end.
The Web Stack
The stack we went with was
- React 19 + Vite 8 + TypeScript 6.0
- TanStack Router (file-based routing) + TanStack Query
- MapLibre GL JS v5 with OpenFreeMap
brighttiles - Tailwind CSS v4 +
@tailwindcss/typography - Cloudflare Workers + D1 + R2 (
img.pientensuomi.fi)
Layer Choice Reason Frontend React + Vite Familiar, no reason to switch Routing TanStack Router Better type safety and loader patterns than React Router Data fetching TanStack Query Clean async state management Map library MapLibre GL JS Open-source Mapbox GL fork, identical API, free Map tiles (basemap) OpenFreeMap Free community-hosted MapLibre tiles, no account needed Geocoding Photon by Komoot OSM data, no API key, no strict rate limits Database Cloudflare D1 (SQLite) Free tier: 5 GB, 25M reads/day, 50k writes/day API backend Cloudflare Workers Free tier: 100k req/day. Same ecosystem as Pages/R2 Image storage Cloudflare R2 Already in use at img.pientensuomi.fi, keep itHosting Cloudflare Pages Already in use, keep it PWA vite-plugin-pwa Keep it, works fine Analytics Cloudflare Web Analytics Free, no cookies, no consent banner needed, already in stack Styling Tailwind CSS Keep it
Standout Features

Suggestion & Error Report Form
- User fills in: name, category, coordinates (mini-map picker), description, website, contact email (optional), baby amenities (hoitopöytä / microwave / indoor toilet — checkboxes)
- POST → Worker → stored in
submissionstable withstatus = 'pending' - Editor reviews in a control panel, edits if needed, approves → promotes to
destinations
Faceted Filtering
Filters on the map view:
- Category (existing 10+ types)
- Region (maakunta)
- Cost (free / paid / mixed)
- Accessibility (wheelchair, stroller)
- Season (summer / winter / year-round)
- Age suitability (infants, toddlers, school-age, all)
- Baby amenities (checkboxes): hoitopöytä / microwave / indoor toilet
- Near me (sort by GPS distance — no filter, just reorder; Haversine calculated in the Worker over all rows, fast at current scale; add bounding box pre-filter if dataset grows beyond ~5,000 destinations)
Destination Detail Pages (/kohde/:slug)
Each destination gets a real URL and page with:
- Full description
- Opening hours, pricing, website link
- “Report an error” button (pre-fills the form)
schema.org/TouristAttractionstructured data for Google rich results- Social sharing OG tags (
og:title,og:description,og:image)

Star (or like) a Destination
Each destination can be starred (or liked). We want to facilitate a good-vibes-only approach so every destination can be starred but not downvoted (think of GithHub). Likewise, a 1-5 rating system just asking for abuse and trolling. Use Google Maps for that. Each page has a star and count number with the assumption that more stars indicate a popular and tested destination by the users.
The Admin Panel
Of the many things that I wanted to improve in the new version, none was as important as having an admin UI, where destinations could be edited, approved, rejected, deleted etc. In Pienten Suomi 2.0 we can handle all edits from its own control panel. No more jumping to a Google sheet and copy-pasting it into Mapbox!

Roadmap
Pienten Suomi 2.0 was launched April 9 2026. The most meaningful features are already live, as explained above. Going forward, I’m still looking into solving a few known issues, as well adding new features, such as:
Adding Images to Destinations
The destination pages already contain a placement for at least one hero image. The technical feasibility of this rests on two things:
- The images should be user generated. So I need a robust storage solution for these. Preferably for free.
- A solution to link the user generated content to the correct destination from the said storage solution.
Highlight Your Destination (Sponsored Destinations)
Functionally this feature is already live. We are already able to highlight sponsored destination. Sponsored destinations get a star-studden golden balloon that’s slightly larger than the neighoring balloons and has a tasteful pulse to attract clicks. It also appears earlier from other destinations when zooming in.
As we are still in the soft-launch phase, we haven’t rolled this out yet. But the business case is clear: for a small fee, we can improve the visibility of your destination.
Multilingual Destination Pages
The static content is already available in English. The objective is to at some point translate all destination descriptions into English as well. With AI, the translation is not an issue. The issue is more of how we’ll do this automatically, or will simply run a script daily, or something like that.
SSR Support for SEO
This one stings a bit. The whole site now has about 1000 unique pages with user generated content, yet each of these pages are currently basically garbage in the eyes of Google. The only viable solution to hook dynamic content up for indexing is by Server-Side Rendering. My current thinking is I’ll try to hook the page up to Tanstack Start at some point, once it reaches a stable version (it’s currently in RC). Until then, I’m trying to build this SPA as robustly as possible.
Thanks for reaching the end. Hope you give Pienten Suomi a try!