|
9401
|
Battlebot? by @Rehaan | Stardance
|
Rehaan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Battlebot? by @Rehaan | Stardance
|
1792922050.9647644
|
1793786050.9647644
|
|
9402
|
Untitled project by @vivekdas00111 | Stardance
|
vivekdas00111
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @vivekdas00111 | Starda Title: Untitled project by @vivekdas00111 | Stardance...
|
1793271270.540259
|
1793876070.540259
|
|
9403
|
Ggs by @hussamburqan | Stardance
|
hussamburqan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Ggs by @hussamburqan | Stardance
|
1793415304.674151
|
1794020104.674151
|
|
9404
|
My awesome macropad! by @Wolfy1337 | Stardance
|
Wolfy1337
|
0
|
0.27
|
0
|
[]
|
[{"post_id": 3454, "ts": "2026 [{"post_id": 3454, "ts": "2026-06-06T12:15:36Z", "hours": 0.2739, "text": "Cyberdek"}]...
|
Title: My awesome macropad! by @Wolfy1337 | Starda Title: My awesome macropad! by @Wolfy1337 | Stardance
Devlogs:
Cyberdek...
|
1793454687.2011068
|
1794059487.2011068
|
|
9405
|
My first slack bot! by @AshutoshPola | Stardance
|
AshutoshPola
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @AshutoshPola | Star Title: My first slack bot! by @AshutoshPola | Stardance...
|
1792911274.9102738
|
1793775274.9102738
|
|
9406
|
MonkeySpeak by @hariharann | Stardance
|
hariharann
|
3
|
31.0
|
116
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-29T01:52:52Z", "hours": 14.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "small update few clean up in the github had to pause the databse yall went crazy on it", "repo": "https://github.com/nothariharan/monkeyspeak", "demo": "https://monkeyspeak-delta.vercel.app/"}, {"ship_num": 2, "ts": "2026-07-04T10:10:55Z", "hours": 12.0, "multiplier": 17.31, "payout": 63, "blessing": "neutral", "text": "monkeyspeak update is live 🙊 spoken monkeytype —> read prompts out loud, get scored on speed and clarity. v0 had the core loop. this ship adds the stuff that makes it feel like a real app. what’s new: leaderboard global board via supabase — nickname + emoji after a run, no signup home page 3-column layout with leaderboard, hero, and your personal best card your top score card still tracks local pb for the current duration, not whoever is #1 globally stats + profile /stats dashboard — streak, totals, recent runs, wpm charts, achievements profile hub drawer — activity heatmap, badges, lifetime stats everything uses the same minimal desk ui as home speech fixes try it: monkeyspeak-delta.vercel.app github.com/nothariharan/monkeyspeak", "repo": "https://github.com/nothariharan/monkeyspeak", "demo": "https://monkeyspeak-delta.vercel.app/"}, {"ship_num": 3, "ts": "2026-06-08T05:14:08Z", "hours": 5.0, "multiplier": 15.16, "payout": 53, "blessing": "neutral", "text": "monkeyspeak v0 is live 🙊 been building this for a while — it’s the spoken equivalent of monkeytype. you get a prompt, hit the mic, read it out loud, and the app tracks how fast and how accurately you speak. what’s in v0: speed mode pick 15s, 30s, 60s, or 120s live net wpm (filler words like “um” and “uh” get stripped) sentences, numbers, or paste your own custom text words dissolve on screen as you nail them monkey mascot animates based on your speaking momentum personal bests per duration + prompt type clarity mode type or paste what you said word-level diff against the original prompt grades from s down to “needs work” practice mode that rebuilds a prompt from words you missed ui refresh new landing hero: “how fast⚡can you speak 🙊” the monkey mascot IS the start button now — click it to begin speech-themed doodles, clean flat design, no gradient bloat sprite animations via gsap under the hood next.js 14 + typescript + zustand web speech api by default (no api key needed) optional deepgram integration with server-side proxy (key never hits the browser) silero vad for voice activity detection try it: clone the repo, npm install, npm run dev, allow mic access, go. github.com/nothariharan/monkeyspeak", "repo": "https://github.com/nothariharan/monkeyspeak", "demo": "https://monkeyspeak-delta.vercel.app/"}]...
|
[{"post_id": 84032, "ts": "202 [{"post_id": 84032, "ts": "2026-10-29T01:50:50Z", "hours": 1.1494, "text": "final log havent done much but we had few PRs in our repo so i set up proper ci/cd for people to do as well adn few feature requests which i updated too i had to pause the database but the website still works"}, {"post_id": 38169, "ts": "2026-07-31T12:59:08Z", "hours": 10.7647, "text": "CATCHUPPPP DEVLOG — i forgot to post so now u get EVERYTHING 🙊🗣️🗣️ 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 QUICK RECAP 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 . THE ‘GHOSTYYYY’ ( finally ) 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 👀👀 CLARITY GOT A WHOLE PERSONALITY NOW 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 HOUSEKEEPING ( fr) 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. before → after 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. STILL COOKING 🍽️ 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 🐒🐒🍌"}, {"post_id": 29280, "ts": "2026-07-16T02:57:57Z", "hours": 2.4197, "text": "da monkey upgradesss -> leaderboard + results 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 👀👀"}, {"post_id": 22028, "ts": "2026-07-04T08:41:44Z", "hours": 5.8111, "text": "UPDATEE:: — stats, brave stt actually works, hydration fix tl;dr deepgram stt works on brave now (and edge) — words dissolve, wpm moves, no more fake “google speech blocked” errors root cause: brave kills the vercel http audio bridge + we fell back to browser speech (which shields also blocks) fix: brave/edge → render websocket proxy ( wss://monkeyspeak.onrender.com/... ); chrome/firefox still use vercel bridge fixed utterance_end_ms=400 deepgram 400 spam (minimum is 1000 on live listen) fixed bridge sending keepalive json into the pcm stream (corrupted audio, empty transcripts) stats page + profile hub — streaks, achievements, session history, same minimal desk ui as home live: https://monkeyspeak-delta.vercel.app repo: https://github.com/nothariharan/monkeyspeak (commit might differ by the time u read — i keep pushing) CHANGES:: deepgram / stt (the painful part) routing by browser browser path brave / edge websocket → render proxy → deepgram chrome / firefox (prod) same-origin POST /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) keepalive in pcm body — http bridge was writing {\"type\":\"KeepAlive\"} into the upload stream every 3s. deepgram got garbage bytes, transcripts stayed empty, no obvious error in ui brave + duplex fetch — bridge connects, mic on, waveform moving, but ndjson response never streams back. zero words dissolved bad fallback — deepgram fail → auto webspeech → brave shields block google → ui says google is blocked even though user picked deepgram. now we don’t fallback on brave/edge when deepgram is preferred other STT polish bridge waits for BridgeReady before marking session ok server-side keepalive via deepgram sdk on the bridge route (not in pcm stream) removed verbose [STT:deepgram] console spam from prod — debug only with NEXT_PUBLIC_DEBUG_STT=true gsap scale not eligible for reset warning fixed on momentum meter stats + profile new /stats dashboard — totals, streak, recent runs, wpm trend charts profile hub drawer — nickname, activity heatmap, achievement badges shared stats-* / desk css so stats doesn’t look like a different app achievements + streak logic with unit tests ( lib/achievements.ts , lib/stats/streak.ts ) UI / polish home + results + settings aligned to same minimal desk style daily challenge card, error/not-found pages match the rest monkey favicon + readme/docs polish Infra GET /api/deepgram/proxy-health — same-origin render health check (browser never hits render directly, no cors scream) render monkeyspeak-dg-proxy redeployed via render cli what actually happened on brave user picks deepgram → app tries vercel http bridge brave never delivers streaming ndjson reliably fallback kicks webspeech → shields block google ui shows “brave shields may be blocking google’s speech service” — confusing af because user didn’t pick browser mode fix was routing + stop lying via fallback. not more deepgram dashboard staring. what’s next (maybe) GHOST RACE — new mode where u speak against ur pb (most wanted) signed run tokens so leaderboard posts tie to a finished test shared rate limit (redis/kv) if leaderboard spam shows up vendor ort wasm properly so vad worker stops whining in console ok that was a lot of browser-specific nonsense for a monkey that just wants you to read words out loud 🐒🐒🍌"}, {"post_id": 7929, "ts": "2026-06-13T07:00:10Z", "hours": 2.9903, "text": "monkeyspeak devlog more fixes (leaderboard + home + cors bug) - ship soon trust .. tl;dr home page is a 3 column layout now — leaderboard on the left, hero in the middle, top score on the right global leaderboard via supabase — nickname + emoji after a run, no signup, same board for everyone on the site personal bests still local — top score card shows your best for the duration, not whoever is #1 globally supabase wired on vercel with service role key server side only ( /api/leaderboard get + post) cors scream from chrome fixed — browser no longer fetches render root directly for proxy health checks what i changed home page layout the thing ig what it does hero leaderboard duration tabs synced with config bar, crown svg for top spots, emoji avatars, your row pinned at the bottom even if you are not top 5 leaderboard save prompt pops after a speed run — pick name + icon (defaulted to hehe 🐵), saves to supabase, remembers name locally for next time top score card personal best for current duration + prompt type only visual cleanup removed hero doodles, tightened title spacing, consolidated duplicate hero css leaderboard rows used to live in zustand localStorage. ripped that out — supabase is source of truth now. name and emoji prefills still persist locally. global leaderboard backend new table leaderboard_entries in supabase (migration in supabase/migrations/001_leaderboard_entries.sql ) rls enabled, no anon policies — all reads/writes through next.js with SUPABASE_SERVICE_ROLE_KEY upsert rule matches old local behavior: same name + duration + prompt type (case insensitive) only updates if wpm goes up light rate limit on post (~30s per ip) — good enough for hobby scale, not fortress grade browser → GET/POST /api/leaderboard (vercel) ↓ service role supabase postgres render backend unchanged — still deepgram only, no db env vars there. cors fix (chrome (ofc brave as well) was mad again) 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. what’s next (maybe) signed run tokens so leaderboard posts are tied to an actual finished test shared rate limit (redis/kv) if spam shows up delete the testmonkey row sitting on prod from smoke testing render keep alive still on the list from v0.1 preview env on vercel for prs 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."}, {"post_id": 6311, "ts": "2026-06-10T16:53:24Z", "hours": 2.9108, "text": "monkeyspeak final devlog before ship ( hopefully ) tl;dr so brave and edge broke everything ( ye read what broke for more info ) deepgram mode now transcribes live text again (words dissolve, wpm moves, momentum still reacts to your voice) brave and edge no longer hang for 25 seconds then fake a mic error production uses a render websocket proxy + vercel env, same path that worked locally github: nothariharan/monkeyspeak (commit 095b731 and earlier speech routing work on main ) live: monkeyspeak-delta.vercel.app what i changed speech routing (back to something that made sense) mode behavior browser web speech api only. no deepgram hijack on brave/edge mount. deepgram try deepgram first (proxy → bridge fallback on chrome only). if that fails, fall back to web speech with a clear error. the ui now shows errors for the provider that actually failed, not a generic “mic blocked” when stt died for other reasons. deepgram client hardening prefer var name ur wish websocket proxy over the vercel http bridge brave/edge without a reachable proxy: fail fast with a useful message (no 25s timeout) utterance_end_ms locked to 1000 everywhere (deepgram rejects live ws with 400 below that) bridge watchdog clears on BridgeReady , not on first random chunk server bridge waits for upstream deepgram before closing the socket the transcript fix (the big one) client parses deepgram json whether it arrives as a string , blob , or arraybuffer render proxy forwards deepgram replies as utf-8 text frames instead of opaque binary infra backend/ 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 small polish clearer vad fallback logs (worker load fail vs no voice detected vs timeout) config bar hint on brave/edge when browser mode is selected momentum sprites + gsap monkey states (from earlier in the sprint) what broke (and why it looked cursed) 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. what’s next (maybe) vendor ort wasm for vad so the worker stops complaining gsap scale split for clean console render keep-alive or paid instance if cold starts hurt demos preview env on vercel for pr deployments (production is wired today) 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 :)"}, {"post_id": 4727, "ts": "2026-06-08T05:13:13Z", "hours": 0.6281, "text": "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: speed mode: timed speaking tests (15s / 30s / 60s / 120s) with live wpm + word accuracy clarity mode: paste your transcript, get a word-by-word diff + letter grade click the monkey mascot to start (no separate mic button anymore lol) animated monkey companion that reacts to your speaking energy mid-test words dissolve on screen as you say them correctly personal bests saved locally browser speech api works out of the box, optional deepgram for better stt themes, accent colors, custom fonts keyboard shortcuts (enter to start, tab to reset, escape to stop) built with next.js, typescript, gsap, zustand. repo: github.com/nothariharan/monkeyspeak"}, {"post_id": 4678, "ts": "2026-06-08T02:28:55Z", "hours": 0.2814, "text": "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."}, {"post_id": 4242, "ts": "2026-06-07T14:13:09Z", "hours": 0.8106, "text": "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 :)"}, {"post_id": 4007, "ts": "2026-06-07T04:46:44Z", "hours": 2.0164, "text": "going with a much better ui soon launching :) 🚀 for yall to try it"}, {"post_id": 3451, "ts": "2026-06-06T12:11:33Z", "hours": 0.9194, "text": "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 :)"}]...
|
Title: MonkeySpeak by @hariharann | Stardance
Dev Title: MonkeySpeak by @hariharann | Stardance
Devlogs:
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 :)
going with a much better ui soon launching :) 🚀 for yall to try it
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 :)
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.
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: speed mode: timed speaking tests (15s / 30s / 60s / 120s) with live wpm + word accuracy clarity mode: paste your transcript, get a word-by-word diff + letter grade click the monkey mascot to start (no separate mic button anymore lol) animated monkey companion that reacts to your speaking energy mid-test words dissolve on screen as you say them correctly personal bests saved locally browser speech api works out of the box, optional deepgram for better stt themes, accent colors, custom fonts keyboard shortcuts (enter to start, tab to reset, escape to stop) built with next.js, typescript, gsap, zustand. repo: github.com/nothariharan/monkeyspeak
monkeyspeak final devlog before ship ( hopefully ) tl;dr so brave and edge broke everything ( ye read what broke for more info ) deepgram mode now transcribes live text again (words dissolve, wpm moves, momentum still reacts to your voice) brave and edge no longer hang for 25 seconds then fake a mic error production uses a render websocket proxy + vercel env, same path that worked locally github: nothariharan/monkeyspeak (commit 095b731 and earlier speech routing work on main ) live: monkeyspeak-delta.vercel.app what i changed speech routing (back to something that made sense) mode behavior browser web speech api only. no deepgram hijack on brave/edge mount. deepgram try deepgram first (proxy → bridge fallback on chrome only). if that fails, fall back to web speech with a clear error. the ui now shows errors for the provider that actually failed, not a generic “mic blocked” when stt died for other reasons. deepgram client hardening prefer var name ur wish websocket proxy over the vercel http bridge brave/edge without a reachable proxy: fail fast with a useful message (no 25s timeout) utterance_end_ms locked to 1000 everywhere (deepgram rejects live ws with 400 below that) bridge watchdog clears on BridgeReady , not on first random chunk server bridge waits for upstream deepgram before closing the socket the transcript fix (the big one) client parses deepgram json whether it arrives as a string , blob , or arraybuffer render proxy forwards deepgram replies as utf-8 text frames instead of opaque binary infra backend/ 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 small polish clearer vad fallback logs (worker load fail vs no voice detected vs timeout) config bar hint on brave/edge when browser mode is selected momentum sprites + gsap monkey states (from earlier in the sprint) what broke (and why it looked cursed) 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. what’s next (maybe) vendor ort wasm for vad so the worker stops complaining gsap scale split for clean console render keep-alive or paid instance if cold starts hurt demos preview env on vercel for pr deployments (production is wired today) 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 :)
monkeyspeak devlog more fixes (leaderboard + home + cors bug) - ship soon trust .. tl;dr home page is a 3 column layout now — leaderboard on the left, hero in the middle, top score on the right global leaderboard via supabase — nickname + emoji after a run, no signup, same board for everyone on the site personal bests still local — top score card shows your best for the duration, not whoever is #1 globally supabase wired on vercel with service role key server side only ( /api/leaderboard get + post) cors scream from chrome fixed — browser no longer fetches render root directly for proxy health checks what i changed home page layout the thing ig what it does hero leaderboard duration tabs synced with config bar, crown svg for top spots, emoji avatars, your row pinned at the bottom even if you are not top 5 leaderboard save prompt pops after a speed run — pick name + icon (defaulted to hehe 🐵), saves to supabase, remembers name locally for next time top score card personal best for current duration + prompt type only visual cleanup removed hero doodles, tightened title spacing, consolidated duplicate hero css leaderboard rows used to live in zustand localStorage. ripped that out — supabase is source of truth now. name and emoji prefills still persist locally. global leaderboard backend new table leaderboard_entries in supabase (migration in supabase/migrations/001_leaderboard_entries.sql ) rls enabled, no anon policies — all reads/writes through next.js with SUPABASE_SERVICE_ROLE_KEY upsert rule matches old local behavior: same name + duration + prompt type (case insensitive) only updates if wpm goes up light rate limit on post (~30s per ip) — good enough for hobby scale, not fortress grade browser → GET/POST /api/leaderboard (vercel) ↓ service role supabase postgres render backend unchanged — still deepgram only, no db env vars there. cors fix (chrome (ofc brave as well) was mad again) 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. what’s next (maybe) signed run tokens so leaderboard posts are tied to an actual finished test shared rate limit (redis/kv) if spam shows up delete the testmonkey row sitting on prod from smoke testing render keep alive still on the list from v0.1 preview env on vercel for prs 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.
UPDATEE:: — stats, brave stt actually works, hydration fix tl;dr deepgram stt works on brave now (and edge) — words dissolve, wpm moves, no more fake “google speech blocked” errors root cause: brave kills the vercel http audio bridge + we fell back to browser speech (which shields also blocks) fix: brave/edge → render websocket proxy ( wss://monkeyspeak.onrender.com/... ); chrome/firefox still use vercel bridge fixed utterance_end_ms=400 deepgram 400 spam (minimum is 1000 on live listen) fixed bridge sending keepalive json into the pcm stream (corrupted audio, empty transcripts) stats page + profile hub — streaks, achievements, session history, same minimal desk ui as home live: https://monkeyspeak-delta.vercel.app repo: https://github.com/nothariharan/monkeyspeak (commit might differ by the time u read — i keep pushing) CHANGES:: deepgram / stt (the painful part) routing by browser browser path brave / edge websocket → render proxy → deepgram chrome / firefox (prod) same-origin POST /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) keepalive in pcm body — http bridge was writing {"type":"KeepAlive"} into the upload stream every 3s. deepgram got garbage bytes, transcripts stayed empty, no obvious error in ui brave + duplex fetch — bridge connects, mic on, waveform moving, but ndjson response never streams back. zero words dissolved bad fallback — deepgram fail → auto webspeech → brave shields block google → ui says google is blocked even though user picked deepgram. now we don’t fallback on brave/edge when deepgram is preferred other STT polish bridge waits for BridgeReady before marking session ok server-side keepalive via deepgram sdk on the bridge route (not in pcm stream) removed verbose [STT:deepgram] console spam from prod — debug only with NEXT_PUBLIC_DEBUG_STT=true gsap scale not eligible for reset warning fixed on momentum meter stats + profile new /stats dashboard — totals, streak, recent runs, wpm trend charts profile hub drawer — nickname, activity heatmap, achievement badges shared stats-* / desk css so stats doesn’t look like a different app achievements + streak logic with unit tests ( lib/achievements.ts , lib/stats/streak.ts ) UI / polish home + results + settings aligned to same minimal desk style daily challenge card, error/not-found pages match the rest monkey favicon + readme/docs polish Infra GET /api/deepgram/proxy-health — same-origin render health check (browser never hits render directly, no cors scream) render monkeyspeak-dg-proxy redeployed via render cli what actually happened on brave user picks deepgram → app tries vercel http bridge brave never delivers streaming ndjson reliably fallback kicks webspeech → shields block google ui shows “brave shields may be blocking google’s speech service” — confusing af because user didn’t pick browser mode fix was routing + stop lying via fallback. not more deepgram dashboard staring. what’s next (maybe) GHOST RACE — new mode where u speak against ur pb (most wanted) signed run tokens so leaderboard posts tie to a finished test shared rate limit (redis/kv) if leaderboard spam shows up vendor ort wasm properly so vad worker stops whining in console ok that was a lot of browser-specific nonsense for a monkey that just wants you to read words out loud 🐒🐒🍌
da monkey upgradesss -> leaderboard + results 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 👀👀
CATCHUPPPP DEVLOG — i forgot to post so now u get EVERYTHING 🙊🗣️🗣️ 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 QUICK RECAP 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 . THE ‘GHOSTYYYY’ ( finally ) 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 👀👀 CLARITY GOT A WHOLE PERSONALITY NOW 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 HOUSEKEEPING ( fr) 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. before → after 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. STILL COOKING 🍽️ 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 🐒🐒🍌
final log havent done much but we had few PRs in our repo so i set up proper ci/cd for people to do as well adn few feature requests which i updated too i had to pause the database but the website still works
Ships:
monkeyspeak v0 is live 🙊 been building this for a while — it’s the spoken equivalent of monkeytype. you get a prompt, hit the mic, read it out loud, and the app tracks how fast and how accurately you speak. what’s in v0: speed mode pick 15s, 30s, 60s, or 120s live net wpm (filler words like “um” and “uh” get stripped) sentences, numbers, or paste your own custom text words dissolve on screen as you nail them monkey mascot animates based on your speaking momentum personal bests per duration + prompt type clarity mode type or paste what you said word-level diff against the original prompt grades from s down to “needs work” practice mode that rebuilds a prompt from words you missed ui refresh new landing hero: “how fast⚡can you speak 🙊” the monkey mascot IS the start button now — click it to begin speech-themed doodles, clean flat design, no gradient bloat sprite animations via gsap under the hood next.js 14 + typescript + zustand web speech api by default (no api key needed) optional deepgram integration with server-side proxy (key never hits the browser) silero vad for voice activity detection try it: clone the repo, npm install, npm run dev, allow mic access, go. github.com/nothariharan/monkeyspeak
monkeyspeak update is live 🙊 spoken monkeytype —> read prompts out loud, get scored on speed and clarity. v0 had the core loop. this ship adds the stuff that makes it feel like a real app. what’s new: leaderboard global board via supabase — nickname + emoji after a run, no signup home page 3-column layout with leaderboard, hero, and your personal best card your top score card still tracks local pb for the current duration, not whoever is #1 globally stats + profile /stats dashboard — streak, totals, recent runs, wpm charts, achievements profile hub drawer — activity heatmap, badges, lifetime stats everything uses the same minimal desk ui as home speech fixes try it: monkeyspeak-delta.vercel.app github.com/nothariharan/monkeyspeak
small update few clean up in the github had to pause the databse yall went crazy on it...
|
1793260141.7149446
|
1793346541.7149446
|
|
9407
|
Untitled project by @Smattle | Stardance
|
Smattle
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Smattle | Stardance
|
1792778054.331034
|
1793382854.331034
|
|
9408
|
Untitled by @nishkashetty04 | Stardance
|
nishkashetty04
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @nishkashetty04 | Stardance
|
1793332259.142324
|
1793937059.142324
|
|
9409
|
V01d Helper Bot by @V01d_404 | Stardance
|
V01d_404
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: V01d Helper Bot by @V01d_404 | Stardance
|
1793332524.053227
|
1793937324.053227
|
|
9410
|
Salt by @leviryanfairchild | Stardance
|
leviryanfairchild
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Salt by @leviryanfairchild | Stardance
|
1793188261.4510202
|
1793793061.4510202
|
|
9411
|
Rag agent by @rajveerkharade30 | Stardance
|
rajveerkharade30
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Rag agent by @rajveerkharade30 | Stardance
|
1793145286.654138
|
1793750086.654138
|
|
9412
|
My awesome macropad! by @Ify201 | Stardance
|
Ify201
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Ify201 | Stardance
|
1793443736.0428038
|
1794048536.0428038
|
|
9413
|
My awesome macropad! by @yakhmi101 | Stardance
|
yakhmi101
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @yakhmi101 | Starda Title: My awesome macropad! by @yakhmi101 | Stardance...
|
1792799470.638812
|
1793404270.638812
|
|
9414
|
My awesome macropad! by @Hrishikesh | Stardance
|
Hrishikesh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Hrishikesh | Stard Title: My awesome macropad! by @Hrishikesh | Stardance...
|
1793235301.842891
|
1793840101.842891
|
|
9415
|
Effective Studying by @umi | Stardance
|
umi
|
0
|
0.25
|
0
|
[]
|
[{"post_id": 3352, "ts": "2026 [{"post_id": 3352, "ts": "2026-06-06T07:33:28Z", "hours": 0.25, "text": "I created a project"}]...
|
Title: Effective Studying by @umi | Stardance
Dev Title: Effective Studying by @umi | Stardance
Devlogs:
I created a project...
|
1793285776.880235
|
1793890576.880235
|
|
9416
|
My awesome macropad! by @jerem | Stardance
|
jerem
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @jerem | Stardance
|
1793292794.8034444
|
1793897594.8034444
|
|
9417
|
My awesome macropad! by @Hernawan | Stardance
|
Hernawan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Hernawan | Stardan Title: My awesome macropad! by @Hernawan | Stardance...
|
1793404341.66903
|
1794009141.66903
|
|
9418
|
My first slack bot! by @jerem | Stardance
|
jerem
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @jerem | Stardance
|
1793433212.5729084
|
1794038012.5729084
|
|
9419
|
My awesome macropad! by @Adelowo | Stardance
|
Adelowo
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Adelowo | Stardanc Title: My awesome macropad! by @Adelowo | Stardance...
|
1793202864.888838
|
1793807664.888838
|
|
9420
|
judger by @ahren | Stardance
|
ahren
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: judger by @ahren | Stardance
|
1793181270.3057227
|
1793786070.3057227
|
|
9421
|
FinLLM by @omkarlovesf1 | Stardance
|
omkarlovesf1
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: FinLLM by @omkarlovesf1 | Stardance
|
1793455066.7150152
|
1794059866.7150152
|
|
9422
|
Tea by @kumlop | Stardance
|
kumlop
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Tea by @kumlop | Stardance
|
1792752822.3459706
|
1793357622.3459706
|
|
9423
|
Untitled project by @Sam_81 | Stardance
|
Sam_81
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Sam_81 | Stardance
|
1793213659.4265416
|
1793818459.4265416
|
|
9424
|
My awesome macropad! by @tanakornsss | Stardance
|
tanakornsss
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @tanakornsss | Star Title: My awesome macropad! by @tanakornsss | Stardance...
|
1793155874.5694253
|
1793760674.5694253
|
|
9425
|
arai intelligence by @arthurab | Stardance
|
arthurab
|
0
|
0.37
|
0
|
[]
|
[{"post_id": 3422, "ts": "2026 [{"post_id": 3422, "ts": "2026-06-06T11:06:41Z", "hours": 0.3742, "text": "Starting V3 planning!"}]...
|
Title: arai intelligence by @arthurab | Stardance
Title: arai intelligence by @arthurab | Stardance
Devlogs:
Starting V3 planning!...
|
1792796038.7336612
|
1793400838.7336612
|
|
9426
|
Untitled project by @adopsifyllc | Stardance
|
adopsifyllc
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @adopsifyllc | Stardanc Title: Untitled project by @adopsifyllc | Stardance...
|
1792774077.65331
|
1793378877.65331
|
|
9427
|
My first slack bot! by @Sam_81 | Stardance
|
Sam_81
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Sam_81 | Stardance
|
1792799473.2373257
|
1793404273.2373257
|
|
9428
|
My first slack bot! by @MatejBaks | Stardance
|
MatejBaks
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @MatejBaks | Stardan Title: My first slack bot! by @MatejBaks | Stardance...
|
1793461788.6974978
|
1794066588.6974978
|
|
9429
|
My awesome macropad! by @suzyqcable | Stardance
|
suzyqcable
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @suzyqcable | Stard Title: My awesome macropad! by @suzyqcable | Stardance...
|
1793411423.6290174
|
1794016223.6290174
|
|
9430
|
HTML5 Game by @muhammad_shoaib_mern | Stardance
|
muhammad_shoaib_mern
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: HTML5 Game by @muhammad_shoaib_mern | Stard Title: HTML5 Game by @muhammad_shoaib_mern | Stardance...
|
1792788835.8496544
|
1793393635.8496544
|
|
9431
|
My awesome macropad! by @sambria | Stardance
|
sambria
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @sambria | Stardanc Title: My awesome macropad! by @sambria | Stardance...
|
1792749030.6476688
|
1793353830.6476688
|
|
9432
|
Homomorphic Voting System by @NL70 | Stardance
|
NL70
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Homomorphic Voting System by @NL70 | Starda Title: Homomorphic Voting System by @NL70 | Stardance...
|
1792745464.93273
|
1793350264.93273
|
|
9433
|
Untitled project by @jatinkevlani | Stardance
|
jatinkevlani
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @jatinkevlani | Stardan Title: Untitled project by @jatinkevlani | Stardance...
|
1792796079.3793883
|
1793400879.3793883
|
|
9434
|
Catty images by @celebrimbor_the_allerechte | Star Catty images by @celebrimbor_the_allerechte | Stardance...
|
celebrimbor_the_allerechte
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Catty images by @celebrimbor_the_allerechte Title: Catty images by @celebrimbor_the_allerechte | Stardance...
|
1792792269.9401972
|
1793397069.9401972
|
|
9435
|
My awesome macropad! by @rui2010 | Stardance
|
rui2010
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @rui2010 | Stardanc Title: My awesome macropad! by @rui2010 | Stardance...
|
1792788450.0341146
|
1793393250.0341146
|
|
9436
|
My awesome macropad! by @celebrimbor_the_allerecht My awesome macropad! by @celebrimbor_the_allerechte | Stardance...
|
celebrimbor_the_allerechte
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @celebrimbor_the_al Title: My awesome macropad! by @celebrimbor_the_allerechte | Stardance...
|
1793224558.678368
|
1793829358.678368
|
|
9437
|
Amplify by @joelynx | Stardance
|
joelynx
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Amplify by @joelynx | Stardance
|
1793299732.9856906
|
1793904532.9856906
|
|
9438
|
My first slack bot! by @aqeshta1999 | Stardance
|
aqeshta1999
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @aqeshta1999 | Stard Title: My first slack bot! by @aqeshta1999 | Stardance...
|
1792781497.178944
|
1793386297.178944
|
|
9439
|
Zephyr MK.1 by @OpenAeroLab | Stardance
|
OpenAeroLab
|
0
|
1.81
|
0
|
[]
|
[{"post_id": 7679, "ts": "2026 [{"post_id": 7679, "ts": "2026-06-12T20:35:21Z", "hours": 1.8136, "text": "Hi, I’m Maxime. I’m from Belgium and study engineering in high school. This is my first ever devlog, so I want to introduce the Zephyr MK.1. I chose this name because Zephyrus is the ancient Greek personification of the west wind. I started this project some time ago and work on it sporadically, with the goal of completing it during the summer holidays. My goal for this project is to build an RC plane from scratch (with some inspiration from Instructables, of course). I am currently using SolidWorks to model my airplane, and the photo below shows the assembly I have thus far."}]...
|
Title: Zephyr MK.1 by @OpenAeroLab | Stardance
De Title: Zephyr MK.1 by @OpenAeroLab | Stardance
Devlogs:
Hi, I’m Maxime. I’m from Belgium and study engineering in high school. This is my first ever devlog, so I want to introduce the Zephyr MK.1. I chose this name because Zephyrus is the ancient Greek personification of the west wind. I started this project some time ago and work on it sporadically, with the goal of completing it during the summer holidays. My goal for this project is to build an RC plane from scratch (with some inspiration from Instructables, of course). I am currently using SolidWorks to model my airplane, and the photo below shows the assembly I have thus far....
|
1793335682.5761487
|
1793940482.5761487
|
|
9440
|
Server for Secure Messenger by @synxrhyme | Starda Server for Secure Messenger by @synxrhyme | Stardance...
|
synxrhyme
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Server for Secure Messenger by @synxrhyme | Title: Server for Secure Messenger by @synxrhyme | Stardance...
|
1793342924.7051418
|
1793947724.7051418
|
|
9441
|
NoK Backend Framework by @LionPa | Stardance
|
LionPa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: NoK Backend Framework by @LionPa | Stardanc Title: NoK Backend Framework by @LionPa | Stardance...
|
1793285288.7005913
|
1793890088.7005913
|
|
9442
|
ZH-AI-MatRX by @hanzs | Stardance
|
hanzs
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: ZH-AI-MatRX by @hanzs | Stardance
|
1792929281.4521585
|
1793793281.4521585
|
|
9443
|
Better Music by @muntean_andrew | Stardance
|
muntean_andrew
|
2
|
33.0
|
323
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T09:14:00Z", "hours": 20.0, "multiplier": 8.54, "payout": 202, "blessing": "neutral", "text": "I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, can read synced/unsynced lyrics tags from the music files and show them like Spotify, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette and even the base border radius to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. This is just an update and the majority of the time spent on the project was used to make improvements in the backend management of the song objects and to make the UI better reflect and update according to the data in the backend. But also I’ve added lyrics support and if your music files have lyrics tags embedded in them the app will take full advantage of them by enabling you to see each verse when it is singed and also skip to that one part you like the most just by clicking on your favorite line in the track. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now.", "repo": "https://github.com/AliendsOG/Better-Music", "demo": "https://github.com/AliendsOG/Better-Music/releases/tag/better-music"}, {"ship_num": 2, "ts": "2026-06-15T15:17:37Z", "hours": 13.0, "multiplier": 9.67, "payout": 121, "blessing": "neutral", "text": "I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. The challenging part was the steep learning curve as I hadn’t done anything on this scale before. I had to learn to connect the 2 Electron processes together seamlessly. Furthermore I had to dive into the world of databases with SQLite 3, which was uncharted territory for me. I had to use AI to help me learn these things and also to brainstorm ideas about hoe to optimize the app. For instance, when the idea of the search-as-you-type feature came up to me I envisioned a kind of tree structure with letters and that for every song, album, playlist name the app would create the branches in the tree so it would be a very fast and efficient search algorithm, and when I talked to the AI about it I found out that this kind of structure is called a trie. I am really proud that I’ve managed to build a clean, responsive and fast music player that tracks the user’s listening activity and stores it on device. Also it was very exciting when I tested the search feature and it worked perfectly. I’m also proud of the engineering journey itself. I utilized Gemini as an active learning collaborator to help me unpack the architectural patterns of Electron and master data persistence with SQLite 3. Turning that complex technical guidance into a functional, polished desktop product was incredibly rewarding. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now.", "repo": "https://github.com/AliendsOG/Better-Music", "demo": "https://github.com/AliendsOG/Better-Music/releases/tag/better-music"}]...
|
[{"post_id": 74382, "ts": "202 [{"post_id": 74382, "ts": "2026-09-27T09:04:01Z", "hours": 1.0467, "text": "This is the last devlog before shipping the project update. This has been an exciting journey and I am very satisfied with the result! I do wish there would be a bit more time left for the event to continue so I could ship even more things but all good things must come to an end, and this one is a happy ending. I’ve made the necessary last minute touches to make sure that everything works as it should."}, {"post_id": 74114, "ts": "2026-09-26T18:26:03Z", "hours": 1.6697, "text": "Added new ways to customize the player to the user’s liking and fixed that prevented the app from reading the user_version of the database which in return made the app “update” the DB everytime it started."}, {"post_id": 73281, "ts": "2026-09-24T18:58:58Z", "hours": 0.4853, "text": "YEEEEEESS, FINALLLYYYYYY, we have synced lyrics in the app. I know it’s not the most glamorous UI at the moment, but it is still something, and the other music players don’t even do this, like at most they show the lyrics with the timestamps and that’s it, no scaling of the verse, nothing. In future updates certainly I’ll make the UI more polished because it need a lot of it. Still I am happy that I’ve made it this far and after a bit of clean up and maybe some optimizations I’ll ship the project."}, {"post_id": 73261, "ts": "2026-09-24T18:10:26Z", "hours": 1.5067, "text": "I’ve finally found the culprit that prevented me from getting the synced lyrics, now the app can read the synced lyrics from music filed. YEEEEEEE Now the “only” thing is to make the UI for them, which I hope would be easy and fast. 😅"}, {"post_id": 73191, "ts": "2026-09-24T15:40:21Z", "hours": 2.4517, "text": "Trying to add lyrics to the app. But it is a bit of a mess cause in the Samsung Music and Apple Music apps these files contain time stamps for each verse and so I was thinking to read those time stamps and to highlight the verse that is played at that time, but my app doesn’t read those things and I don’t know why. An explanation might be that those apps ping free open source databases of lyrics based on the song details, but I am not really sure."}, {"post_id": 69252, "ts": "2026-09-16T17:55:55Z", "hours": 4.7486, "text": "Another day, another restructuring I guess. 😅 I’ve decided to give each album an id instead of relying on it’s name as the identifier as I did previously. Also I’ve changed the Play function to work with song ids and album ids instead of names. This is because if the name of the song or the album had any of these 2 characters: ’ or “ it would mess up with the HTML structure and the song would not play if the user clicked on it. Not gonna lie, I think that my code now is a little spaghetti and for sure someone with more experience and knowledge on how to structure a music player would have done a much better job than me at this, but still. The main caveat that I think could appear in the future is that the Play function can’t take numbered ids for playlists and I have to rely in the playlist’s name because the function would have no way to distinguish between them at the moment and I don’t want to make another spaghetti to fix this. 😅 In other news, I have successfully changed the backend to update the DB version for the user of the older version of the app and to add the new “lyrics” column and also the app can read the embedded lyrics from the music files. Now the “only” thing remaining is to add the lyrics to the UI and to parse the strings and make the verses synchronize with the song and this feature would be fully implemented."}, {"post_id": 57422, "ts": "2026-08-29T15:54:13Z", "hours": 2.9864, "text": "After successfully changing the song objects management under the hood from the previous devlog I now added an indicator for which song is currently playing. For now I’ve just set the background of the song to be the primary color selected by the user. Also I’ve changed the border radius for everything to be based on one variable so that the user could change it in the settings (but didn’t yet implement the UI for that) cause everyone has their own preference for these things. The first screenshot is with the border radius set a bit higher (30px) than my default one (23px), and the second one is with the border radius set to 0. Additionally I am changing the SQLite db in the backend to support lyrics because I want to add them to the app."}, {"post_id": 56489, "ts": "2026-08-28T08:43:54Z", "hours": 4.7514, "text": "I am currently working on optimizing the code so that changes like adding songs to a playlist or liking a song update instantly across all pages because this was a flaw of my old architecture of the app cause I didn’t just have 1 list of song objects that every album and artist referenced to but instead every album and artist had their own song objects and the list of favorite songs was also composed of song object. So it was a mess of duplicate song objects. Now I am changing things so that there is only one list of song object and albums have just a list of song ids in them so they reference the song object list, this way each change is global. This would hopefully fix the current synchronization issues that sometimes occur in the current version. This change would also allow me to add an indicator that a song is playing when the user looks at an album from which a song plays currently. Additionally I want to add a listening history page where the user can see their listening activity on the app and also maybe add some rewards depending on how much time they spent listening to an artist or album to gamify the experience a little."}, {"post_id": 8658, "ts": "2026-06-14T11:47:22Z", "hours": 0.4289, "text": "Solving some App Manifest problems"}, {"post_id": 8040, "ts": "2026-06-13T12:20:46Z", "hours": 1.7347, "text": "Updating the package on the Microsoft Store"}, {"post_id": 7956, "ts": "2026-06-13T08:50:15Z", "hours": 1.2564, "text": "Added some customization options and a settings menu"}, {"post_id": 7328, "ts": "2026-06-12T06:33:15Z", "hours": 1.7297, "text": "Updating the interface a little"}, {"post_id": 4874, "ts": "2026-06-08T13:08:06Z", "hours": 3.1572, "text": "Implemented search functionality"}, {"post_id": 3541, "ts": "2026-06-06T15:01:03Z", "hours": 2.7919, "text": "Adding clear queue button and a Permanent Queue or Temporary Playlist feature that saves the songs that you add to the queue even after you listen to them so you can set it to repeat all and still have the songs that you wanted"}, {"post_id": 3394, "ts": "2026-06-06T09:28:56Z", "hours": 1.4672, "text": "I implemented the function of changing the name and cover of a playlist"}]...
|
Title: Better Music by @muntean_andrew | Stardance Title: Better Music by @muntean_andrew | Stardance
Devlogs:
I implemented the function of changing the name and cover of a playlist
Adding clear queue button and a Permanent Queue or Temporary Playlist feature that saves the songs that you add to the queue even after you listen to them so you can set it to repeat all and still have the songs that you wanted
Implemented search functionality
Updating the interface a little
Added some customization options and a settings menu
Updating the package on the Microsoft Store
Solving some App Manifest problems
I am currently working on optimizing the code so that changes like adding songs to a playlist or liking a song update instantly across all pages because this was a flaw of my old architecture of the app cause I didn’t just have 1 list of song objects that every album and artist referenced to but instead every album and artist had their own song objects and the list of favorite songs was also composed of song object. So it was a mess of duplicate song objects. Now I am changing things so that there is only one list of song object and albums have just a list of song ids in them so they reference the song object list, this way each change is global. This would hopefully fix the current synchronization issues that sometimes occur in the current version. This change would also allow me to add an indicator that a song is playing when the user looks at an album from which a song plays currently. Additionally I want to add a listening history page where the user can see their listening activity on the app and also maybe add some rewards depending on how much time they spent listening to an artist or album to gamify the experience a little.
After successfully changing the song objects management under the hood from the previous devlog I now added an indicator for which song is currently playing. For now I’ve just set the background of the song to be the primary color selected by the user. Also I’ve changed the border radius for everything to be based on one variable so that the user could change it in the settings (but didn’t yet implement the UI for that) cause everyone has their own preference for these things. The first screenshot is with the border radius set a bit higher (30px) than my default one (23px), and the second one is with the border radius set to 0. Additionally I am changing the SQLite db in the backend to support lyrics because I want to add them to the app.
Another day, another restructuring I guess. 😅 I’ve decided to give each album an id instead of relying on it’s name as the identifier as I did previously. Also I’ve changed the Play function to work with song ids and album ids instead of names. This is because if the name of the song or the album had any of these 2 characters: ’ or “ it would mess up with the HTML structure and the song would not play if the user clicked on it. Not gonna lie, I think that my code now is a little spaghetti and for sure someone with more experience and knowledge on how to structure a music player would have done a much better job than me at this, but still. The main caveat that I think could appear in the future is that the Play function can’t take numbered ids for playlists and I have to rely in the playlist’s name because the function would have no way to distinguish between them at the moment and I don’t want to make another spaghetti to fix this. 😅 In other news, I have successfully changed the backend to update the DB version for the user of the older version of the app and to add the new “lyrics” column and also the app can read the embedded lyrics from the music files. Now the “only” thing remaining is to add the lyrics to the UI and to parse the strings and make the verses synchronize with the song and this feature would be fully implemented.
Trying to add lyrics to the app. But it is a bit of a mess cause in the Samsung Music and Apple Music apps these files contain time stamps for each verse and so I was thinking to read those time stamps and to highlight the verse that is played at that time, but my app doesn’t read those things and I don’t know why. An explanation might be that those apps ping free open source databases of lyrics based on the song details, but I am not really sure.
I’ve finally found the culprit that prevented me from getting the synced lyrics, now the app can read the synced lyrics from music filed. YEEEEEEE Now the “only” thing is to make the UI for them, which I hope would be easy and fast. 😅
YEEEEEESS, FINALLLYYYYYY, we have synced lyrics in the app. I know it’s not the most glamorous UI at the moment, but it is still something, and the other music players don’t even do this, like at most they show the lyrics with the timestamps and that’s it, no scaling of the verse, nothing. In future updates certainly I’ll make the UI more polished because it need a lot of it. Still I am happy that I’ve made it this far and after a bit of clean up and maybe some optimizations I’ll ship the project.
Added new ways to customize the player to the user’s liking and fixed that prevented the app from reading the user_version of the database which in return made the app “update” the DB everytime it started.
This is the last devlog before shipping the project update. This has been an exciting journey and I am very satisfied with the result! I do wish there would be a bit more time left for the event to continue so I could ship even more things but all good things must come to an end, and this one is a happy ending. I’ve made the necessary last minute touches to make sure that everything works as it should.
Ships:
I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. The challenging part was the steep learning curve as I hadn’t done anything on this scale before. I had to learn to connect the 2 Electron processes together seamlessly. Furthermore I had to dive into the world of databases with SQLite 3, which was uncharted territory for me. I had to use AI to help me learn these things and also to brainstorm ideas about hoe to optimize the app. For instance, when the idea of the search-as-you-type feature came up to me I envisioned a kind of tree structure with letters and that for every song, album, playlist name the app would create the branches in the tree so it would be a very fast and efficient search algorithm, and when I talked to the AI about it I found out that this kind of structure is called a trie. I am really proud that I’ve managed to build a clean, responsive and fast music player that tracks the user’s listening activity and stores it on device. Also it was very exciting when I tested the search feature and it worked perfectly. I’m also proud of the engineering journey itself. I utilized Gemini as an active learning collaborator to help me unpack the architectural patterns of Electron and master data persistence with SQLite 3. Turning that complex technical guidance into a functional, polished desktop product was incredibly rewarding. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now.
I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, can read synced/unsynced lyrics tags from the music files and show them like Spotify, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette and even the base border radius to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. This is just an update and the majority of the time spent on the project was used to make improvements in the backend management of the song objects and to make the UI better reflect and update according to the data in the backend. But also I’ve added lyrics support and if your music files have lyrics tags embedded in them the app will take full advantage of them by enabling you to see each verse when it is singed and also skip to that one part you like the most just by clicking on your favorite line in the track. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now....
|
1793433334.8079584
|
1793519734.8079584
|
|
9444
|
order-tool by @derjan_albrecht | Stardance
|
derjan_albrecht
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: order-tool by @derjan_albrecht | Stardance
|
1793325168.5460658
|
1793929968.5460658
|
|
9445
|
My first slack bot! by @kisioglu | Stardance
|
kisioglu
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @kisioglu | Stardanc Title: My first slack bot! by @kisioglu | Stardance...
|
1792756494.158389
|
1793361294.158389
|
|
9446
|
My first slack bot! by @cwill | Stardance
|
cwill
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @cwill | Stardance
|
1793328501.0305548
|
1793933301.0305548
|
|
9447
|
Axona by @Abhra | Stardance
|
Abhra
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Axona by @Abhra | Stardance
|
1792741945.0100229
|
1793346745.0100229
|
|
9448
|
Model Rocket by @ethanmd1 | Stardance
|
ethanmd1
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Model Rocket by @ethanmd1 | Stardance
|
1793318241.6990151
|
1793923041.6990151
|
|
9449
|
My awesome macropad! by @blobadoodle | Stardance
|
blobadoodle
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @blobadoodle | Star Title: My awesome macropad! by @blobadoodle | Stardance...
|
1793202656.7995129
|
1793807456.7995129
|
|
9450
|
Asteroid Attack by @Scrax99 | Stardance
|
Scrax99
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Asteroid Attack by @Scrax99 | Stardance
|
1793228074.4005976
|
1793832874.4005976
|