← All work
Case Study·Live (site) / launching (app)

Sitful

Calm, on-device macOS posture coach.

Visit sitful.com
Sitful — preview cardSitful — live site

The Problem

Posture apps are either creepy (cloud video) or naggy. I wanted a private, accurate coach that runs entirely on-device and respects focus — auto-pausing on calls and working even when minimized.

What I Built

A Tauri 2 app with a Rust core: AVCaptureSession → Apple Vision pose detection → Rust scoring, fused with AirPods head-motion via CoreMotion, SQLite storage, a live 0–100 posture score with adaptive nudges, and a signed, notarized, auto-updating .dmg. Plus a Next.js marketing site with live Stripe checkout and A/B-tested pricing.

Stack

Tauri 2RustReact 19TypeScriptApple VisionCoreMotionSQLiteNext.js 16Stripe

What it is

Sitful is a calm, fully on-device macOS posture coach at sitful.com. A live 0–100 posture score sits in the menu bar, nudges arrive only when a slouch persists, and no video ever leaves the machine.

Architecture

A Tauri 2 app with a Rust core: AVCaptureSession feeds Apple's Vision framework for pose detection, fused with AirPods head-motion via CoreMotion, scored in Rust, stored in SQLite (WAL). The app auto-pauses on video calls, keeps scoring while minimized, and ships as a signed, notarized, auto-updating .dmg. The marketing site is Next.js 16 with live Stripe checkout and A/B-tested pricing.

Why it is built this way

Posture apps fail through creepiness or nagging. On-device inference solves the first — there is no cloud video path at all — and persistence-gated nudging solves the second. Migrating from MediaPipe/Electron to Apple Vision/Tauri cut resource usage dramatically and removed the native-module packaging tax.

Outcomes

  • Fully on-device — no video ever leaves the machine
  • Native scoring continues while the window is minimized
  • Marketing site live on sitful.com with payments + analytics
  • App feature-complete, in code-signing / notarization
← PreviousThe World NowNext →staqd.ai

Last updated: 2026-07-28