MonkeySpeak
- 10 Devlogs
- 24 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
ok so real talk i kinda… forgot to drop a proper stardance log for a while. hours kept stacking, i kept shipping, then the banner said “u hav 10h without a log” and im like oh. whole catchup dump. big one. sorry if i yap
[ THE REASON FOR THIS WAS WAKATIME BTW it doesnt even properly update 🥀 sowwy i also lost like 1 more hr of time tho welp ]
last time i teased something ghosty then went quiet. that ghosty thing shipped. clarity got ripped open and rebuilt. da engine board actually filters now. results dont look half done anymore. so thats where most of the hours went into.
live: https://monkeyspeak-delta.vercel.app
repo: https://github.com/nothariharan/monkeyspeak
already shipped before this gap: spoken monkeytype core · deepgram on brave/edge · supabase speed board · /leaderboard hub + stats/profile · results rebuild. that thread is on the project page. this post is mainly everything after dat.
last log said “something ghosty is next” then i disappeared lmao. ghost trace is live.
u race a visual ghost that replays your own speed pb. not some random #1. just u vs past u. needs atleast one speed pb with a real timeline first.
built: ghost mode next to speed/clarity · desk ui so it doesnt feel like another product · dual lanes that feel like a chase · local ghost race record · lean assets
( check the branches and prs for exact stuff )
go race yourself. weirdly motivational and slightly insulting when past-u is faster 👀👀
used to be the quiet sibling of speed. same desk family, placeholder vibes. scrapbook treatment later — now its actually fun to sit on.
idle: 3-col scrapbook (engine board · center · side stack) · inspector monkey · legal pad prompt · privacy note that ur mic stays with the tool
prompts that CYCLE: shuffle was cursed — sentences always “before you leave…”, twisters one fixed line. now ~30 curated pads across sentences/technical/tongue-twisters, scenes (office/clinic/travel/etc), signal chips, no instant repeat, custom still works. whole point is “can the tool hear the hard bits”
engine board: config bar board prompt filters the left board. badge shows active filter.
results: not just % + grade anymore — engine chip, correct/wrong/missed/extra, punctuation %, delta vs prior best, normal display font
pruned ~31mb orphan assets · slimmed sprite utils · typecheck · SESSION_SECRET same on vercel AND render or unset on both (one side = grants break quietly) · readme/comments less corporate. deployed. hard-refresh if cached.
last time clarity = paste + grade + sticky prompt + soft lock. now scrapbook + shuffle pads + board filters + current/top/tool + cancel + results that explain stuff.
last time ghost = a wink. now u race past-u on the desk. so thats there.
harder clarity tiers · board rate limit if it gets silly · more ghost polish · daily clarity seed · kill leftover placeholder energy
ok that was a lot of catchup for a monkey that just wants u to read words out loud. if ghost or clarity feels off lmk — especially brave ppl, i see u 🐒🐒🍌
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 :)