Csongor Farkas

WorkSparkify

Rebuilding a field-documentation app from scratch — and the design system behind it

Sparkify is a field-documentation app for electricians — they test and sign off electrical installations, then have to prove it. I joined a product that had grown from a photo tool into a job it was never structured to do, and that almost nobody had adopted. As design lead and the team's only designer, I rebuilt it end-to-end — the information architecture, the core flows, and the tokenised design system that now carries it across two brands and every surface: iOS, Android and web. What follows is the thinking behind that rebuild — the problems I found, the decisions I made, and what shipped.

Contents

Company

Onstruc UG · 2024 – present

Category

Mobile app · Design system

Role

Design lead (sole designer)

Sparkify — Home, the project tree, template selection and a documentation in progress

My role

  • Product design, end-to-end
  • UX research & user flows
  • Wireframes → clickable prototypes (low → high fidelity)
  • Design-system architecture (tokens & components)
  • Design language & multi-brand theming
  • Web client — desktop surface
  • Marketing site — sparkify.cloud
  • Developer handoff — iOS & Android

The team

  • CEO, CFO, CTO & CCO
  • iOS & Android engineering leads
  • ML / image-recognition & QA
  • Master electricians — field testing
  • Investors & academic advisors

Deliverables

  • Rebuilt information architecture & user flows
  • Wireframes & high-fidelity clickable prototypes
  • Tokenised design system (published library)
  • Two brands from one system (Onstruc + Sparkify)
  • Component library for iOS & Android

01

The starting point

An app that had grown into a job it was never structured to do — and that few had adopted.

What was there before

The first question was why so few people used it. It had started life as a photo tool — take pictures on site, attach them to a job — and as the ambition grew to real documentation, flow after flow got bolted onto what was, underneath, still a photo app. The problem was structural, not cosmetic; no restyling would fix it. So the call, agreed with the team, was to rebuild from the ground up rather than patch.

  1. The legacy app's camera view, with the shutter button at the centre of the tab bar

    The camera was the app The shutter sat in the middle of the tab bar, Projects and Gallery either side. The main verb was take a photo — not document a job.

  2. The legacy project list, where every project is labelled with a number of pictures

    Projects were counted in pictures Each project's subtitle was a photo count — 6 Pictures, 4 Pictures. The unit of work was the image, so nothing in the model knew what a finished report even was.

  3. The legacy documentation screen — a long flat list of unrelated fields

    Documentation arrived bolted on When it came, it came as a long flat list of fields with no structure of its own, and no relation to the standard the report actually had to satisfy.

The legacy app — a photo tool that had been asked to become a documentation tool

The core problem

The work finished on site. The paperwork followed them home.

Documentation is the part of the job electricians like least and can't avoid — done on a ladder, in a basement, one-handed and out of patience. Any tool that demands concentration loses to a clipboard. So one measure governed the rebuild: speed. Make documenting faster than paper, automate every step a machine could do, and the tool stops being a chore and becomes the obvious choice.

The classic way

Measure. Note it down. Transfer it later. Fix the mistakes. Compose the report.

The customer gets a Word or Excel file with a printed signature — days later.

The goal I designed toward

Pull the readings, sign on site, produce the finished report on the spot.

The customer gets a signed VDE PDF with the electrician's logo — before they walk out.

02

The insight that unlocked it

The way in wasn't to design a better document — it was to mirror the electrician's world, because the structure users needed already existed in their trade, not in the software.

This came from research, not a hunch — interviews, affinity maps, and journey maps from arriving on site to handing over a signed report. One pattern ran through all of it: German electrical work is already standardised. A job is named after the standard it follows — device testing under VDE 0701/0702, installation tests under VDE 0100-600, visual inspection — and that standard already prescribes what has to be measured and recorded. Electricians don't think “I'll create a custom document”; they think “I'm doing a 0100-600 today.” The task-first concept was proven in low-fidelity wireframes with electricians before a single high-fidelity screen was drawn.

So the app was flipped around that. Instead of a blank canvas, it asks one question:

What task are you doing today?

Every answer is a ready-made template shaped like the real job. That question became the spine, and the test every later decision had to pass: does this mirror how the work already happens, and does it make it faster? Everything downstream — prefilled values, NFC transfer, photo recognition — follows from it.

The same principle repeats everywhere. Nearby projects uses location to surface the sites around you, because someone opening the app is almost always standing on the job. And the tree view gives each project a flexible nested structure — a proven way to organise information, long used across many fields, so I adapted it rather than inventing something new. A site maps naturally to site → building → floor → flat, but it bends to however a job is actually organised.

03

The decision that came before any screen

The hierarchy had to be settled before any layout, because it's the one thing every screen inherits.

Get it wrong and every screen spends its life fighting it. So the first move wasn't a screen — it was settling one nested hierarchy, workspace down to a single field. The payoff for the user: each scope shows only what belongs to it, so they're never lost, and settings made high up cascade down automatically — fewer things to enter, less to get wrong.

Workspacethe team or company — members, roles, templates & prefilled values live here
Projecta building or site, with its address and documents
Documentationone job's record — a VDE 0701/0702 report, a visual inspection…
Blocka repeatable group of fields inside a document
Fieldthe atomic input — text, selection, photo, address, measurement

Values cascade. A prefilled value set at the workspace level flows down into every project and document beneath — inherited fields appear pre-populated and marked, so the electrician confirms rather than retypes.

Projects — a site broken into sub-projects and levels, shown as a tree with document counts on each row

Structure · Projects

A building is not a flat list

A site has buildings, a building has floors, a floor has flats — so projects nest, and the tree is shown rather than described. Each level carries what belongs to it: an address, its own documents, its own prefilled values. The counts sit on the row, so the state of a job is legible without opening it. One structure, learned once.

04

Every feature had to remove a keystroke

With speed as the measure, features weren't added to impress — each one exists to take a step away from the person on site.

None of it is walled off. Sparkify reads from the hardware and planning tools electricians already use — measurements straight from Wiha and Sola testers, circuit lists imported from Stromlaufplan.de — so it plugs into the kit they already rely on, rather than asking them to abandon it.

Works withWihaStromlaufplan.deSola
A sheet offering three ways to add a PAT measurement: over NFC, by scanning the tester's display, or manually

NFC · Measurement import

The fast path, made optional on purpose

The reading can arrive three equal ways: tap the phone to the tester over NFC, scan its display, or type it by hand. Making NFC the only hero was tempting — but field testers are old, borrowed, or flat, and a “primary” path half the users can't take says the app wasn't built for them. So the fast route comes first, and the manual one is never a punishment.

Electronic device form — photos of the device and its nameplate, with the recognised type filled into a normal editable field

AI · Device testing

The model reads it; the electrician stays in charge

Transcribing a nameplate is the tedious part, so image recognition takes it on: two photos — the device and its plate — and the fields fill themselves. The design judgement was in the guardrails. The electrician signs the report, so the model can never be the authority: results land in ordinary editable fields, not a locked AI output, with a highlight showing what was detected and the expectation set up front. Recognition is a shortcut through the typing — the professional stays accountable for what goes in.

Reuse · Project & workspace layer

Prefilled values — say it once, reuse it everywhere

Prefilled values are the biggest single time saving in the product, and they work unseen. An electrician's answers repeat far more than they vary — the same contractor, the same recurring client, the same standard — so those values are set once and never retyped. They live at two levels, deliberately: the workspace holds what's true of the whole company, the project what's true of one site, and every documentation inherits both. The challenge was making the setup feel small — solved as a three-step wizard that always shows where you are and how much is left.

  1. Prefilled values — choosing which report template to prefill

    01 · Pick the template Prefills are set per template, so a 0701/0702 and a photo documentation each keep their own defaults instead of sharing one blurred set.

  2. Select fields — ticking which fields to prefill, grouped by section

    02 · Choose the fields Fields are ticked in the groups they already live in, so the choice mirrors the document's own structure — and a whole group can be taken in one tap.

  3. Fill out fields — each group showing how many of its fields are filled

    03 · See what's left Every group carries its own 0 / 6 filled count. The same progress pattern as the documentation itself, so the wizard needs no new vocabulary.

  4. Client (Customer) — the prefill form for company, contact, address and order number

    ↳ The form itself Not a fourth step — the destination. The same field components as the live document, including the address picker, so setting a prefill is indistinguishable from filling one in.

Prefilled values on the project layer — the same flow runs on the workspace layer, one level up

Editing a default isn't rewriting history. Changing a prefilled value updates the default that new documentations start from — finished ones are left alone. Pushing the change into existing documentations is a separate, explicit action: two verbs for two intentions, because quietly rewriting a signed report is not one anybody wants.

05

The core loop — where the rebuild had to earn its keep

This is the flow an electrician runs dozens of times a day, so I designed it around one constraint: it has to work on a ladder, one-handed, with no patience to spare.

The hard part wasn't the fields — it was that no two jobs are the same shape. A smoke-detector check and a VDE 0100-600 report share components, not a layout. A fixed screen per report would have shipped faster but broken the first time a workspace needed its own template. So the documentation is built from typed parts — text, number, date, select, photo, address, barcode, measurement among them — that assemble into any structure a template defines. More work up front, and the reason the product scales.

Real jobs repeat — circuit after circuit, room after room — so blocks are repeatable: add, duplicate, reorder, delete — with deletion always confirmed before anything is lost. Making that effortless took most of the detail work, and none of it was guesswork — the flow was prototyped, usability-tested on real jobs, then A/B tested and iterated with electricians until it held up in their hands. The adoption curve below is what that produced.

Designed for the messy middle, not the happy path. Every action carries its full set of outcomes — success, confirmation, error — as toasts, and the multi-selector expands into a focused modal so choosing many options never fights the form underneath. These are the edge cases most field tools skip, and exactly where an electrician gets stuck.

  1. A dismissible hint above the block list: swipe left on a block to duplicate it, tap Reorder to change the order

    01 · Teach it in place One hint, shown exactly where the gesture lives and dismissible for good — instead of an onboarding screen nobody reads. It's an authored feature, not a one-off: any block can carry an instruction.

  2. Swiping a measurement block left reveals Duplicate and Delete actions

    02 · Duplicate in one swipe The gesture reveals two actions. Duplicate is instant; Delete is the only red element on the screen, and always confirmed.

  3. The duplicated circuit block appears below the original, focused and confirmed by a toast

    03 · The copy, already in place The new block lands directly under the original and takes focus. Its label is built from its own field values, so the copy reads “4, Living room” — never “Block 4”.

  4. Reorder mode — the block chevrons are replaced by up and down arrows

    04 · Reorder without dragging Reorder mode swaps the list for arrows — precise with gloves on, and impossible to trigger by accident while scrolling a long form.

Repeating blocks — what turns “circuit after circuit, room after room” from retyping into a swipe
Duplicate a block / documentation — daily adoption
40%20%0Duplication shipsMayJunJul

The payoff, in real product analytics: after this shipped in late June, ~1 in 4 daily documentation-makers were duplicating a block or a whole documentation (peaks ~35%). Current partial week excluded.

  1. Generate a PDF Report — two signature slots, each with the option to leave an empty field to sign by hand, above the report options

    Set up the report Two signature slots, and either can be left as an empty field to sign on paper instead — because the second signature is often the customer's, and the customer isn't holding the phone.

  2. Signatures — drawing a signature with a finger, with name, city and date beside it

    Signed on the glass Drawn with a finger, or pulled in from a saved profile signature for the tenth job that week. Name, city and date sit with it, because a signature without them isn't worth anything to a customer.

  3. The finished, signed PDF report with the signature and a QR access code

    Handed over before leaving The finished report — signed, with a QR code for digital access. The job ends on site, which is the whole promise of the rebuild in one artefact.

The app in motion

Short recordings from the real app — the flows that make documentation quick on site.

Projects

Create a project in seconds

Naming it is enough to start — the address is optional, so nothing blocks you when you're standing on a site that isn't catalogued yet. Fewer required fields, faster start.

AI · Device testing

Add a device from a photo

The same image recognition, in motion — shoot the device and its plate and the fields fill themselves, one segment of a template that does much more.

06

The system every screen is built from

Not documentation written after the fact — the thing the screens are assembled from, and the reason one designer could keep a product this size consistent.

I made one architectural call early that paid for itself many times over: don't draw screens — build a system and assemble them from it. Colour, type, spacing and radius are Figma variables, and every component references a token, never a hard-coded value. The result is a single published library — 6,000+ components, consumed on iOS and Android — where changing one token updates every screen that uses it. It is also why the second brand later cost days instead of months.

Foundations

The point isn't the individual values — it's that one architecture scaled the whole product consistently, and let a second brand ship by swapping token values instead of redesigning screens.

Every value below is a real Figma variable from the published library. Colour, type, spacing, radius — even elevation and blur — are tokens, so components and screens reference the token, never a raw value.

Colour · brand ramp

primary/500#0a1a2fBrand · primary
primary/200#cacecd
primary/100#dbdee4
primary/50#f1f3f7

Colour · text & neutral

text/550#0f0f0f
text/500#111111
text/450#292929
neutral/500#7a7f89
text/100#cfcfcf
neutral/white#ffffff

The task-colour system

Each documentation task carries its own colour, defined once as a gradient token and reused on its home tile, its header and its report. The design system and the product concept are the same idea.

Device testing (Wiha PAT)field-sets / PAT#f2b1b8 → #d2091e
VDE 0702 reportfield-sets / VDE 0702#9599f3 → #0c119e
Visual inspectionfield-sets / visual-inspection#97ccc6 → #294e4a
Photo documentationfield-sets / photo-documentation#eb9be7 → #65035b
Vehicle documentationfield-sets / document-vehicle#ffbb94 → #9e4918

Type · Roboto headings + Inter body

Aufgabe auswählentext/headings/h3 · Roboto · Bold · 18 / 26
Aufgabe auswählentext/button/base-bold · Inter · Bold · 16 / 24
Aufgabe auswählentext/default/base-medium · Inter · Medium · 16 / 22
Aufgabe auswählentext/small/base · Inter · Regular · 14 / 20
Aufgabe auswählentext/tiny/base-bold · Inter · Bold · 12 / 18
Aufgabe auswählentext/extra-tiny/field-set-title · Roboto · Bold · 10 / 12 · +1

Spacing scale

space-1008px
space-20016px
space-40024px
space-50032px

Corner radius

radius-2004px
radius-3008px
radius-40012px
radius-50016px

Component library · a representative slice

ButtonButton smallerSmart buttonAlert buttonIcon buttonClose buttontext_fieldcheck_boxradio_buttonIcon-RadioButtontooltipBanner

Variant-based component sets, every property bound to the tokens above — one published library, built once, consumed on iOS and Android.

07

Two brands, one system

A second brand shipped as a set of new token values — not a redesign.

Because the system runs on tokens rather than fixed styles, a second brand didn't mean a second design. Onstruc and Sparkify use the same token namesprimary/500, text/500, the task-colour set — with different values inside. Re-theming was a matter of swapping values, not redrawing screens: change the variable, and the whole app follows.

Onstruc

primary/500 · #425c59

Sparkify

primary/500 · #0a1a2f

One variable, two values. Type (Inter · 16/24), spacing (space-100 = 8) and radius (radius-300 = 8) are byte-for-byte identical across both brands — only the primary ramp changes. That's the entire re-theme.

The two brands weren't a design exercise — they were a business decision. The product was built as Onstruc; then Wiha came in behind it and it went to market as Sparkify. I knew a re-theme was coming, so I structured for it from the start: every colour referenced by role, nothing hard-coded, one primary ramp a brand could own. When the rebrand arrived it was a set of new values behind the same variable names — not a redraw, not a project. Planning for it was the work; the switch itself was almost an anticlimax.

A project screen in the Onstruc theme — the header and accents in Onstruc green

Onstruc · primary/500 · #425c59

The identical project screen in the Sparkify theme — the same layout, the header and accents in Sparkify navy

Sparkify · primary/500 · #0a1a2f

The same screen, both brands — identical layout, type, spacing and components. One token changes value; nothing is redrawn.

08

Built for the field

Offline sync, roles and permissions, address entry, empty and error states — the unglamorous work that decides whether a tool survives real use.

Connectivity

Offline by default

Basements and new-builds have no signal. Work continues offline; changes sync on reconnect, and a clear banner tells the user the count they see may be stale.

Permissions

Roles & permissions

Owner, Manager, User and Guest — assignable per member, at both workspace and project level, with distinct views for admins and guests.

States

Designed empty & error states

Every list has a purpose-built empty state; every action has success, confirmation and error feedback. No blank screens, no dead ends.

Inputs

Robust address entry

Search autocomplete, drop-a-pin on the map, or type it by hand — with a graceful fallback when precise/GPS lookup isn't available.

Returning to the app — a dialog asking whether to continue an unsaved documentation or discard it

Recovery · Draft state

The safety net for work that gets interrupted

Phones die, overheat, and get closed mid-form. Progress saves automatically as a draft, and returning to the app asks one question on Home, where it can't be missed: continue, or discard. Continue is emphasised, discard is the quiet one — when someone has lost an hour on a ladder, the recovery path shouldn't be the one they hunt for.

Manage workspace members — each member's role set from a dropdown on their own row, with invite by email above the list

Access · Members

Permissions where the people are, not in a settings screen

A role is a dropdown on the member's own row — no separate permissions matrix to hunt for. Inviting is the one action above the list, because adding someone is what you came to do; removing reuses the same swipe used elsewhere, so there's no new gesture to learn. The owner's own role is fixed, not merely discouraged.

09

One system, every surface

One component library for the native apps, and a web client built on the same system — one design language across every surface.

Figma was the single source of truth — one library, not separate files per platform. A component defined once carries the same structure and tokens across iOS and Android; the web client is a separate build drawing on the same system, so the whole product reads as one. Naming every state, variant and size before it was needed is the least visible part of the work and by far the highest-leverage: the reason two brands, three platforms and a steady stream of new templates never became three separate products.

I designed the majority of the web client too, with Onstruc's CTO — and the marketing site at sparkify.cloud, so the design language carried from a form on a ladder out to the page that sells it. The split between surfaces is posture, not power: the phone is one job on site, one hand free; the web client is many jobs at a desk. Where a capability matters in both, it exists in both — the PDF report builder runs on the phone as well as the browser.

Authoring · Templates

The web client is where the system authors itself

A documentation type isn't hard-coded — it's a template, authored here from fourteen field types plus two containers, a block and a repeated block. That constraint keeps the information architecture honest: documentation, block, field, with no arbitrary nesting to get lost in. Two settings do quiet work — a block's label is composed from its own field values, and an instruction helper can attach to any block, which is where the “swipe left to duplicate” hint comes from.

Built to be handed over. Field names and descriptions are stored per language, and a whole template can be exported to JSON and imported back — the design tokens ship the same way, as a live JSON file the platforms read, not a redlined spec that drifts. A workspace can be handed a ready-made document type instead of rebuilding it.

The Sparkify web client in the browser — the Projects view, the same system on desktop
The web client — the same design language in the browser, and where templates, prefilled values and workspace settings are authored

10

Outcome

Live on every platform in 27 languages — a signed report now done on site in minutes.

What started as a photo tool had become one documentation system — spanning the job site, the office and every platform in between. The numbers are what that turned into.

600

Documentations created a day

The rebuilt product, in daily use — the old one was barely adopted

27

Languages shipped

One task-first structure, localised across the EU

~7 min

From measurement to signed report

Timed by electricians on a full MFT report — the old way ran across days

2,000+

NFC measurement reads a week

From a standing start — the tap-to-read flow I designed

Sparkify shipped. It's live on iPhone, iPad, Android and a browser-based web client — the same documentation synced across all of them — localised into 27 languages, with a free tier that stays free. The rebuild replaced a tool nobody adopted with one shaped around how the work actually happens: from the first measurement on site to a signed PDF, without retyping.

The loop closed. The old way ran across days: measure on site, note it on paper, transfer it at the office, fix what got mistyped, compose the report, send it. With the tester talking to the phone and the template already shaped like the standard form, a full MFT report is now filled out, signed and handed over on site, in roughly seven minutes — timed by electricians running the job, not estimated.

Early users are enthusiastic — the app holds 5.0 on the App Store across its first ratings, with reviews like “best app for documentation.” And because it runs on a tokenised design system, the team keeps shipping — new templates, a second brand, hardware and planning-tool integrations — without redesigning the app each time. The system is what lets the product keep moving.

What I inherited

A photo-first tool. Paperwork finished at the office, transcribed by hand.

Structurally unable to produce a report — and barely adopted.

What shipped

Task-first documentation. Measurements imported, signed on site in ~7 minutes.

Live on iOS, Android and web in 27 languages — rolling out across the EU.

The standards-based approach is what makes it travel. Because EU electrical standards are closely aligned, the same task-first structure adapts country to country — so a country picker at onboarding (shipping now) simply serves the templates that match where the electrician works. The insight that unlocked the German product is the same one carrying it into France, Sweden, Norway and the wider EU.

Documentations created — average per day
8004000AprMayJunJul

Real product analytics, Apr–Jul 2026 — roughly 600 documentations created a day. The measure the rebuild was judged on: the old app was a photo tool few had adopted.

NFC tap-to-read — events per week
2,0001,0000MarMayJul

Real product analytics, Mar–Jul 2026 (the current partial week is excluded). Adoption of the tap-to-read NFC flow I designed — from a standing start to 2,000+ events a week.

Sparkify — Berichte für Elektriker

5.0 on the App Store · Free · Productivity · 27 languages · Onstruc UG

The rebuild started from one idea: the structure users needed already existed in their trade, not in the software. Everything after that was following it honestly.

More work

View all