Project guide

Project Guide | SteadyTap

Free habit-loop worksheet for accessibility-minded mobile routine design. This guide organizes the repository's original implementation notes for solo builders and wellness app prototypers.

Reviewed 2026-07-28. This page is derived from checked-in repository evidence and links back to its source.

SteadyTap

SteadyTap is an accessibility-aware touch-practice utility for iPhone and iPad. It calibrates tap and drag input, compares baseline and adaptive rounds, and keeps App Store release data on the device.

Distribution boundary

The release boundary is enforced in Core/DistributionPolicy.swift and checked by scripts/validate_app_store_readiness.py.

System Overview

An on-device practice app with a separate, developer-only backend sandbox.

AreaDetails
UsersPeople practicing touch precision and teams evaluating adaptive mobile interaction patterns.
Technical pathBuild the SwiftUI app, run the calibration flow, and inspect the release-policy validation.
System scopeSwiftUI app, local persistence, adaptive profile generation, and a debug-only FastAPI sandbox.
Operating boundaryApp Store builds remain local-only; debug API work uses synthetic or explicitly approved test data.
Evaluation pathRun the iOS Release build and automated App Store readiness checks before testing the optional backend.

Evaluation Path

Architecture Notes

Architecture

┌─────────────────────────────────────────────────────┐
│                   iOS App (Swift)                    │
│                                                     │
│  ┌──────────────┐  ┌───────────────┐  ┌──────────┐ │
│  │ Calibration   │  │ Practice      │  │ Results  │ │
│  │ Engine        │  │ (Baseline +   │  │ & Trends │ │
│  │ (tap/drag)    │  │  Adaptive)    │  │          │ │
│  └──────┬───────┘  └───────┬───────┘  └─────┬────┘ │
│         │                  │                │      │
│  ┌──────▼──────────────────▼────────────────▼────┐ │
│  │            AppViewModel (orchestrator)         │ │
│  │  - session history    - sync queue             │ │
│  │  - weekly goals       - streak tracking        │ │
│  └──────────────────────┬────────────────────────┘ │
│                         │                          │
│  ┌──────────────────────▼────────────────────────┐ │
│  │         BackendClient (protocol)              │ │
│  │  MockBackendClient  │  CloudBackendClient     │ │
│  └─────────────────────┼────────────────────────┘ │
│                        │ HTTP (when Cloud mode)    │
└────────────────────────┼───────────────────────────┘
                         │
                         ▼
┌─────────────────────────────────────────────────────┐
│              FastAPI Backend (Python)                │
│                                                     │
│  ┌─────────────┐  ┌──────────────┐  ┌────────────┐ │
│  │ /v1/sessions│  │ /v1/coach/   │  │ /v1/       │ │
│  │ (upload &   │  │   plan       │  │ benchmarks │ │
│  │  history)   │  │              │  │            │ │
│  └──────┬──────┘  └──────┬───────┘  └─────┬──────┘ │
│         │                │               │        │
│  ┌──────▼────────────────▼───────────────▼──────┐ │
│  │           service.py (business logic)         │ │
│  │  - coach plan generation                      │ │
│  │  - benchmark percentile calculation           │ │
│  │  - progress report assembly                   │ │
│  └──────────────────────┬───────────────────────┘ │
│                         │                          │
│  ┌──────────────────────▼────────────────────────┐ │
│  │         SQLite (sessions, aggregates)          │ │
│  └───────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘

Data flow: The App Store release runs calibration, practice, history, and suggestions locally. Debug builds can opt into the FastAPI sandbox, which stores synthetic or approved test summaries in SQLite and returns plan and benchmark fixtures.

Getting started

If this is your first time looking at the repo:

What's included

iOS App

  1. Run make generate-xcode-project.
  2. Open SteadyTap.xcodeproj in Xcode and select your Apple Developer team.
  3. Run on an iPhone or iPad, then archive the SteadyTap Release scheme.

Package.swift remains available for Swift tests and Swift Playgrounds. App Store builds use the generated native Xcode application target so CI can inspect the same .app bundle structure used by Xcode archives.

If you only need the mobile flow, you can ignore backend/ and site/.

Backend

Prerequisites: Python 3.11+

make verify-backend

If your default python3 is older than 3.11, run make BOOTSTRAP_PYTHON=/path/to/python3.11 verify-backend.

Run the server:

cd backend
.venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8080 --reload

Environment variables:

VariablePurposeDefault
STEADYTAP_API_KEYBearer token for protected endpoints(empty = open)
STEADYTAP_DB_PATHSQLite database file path./data/steadytap.sqlite
STEADYTAP_RUNTIME_STORE_PATHRuntime event log path./data/runtime-events.jsonl

Run tests and lint:

make verify-backend

User flow

  1. Tap calibration
  2. Drag calibration
  3. Calibration review
  4. Baseline challenge
  5. Adaptive challenge
  6. Before/after report

Key features

Backend API

Developer API mode

Developer API controls are compiled for debug workflows and hidden from Release users:

Recommended simulator URL: http://127.0.0.1:8080

If STEADYTAP_API_KEY is set on the backend, use the same bearer token only in a debug build. Never place it in source control.

Tests

Run current checks instead of relying on a recorded status:

make verify-app-store
./scripts/verify_cli.sh
make verify-backend

CI/CD

Repo layout

SteadyTap/
  Package.swift
  SteadyTapApp.swift
  RootView.swift
  Core/
  Views/
  Resources/
  app-store/
  backend/
    README.md
    app/
    tests/
    requirements.txt
    requirements-dev.txt
  site/
  docs/deployment/CLOUDFLARE_PAGES.md
  docs/product/DECISION_LOG.md

Main files

Cloud + AI Architecture

Enterprise Productization

System Architecture

Service Architecture

Search And Service Surface