Field guide · iPhone Pro · LiDAR

Walk a circle.
Get the body.
Cut the cloth.

vibeSeamer turns an iPhone Pro into a tailor's measuring assistant and pattern drafter. A helper orbits the person for about half a minute; the app builds a point cloud, reads the standard tailoring measurements with an error band on each, shows them as rings on the body in AR, asks for a tape only where it is unsure, and drafts made-to-measure patterns you can print at home or throw on a projector.

iPhone 15 Pro or newer iOS 18+ Everything stays on the phone FreeSewing patterns
chest 94.2 ±1.1 waist 76.8 ±0.9 seat 101.5 ±1.4 coverage 0°

How it fits together

The core loop

Six steps, two of them optional. Each one is a screen in the app, and each hands a dated measurement set to the next.

ScanA helper walks a slow circle. 25–30 s.
Review in ARRings on the body. Drag a label to move a level.
optionalTapeOnly the few values the camera is least sure of.
SaveA dated set on the person's profile.
Draft13 FreeSewing blocks and garments, live preview.
ExportTiled PDF, A0 roll, SVG, or projector at 1:1.

Before the first scan

What you need

The phone

An iPhone with LiDAR: 15 Pro, 15 Pro Max, or any later Pro. iOS 18 or newer. The scan screen checks for scene depth at launch; on any other iPhone it says LiDAR capture needs an iPhone Pro and leaves typed and voice entry available.

iPad and non-Pro iPhones still run everything except the camera scan: profiles, typed sets, drafting, printing.

The room

Hard, level floor. About 2 m of clear space all round the person so the helper can walk a full circle 1.5–2 m away. Even light, no strong backlight behind the subject. Mirrors and glass behind the person confuse depth; avoid them.

The person

  • Skin-tight, single-colour clothing; usual bra; hair up; no shoes.
  • Feet hip-width, eyes forward, normal breathing.
  • Arms 30–45° from the body (an A-pose) so the sides of bust and underbust are visible.
  • A thin ribbon tied at the natural waist helps the waist level. Optional.

The helper

Anyone with steady hands. They hold the phone level, in portrait, at the subject's chest height and walk one slow, even circle. The coach talks them through it, so they never need to look at the screen for long.

Install on the phone

The app is built from source with Xcode. Plug the phone in, unlock it, and trust the Mac when asked. Then from the project folder:

cd ~/code/vibeSeamer
xcodegen generate
open vibeSeamer.xcodeproj

Pick the vibeSeamer scheme, choose your phone as the destination, and press Run. Signing is already set to the project's team; if Xcode complains on the first run, sign in to that team under Xcode ▸ Settings ▸ Accounts and run again.

On the Mac, the gate script Tools/check.sh runs every package test, builds for the simulator and drives the UI tests. Green means the tree is safe to install.

First device run is the real test

Point the phone at someone 1.5–2 m away and tap Start. The HUD distance should match reality and the coverage arc should grow as you walk. If the distance is wrong or no set comes out, note the message on the results card. Every recording is kept under Application Support/Recordings in the app container, so a failed scan can be replayed on the simulator and fixed.

Profiles

People, consent and sets

The People screen is home. Every person holds dated measurement sets; every set can be drafted from. Nothing about a body is recorded until consent is on the profile.

Add a person

  1. Tap Add person on the People screen and type a name.
  2. Switch on the consent toggle: This person agreed to be measured. For a minor, a parent or guardian is present. Scan stays disabled until it is on.
  3. Or switch on Dress form for a mannequin. A dress form needs no consent and is the ground truth for checking camera accuracy.
  4. Switch on Start with sample measurements to give the person all 38 measurements of an average adult (FreeSewing's size 40 model). Open the set and tap Draft a pattern to see what the app makes before anyone is measured; replace the values with real ones later.

On a person's page

  • Scan with camera opens the orbit capture (LiDAR phones only).
  • New measurement set opens typed and voice entry.
  • Import set… reads a FreeSewing JSON file someone shared with you (see Share and import).
  • Sets are listed newest first with their value count and a row of source dots, so you can see at a glance how much of a set came from the camera, a tape, or typing.
  • Swipe a set or a person to delete it. The alert says what goes with it, and it is gone for good.

Source badges

Every value carries where it came from. You will see these on rows, cards and the dashboard.

camera tape typed derived estimated
cameraMeasured from the orbit point cloud. Shown with its error band, e.g. 94.2 ± 1.1 cm.
tapeYou taped it. Replaces the camera value; error becomes 0.5 cm. The camera value is kept in the validation log.
typedEntered by hand or voice, or imported from a file. Typed values assume a 0.5 cm error; imported ones 1 cm.
derivedComputed from other values, e.g. crotch depth = waist-to-floor − inseam.
estimatedA model, not a measurement: cross seam from seat and crotch depth, or anything from a self-scan. Wide error band.

Capture

The helper orbit

The primary way to measure. The phone's LiDAR records depth, the person mask and the camera pose about eight times a second while the helper walks round. The whole scan, from Start to the results card, takes under a minute.

hard, level floor chest waist seat arms 30–45° 1.5 – 2.0 m phone level, portrait, at the subject's chest height
Whole body in frame, phone level. Closer than 1.5 m clips the feet; further than 2 m thins the depth data.

Step by step

  1. On the person's page tap Scan with camera. The live camera appears behind a Before you start card with the clothing and pose checklist. Read it to the subject.
  2. Stand 1.5–2 m away, frame the whole body, tap Start. The coach says "Walk a slow circle around the person".
  3. Walk one full circle at an even pace, about 25 seconds. Watch the arc round the orbit dial fill; the HUD shows distance and coverage ° of 360.
  4. At "Done. Tap Stop." press Stop. The phone keeps tracking the room while it works, which is what lets the rings land on the body a few seconds later.
  5. The Orbit measured card appears with height, coverage, frames used, points and value count. Choose Save as measured, Make it precise, or Discard.

What the coach says

Spoken and shown, at most one cue every two seconds. Tap a cue to hear which situation triggers it.

Tap a cue.

What happens inside

Nothing leaves the phone. After Stop, the pipeline runs on the recording:

  1. Unproject. High-confidence depth pixels inside the person mask become 3D points in the room.
  2. Motion gate. Hip and shoulder centres are tracked frame to frame; frames where the person moved over 1.5 cm are dropped. That is the frames excluded number on the card.
  3. Clean. 5 mm voxels, outlier removal, largest connected body.
  4. Levels. Shoulder, hip, knee and ankle heights from the pose stream; waist as the narrowest slice between hips and chest; bust as the fullest; seat as the fullest below the hips.
  5. Slice. At each level the points within ±1 cm are closed into a smooth outline and its perimeter is measured. Gaps over 15° are bridged and widen the error band.
  6. Lengths and error. Straight and surface lengths between landmarks, then an error estimate per value from sensor noise, angular gaps, spread, and a per-measurement prior (soft tissue gets a wider band).

Reading the results card

HeightFloor to the top of the cloud. Reads ~2 cm short because the crown is never seen from chest height. Shown for reference, not used in patterns.
CoverageDegrees of the circle seen. Under 330° the card warns that some values are less certain, and saving asks you to confirm (see AR review).
Frames usedKept vs excluded by the motion gate. Many excluded frames means the subject swayed; re-scan if a key value looks off.
PointsSize of the cleaned cloud. A good scan is well over 100,000.
ValuesHow many measurements came out, derived values included.

Sanity flags, not blocks

Left and right disagreeing, a waist larger than the seat, inseam plus crotch depth far from waist-to-floor, or a taped value more than three error bands from the camera: each shows as a warning banner on the set. You decide. A separate check badge on a row marks a value the camera had to infer; what it means is below.

Self-scan, when nobody can help

Switch the mode on the ready screen to Self-scan. Prop the phone at waist height about 2 m away with your whole body in view, arms a little away from the body. Tap Start, face the phone and stand still for three seconds, then at the cue turn to your left side for three seconds. The recording stops itself at ten seconds.

The result is an estimate: the app sees only your front width and side depth at each level and models each circumference as an ellipse, so every value wears the dashed estimated badge with an error of at least 2.5 cm, and arm measurements are left out. Use Make it precise on the top values and it becomes a real fit. Self-scan sets cannot be re-sliced in AR.

Self-scan is the last milestone of the build and is being finished now; the estimator itself is tested, the capture screen is in progress.

Check the levels

AR review

After the scan the measurement rings are drawn on the live camera view, anchored in the room, with a label on each. If the waist ring sits a little high, drag its label down and the value re-slices from the cloud on the spot.

chest 94.2 ±1.1 cm waist 76.8 ±0.9 cm seat 101.5 ±1.4 cm waistToFloor 104.0 ±0.8 camera dragging re-sliced
Rings are 6 mm vertical bands so they read from a camera at chest height. The label is the drag handle.

How to use it

  • Look first. Walk round; the rings stay where the body was. Check that waist, bust and seat sit where a tape would go.
  • Drag a label up or down to move that ring's level. The ring turns tape yellow while you hold it, then thread blue once the new slice has been measured from the cloud. The value and its halves update, and so does every length that starts or ends at that level: move the waist and waist-to-floor, waist-to-hips and the rest are re-measured against the other levels as they now stand. Taped and typed values are never overwritten.
  • Reset appears once you have moved anything and puts every ring back.
  • Draggable rings: waist, seat, hips, chest, underbust, high bust, neck, head, upper leg, knee, ankle. Biceps and wrist are display-only.
  • Rings are not re-fitted. If the person steps out of frame, the banner Rings stay where the body was scanned. If the person moved, re-scan or tape the values. stays up for the rest of the review.

Then choose

Save as measuredSave the reviewed set as it is. If the orbit was under 330° or any value is flagged, a sheet comes first.
Make it preciseTape the few least-certain values before saving.
DiscardThrow the scan away and return to the ready screen.

The sheet is titled Check before saving. It lists the measurements inferred from a partial view and the coverage seen. Nothing is saved until you tap Save anyway; Make it precise sends you to the tape walk instead. The same sheet appears when you press Done in the tape walk with flagged values still untaped.

Tape tier

Make it precise

The camera always gives a value and an error band. When you want a closer fit, the app sorts the set by error and asks for a tape measure on the worst few. Four by default; one to eight with the stepper.

The walk

  1. Tap Make it precise on the results card. The sheet opens on Tape 1 of N, the value with the largest error band. Values marked check come first, then the largest error band. In the camera view behind it, that measurement's ring is highlighted and everything else dims: that is where to put the tape.
  2. Read the definition, tape the person, type the number or tap Say it and speak it the way a tape reads: "thirty-one and a quarter", "seventy-six point eight".
  3. Save records it and moves on. Skip leaves the camera value. Change Tapes to take mid-walk and the remaining list re-ranks.
  4. After the last one, or on Done at any time, the set is saved with whatever you taped.

What a tape changes

  • The taped value replaces the camera value and gets the tape badge with an error of 0.5 cm.
  • The camera value is not lost: the pair is written to the validation log, which feeds the accuracy dashboard. Every tape you take teaches you how far the camera is off on real bodies.
  • Derived values (crotch depth, cross seam) recompute from the new numbers.
  • Only tapeable measurements are asked for. Angles and derived values are skipped.

Taping a saved set later

Open any set, find a camera or estimated row and tap its Tape button. The same camera-versus-tape sheet opens for that one value. Good for the day you decide the chest needs checking after all.

The contract

The 38 measurements

vibeSeamer uses FreeSewing's measurement names and definitions unchanged, so a set drafts without translation and can be shared with any FreeSewing user. Tap a measurement to read its definition and see where it sits; tap a ring or line on the figure to jump to it.

tap a ring or a line

Units: pick centimetres or inches in the unit switch; inches show as fractions (31 ¼ in). Angles are always degrees. Internally every length is stored in millimetres.

Reading an error band

Every camera value shows ± x cm. It is the app's own estimate of how far off it might be, from sensor noise, how much of the circle it saw at that level, how scattered the points were, and a prior per measurement. The ring beside a camera value draws that band against the measurement's prior: empty is tight, full is no better than the catalog's starting guess. It never shows a percentage; the band itself is its label.

waist 76.8 ± 0.6 chest 94.2 ± 2.4

Accuracy tiers

TierHowTypical band
CameraOrbit only1–3 cm
PreciseOrbit + 4 tapes0.5 cm on the taped keys
EstimateSelf-scan, front + side≥ 2.5 cm or 4 %
TypedYour own tape, entered0.5 cm assumed

Targets for the camera tier are a median error of 1 cm on lengths and 2 cm on circumferences in tight clothing. Until the validation log proves that on real bodies, camera values keep their bands visible.

The three nobody tapes

Crotch depth is derived: waist-to-floor minus inseam. Cross seam and cross seam front are estimated from seat and crotch depth with a model fitted to FreeSewing's example bodies, so they carry a 3 cm band. You can still tape any of them; the tape wins.

The check badge

A check badge on a row means the value rests on heavily inferred data and you should confirm it. Four things raise it: a contour that was more than half bridged across gaps, a left and right contour (knee, upper leg, ankle, wrist, biceps) that disagree by more than a quarter (the better-seen side is then used alone), a floor-dependent length (waist-to-floor, inseam) measured to the lowest body point because no floor was found, and anything from an orbit under 330°. Every value from a self-scan carries it. A paired value also carries the worse side's gap in its error band, and a length down the front or back of the torso is left out rather than reported short when the surface was not seen along the whole way. A tape or a typed correction clears it.

Where the camera approximates

Most camera values follow FreeSewing's definition. Known approximations: crotch depth is measured standing, not sitting; waist-to-armpit sits a fixed 10 cm below the shoulder; shoulder lengths run between pose joints, not the shoulder bone; hips are taken at the hip-joint height; HPS-to-waist follows the body surface. HPS-to-bust is the vertical drop, as FreeSewing defines it, and the wrist is sliced 1 cm toward the elbow from the wrist joint. Tape any of these when the pattern depends on it.

No camera needed

Typed and voice entry

For a set you already have on paper, or on a device without LiDAR, New measurement set opens a form with every measurement, its one-line definition and a field in your unit.

  • Type any value; inches accept fractions (31 1/4) and decimals.
  • Voice mode walks the list and listens for each one. Say it like a tape reads: "thirty-one and a quarter". The field fills, the app moves to the next. Stop voice mode at any time.
  • Fields you leave empty are simply absent from the set; a design that needs them tells you what is missing.
  • Everything saves as typed.
  • Voice runs on the phone only. If this phone has no on-device speech model, voice mode will not start and says On-device speech recognition isn't available on this phone. Type the values instead.

Share and import

A set exports as FreeSewing JSON through the share sheet, the same format the FreeSewing site uses, so a friend can draft from it anywhere. The way back is Import set… on a person's page: pick the file and it becomes a new typed set on that profile (1 cm error each, with a note naming the file). Names that are not one of the 38 are ignored; non-numbers, zero, negatives, circumferences under 5 cm, anything over 5 m and a shoulder slope outside -30° to 60° are rejected. As soon as the set is saved an alert lists what was ignored or rejected, the set's page shows the same notes at the top, and they print on the Summary PDF. Typed and tape entry apply the same rule, so an impossible value is marked in the form and cannot be saved. The file is refused only if nothing valid is left (That file has no measurements in FreeSewing's format.). The JSON carries measurements only, never style options.

A Summary PDF of a set, one page with every value, unit and source, is there for the sewing-room wall.

Editing a saved set

Every value on a set can be corrected. Camera rows keep the Tape button, which opens the same camera-versus-tape sheet as before. Every other row has a pencil (or swipe it) that opens just that value. Only the rows you change are rewritten; the rest keep their source, error band and note. A taped value you change stays tape; anything else becomes typed. Estimated and derived values cannot keep their label, because they recompute from the numbers around them.

If a tape or typed value lands three or more error bands from what the camera read, the set shows differs a lot from the scan. Re-tape or re-check the ring. and the row gains a Camera read 94.2 cm line, so you can see what it replaced.

Drafting

From set to pattern

Tap Draft a pattern on any set and pick one of 73 designs, grouped by garment with the blocks last. The pattern is drafted on the phone by FreeSewing, the open-source parametric drafting engine, running inside the app; the preview redraws every time you change a setting.

Tops
teaganT-shirt
aaronTank top
dianaTop with a draped neck
tamikoTop from one piece
tristanFitted top with princess seams
shellyRaglan swim shirt
Shirts
simonButton-down shirt
simoneButton-down shirt with bust shaping
Sweaters and hoodies
svenSweater
hugoHoodie with raglan sleeves
yuriZipless hoodie
hueyZip hoodie
Jackets and coats
wahidWaistcoat
jaegerSport coat
carltonLong coat
carlitaLong coat with bust shaping
lunetiusRoman cloak
Dresses and tunics
tiberiusRoman tunic
walburgaWappenrock (tabard)
Trousers
titanTrouser block
charlieChino trousers
pacoSummer pants
luminaLeggings
lumiraLeggings, alternate fit
waraleeWrap pants
corneliusCycling breeches
Skirts
penelopePencil skirt
sandyCircle skirt
Swimwear
shinSwim trunks
beeBikini top
onyxOne-piece garments
Underwear
bruceBoxer briefs
umaUnderwear
jane1790s shift
cathrinUnderbust corset
Aprons
albertApron
Blocks (for drafting your own designs)
bellaBodice block with bust darts
noblePrincess-seam bodice block
breannaBodice block
brianBasic body block
bentBody block with a two-part sleeve
bibiKnit top body block

Controls on the draft screen

Seam allowanceOff, or a width in your unit. Drawn as the outer line.
PaperUS Letter or A4 for the tiled PDF; the page count updates live.
OptionsThe design's own style options, under an Options row that counts how many you changed. A percentage, a length (mm or inches) or an angle is a slider; a count is a stepper; a yes/no is a toggle; a choice such as collar type is a menu. A slider redrafts when you let go. Only differences from the default are kept, so setting a control back to its default drops it, and Reset to defaults clears them all. Tiled and large-format PDF and SVG follow the options; the JSON is the measurements only.
Pattern sizeOverall width × height of the laid-out pieces at full scale, and the number of pages it will tile to.
WarningsAnything FreeSewing flagged while drafting, such as an unusually small ease.
Out of dateWhile a redraft runs, or after one fails, the old preview dims, a banner shows the failure, the export buttons and the Projector button are disabled and Pattern out of date shows. A connected projector shows Pattern out of date too, instead of the old pattern. Nothing stale can be shared.

Missing measurements

Each design needs a particular subset. If the set lacks any, the draft screen says Titan needs 2 more measurements and lists them with an Add measurements button that opens entry for just those keys. What you type is saved into the set you are drafting from, not a new one, and the draft refreshes. The camera orbit covers every measurement the designs need except a handful you type once (heel, bust span, bust point to underbust, shoulder slope).

On the design picker, Ready means only that every required value exists. It says nothing about how accurate they are.

Blocks versus garments

Blocks (bella, brian, bent, noble, titan) are the fitted foundations a sewist drafts other things from. Make one first, sew a toile, correct the set, and every garment you draft afterwards inherits the fit. Garments (aaron, charlie, paco, penelope, sandy, simon, simone, teagan) are ready to cut.

Getting it onto paper

Print, plot or project

Four files out, all through the standard share sheet, and the projector in its own chapter. Each is drawn at true scale from the same draft, so a seam line is the same length on a home printer, a roll plotter and a wall.

Tiled PDF (Letter or A4)

  • Page 1 says print at actual size and carries a 1 in and a 5 cm square. Print it alone first and measure the squares with a ruler.
  • Printer dialog: 100 % or Actual size, never Fit to page.
  • Pages have a 1 cm overlap and alignment marks labelled by row and column (A1, A2…), plus a layout-map page showing which page goes where.
  • Trim or fold one overlap edge, match the marks, tape. The pattern lines run through the joins.
  • Each piece carries its grainline and cut-on-fold labels, with arrowheads, in the PDFs.

Large-format PDF

One sheet at A0 or 36 in roll width for a copy shop or a plotter. Same test squares. Ask for 100 % scale on the order form; shops default to fit. Grainline and cut-on-fold labels are drawn here too.

SVG and JSON

SVG of the full pattern for a cutting machine or for editing on a computer. FreeSewing JSON of the measurement set to share the body, not the pattern.

File names carry the person, design and date, for example Alex-Titan-2026-10-17-tiled-letter.pdf. Each draft writes into a folder of its own; change an option and you get new files, the old ones are deleted and never offered.

Pieces at 1:1

Projector mode

Throw the pattern onto a table or the wall at true size and trace or cut along the light. The phone never trusts a projector it has not measured: you check the scale every time the screen connects.

Calibrate, every time

  1. Connect a projector or second screen to the phone by USB-C or AirPlay, pointed at the table or wall. Open a finished pattern draft; the Projector button in the top bar turns on. It stays off while the pattern is out of date.
  2. Tap it. The projector shows a 100 × 100 mm square and two bars, A across and B down, each drawn 200 mm long (150, 100 or 50 mm when the screen is too small to show 200; the label says which).
  3. Measure A and B with a ruler, end mark to end mark. Type both lengths into the phone in your unit and tap Confirm calibration. The sheet then reads Verified for this session. Enter what the ruler says even when it is nowhere near 200 mm: on first use the bars are drawn from a guess, and a 2 m throw makes them several times longer. The two readings should come out about equal; a pair that differs by more than a quarter, or a length outside 1 cm to 5 m, is refused as a wrong unit or the wrong thing measured.
  4. The pattern stays hidden until you do this, every time the screen connects. A saved scale only sizes the test shapes. A and B are scaled separately, so a projector that stretches one way is corrected.
  5. Re-check hides the pattern and brings the shapes back at the confirmed scale. Measure again; they should now read their nominal length. Projectors drift as they warm up, so check again after ten minutes.

Placing the pattern

  • The whole pattern is drawn. Centre on picks a piece and puts its origin point at the middle of the screen; Whole pattern is the default. The origin is the piece's anchor in the draft, not the middle of its outline.
  • Rotate 90° turns the view a quarter turn. Mirror flips it for a left-hand piece. The nudge pad moves it 5 cm at a time and Centre puts it back.
  • Show a test square (10 cm, or 4 in when the app is in inches) is the last check before cutting. Measure it across and down, then again after rotating or mirroring.

Built and read, not yet run on a real projector. See step 6 in Docs/USER_STEPS.md.

100 mm A B

Trust, measured

The accuracy dashboard

Every tape you take next to a camera value is a data point. Accuracy on the People screen opens the dashboard: three tabs, Human, Dress form and Synthetic, and on each, per measurement, how many pairs you have, the median error and the 90th percentile, and the trend by pipeline version. It opens on the first tab that has data.

How to feed it

  1. Scan a dress form (add it with the Dress form toggle). It cannot sway, so it is the cleanest measure of the sensor and the pipeline.
  2. Tape waist, seat, chest, waist-to-floor and inseam on the form and enter them with the Tape button on those rows.
  3. Do the same for a few people. Human pairs are the ones that matter; soft tissue and breathing are what the dress form cannot tell you.
  4. Watch the median per measurement. Anything consistently off in one direction is a bias the pipeline can be corrected for; a wide 90th percentile with a good median is a stillness or clothing problem on the day.

Reading it

Comparisons, People, SessionsThe summary counts every pair, the distinct people behind them and the distinct sets (sessions).
PairsHow many camera-versus-tape comparisons that key has, and from how many sets.
Not enough dataA key gets a pass or fail only with at least 5 pairs from at least 2 sets. Below that its card stays grey and says not enough data.
MedianTypical error. The camera target is 1 cm on lengths and 2 cm on circumferences.
p90The bad days. If it is far above the median, look at coverage and excluded frames on those scans.
By pipeline versionMedian length error per release of the pipeline that measured the camera values (recorded when the set was captured, not when it was taped). Lengths only; the shoulder slope is in degrees. It should fall as the pipeline improves; it also tells you which sets to re-check after an update.

The log is local to the phone and is never synced. It stores both values, the error band at the time, the key, whether the subject was a dress form, the app that logged the tape, and from the capture itself the pipeline version, device, recording, orbit coverage and whether the orbit was synthetic, so the same number can be compared later. Synthetic and fixture orbits test the pipeline, not the camera, and only ever show on their own tab. Comparisons logged before capture provenance was recorded are counted on no tab; a line under the tabs says how many there are.

Bodies are personal

Privacy and consent

On the phone, full stop

Depth frames, person masks, point clouds, measurements and patterns are processed and stored on the device. The app makes no network calls for any of it. There is no account and no analytics.

Recordings

Each scan is saved as a replayable recording (about 40 MB) under the app's own container. It stays there so a bad scan can be re-processed after a fix, and it is never uploaded or synced. Deleting a set deletes its recording; deleting a person deletes their sets, their tape comparisons in the validation log and every recording. The alert counts them first. A dress form is a person like any other. Comparisons left behind by deletes made before this release are not purged.

Consent first

Scanning anyone other than yourself requires the consent toggle on their profile. For a minor the prompt states that a parent or guardian is present. A dress form is the only profile without it.

Voice stays on the phone

Voice entry uses the phone's on-device speech recognizer only. If the phone has none, voice mode refuses to start and you type instead; speech is never sent to a server.

iCloud sync is not built

Sets do not sync between devices yet. Planned: people and sets sync through your private iCloud database, with recordings and the validation log staying local.

When something looks wrong

Troubleshooting

You seeWhat it meansDo this
LiDAR capture needs an iPhone ProNo scene-depth sensor on this device.Use typed or voice entry, or scan on a Pro and sync.
Record this person's consent before scanningConsent toggle is off.Open the profile, switch it on.
Coach keeps saying Hold stillThe subject sways over 1.5 cm; those frames are dropped.Feet hip-width, weight even, eyes on one point across the room. Re-scan.
Under 330° of the orbit was seenThe circle was not completed or the person was out of frame for part of it.Walk the full circle; keep the whole body in frame. Values from the unseen side carry wider bands.
Many frames excludedMovement, or the helper walked too fast.Slower, steadier. A ribbon at the waist and the A-pose help the levels.
Rings float in the airThe subject moved after Stop; rings stay where the body was and are not re-fitted.Re-scan, or save and tape the key values.
Check before savingThe orbit was under 330° or some values were inferred from a partial view.Tap Make it precise to tape them, or Save anyway to keep them flagged.
Pattern out of dateA redraft is running or failed, so the preview is old.Wait, or fix what the red banner says. Exports and the projector come back by themselves.
On-device speech recognition isn't availableNo offline speech model on this phone.Type the values.
No body surface was seen at that heightYou dragged a ring to a level with no points, such as between the legs or above the head.Drag it back inside the body; tap Reset if needed.
Waist ring on the ribs or hipsThe narrowest slice was not at the natural waist.Drag the waist label to the right level; the value re-slices. Tie a ribbon next time.
Face the phone for a few seconds first / Turn to your side and hold stillA self-scan is missing its front or side view.Redo it: 3 s facing, 3 s side-on, phone propped at waist height 2 m away.
Printed square measures wrongThe printer scaled the page.Reprint at 100 % / Actual size. Measure before taping pages.
Titan needs 2 more measurementsThe set lacks keys the design requires.Tap Add measurements and type them, or tape them in.
Projector square is not squareKeystone: the projector is not perpendicular to the surface.Square the projector up physically first, then calibrate.
Pattern will not appear on the projectorIt waits until A and B are measured and confirmed for this connection.Measure both bars, enter both lengths, tap Confirm calibration.

Testing without a body

On the simulator, and under More on the scan screen, two fixtures run the same pipeline as a real scan: Load synthetic orbit, a generated body with known perimeters, and Load fixture folder…, any recording copied off a phone. Scan a person, download the app container from Xcode ▸ Devices, and the folder Recordings/<id> replays on the Mac exactly as the phone saw it.

Good scan checklist

  • Tight single-colour clothes, hair up, no shoes
  • A-pose, feet hip-width, eyes forward
  • Phone level at chest height, 1.5–2 m
  • One slow even circle, ~25 s, stop at Done
  • Coverage 330°+, few excluded frames, points over 100k
  • Check waist and bust rings in AR before saving

Where the build stands · 17 October 2026

What is done, what is next

Honest state of each feature. "Verified" means tests and the simulator; the camera and AR paths have not yet run on a physical phone, so the first device scan is the milestone that matters most.

  • People, consent, typed and voice entry, units
    Verified on the simulator.
  • Drafting all 73 designs, tiled and large-format PDF, SVG, JSON share
    Verified; golden tests per design, PDF page geometry tested. Print-size check on a real printer still yours to do.
  • Orbit pipeline, validation log, accuracy dashboard
    Verified on synthetic bodies within 2 %. Real-body bias unknown until pairs are logged.
  • Live capture, coach, AR review, precise tape tier
    Built and compiling for device; flows verified on the simulator with synthetic scans. Needs a LiDAR phone.
  • Style options, projector mode, set import, editing a set, deletion rules, dashboard tabs
    Built and covered by tests and simulator flows. The projector needs a real external display and has not run on one.
  • Self-scan capture screen, iCloud sync, iPad layout
    Queued next. The self-scan estimator itself is written and tested; iCloud sync is not started.
  • Not built
    Re-anchoring rings when the subject steps away and back; tap-to-move landmarks; iCloud sync; the self-scan capture screen.

Your part

  1. Install on the phone and do the first scan (see Setup).
  2. Print page 1 of any tiled PDF on two printers and measure the squares.
  3. One dress-form orbit and three human orbits, each followed by taping waist, seat, chest, waist-to-floor and inseam. That fills the dashboard and calibrates the error bands.
  4. Projector: measure bars A and B, enter both, confirm the 10 cm check.
  5. Self-scan yourself once the screen lands and compare with a tape; the edge correction in the estimator is set from synthetic data and wants a real body.

The full list, with what to report back, is in Docs/USER_STEPS.md.