MonkeySpeak
- 9 Devlogs
- 13 Total hours
track how fast you can speak .. as that is going to be the new way of communicating with tech
track how fast you can speak .. as that is going to be the new way of communicating with tech
shipped two big surface reworks this week.
leaderboard got its own hub. rankings, filters, and personal stats live on one page now & ofc no more bouncing between /stats and a tiny home board. cleaner rows, mode/duration toggles, and your own numbers sitting under the global board.
post-test results got rebuilt from scratch. one shared results view: wpm, accuracy, consistency, streak, and the session graph, instead of the old packed panel. same screen whether you just finished a run or are peeking at what a good score looks like. ( graph mite be reworked on again but eh )
mic still moves when you’re talking. words still have to earn their place.
👻 something ghosty is next. that’s all you’re getting its really cool trust 👀👀
UPDATEE:: — stats, brave stt actually works, hydration fix
wss://monkeyspeak.onrender.com/...); chrome/firefox still use vercel bridgeutterance_end_ms=400 deepgram 400 spam (minimum is 1000 on live listen)routing by browser
browser path brave / edge websocket → render proxy → deepgram chrome / firefox (prod) same-originPOST /api/deepgram/live bridge on vercel
localhost
ws://localhost:8080 when backend is up, else bridge
🐜🪲🐞 that made it look dead
utterance_end_ms=400 — deepgram returns http 400 on live ws below 1000ms. was baked into client urls. clamped to 1000 everywhere (client, bridge, render backend, server.js){"type":"KeepAlive"} into the upload stream every 3s. deepgram got garbage bytes, transcripts stayed empty, no obvious error in uiother STT polish
BridgeReady before marking session ok[STT:deepgram] console spam from prod — debug only with NEXT_PUBLIC_DEBUG_STT=true
scale not eligible for reset warning fixed on momentum meter/stats dashboard — totals, streak, recent runs, wpm trend chartsstats-* / desk css so stats doesn’t look like a different applib/achievements.ts, lib/stats/streak.ts)GET /api/deepgram/proxy-health — same-origin render health check (browser never hits render directly, no cors scream)monkeyspeak-dg-proxy redeployed via render cliwhat actually happened on brave
fix was routing + stop lying via fallback. not more deepgram dashboard staring.
ok that was a lot of browser-specific nonsense for a monkey that just wants you to read words out loud 🐒🐒🍌
/api/leaderboard get + post)leaderboard rows used to live in zustand localStorage. ripped that out — supabase is source of truth now. name and emoji prefills still persist locally.
leaderboard_entries in supabase (migration in supabase/migrations/001_leaderboard_entries.sql)SUPABASE_SERVICE_ROLE_KEY
browser → GET/POST /api/leaderboard (vercel)
↓ service role
supabase postgres
render backend unchanged — still deepgram only, no db env vars there.
production deepgram mode probes whether the render proxy is alive before connecting. that probe used to be a cross origin fetch at https://monkeyspeak.onrender.com/ from the vercel app.
render cold starts and error pages often ship without cors headers even when express has origin: * — so chrome logged the whole blocked by cors policy thing and deepgram mode thought the proxy was dead.
fix: new same origin route GET /api/deepgram/proxy-health on vercel. server checks render, browser never touches render over http cors. also slapped explicit options handling on the render backend for anything that still hits it directly.
ok that was a lot of infra for a monkey with a crown svg but at least the board is real now. lmk in replies if you want the supabase dashboard walkthrough or the security fixes implemented properly.
095b731 and earlier speech routing work on main)the ui now shows errors for the provider that actually failed, not a generic “mic blocked” when stt died for other reasons.
var name ur wish websocket proxy over the vercel http bridgeutterance_end_ms locked to 1000 everywhere (deepgram rejects live ws with 400 below that)BridgeReady, not on first random chunkbackend/ express + ws proxy deployable on render (render.yaml included)
set up env with ur var name at vercel
redeployed frontend via vercel cli after env update
brave and edge block or mishandle the vercel http audio bridge (duplex fetch upload), so deepgram connections hung ~25s and never returned transcripts.
those browsers also cannot open an authenticated websocket straight to api.deepgram.com, so they need the render ws proxy (wss://…/api/deepgram/proxy) instead of the chrome-friendly paths.
even after the proxy worked, deepgram sent json in binary ws frames and the client ignored anything that was not a string, so words never updated until we parsed blob/arraybuffer payloads.
sorry if i yapped a lot and the fixes where actually slighly more techy stuff so i didnt wanna yap abt that as wel so yeah if u want to know lmk in replies :)
reworked the ui and got monkeyspeak ready for v0 ship launch :))
it’s basically monkeytype but for your voice — read a prompt out loud, get scored on speed + clarity.
features:
built with next.js, typescript, gsap, zustand.
repo: github.com/nothariharan/monkeyspeak
made the ui more clean still settling the latency here and there
current new approach i am building around is using the deepgram api key for initial purpose later trying to replicate what they do
open to questions or recommendations for the whole stt etc.
cooking up 🚀🔥
soon making it public just lots of latency issue in speaking to text conversion who knew it would be a pain but yeah let me know if u guys think of an alternative for it or anything at all
thanks for reading :)
going with a much better ui soon launching :) 🚀
for yall to try it
built the first iteration of the website !
got lots of customizing options now i am working more towards reducing the latency between what u speak and what is being transcribed
give me your opinions and recommendations :)