bruno.exePROJECTScontact.exe
SPEECHMAX

</speechmax>

SPEECHMAX

Browser-based speech practice app, built by a team of four at a hackathon.

4

people on the team · one hackathon weekend

5

game-style drills

468 + 33

face and body landmarks tracked in the browser

SPECIFICATIONS

ROLETEAM PROJECT
DATEMar 2026
TYPEWEB APP
STATUSTEAM PROJECT · HACKATHON BUILD
STACKreact · typescript · mediapipe · web-speech-api · web-audio-api · gemini-2.5-flash · supabase · framer-motion +2 more
LINKSnone public
COURSE / TEAMTeam of four, one hackathon weekend, at UNIHACK 2026

Speech practice is dull and people drop off.

== WHAT IS THIS ==

SpeechMAX is a browser-based speech practice app built by a team of four at UNIHACK 2026, where it placed 5th of 183. It uses MediaPipe for eye contact and posture tracking, the Web Speech API for transcription and the Web Audio API for pitch analysis. Five game-style drills target the speaker's weakest areas. The analysis runs in the browser, so no audio or video leaves it.

demo video: full run-through
home: the five training modes
login: google oauth or anonymous guest mode
progress: personal bests and change since the last scan
filler ninja: the intro screen and rules
stage presence: the intro screen and rules
pace racer: keeping wpm in the target zone
scan result: the five-axis profile after a 30-second scan

== </the problem> ==

Speech practice is dull and people drop off. Many people are anxious about public speaking, professional coaching is expensive, and the existing tools are clinical and feel like homework rather than something to come back to.

== </the approach> ==

A Duolingo-style progression system with drills modelled on deliberate practice. Webcam analysis runs in real time, using MediaPipe for eye contact and posture, the Web Speech API for transcription, and the Web Audio API for pitch detection, so no audio or video leaves the browser. Five mini-games each isolate one weakness.

role & context

Team of four, one hackathon weekend, at UNIHACK 2026. Jaamaa owned the backend and infrastructure: the real-time analysis pipeline and the game UX. His three teammates covered the front end, the UI/UX and character design, and planning.

== </the story> ==

SpeechMAX is a browser-based speech practice app. It was built in March 2026 by a team of four at UNIHACK 2026, where it placed 5th of 183. It is one of three hackathon results Bruno Jaamaa lists: 1st at Melbourne Hack, 4th at FoundersHack and 5th of 183 at UNIHACK 2026.

The premise was that many people are anxious about speaking in public, that professional coaching is expensive, and that the existing practice tools feel clinical. The team set out to build a speech coach that anyone could open for free.

The app runs in the browser. The user opens it, grants camera and microphone access, and starts talking. It gives feedback on three signals: voice clarity (filler words, words per minute, pitch variation), eye contact (468 facial landmarks plus iris tracking through MediaPipe), and body language (posture alignment and fidget detection from 33 body keypoints).

A 30-second scan scores the speaker on five axes, and SpeechMAX then recommends mini-games for the weakest ones. Filler Ninja catches "ums" and "likes". Eye Lock trains sustained eye contact with the camera. Pace Racer keeps the speaking rate in a target zone. Pitch Surfer rewards vocal variety. Stage Presence coaches open body language and gestures.

Mike, an AI speech coach running on Gemini 2.5 Flash, reads the speaker's scores, game history and progress and gives short pieces of advice. Scores and history sync to Supabase, with Google sign-in or an anonymous guest mode.

Jaamaa owned the backend and infrastructure, which here means the real-time analysis pipeline and the game UX. His three teammates covered the front end, the UI/UX and character design, and planning. The project was not developed further after the event.

== </architecture> ==

The front end is React 19 with TypeScript (strict mode), Vite, and Tailwind CSS 4. State management uses Zustand 5 with localStorage persistence and Supabase sync. Framer Motion handles the animations.

The analysis pipeline runs on the client. MediaPipe FaceLandmarker (WASM, GPU-accelerated) tracks 468 facial landmarks for eye contact quality using a 3-signal fusion approach: iris position, head pose estimation, and gaze direction. MediaPipe PoseLandmarker tracks 33 body keypoints for posture alignment and fidget detection.

Audio processing runs through the Web Speech API for real-time transcription with noise suppression, through a DynamicsCompressorNode (threshold -40dB, 4:1 ratio), into an AnalyserNode for FFT pitch detection via autocorrelation. Filler word detection uses count-based pattern matching against a configurable dictionary.

The backend is Supabase: anonymous and Google OAuth authentication, PostgreSQL with RLS for the profiles, scan_results and game_results tables, and a gemini-proxy Edge Function that routes Gemini API calls through the server so the API key never touches the client.

== </key features> ==

Real-time webcam analysis

468 facial landmarks for eye contact tracking and 33 body keypoints for posture and fidget detection, all tracked in the browser.

Five game-style drills

Filler Ninja, Eye Lock, Pace Racer, Pitch Surfer, and Stage Presence. Each targets one weakness with progressive difficulty.

AI coaching with Mike

A coach running on Gemini 2.5 Flash that reads the speaker's scores and game history and gives short pieces of advice.

Radar scan scoring

30-second assessment scored across five axes.

== </key decisions> ==

DECISION 01

The most important decision was running all ML inference on the client. MediaPipe's WASM builds load about 4MB of models and run in a requestAnimationFrame loop with a 30 FPS target. This means no server cost for the compute-heavy parts, no video leaving the browser, and no network latency on the feedback loop. The tradeoff is browser compatibility: Chrome 90+ is required for the full experience.

DECISION 02

The game system was designed around research on deliberate practice (Ericsson, 2008). Each mini-game isolates one weakness and drills it with immediate feedback and progressive difficulty.

DECISION 03

Supabase over a custom backend was a speed decision for a hackathon build. Auth, database and edge functions in one platform meant the team could spend its time on the analysis pipeline and the game UX. The gemini-proxy pattern keeps the Gemini API key on the server while still allowing anonymous users to reach the AI coach.

DECISION 04

The radar chart scoring uses simple weighted formulas per axis. Each axis maps to a measurable signal: clarity is filler count plus consistency of pace, confidence is the share of time with eye contact, expression is the standard deviation of pitch, pacing is adherence to a target rate, and composure is posture plus fidget scores.

== </what was learned> ==

>

Balancing a fun game feel with real practice value means grounding the games in research on deliberate practice (Ericsson, 2008).

>

Building against a hackathon deadline forces ruthless prioritisation. The team cut features that felt important but were not essential to the core loop.

>

Client-side ML inference keeps audio and video on the device, which matters for something as personal as speech practice.

== </full stack> ==

react · typescript · mediapipe · web-speech-api · web-audio-api · gemini-2.5-flash · supabase · framer-motion · zustand · tailwind