case studymobile3d

Flutter app for woodcarvers and woodturners — staged 3D progression, design builder, offline-first.

hewn — preview
figure · hewn
01 · problem

Problem

Carvers and turners work from paper patterns and out-of-order YouTube clips. There is no app that treats a project as a sequence of cuts with a 3D model you can scrub through. I wanted the "Strava for the shop" version of that — guided progression plus a record of what you actually made.

02 · shape

Shape

Flutter on the client, Supabase for auth, Postgres, storage, and realtime. Local state lives in Drift so the app works offline; sync is push-pull through Supabase when the network returns. 3D is model_viewer_plus (WebView) for the hero viewer, flutter_scene with CSG primitives for the design builder.

03 · build

Build

Each project has a staged GLB pipeline — stage_01.glb through the finished piece — loaded lazily through an LRU cache with cross-fade between steps. The design builder composes cylinders, spheres, and blocks with pure-Dart boolean ops, then exports the rough geometry as GLB. Every hero model ships a grain material variant via KHR_materials_variants so the user can toggle between solid-color preview and final finish.

hewn — target stack A Flutter mobile app where widgets read from Riverpod notifiers, which call repositories that route to Drift for local storage and Supabase for sync. 3D model rendering is the only WebView surface. FLUTTER · TARGET ARCHITECTURE consumer widget riverpod notifier repository · async drift · local sqlite supabase · sync freezed · go_router · model_viewer_plus (3D)
figure · service topology
04 · result

Result

The shop-floor experience is the product. A carver can open the app next to a workpiece, scrub through the next stage in 3D, and log a session without internet. The staged GLB pipeline is load-bearing — it is the difference between a reference app and a guide a shop will actually keep open.

stack

FlutterRiverpodDriftSupabaseflutter_scenemodel_viewer_plus