Projects3 min read

SafkaSeula: Building a Finnish Pet Allergen Checker

SafkaSeula started at Christmas dinner. My sister-in-law Anna, who is active in the Finnish agility dog community, kept hearing the same complaint from friends with allergic dogs: finding safe food meant visiting a store, picking up a bag, squinting at the ingredients, putting it back, and repeating forty times. Finland has hundreds of pet food brands, each with ingredient lists formatted differently, using inconsistent terminology, with no single place to search across all of them. By the end of the evening we had decided to build one. SafkaSeula is live at safkaseula.fi and is entirely free to use.

The concept is simple: enter what your pet is allergic to, and the app shows you food products that do not contain those ingredients. The database currently covers 500+ pet foods across 19 allergen categories, everything is in Finnish, the product database covers Finnish and Nordic markets, and the interface is designed to be usable by someone standing in a pet shop aisle trying to read the back of a bag.

Technical choices

SafkaSeula is built on Next.js 14 with the App Router, TypeScript, Supabase for the database and auth, and Tailwind for styling. These are not interesting choices, and that is intentional. The interesting problem in SafkaSeula is the data model and the matching logic, not the stack.

Allergen matching is harder than it looks. An allergy to chicken is one ingredient to check, but an allergy to poultry requires matching chicken, turkey, duck, goose, and any derivative listed as an ingredient, and an allergy to grain requires matching wheat, barley, rye, oats, corn, and about thirty variations of how they appear on Finnish packaging. The hidden complexity the project page describes well: 'chicken' alone appears on Finnish pet food labels as poultry, poultry meal, chicken fat, hydrolyzed poultry protein, and a dozen other variants. Without systematic matching, even careful readers miss allergens hiding behind unfamiliar terminology. The ingredient taxonomy in the database handles this: each of the 19 allergen categories maps to a curated set of ingredient patterns, and matching runs against normalized ingredient text rather than raw strings.

The localization detail that took the most time

Finnish is an agglutinative language, meaning words are built by stacking suffixes, so the word for chicken takes the form kana in nominative singular, kanan in genitive, kanaa in partitive, and kana- in a compound, and ingredient lists use all of these interchangeably. A naive string match on "kana" will miss "kananlihaa" (chicken meat, partitive) entirely.

The solution was a combination of lemmatization using a Finnish morphological analyzer and a manually curated synonym list for ingredient forms that appear most frequently in pet food labels, and the curated list took longer to build than the application itself, which is fairly typical of localized data products.

What it taught me about product scope

The original version had a product submission flow so users could add products themselves, a recommendation engine, and a comparison view. I cut all of it before launch. The core loop, enter allergens and see safe products, is the only thing that needed to exist, and every feature I removed made the thing I kept more useful, which is a lesson I have had to learn several times over. What is coming next: automated product scraping from Finnish retailers, price comparison, cat food database expansion, and eventually a mobile app. The full project page has the roadmap and the complete feature breakdown. Anna knows what pet owners need, I know how to build it, and so far that division of labour has worked well.

Let's Talk

Let's build something
worth talking about.

I take on a limited number of advisory and fractional engagements. Only projects where I can make a real difference. If you're navigating growth, AI, or revenue challenges in a technical B2B environment, let's talk.