|
60652
|
things I made ig by @anvay_purnaye | Stardance
|
anvay_purnaye
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: things I made ig by @anvay_purnaye | Starda Title: things I made ig by @anvay_purnaye | Stardance...
|
1793036933.154541
|
1793641733.154541
|
|
60653
|
things I made ig by @anvay_purnaye | Stardance
|
anvay_purnaye
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: things I made ig by @anvay_purnaye | Starda Title: things I made ig by @anvay_purnaye | Stardance...
|
1793036934.045551
|
1793641734.045551
|
|
63931
|
thinkpad by @non | Stardance
|
non
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: thinkpad by @non | Stardance
|
1793055213.2793171
|
1793660013.2793171
|
|
63932
|
thinkpad by @non | Stardance
|
non
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: thinkpad by @non | Stardance
|
1793055215.2578294
|
1793660015.2578294
|
|
66450
|
thinkpad-ir-tool by @simonproyt | Stardance
|
simonproyt
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: thinkpad-ir-tool by @simonproyt | Stardance
|
1792460986.7994485
|
1793324986.7994485
|
|
15344
|
third person game by @moayed_jouini | Stardance
|
moayed_jouini
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: third person game by @moayed_jouini | Stard Title: third person game by @moayed_jouini | Stardance...
|
1792637552.152127
|
1793242352.152127
|
|
70084
|
this is my first simple python project by @chris_D this is my first simple python project by @chris_D | Stardance...
|
chris_D
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: this is my first simple python project by @ Title: this is my first simple python project by @chris_D | Stardance...
|
1792958027.8578446
|
1793562827.8578446
|
|
51059
|
this nice by @aliyuumardoggi | Stardance
|
aliyuumardoggi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: this nice by @aliyuumardoggi | Stardance
|
1792655518.7047534
|
1793260318.7047534
|
|
9378
|
thoroutine by @zzbytes | Stardance
|
zzbytes
|
0
|
2.07
|
0
|
[]
|
[{"post_id": 4364, "ts": "2026 [{"post_id": 4364, "ts": "2026-06-07T17:39:30Z", "hours": 2.0736, "text": "Just got done with the base of my threading/coroutine library, but still a long way away from it being completed! It’s supposed to be cross-platform, though only Linux is supported as of currently (I know, cross-platform library being platform locked is ironic)."}]...
|
Title: thoroutine by @zzbytes | Stardance
Devlogs Title: thoroutine by @zzbytes | Stardance
Devlogs:
Just got done with the base of my threading/coroutine library, but still a long way away from it being completed! It’s supposed to be cross-platform, though only Linux is supported as of currently (I know, cross-platform library being platform locked is ironic)....
|
1792774388.2061894
|
1793379188.2061894
|
|
20147
|
thoughts. by @Imtiaz | Stardance
|
Imtiaz
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: thoughts. by @Imtiaz | Stardance
|
1792889483.8330564
|
1793753483.8330564
|
|
54106
|
thread-keeper by @kevin_fredric | Stardance
|
kevin_fredric
|
2
|
1.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-27T02:02:01Z", "hours": 0.0, "multiplier": 3.61, "payout": 1, "blessing": "neutral", "text": "threadkeeper ship #2 a slack bot that makes sure that EVERYONE’s threads have been answered even if its an old thread. Updated Threadkeeper with three new commands: /tk-next, /tk-unanswered, and /tk-search. /tk-next finds the highest-priority unresolved thread based on age and human replies. /tk-unanswered shows unresolved threads with no human replies while ignoring bot responses like Heidi. /tk-search lets users search unresolved threads by keyword.", "repo": "https://github.com/kevinsstinc/Thread-Keeper", "demo": "https://app.slack.com/client/E09V59WQY1E/C0AP0NMSP3P?skip_today=1"}, {"ship_num": 2, "ts": "2026-08-26T00:39:33Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "threadkeeper a slack bot that makes sure that EVERYONE’s threads have been answered even if its an old thread. this makes sure that no person is left unsure for days threadkeeper uses Heidi The Astronaut’s emoji answering system to understand what threads haven’t been answered maybe this could be used by the admins of stardance?!", "repo": "https://github.com/kevinsstinc/Thread-Keeper", "demo": "https://app.slack.com/client/E09V59WQY1E/C0AP0NMSP3P?skip_today=1"}]...
|
[{"post_id": 55317, "ts": "202 [{"post_id": 55317, "ts": "2026-08-27T02:00:28Z", "hours": 0.2864, "text": "Added a bunch of new commands /tk-next : which allows you to check the next thread which requires the most priority /tk-unanswered : which shows the threads with NO human replies /tk-search [keyword] : allows you to search through keywords in threads"}, {"post_id": 54464, "ts": "2026-08-25T14:08:18Z", "hours": 0.7511, "text": "threadkeeper so for all the people who’s threads have been buried due to the super high influx of people asking questions this gives awareness to those threads that still need tending to. so everyone’s threads gets a chance to be seen!"}]...
|
Title: thread-keeper by @kevin_fredric | Stardance Title: thread-keeper by @kevin_fredric | Stardance
Devlogs:
threadkeeper so for all the people who’s threads have been buried due to the super high influx of people asking questions this gives awareness to those threads that still need tending to. so everyone’s threads gets a chance to be seen!
Added a bunch of new commands /tk-next : which allows you to check the next thread which requires the most priority /tk-unanswered : which shows the threads with NO human replies /tk-search [keyword] : allows you to search through keywords in threads
Ships:
threadkeeper a slack bot that makes sure that EVERYONE’s threads have been answered even if its an old thread. this makes sure that no person is left unsure for days threadkeeper uses Heidi The Astronaut’s emoji answering system to understand what threads haven’t been answered maybe this could be used by the admins of stardance?!
threadkeeper ship #2 a slack bot that makes sure that EVERYONE’s threads have been answered even if its an old thread. Updated Threadkeeper with three new commands: /tk-next, /tk-unanswered, and /tk-search. /tk-next finds the highest-priority unresolved thread based on age and human replies. /tk-unanswered shows unresolved threads with no human replies while ignoring bot responses like Heidi. /tk-search lets users search unresolved threads by keyword....
|
1793112614.5142355
|
1793199014.5142355
|
|
45699
|
threat detection by @MadameLouise | Stardance
|
MadameLouise
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-08T19:20:09Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Multi zone threat detection iot project for cars or any vehicles, if you want to detection a rat biting its wires and send alert! or if an animal is sleeping under your vehicle before moving it", "repo": "https://github.com/AmruthaMuralidhar1/Notebook/tree/565462271745ab651cf61654db632a26331b4e73/threatdetection", "demo": ""}]...
|
[{"post_id": 43474, "ts": "202 [{"post_id": 43474, "ts": "2026-08-08T19:18:53Z", "hours": 6.2158, "text": "Multi zone threat detection IoT project"}]...
|
Title: threat detection by @MadameLouise | Stardan Title: threat detection by @MadameLouise | Stardance
Devlogs:
Multi zone threat detection IoT project
Ships:
Multi zone threat detection iot project for cars or any vehicles, if you want to detection a rat biting its wires and send alert! or if an animal is sleeping under your vehicle before moving it...
|
1793094499.4391923
|
1793180899.4391923
|
|
35987
|
thrustmaster t300 calculator by @cl0ver | Stardanc thrustmaster t300 calculator by @cl0ver | Stardance...
|
cl0ver
|
0
|
6.22
|
0
|
[]
|
[{"post_id": 31511, "ts": "202 [{"post_id": 31511, "ts": "2026-07-19T23:51:03Z", "hours": 4.1683, "text": "Devlog 2 So today I finished removing the pc from the “calculator” so now you can “calculate” stuff without looking at the pc (yayyy ) While I was making this atrocity I was wondering why am I even making this useless thing but in the end it was worth it why ? bc I ended up building a worse sketchier calculator then my friend did so it was worth it how does it work just watch the video it does a wayyyyy better job of explaining it then I can write"}, {"post_id": 29485, "ts": "2026-07-16T13:41:22Z", "hours": 2.0475, "text": "Devlog 1 I wanted to make something a bit more unusual, so I decided to create a “calculator” using my wheelbase. How it works Currently, you need to input the equation through the terminal. The result is then outputted in binary, which the wheelbase communicates through its movements: steering left represents 0 and steering right represents 1. My goal is to make it so you are able to input the numbers using the wheel itself. Why? I have absolutely no idea. How it works (the code) I am using the sdl2 library to control the force feedback of the wheelbase. As of now, I’ve created two functions, left and right, which are executed based on the binary digits of the equation’s result."}]...
|
Title: thrustmaster t300 calculator by @cl0ver | S Title: thrustmaster t300 calculator by @cl0ver | Stardance
Devlogs:
Devlog 1 I wanted to make something a bit more unusual, so I decided to create a “calculator” using my wheelbase. How it works Currently, you need to input the equation through the terminal. The result is then outputted in binary, which the wheelbase communicates through its movements: steering left represents 0 and steering right represents 1. My goal is to make it so you are able to input the numbers using the wheel itself. Why? I have absolutely no idea. How it works (the code) I am using the sdl2 library to control the force feedback of the wheelbase. As of now, I’ve created two functions, left and right, which are executed based on the binary digits of the equation’s result.
Devlog 2 So today I finished removing the pc from the “calculator” so now you can “calculate” stuff without looking at the pc (yayyy ) While I was making this atrocity I was wondering why am I even making this useless thing but in the end it was worth it why ? bc I ended up building a worse sketchier calculator then my friend did so it was worth it how does it work just watch the video it does a wayyyyy better job of explaining it then I can write...
|
1792594294.76337
|
1793199094.76337
|
|
8016
|
thtrht by @hannhu4002 | Stardance
|
hannhu4002
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: thtrht by @hannhu4002 | Stardance
|
1792698542.2415457
|
1793303342.2415457
|
|
25542
|
tibou by @taiebjemal | Stardance
|
taiebjemal
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tibou by @taiebjemal | Stardance
|
1792511495.2444592
|
1793116295.2444592
|
|
63033
|
tic tac game by @id9gaf | Stardance
|
id9gaf
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-17T07:38:57Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i created a simpe tic tac toe game, with a comfy pink ui design !", "repo": "https://github.com/hot-stemer/Bloom-Tic-Tac-Toe", "demo": "https://hot-stemer.github.io/Bloom-Tic-Tac-Toe/"}]...
|
[{"post_id": 69514, "ts": "202 [{"post_id": 69514, "ts": "2026-09-17T07:00:15Z", "hours": 6.3281, "text": "I actually finished this game a while ago :––––––––––––––––––––––––––––––––––––––––––––––––––:"}]...
|
Title: tic tac game by @id9gaf | Stardance
Devlog Title: tic tac game by @id9gaf | Stardance
Devlogs:
I actually finished this game a while ago :––––––––––––––––––––––––––––––––––––––––––––––––––:
Ships:
i created a simpe tic tac toe game, with a comfy pink ui design !...
|
1793058706.9074411
|
1793145106.9074411
|
|
29665
|
tidepools by @elaine | Stardance
|
elaine
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tidepools by @elaine | Stardance
|
1792507772.5212667
|
1793112572.5212667
|
|
40994
|
tidy by @rizz | Stardance
|
rizz
|
1
|
3.0
|
22
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-30T12:39:22Z", "hours": 3.0, "multiplier": 7.47, "payout": 22, "blessing": "neutral", "text": "Developed yet another small browser app named “tidy” – just put in a pile of broken links or text in any case, choose the format, and it will fix everything for you – strip any tracking parameters from the URL, make sure the URL is using HTTPS, clean up and shorten lines, and that’s it. The app consists of 3 files: HTML, CSS, and JS……..", "repo": "https://github.com/STEVEALEX-source/tidyup", "demo": "https://tidyupp.netlify.app/"}]...
|
[{"post_id": 37581, "ts": "202 [{"post_id": 37581, "ts": "2026-07-30T12:34:35Z", "hours": 0.905, "text": "finally humanssssssssssssssssssssssss"}, {"post_id": 37538, "ts": "2026-07-30T10:53:46Z", "hours": 0.8789, "text": "so humans….the links and text section is working but i still have to fix the third section"}, {"post_id": 37140, "ts": "2026-07-29T17:04:30Z", "hours": 0.6631, "text": "so humans….. i added different sections to the website….i still have to work on there functionality + the UI change old one looked off so i made it cleaner"}, {"post_id": 37086, "ts": "2026-07-29T15:48:35Z", "hours": 0.3067, "text": "hello humans so this is an another usual devlog…… made the website kinda catchy…would do further improvements"}, {"post_id": 36369, "ts": "2026-07-28T13:19:24Z", "hours": 0.2878, "text": "devloggg so i am working on a app that removes all the tracking params from any website and also a text cleaner for when you paste something and it has weird spacing or curly quotes"}]...
|
Title: tidy by @rizz | Stardance
Devlogs:
devlogg Title: tidy by @rizz | Stardance
Devlogs:
devloggg so i am working on a app that removes all the tracking params from any website and also a text cleaner for when you paste something and it has weird spacing or curly quotes
hello humans so this is an another usual devlog…… made the website kinda catchy…would do further improvements
so humans….. i added different sections to the website….i still have to work on there functionality + the UI change old one looked off so i made it cleaner
so humans….the links and text section is working but i still have to fix the third section
finally humanssssssssssssssssssssssss
Ships:
Developed yet another small browser app named “tidy” – just put in a pile of broken links or text in any case, choose the format, and it will fix everything for you – strip any tracking parameters from the URL, make sure the URL is using HTTPS, clean up and shorten lines, and that’s it. The app consists of 3 files: HTML, CSS, and JS…….....
|
1793112844.809995
|
1793199244.809995
|
|
25069
|
tilt by @shailesh | Stardance
|
|
0
|
11.71
|
0
|
[]
|
[{"post_id": 40547, "ts": "202 [{"post_id": 40547, "ts": "2026-08-04T05:25:00Z", "hours": 9.8906, "text": "built the device + made the wiki"}, {"post_id": 16298, "ts": "2026-06-26T14:50:16Z", "hours": 0.4494, "text": "rerouted and redesigned the pcb, fixed some bad design Issues and routing problems"}, {"post_id": 15032, "ts": "2026-06-24T12:39:40Z", "hours": 1.3686, "text": "schematics + pcb design done. claude helped me figure out the schematics, took a lot of workarounds cuz this Is potentially harmful. added safety precautions and stuff to not end up burning or shocking myself"}]...
|
Title: tilt by @shailesh | Stardance
Devlogs:
sch Title: tilt by @shailesh | Stardance
Devlogs:
schematics + pcb design done. claude helped me figure out the schematics, took a lot of workarounds cuz this Is potentially harmful. added safety precautions and stuff to not end up burning or shocking myself
rerouted and redesigned the pcb, fixed some bad design Issues and routing problems
built the device + made the wiki...
|
1792914670.5663912
|
1793778670.5663912
|
|
68453
|
time machine by @Broccoli | Stardance
|
Broccoli
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: time machine by @Broccoli | Stardance
|
1793120147.517421
|
1793724947.517421
|
|
45704
|
timer animal by @SaanviS | Stardance
|
SaanviS
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: timer animal by @SaanviS | Stardance
|
1792634005.5875313
|
1793238805.5875313
|
|
56752
|
timer by @ayushwastaken | Stardance
|
ayushwastaken
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: timer by @ayushwastaken | Stardance
|
1792677303.2487326
|
1793282103.2487326
|
|
46328
|
timer by @torkel | Stardance
|
torkel
|
1
|
7.0
|
115
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-12T14:47:38Z", "hours": 7.0, "multiplier": 15.91, "payout": 115, "blessing": "neutral", "text": "timer a dead-simple CLI timer why i was tired of googling for timers all the time. for a while i’d had this thought sitting in the back of my head: why not just have a timer command in my terminal instead? i looked around for something like this first, but couldn’t find anything in the form i actually wanted, so i built it myself. it solves a simple problem: i needed a, terminal-native way to track time without breaking my workflow or needing a browser open in the background eating my ram. what it is a dead-simple timer. no fancy UI, no flags to memorize. one argument, intuitive syntax (imo): timer 5m that’s it. no messing around with weird bash loops or sleep one-liners etc :D it’s a fully working & tested on windows & linux directly, builds clean on mac via the github action too (but i dont own a mac so idk if it fully works, but it should). QoL stuff audio alarms plays a sound when the timer’s up. instead of bundling a massive audio library, it just leans on native OS tools ( PlaySoundW on Windows, afplay on macOS, and a fallback chain of pw-play / paplay / aplay on Linux). it supports loopable or one-shot playback of a set sound, or you can just disable it entirely. visual alerts triggers a visual alert alongside the alarm using system tools (requires libnotify on linux, uses osascript notifications on mac, and triggers a classic message box popup on windows). simple config file 4 “set-and-forget” config options ( SoundPath , SendNotification , PlayAudio , LoopAudio ) via a simple key=value format. no need to pass crazy flags or remember syntax for a good setup; just configure it once and run timer 5m . easy peasy to use!!! i guess that counts as qol ^o^ ? other stuff simple syntax timer 5m , timer 90s , timer 1h30m20s , whatever feels natural. p.s the ordering of time units does not matter kept the scope intentionally tight: one arg in, a timer running, an alert out. no dependencies bundled in, it’s dependency-less-ish by design, leaning on existing system-level tools instead of pulling in external libraries. binary’s relatively small & fast to build because of this the git repo also hosts some arch linux pkgbuilds i wrote myself if ur into that kinda thing.. easy installation for nerds :) I’m pretty happy with it and enjoy using it myself, honestly wasn’t too hard to do since i’ve dealt with the terminal quirks i had before, which was the biggest issue (specifically how windows handles ansii escape sequences on its old terminals) more info exists in the readme for configuration and usage !!", "repo": "https://github.com/torkelicious/timer", "demo": "https://github.com/torkelicious/timer/releases/tag/latest"}]...
|
[{"post_id": 45781, "ts": "202 [{"post_id": 45781, "ts": "2026-08-12T14:15:15Z", "hours": 1.4411, "text": "windows quirks… kinda just setting things up Windows VM & ANSI Support: Spent time testing in the Windows VM. older command prompts or PowerShell prompts on Windows require explicit setting of ANSI escape sequence support which I use so got that sorted out.. (the same way as i project i did last year actually…) setup Got GitHub Actions configured and put together a proper README, and also made some arch linux pkgbuilds because thats how i like installing my own applications :) Audio Backends: Updated the audio player logic. Now it tries to use pw-play if it exists, rather than strictly relying on PipeWire-Pulse or other specific layers. It supports all the audio backends for REAL now."}, {"post_id": 45356, "ts": "2026-08-11T19:13:00Z", "hours": 1.9814, "text": "Audio Alerts & Config Files changes audio player , the timer can make noise now. via native OS tools instead of pulling in an audio library: PulseAudio/PipeWire/ALSA on Linux, afplay on macOS, PlaySoundW on Windows. config system , added a simple key=value config format with a custom parser. nothing fancy, but it works!:D cleanup , nothing exciting just tidying up… p.s everything here is my own tiny (and maybe terrible) code, no imported libraries. this project’s stayed dependency-less-ish from the start, it leans on existing system-level stuff ( libnotify , whatever audio server you’ve got on Linux, etc) instead of bundling in external libs :D"}, {"post_id": 45258, "ts": "2026-08-11T16:38:49Z", "hours": 0.3544, "text": "I have notifications working, it will trigger a terminal-bell and send a notification (depends on platform though) on windows it will use a messagebox, on linux it currently depends on libnotify, maybe not great but it’s easy to use and already super common… macos also has an implementation but i have not tested it since i am not a mac user.. you can also press ‘q’ to quit while the timer is running (on all platforms)"}, {"post_id": 44699, "ts": "2026-08-10T17:15:44Z", "hours": 1.5425, "text": "been fixing formatting as shown, also working on taking in input too (so pressing q quits the timer early) and im also working on getting notifications implemented"}, {"post_id": 44559, "ts": "2026-08-10T12:14:35Z", "hours": 1.0436, "text": "ive got the command line parser working, its a recursive descent parse which turns input (taken from argv) such as “1h30m” into milliseconds, and gets used by the timer function, suprised I got it working so quickly :) … i think im going to focus on making the output format properly to Day:Hour:Minute:Second or something, since right now its just Minutes:Seconds.. then probably figure out what to do when time runs out"}, {"post_id": 44531, "ts": "2026-08-10T11:04:24Z", "hours": 0.8375, "text": "i was lowk tired of having to google “x timer” every time I needed one, so I figured it would be easier to just make my own simple terminal timer app currently i have a basic test setup i guess that just counts down and exits when done, it uses milliseconds internally but takes minutes as input i plan to turn it into a proper CLI app with input parsing, so things like: 10s 5m 2h 2h5m etc. will work, then probably implement some sort of notification or something once it’s done"}]...
|
Title: timer by @torkel | Stardance
Devlogs:
i wa Title: timer by @torkel | Stardance
Devlogs:
i was lowk tired of having to google “x timer” every time I needed one, so I figured it would be easier to just make my own simple terminal timer app currently i have a basic test setup i guess that just counts down and exits when done, it uses milliseconds internally but takes minutes as input i plan to turn it into a proper CLI app with input parsing, so things like: 10s 5m 2h 2h5m etc. will work, then probably implement some sort of notification or something once it’s done
ive got the command line parser working, its a recursive descent parse which turns input (taken from argv) such as “1h30m” into milliseconds, and gets used by the timer function, suprised I got it working so quickly :) … i think im going to focus on making the output format properly to Day:Hour:Minute:Second or something, since right now its just Minutes:Seconds.. then probably figure out what to do when time runs out
been fixing formatting as shown, also working on taking in input too (so pressing q quits the timer early) and im also working on getting notifications implemented
I have notifications working, it will trigger a terminal-bell and send a notification (depends on platform though) on windows it will use a messagebox, on linux it currently depends on libnotify, maybe not great but it’s easy to use and already super common… macos also has an implementation but i have not tested it since i am not a mac user.. you can also press ‘q’ to quit while the timer is running (on all platforms)
Audio Alerts & Config Files changes audio player , the timer can make noise now. via native OS tools instead of pulling in an audio library: PulseAudio/PipeWire/ALSA on Linux, afplay on macOS, PlaySoundW on Windows. config system , added a simple key=value config format with a custom parser. nothing fancy, but it works!:D cleanup , nothing exciting just tidying up… p.s everything here is my own tiny (and maybe terrible) code, no imported libraries. this project’s stayed dependency-less-ish from the start, it leans on existing system-level stuff ( libnotify , whatever audio server you’ve got on Linux, etc) instead of bundling in external libs :D
windows quirks… kinda just setting things up Windows VM & ANSI Support: Spent time testing in the Windows VM. older command prompts or PowerShell prompts on Windows require explicit setting of ANSI escape sequence support which I use so got that sorted out.. (the same way as i project i did last year actually…) setup Got GitHub Actions configured and put together a proper README, and also made some arch linux pkgbuilds because thats how i like installing my own applications :) Audio Backends: Updated the audio player logic. Now it tries to use pw-play if it exists, rather than strictly relying on PipeWire-Pulse or other specific layers. It supports all the audio backends for REAL now.
Ships:
timer a dead-simple CLI timer why i was tired of googling for timers all the time. for a while i’d had this thought sitting in the back of my head: why not just have a timer command in my terminal instead? i looked around for something like this first, but couldn’t find anything in the form i actually wanted, so i built it myself. it solves a simple problem: i needed a, terminal-native way to track time without breaking my workflow or needing a browser open in the background eating my ram. what it is a dead-simple timer. no fancy UI, no flags to memorize. one argument, intuitive syntax (imo): timer 5m that’s it. no messing around with weird bash loops or sleep one-liners etc :D it’s a fully working & tested on windows & linux directly, builds clean on mac via the github action too (but i dont own a mac so idk if it fully works, but it should). QoL stuff audio alarms plays a sound when the timer’s up. instead of bundling a massive audio library, it just leans on native OS tools ( PlaySoundW on Windows, afplay on macOS, and a fallback chain of pw-play / paplay / aplay on Linux). it supports loopable or one-shot playback of a set sound, or you can just disable it entirely. visual alerts triggers a visual alert alongside the alarm using system tools (requires libnotify on linux, uses osascript notifications on mac, and triggers a classic message box popup on windows). simple config file 4 “set-and-forget” config options ( SoundPath , SendNotification , PlayAudio , LoopAudio ) via a simple key=value format. no need to pass crazy flags or remember syntax for a good setup; just configure it once and run timer 5m . easy peasy to use!!! i guess that counts as qol ^o^ ? other stuff simple syntax timer 5m , timer 90s , timer 1h30m20s , whatever feels natural. p.s the ordering of time units does not matter kept the scope intentionally tight: one arg in, a timer running, an alert out. no dependencies bundled in, it’s dependency-less-ish by design, leaning on existing system-level tools instead of pulling in external libraries. binary’s relatively small & fast to build because of this the git repo also hosts some arch linux pkgbuilds i wrote myself if ur into that kinda thing.. easy installation for nerds :) I’m pretty happy with it and enjoy using it myself, honestly wasn’t too hard to do since i’ve dealt with the terminal quirks i had before, which was the biggest issue (specifically how windows handles ansii escape sequences on its old terminals) more info exists in the readme for configuration and usage !!...
|
1793112550.9661884
|
1793198950.9661884
|
|
70148
|
timer-app-basic by @A_Mad_Dev | Stardance
|
A_Mad_Dev
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: timer-app-basic by @A_Mad_Dev | Stardance
|
1792958107.5781162
|
1793562907.5781162
|
|
21157
|
timerapp by @epain | Stardance
|
epain
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: timerapp by @epain | Stardance
|
1792514927.3805428
|
1793119727.3805428
|
|
58713
|
tiny bluetooth keyboard by @matteoduda | Stardance
|
matteoduda
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tiny bluetooth keyboard by @matteoduda | St Title: tiny bluetooth keyboard by @matteoduda | Stardance...
|
1792767051.254717
|
1793371851.254717
|
|
41437
|
tiny bot by @colyflower | Stardance
|
colyflower
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tiny bot by @colyflower | Stardance
|
1792914717.0887096
|
1793778717.0887096
|
|
68821
|
tiny garden by @elara | Stardance
|
elara
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tiny garden by @elara | Stardance
|
1792475320.2707305
|
1793080120.2707305
|
|
68822
|
tiny garden by @elara | Stardance
|
elara
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tiny garden by @elara | Stardance
|
1792475321.0979226
|
1793080121.0979226
|
|
32656
|
tiny website by @alystxr | Stardance
|
alystxr
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tiny website by @alystxr | Stardance
|
1792662460.9315093
|
1793267260.9315093
|
|
54817
|
tinyapper by @craisin | Stardance
|
craisin
|
2
|
32.0
|
541
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-26T07:19:18Z", "hours": 14.0, "multiplier": 16.51, "payout": 225, "blessing": "neutral", "text": "| Hi stardance! Please make sure to try both demos out at https://tinyapper.craisin.tech and https://yapperpedia.craisin.tech . Additionally, tinyapper can be kinda slow (no GPU in my server unfortunately) and dumb (it is severely undertrained), please be patient and understand that these are silly proof of concept models! Tinyapper 2.0.0 More Tinyapper, the LLM trained from scratch! This time the model is trained to be fully conversational with user, assistant, and eos tokens, along with a session attached KV cache. Tech Changes New conversational demo at tinyapper.craisin.tech Updated attention conditional for multiple infills for chat Updated KV cache so chats can be cached Reiterated how datasets are made Retrained model for yapperpedia so the model is slightly more coherent Future Development Standardizing datasets to use memmap for larger datasets Retrain conversational model Fine tune the model While this will probably be the last of me working on this project for Stardance, I’ll definitely work on this more in my own time. Keep an eye on the Github for updates if you are interested, stars and follows there are noticed and appreciated!", "repo": "https://github.com/craisined/tinyapper", "demo": "https://tinyapper.craisin.tech"}, {"ship_num": 2, "ts": "2026-09-04T02:19:11Z", "hours": 18.0, "multiplier": 17.57, "payout": 316, "blessing": "neutral", "text": "Tinyapper 1.0.0 The first release for Tinyapper, the tiny LLM built from scratch! It so far still only exists as a pretrained transformer, I hope to finetune v2 using a dataset for alpaca. A lot of time was spent cleaning up yapperpedia , the demo I created to generate incoherent Wikipedia articles. However, a lot of time was also spent making the code accessible and modular, as I want to further build on this project and encourage others to understand machine learning fundamentals as well. If you are interested, check out local.ipynb ! Tech 50M parameter pretrained transformer model trained on wikitext recreating transformer architecture similar to GPT-2 Flask backend with plain HTML, CSS, and JS website showing the abilities of Tinyapper Struggles KV caching and embedding: I tried for too long to create a looping cache, but that was both slow and impractical to do at the current state of this project Streaming: Getting the stream sent over without bugs and glitches was a giant headache! Future Development Tuning the language to be conversational Creating a context independent KV cache Increasing model size", "repo": "https://github.com/craisined/tinyapper", "demo": "https://tinyapper.craisin.tech"}]...
|
[{"post_id": 73871, "ts": "202 [{"post_id": 73871, "ts": "2026-09-26T07:08:29Z", "hours": 2.2133, "text": "Devlog 11: Cleaned this up a bit more, adding session attached KV caching and more polish for one last ship. School + apps is getting busy, so I think this will be my final devlog. TYSM stardancers, I had lots of fun creating tinyapper"}, {"post_id": 67900, "ts": "2026-09-14T06:24:14Z", "hours": 3.3714, "text": "Devlog 10 : Created the website for my chatbot! Other than retraining, I think the last steps for me look like implementing a session attached KV cache. 2.0 soon :D"}, {"post_id": 63883, "ts": "2026-09-07T21:45:56Z", "hours": 2.5372, "text": "Devlog 9 : An epoch of ultrachat finished faster than I thought it would… tinyapper really likes chocolate chip cocktails I guess 😭. Looping and other problems are getting really prevalent, I think I’m hitting the limit for a 50M model."}, {"post_id": 63653, "ts": "2026-09-07T16:01:37Z", "hours": 5.5247, "text": "Pre devlog thank you: You guys really did fund my cloud credit, 17.57x multiplier for my first ship on this is crazy! I read through the feedback, my plan now is to use Stardust for cloud credit (pending order) to properly pretrain the model and finetune it using Ultrachat (I hear yall :3). Thanks for all the support and suggestions here and on Slack, it really motivates me to keep coding <3 Ship 1.0.1 (Devlog 8) : Implemented variable learning rate: in theory lets the model hit slightly lower numbers and train longer Added a validation split and test: long overdue lol Added data processing and support for Ultrachat: allows me to circumvent processing data on the cloud Added L4 settings for cloud: yes I’m getting ready to train on the cloud Updating docker container to not include a model + other random stuff: volume mount on runtime to prevent pulling 2gb from ghcr every update Retrained model: WE BEAT OPENAI RAHHHH (from 7 years ago), we are now at 3.09 nats (for validation too, which is a better metric)! For reference, GPT 2 small gets a loss of 3.4 nats when evaluated without extra training on the same dataset (we don’t talk about the fine tuning results)"}, {"post_id": 61232, "ts": "2026-09-04T02:04:05Z", "hours": 1.2639, "text": "Devlog 7: I optimized streaming! Not only that, my mini PC has integrated graphics that apparently makes LLM go zoom, so I got a really large unanticipated speed boost :0. I got to increase the generated tokens all the way to near max, so y’all can get more gibberish faster! Going to ship this version :)"}, {"post_id": 61186, "ts": "2026-09-04T00:11:05Z", "hours": 4.3519, "text": "Devlog 6: After all this time… my frontend is the exact same! It’s a lot faster though! I spent a lot of time trying to optimize my model, from KV Caches to RoPE and quantization. Overall, KV caching and streaming text seems to give the best experience, so that’s what I went with. Seeing if I can deploy to nest or further optimize streaming…"}, {"post_id": 60078, "ts": "2026-09-02T06:33:28Z", "hours": 2.7022, "text": "Devlog 5 : Finally implemented a cache… now I just have to rewrite my attention module to work around it…"}, {"post_id": 58575, "ts": "2026-08-31T01:16:47Z", "hours": 1.6464, "text": "Devlog 4 : I tried to get away with not using a KV Cache and ship today… but CPU said no. Considering using cloud to host this until I implement a KV Cache, but I know I should just code one up. Why do LLMs need so much compute"}, {"post_id": 58524, "ts": "2026-08-30T23:19:21Z", "hours": 4.3989, "text": "Devlog #3 : The model is trained! I will fine tune and train it over next week, but I think I want to get a first ship and demo first. Yapperpedia coming soon!"}, {"post_id": 56929, "ts": "2026-08-28T23:10:50Z", "hours": 1.7664, "text": "Devlog 2 : Tinyapper (an llm from scratch) is done with its first train! After an epoch of training it averaged ~3.8 nats/token for training data, which is decently close to GPT 2s 3.62… I hope to turn this into a frivolous Wikipedia article generator this weekend for a first ship this weekend, so get ready for that!"}, {"post_id": 56429, "ts": "2026-08-28T06:08:01Z", "hours": 1.855, "text": "Devlog #1 : Nowadays, LLMs are such a popular technology with a lot of theory, but very few people seem to have implemented one. I wanted to create my own LLM to tinker with on my own, and so far cross entropy seems to be approaching human language! Wish me luck <3"}]...
|
Title: tinyapper by @craisin | Stardance
Devlogs: Title: tinyapper by @craisin | Stardance
Devlogs:
Devlog #1 : Nowadays, LLMs are such a popular technology with a lot of theory, but very few people seem to have implemented one. I wanted to create my own LLM to tinker with on my own, and so far cross entropy seems to be approaching human language! Wish me luck <3
Devlog 2 : Tinyapper (an llm from scratch) is done with its first train! After an epoch of training it averaged ~3.8 nats/token for training data, which is decently close to GPT 2s 3.62… I hope to turn this into a frivolous Wikipedia article generator this weekend for a first ship this weekend, so get ready for that!
Devlog #3 : The model is trained! I will fine tune and train it over next week, but I think I want to get a first ship and demo first. Yapperpedia coming soon!
Devlog 4 : I tried to get away with not using a KV Cache and ship today… but CPU said no. Considering using cloud to host this until I implement a KV Cache, but I know I should just code one up. Why do LLMs need so much compute
Devlog 5 : Finally implemented a cache… now I just have to rewrite my attention module to work around it…
Devlog 6: After all this time… my frontend is the exact same! It’s a lot faster though! I spent a lot of time trying to optimize my model, from KV Caches to RoPE and quantization. Overall, KV caching and streaming text seems to give the best experience, so that’s what I went with. Seeing if I can deploy to nest or further optimize streaming…
Devlog 7: I optimized streaming! Not only that, my mini PC has integrated graphics that apparently makes LLM go zoom, so I got a really large unanticipated speed boost :0. I got to increase the generated tokens all the way to near max, so y’all can get more gibberish faster! Going to ship this version :)
Pre devlog thank you: You guys really did fund my cloud credit, 17.57x multiplier for my first ship on this is crazy! I read through the feedback, my plan now is to use Stardust for cloud credit (pending order) to properly pretrain the model and finetune it using Ultrachat (I hear yall :3). Thanks for all the support and suggestions here and on Slack, it really motivates me to keep coding <3 Ship 1.0.1 (Devlog 8) : Implemented variable learning rate: in theory lets the model hit slightly lower numbers and train longer Added a validation split and test: long overdue lol Added data processing and support for Ultrachat: allows me to circumvent processing data on the cloud Added L4 settings for cloud: yes I’m getting ready to train on the cloud Updating docker container to not include a model + other random stuff: volume mount on runtime to prevent pulling 2gb from ghcr every update Retrained model: WE BEAT OPENAI RAHHHH (from 7 years ago), we are now at 3.09 nats (for validation too, which is a better metric)! For reference, GPT 2 small gets a loss of 3.4 nats when evaluated without extra training on the same dataset (we don’t talk about the fine tuning results)
Devlog 9 : An epoch of ultrachat finished faster than I thought it would… tinyapper really likes chocolate chip cocktails I guess 😭. Looping and other problems are getting really prevalent, I think I’m hitting the limit for a 50M model.
Devlog 10 : Created the website for my chatbot! Other than retraining, I think the last steps for me look like implementing a session attached KV cache. 2.0 soon :D
Devlog 11: Cleaned this up a bit more, adding session attached KV caching and more polish for one last ship. School + apps is getting busy, so I think this will be my final devlog. TYSM stardancers, I had lots of fun creating tinyapper
Ships:
Tinyapper 1.0.0 The first release for Tinyapper, the tiny LLM built from scratch! It so far still only exists as a pretrained transformer, I hope to finetune v2 using a dataset for alpaca. A lot of time was spent cleaning up yapperpedia , the demo I created to generate incoherent Wikipedia articles. However, a lot of time was also spent making the code accessible and modular, as I want to further build on this project and encourage others to understand machine learning fundamentals as well. If you are interested, check out local.ipynb ! Tech 50M parameter pretrained transformer model trained on wikitext recreating transformer architecture similar to GPT-2 Flask backend with plain HTML, CSS, and JS website showing the abilities of Tinyapper Struggles KV caching and embedding: I tried for too long to create a looping cache, but that was both slow and impractical to do at the current state of this project Streaming: Getting the stream sent over without bugs and glitches was a giant headache! Future Development Tuning the language to be conversational Creating a context independent KV cache Increasing model size
| Hi stardance! Please make sure to try both demos out at https://tinyapper.craisin.tech and https://yapperpedia.craisin.tech . Additionally, tinyapper can be kinda slow (no GPU in my server unfortunately) and dumb (it is severely undertrained), please be patient and understand that these are silly proof of concept models! Tinyapper 2.0.0 More Tinyapper, the LLM trained from scratch! This time the model is trained to be fully conversational with user, assistant, and eos tokens, along with a session attached KV cache. Tech Changes New conversational demo at tinyapper.craisin.tech Updated attention conditional for multiple infills for chat Updated KV cache so chats can be cached Reiterated how datasets are made Retrained model for yapperpedia so the model is slightly more coherent Future Development Standardizing datasets to use memmap for larger datasets Retrain conversational model Fine tune the model While this will probably be the last of me working on this project for Stardance, I’ll definitely work on this more in my own time. Keep an eye on the Github for updates if you are interested, stars and follows there are noticed and appreciated!...
|
1793098410.4774327
|
1793184810.4774327
|
|
9756
|
tinystudio by @ratmuds | Stardance
|
ratmuds
|
1
|
109.8
|
2123
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-14T02:08:29Z", "hours": 108.0, "multiplier": 19.71, "payout": 2123, "blessing": "neutral", "text": "I made a game engine that I tried to make the UI look nice and feel accessible. I wanted to design it around what I liked about other game engines like Roblox Studio and Godot, and try and make it as easy as possible to make prototypes of games quickly. The decision to not let any 3D imports was intentional to keep the engine style of more retro, as you can see by the rendering style. Instead, you can fuse and subtract shapes together with CSG. The flow editor state machines fully work, and was inspired by Playmaker. The scripting system is a little bit janky sometimes but it somewhat works. The scripting system has a basic scheduler and profiler similar to Roblox’s Luau scheduler but without the complexity of CPU budget. The engine uses a custom ECS that uses Svelte Runes to provide reactivity to the engine sidebars and editor. There is also a basic UI system, and physics. There are three demo projects to try out too.", "repo": "https://github.com/ratmuds/tinystudio", "demo": "https://tinystudio.ratmud.studio/"}]...
|
[{"post_id": 69622, "ts": "202 [{"post_id": 69622, "ts": "2026-09-17T13:08:36Z", "hours": 1.7972, "text": "Redid UI styling to feel more blocky I rewrote the UI to look less bubbly I guess, now it looks more like lego and stuff and more space for work instead of tons of padding"}, {"post_id": 67806, "ts": "2026-09-14T01:58:45Z", "hours": 5.0589, "text": "Finalized Project I added a projects manager and generally just cleaned up the repository. Then created three basic demos, like a basic moon landing game, a very basic parkour game, and a physics sandbox. And finished the README"}, {"post_id": 48210, "ts": "2026-08-16T14:44:47Z", "hours": 4.7264, "text": "Scope Leaking Bug Fixed, Mouse Input, Scripting Improvements, ECS & Events Scripting Improvements and Fixes, Cameras There was an issue where I used a single variable to hold the last used scope before and forgot to change it to support multiple scripts. That is fixed now and scopes aren’t mixed weirdly anymore. There is now mouse functions and events Events can be called like part.physics:on(\"touched\") instead of part:on(\"Physics.touched\") for clarity Cameras are added, game wide function to change active camera, and camera system that updates the camera things bidirectionally supporting multiple camera types."}, {"post_id": 46256, "ts": "2026-08-13T11:31:38Z", "hours": 5.1194, "text": "Script Scheduling Engine Revamp The entire scripting engine has been redone. It was a lot of cascading changes again, with now each “Scope” having it’s own scheduler. A “scope” is a single logic component that gets attached to entities. How it works now The scheduler handles the Lua engine stuff. It wraps the main script around into a coroutine automatically now, and extracts the coroutine into a thread. It then creates a scheduler job object, pending into the queue. The scheduler then gets stepped, and initializes the jobs into the main queue and steps them. By stepping them, it resumes the coroutine until the script either ends or manually pauses the coroutine itself (usually done with a predefined “wait” function). I think this is very similar to how Roblox handles it’s script scheduler, although Roblox’s is of course much more complicated. Handling the events and callbacks was much more difficult though. Each of those ALSO need it’s own thread to run to access coroutine related functions and to access data (otherwise very weird errors will happen, like calling code over a boundary or something). This all gets added as a scheduler job, and that allows us to record telemetry data. Eventually, threads can be assigned a “budget”, where they can be stalled if they consume more than the allotted time or even do things like infinite loop detection, etc. There was just generally tedious work that was annoying."}, {"post_id": 45759, "ts": "2026-08-12T13:35:44Z", "hours": 5.3428, "text": "Added CSG Operations I added CSG operations, using the Manifold library. It makes it a bit simpler, making watertight meshes and giving back the geometry for me to make a custom mesh in ThreeJS. The reason it took so long was because I had to add cascading changes to a lot of the data structures to support this custom geometry. I also added a little loading thing at the bottom right for CSG operations. As of right now Union and Subtract are supported. Materials are not preserved as of right now, due to the simplistic way I’m handling materials but when I finish building out the materials system I basically just need to get the triangle references out of Manifold and relink them to the correct materials."}, {"post_id": 40725, "ts": "2026-08-04T13:16:47Z", "hours": 5.4036, "text": "Engine Events System & Starting Significant Scheduler Engine Revamp So I made the events system. It works by a class on the JavaScript (engine) layer, and is attached to all entities. There are a couple of functions: on: fires on event once: fires on event only once off: clears event callback clear: clears all callbacks Other entities are allowed to access another entitys events, being able to listen or even emit. A game architecture could work like having “manager” entities at the top level of the game which hold different events. For example, an “InventoryManager” entity could have an event for when an item is picked up, it itself can listen to it, as well as any other things that may find it useful. I’ve also cleaned up the code, and now there is a “game” reference. Eventually, it will have access to more things but as of right now you can access an “inputManager” which holds functions and events for user inputs. It works by attaching a metatable to it and exposing global hidden functions to call to my JavaScript engine code. But a huge problem showed up, the way I was running scripts. Before I thought just a simple coroutine running with a timeout for delays was just fine, but I was super wrong. If a callback from an event is fired and the function wants to do something, like call an external function or wait, it completely breaks. Why? I didn’t know and it took me a lot of time to find out. It’s because the callbacks aren’t a coroutine too. This is when I realized why something like Roblox has a full blown scheduler. So I’ve been planning and starting on the scheduler engine. It has to handle a lot of stuff, including managing when scripts run, including WHEN they want to run (next frame, in 3 seconds, etc) and track if they are causing issues by keeping track of their budget. Everything will need to be in a coroutine coordinated by the scheduler. Including callbacks from events too. It’s going to be pretty complicated I think, requiring a rewrite of the entire scripting system. I also just encountered a lot of bugs. And I fixed the errors from Wasmoon including the entire JS stacktrace for no reason too."}, {"post_id": 39522, "ts": "2026-08-02T15:10:03Z", "hours": 4.0047, "text": "Scripting System Affecting the Game Scripts now can change parts. There are getEntityById and getEntityByName functions now, and a bunch of metatables and stuff to get it working. Now you can query for an entity, and then modify it’s component data with metatables. For example to access or set the position of a part, you can do part.transform.position . The transform finds the transform component and position finds the data entry of position inside the component. This is all done on runtime, with component queries happening dynamically so no manual programming for new components is required. This may affect performance a little bit though. There is a custom Vector3 object now too. Error messages are also now a little less vague but still pretty confusing. I don’t know how to solve that."}, {"post_id": 38632, "ts": "2026-08-01T04:02:22Z", "hours": 6.7036, "text": "Logic & Scripting Prototype Working this was so difficult basically a TON of things needed to be changed for this to work. i had to rework the entire scripting system. i had to also think about how the system is going to work the system i landed on, basically is you can create nodes in the state machine editor, and attach scripts on those states. instead of scripts, im calling the whole package of state machine + scripts a “Logic”. i havent reflected the name everywhere else yet though, and that is probably going to take a really long time as its a major architectural shift that i didn’t plan for beforehand. i made custom nodes in the editor as you can see, a start, end and the script node. there is now a nice dropdown to select the script (a searchbar will be added later) and you can create new scripts. i fixed the code editor to actually load/save code properly. i had to redo how it saved data, so i could communicate the scripts, nodes, connections, etc all to the ScriptingSystem, which starts off at the “Start” node and steps the state once, going into the first node. This part of the code is an absolute MESS. i had a ton of bugs to fix, including state and Svelte firing state over and over again for some reason, Lua issues, dealing with coroutines, dealing with external functions which would change the state and exit the code, etc To add the script, there is now a “Add component” button which you can select the script and select the logic. The state machine handles direct to end, looping nodes, multiple handles, infinite loops going into other nodes, etc. At the end of the video, you can see that i created two states and the second state had two outputs, and the path is a 50/50 random decided by the Lua code to loop back into the first state or exit. Overall, this was really tiring and I’m glad it’s done. The amount of time thinking and debugging isn’t included in the time tracked so yeah :("}, {"post_id": 36862, "ts": "2026-07-29T06:06:34Z", "hours": 2.8403, "text": "Scripting System I added Svelte Flow and the Monaco editor Basically, I think that the system will work mainly off of state machines. Each state will have an attached script. The scripts can decide when to change states. For example, the scripting for a bee in a game could have states for wandering, eating, etc and the scripts handle only it’s own state which could make the code a little cleaner. I also tried making the script editor to look really good. I spent a bunch of time trying to add LSPs and intellisense/autocomplete and syntax and formatting but honestly I give up for now."}, {"post_id": 36780, "ts": "2026-07-29T01:39:01Z", "hours": 3.6069, "text": "Fixed Constraints Getting constraints working was super annoying. Basically, there is a problem where the engine is built around models, and you can spawn in multiple models. When models are spawned in, the parts inside are cloned including their IDs to not lose reference, but this comes with the huge issue as in the backend, the engine actually flattens this structure for more efficient processing of entities, meaning that there will be multiple entities sharing IDs, which is really bad. But creating new IDs is also a huge problem because when we reference it, the ID is not final and changes all the time on load. So instead it does <model_id>:<entity_id>, for targeting. The constraint creator lets you select two points (snapping will be added in the future) and it creates a constraint. This is later processed by the PhysicsSystem detecting the ConstraintComponent. Later there will be debug viewer for constraints. Anyway it was just a lot of annoying work."}, {"post_id": 36178, "ts": "2026-07-28T03:01:00Z", "hours": 1.4972, "text": "Opening Tabs Working There is now a flow for opening and creating tabs, now new tabs can be created and new models in the same way. Opening a tab that is already open just switches to it."}, {"post_id": 35581, "ts": "2026-07-27T03:36:46Z", "hours": 5.8286, "text": "Runtime working This took so long There was just so many things that just weren’t working well together. Especially the data loading code. I initially just made the code use and modify the gameData directly, meaning that if I stop and play again the game would not reset and would probably completely break. But cloning is so difficult. Since the gameData is pretty complicated with nested classes and data, simply JSON.stringify and parse, and even structuredClone didn’t work. I had to use a function to manually copy a lot of things which was really annoying. Another thing that was weird was that parts would only have physics if it was dictated by the parent model, which wasn’t what I wanted. Now there is a function to flatten models, since I want them to kind of just be fancy folders at the end of the day anyway. There was just generally a lot of rework to get everything working, with systems and components working now with a setup phase, and a general frame tick function for systems to process. I also had to add dirty flags to all ComponentDataEntries so other components actually notice changes by OTHER components which was so annoying :(("}, {"post_id": 32943, "ts": "2026-07-22T12:52:14Z", "hours": 3.2719, "text": "Model Thumbnails, Better Highlighting, Reactivity, Sidebar, etc The models now have a place to store a thumbnail, and on save, it autogenerates a new thumbnail. It creates a new ThreeJS scene in the background and adds all the entities to it. For now it only cares about the Transform component, so that’s why all the parts don’t have the correct colors. The face highlighting also is fixed to use ThreeJS’s Line2 so an adjustable line thickness can be used. The face edge highlights are now thicker and a lot easier to see. Reactivity is now fixed, so dragging an object in the editor updates the UI, and the other way around. In the video, you can also see the “–” when multiple objects were selected. It means they have unique values, but they can still be all updated. The system works by storing all seen components in a JS map, and then only filtering for components that appear in ALL of the selected parts. I might change that functionality later but it works for now. I also added the sidebar to the model workspace. I also did work on the ECS system and just engine code in general."}, {"post_id": 32397, "ts": "2026-07-21T15:37:04Z", "hours": 3.5475, "text": "Fixed ECS Data Storage and UI Displays ECS Data I got the UI to display the data for the ECS components. I had some weird bugs, also I messed up earlier on the code to store the data entries for the components (stores things like data type and stuff) and then now it displays on the sidebar. For now I temporarily disabled the code to handle multiple different objects that could have differing component values or different components altogether, because it was causing a bunch of problems cuz the code is not great :("}, {"post_id": 31028, "ts": "2026-07-19T02:40:47Z", "hours": 4.5597, "text": "Started Data and ECS Code I started working on the ECS system, and now the parts spawned are “entities” and they have “components” like a mesh, a transform, and a physics component. The components are queried and cached by the game engine and passed to the “systems” that actually do work with the component data of the entity. I also dealt with a stupid tab bug :((( And generally other engine code."}, {"post_id": 15172, "ts": "2026-06-24T17:28:53Z", "hours": 3.5117, "text": "Worked on Model tab and Working on Refactoring Backend & Renderer Component There’s now a model tab, also I made some more animations and things to make the app more fun to use. I’m also in the process of rebuilding the data types and completely redoing the reusable Renderer component since it was an absolute disaster before."}, {"post_id": 14600, "ts": "2026-06-23T19:23:32Z", "hours": 6.5047, "text": "Completely Revamped UI and Working On Refactoring Entire Engine I really tried making the UI look a lot nicer than the generic UI it was before, and I think it looks pretty nice. I might need to simplify some stuff, but I spent a long time trying to make the UI more welcoming and easy to use and for the UI to seem more playful in a way I guess, than the more mono font boring gray it was last time. I also have started on completely refactoring the engine. The previous data stores and data types were too limiting and I made some bad decisions early on so starting from scratch is kind of necessary"}, {"post_id": 11366, "ts": "2026-06-18T16:29:57Z", "hours": 1.5181, "text": "Added constraints, which took a while because the way I store objects just isn’t sustainable I’m going to redo the entire architechure of this app, mostly the backend because it’s just such a mess. I’ve been piling on features and the technical debt and poor early decisions are catching up to me and it’s making development slower so I’m going to start refactoring a lot of stuff. This should mean everything will be less buggy and make it faster for me to develop new features Now that I know how the app will be I can make smarter decisions"}, {"post_id": 10184, "ts": "2026-06-16T20:00:27Z", "hours": 4.2217, "text": "Reworked script system for better and easier scripting and added some basic part modification functions Basically, before you would need to type something like find(“stud”):setVelocity({10, 10, 10}) or something like that, but with metatables Metatables are kind of weird, but they basically let me return a special object from the find() function, and modify that object to override functions and add new ones. For example, you can override the metatable of custom Vector3 objects to handle addition, so you can do v1 + v2 instead of addVectors(v1, v2) and it’s a lot cleaner and straightforward. This means injecting a bunch of Lua code to set these metatables, and exposing global functions from JS to handle the metatable calls. I also added some event handling (very basic for now) but you can see in the video the part moving from me using WASD You can also see a ton of errors, and I’m trying to fix those right now. I really don’t know why they are here"}, {"post_id": 8431, "ts": "2026-06-14T00:48:37Z", "hours": 3.4253, "text": "Part sidebar shows parent/child relationships now (also had to change backend) I also got save data to serialize, but loading seems to break the other components that rely on the state I also added the cool little part add thing. I changed the font of the app too and stuff. I tried different search things but this one from shadcn-svelte seemed to work the best. I also picked the Lyra theme from shadcn-svelte"}, {"post_id": 8181, "ts": "2026-06-13T17:01:57Z", "hours": 6.7944, "text": "It’s been a while, I kind of forgot to log in the middle I reimplemented parts of the backend to support play testing and handling the state of the current game, keeping track of parts and bodies and scripts Added physics engine (Rapier), requiring keeping track of colliders and physics bodies. Right now only convex meshes for performance meaning concave colliders might be a little broken for now so I plan to add something like VHACD or a more modern alternative to split up complicated meshes into smaller convex and simplified colliders. Added Wasmoon (Lua interpreter) and CodeMirror 6 (code editor component) and some old language parser for Lua to be supported properly, this was also a challenge because Wasmoon just wants to run all the code in one go, so instead there has to be a coroutine setup where the code returns back out temporarily (with a custom wait function that utilized the coroutine function) where then my code ticks every frame to tick the code (while loop) again and also adds the delay if applicable The renderer also needed a few tweaks to get this to work properly Also something kind of weird was I couldn’t get the playTest state to update and propagate throughout the application (thats why the top bar button doesn’t work for now) and honestly I have no idea why and I spent a lot of time debugging it"}, {"post_id": 7159, "ts": "2026-06-11T23:12:48Z", "hours": 0.8367, "text": "Can now apply textures to objects with a new Texture Studio tab :) It’s still really buggy and doesn’t work on CSG objects. It also ignores the coplanar face detection I have right now for simplicity so it only works on ThreeJS primitive face groups as of right now."}, {"post_id": 6571, "ts": "2026-06-11T01:16:28Z", "hours": 2.0747, "text": "I added the framework of a UV atlas editor, and also the painting studio for the texture editor I’m working on the texture system. I’m still working on UVs. It’s honestly really complicated, I have no idea so far how to make it intuitive for users. Auto unwrapping it would not give easy to use results because most assets in this engine are going to be simple. Showing all the vertices on a single atlas also would be very overwhelming. I’m trying to figure something out. It could be determined on a face by face basis, but some faces could be super super weird due to imported meshes or weird CSG operations, which would lead to a mess of a UV unwrap I’m also going to make an editor to assemble the texture atlases by stitching together the individual smaller textures."}, {"post_id": 5862, "ts": "2026-06-09T20:15:37Z", "hours": 2.4597, "text": "Finally got the world studio to work properly, it was because I didn’t assign an ID to the spawned objects And I added the premade things in the scene also be added to the store"}, {"post_id": 5285, "ts": "2026-06-09T00:22:45Z", "hours": 1.6897, "text": "I finally got model saving to sort of work. This required revamping the backend stores to support multiple tabs, and updating the sidebar to actually use the correct tab state data."}, {"post_id": 5199, "ts": "2026-06-08T21:54:17Z", "hours": 0.5725, "text": "Moved 3D rendering code to be shared between both studios via creating a component that applies the shading and stuff and exposing the scene for the individual studios to add objects And added an isolation mode that allows the user to focus a single object or group of objects (whatever the user is selecting) and pressing i to toggle. Useful for like creating constraints and stuff more easily"}, {"post_id": 4853, "ts": "2026-06-08T11:54:31Z", "hours": 0.6908, "text": "Transform controls (now can switch to rotate and scale) And basic undo/redo system that basically just takes the ThreeJS properties and saves it and reapplies it back on undo And delete"}, {"post_id": 4609, "ts": "2026-06-07T23:55:10Z", "hours": 1.5267, "text": "Face selection (took so long) and with face selection I added constraint creation system that just creates a constraint in the center of the faces selected I had to add another face renderer, and then also refactor the stores and how I stored data to get this to work and to keep track of faces selected and stuff which took a long time"}, {"post_id": 4556, "ts": "2026-06-07T22:02:26Z", "hours": 1.1836, "text": "The CSG works really well now. Union operations now maintain materials by keeping track of the mesh IDs and then reassigning the materials afterwards manually. Also some clean up and general improvement"}, {"post_id": 4504, "ts": "2026-06-07T20:51:13Z", "hours": 0.3275, "text": "I’ve fixed the face selection code to check the dot product of the faces to make sure they are actually coplanar. I also added some cleanup functions to perform after the CSG operations to clean up geometry to make it more usable"}, {"post_id": 4494, "ts": "2026-06-07T20:31:36Z", "hours": 1.1086, "text": "Face detection and highlighting working This was pretty complicated because 3D objects are made up of triangles, but the user probably does NOT want to select triangles, but the faces themselves. So basically, I got the face the raycast hit, and then looped through all the triangles of the mesh they are hovering and got the vertex indices and got their positions and turned that into a normal and compared it with the other faces and decided if the normals were close enough"}, {"post_id": 4361, "ts": "2026-06-07T17:35:23Z", "hours": 1.2006, "text": "Added retro shader that quantizes the colors to look more like a limited color space Fixed CSG errors and fixed gizmo disappearing over and over again Added another render pass and raycast to add outline to hovered objects"}, {"post_id": 4305, "ts": "2026-06-07T15:51:36Z", "hours": 0.5503, "text": "I switched the CSG library to Manifold3D and it’s better but the meshes are a bit weird. Hopefully I’ll figure it out later. Also for some reason selection of these meshes and their transform gizmos are really difficult and buggy so I have to fix that. Also I know that there are errors I’m going to fix that now"}, {"post_id": 4280, "ts": "2026-06-07T15:18:31Z", "hours": 1.0586, "text": "CSG is being very annoying. I’m using three-bvh-csg but it’s not really what I need I think. There’s some subtraction artifacts, and most importantly, materials are not preserved I think I’m going to switch to a different library because this one isn’t really working great for me but it is pretty nice and simple"}, {"post_id": 4244, "ts": "2026-06-07T14:14:51Z", "hours": 0.9067, "text": "Added multi part select. Trying to debug why CSG operations not working I honestly don’t know what’s wrong because I followed the example code from the library but it’s not working :("}, {"post_id": 4189, "ts": "2026-06-07T12:39:07Z", "hours": 0.9372, "text": "The sidebars are now synced, but I still need to make them sync correctly to the current tab. Right now they sync exclusively to the model studio. The raycasting & selection of parts work now and I fixed the tabs to not unload and reload on each tab switch which caused data sync issues and lag and instead all tabs stay loaded."}, {"post_id": 4157, "ts": "2026-06-07T11:23:44Z", "hours": 0.7944, "text": "I made the part selected have an outline and made the gizmo work, but currently I can’t select other parts for some reason and I’ve just been debugging that"}, {"post_id": 3649, "ts": "2026-06-06T17:48:15Z", "hours": 1.8894, "text": "I started work on the “World Studio” and “Model Studio” of this game engine/fantasy console. The model studio is where you create the models that you drag into the world studio. I’ve added a gizmo and a way to place the parts and also made a more stylized rendering thing to make it feel more retro in a way."}, {"post_id": 3482, "ts": "2026-06-06T13:13:24Z", "hours": 0.41, "text": "I started the project and installed SvelteKit and added ThreeJS"}]...
|
Title: tinystudio by @ratmuds | Stardance
Devlogs Title: tinystudio by @ratmuds | Stardance
Devlogs:
I started the project and installed SvelteKit and added ThreeJS
I started work on the “World Studio” and “Model Studio” of this game engine/fantasy console. The model studio is where you create the models that you drag into the world studio. I’ve added a gizmo and a way to place the parts and also made a more stylized rendering thing to make it feel more retro in a way.
I made the part selected have an outline and made the gizmo work, but currently I can’t select other parts for some reason and I’ve just been debugging that
The sidebars are now synced, but I still need to make them sync correctly to the current tab. Right now they sync exclusively to the model studio. The raycasting & selection of parts work now and I fixed the tabs to not unload and reload on each tab switch which caused data sync issues and lag and instead all tabs stay loaded.
Added multi part select. Trying to debug why CSG operations not working I honestly don’t know what’s wrong because I followed the example code from the library but it’s not working :(
CSG is being very annoying. I’m using three-bvh-csg but it’s not really what I need I think. There’s some subtraction artifacts, and most importantly, materials are not preserved I think I’m going to switch to a different library because this one isn’t really working great for me but it is pretty nice and simple
I switched the CSG library to Manifold3D and it’s better but the meshes are a bit weird. Hopefully I’ll figure it out later. Also for some reason selection of these meshes and their transform gizmos are really difficult and buggy so I have to fix that. Also I know that there are errors I’m going to fix that now
Added retro shader that quantizes the colors to look more like a limited color space Fixed CSG errors and fixed gizmo disappearing over and over again Added another render pass and raycast to add outline to hovered objects
Face detection and highlighting working This was pretty complicated because 3D objects are made up of triangles, but the user probably does NOT want to select triangles, but the faces themselves. So basically, I got the face the raycast hit, and then looped through all the triangles of the mesh they are hovering and got the vertex indices and got their positions and turned that into a normal and compared it with the other faces and decided if the normals were close enough
I’ve fixed the face selection code to check the dot product of the faces to make sure they are actually coplanar. I also added some cleanup functions to perform after the CSG operations to clean up geometry to make it more usable
The CSG works really well now. Union operations now maintain materials by keeping track of the mesh IDs and then reassigning the materials afterwards manually. Also some clean up and general improvement
Face selection (took so long) and with face selection I added constraint creation system that just creates a constraint in the center of the faces selected I had to add another face renderer, and then also refactor the stores and how I stored data to get this to work and to keep track of faces selected and stuff which took a long time
Transform controls (now can switch to rotate and scale) And basic undo/redo system that basically just takes the ThreeJS properties and saves it and reapplies it back on undo And delete
Moved 3D rendering code to be shared between both studios via creating a component that applies the shading and stuff and exposing the scene for the individual studios to add objects And added an isolation mode that allows the user to focus a single object or group of objects (whatever the user is selecting) and pressing i to toggle. Useful for like creating constraints and stuff more easily
I finally got model saving to sort of work. This required revamping the backend stores to support multiple tabs, and updating the sidebar to actually use the correct tab state data.
Finally got the world studio to work properly, it was because I didn’t assign an ID to the spawned objects And I added the premade things in the scene also be added to the store
I added the framework of a UV atlas editor, and also the painting studio for the texture editor I’m working on the texture system. I’m still working on UVs. It’s honestly really complicated, I have no idea so far how to make it intuitive for users. Auto unwrapping it would not give easy to use results because most assets in this engine are going to be simple. Showing all the vertices on a single atlas also would be very overwhelming. I’m trying to figure something out. It could be determined on a face by face basis, but some faces could be super super weird due to imported meshes or weird CSG operations, which would lead to a mess of a UV unwrap I’m also going to make an editor to assemble the texture atlases by stitching together the individual smaller textures.
Can now apply textures to objects with a new Texture Studio tab :) It’s still really buggy and doesn’t work on CSG objects. It also ignores the coplanar face detection I have right now for simplicity so it only works on ThreeJS primitive face groups as of right now.
It’s been a while, I kind of forgot to log in the middle I reimplemented parts of the backend to support play testing and handling the state of the current game, keeping track of parts and bodies and scripts Added physics engine (Rapier), requiring keeping track of colliders and physics bodies. Right now only convex meshes for performance meaning concave colliders might be a little broken for now so I plan to add something like VHACD or a more modern alternative to split up complicated meshes into smaller convex and simplified colliders. Added Wasmoon (Lua interpreter) and CodeMirror 6 (code editor component) and some old language parser for Lua to be supported properly, this was also a challenge because Wasmoon just wants to run all the code in one go, so instead there has to be a coroutine setup where the code returns back out temporarily (with a custom wait function that utilized the coroutine function) where then my code ticks every frame to tick the code (while loop) again and also adds the delay if applicable The renderer also needed a few tweaks to get this to work properly Also something kind of weird was I couldn’t get the playTest state to update and propagate throughout the application (thats why the top bar button doesn’t work for now) and honestly I have no idea why and I spent a lot of time debugging it
Part sidebar shows parent/child relationships now (also had to change backend) I also got save data to serialize, but loading seems to break the other components that rely on the state I also added the cool little part add thing. I changed the font of the app too and stuff. I tried different search things but this one from shadcn-svelte seemed to work the best. I also picked the Lyra theme from shadcn-svelte
Reworked script system for better and easier scripting and added some basic part modification functions Basically, before you would need to type something like find(“stud”):setVelocity({10, 10, 10}) or something like that, but with metatables Metatables are kind of weird, but they basically let me return a special object from the find() function, and modify that object to override functions and add new ones. For example, you can override the metatable of custom Vector3 objects to handle addition, so you can do v1 + v2 instead of addVectors(v1, v2) and it’s a lot cleaner and straightforward. This means injecting a bunch of Lua code to set these metatables, and exposing global functions from JS to handle the metatable calls. I also added some event handling (very basic for now) but you can see in the video the part moving from me using WASD You can also see a ton of errors, and I’m trying to fix those right now. I really don’t know why they are here
Added constraints, which took a while because the way I store objects just isn’t sustainable I’m going to redo the entire architechure of this app, mostly the backend because it’s just such a mess. I’ve been piling on features and the technical debt and poor early decisions are catching up to me and it’s making development slower so I’m going to start refactoring a lot of stuff. This should mean everything will be less buggy and make it faster for me to develop new features Now that I know how the app will be I can make smarter decisions
Completely Revamped UI and Working On Refactoring Entire Engine I really tried making the UI look a lot nicer than the generic UI it was before, and I think it looks pretty nice. I might need to simplify some stuff, but I spent a long time trying to make the UI more welcoming and easy to use and for the UI to seem more playful in a way I guess, than the more mono font boring gray it was last time. I also have started on completely refactoring the engine. The previous data stores and data types were too limiting and I made some bad decisions early on so starting from scratch is kind of necessary
Worked on Model tab and Working on Refactoring Backend & Renderer Component There’s now a model tab, also I made some more animations and things to make the app more fun to use. I’m also in the process of rebuilding the data types and completely redoing the reusable Renderer component since it was an absolute disaster before.
Started Data and ECS Code I started working on the ECS system, and now the parts spawned are “entities” and they have “components” like a mesh, a transform, and a physics component. The components are queried and cached by the game engine and passed to the “systems” that actually do work with the component data of the entity. I also dealt with a stupid tab bug :((( And generally other engine code.
Fixed ECS Data Storage and UI Displays ECS Data I got the UI to display the data for the ECS components. I had some weird bugs, also I messed up earlier on the code to store the data entries for the components (stores things like data type and stuff) and then now it displays on the sidebar. For now I temporarily disabled the code to handle multiple different objects that could have differing component values or different components altogether, because it was causing a bunch of problems cuz the code is not great :(
Model Thumbnails, Better Highlighting, Reactivity, Sidebar, etc The models now have a place to store a thumbnail, and on save, it autogenerates a new thumbnail. It creates a new ThreeJS scene in the background and adds all the entities to it. For now it only cares about the Transform component, so that’s why all the parts don’t have the correct colors. The face highlighting also is fixed to use ThreeJS’s Line2 so an adjustable line thickness can be used. The face edge highlights are now thicker and a lot easier to see. Reactivity is now fixed, so dragging an object in the editor updates the UI, and the other way around. In the video, you can also see the “–” when multiple objects were selected. It means they have unique values, but they can still be all updated. The system works by storing all seen components in a JS map, and then only filtering for components that appear in ALL of the selected parts. I might change that functionality later but it works for now. I also added the sidebar to the model workspace. I also did work on the ECS system and just engine code in general.
Runtime working This took so long There was just so many things that just weren’t working well together. Especially the data loading code. I initially just made the code use and modify the gameData directly, meaning that if I stop and play again the game would not reset and would probably completely break. But cloning is so difficult. Since the gameData is pretty complicated with nested classes and data, simply JSON.stringify and parse, and even structuredClone didn’t work. I had to use a function to manually copy a lot of things which was really annoying. Another thing that was weird was that parts would only have physics if it was dictated by the parent model, which wasn’t what I wanted. Now there is a function to flatten models, since I want them to kind of just be fancy folders at the end of the day anyway. There was just generally a lot of rework to get everything working, with systems and components working now with a setup phase, and a general frame tick function for systems to process. I also had to add dirty flags to all ComponentDataEntries so other components actually notice changes by OTHER components which was so annoying :((
Opening Tabs Working There is now a flow for opening and creating tabs, now new tabs can be created and new models in the same way. Opening a tab that is already open just switches to it.
Fixed Constraints Getting constraints working was super annoying. Basically, there is a problem where the engine is built around models, and you can spawn in multiple models. When models are spawned in, the parts inside are cloned including their IDs to not lose reference, but this comes with the huge issue as in the backend, the engine actually flattens this structure for more efficient processing of entities, meaning that there will be multiple entities sharing IDs, which is really bad. But creating new IDs is also a huge problem because when we reference it, the ID is not final and changes all the time on load. So instead it does <model_id>:<entity_id>, for targeting. The constraint creator lets you select two points (snapping will be added in the future) and it creates a constraint. This is later processed by the PhysicsSystem detecting the ConstraintComponent. Later there will be debug viewer for constraints. Anyway it was just a lot of annoying work.
Scripting System I added Svelte Flow and the Monaco editor Basically, I think that the system will work mainly off of state machines. Each state will have an attached script. The scripts can decide when to change states. For example, the scripting for a bee in a game could have states for wandering, eating, etc and the scripts handle only it’s own state which could make the code a little cleaner. I also tried making the script editor to look really good. I spent a bunch of time trying to add LSPs and intellisense/autocomplete and syntax and formatting but honestly I give up for now.
Logic & Scripting Prototype Working this was so difficult basically a TON of things needed to be changed for this to work. i had to rework the entire scripting system. i had to also think about how the system is going to work the system i landed on, basically is you can create nodes in the state machine editor, and attach scripts on those states. instead of scripts, im calling the whole package of state machine + scripts a “Logic”. i havent reflected the name everywhere else yet though, and that is probably going to take a really long time as its a major architectural shift that i didn’t plan for beforehand. i made custom nodes in the editor as you can see, a start, end and the script node. there is now a nice dropdown to select the script (a searchbar will be added later) and you can create new scripts. i fixed the code editor to actually load/save code properly. i had to redo how it saved data, so i could communicate the scripts, nodes, connections, etc all to the ScriptingSystem, which starts off at the “Start” node and steps the state once, going into the first node. This part of the code is an absolute MESS. i had a ton of bugs to fix, including state and Svelte firing state over and over again for some reason, Lua issues, dealing with coroutines, dealing with external functions which would change the state and exit the code, etc To add the script, there is now a “Add component” button which you can select the script and select the logic. The state machine handles direct to end, looping nodes, multiple handles, infinite loops going into other nodes, etc. At the end of the video, you can see that i created two states and the second state had two outputs, and the path is a 50/50 random decided by the Lua code to loop back into the first state or exit. Overall, this was really tiring and I’m glad it’s done. The amount of time thinking and debugging isn’t included in the time tracked so yeah :(
Scripting System Affecting the Game Scripts now can change parts. There are getEntityById and getEntityByName functions now, and a bunch of metatables and stuff to get it working. Now you can query for an entity, and then modify it’s component data with metatables. For example to access or set the position of a part, you can do part.transform.position . The transform finds the transform component and position finds the data entry of position inside the component. This is all done on runtime, with component queries happening dynamically so no manual programming for new components is required. This may affect performance a little bit though. There is a custom Vector3 object now too. Error messages are also now a little less vague but still pretty confusing. I don’t know how to solve that.
Engine Events System & Starting Significant Scheduler Engine Revamp So I made the events system. It works by a class on the JavaScript (engine) layer, and is attached to all entities. There are a couple of functions: on: fires on event once: fires on event only once off: clears event callback clear: clears all callbacks Other entities are allowed to access another entitys events, being able to listen or even emit. A game architecture could work like having “manager” entities at the top level of the game which hold different events. For example, an “InventoryManager” entity could have an event for when an item is picked up, it itself can listen to it, as well as any other things that may find it useful. I’ve also cleaned up the code, and now there is a “game” reference. Eventually, it will have access to more things but as of right now you can access an “inputManager” which holds functions and events for user inputs. It works by attaching a metatable to it and exposing global hidden functions to call to my JavaScript engine code. But a huge problem showed up, the way I was running scripts. Before I thought just a simple coroutine running with a timeout for delays was just fine, but I was super wrong. If a callback from an event is fired and the function wants to do something, like call an external function or wait, it completely breaks. Why? I didn’t know and it took me a lot of time to find out. It’s because the callbacks aren’t a coroutine too. This is when I realized why something like Roblox has a full blown scheduler. So I’ve been planning and starting on the scheduler engine. It has to handle a lot of stuff, including managing when scripts run, including WHEN they want to run (next frame, in 3 seconds, etc) and track if they are causing issues by keeping track of their budget. Everything will need to be in a coroutine coordinated by the scheduler. Including callbacks from events too. It’s going to be pretty complicated I think, requiring a rewrite of the entire scripting system. I also just encountered a lot of bugs. And I fixed the errors from Wasmoon including the entire JS stacktrace for no reason too.
Added CSG Operations I added CSG operations, using the Manifold library. It makes it a bit simpler, making watertight meshes and giving back the geometry for me to make a custom mesh in ThreeJS. The reason it took so long was because I had to add cascading changes to a lot of the data structures to support this custom geometry. I also added a little loading thing at the bottom right for CSG operations. As of right now Union and Subtract are supported. Materials are not preserved as of right now, due to the simplistic way I’m handling materials but when I finish building out the materials system I basically just need to get the triangle references out of Manifold and relink them to the correct materials.
Script Scheduling Engine Revamp The entire scripting engine has been redone. It was a lot of cascading changes again, with now each “Scope” having it’s own scheduler. A “scope” is a single logic component that gets attached to entities. How it works now The scheduler handles the Lua engine stuff. It wraps the main script around into a coroutine automatically now, and extracts the coroutine into a thread. It then creates a scheduler job object, pending into the queue. The scheduler then gets stepped, and initializes the jobs into the main queue and steps them. By stepping them, it resumes the coroutine until the script either ends or manually pauses the coroutine itself (usually done with a predefined “wait” function). I think this is very similar to how Roblox handles it’s script scheduler, although Roblox’s is of course much more complicated. Handling the events and callbacks was much more difficult though. Each of those ALSO need it’s own thread to run to access coroutine related functions and to access data (otherwise very weird errors will happen, like calling code over a boundary or something). This all gets added as a scheduler job, and that allows us to record telemetry data. Eventually, threads can be assigned a “budget”, where they can be stalled if they consume more than the allotted time or even do things like infinite loop detection, etc. There was just generally tedious work that was annoying.
Scope Leaking Bug Fixed, Mouse Input, Scripting Improvements, ECS & Events Scripting Improvements and Fixes, Cameras There was an issue where I used a single variable to hold the last used scope before and forgot to change it to support multiple scripts. That is fixed now and scopes aren’t mixed weirdly anymore. There is now mouse functions and events Events can be called like part.physics:on("touched") instead of part:on("Physics.touched") for clarity Cameras are added, game wide function to change active camera, and camera system that updates the camera things bidirectionally supporting multiple camera types.
Finalized Project I added a projects manager and generally just cleaned up the repository. Then created three basic demos, like a basic moon landing game, a very basic parkour game, and a physics sandbox. And finished the README
Redid UI styling to feel more blocky I rewrote the UI to look less bubbly I guess, now it looks more like lego and stuff and more space for work instead of tons of padding
Ships:
I made a game engine that I tried to make the UI look nice and feel accessible. I wanted to design it around what I liked about other game engines like Roblox Studio and Godot, and try and make it as easy as possible to make prototypes of games quickly. The decision to not let any 3D imports was intentional to keep the engine style of more retro, as you can see by the rendering style. Instead, you can fuse and subtract shapes together with CSG. The flow editor state machines fully work, and was inspired by Playmaker. The scripting system is a little bit janky sometimes but it somewhat works. The scripting system has a basic scheduler and profiler similar to Roblox’s Luau scheduler but without the complexity of CPU budget. The engine uses a custom ECS that uses Svelte Runes to provide reactivity to the engine sidebars and editor. There is also a basic UI system, and physics. There are three demo projects to try out too....
|
1793005014.9037464
|
1793091414.9037464
|
|
36236
|
tmi.net by @tmi_net | Stardance
|
tmi_net
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tmi.net by @tmi_net | Stardance
|
1792698721.990265
|
1793303521.990265
|
|
10509
|
tmp by @dz | Stardance
|
dz
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tmp by @dz | Stardance
|
1792493345.407135
|
1793098145.407135
|
|
56442
|
tnest by @frog | Stardance
|
frog
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tnest by @frog | Stardance
|
1792662676.1513145
|
1793267476.1513145
|
|
56443
|
tnest by @frog | Stardance
|
frog
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tnest by @frog | Stardance
|
1792662676.9732087
|
1793267476.9732087
|
|
24919
|
to delete by @unciaur | Stardance
|
unciaur
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: to delete by @unciaur | Stardance
|
1792752699.8860176
|
1793357499.8860176
|
|
5411
|
to do app (with infinite subtasks!!!) by @dfe | St to do app (with infinite subtasks!!!) by @dfe | Stardance...
|
dfe
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: to do app (with infinite subtasks!!!) by @d Title: to do app (with infinite subtasks!!!) by @dfe | Stardance...
|
1792918194.0563252
|
1793782194.0563252
|
|
62964
|
to do list by @hansika_p | Stardance
|
hansika_p
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: to do list by @hansika_p | Stardance
|
1793047921.4515655
|
1793652721.4515655
|
|
45545
|
to do list by @umar7 | Stardance
|
umar7
|
1
|
2.0
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-08T15:55:24Z", "hours": 2.0, "multiplier": 1.11, "payout": 2, "blessing": "neutral", "text": "i created a simple To-do list which is locally stored in the browsers storage so even if the browser is closed or refreshed the tasks are still there", "repo": "https://github.com/umarxpro7-ai/todolist", "demo": "https://to-do-list6767.netlify.app/"}]...
|
[{"post_id": 43331, "ts": "202 [{"post_id": 43331, "ts": "2026-08-08T15:07:46Z", "hours": 2.2344, "text": "i have created a simple to-do list which can be marked as checked and unchecked it also saves the tasks in the browser so even if the browser is closed or refreshed it does not delete the tasks"}]...
|
Title: to do list by @umar7 | Stardance
Devlogs:
Title: to do list by @umar7 | Stardance
Devlogs:
i have created a simple to-do list which can be marked as checked and unchecked it also saves the tasks in the browser so even if the browser is closed or refreshed it does not delete the tasks
Ships:
i created a simple To-do list which is locally stored in the browsers storage so even if the browser is closed or refreshed the tasks are still there...
|
1793084004.164913
|
1793170404.164913
|
|
45162
|
to-do list by @Mohamed_Hamza | Stardance
|
Mohamed_Hamza
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-07T16:22:02Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "a to-do list", "repo": "https://github.com/hamzafhf2022-byte/To-do-list", "demo": "https://hamzafhf2022-byte.github.io/To-do-list/"}]...
|
[{"post_id": 42727, "ts": "202 [{"post_id": 42727, "ts": "2026-08-07T16:20:17Z", "hours": 0.4503, "text": "A to-do list"}]...
|
Title: to-do list by @Mohamed_Hamza | Stardance
D Title: to-do list by @Mohamed_Hamza | Stardance
Devlogs:
A to-do list
Ships:
a to-do list...
|
1792997390.6871407
|
1793083790.6871407
|
|
68863
|
toad runner by @JP | Stardance
|
JP
|
1
|
11.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-12T15:25:58Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a 2D platformer game that is easy to play and learn. The most challenging part of this project was creating the levels. It was not easy finding inspiration to create these levels, but I think I tried my best 🥲. I’m proud of me completing the project; seeing it actually work made me super happy. This is just an easy game where you can collect apples, jump on enemies to kill them, and touch them to get hurt by them.", "repo": "https://github.com/JP-CM237/toad-runner", "demo": "https://itch.io/embed-upload/19698628?color=333333"}]...
|
[{"post_id": 79058, "ts": "202 [{"post_id": 79058, "ts": "2026-10-12T15:04:03Z", "hours": 9.0036, "text": "I am finally done with Toad runner."}, {"post_id": 78159, "ts": "2026-10-09T20:30:30Z", "hours": 2.3119, "text": "I just finished working on some character movements, such as moving left, right and up"}]...
|
Title: toad runner by @JP | Stardance
Devlogs:
I Title: toad runner by @JP | Stardance
Devlogs:
I just finished working on some character movements, such as moving left, right and up
I am finally done with Toad runner.
Ships:
I made a 2D platformer game that is easy to play and learn. The most challenging part of this project was creating the levels. It was not easy finding inspiration to create these levels, but I think I tried my best 🥲. I’m proud of me completing the project; seeing it actually work made me super happy. This is just an easy game where you can collect apples, jump on enemies to kill them, and touch them to get hurt by them....
|
1793008294.7767184
|
1793094694.7767184
|
|
62658
|
todo by @leila | Stardance
|
leila
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: todo by @leila | Stardance
|
1793047707.1151283
|
1793652507.1151283
|
|
53454
|
todolist by @anujrotkar | Stardance
|
anujrotkar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: todolist by @anujrotkar | Stardance
|
1792749121.2544596
|
1793353921.2544596
|
|
3826
|
todox by @divyanshxd | Stardance
|
divyanshxd
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: todox by @divyanshxd | Stardance
|
1792522142.3699837
|
1793126942.3699837
|
|
24115
|
tokenscope by @DevaanshPathak | Stardance
|
DevaanshPathak
|
0
|
4.32
|
0
|
[]
|
[{"post_id": 21328, "ts": "202 [{"post_id": 21328, "ts": "2026-07-03T06:37:50Z", "hours": 1.0786, "text": "tokenscope v0.2.0 is the second public release and the first release focused on making the app useful outside a single interactive local-tokenizer workflow. v0.1.0 established the terminal UI, tokenizer inspection, exports, comparison mode, and the binary release pipeline. v0.2.0 expands that base into a more scriptable, configurable, and measurable tool. Release goals The main goal for v0.2.0 was to remove friction around repeated tokenizer analysis. The app already had a broad inspection surface, but common workflows still required too much manual setup: choosing the same tokenizer every time, keeping budget defaults in memory, copying token IDs manually, benchmarking outside the app, or writing small wrapper scripts around exports. This release focused on loading common tokenizers more quickly, making repeated analysis reproducible through config files, supporting CLI and CI workflows with stdin input, adding benchmark visibility inside the TUI, surfacing budget pressure earlier, and keeping release notes, docs, and build outputs organized for future releases. Optional HuggingFace Hub loading v0.2.0 adds explicit Hub loading through –hub, default_hub_model, and the TUI folder browser’s Load from Hub controls. This is intentionally opt-in. tokenscope still stays local-first and does not make runtime network calls unless the user requests a Hub tokenizer. The implementation routes Hub tokenizers through the same tokenizer engine abstraction as local tokenizers, which keeps downstream analysis, comparison, exports, and metadata behavior consistent. Configuration files The new config.py module adds .tokenscoperc and tokenscope.json support. Config files can define defaults for tokenizer paths, Hub model IDs, compare tokenizers, corpus and batch paths, export format, budget, Hub cache location, and special-token encoding. The init-config subcommand writes a starter config file, which makes it easier to standardize a workspace without memorizing every CLI flag. Headless stdin analysis Headless analyze mode can now read from stdin with –stdin, so shell pipelines and CI scripts can pass prompts directly into tokenscope. Example command: cat prompt.txt | python main.py analyze –tokenizer ./gpt2-local –stdin –budget 8192 The headless path also now honors config defaults when CLI arguments are omitted, which makes automated use less repetitive. Benchmark tab The new Benchmark tab measures tokenization throughput for the active input and reports tokens per second and characters per second. In compare mode, the benchmark can show primary-vs-compare speed deltas in the same interface where token boundaries and IDs are already being inspected. This is meant as a practical local measurement, not a lab-grade benchmark suite. It is useful for quickly spotting large tokenizer performance differences while testing real prompts. Budget alerts Budget usage is now more visible. The header includes an ambient budget badge, and the Stats panel shows a dedicated budget row. Both update based on utilization thresholds: green below 80 percent, yellow from 80 to 95 percent, red above 95 percent, and bold red above 100 percent. The intent is to make over-budget input obvious without forcing users to keep the Budget tab open. Clipboard support Ctrl+Y copies the current primary token IDs to the clipboard as a space-separated list. This is a small feature, but it removes an annoying manual step when moving token IDs into tests, issue reports, or comparison notes. Cost profile persistence The Cost tab now supports persistent user-defined pricing profiles. Project state was moved to schema version 2 so pricing profile information can round-trip with saved projects while still loading older v1 project files safely."}, {"post_id": 16950, "ts": "2026-06-27T14:58:08Z", "hours": 2.1336, "text": "tokenscope v0.1 is the first public release of the project: an offline terminal app for inspecting local HuggingFace tokenizer files without pulling in transformers or making runtime network calls. The goal for this release was to make tokenization visible. Tokenizers are often treated like a black box, but small differences in splits, offsets, special tokens, byte handling, and chat formatting can change cost, context usage, retrieval behavior, and model output quality. v0.1 turns those details into something you can inspect from a terminal. What Shipped The core TUI now loads local tokenizer folders, direct tokenizer.json files, WordPiece vocab files, and BPE vocab/merge layouts. Once loaded, the app shows colored token spans, token IDs, offsets, byte representations, text slices, vocabulary stats, and per-token details. The selected-token inspector was one of the most useful additions. It tracks the current token, supports keyboard navigation with [ and ] , syncs with token-table row selection, and shows the token text, ID, offsets, bytes, display width, local frequency, vocabulary membership, and a best-effort BPE merge tree. Compare mode became a major part of the release. Two tokenizers can now be loaded side by side against the same input, with aligned token views, token-count deltas, compression deltas, boundary differences, token differences, ID differences, corpus comparison, and tokenizer metadata inspection. The analysis surface grew beyond single prompts. v0.1 includes corpus analysis, batch prompt analysis, prompt budget checks, chat-template budget rendering, tokenizer pipeline debugging, tokenizer diffing, prompt packing simulation, regression suites, Unicode inspection, RAG chunk analysis, distribution summaries, cost estimates, and tokenizer repair suggestions. Exports were expanded to JSON, CSV, Markdown, and HTML. The headless analyze command makes the same analysis useful in scripts and CI, including budget and regression failure modes."}, {"post_id": 13812, "ts": "2026-06-22T17:09:19Z", "hours": 1.1033, "text": "I have started building tokenscope and here’s the idea: tokenscope is an offline terminal tokenizer explorer for local HuggingFace tokenizer files. It loads tokenizer folders from disk, lets you type text interactively, and shows colored token spans, token IDs, vocabulary stats, token inspection, decode round-trip checks, special-token metadata, prompt budgets, corpus analysis, BPE merge reconstruction, vocabulary search, and optional side-by-side tokenizer comparison."}]...
|
Title: tokenscope by @DevaanshPathak | Stardance
Title: tokenscope by @DevaanshPathak | Stardance
Devlogs:
I have started building tokenscope and here’s the idea: tokenscope is an offline terminal tokenizer explorer for local HuggingFace tokenizer files. It loads tokenizer folders from disk, lets you type text interactively, and shows colored token spans, token IDs, vocabulary stats, token inspection, decode round-trip checks, special-token metadata, prompt budgets, corpus analysis, BPE merge reconstruction, vocabulary search, and optional side-by-side tokenizer comparison.
tokenscope v0.1 is the first public release of the project: an offline terminal app for inspecting local HuggingFace tokenizer files without pulling in transformers or making runtime network calls. The goal for this release was to make tokenization visible. Tokenizers are often treated like a black box, but small differences in splits, offsets, special tokens, byte handling, and chat formatting can change cost, context usage, retrieval behavior, and model output quality. v0.1 turns those details into something you can inspect from a terminal. What Shipped The core TUI now loads local tokenizer folders, direct tokenizer.json files, WordPiece vocab files, and BPE vocab/merge layouts. Once loaded, the app shows colored token spans, token IDs, offsets, byte representations, text slices, vocabulary stats, and per-token details. The selected-token inspector was one of the most useful additions. It tracks the current token, supports keyboard navigation with [ and ] , syncs with token-table row selection, and shows the token text, ID, offsets, bytes, display width, local frequency, vocabulary membership, and a best-effort BPE merge tree. Compare mode became a major part of the release. Two tokenizers can now be loaded side by side against the same input, with aligned token views, token-count deltas, compression deltas, boundary differences, token differences, ID differences, corpus comparison, and tokenizer metadata inspection. The analysis surface grew beyond single prompts. v0.1 includes corpus analysis, batch prompt analysis, prompt budget checks, chat-template budget rendering, tokenizer pipeline debugging, tokenizer diffing, prompt packing simulation, regression suites, Unicode inspection, RAG chunk analysis, distribution summaries, cost estimates, and tokenizer repair suggestions. Exports were expanded to JSON, CSV, Markdown, and HTML. The headless analyze command makes the same analysis useful in scripts and CI, including budget and regression failure modes.
tokenscope v0.2.0 is the second public release and the first release focused on making the app useful outside a single interactive local-tokenizer workflow. v0.1.0 established the terminal UI, tokenizer inspection, exports, comparison mode, and the binary release pipeline. v0.2.0 expands that base into a more scriptable, configurable, and measurable tool. Release goals The main goal for v0.2.0 was to remove friction around repeated tokenizer analysis. The app already had a broad inspection surface, but common workflows still required too much manual setup: choosing the same tokenizer every time, keeping budget defaults in memory, copying token IDs manually, benchmarking outside the app, or writing small wrapper scripts around exports. This release focused on loading common tokenizers more quickly, making repeated analysis reproducible through config files, supporting CLI and CI workflows with stdin input, adding benchmark visibility inside the TUI, surfacing budget pressure earlier, and keeping release notes, docs, and build outputs organized for future releases. Optional HuggingFace Hub loading v0.2.0 adds explicit Hub loading through –hub, default_hub_model, and the TUI folder browser’s Load from Hub controls. This is intentionally opt-in. tokenscope still stays local-first and does not make runtime network calls unless the user requests a Hub tokenizer. The implementation routes Hub tokenizers through the same tokenizer engine abstraction as local tokenizers, which keeps downstream analysis, comparison, exports, and metadata behavior consistent. Configuration files The new config.py module adds .tokenscoperc and tokenscope.json support. Config files can define defaults for tokenizer paths, Hub model IDs, compare tokenizers, corpus and batch paths, export format, budget, Hub cache location, and special-token encoding. The init-config subcommand writes a starter config file, which makes it easier to standardize a workspace without memorizing every CLI flag. Headless stdin analysis Headless analyze mode can now read from stdin with –stdin, so shell pipelines and CI scripts can pass prompts directly into tokenscope. Example command: cat prompt.txt | python main.py analyze –tokenizer ./gpt2-local –stdin –budget 8192 The headless path also now honors config defaults when CLI arguments are omitted, which makes automated use less repetitive. Benchmark tab The new Benchmark tab measures tokenization throughput for the active input and reports tokens per second and characters per second. In compare mode, the benchmark can show primary-vs-compare speed deltas in the same interface where token boundaries and IDs are already being inspected. This is meant as a practical local measurement, not a lab-grade benchmark suite. It is useful for quickly spotting large tokenizer performance differences while testing real prompts. Budget alerts Budget usage is now more visible. The header includes an ambient budget badge, and the Stats panel shows a dedicated budget row. Both update based on utilization thresholds: green below 80 percent, yellow from 80 to 95 percent, red above 95 percent, and bold red above 100 percent. The intent is to make over-budget input obvious without forcing users to keep the Budget tab open. Clipboard support Ctrl+Y copies the current primary token IDs to the clipboard as a space-separated list. This is a small feature, but it removes an annoying manual step when moving token IDs into tests, issue reports, or comparison notes. Cost profile persistence The Cost tab now supports persistent user-defined pricing profiles. Project state was moved to schema version 2 so pricing profile information can round-trip with saved projects while still loading older v1 project files safely....
|
1792925639.2975965
|
1793789639.2975965
|
|
42257
|
tomato's website by @taiyo_tomato | Stardance
|
taiyo_tomato
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: tomato's website by @taiyo_tomato | Sta Title: tomato's website by @taiyo_tomato | Stardance...
|
1792504164.6551301
|
1793108964.6551301
|
|
43183
|
tome by @static_noise | Stardance
|
static_noise
|
0
|
2.0
|
0
|
[]
|
[{"post_id": 42873, "ts": "202 [{"post_id": 42873, "ts": "2026-08-07T20:38:04Z", "hours": 1.4722, "text": "shaping the project, burned out"}, {"post_id": 39661, "ts": "2026-08-02T19:47:28Z", "hours": 0.5311, "text": "Started work on TOME, so, tome is designed to be easily embeddable (because I literally saw how shitty toml++ is to embed) and being easy to write and read"}]...
|
Title: tome by @static_noise | Stardance
Devlogs: Title: tome by @static_noise | Stardance
Devlogs:
Started work on TOME, so, tome is designed to be easily embeddable (because I literally saw how shitty toml++ is to embed) and being easy to write and read
shaping the project, burned out...
|
1792536813.1521797
|
1793141613.1521797
|
|
54153
|
toms os by @thomasclayton7 | Stardance
|
thomasclayton7
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: toms os by @thomasclayton7 | Stardance
|
1792777965.9663455
|
1793382765.9663455
|
|
43434
|
toobOS by @toobcodepro | Stardance
|
toobcodepro
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: toobOS by @toobcodepro | Stardance
|
1792547441.236575
|
1793152241.236575
|