Inspiration

Hack the Change asked: how can we leverage technology to promote health, social connection, and well-being in our communities?

We noticed that a lot of fitness tech is loud, small-type, and camera-to-cloud — while the people who might benefit most from gentle movement (including older adults) need the opposite: calm guidance, readable UI, privacy, and a reason to show up with others.

JointEffort is a play on words: joints (movement for your body) and a joint effort (people working together). Health at home, connection in the community — one product.

What it does

JointEffort is an accessible movement companion for Calgary / campus life:

  • Health: browse routines and follow an on-device camera coach with live form cues (“too high / too low”, “Good. X more.”)
  • Well-being: larger type, contrast, more-detail copy, and spoken coaching — calm by design
  • Social connection: map nearby programs and post/join buddy invites on an Activity Board

Accounts (Auth0) are optional for calendar and saved place. The coach and community browse work without login. This is not medical advice — stop if something hurts.

How we built it

Frontend: React + Vite + React Router, with accessibility controls (type size, high contrast, more-detail, read-aloud).

On-device pose: MediaPipe Pose Landmarker in the browser. Camera frames never leave the device. We compute joint angles locally and send metrics only to the server.

Backend: Express + SQLite. Curriculum and form/rep rules live in our own session/evaluate pipeline (curriculum.json + exercise rules). Example: an arm-raise step can require the shoulder angle $\theta$ to stay near a target $T$ within tolerance $\tau$ (e.g. $|\theta - T| \le \tau$) for a hold / rep count before advancing.

Gemini (Google): short coaching tips and TTS from numbers and text only — never video. Without an API key, rule-based feedback + browser speech still work.

Community: Leaflet / OpenStreetMap map, Calgary-oriented places/programs, Activity Board invites.

Auth: Auth0 Universal Login for optional accounts.

While building: we used Cursor as a coding assistant; product design, pose rules, curriculum, a11y, and community features are original team work (see our AI disclosure).

Challenges we ran into

  • Privacy vs. “AI coach” hype — we refused to upload video. Wiring Gemini to metrics-only tips/TTS took discipline so the product stayed original, not a chatbot wrapper.
  • Pose reliability in the wild — lighting, framing, and distance break naive rules. We added visibility checks (“step back”), smoothing, and short judge-friendly routines.
  • Coaching UX — stick demos, speech priority, and “I’m ready” flow had to feel calm, not spammy; TTS prompts had to send only the words to speak.
  • Auth0 local setup — callback URL mismatch when Vite jumped ports (e.g. 5173 vs 5174); allowed origins had to match the real origin.
  • Scope in 24 hours — shipping coach + a11y + community + Auth0 meant ruthless prioritization.

What we learned

  • On-device CV + thin server metrics is a strong pattern for health apps that people can trust.
  • Accessibility isn’t polish — for this audience it’s the product.
  • Naming and narrative matter: mapping clearly to health / social connection / well-being makes it land.
  • AI is most useful as a narrow layer (tips + voice) on top of deterministic rules you own.

What’s next

Richer curricula, better left/right form cues, real venue schedules, and deploy hardening (e.g. production Auth0 callbacks on our domain) so JointEffort can grow beyond the hackathon demo.

Built With

Share this project:

Updates

Submission history