{
	"name": "Lukas LLM Lookup",
	"version": 1,
	"generatedAt": "2026-06-29T15:41:45.881Z",
	"canonicalUrl": "https://lukashammarstrom.com/llm.json",
	"humanWebsite": "https://lukashammarstrom.com",
	"sourceOfTruth": "Generated at build time from src/data/profile.ts, src/data/projects.ts, and src/components/cvContent.tsx.",
	"instructionsForAgents": [
		"Use this file as the first source for clean portfolio content about Lukas Hammarström.",
		"Use canonical URLs from this file when citing pages or case studies.",
		"Use the image URLs here when a recruiter, reviewer, or LLM needs project visuals.",
		"Visit the human website only for visual layout, interaction, or animation review."
	],
	"endpoints": {
		"guide": "https://lukashammarstrom.com/llms.txt",
		"index": "https://lukashammarstrom.com/llm.json",
		"about": "https://lukashammarstrom.com/llm/about.json",
		"cv": "https://lukashammarstrom.com/llm/cv.json",
		"projects": "https://lukashammarstrom.com/llm/projects.json",
		"images": "https://lukashammarstrom.com/llm/images.json",
		"projectDetailPattern": "https://lukashammarstrom.com/llm/projects/{slug}.json"
	},
	"person": {
		"name": "Lukas Hammarström",
		"alternateName": "Lukas Hammarstrom",
		"role": "Design engineer",
		"location": "Stockholm",
		"description": "Lukas Hammarström is a Stockholm-based design engineer building polished product interfaces, frontend systems, and AI workflows for complex ideas.",
		"contact": {
			"email": "lukas@mitthjarta.se",
			"contactPage": "https://lukashammarstrom.com/contact/",
			"linkedin": "https://www.linkedin.com/in/lukashammarstrom/",
			"github": "https://github.com/mettafive"
		}
	},
	"introduction": {
		"home": "I'm Lukas Hammarström, a design engineer based in Stockholm. I turn complex domains into product surfaces that feel calm, fast, and obvious — then polish the details users actually feel. If you want to build something together, say hi.",
		"aboutLead": [
			"I’m Lukas Hammarström, based in Stockholm. I’m obsessed with creating beautiful products — taking messy ideas, systems, and interfaces and shaping them into experiences that feel clear, natural, and useful.",
			"Right now, I’m focused on the new interfaces we need as software starts doing more of the work."
		],
		"cvLead": "Making complex systems feel calm, fast, and beautiful."
	},
	"about": {
		"lead": [
			"I’m Lukas Hammarström, based in Stockholm. I’m obsessed with creating beautiful products — taking messy ideas, systems, and interfaces and shaping them into experiences that feel clear, natural, and useful.",
			"Right now, I’m focused on the new interfaces we need as software starts doing more of the work."
		],
		"thread": {
			"title": "The thread behind the work",
			"paragraphs": [
				"Before I had words for design, product, or engineering, I was just a kid on my dad’s MacBook, sneaking into Photoshop — finding gradients and becoming completely obsessed with them. I would try to recreate them with the brush tool, badly. I also remember staring at screens and thinking: when I’m older, I’m going to have so many of these. Now I do.",
				"In a strange way, my product career started before I knew it was one. As a kid, RuneScape pulled me into a world of systems, markets, tools, communities, and real users. I started out barely understanding the language. Years later, I was building tools used by tens of thousands of players in a small, intense corner of the internet.",
				"Back then, I was already trying to make things easier to understand. More useful. Better looking. Less annoying. I was already collaborating with the nerds and builders around me.",
				"That part has not really changed.",
				"I still like figuring out how things work. I like pushing tools until I understand their edges. I like making things that people actually use. I like being useful.",
				"These days, I work somewhere between product, design, and engineering. I like taking complex systems and turning them into something calm, clear, and genuinely nice to use.",
				"Being mostly self-taught has given me a slightly strange path through tools. Photoshop turned into Figma. Figma turned into Webflow. Webflow turned into AI systems, local agents, harnesses, and whatever strange thing I’m trying to understand and push forward next.",
				"The thread has always been the same: curiosity, obsession, and the need to make the thing feel better than it did before.",
				"I have some questionable quirks too. I drink a little too much Trocadero, and I keep a whiteboard next to my bed. At one point, my partner came home and found that I had mounted ANOTHER ONE. That one did not last long.",
				"Over the years, this obsession has turned me into a one-person product team. Every year-long chapter of obsession turned into another layer in my stack. I can move from idea to interface to implementation without much friction. But the point was never to work alone. I want to work on difficult problems, perhaps even impossible ones, with people who also have whiteboards in their living rooms.",
				"Wherever I land, I just want to do great work with great people, with a product cool enough to sweep me off my feet."
			],
			"signoff": "All the best"
		}
	},
	"cv": {
		"lead": "Making complex systems feel calm, fast, and beautiful.",
		"skills": {
			"primary": [
				"Product design",
				"Frontend engineering",
				"Interaction design",
				"Design systems",
				"AI product UX",
				"Prototyping to production"
			],
			"more": [
				"React architecture",
				"Scalable UI patterns",
				"Micro-interactions",
				"Performance-minded UI",
				"AI workflow UX",
				"Information architecture",
				"Human-in-the-loop systems",
				"High-velocity shipping",
				"Visual craft"
			],
			"tools": [
				{
					"label": "React",
					"detail": "Architecture, components, stateful product surfaces"
				},
				{
					"label": "TypeScript",
					"detail": "Typed UI, safer production iteration"
				},
				{
					"label": "Tailwind",
					"detail": "Responsive polish and design tokens"
				},
				{
					"label": "Figma",
					"detail": "High-fidelity design, prototypes, systems"
				},
				{
					"label": "Adobe Suite",
					"detail": "Visual craft, assets, polish"
				},
				{
					"label": "AI agents",
					"detail": "Workflow harnesses, structured outputs, review loops"
				}
			]
		},
		"experience": [
			{
				"period": "Mar 2026 – Present",
				"title": "Founder & Design Engineer, PrivatVet",
				"paragraphs": [
					"Designed, built, and launched PrivatVet, a free national veterinary-care search and clinic-discovery tool, growing from zero to 20,000 monthly users in three months, with 4:45 average session duration and a 20% bounce rate.",
					"Created the product across strategy, UX/UI, search experience, clinic profiles, technical architecture, SEO, frontend, backend, copy, image generation, and launch.",
					"PrivatVet now runs as a maintained public tool for pet owners and independent clinics, supported through insurance partnerships.",
					"Built the platform as discovery infrastructure for independent clinics: a scalable search layer, custom integrations, and centralized product leverage for a market of 700 independent clinics increasingly competing with investment-backed chains."
				]
			},
			{
				"period": "2025 – 2026",
				"title": "Product & Technology Lead, Independent Animal Hospital",
				"paragraphs": [
					"Joined a 15-person team opening a new independent animal hospital in southern Sweden, acting as the product and technical force multiplier across digital infrastructure, customer acquisition, and operational systems.",
					"Designed and implemented the hospital's digital layer: website, booking flows, service pages, local SEO, content strategy, analytics, software setup, hardware setup, and internal workflows.",
					"Built the system with multi-location ambition - creating reusable service structures, acquisition patterns, and operational foundations that could support more clinics over time.",
					"Helped the hospital outrank major veterinary chains for competitive local search terms around acute veterinary care and vaccinations in Malmö, contributing to 3,000 customers in year one.",
					"This work exposed the market gap that later became PrivatVet: independent clinics need the same discovery, SEO, integration, and product leverage that large chains already have."
				]
			},
			{
				"period": "Jan 2025 – Present",
				"title": "Co-Founder, Open Research Institute",
				"paragraphs": [
					"Co-building a pseudonymous research network for AI researchers, technologists, founders, and domain experts to find peers, compare context across disciplines, and make isolated work visible.",
					"The group brings together a rare mix of emerging researchers, established operators, prominent tech figures, and domain experts - creating a setting where people can share ideas, work, and early insights under anonymous pseudonyms, judged more by quality of thought than institutional status."
				]
			},
			{
				"period": "2025",
				"title": "Product Designer & Frontend Engineer, Finnova",
				"paragraphs": [
					"Built an AI-assisted grant discovery and application workflow for Swedish founders in a small team, productizing years of hands-on experience winning government funding for clients.",
					"Led product positioning, onboarding, information architecture, dashboard UX, ranked grant matching, application generation, and frontend implementation.",
					"Designed the core AI workflow layer: context collection, eligibility reasoning, opportunity prioritization, model routing, structured outputs, draft generation, and human-in-the-loop review.",
					"The challenge was not just making LLMs write, but making them act inside a real funding workflow - turning messy founder input and fragmented public grant data into explainable matches, clear recommendations, and usable application drafts."
				]
			},
			{
				"period": "Jan 2021 – Jan 2025",
				"title": "Co-Founder & Product Lead, Bottel",
				"paragraphs": [
					"Turned a \"why doesn't this exist?\" insight into a funded recycling-infrastructure company for modern deposit-return systems.",
					"Originated the product vision, shaped the go-to-market narrative, raised capital across government funding rounds and private investors, and secured an R&D agreement with TOMRA, a core infrastructure player in deposit-return systems.",
					"Designed the product layers connecting consumers, grocery chains, system operators, reverse-vending machines, regulated payments, compliance logic, and stakeholder workflows.",
					"Built Bottel as white-label infrastructure for national recycling markets - a Shopify-style foundation for deposit-return systems, helping countries and operators launch modern return systems without starting from scratch.",
					"Worked alongside deep industry expertise from inside Estonia's recycling system, translating regulated infrastructure knowledge into B2B/B2G software for circular economy markets."
				]
			},
			{
				"period": "2016 - 2023",
				"title": "Independent Designer & Product Partner",
				"paragraphs": [
					"A full product team compressed into one person. Delivered 20+ projects for local businesses, startups, scaleups, and larger organizations - from brand systems and websites to MVPs, fundraising narratives, internal tools, and full product builds.",
					"Worked across strategy, UX/UI, implementation, content, and launch, often taking projects from unclear problem to usable software.",
					"Used no-code and low-code as a product lab: Framer, Webflow, Wized, Wix, WordPress, FlutterFlow, Xano, and Zapier. When the ambition stopped fitting inside the tool, I taught myself to build the real thing."
				]
			},
			{
				"period": "Jan 2015 – Aug 2016",
				"title": "Product Lead, BlueDot",
				"paragraphs": [
					"Moved to Herzliya Pituach, Israel at 21 and grew from intern into product lead at BlueDot, an early machine-learning fintech of roughly 100 people.",
					"Joined a company with strong engineering and sales but no formal product function, and helped build product discipline across roadmap ownership, workflow design, internal tooling, prioritization, stakeholder management, and CEO/board-level product communication.",
					"Led product work on internal invoice-processing tools for pre-LLM machine-learning workflows with messy data, human operators in the loop, live customer pressure, and Fortune 100 customers.",
					"Redesigned queue prioritization, client-based batching, exception handling, dismissal flows, and processor cognitive load - helping move invoice-processing throughput from roughly 15 invoices per hour toward 100.",
					"Also built hiring tooling that let the team interview 20 candidates in parallel instead of two."
				]
			}
		],
		"boardsAndAdvisory": [
			{
				"period": "Ongoing",
				"title": "Board Member & Technology Lead, Mitt hjärta",
				"paragraphs": [
					"Board member and product/technology lead across a family-owned operating group, with ventures spanning healthcare, animal care, public health, land, equestrian, music, and related fields.",
					"I support the group's product and technology layer: keeping established operations resilient, building internal systems, and helping new initiatives move from ambiguity to something people can actually run."
				]
			}
		]
	},
	"projects": [
		{
			"type": "case-study",
			"slug": "conductor",
			"name": "Conductor",
			"year": "2026",
			"url": "https://lukashammarstrom.com/projects/conductor/",
			"liveUrl": "https://mettafive.github.io/agent-conductor/",
			"quickRead": [
				"Conductor is a local control room for agent work. It turns a plain SKILL.md into a live workflow of cards, dependencies, checks, artifacts, and memory, so long AI runs become visible enough to supervise, verify, and eventually trust headless. The shorthand is Trello for agents. The real problem is the black box between prompt and result."
			],
			"technologies": [
				{
					"name": "React",
					"reason": "Used for the live board, card states, artifacts, and product surfaces."
				},
				{
					"name": "TypeScript",
					"reason": "Used for workflow schemas, status files, card contracts, and safer runtime changes."
				},
				{
					"name": "Framer Motion",
					"reason": "Used for card movement, lifecycle transitions, and small timing details that make the board feel alive."
				},
				{
					"name": "Node CLI",
					"reason": "The local runtime: compile, validate, dispatch, check, pause, and archive."
				},
				{
					"name": "Filesystem state",
					"reason": "Artifacts, receipts, run history, and migration metadata stay inspectable on disk."
				},
				{
					"name": "Provider adapters",
					"reason": "Claude, Codex, Hermes, or another CLI agent can run through the same workflow model."
				},
				{
					"name": "Figma",
					"reason": "Used for board interaction design, state modeling, product framing, and making the agent workflow surface feel legible."
				}
			],
			"scaleProof": [],
			"role": [
				"I designed and built Conductor end to end: the workflow model, local CLI, React board, dependency graph, card states, checker loop, artifact system, provider adapters, and the interaction language that makes agent work observable instead of opaque."
			],
			"techUsed": [
				"Conductor is built as a TypeScript and React-based local workflow system with a Node CLI, a portable JSON workflow spec, filesystem-backed run state, markdown artifacts, and agent-driven compose/check/repair loops. The stack was chosen because the product needed to stay local, inspectable, easy to run from terminal workflows, and useful across different agent providers."
			],
			"challenge": [
				"The hard part was not getting agents to run. It was making long work readable enough to judge.",
				"Agents are increasingly good at producing output, but the process often disappears into terminals, logs, and confident done messages. Conductor is built for the missing middle: what is happening, what is blocked, what failed, what passed, and where a human should step in.",
				"The product challenge was compression: take a complex orchestration system and reduce it to one command, one local board, and one mental model."
			],
			"systemModel": {
				"title": "From prompt to workflow",
				"intro": "A raw prompt has no structure: no cards, no dependencies, no live state, and no accepted proof. The system shift is that AI orchestration stops being a linguistic problem - writing a better prompt - and becomes an architectural problem: mapping a better graph. Conductor turns that graph into a repeatable workflow: migrate the skill, map dependencies, run under supervision, then fold useful findings into the next loop.",
				"inputs": [],
				"items": [
					{
						"title": "Migrate the skill",
						"body": "Setup starts from the plain skill file. Conductor reads the original instructions and turns them into concrete cards, each small enough to execute and verify without losing the intent of the whole workflow."
					},
					{
						"title": "Map the graph",
						"body": "The cards become a dependency graph: what must happen first, what can fan out in parallel, and what should wait for proof. This is where a long prompt becomes a runnable system."
					},
					{
						"title": "Run under supervision",
						"body": "The board makes execution legible while it happens. Cards move through pending, running, checking, and done; failures loop back with feedback; artifacts prove completion; and a human can steer without reading raw terminal noise."
					},
					{
						"title": "Improve the next loop",
						"body": "Useful findings are saved for the workflow, not trapped inside a single run. Worker insights and human comments fold back into the plan before the next round starts, so repeated work becomes clearer and cheaper to supervise."
					}
				]
			},
			"implementation": {
				"body": [
					"Implementation meant building an execution environment around the agent instead of another prompt. The product needed a CLI that could compile skills into cards, a board that could narrate state, a checker loop that could block weak output, and artifacts that made completion auditable."
				],
				"items": [
					{
						"title": "Skill to workflow",
						"body": "The CLI turns a plain skill or runbook into a workflow file, validates the graph, initializes status, and gives each card enough context to be executed independently."
					},
					{
						"title": "Worker and checker loop",
						"body": "Cards are executed by bounded workers, then checked against the original card instruction. Failed cards stay visible and can retry instead of silently becoming accepted output."
					},
					{
						"title": "Artifact-based completion",
						"body": "Done requires a browsable markdown receipt under `.conductor/artifacts/`. The artifact contains the real work product or action record, so progress can be reviewed after the run."
					},
					{
						"title": "Watchable local board",
						"body": "The board reads the local run state and shows what is happening in plain operational states. It is built for watching agent work happen, not for hiding execution in a black box."
					}
				]
			},
			"result": [
				"Conductor is a study in making autonomous work operational: carry context, gate handoffs, preserve receipts, and turn useful feedback into the next run.",
				"The product lesson is simple: agents become more useful when the surrounding system is readable enough for humans to judge and structured enough for agents to stay oriented."
			],
			"resultProof": [
				{
					"value": "run",
					"label": "one command entry",
					"detail": "`npx conductor-board run SKILL.md` compiles, opens the board, dispatches workers, checks output, and archives the run."
				},
				{
					"value": "check",
					"label": "verification gate",
					"detail": "Each card is evaluated against the instruction that created it before it can move to done."
				},
				{
					"value": "artifacts",
					"label": "durable proof",
					"detail": "Completed cards leave markdown receipts that can be opened, read, and audited after the agent finishes."
				}
			],
			"standouts": [
				"Turns agent work into cards that can be independently checked instead of relying on the worker's own confidence.",
				"Makes the workflow visible in a live local board so humans can watch, pause, steer, and understand the run.",
				"Uses artifacts as proof of completion, which makes agent output much easier to audit after the fact.",
				"Creates a learning loop from worker insights and human comments so repeated workflows can improve rather than restart from scratch."
			],
			"summary": [
				"Conductor is a design-engineering project about the UX of autonomous work: expose the missing middle, make completion verifiable, and give agents a better environment for serious work."
			],
			"images": [
				{
					"context": "project card image",
					"url": "https://lukashammarstrom.com/case-studies/conductor/conductor-card.webp",
					"path": "/case-studies/conductor/conductor-card.webp",
					"alt": "Conductor portfolio card",
					"width": 1200,
					"height": 600
				},
				{
					"context": "mobile/project card image",
					"url": "https://lukashammarstrom.com/case-studies/conductor/conductor-card-760.webp",
					"path": "/case-studies/conductor/conductor-card-760.webp",
					"alt": "Conductor portfolio card, smaller source",
					"width": 760
				},
				{
					"context": "home and projects grid thumbnail",
					"url": "https://lukashammarstrom.com/case-studies/home-thumbs/conductor.webp",
					"path": "/case-studies/home-thumbs/conductor.webp",
					"alt": "Conductor thumbnail"
				},
				{
					"context": "project hero image",
					"url": "https://lukashammarstrom.com/case-studies/conductor/hero-hands.webp",
					"path": "/case-studies/conductor/hero-hands.webp",
					"alt": "Conductor hero image"
				},
				{
					"context": "implementation screen",
					"url": "https://lukashammarstrom.com/case-studies/conductor/source-home.jpg",
					"path": "/case-studies/conductor/source-home.jpg",
					"alt": "Conductor website hero showing verified cards, live updates, prewarmed workers, and self-improving workflows",
					"caption": "The public site frames the product around one principle: conduct agents through a checked, watchable run instead of trusting a single long prompt.",
					"width": 1440,
					"height": 1100
				},
				{
					"context": "implementation screen",
					"url": "https://lukashammarstrom.com/case-studies/conductor/source-mobile.jpg",
					"path": "/case-studies/conductor/source-mobile.jpg",
					"alt": "Conductor website shown in a narrow mobile viewport",
					"caption": "The same idea is kept compact on mobile: verified cards, live updates, prewarmed workers, and a board that can be read like a story.",
					"width": 390,
					"height": 1200
				}
			]
		},
		{
			"type": "case-study",
			"slug": "privatvet",
			"name": "PrivatVet",
			"year": "2026",
			"url": "https://lukashammarstrom.com/projects/privatvet/",
			"liveUrl": "https://privatvet.se/",
			"quickRead": [
				"PrivatVet is a national veterinary search product for Sweden, now used by 20,000 monthly users. I designed and built the product, data model, frontend, enrichment workflows, clinic verification system, treatment-page architecture, and price-monitoring layer.",
				"It started as the tech layer for one independent animal hospital. In three months, it became a search and discovery system with 700 clinic profiles, 400 treatment pages, and 15,000 monitored price points."
			],
			"technologies": [
				{
					"name": "Next.js",
					"reason": "Used for the App Router product surface, dynamic routes, metadata, sitemaps, and production builds."
				},
				{
					"name": "Vercel",
					"reason": "Used for production hosting, preview deployments, static builds, and a fast review loop while the public product evolved."
				},
				{
					"name": "React",
					"reason": "Used for interactive clinic search, maps, dashboards, forms, and reusable UI components."
				},
				{
					"name": "TypeScript",
					"reason": "Kept clinic, treatment, animal, price, route, and enrichment data safer as the product grew."
				},
				{
					"name": "Tailwind",
					"reason": "Used for fast iteration across dense responsive public, admin, and dashboard surfaces."
				},
				{
					"name": "Supabase",
					"reason": "Used for auth, storage-adjacent workflows, and database-backed product operations."
				},
				{
					"name": "Drizzle/Postgres",
					"reason": "Used for typed database work, migrations, clinic data, treatment matches, pricing, and enrichment state."
				},
				{
					"name": "LLM workflows",
					"reason": "Used through scripts and review loops for clinic enrichment, treatment inference, and SEO production."
				},
				{
					"name": "Browser Use",
					"reason": "Used for browser-based research and verification when clinic data lived across websites, Facebook pages, maps, and other scattered sources."
				},
				{
					"name": "Conductor",
					"reason": "In-house workflow tooling for running and maintaining large agent/script jobs with review gates."
				},
				{
					"name": "fal.ai",
					"reason": "Used in the generated treatment-image workflow, with page-aware prompts and review before publishing."
				},
				{
					"name": "Figma",
					"reason": "Used for interface exploration, design-system decisions, responsive product flows, and polishing dense search surfaces."
				}
			],
			"scaleProof": [
				{
					"value": "700",
					"label": "clinic profiles",
					"detail": "Structured pages for independent veterinary clinics."
				},
				{
					"value": "400",
					"label": "treatment pages",
					"detail": "Animal-aware care content and reusable architecture."
				},
				{
					"value": "15,000",
					"label": "price points",
					"detail": "Monitoring Swedish veterinary prices across clinics and treatments."
				},
				{
					"value": "3 months",
					"label": "to first scale",
					"detail": "Product, data, content, and workflow systems built together."
				}
			],
			"role": [
				"Solo founder and design engineer. I owned the product model, UX, frontend, architecture, data workflows, AI-assisted enrichment, generated imagery, indexing, and quality review."
			],
			"origin": {
				"title": "From one clinic to a market layer",
				"paragraphs": [
					"PrivatVet did not start as a plan to build a national veterinary search product. It started one level down, inside my family's independent animal hospital in southern Sweden.",
					"I became the clinic's tech department: website, local SEO, service pages, content, conversion paths, and the practical details that make a clinic findable when someone urgently needs care. That work ranked a clinic outside Malmö first for competitive local searches around vaccination and acute veterinary care in Malmö, helping bring in 3,000 customers in year one.",
					"The more I worked inside the market, the clearer the imbalance became. Large chains had centralized tech teams, distribution, analytics, SEO, paid acquisition, and pricing power. Independent clinics often had excellent care but scattered digital presence: an old website, a Facebook page, a map listing, a PDF price list, or nothing structured enough for a search engine, LLM, or stressed pet owner to understand.",
					"PrivatVet was the scaled version of that lesson: if the playbook worked for one clinic, it could become infrastructure for hundreds.",
					"The product thesis was simple: a performant web presence is a recipe. Understand the user, the clinic, and the systems that route attention, then build the product independent clinics would have built if they had an internal product team."
				]
			},
			"techUsed": [
				"Built with Next.js 15, React 19, TypeScript, Tailwind v4, Supabase, Drizzle/Postgres, Leaflet, PostHog/Plausible, Vitest, Browser Use, and TS/Node production scripts. I also used in-house tools such as Conductor to run and maintain large script and agent workflows with visible steps, review gates, and repeatable production loops."
			],
			"challenge": [
				"The challenge was not just turning scattered clinic data into pages. It was turning an uneven care market into one calm front door. Pet owners search under stress. Clinics operate with different levels of digital maturity. Search engines and LLMs need structured, referenceable answers. So PrivatVet had to help owners find care quickly, make independent clinics visible without asking them to become tech companies, and keep clinic, treatment, price, animal, symptom, and location data useful after launch. That is what made it a design-engineering problem: the visible interface had to feel simple, while the system underneath absorbed the messy reality of the market."
			],
			"systemModel": {
				"intro": "The product had to serve pet owners, clinics, search systems, LLMs, and the platform itself without making the interface feel complex.",
				"inputs": [
					"Clinic records",
					"Search architecture",
					"LLM references",
					"Municipalities",
					"Counties",
					"Treatments",
					"Animal scopes",
					"Symptoms",
					"Insurance",
					"Prices",
					"Ratings",
					"Ownership",
					"Search intent",
					"Agent retrieval",
					"Customer service",
					"Owner updates",
					"Verified clinic edits"
				],
				"items": [
					{
						"title": "Findable architecture",
						"body": "The first system was not visual. It was the product's position inside the wider information ecosystem: clinic pages, treatment pages, animal pages, region pages, symptoms, insurance questions, prices, and local intent all connected into one referenceable network. That is how I think about SEO: product design for discovery. A good search result is a small product promise."
					},
					{
						"title": "Scattered data model",
						"body": "The data model had to absorb the messy reality of 700 privately owned clinics: prices, opening hours, animals treated, specialties, ownership, home visits, emergency care, locations, ratings, treatment matches, and verified owner edits from sources spread across websites, Facebook, maps, PDFs, and manual review."
					},
					{
						"title": "Simple user paths",
						"body": "The interface had to feel easy no matter where someone landed. A user could arrive through search, a clinic profile, a treatment page, a symptom page, a location, or the AI search box and still navigate without cognitive overload toward the care decision they needed."
					},
					{
						"title": "Self-running operations",
						"body": "The system also had to keep itself clean: verified clinic edits, price monitoring, enrichment workflows, and owner updates all needed to compound instead of decay. The production layer had to keep working after launch so the platform could stay useful over years."
					}
				]
			},
			"designSystem": {
				"intro": "The design idea was to make veterinary search feel like care, not like a scraped directory. The product had to be useful under stress: warm enough to trust, structured enough to compare, and quiet enough that the next action stays obvious.",
				"idea": "Every screen is built around a simple decision rhythm: let the owner ask in their own words, orient them, show the relevant options, expose trust signals, and keep the next step close. The visual system supports that rhythm with soft clinical greens, clear cards, large touch targets, and practical imagery.",
				"interactionDetailIntro": "Small controls got the same attention as full pages. These details were not meant to be flashy; they were built to be functional, calm, and easy to navigate for pet owners over 50. Animal selection, treatment filters, location steps, and related treatment links use large targets, clear selected states, and plain Swedish labels so stressed users can move quickly without second-guessing the interface.",
				"palette": [
					{
						"name": "Clinical green",
						"value": "#315d45"
					},
					{
						"name": "Deep trust",
						"value": "#11251c"
					},
					{
						"name": "Care surface",
						"value": "#f8fff1"
					},
					{
						"name": "Soft line",
						"value": "#d8ebbd"
					}
				],
				"typography": "The typography is intentionally calm and legible: large product headlines for orientation, compact card labels for scanning, and roomy body copy for treatment explanations.",
				"imageSystem": "Generated treatment images were treated as part of the product language, not decoration. The fal.ai flow created page-specific visuals that felt practical, warm, and clinic-adjacent, with a quality bar closer to polished consumer health photography than stock imagery."
			},
			"implementation": {
				"body": [
					"Implementation meant turning a messy domain into a set of systems that could be searched, trusted, maintained, and extended without making the frontend feel complex."
				],
				"items": [
					{
						"title": "Public decision surface",
						"body": "The visible product was built around multiple entry points: AI-assisted search, animal-first discovery, region pages, treatment pages, map results, clinic profiles, and owner update flows. Each route had to feel like one simple next step, not a database exposed to the user."
					},
					{
						"title": "Data production workflows",
						"body": "Behind the interface, scripts and agent workflows enrich clinics, infer treatments, review schema, monitor prices, and feed publishing queues. The implementation is as much the operating system as the website."
					},
					{
						"title": "Verification and admin layer",
						"body": "Clinics can verify ownership, sign in, and maintain their own profiles. That makes the system less dependent on one-time scraping and creates a path for cleaner data as prices, services, opening hours, and ownership change."
					},
					{
						"title": "Human and machine readers",
						"body": "A treatment page is not only a page for a pet owner. It is also a structured reference for search engines, LLMs, internal navigation, and future comparison agents. The page had to be warm and readable for humans, but structured enough for machines to retrieve and summarize without guessing."
					}
				],
				"treatmentSystem": {
					"title": "One treatment page out of 400",
					"body": "The treatment pages show the system working at product depth: each page is custom to the animal and treatment, with the most valuable decision information surfaced as a guide at the top. A reusable component library lets agents choose the right format for the job: summaries, price blocks, checklists, warnings, image sections, and follow-up details, so the pages stay readable instead of becoming walls of veterinary text."
				}
			},
			"result": [
				"PrivatVet became a live public product at privatvet.se with national clinic discovery, region and treatment architecture, clinic profiles, admin/update workflows, owner verification, analytics, and repeatable data-enrichment pipelines."
			],
			"resultSystem": {
				"title": "Ecosystem loop",
				"body": "The verification flow is a good example of the product logic underneath PrivatVet. A clinic adds a small badge or link to its own website. PrivatVet checks that link, confirms the clinic controls the domain, unlocks profile editing, and creates a clean backlink between the clinic site and the verified profile. On the surface, it is just verification. Underneath, it creates trust for pet owners, ownership for clinics, cleaner data for the platform, stronger search connections, and a maintenance loop that compounds instead of decays.",
				"codeLabel": "Clinic snippet",
				"codeDescription": "This is the small snippet the clinic puts on its own website. It proves control of the domain and gives PrivatVet a backlink to the verified profile.",
				"code": "<iframe\n  src=\"https://privatvet.se/embed/badge/123\"\n  title=\"Verifierad klinik på PrivatVet\"\n  loading=\"lazy\"\n></iframe>\n\n<a href=\"https://privatvet.se/klinik/ystad-djurklinik\">\n  Verifierad klinik på PrivatVet\n</a>",
				"verifyLabel": "PrivatVet verifier",
				"verifyDescription": "This is the PrivatVet side: the checker looks for the clinic's published badge or profile link, then verifies the clinic when the snippet is found.",
				"verifyCode": "const result = await detectBadgeMultiPage(\n  clinic.website,\n  clinic.id,\n  clinic.slug\n);\n\nif (result.found) {\n  await db.update(clinics).set({\n    verified: true,\n    badgeLastSeenAt: sql`now()`,\n    lastBadgeCheckAt: sql`now()`,\n    consecutiveBadgeFailures: 0,\n  });\n}",
				"notes": [
					"Trust for pet owners who want to know the profile is connected to the real clinic.",
					"Ownership for clinics through sign-in and profile editing.",
					"Cleaner data for the platform as prices, services, and details change.",
					"Stronger connections for search engines through a verified backlink path."
				]
			},
			"resultProof": [
				{
					"value": "20,000",
					"label": "monthly users",
					"detail": "Early traction for a high-intent Swedish care directory."
				},
				{
					"value": "4:45",
					"label": "average visit time for new users",
					"detail": "A strong early signal that first-time visitors were not only landing, but staying long enough to compare and explore."
				},
				{
					"value": "20%",
					"label": "bounce rate",
					"detail": "Strong signal that visitors continued into search, profiles, and comparison flows."
				}
			],
			"standouts": [
				"Turned a playbook proven on one independent clinic into a national market layer for hundreds more.",
				"Built the product surface and production workflow together, so 700 clinic profiles and 400 treatment pages can be maintained over time instead of becoming disconnected static content.",
				"Designed one search box for messy intent: users can type a clinic, treatment, symptom, animal, or place and still get routed toward a useful care path.",
				"Built the admin and verification layer so clinic owners can claim a profile, sign in, and keep their own information clean over time.",
				"Used AI agents and Conductor-style review gates to scale enrichment, treatment inference, image generation, and publishing without removing human judgment.",
				"Turned 15,000 price points into a monitored comparison layer, with custom workflows for repeatedly checking and updating veterinary prices across clinics and treatments."
			],
			"summary": [
				"PrivatVet is the clearest example of my design-engineering style: start inside a messy real-world domain and build the product that makes the useful path obvious. It began with one independent clinic and became a national search layer for hundreds more. The visible product is calm veterinary search for pet owners. Underneath is a living system for clinic data, treatment content, price monitoring, owner verification, LLM-readable architecture, and maintenance loops that keep the platform improving after launch."
			],
			"images": [
				{
					"context": "project card image",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/privatvet-card.webp",
					"path": "/case-studies/privatvet/privatvet-card.webp",
					"alt": "PrivatVet portfolio card",
					"width": 1200,
					"height": 600
				},
				{
					"context": "mobile/project card image",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/privatvet-card-760.webp",
					"path": "/case-studies/privatvet/privatvet-card-760.webp",
					"alt": "PrivatVet portfolio card, smaller source",
					"width": 760
				},
				{
					"context": "home and projects grid thumbnail",
					"url": "https://lukashammarstrom.com/case-studies/home-thumbs/privatvet.webp",
					"path": "/case-studies/home-thumbs/privatvet.webp",
					"alt": "PrivatVet thumbnail"
				},
				{
					"context": "design system logo",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/privatvet-logo-banner.webp",
					"path": "/case-studies/privatvet/privatvet-logo-banner.webp",
					"alt": "PrivatVet logo banner with shield mark and wordmark",
					"caption": "The shield mark gives the product a calm trust signal without making it feel like a clinic chain.",
					"width": 1600,
					"height": 686
				},
				{
					"context": "result image",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/growth-traffic-chart.webp",
					"path": "/case-studies/privatvet/growth-traffic-chart.webp",
					"alt": "PrivatVet traffic growth chart from March to June",
					"caption": "Traffic growth from March to June, showing the product moving from near-zero daily usage to recurring daily discovery as the search and content system started compounding.",
					"width": 1376,
					"height": 498
				},
				{
					"context": "design system app screen",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/home-discovery.webp",
					"path": "/case-studies/privatvet/home-discovery.webp",
					"alt": "PrivatVet homepage search and discovery interface",
					"caption": "Homepage: direct routes by animal, location, and care need.",
					"width": 1600,
					"height": 874
				},
				{
					"context": "design system app screen",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/map-results.webp",
					"path": "/case-studies/privatvet/map-results.webp",
					"alt": "PrivatVet map and search results interface",
					"caption": "Results: map context, clinic cards, and comparison in one view.",
					"width": 1600,
					"height": 875
				},
				{
					"context": "design system app screen",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/clinic-profile.webp",
					"path": "/case-studies/privatvet/clinic-profile.webp",
					"alt": "PrivatVet clinic profile interface",
					"caption": "Clinic profile: trust signals and practical details in a scannable page.",
					"width": 1600,
					"height": 878
				},
				{
					"context": "design system app screen",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/ai-search-routing.webp",
					"path": "/case-studies/privatvet/ai-search-routing.webp",
					"alt": "PrivatVet AI search routing interface",
					"caption": "AI search: one box for clinics, treatments, symptoms, animals, and places. The routing logic is shaped around model selection for use case: fast classification when intent is obvious, deeper reasoning when the query is ambiguous, and structured fallback paths when the model should not guess. The goal is not to show AI, but to make messy owner language land on the right care path.",
					"width": 1336,
					"height": 658
				},
				{
					"context": "interaction detail",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/design-details/animal-treatment-modal.webp",
					"path": "/case-studies/privatvet/design-details/animal-treatment-modal.webp",
					"alt": "PrivatVet animal selection modal for treatment pages",
					"caption": "Animal selection modal: large rows, strong selected state, and enough spacing that changing species feels deliberate instead of fiddly.",
					"width": 1610,
					"height": 704
				},
				{
					"context": "interaction detail",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/design-details/animal-filter-buttons.webp",
					"path": "/case-studies/privatvet/design-details/animal-filter-buttons.webp",
					"alt": "PrivatVet animal filter buttons with selected dog state",
					"caption": "Treatment filters: buttons are sized for scanning and touch, with a visible selected state and progressive disclosure when more animal types are available.",
					"width": 1614,
					"height": 540
				},
				{
					"context": "interaction detail",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/design-details/location-step-form.webp",
					"path": "/case-studies/privatvet/design-details/location-step-form.webp",
					"alt": "PrivatVet location search step for finding clinics near Ystad",
					"caption": "Location step: the form keeps the selected treatment visible while the user chooses place, preserving context through the search flow.",
					"width": 1574,
					"height": 938
				},
				{
					"context": "interaction detail",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/design-details/treatment-links-grid.webp",
					"path": "/case-studies/privatvet/design-details/treatment-links-grid.webp",
					"alt": "PrivatVet related treatment cards for dog treatments in Skåne län",
					"caption": "Related treatments: large category buttons and image cards make browsing feel obvious without requiring precise search language.",
					"width": 1600,
					"height": 637
				},
				{
					"context": "generated product image",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/generated-images/vaccination-hund.jpg",
					"path": "/case-studies/privatvet/generated-images/vaccination-hund.jpg",
					"alt": "Generated PrivatVet treatment image for dog vaccination",
					"caption": "Vaccination: warm, practical, and clearly veterinary.",
					"width": 828,
					"height": 470
				},
				{
					"context": "generated product image",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/generated-images/akutvard-bandage.jpg",
					"path": "/case-studies/privatvet/generated-images/akutvard-bandage.jpg",
					"alt": "Generated PrivatVet treatment image for emergency bandage care",
					"caption": "Emergency care: specific enough to support the treatment page.",
					"width": 828,
					"height": 462
				},
				{
					"context": "generated product image",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/generated-images/hembesok-hund.jpg",
					"path": "/case-studies/privatvet/generated-images/hembesok-hund.jpg",
					"alt": "Generated PrivatVet treatment image for home visit with a dog",
					"caption": "Home visit: care context without stock-photo coldness.",
					"width": 828,
					"height": 466
				},
				{
					"context": "generated product image",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/generated-images/besiktning-hund.webp",
					"path": "/case-studies/privatvet/generated-images/besiktning-hund.webp",
					"alt": "Generated PrivatVet treatment image for dog inspection",
					"caption": "Inspection: consistent visual tone across page families.",
					"width": 828,
					"height": 470
				},
				{
					"context": "treatment system screen",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/treatment-page-guide.webp",
					"path": "/case-studies/privatvet/treatment-page-guide.webp",
					"alt": "PrivatVet EU passport for dog treatment page with top guide and price summary",
					"caption": "A treatment guide for EU-passport for dog: the highest-value information is surfaced at the top, including a Sweden-wide median price based on 231 published clinic prices. The public price data remains useful over time because the same workflows can keep monitoring and refreshing it.",
					"width": 1600,
					"height": 2183
				},
				{
					"context": "treatment system screen",
					"url": "https://lukashammarstrom.com/case-studies/privatvet/treatment-page-readable-components.webp",
					"path": "/case-studies/privatvet/treatment-page-readable-components.webp",
					"alt": "PrivatVet dog wound care treatment page with image, readable text, and custom component blocks",
					"caption": "Treatment content is assembled from a reusable component library. Agents can choose the right component for the information: image context, plain-language explanation, bullet guidance, warning blocks, pricing modules, and practical follow-up details.",
					"width": 1600,
					"height": 1936
				}
			]
		},
		{
			"type": "case-study",
			"slug": "finnova",
			"name": "Finnova",
			"year": "2025",
			"url": "https://lukashammarstrom.com/projects/finnova/",
			"liveUrl": "https://finnova.se/",
			"quickRead": [
				"One company profile, many funding paths. Finnova turns fragmented Swedish grant funding into one guided workflow: drop in a website, pitch deck, or rough company description, build a reusable funding profile, match it across public calls and foundations, and move from discovery to application without losing context."
			],
			"technologies": [
				{
					"name": "Next.js",
					"reason": "Used for the App Router product and marketing surface: onboarding, matching, dashboards, pricing, funder pages, and funding-call detail pages."
				},
				{
					"name": "React",
					"reason": "Used for the core product screens: profile intake, ranked matches, grant application workspace, drawers, navigation, and interactive states."
				},
				{
					"name": "TypeScript",
					"reason": "Kept company profiles, funding calls, match results, subscriptions, sessions, and UI contracts easier to evolve safely."
				},
				{
					"name": "Supabase/Postgres",
					"reason": "Used as the hosted Postgres layer, with Prisma modeling users, magic links, company profiles, funding calls, match results, and onboarding state."
				},
				{
					"name": "Anthropic",
					"reason": "Used for funding-call enrichment, document summarization, company-profile extraction, structured profiling, and matching refinement."
				},
				{
					"name": "Conductor",
					"reason": "Used to run and inspect agent-assisted research, enrichment, and demo-building workflows with visible steps, checks, and artifacts."
				},
				{
					"name": "Funding APIs",
					"reason": "Integrated Vinnova open data, sitemap resolution, GDPHub-style agency feeds, and Forte/Formas/VR funding-call sources."
				},
				{
					"name": "Figma",
					"reason": "Used for product flow design, funding-workspace layouts, brand direction, and AI-assisted interface states."
				}
			],
			"scaleProof": [
				{
					"value": "83",
					"label": "active funding calls",
					"detail": "Open and planned opportunities monitored across the local funding-call dataset."
				},
				{
					"value": "4",
					"label": "public funder sources",
					"detail": "Vinnova, Formas, Forte, and VR connected through API, GDPHub-style feeds, and source-specific sync logic."
				},
				{
					"value": "49",
					"label": "mapped foundations",
					"detail": "Private and thematic funding sources designed into the broader matching surface."
				},
				{
					"value": "7",
					"label": "incubator networks",
					"detail": "A B2B path for advisors and incubators managing several company profiles at once."
				}
			],
			"role": [
				"I worked in a small team, owning the product path across positioning, onboarding, profile intake, ranked matching, application drafting, and frontend implementation.",
				"The work was not just to make AI generate text, but to design the context layer around it: what the system knows, why a match exists, what the user should trust, and where human judgment stays in control."
			],
			"origin": {
				"title": "From pitch to funding context",
				"paragraphs": [
					"Finnova did not start as a generic AI grant tool. It came from work I had already done manually: helping Swedish founders find and win public funding.",
					"The pattern was always the same. A founder had a pitch deck, a website, scattered notes, maybe a half-written application, and a rough sense that there must be funding somewhere. The hard part was turning that material into the right context: stage, technology, market, team, budget, readiness, partners, timing, and why this company fit this specific call.",
					"Finnova turns that repeated manual work into a product. One company profile becomes the reusable context layer for many funding paths: public calls, foundations, incubator advisors, match rationale, and application drafts.",
					"The simplification is the product: the user should not have to start from a blank form, rewrite the same story for every funder, or become an expert in Swedish grant infrastructure. They should be able to bring what they already have and get to a useful next step."
				]
			},
			"techUsed": [
				"Finnova combines a Next.js and React product surface with typed funding data, reusable company-profile context, ranked opportunity matching, document handling, and AI-assisted drafting. The stack had to support a fast product build while keeping the grant workflow structured, inspectable, and editable."
			],
			"challenge": [
				"The obvious version of this product is “AI writes your grant application.” That is not enough.",
				"Funding is a trust problem before it is a writing problem. A good recommendation depends on company stage, technology readiness, partners, budget, deadlines, eligibility, funder language, and the actual intention behind the call. A good draft depends on whether the system has enough context to make the right argument.",
				"So the product had to avoid two failure modes: a blank form that leaves founders doing all the work, and an opaque AI assistant that confidently writes polished nonsense. The middle path, found again — this time in grant application software. Inspired by the Buddha himself, funnily enough. He invented the original exit strategy, so he must have been on to something. Anyway, I am getting ahead of myself. Finnova had to become a guided context system: collect the company once, match it many times, explain the reasoning, then carry the same context into an editable application workspace.",
				"The obvious failure mode was volume. If AI can draft one application, it can draft ten. But funding does not reward spray-and-pray behavior. If a company sends ten thin AI-written applications, it will not take long before reviewers stop reading the slop and start discounting the applicant. The same pattern exists in hiring: send ten applications to the same company and by the fifth, the work is probably no longer being considered so much as prompting an eye roll."
			],
			"systemModel": {
				"title": "One profile, many doors",
				"intro": "The application is just one output. The company context is the product: profile once, match continuously, then carry the best opportunity into application work without losing the thread.",
				"inputs": [
					"Website / deck / notes",
					"Funding profile",
					"Ranked matches",
					"Editable draft"
				],
				"items": [
					{
						"title": "Profile",
						"body": "Drop in a website, pitch deck, or rough description. Finnova extracts the company context the funding world cares about: stage, technology, market, team, funding need, and readiness."
					},
					{
						"title": "Match",
						"body": "Rank live and upcoming calls against that profile: funder, deadline, amount, fit score, and the plain-language rationale behind the recommendation."
					},
					{
						"title": "Act",
						"body": "Turn the match into a decision: worth applying, worth watching, or not worth the time. The goal is fewer, better, more intentional applications."
					},
					{
						"title": "Write",
						"body": "Carry the same context into an editable draft workspace with sections, character limits, saved states, reviewed fields, and visible source context."
					}
				]
			},
			"implementation": {
				"body": [
					"Implementation focused on making advanced capability feel boring in the right way. The product had to feel like a serious funding tool that happened to use AI, not an AI demo wearing a grant costume."
				],
				"items": [
					{
						"title": "Profile intake",
						"body": "The profile screen reduces setup friction by supporting website-based autofill while still making the extracted business, market, technology, and funding context visible for review."
					},
					{
						"title": "Ranked opportunities",
						"body": "Funding matches are presented with scores, funders, deadlines, amounts, and rationale so users can understand why a call matters instead of trusting an opaque recommendation."
					},
					{
						"title": "Application workspace",
						"body": "The grant writer treats AI output as a draft system: sections, character counts, completeness, reviewed states, saved timestamps, and editable fields keep the user in control."
					},
					{
						"title": "Reusable source material",
						"body": "The document vault keeps pitch decks, budgets, CVs, cap tables, and letters available as durable context instead of asking users to re-upload the same proof for every call."
					}
				]
			},
			"result": [
				"Finnova became a closed-beta product demo for AI-mediated applications: one reusable company context, many funding opportunities, and a guided path from pitch to match to draft."
			],
			"resultProof": [
				{
					"value": "1 to many",
					"label": "reusable profile model",
					"detail": "One company profile can drive matching, deadlines, documents, and application drafts across many funding calls."
				},
				{
					"value": "why",
					"label": "explainable matching",
					"detail": "Scores are supported by visible call metadata and rationale instead of hidden AI output."
				},
				{
					"value": "draft",
					"label": "editable AI workflow",
					"detail": "Generated sections remain structured, reviewed, saved, and constrained by character limits."
				}
			],
			"standouts": [
				"Turned repeated manual grant work into one reusable company-profile model.",
				"Designed AI affordances around trust: visible scores, rationale, reviewed fields, character limits, completeness, and saved states.",
				"Designed against the spam failure mode by pushing users toward fewer, stronger, higher-intent applications.",
				"Connected discovery, matching, drafting, documents, deadlines, and review into one calm workflow."
			],
			"summary": [
				"The internet is slowly moving from pages people browse to contexts machines negotiate.",
				"You can already see the primitive version everywhere: AI writes the email, AI summarizes the email; AI improves the CV, AI screens the CV; AI drafts the application, AI helps evaluate the application. The first reaction is to laugh at the loop. The second is to realize that this is probably **the** new interface pattern."
			],
			"images": [
				{
					"context": "project card image",
					"url": "https://lukashammarstrom.com/case-studies/finnova/finnova-card.webp",
					"path": "/case-studies/finnova/finnova-card.webp",
					"alt": "Finnova portfolio card",
					"width": 1200,
					"height": 600
				},
				{
					"context": "mobile/project card image",
					"url": "https://lukashammarstrom.com/case-studies/finnova/finnova-card-760.webp",
					"path": "/case-studies/finnova/finnova-card-760.webp",
					"alt": "Finnova portfolio card, smaller source",
					"width": 760
				},
				{
					"context": "home and projects grid thumbnail",
					"url": "https://lukashammarstrom.com/case-studies/home-thumbs/finnova.webp",
					"path": "/case-studies/home-thumbs/finnova.webp",
					"alt": "Finnova thumbnail"
				},
				{
					"context": "implementation screen",
					"url": "https://lukashammarstrom.com/case-studies/finnova/live/funding-call-detail.png",
					"path": "/case-studies/finnova/live/funding-call-detail.png",
					"alt": "Finnova funding-call detail page with overview tabs, status, funder, and next action",
					"caption": "The call detail page turns a long funder specification into a readable product surface: status, source, overview, dates, documents, links, contacts, and a clear path to check whether the opportunity fits.",
					"width": 1723,
					"height": 846
				},
				{
					"context": "implementation screen",
					"url": "https://lukashammarstrom.com/case-studies/finnova/live/matches-dashboard.png",
					"path": "/case-studies/finnova/live/matches-dashboard.png",
					"alt": "Finnova funding matches dashboard showing a 94 match score and recommended grant calls",
					"caption": "The match dashboard is the core product promise in one frame: company context becomes ranked opportunities with visible scores, deadlines, amounts, rationale, and a next action.",
					"width": 1369,
					"height": 757
				},
				{
					"context": "implementation screen",
					"url": "https://lukashammarstrom.com/case-studies/finnova/live/application-workspace.png",
					"path": "/case-studies/finnova/live/application-workspace.png",
					"alt": "Finnova AI-assisted grant application workspace",
					"caption": "The application workspace carries the match forward: AI drafts are structured into editable sections with progress, reviewed fields, character counts, and saved state.",
					"width": 1454,
					"height": 999
				},
				{
					"context": "implementation screen",
					"url": "https://lukashammarstrom.com/case-studies/finnova/live/document-vault.png",
					"path": "/case-studies/finnova/live/document-vault.png",
					"alt": "Finnova document vault for uploading and reusing parsed application documents",
					"caption": "The document vault makes source material reusable: pitch decks, budgets, CVs, cap tables, and letters can be parsed once, then offered to the right application sections automatically.",
					"width": 1864,
					"height": 1400
				},
				{
					"context": "implementation screen",
					"url": "https://lukashammarstrom.com/case-studies/finnova/profile-ui.png",
					"path": "/case-studies/finnova/profile-ui.png",
					"alt": "Finnova profile intake screen for building a company funding profile",
					"caption": "The profile workspace turns loose company context into structured funding signals while keeping the input reviewable.",
					"width": 1160,
					"height": 645
				},
				{
					"context": "implementation screen",
					"url": "https://lukashammarstrom.com/case-studies/finnova/matches-ui.png",
					"path": "/case-studies/finnova/matches-ui.png",
					"alt": "Finnova ranked funding matches screen showing fit scores and recommended opportunities",
					"caption": "Matches are ranked with score, funder, deadline, amount, and rationale so the recommendation feels inspectable.",
					"width": 1160,
					"height": 645
				},
				{
					"context": "implementation screen",
					"url": "https://lukashammarstrom.com/case-studies/finnova/application-ui.png",
					"path": "/case-studies/finnova/application-ui.png",
					"alt": "Finnova grant application workspace with AI-assisted draft fields",
					"caption": "The application workspace makes AI drafting editable: sections, completeness, reviewed fields, character limits, and saved states.",
					"width": 1160,
					"height": 645
				}
			]
		},
		{
			"type": "case-study",
			"slug": "zen",
			"name": "Zen",
			"year": "2026",
			"url": "https://lukashammarstrom.com/projects/zen/",
			"liveUrl": "https://mettafive.github.io/zen/",
			"quickRead": [
				"A tiny native Mac app for noticing whether you are actually present. Zen uses the screen edge as the interface: a soft bell, a small prompt, a left-or-right hold, and an adaptive rhythm that learns when to check in again."
			],
			"technologies": [
				{
					"name": "SwiftUI",
					"reason": "Used for the native macOS app surface, onboarding, settings, moods, schedule, and history views."
				},
				{
					"name": "AppKit",
					"reason": "Used for OS-level panels, menu bar behavior, transparent one-pixel edge targets, and non-activating overlays that can appear without stealing focus."
				},
				{
					"name": "SwiftData",
					"reason": "Stores presence entries locally so the app can adapt reminder timing around the user's actual attention rhythm."
				},
				{
					"name": "Haptics",
					"reason": "Makes the edge hold feel physical and intentional while the user records whether they were present."
				},
				{
					"name": "Sparkle",
					"reason": "Supports a signed, notarized Mac release with an appcast-based update flow."
				},
				{
					"name": "Figma",
					"reason": "Used for interaction exploration, onboarding structure, visual direction, and the small-system decisions around the Mac utility."
				}
			],
			"scaleProof": [],
			"role": [
				"I designed and built Zen end to end: the product model, native macOS interface, SwiftUI/AppKit edge interactions, haptic feedback, adaptive timer logic, onboarding, mood system, quote packs, presence history, and release flow."
			],
			"techUsed": [
				"Zen combines SwiftUI for the app surface with AppKit panels and event monitoring for the ambient OS-level behavior. SwiftData stores local presence entries, while Sparkle, signing, notarization, and a custom DMG release flow make it a real distributable Mac app."
			],
			"challenge": [
				"Zen carried a strange product dilemma: it had to interrupt the user enough to break autopilot, without becoming the kind of focus tool that turns into another distraction."
			],
			"implementation": {
				"body": [],
				"items": []
			},
			"result": [
				"Zen shipped as a small native macOS utility with adaptive check-ins, edge-based presence voting, haptic feedback design, mood presets, scheduling, onboarding, and a signed update path."
			],
			"resultProof": [],
			"standouts": [
				"Designed the core interaction around a transparent one-pixel edge target instead of a conventional modal or button.",
				"Used haptics and hold-to-fill feedback so the answer feels deliberate without pulling the user into a full app.",
				"Built adaptive timing that backs off when the user is present and checks in sooner when they are drifting.",
				"Shipped it as a real Mac app with signing, notarization, DMG packaging, and Sparkle updates."
			],
			"summary": [
				"Zen is a small native-app case study about restraint: interrupt just enough to break autopilot, then disappear."
			],
			"images": [
				{
					"context": "project card image",
					"url": "https://lukashammarstrom.com/case-studies/zen/zen-card.webp",
					"path": "/case-studies/zen/zen-card.webp",
					"alt": "Zen portfolio card",
					"width": 1200,
					"height": 600
				},
				{
					"context": "mobile/project card image",
					"url": "https://lukashammarstrom.com/case-studies/zen/zen-card-760.webp",
					"path": "/case-studies/zen/zen-card-760.webp",
					"alt": "Zen portfolio card, smaller source",
					"width": 760
				},
				{
					"context": "home and projects grid thumbnail",
					"url": "https://lukashammarstrom.com/case-studies/home-thumbs/zen.webp",
					"path": "/case-studies/home-thumbs/zen.webp",
					"alt": "Zen thumbnail"
				},
				{
					"context": "project hero image",
					"url": "https://lukashammarstrom.com/case-studies/zen/zen-hero.webp",
					"path": "/case-studies/zen/zen-hero.webp",
					"alt": "Zen hero image"
				}
			]
		},
		{
			"type": "case-study",
			"slug": "bottel",
			"name": "Bottel",
			"year": "2024",
			"url": "https://lukashammarstrom.com/projects/bottel/",
			"liveUrl": "https://www.bottel.com/",
			"quickRead": [
				"Bottel is white-label deposit-return infrastructure: a consumer app, machine handoff, operator portal, and rewards layer that helps recycling-system operators launch modern return experiences without rebuilding the full product stack."
			],
			"technologies": [
				{
					"name": "React Native",
					"reason": "Used for the mobile wallet experience around scanning, balance, rewards, vouchers, and store redemption."
				},
				{
					"name": "React",
					"reason": "Used across the web surfaces that supported operator management, partner workflows, and product presentation."
				},
				{
					"name": "Firebase",
					"reason": "Used for app-backed product infrastructure around users, state, and recycling-session flows."
				},
				{
					"name": "Vercel",
					"reason": "Used for fast web deployment, iteration, and review of the public and portal-facing surfaces."
				},
				{
					"name": "TOMRA Connect",
					"reason": "Designed around the realities of TOMRA-scale reverse vending infrastructure and public recycling habits."
				},
				{
					"name": "Figma",
					"reason": "Used for product design, system mapping, interface exploration, and presenting the product across partners and stakeholders."
				}
			],
			"scaleProof": [
				{
					"value": "",
					"icon": "phone",
					"label": "app for iOS and Android",
					"detail": "A consumer app that makes recycling smoother: scan, return, see value, manage balance, and redeem rewards from the phone."
				},
				{
					"value": "",
					"icon": "portal",
					"label": "multi-user web portal",
					"detail": "One portal system covering operators, merchants, and partners: manage recycling value, deals, campaigns, payouts, and redemption workflows."
				},
				{
					"value": "",
					"icon": "machine",
					"label": "machine compatibility layer",
					"detail": "Software installed in or alongside the recycling machine so the physical return session becomes compatible with Bottel."
				},
				{
					"value": "",
					"icon": "funding",
					"label": "funded venture",
					"detail": "Raised private investor funding and received two rounds of Swedish government-agency funding to build and validate the system."
				}
			],
			"role": [
				"I was part of the founding team and carried the product vision across design, delivery, funding, and partnerships: shaping the app, portal, machine handoff, wallet logic, rewards layer, and white-label system story."
			],
			"techUsed": [
				"The system combined a React Native app, React portal surfaces, Firebase-backed session flows, machine handoff, campaign logic, and product storytelling for deposit-return infrastructure."
			],
			"challenge": [
				"Bottel's challenge was not making recycling look modern. It was making a physical, regulated, low-value transaction work digitally.",
				"Two decisions carried most of the product weight: batch tiny deposits so the economics work, and let people recycle before asking for an account.",
				"The visible loop had to stay simple: return, see value, use value. Underneath, Bottel coordinated machines, operators, retailers, wallets, rewards, payment batching, and public trust."
			],
			"implementation": {
				"body": [],
				"items": []
			},
			"result": [],
			"resultProof": [],
			"standouts": [],
			"summary": [],
			"images": [
				{
					"context": "project card image",
					"url": "https://lukashammarstrom.com/case-studies/bottel/bottel-card.webp",
					"path": "/case-studies/bottel/bottel-card.webp",
					"alt": "Bottel portfolio card",
					"width": 1200,
					"height": 600
				},
				{
					"context": "mobile/project card image",
					"url": "https://lukashammarstrom.com/case-studies/bottel/bottel-card-760.webp",
					"path": "/case-studies/bottel/bottel-card-760.webp",
					"alt": "Bottel portfolio card, smaller source",
					"width": 760
				},
				{
					"context": "home and projects grid thumbnail",
					"url": "https://lukashammarstrom.com/case-studies/home-thumbs/bottel.webp",
					"path": "/case-studies/home-thumbs/bottel.webp",
					"alt": "Bottel thumbnail"
				},
				{
					"context": "implementation screen",
					"url": "https://lukashammarstrom.com/case-studies/bottel/cans.webp",
					"path": "/case-studies/bottel/cans.webp",
					"alt": "Bottel branded cans floating as a deposit return campaign visual",
					"width": 1400,
					"height": 788
				}
			]
		}
	],
	"images": [
		{
			"context": "homepage portrait",
			"url": "https://lukashammarstrom.com/images/home-natural-portrait.webp",
			"path": "/images/home-natural-portrait.webp",
			"alt": "Lukas Hammarström portrait"
		},
		{
			"context": "about portrait",
			"url": "https://lukashammarstrom.com/images/home-speaking-portrait.webp",
			"path": "/images/home-speaking-portrait.webp",
			"alt": "Lukas Hammarström presenting"
		},
		{
			"context": "about portrait",
			"url": "https://lukashammarstrom.com/images/about-lukas-totoro.webp",
			"path": "/images/about-lukas-totoro.webp",
			"alt": "Lukas Hammarström with a Totoro figure"
		},
		{
			"context": "project card image",
			"url": "https://lukashammarstrom.com/case-studies/conductor/conductor-card.webp",
			"path": "/case-studies/conductor/conductor-card.webp",
			"alt": "Conductor portfolio card",
			"width": 1200,
			"height": 600
		},
		{
			"context": "mobile/project card image",
			"url": "https://lukashammarstrom.com/case-studies/conductor/conductor-card-760.webp",
			"path": "/case-studies/conductor/conductor-card-760.webp",
			"alt": "Conductor portfolio card, smaller source",
			"width": 760
		},
		{
			"context": "home and projects grid thumbnail",
			"url": "https://lukashammarstrom.com/case-studies/home-thumbs/conductor.webp",
			"path": "/case-studies/home-thumbs/conductor.webp",
			"alt": "Conductor thumbnail"
		},
		{
			"context": "project hero image",
			"url": "https://lukashammarstrom.com/case-studies/conductor/hero-hands.webp",
			"path": "/case-studies/conductor/hero-hands.webp",
			"alt": "Conductor hero image"
		},
		{
			"context": "implementation screen",
			"url": "https://lukashammarstrom.com/case-studies/conductor/source-home.jpg",
			"path": "/case-studies/conductor/source-home.jpg",
			"alt": "Conductor website hero showing verified cards, live updates, prewarmed workers, and self-improving workflows",
			"caption": "The public site frames the product around one principle: conduct agents through a checked, watchable run instead of trusting a single long prompt.",
			"width": 1440,
			"height": 1100
		},
		{
			"context": "implementation screen",
			"url": "https://lukashammarstrom.com/case-studies/conductor/source-mobile.jpg",
			"path": "/case-studies/conductor/source-mobile.jpg",
			"alt": "Conductor website shown in a narrow mobile viewport",
			"caption": "The same idea is kept compact on mobile: verified cards, live updates, prewarmed workers, and a board that can be read like a story.",
			"width": 390,
			"height": 1200
		},
		{
			"context": "project card image",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/privatvet-card.webp",
			"path": "/case-studies/privatvet/privatvet-card.webp",
			"alt": "PrivatVet portfolio card",
			"width": 1200,
			"height": 600
		},
		{
			"context": "mobile/project card image",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/privatvet-card-760.webp",
			"path": "/case-studies/privatvet/privatvet-card-760.webp",
			"alt": "PrivatVet portfolio card, smaller source",
			"width": 760
		},
		{
			"context": "home and projects grid thumbnail",
			"url": "https://lukashammarstrom.com/case-studies/home-thumbs/privatvet.webp",
			"path": "/case-studies/home-thumbs/privatvet.webp",
			"alt": "PrivatVet thumbnail"
		},
		{
			"context": "design system logo",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/privatvet-logo-banner.webp",
			"path": "/case-studies/privatvet/privatvet-logo-banner.webp",
			"alt": "PrivatVet logo banner with shield mark and wordmark",
			"caption": "The shield mark gives the product a calm trust signal without making it feel like a clinic chain.",
			"width": 1600,
			"height": 686
		},
		{
			"context": "result image",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/growth-traffic-chart.webp",
			"path": "/case-studies/privatvet/growth-traffic-chart.webp",
			"alt": "PrivatVet traffic growth chart from March to June",
			"caption": "Traffic growth from March to June, showing the product moving from near-zero daily usage to recurring daily discovery as the search and content system started compounding.",
			"width": 1376,
			"height": 498
		},
		{
			"context": "design system app screen",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/home-discovery.webp",
			"path": "/case-studies/privatvet/home-discovery.webp",
			"alt": "PrivatVet homepage search and discovery interface",
			"caption": "Homepage: direct routes by animal, location, and care need.",
			"width": 1600,
			"height": 874
		},
		{
			"context": "design system app screen",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/map-results.webp",
			"path": "/case-studies/privatvet/map-results.webp",
			"alt": "PrivatVet map and search results interface",
			"caption": "Results: map context, clinic cards, and comparison in one view.",
			"width": 1600,
			"height": 875
		},
		{
			"context": "design system app screen",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/clinic-profile.webp",
			"path": "/case-studies/privatvet/clinic-profile.webp",
			"alt": "PrivatVet clinic profile interface",
			"caption": "Clinic profile: trust signals and practical details in a scannable page.",
			"width": 1600,
			"height": 878
		},
		{
			"context": "design system app screen",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/ai-search-routing.webp",
			"path": "/case-studies/privatvet/ai-search-routing.webp",
			"alt": "PrivatVet AI search routing interface",
			"caption": "AI search: one box for clinics, treatments, symptoms, animals, and places. The routing logic is shaped around model selection for use case: fast classification when intent is obvious, deeper reasoning when the query is ambiguous, and structured fallback paths when the model should not guess. The goal is not to show AI, but to make messy owner language land on the right care path.",
			"width": 1336,
			"height": 658
		},
		{
			"context": "interaction detail",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/design-details/animal-treatment-modal.webp",
			"path": "/case-studies/privatvet/design-details/animal-treatment-modal.webp",
			"alt": "PrivatVet animal selection modal for treatment pages",
			"caption": "Animal selection modal: large rows, strong selected state, and enough spacing that changing species feels deliberate instead of fiddly.",
			"width": 1610,
			"height": 704
		},
		{
			"context": "interaction detail",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/design-details/animal-filter-buttons.webp",
			"path": "/case-studies/privatvet/design-details/animal-filter-buttons.webp",
			"alt": "PrivatVet animal filter buttons with selected dog state",
			"caption": "Treatment filters: buttons are sized for scanning and touch, with a visible selected state and progressive disclosure when more animal types are available.",
			"width": 1614,
			"height": 540
		},
		{
			"context": "interaction detail",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/design-details/location-step-form.webp",
			"path": "/case-studies/privatvet/design-details/location-step-form.webp",
			"alt": "PrivatVet location search step for finding clinics near Ystad",
			"caption": "Location step: the form keeps the selected treatment visible while the user chooses place, preserving context through the search flow.",
			"width": 1574,
			"height": 938
		},
		{
			"context": "interaction detail",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/design-details/treatment-links-grid.webp",
			"path": "/case-studies/privatvet/design-details/treatment-links-grid.webp",
			"alt": "PrivatVet related treatment cards for dog treatments in Skåne län",
			"caption": "Related treatments: large category buttons and image cards make browsing feel obvious without requiring precise search language.",
			"width": 1600,
			"height": 637
		},
		{
			"context": "generated product image",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/generated-images/vaccination-hund.jpg",
			"path": "/case-studies/privatvet/generated-images/vaccination-hund.jpg",
			"alt": "Generated PrivatVet treatment image for dog vaccination",
			"caption": "Vaccination: warm, practical, and clearly veterinary.",
			"width": 828,
			"height": 470
		},
		{
			"context": "generated product image",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/generated-images/akutvard-bandage.jpg",
			"path": "/case-studies/privatvet/generated-images/akutvard-bandage.jpg",
			"alt": "Generated PrivatVet treatment image for emergency bandage care",
			"caption": "Emergency care: specific enough to support the treatment page.",
			"width": 828,
			"height": 462
		},
		{
			"context": "generated product image",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/generated-images/hembesok-hund.jpg",
			"path": "/case-studies/privatvet/generated-images/hembesok-hund.jpg",
			"alt": "Generated PrivatVet treatment image for home visit with a dog",
			"caption": "Home visit: care context without stock-photo coldness.",
			"width": 828,
			"height": 466
		},
		{
			"context": "generated product image",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/generated-images/besiktning-hund.webp",
			"path": "/case-studies/privatvet/generated-images/besiktning-hund.webp",
			"alt": "Generated PrivatVet treatment image for dog inspection",
			"caption": "Inspection: consistent visual tone across page families.",
			"width": 828,
			"height": 470
		},
		{
			"context": "treatment system screen",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/treatment-page-guide.webp",
			"path": "/case-studies/privatvet/treatment-page-guide.webp",
			"alt": "PrivatVet EU passport for dog treatment page with top guide and price summary",
			"caption": "A treatment guide for EU-passport for dog: the highest-value information is surfaced at the top, including a Sweden-wide median price based on 231 published clinic prices. The public price data remains useful over time because the same workflows can keep monitoring and refreshing it.",
			"width": 1600,
			"height": 2183
		},
		{
			"context": "treatment system screen",
			"url": "https://lukashammarstrom.com/case-studies/privatvet/treatment-page-readable-components.webp",
			"path": "/case-studies/privatvet/treatment-page-readable-components.webp",
			"alt": "PrivatVet dog wound care treatment page with image, readable text, and custom component blocks",
			"caption": "Treatment content is assembled from a reusable component library. Agents can choose the right component for the information: image context, plain-language explanation, bullet guidance, warning blocks, pricing modules, and practical follow-up details.",
			"width": 1600,
			"height": 1936
		},
		{
			"context": "project card image",
			"url": "https://lukashammarstrom.com/case-studies/finnova/finnova-card.webp",
			"path": "/case-studies/finnova/finnova-card.webp",
			"alt": "Finnova portfolio card",
			"width": 1200,
			"height": 600
		},
		{
			"context": "mobile/project card image",
			"url": "https://lukashammarstrom.com/case-studies/finnova/finnova-card-760.webp",
			"path": "/case-studies/finnova/finnova-card-760.webp",
			"alt": "Finnova portfolio card, smaller source",
			"width": 760
		},
		{
			"context": "home and projects grid thumbnail",
			"url": "https://lukashammarstrom.com/case-studies/home-thumbs/finnova.webp",
			"path": "/case-studies/home-thumbs/finnova.webp",
			"alt": "Finnova thumbnail"
		},
		{
			"context": "implementation screen",
			"url": "https://lukashammarstrom.com/case-studies/finnova/live/funding-call-detail.png",
			"path": "/case-studies/finnova/live/funding-call-detail.png",
			"alt": "Finnova funding-call detail page with overview tabs, status, funder, and next action",
			"caption": "The call detail page turns a long funder specification into a readable product surface: status, source, overview, dates, documents, links, contacts, and a clear path to check whether the opportunity fits.",
			"width": 1723,
			"height": 846
		},
		{
			"context": "implementation screen",
			"url": "https://lukashammarstrom.com/case-studies/finnova/live/matches-dashboard.png",
			"path": "/case-studies/finnova/live/matches-dashboard.png",
			"alt": "Finnova funding matches dashboard showing a 94 match score and recommended grant calls",
			"caption": "The match dashboard is the core product promise in one frame: company context becomes ranked opportunities with visible scores, deadlines, amounts, rationale, and a next action.",
			"width": 1369,
			"height": 757
		},
		{
			"context": "implementation screen",
			"url": "https://lukashammarstrom.com/case-studies/finnova/live/application-workspace.png",
			"path": "/case-studies/finnova/live/application-workspace.png",
			"alt": "Finnova AI-assisted grant application workspace",
			"caption": "The application workspace carries the match forward: AI drafts are structured into editable sections with progress, reviewed fields, character counts, and saved state.",
			"width": 1454,
			"height": 999
		},
		{
			"context": "implementation screen",
			"url": "https://lukashammarstrom.com/case-studies/finnova/live/document-vault.png",
			"path": "/case-studies/finnova/live/document-vault.png",
			"alt": "Finnova document vault for uploading and reusing parsed application documents",
			"caption": "The document vault makes source material reusable: pitch decks, budgets, CVs, cap tables, and letters can be parsed once, then offered to the right application sections automatically.",
			"width": 1864,
			"height": 1400
		},
		{
			"context": "implementation screen",
			"url": "https://lukashammarstrom.com/case-studies/finnova/profile-ui.png",
			"path": "/case-studies/finnova/profile-ui.png",
			"alt": "Finnova profile intake screen for building a company funding profile",
			"caption": "The profile workspace turns loose company context into structured funding signals while keeping the input reviewable.",
			"width": 1160,
			"height": 645
		},
		{
			"context": "implementation screen",
			"url": "https://lukashammarstrom.com/case-studies/finnova/matches-ui.png",
			"path": "/case-studies/finnova/matches-ui.png",
			"alt": "Finnova ranked funding matches screen showing fit scores and recommended opportunities",
			"caption": "Matches are ranked with score, funder, deadline, amount, and rationale so the recommendation feels inspectable.",
			"width": 1160,
			"height": 645
		},
		{
			"context": "implementation screen",
			"url": "https://lukashammarstrom.com/case-studies/finnova/application-ui.png",
			"path": "/case-studies/finnova/application-ui.png",
			"alt": "Finnova grant application workspace with AI-assisted draft fields",
			"caption": "The application workspace makes AI drafting editable: sections, completeness, reviewed fields, character limits, and saved states.",
			"width": 1160,
			"height": 645
		},
		{
			"context": "project card image",
			"url": "https://lukashammarstrom.com/case-studies/zen/zen-card.webp",
			"path": "/case-studies/zen/zen-card.webp",
			"alt": "Zen portfolio card",
			"width": 1200,
			"height": 600
		},
		{
			"context": "mobile/project card image",
			"url": "https://lukashammarstrom.com/case-studies/zen/zen-card-760.webp",
			"path": "/case-studies/zen/zen-card-760.webp",
			"alt": "Zen portfolio card, smaller source",
			"width": 760
		},
		{
			"context": "home and projects grid thumbnail",
			"url": "https://lukashammarstrom.com/case-studies/home-thumbs/zen.webp",
			"path": "/case-studies/home-thumbs/zen.webp",
			"alt": "Zen thumbnail"
		},
		{
			"context": "project hero image",
			"url": "https://lukashammarstrom.com/case-studies/zen/zen-hero.webp",
			"path": "/case-studies/zen/zen-hero.webp",
			"alt": "Zen hero image"
		},
		{
			"context": "project card image",
			"url": "https://lukashammarstrom.com/case-studies/bottel/bottel-card.webp",
			"path": "/case-studies/bottel/bottel-card.webp",
			"alt": "Bottel portfolio card",
			"width": 1200,
			"height": 600
		},
		{
			"context": "mobile/project card image",
			"url": "https://lukashammarstrom.com/case-studies/bottel/bottel-card-760.webp",
			"path": "/case-studies/bottel/bottel-card-760.webp",
			"alt": "Bottel portfolio card, smaller source",
			"width": 760
		},
		{
			"context": "home and projects grid thumbnail",
			"url": "https://lukashammarstrom.com/case-studies/home-thumbs/bottel.webp",
			"path": "/case-studies/home-thumbs/bottel.webp",
			"alt": "Bottel thumbnail"
		},
		{
			"context": "implementation screen",
			"url": "https://lukashammarstrom.com/case-studies/bottel/cans.webp",
			"path": "/case-studies/bottel/cans.webp",
			"alt": "Bottel branded cans floating as a deposit return campaign visual",
			"width": 1400,
			"height": 788
		}
	],
	"routes": [
		{
			"label": "Home",
			"url": "https://lukashammarstrom.com/"
		},
		{
			"label": "About",
			"url": "https://lukashammarstrom.com/about/"
		},
		{
			"label": "My work",
			"url": "https://lukashammarstrom.com/projects/"
		},
		{
			"label": "CV",
			"url": "https://lukashammarstrom.com/cv/"
		},
		{
			"label": "Contact",
			"url": "https://lukashammarstrom.com/contact/"
		},
		{
			"label": "Conductor",
			"url": "https://lukashammarstrom.com/projects/conductor/"
		},
		{
			"label": "PrivatVet",
			"url": "https://lukashammarstrom.com/projects/privatvet/"
		},
		{
			"label": "Finnova",
			"url": "https://lukashammarstrom.com/projects/finnova/"
		},
		{
			"label": "Zen",
			"url": "https://lukashammarstrom.com/projects/zen/"
		},
		{
			"label": "Bottel",
			"url": "https://lukashammarstrom.com/projects/bottel/"
		}
	]
}
