product and visual design
Systems people can build with, and a brand they recognise
Hi, I’m Erik. A product and visual designer based in Turku, Finland. For the past 10 years I’ve designed products, brands and visual systems for startups and large companies, including work in regulated healthcare.
Some of my work

Product Design · CardioSignal
CardioSignal Design System
A token-based system engineers use directly in Flutter.
CardioSignal, F-Secure, ParkMan
Illustration
Blog, event and email illustration in vector, bitmap and watercolour.

Product work
Visual work
Visual Designer · CardioSignal · F-Secure
Information Design.
Print and event design for consumer tech and regulated medtech. From data-heavy whitepapers to 3 m trade-show booths, built on consistent brand systems.


CardioSignal design system
Design system · Medtech · Accessibility · Mobile
tl;dr
I built CardioSignal’s design system from the ground up to give design and engineering one source of truth. It cut duplicate work, made every design decision traceable for medical device certification, and became the base for a second product, CardioSignal Inside, launched with Mehiläinen.
| ROLE | Product Designer, sole designer on the product, 2023 to present |
| TEAM | Flutter developers, product owner, regulatory team |
| SCOPE | Design system, design process, developer handover |
| TOOLS | Figma, Zeplin, Jira, Confluence |
| RESULT | 53 components in 17 categories, a traceable process, and a second product shipped in 5 months |
background
In a certified product, inconsistency is a compliance risk
CardioSignal detects signs of atrial fibrillation using the phone’s gyroscope sensors. It is Software as a Medical Device, built under IEC 62304, so every change has to be specified, reviewed and traceable.
problem
Screens, but no system
When I took over product design, there were screens but no system. In the code, the onboarding flow alone had 3 separate top bar components, 3 ways to close a screen and 4 tab components, each built from scratch. Colours were named after palettes, not roles, so nothing told developers which one to use where, and there were no accessibility requirements. What shipped often didn't match the designs.

DECISIONS
Three calls that shaped the system
In a regulated product, speed, flexibility and compliance rarely point the same way. These decisions set the balance.
01 Borrow the structure, own the look
We built on Material 3 rather than a custom system. Flutter supports it natively, so developers could adopt the tokens without rewriting the app. A custom system would have given more visual freedom, but Material 3 was faster and carried less regulatory risk.The structure is Material 3. The look is CardioSignal’s: its own colour scheme and type, applied to Material’s roles and scale.

Material design tokens
02 Put accessibility in the system, not the screens
Accessibility is built into the tokens and components, not checked screen by screen. Every text and background pair meets WCAG AA contrast, text sizes stay readable at every level of the type scale, and every tappable component has a 48dp minimum touch target. A new screen built from the system starts accessible.

Contrast of each colour role against its matching "on" colour. AA needs 4.5:1 for body text, AAA needs 7:1.
03 Bring regulatory in early to avoid rework later
Weekly syncs with developers and the regulatory team cost time every week while the system took shape. I chose that cost over late surprises. Regulatory could flag blockers before anything was designed, so no work went into solutions they wouldn't approve.
THE SYSTEM
Foundations first, then components
I defined colour, typography, spacing and elevation first. Eight tonal palettes feed a semantic colour scheme, so a role like Primary Container means the same thing in Figma and in code.On top sit 53 components in 17 categories, including medical ones like measurement results and cardiograms. Each one ships with usage guidelines developers build from directly.

A look into the component library
COMING TOGETHER
The activity calendar, redesigned for colour blindness
The activity calendar shows every measurement from the month at a glance. Most CardioSignal users are over 50, and many have some form of colour blindness. The old calendar told results apart by colour alone, so for many of them a normal day and a day with signs of atrial fibrillation looked the same.The new calendar pairs colour with shape. Signs of AF show as a ring, a measured day as a bold date with a dot, so the result reads the same with or without colour.
In the simulation, the old calendar’s green, amber and red turn into the same olive. The ring still shows signs of AF.
DESIGN TO CODE
Design and code speak the same language
Tokens follow Material 3 roles, so names match one to one. If the spec says Primary Container, the code says primaryContainer.
| In Figma | In Flutter |
|---|---|
| Primary | colorScheme.primary |
| On Primary | colorScheme.onPrimary |
| Title Large | textTheme.titleLarge |
| Body Medium | textTheme.bodyMedium |
Every change follows the same path, from requirement to design, build, design review, QA and release. Each step links to the last in Jira, which feeds the IEC 62304 documentation directly.

IMPACT
How CardioSignal builds products now
A second product in 5 months. CardioSignal Inside runs on the same system, so the team built features instead of components. Theming lets partners like Mehiläinen, one of Finland's largest private healthcare providers, apply their own brand so it feels native in their app.
Implementation matches design. Developers build from specs and tokens instead of guessing, so fewer fixes come up at design review.
Smoother handover and QA. QA tests against a single source of truth, so issues are faster to spot and settle.
Accessible and traceable by default. New screens inherit WCAG AA contrast, and every change links to a spec, a ticket and an approval.
REFLECTIONS
What I’d do differently
Make tokens live, not just named. Figma and Flutter share token names, but the values were matched by hand. Setting tokens up as Figma variables from day one would have let values sync straight to code.
Review with developers, not just hand over to them. Developers often saw a component for the first time at handover, when changes cost the most. Next time I’d bring them into component reviews early, while a change is still a conversation rather than a rework.
More of my work
CardioSignal, F-Secure, ParkMan
Illustration
Blog, event and email illustration in vector, bitmap and watercolour.


Designing with AI: Skeins
Design system · Medtech · Accessibility · Mobile
tl;dr
I used a real problem to test where AI fits in a design process: knitters lose count when they put their work down. I wrote the requirements, and Claude built a prototype, a design and the app. I tested, reviewed and reworked at every stage. AI made building fast. The test findings, the visual quality and the accessibility fixes came from the design process around it.
| ROLE | Product designer. Sole owner from research to a working first version. |
| TEAM | Solo, with Claude as builder and one experienced knitter for testing |
| SCOPE | Research, usability testing, UX, UI, design system, AI-assisted build |
| TOOLS | Claude, Figma, FigJam, React, Storybook, Supabase |
| RESULT | A working app, and a tested way of bringing AI tools into each step of the design process |
background
A small problem to answer a bigger question

AI tools can now build prototypes, designs and code from a description. I wanted to find out what that changes for a designer, and what it doesn't. Reading about it wasn't enough, so I ran a full project with AI from start to finish.I picked a problem I knew well. When I started knitting, the stitches weren't the hard part. Counting was. Shaped pieces repeat a cycle: knit a set number of rows, then add or remove stitches. Put the work down for a few minutes and the count in your head is gone. Many knitters still track it with pen and paper, and existing apps count rows without knowing where you are in the cycle.Small enough to finish, real enough to test with users.
Process
I designed. Claude Built.
I split the work along one line: AI makes things, I decide what they should be. Every stage ran the same loop. I wrote the requirements, Claude built them, I tested or reviewed the result, then I decided what to change.
Stage 1 · Prototype
Something to test before anything to design

I described how the counter should work: count rows, track a repeat cycle, flag when to increase. Claude built a working prototype in an afternoon. That changed the order of my process. I could test real behaviour before I drew a single screen.
The test

I gave the prototype to an experienced knitter and told him only that it was for knitters. Two problems came up within minutes.
What do I enter here? He didn't know what to put in the increase interval. The field asked for a number without saying what it meant.
Now, or after one more row? At row seven, the app said an increase was due on the next row. He couldn't tell if that meant now or after one more row.
Both came from the same place. The app assumed people already understood how patterns are structured. AI had built exactly what I asked for, and what I asked for was unclear. The brief changed: Skeins didn't need to count better, it needed to be clearer.
Four principles
The test gave me four principles. They became the brief for every stage after.
One action per moment. Every screen makes the next step obvious.
Context over count. A number means nothing without its position. Always show where the user is in the cycle.
Self-evident, not taught. If the main feature needs instructions, the design is wrong.
Built for interruption. Pick up exactly where you stopped, even days later.
Stage 2 · Design
AI gave me a draft. Taste made it a product.

I gave Claude the four principles, the screens I needed and what each one had to say. It produced a complete design fast. It was also generic: default blue and white, and information in the order it happened to be listed. Everything that makes Skeins feel like Skeins came from my review.
What I changed
Palette. Skeins belongs to the world of yarn, so I replaced the default blue with warm colours. Sand neutrals for surfaces, terracotta for the main action, sage for increases, ember for decreases, and shadows tinted warm instead of grey.
The counter card. I reordered it so the eye lands on "8 of 8" first, then the progress dots, then the prompt. The row number and its position in the cycle read as one unit, following "context over count".
The copy. The answer to finding two was words, not layout. On the action row the card now says "Increase on this row", and the main button changes colour and becomes "Increase done". Three signals, one message.
The setup screen. The answer to finding one: every number has a hint in knitter's words, and a live preview confirms the result, like "You'll increase on row 8, then every 8 rows after that."
Visual: before and after. The AI-built counter next to my final card.(Screenshot to add.)
Visual: palette and logo.

Stage 3 · App
A system that checks the work, mine included
For the build, I gave Claude the final design and a structure to follow: foundations, primitives, compounds, screens, the same order as in Figma. AI writes code fast, so the risk isn't speed. It's drift between design and code. A design system with built-in checks is how I kept control.
Tokens
Tokens come in two layers. Primitive tokens hold raw values, like a specific sand or terracotta. Semantic tokens say what a value is for, like the main action or an increase. Components only use semantic tokens, so dark mode is a remap of one layer instead of a rewrite.
Components in Storybook
7 primitives, 4 compounds and 5 screens, documented in 60 Storybook stories. Each story is a real state: the counter at row 1, on the action row, in decrease mode, in dark mode. Storybook is where I reviewed what AI built, state by state, instead of clicking through the app hoping to find problems.
Accessibility, caught by the system
Storybook runs an automated accessibility check on every story. It flagged four colours. They came from my own palette, and AI had carried them into code without question. The worst was the orange decrease button: white text on it scored 2.9:1, below the WCAG AA minimum. I fixed each colour once, at token level, and every component that used it was fixed with it. All 60 stories now pass WCAG AA in light and dark mode.
Saving progress
Supabase handles sign-in and stores each project, and each person can only see their own. When you come back, the app opens on the row you left. Without an account it saves on the device, so nobody has to sign up to try it.
Visual: Storybook token page and component overview.
Links: View Storybook · Try the app (add once published)
Impact
A working app and a process I can repeat
A working app. Skeins counts rows, flags every increase and decrease, and opens where you left off.
A design system in code. Two layers of tokens, 16 components, 60 Storybook stories, WCAG AA in light and dark mode.
A faster loop. From idea to a tested prototype in an afternoon. My time went to requirements, testing and review, not to building.
A clear split of roles. I know now which parts of my work AI can take on, and which parts it can't.
Honest scale. One tester and no usage data yet. The next step is to retest the new build with the same knitter.
Reflections
AI builds what you specify, not what you mean
• Requirements are the design now. AI built exactly what I asked for, including my mistakes. The prototype failed its test because my spec was unclear, not because the code was wrong. Writing clear requirements became the most important design skill in the project.
• Test earlier, because you can. When a prototype costs an afternoon, there's no reason to design before testing. One test changed what the product was about.
• Taste doesn't come from the tool. AI's design worked but looked like every other app. The palette, the layout and the words came from my review.
• Build checks into the system. AI won't question your choices. The accessibility check found problems in a palette I picked myself. Checks that run on every component are how you stay in control when a lot of code arrives fast.
• Next: retest with the knitter, connect Figma variables to the code tokens so they can't drift apart, and add pattern import.
Contact line (Eyebrow): Want to talk about design? Get in touch
Information Design

Illustration work
Illustration · Various projects
tl;dr
Illustration is where I get to play. When a brief leaves room for it, I give a brand its own characters, scenes and details, and several of the companies I’ve worked with did exactly that. I draw in vector (Illustrator) and bitmap (Procreate), and by hand in watercolour.
illustration
CardioSignal
Blog · 2021 to 2024
I illustrated CardioSignal’s blog, which explains why tracking your health, and your heart health in particular, matters. Each illustration had to carry the idea of its article at a glance.



vector illustration
F-Secure
Events · 2018 to 2021
Tech people love their stickers. Events and internal campaigns at F-Secure kept calling for new ones, from Christmas gifts and a welcome back to the office after Covid to event promotion.



vector illustration
ParkMan
Email campaigns · 2016 to 2017
ParkMan’s onboarding emails introduced the app and shared tips for parking smarter. I illustrated them in a classic stroke style, so each email was easier and more fun to read.



More of my work

Product Design · CardioSignal
CardioSignal Design System
A token-based system engineers use directly in Flutter.
About me
Hi, I’m Erik. A product and visual designer based in Turku, Finland.For the past 10 years I’ve designed products, brands and visual systems for startups and large companies, including work in regulated healthcare.I start with research and validate through testing, so decisions are grounded in evidence rather than opinion. I work closely with engineering, marketing, sales and regulatory teams, and I’m comfortable owning a product from first concept to release.My focus is clarity: experiences that are easy to understand, easy to use and accessible to people of all ages. Function comes first. Craft and visual quality are how I make it feel right.
Experience
| Role | Company | Years |
|---|---|---|
| Product Designer | CardioSignal | 2023 to now |
| Visual Designer | CardioSignal | 2021 to 2023 |
| Brand Designer | F-Secure | 2020 to 2021 |
| Visual Designer | F-Secure | 2018 to 2020 |
| Product Designer | Suomen Hosting Palvelu | 2017 to 2018 |
| Product Designer | ParkMan | 2016 to 2017 |
Education
Bachelor of Engineering, Information Technology, Turku University of Applied Sciences
Languages
Spanish (native), English (fluent), Finnish (beginner)













