Software engineer · product systems · interaction

I design and engineer systems that make complex behavior understandable.

My practice moves between product design and software engineering. Projects begin with observation, questions, sketches and working experiments. Promising ideas develop through explicit models, accessibility, performance measurement and repeatable verification, so exploration and implementation remain part of the same process.

Selected work

Selected projects and working methods.

Each case study describes the problem, the design process, the experiments and the engineering decisions that shaped the result. The emphasis is on how observation becomes a model, how a prototype becomes evidence and how proven behavior becomes part of a durable system.

Portfolio mapPrimary studies

Slipmat · FireOne · Lemonade

Technical systems

Signal Broker · Defend · QMK / Vial / Halcyon

Operational systems

Booking · Inventory · Timeline

Public and knowledge systems

Kullaberg · Investigation Workbench

01 / Media systems

Slipmat

A playback-first media system organized as domain contracts, deterministic planners and state machines, adapters and services, presentation models, then platform projections. Playback authority stays explicit across Jellyfin, local media, native processing and the interface.

React 19Rust 2024Tauri v2JellyfinWASM analysis
Private · active product development Read case study
02 / Deterministic simulation

FireOne

A submarine tactics game about uncertainty, geometry and commitment. Its Rust simulation separates world state from player and AI knowledge, using deterministic ECS behavior and sonar-driven incomplete information to make perception part of the simulation.

RustBevy ECSRatatuiDeterminismSimulation AI
Private · playable pre-release Read case study
03 / Vehicle telemetry

Signal Broker

A vehicle-network development stack that exposes CAN, LIN and related buses through gRPC. Its browser client adds gRPC-Web and WebSocket access so live frames and decoded signals can be selected, inspected and charted interactively.

ElixirgRPCgRPC-WebCAN / LINVue
Read case study
04 / Procedural systems

Defend

A behavioral-parity modernization of a physics-driven strategy game. The historical Webpack/Babylon/Cannon build remains an executable reference while the active modernization lane isolates deterministic domain logic, worker and audio ownership, and renderer-independent contracts.

Babylon.jsTypeScriptPhysicsAIProcedural audio
Read case study
05 / Human input

QMK / Vial / Halcyon

An embedded input stack where firmware owns runtime semantics and persistence while typed Raw HID exposes capability-aware host configuration. Exact-target builds, resource reports, strict QMK lint and embedded anti-pattern checks make hardware constraints executable.

CQMK / VialRaw HIDWebHIDFerris Sweep
Public · active development Read case study
06 / Economic simulation

Lemonade

A deterministic economic simulation whose core is prohibited from depending on ambient time, randomness, browser state or rendering libraries. Three.js, Web Audio, storage and UI remain adapters, while fixed-seed certification makes balance and accounting reviewable.

TypeScript 6Vite 8Three.jsWeb Audio
Public · active development Read case study
07 / Configurable platforms

Booking

A configurable reservation platform built around a pure scheduling engine, replaceable persistence and explicit production transaction boundaries. Governance registries, SBOMs and provenance evidence are treated as part of the system architecture rather than release paperwork.

TypeScriptDomain modelingCodeQLCycloneDX
Public · active development Read case study
08 / Local-first operations

Inventory

A local-first inventory PWA for check-out, overdue accountability, offline work, backup and export, with a clear history of items and responsible entities.

PWALocal-firstOfflineBackup
Public · active development Read case study
09 / Information modeling

Timeline

A local-first chronology and relationship workspace with a renderer-independent temporal projection layer and retained keyed scene. Overscan, interaction retention and commit-time reconciliation preserve identity and performance while timeline, graph and map views evolve toward a coordinated model.

EventsRangesCategoriesStories
Public · active development Read case study

Additional studies

More applications, experiments and earlier work on GitHub

Professional thread

Design practice informs the way I engineer software.

My background connects graphic design, multimedia production and teaching with public-service software, large planning interfaces and systems engineering. I approach code as a design material: a medium for clarifying relationships, testing assumptions and shaping interaction.

Historical public material documents frontend application work for Länsstyrelsen Skåne and earlier leadership in design, multimedia and university teaching. Public LinkedIn material also documents close collaboration around the rebuilding of IKEA Kitchen Planner and IKEA Planner tooling using React, TypeScript and accessibility-focused frontend engineering.

Each stage added another instrument for inquiry: visual composition, interaction, user observation, state modeling, performance analysis, deterministic simulation and automated verification. Together they support a practice where intuition proposes directions and evidence develops them.

Read the professional experience narrative

About

I am interested in systems where structure and discovery reinforce each other.

A small interaction can reveal a physical model, a simulation can expose an unexpected relationship, and a well-structured tool can make complex information easier to examine and act upon.

I work across product thinking, visual and interaction design, and implementation. Minimal surfaces, careful hierarchy and working prototypes help make complex capability approachable.

Across media playback, games, vehicle telemetry, public-service software, knowledge graphs and programmable input, the method stays consistent: curiosity opens a direction, disciplined modeling gives it coherence and automation preserves time for further study.

Working principles

Discipline gives experimentation a durable form.

01

Begin with observation and a useful question.

Sketch, prototype, simulate and test on real hardware when the medium calls for it. Early experiments make relationships visible and allow a surprising result to guide the next question.

02

Turn experiments into evidence.

Instrument behavior with deterministic seeds, visual laboratories, accessibility checks, performance traces and explicit domain models. Comparable evidence gives creative decisions a shared basis.

03

Give proven ideas a stable form.

Types, tests, CI and documentation preserve established behavior. Automation carries routine verification so attention can return to observation, interpretation and new experiments.