LIVE ON-DEVICE • NO CLOUD • NO TRACKING

Pose
Perfect.
Every Shot.

PosePal overlays a reference pose on your live camera, scores your alignment 0–100% in real time, and auto-captures when you match. Fully offline. 260 curated poses.

Android 7+ • Camera2 721 tests • 0 warnings 6.8 MB pose data • 22 MB models
0
Curated poses
0
Landmarks / frame
0
Offline
P.01 — Hero • 12 col • masthead ink-aligned • folio 01/07

Measured on a mid-range 5G Android handset • 150ms pose • 200ms seg • parallax on move

● Tap score cards — they’re interactive drag ghost in demo ↓
0 poses
08 locations • lens-aware
130 back / 130 front. Single-person, simple portrait. 8 locations.
0%
Auto-capture threshold
Hold 1.5s → 3-2-1 → 3-frame burst. Sharpest wins.
~0ms
Compare vs all 260
Weighted 33-lm + 30% silhouette. LRU cached.
0 bytes
Sent to cloud
No backend. No accounts. Photos stay on device.

Interactive — Try it

Drag the ghost.
Watch the score.

This is the real comparator — 33 landmarks, weighted upper-body, silhouette blend. Drag the teal ghost to align with the dim live skeleton. Green = aligned. Hold 85% and it would auto-fire. Use arrow keys, +/- to scale, R to reset.

Live skeleton
33 live landmarks • dim
Reference ghost
Draggable • EMA 0.3
P.02 — Demo • canvas 288px (12×24) • keyboard a11y • folio 02/07
DRAG ME
● Live● Ghostdrag / pinch • arrows / R
CLOSE — keep adjusting
Lift left elbow 1° • Nudge ghost left
Auto would fire at
85% × 1.5s

01 — Features

The measuring layer
around the ghost.

A ghost outline tells you roughly where to stand. PosePal tells you how close you are: a live score, a full skeleton, per-joint colour, arrows, optional voice cues, and a shutter that fires itself once you hold the match.

Live 33-point detection — accurate, not lite

ML Kit PoseDetector in accurate mode. Confidence-filtered (≥0.5), One-Euro smoothed, adaptive throttle 150→500 ms via EMA latency + busy ratio. Pure-Dart headless tests for every engine.

Throttle
AdaptiveFrameThrottle • 150ms min • 400ms kicker at 30% busy
Filter
LandmarkConfidenceFilter • 0.5 gate • 5 lost frames → tracking lost
ML KitOne-Euro β 0.007AdaptiveHeadless tests

Real-time 0–100% score

Per-landmark green / amber / red. Body-part chips. 85% = green, 60% = amber. Weighted upper-body, silhouette blend 30%. One number tells you when you're there.

85 / 60 gatesSilhouette 30%

Directional arrows + optional voice

15° angular threshold. Up to 5 corrections, deduped, TTS throttled to 3s. “Lift left elbow 12°” — not “adjust pose”. Arrows are on by default; the voice coach ships off so nothing plays unexpectedly on first launch — switch it on in Settings.

Arrows (default on)Voice (opt-in)

Auto-capture burst

Hold ≥ threshold 1.5s → Countdown 3-2-1 → 3-frame burst (200ms). Laplacian + pose composite picks the sharpest, best-scored frame. Single-tap also works.

1.5s hold3× burstSharpest wins

Stylized silhouettes

Every pose has a studio PNG — outer outline + inner folds + skeleton. Drag, pinch, twist freely; double-tap to reset. Missing asset → contour fallback. The overlay ships off by default; enable the ghost in Settings.

PNG ghostDrag / pinch / twist

Scene-aware ghost — YOLOv8n + Hough + MobileNet in a worker isolate

Ghost auto-morphs onto your body or snaps to floor / wall / table anchors. “Matches your scene” strip re-ranks every 2 s.

YOLOv8nHoughMorph EMA 0.3
P.03 — Features • bento 8+4 + 4+4+4 • hover lift 200ms spring • folio 03/07

02 — How it works

Pick. Align. Score. Shot.

Four steps. No learning curve. The same pipeline runs on stills in the Image Test Lab before you go live.

Step 01

Pick a pose

Browse 260 poses by location, difficulty, lens. Tap a card — ghost loads. Scene strip suggests what fits your room.

Step 02

Align to ghost

Ghost contour letterboxes to your sensor. Drag / pinch / twist if you want it somewhere else.

Step 03

Chase 85%

Gauge climbs. Limbs go green. Arrows nudge you. Voice says the next fix. Hold it 1.5 s.

Step 04 — Auto

Countdown → Burst

3-2-1, flash, 3 frames at 200 ms. Sharpest + best-scored is saved. No shutter press needed.

NV21 → rotate → ML Kit Pose → confidence filter → PoseComparator → arrows / TTS → CameraBloc state machine seg isolate 200ms + scene-ml isolate 2s YOLO in parallel
P.04 — Flow • 4×3 cols • connector 960+ • folio 04/07

03 — Pose browser

260 poses. 8 locations.
One ghost for each.

Every pose ships with a bundled photo, 14–33 stored landmarks (mean 29), a 241–400 pt silhouette contour, scene/support metadata, and a stylized PNG ghost. Filters are instant (fade, not jump). Favorites sync to prefs. Lens flips clear mismatched poses.

LENS-AWARE
Back 130 • Front 130
Front cam for mirror selfies — only front-tagged poses appear.
Beach • MediumBeach pose reference
31 LMS • 400 PT

Back Female Beach 001

Back • Beach • Portrait

back_female_beach_001 • 3:4
Café • HardCafé pose reference
25 LMS • 400 PT

Back Female Cafe 001

Back • Café • Portrait

back_female_cafe_001 • 3:4
City • Easy
21 LMS • 400 PT

Back Female City 001

Back • City • Portrait

back_female_city_001 • 3:4
Lake • Medium
26 LMS • 378 PT

Back Female Lake 001

Back • Lake • Portrait

back_female_lake_001 • 3:4
Browse all on GitHub ↗
P.05 — Browser • filter chips 44px • card hover scale 1.04 • folio 05/07

04 — Scene aware

Ghost that knows
your room.

Cheap luma → palette + lighting + indoor likelihood. YOLOv8n (full COCO) every 2s. Hough floor/wall lines. Every 2s the recommender re-ranks all 260 against 7 signals and shows the top 3 “matches your scene”.

  • Contour morph — EMA 0.3 onto your body bbox when visible
  • Anchor morph — snaps to floor / wall / table when not
  • PlacementNet — learned full transform, EMA-smoothed
  • Manual freeze — drag/pinch survives until double-tap reset
YOLOv8n.tfliteMobileNet embedderSceneLayoutNetPlacementNet
Live scene descriptor
Floor Y0.82 Hough ✓
Wall X0.88 • 0.74 conf
Objectschair, cup, table
Lightingbright
Indoor0.34 • outdoor
✓ Matchedbeach_007 +2.0 palette
Gallery screen showing scene recommendations
Beach • 0.91 Café • 0.64

Left: descriptor memoised at 2 s cadence. Right: top-3 strip. EMA-smoothed — no jumps.

P.06 — Scene • YOLO 2s • Hough 0.82 • folio 06/07

05 — Comparison

What the ghost
leaves out.

Built with Huawei's AI Pose Recommendation (Pura 90 series, April 2026) as the reference point. That feature draws a pose outline over you in the viewfinder. PosePal keeps the ghost and adds the measurement layer around it.

● PosePal ◐ Huawei AI Pose Recommendation
CapabilityPosePalHuawei
Alignment score
0–100% real-time
0–100%
Per-limb + gauge
Not documented
No public score
Per-joint feedback✓ Green / amber / red per landmarkNot documented
Directional arrows✓ 15° gate, 5 suggestionsNot documented
Voice coach
optional
✓ TTS, 3s throttledNot documented
Auto-capture✓ 85% × 1.5s → burst 3Manual shutter
Pose overlay✓ Ghost, drag / scale / rotate✓ Outline over subject
Runs offline✓ 100% on-device✓ On-device

"Not documented" means we found no public statement either way — not that the capability is absent. Compiled from public reporting on Huawei's AI Pose Recommendation as of September 2026 (HarmonyOS 6.1, China release). We have not tested Huawei hardware, and availability varies by market and firmware.

Every PosePal threshold is tunable from one config file — score gate, hold time, burst, smoothing, weights.

06 — Engineering

On-device.
Isolated.
Measured.

No backend. No SDK phoning home. Two worker isolates. Pure-Dart math. 721 tests. Perfetto traces on triple-tap.

Flutter 3.12 • BLoC • get_it
Camera2 (pinned) • ML Kit Pose + Segmentation
tflite_flutter • YOLOv8n + MobileNetV3
Read architecture.md
P.07 — Eng • 150/200/500 ms • 2 isolates • folio 07/07
Pipeline
Main isolate
NV21 → rotateNv21 → PoseDetector (150–500 ms adaptive) → LandmarkFilter → uprightToPaint → PoseComparator → CameraBloc
Worker isolates
seg-mask ≥200 ms • scene-ml ≥200 ms frame / 2 s YOLO
Storage
Posesposes.json
Embeddingspose_embeddings.bin
PhotosappDocs/photos/*.jpg
SettingsSharedPrefs JSON
No Hive. No Isar. Just prefs + filesystem.
Performance budgets
150ms
pose min
200ms
seg min
500ms
adaptive max
Single-flight workers. Handshake-first startup. 5 s timeouts. Any worker failure → v1 fallback. Frame scheduler staggers seg / scene / luma phases.
One config file drives every tunable. 416 constants • 375 registry entries • zero magic numbers outside it.
app_config.dart

Trust

Tested on a real
phone, not a demo.

Run on a mid-range 5G Android handset through the full pipeline — live skeleton, comparator, auto-capture burst. No store gatekeeping, no account, no backend.

What testing changed

The first thing that made posing click on-device was feedback that says how to fix a pose, not just that it is wrong. Arrows for the adjustment, and a hold timer so you can stay in frame while it settles.

Note from the PosePal team — first-party device testing, not a customer review.

What testing settled

Being able to hand the phone to someone else with no setup was the deciding factor. Nothing to upload, no account to create — and the burst picker keeping the sharpest frame instead of the first one.

Note from the PosePal team — first-party device testing, not a customer review.

Build status
flutter analyze0 errors • 0 warnings
flutter test721 tests, all passing
APKdebug-signed build
Repositoryprivate — not published
CIActions • manual trigger

These are the numbers from the last local run, written here by hand — not a live CI feed. Production signing and a public release are still ahead.

07 — Get PosePal

Put a studio
in your pocket.

Free. Offline. No account. Build from source or grab the debug APK. Debug keystore today — production signing before store.

flutter build apk --debug 721 tests • analyze 0/0 Free for personal use
CLICK TO COPY LINK
github.com/vipulgote1999/PosePal
Android 7+ • API 24+ Camera2 • 50 MB cache
Privacy?
Photos never leave the device. No analytics SDK. ML Kit models download once via Play Services — that's the only network use.
iPhone?
Android only today. iOS shell exists, untested — no Mac yet.
Cost?
Free for personal use. No ads. No IAP. No backend to pay for — everything is on-device. Source is licensed, not sold; see the licence.
Contribute?
GitHub → dev branch. Read docs/architecture.md first. All constants in AppConfig.