Contents

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!

https://img.paasi.org/pienten-suomi-one_1.png
Screenshot of Pienten Suomi 1.0, launched spring 2024

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):

  1. Mapbox lock-in — 800+ destinations live inside Mapbox Studio as vector tile layers. Not portable, not queryable, costs money at scale.
  2. No real backend/tip links to a Google Form. No pipeline from suggestion → review → published destination.
  3. Data is static — adding a destination requires Mapbox Studio access. No CMS, no structured editing.
  4. No filtering/discovery — users can only browse the map or search by place name. No “free playgrounds near Tampere” type queries.
  5. 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 bright tiles
  • Tailwind CSS v4 + @tailwindcss/typography
  • Cloudflare Workers + D1 + R2 (img.pientensuomi.fi)
LayerChoiceReason
FrontendReact + ViteFamiliar, no reason to switch
RoutingTanStack RouterBetter type safety and loader patterns than React Router
Data fetchingTanStack QueryClean async state management
Map libraryMapLibre GL JSOpen-source Mapbox GL fork, identical API, free
Map tiles (basemap)OpenFreeMapFree community-hosted MapLibre tiles, no account needed
GeocodingPhoton by KomootOSM data, no API key, no strict rate limits
DatabaseCloudflare D1 (SQLite)Free tier: 5 GB, 25M reads/day, 50k writes/day
API backendCloudflare WorkersFree tier: 100k req/day. Same ecosystem as Pages/R2
Image storageCloudflare R2Already in use at img.pientensuomi.fi, keep it
HostingCloudflare PagesAlready in use, keep it
PWAvite-plugin-pwaKeep it, works fine
AnalyticsCloudflare Web AnalyticsFree, no cookies, no consent banner needed, already in stack
StylingTailwind CSSKeep it

Standout Features

https://img.paasi.org/pienten-suomi-two_01.png
Screenshot of Pienten Suomi 2.0, launched spring 2026

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 submissions table with status = '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/TouristAttraction structured data for Google rich results
  • Social sharing OG tags (og:title, og:description, og:image)

https://img.paasi.org/pienten-suomi-two_02.png
The Destination Page on Pienten Suomi, spring 2026

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!

https://img.paasi.org/pienten-suomi-two_03.png
The Admin Panel on Pienten Suomi, spring 2026

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:

  1. The images should be user generated. So I need a robust storage solution for these. Preferably for free.
  2. 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!