|
40087
|
Untitled project by @tulipsfr | Stardance
|
tulipsfr
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @tulipsfr | Stardance
|
1793271274.0367377
|
1793876074.0367377
|
|
22850
|
My own site! by @tukazeyid | Stardance
|
tukazeyid
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @tukazeyid | Stardance
|
1793469225.9290488
|
1794074025.9290488
|
|
45067
|
Tuesday Machine by @tuesday-keep-lion | Stardance
|
tuesday-keep-lion
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Tuesday Machine by @tuesday-keep-lion | Sta Title: Tuesday Machine by @tuesday-keep-lion | Stardance...
|
1793311013.624991
|
1793915813.624991
|
|
20216
|
Frictionless by @tudormarchis2009 | Stardance
|
tudormarchis2009
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @tudormarchis2009 | Stardan Title: Frictionless by @tudormarchis2009 | Stardance...
|
1793137833.64147
|
1793742633.64147
|
|
61709
|
My awesome macropad! by @tudordulcu402 | Stardance
|
tudordulcu402
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @tudordulcu402 | St Title: My awesome macropad! by @tudordulcu402 | Stardance...
|
1793040799.540711
|
1793645599.540711
|
|
2211
|
Propheus by @tudor | Stardance
|
tudor
|
0
|
3.0
|
0
|
[]
|
[{"post_id": 8401, "ts": "2026 [{"post_id": 8401, "ts": "2026-06-13T23:33:25Z", "hours": 1.0, "text": "Added saving functionality and a testing UI to toggle online mode."}, {"post_id": 8355, "ts": "2026-06-13T21:44:38Z", "hours": 0.0, "text": "For the last hour or so I had realized a big problem with the current implementation, which is that the Stardance app uses Turbo, which apparently in this case acts like a SPA (Single page application). Truth be told, I had to make more use of AI here than I usually would (however I did not copy paste code or add anything which I didn’t first check or understand) as I have not been personally faced with this problem before, however I was aware of this challenge from previous projects or blogs read. The problem was that if I just kept creating a new loop on every navigation to circumvent this, old loops would end up never finishing and would just keep waiting for new posts to load (which never happened), inevitably leading to a memory leak eventually. The fix ended up being using document.documentElement instead of document.body for the mutation because (according to GPT, however I will write a comment in case I come across any documentation) Turbo will replace stuff of the body inside of the whole HTML of the page (so, to ), which triggers a mutation when watching documentElement, however if we watch document.body, and Turbo replaces that all together, MutationObserver stays attached to the old, now removed, node, which means we are basically watching a dead node for new posts (again, take this with a grain of salt). This means I could also scrap the waitForElm function and shorten the code. There are likely many better ways to do this (which are welcome in the comments), but for someone who is still a beginner in extension and web development overall, I am just happy that it works and that AI helped me discover something new that I think is a challenge for many extensions that operate on modern web applications such as Youtube, X etc. Now free of bugs, I will continue working on the UI."}, {"post_id": 8268, "ts": "2026-06-13T19:16:00Z", "hours": 1.0, "text": "I decided to change the location of the button as I spent too much time being unsuccessful in trying to line it up with the others. I also made it such that newly loaded posts are also updated with this button via the MutationObserver API (Thank you StackOverflow). This is how it looks like so far. Next I will focus on making an UI to add actual saving functionality to the buttons and make some kind of server to be able to store bookmarks “in the cloud”."}, {"post_id": 8161, "ts": "2026-06-13T16:37:24Z", "hours": 1.0, "text": "Managed to write it up a bit, now added a favorite button, however I am facing a small problem with alignment relative to the other SVGS. Will focus on debugging this for now, and then continue towards actually making an UI to browse saved posts or even make a small server in Python to allow users save them remotely."}, {"post_id": 8089, "ts": "2026-06-13T14:42:24Z", "hours": 0.0, "text": "I have now started work on this by creating the manifest.json file and some other boilerplate like a very small README.md and added the MIT license. Next I will start to look into how the main home page of Stardance gets posts and how I can add new stuff to it. Will start by doing a bookmarking feature (like adding a favorite button that you usually see on social media). This is my first time making an extension so it will hopefully be fun and interesting."}]...
|
Title: Propheus by @tudor | Stardance
Devlogs:
I Title: Propheus by @tudor | Stardance
Devlogs:
I have now started work on this by creating the manifest.json file and some other boilerplate like a very small README.md and added the MIT license. Next I will start to look into how the main home page of Stardance gets posts and how I can add new stuff to it. Will start by doing a bookmarking feature (like adding a favorite button that you usually see on social media). This is my first time making an extension so it will hopefully be fun and interesting.
Managed to write it up a bit, now added a favorite button, however I am facing a small problem with alignment relative to the other SVGS. Will focus on debugging this for now, and then continue towards actually making an UI to browse saved posts or even make a small server in Python to allow users save them remotely.
I decided to change the location of the button as I spent too much time being unsuccessful in trying to line it up with the others. I also made it such that newly loaded posts are also updated with this button via the MutationObserver API (Thank you StackOverflow). This is how it looks like so far. Next I will focus on making an UI to add actual saving functionality to the buttons and make some kind of server to be able to store bookmarks “in the cloud”.
For the last hour or so I had realized a big problem with the current implementation, which is that the Stardance app uses Turbo, which apparently in this case acts like a SPA (Single page application). Truth be told, I had to make more use of AI here than I usually would (however I did not copy paste code or add anything which I didn’t first check or understand) as I have not been personally faced with this problem before, however I was aware of this challenge from previous projects or blogs read. The problem was that if I just kept creating a new loop on every navigation to circumvent this, old loops would end up never finishing and would just keep waiting for new posts to load (which never happened), inevitably leading to a memory leak eventually. The fix ended up being using document.documentElement instead of document.body for the mutation because (according to GPT, however I will write a comment in case I come across any documentation) Turbo will replace stuff of the body inside of the whole HTML of the page (so, to ), which triggers a mutation when watching documentElement, however if we watch document.body, and Turbo replaces that all together, MutationObserver stays attached to the old, now removed, node, which means we are basically watching a dead node for new posts (again, take this with a grain of salt). This means I could also scrap the waitForElm function and shorten the code. There are likely many better ways to do this (which are welcome in the comments), but for someone who is still a beginner in extension and web development overall, I am just happy that it works and that AI helped me discover something new that I think is a challenge for many extensions that operate on modern web applications such as Youtube, X etc. Now free of bugs, I will continue working on the UI.
Added saving functionality and a testing UI to toggle online mode....
|
1792947297.3127134
|
1793811297.3127134
|
|
15244
|
My awesome macropad! by @tuckerbratton | Stardance
|
tuckerbratton
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @tuckerbratton | St Title: My awesome macropad! by @tuckerbratton | Stardance...
|
1793231498.6272426
|
1793836298.6272426
|
|
18820
|
Untitled project by @tuba | Stardance
|
tuba
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @tuba | Stardance
|
1793533840.9448977
|
1794138640.9448977
|
|
66079
|
My very own WebOS by @ttyl091209 | Stardance
|
ttyl091209
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @ttyl091209 | Stardanc Title: My very own WebOS by @ttyl091209 | Stardance...
|
1793094663.61829
|
1793699463.61829
|
|
7168
|
rat by @ttyChud | Stardance
|
ttyChud
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: rat by @ttyChud | Stardance
|
1792925610.2864182
|
1793789610.2864182
|
|
9197
|
rustisay by @ttyChud | Stardance
|
ttyChud
|
2
|
10.0
|
82
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T10:00:22Z", "hours": 6.0, "multiplier": 5.85, "payout": 33, "blessing": "neutral", "text": "add the ability to use it in web instead of downloading it even tho both option are available and added the ability to output the generated the gif and be able to save it localy try fixing some windows issuess but i dont have an access so i dont know", "repo": "https://github.com/Himanshu121865/rustisay", "demo": "https://himanshu121865.github.io/rustisay/"}, {"ship_num": 2, "ts": "2026-06-08T19:56:24Z", "hours": 4.0, "multiplier": 8.56, "payout": 49, "blessing": "neutral", "text": "It’s a gif to ascii converter. it uses edge detection for more crisp ascii art, it automatically support color but if u wanna turn them off just use color flag . i have also added multiple txt support you can choose as per ur preference. for installation just do cargo install rustisay that’s it,", "repo": "https://github.com/Himanshu121865/rustisay", "demo": "https://himanshu121865.github.io/rustisay/"}]...
|
[{"post_id": 48008, "ts": "202 [{"post_id": 48008, "ts": "2026-08-16T09:12:34Z", "hours": 5.6686, "text": "it’s been such a long time since i have worked on this project i been wanting to add some feature like output to gif and a web ui using wasm so it’s finaly here i have add the abiltiy to save the output ascii to a gif file and i have also add a web version with rust wasm which is really fast but not as fast as when u install it in ur pc"}, {"post_id": 5099, "ts": "2026-06-08T19:45:07Z", "hours": 3.3975, "text": "ok, so finally it works now i have added only one algo and it edge detection. i wanted to start from and easy algo but f*ck it. it’s work but i didn’t add a way to output it to gif or anything."}, {"post_id": 3411, "ts": "2026-06-06T10:19:34Z", "hours": 0.7828, "text": "Im working on a gif to ascii art converter in rust. user can upload any gif they want and choose some options how they want to get converted. then it can play the gif as ascii or save at a prescribed output dir"}]...
|
Title: rustisay by @ttyChud | Stardance
Devlogs:
Title: rustisay by @ttyChud | Stardance
Devlogs:
Im working on a gif to ascii art converter in rust. user can upload any gif they want and choose some options how they want to get converted. then it can play the gif as ascii or save at a prescribed output dir
ok, so finally it works now i have added only one algo and it edge detection. i wanted to start from and easy algo but f*ck it. it’s work but i didn’t add a way to output it to gif or anything.
it’s been such a long time since i have worked on this project i been wanting to add some feature like output to gif and a web ui using wasm so it’s finaly here i have add the abiltiy to save the output ascii to a gif file and i have also add a web version with rust wasm which is really fast but not as fast as when u install it in ur pc
Ships:
It’s a gif to ascii converter. it uses edge detection for more crisp ascii art, it automatically support color but if u wanna turn them off just use color flag . i have also added multiple txt support you can choose as per ur preference. for installation just do cargo install rustisay that’s it,
add the ability to use it in web instead of downloading it even tho both option are available and added the ability to output the generated the gif and be able to save it localy try fixing some windows issuess but i dont have an access so i dont know...
|
1792860537.9088337
|
1793724537.9088337
|
|
9943
|
pixdraw by @ttyChud | Stardance
|
ttyChud
|
1
|
9.0
|
70
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-26T15:13:23Z", "hours": 9.0, "multiplier": 7.01, "payout": 70, "blessing": "neutral", "text": "pixdraw is a terminal canvas. you can draw what ever in the terminal. you can also load png files from your local storage and edit them in pixel style. just press ? for more command there are many i hope u enjoy", "repo": "https://github.com/Himanshu121865/pixdraw", "demo": "https://crates.io/crates/pixdraw"}]...
|
[{"post_id": 16301, "ts": "202 [{"post_id": 16301, "ts": "2026-06-26T15:04:05Z", "hours": 9.2331, "text": "pixdraw ##Terminal-based pixel art editor You can draw anything."}]...
|
Title: pixdraw by @ttyChud | Stardance
Devlogs:
p Title: pixdraw by @ttyChud | Stardance
Devlogs:
pixdraw ##Terminal-based pixel art editor You can draw anything.
Ships:
pixdraw is a terminal canvas. you can draw what ever in the terminal. you can also load png files from your local storage and edit them in pixel style. just press ? for more command there are many i hope u enjoy...
|
1792878552.4250941
|
1793742552.4250941
|
|
19093
|
RJ GARMENT by @ttyChud | Stardance
|
ttyChud
|
1
|
9.0
|
68
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T09:12:03Z", "hours": 9.0, "multiplier": 7.23, "payout": 68, "blessing": "neutral", "text": "clothing website, I made for a local cloth shop uses ogl and some nice dame animations no money was made, I made this out of my good will", "repo": "https://github.com/Himanshu121865/rjgarment", "demo": "https://rjgarment.vercel.app/"}]...
|
[{"post_id": 9149, "ts": "2026 [{"post_id": 9149, "ts": "2026-06-15T10:05:59Z", "hours": 9.4556, "text": "I made a clothing website for a local store In my area. Even tho i don’t like web devlopment much but it was kinda fun. now going back to working on run terminals"}]...
|
Title: RJ GARMENT by @ttyChud | Stardance
Devlogs Title: RJ GARMENT by @ttyChud | Stardance
Devlogs:
I made a clothing website for a local store In my area. Even tho i don’t like web devlopment much but it was kinda fun. now going back to working on run terminals
Ships:
clothing website, I made for a local cloth shop uses ogl and some nice dame animations no money was made, I made this out of my good will...
|
1792878571.5243225
|
1793742571.5243225
|
|
29745
|
nushell by @ttyChud | Stardance
|
ttyChud
|
1
|
7.0
|
14
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-12T04:47:21Z", "hours": 7.0, "multiplier": 2.01, "payout": 14, "blessing": "neutral", "text": "I did some contribution to nushell it’s a shell written in rust. That and my love for terminal make me wanna start contribution to it. i dont use it on daily bases cuz what they are build is not somthing i find realy intersting but terminal stuff is terminal stuff. this is quiet some good first step in my open source journey", "repo": "https://github.com/Himanshu121865/nushell", "demo": "https://github.com/nushell/nushell/pull/18483"}]...
|
[{"post_id": 27010, "ts": "202 [{"post_id": 27010, "ts": "2026-07-12T04:40:55Z", "hours": 6.9867, "text": "i fix two issues in nushell, it’s a rust based object driven shell. the fixes are not that complected but it’s a good open source contribution beaning. issue was related to type alias. issue was –content-type flag is being ignored"}]...
|
Title: nushell by @ttyChud | Stardance
Devlogs:
i Title: nushell by @ttyChud | Stardance
Devlogs:
i fix two issues in nushell, it’s a rust based object driven shell. the fixes are not that complected but it’s a good open source contribution beaning. issue was related to type alias. issue was –content-type flag is being ignored
Ships:
I did some contribution to nushell it’s a shell written in rust. That and my love for terminal make me wanna start contribution to it. i dont use it on daily bases cuz what they are build is not somthing i find realy intersting but terminal stuff is terminal stuff. this is quiet some good first step in my open source journey...
|
1792878724.2276912
|
1793742724.2276912
|
|
30555
|
nixos-dotfile by @ttyChud | Stardance
|
ttyChud
|
0
|
2.35
|
0
|
[]
|
[{"post_id": 30580, "ts": "202 [{"post_id": 30580, "ts": "2026-07-18T08:47:58Z", "hours": 2.3514, "text": "ricing my nixos + niri setup I think nixos is the peak"}]...
|
Title: nixos-dotfile by @ttyChud | Stardance
Devl Title: nixos-dotfile by @ttyChud | Stardance
Devlogs:
ricing my nixos + niri setup I think nixos is the peak...
|
1792914520.569522
|
1793778520.569522
|
|
39471
|
scrib by @ttyChud | Stardance
|
ttyChud
|
1
|
13.0
|
86
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-01T11:48:27Z", "hours": 13.0, "multiplier": 7.43, "payout": 86, "blessing": "neutral", "text": "Scrib is a browser drawing app written in Rust (WASM + WebSocket). Everyone connected to the server draws on one shared, in-memory canvas. so what i have done is wrote the freehand algorithm(excalidraw brush algo) in rust. and i have used websocket so that everyone can use a single canvas and be able to draw together it’s written in rust and it’s very fast", "repo": "https://github.com/Himanshu121865/scrib", "demo": "https://scrib-izfp.onrender.com"}]...
|
[{"post_id": 38793, "ts": "202 [{"post_id": 38793, "ts": "2026-08-01T11:09:28Z", "hours": 5.3339, "text": "ok so finally!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! selection tools works now and i have also changed room based to a single canvas type where everyone who open the website draw on the same canvas and i have also added the ability to control brush tool smoothness stuff took me way to long to be able to do it and i had to use a little bit of ai (I’m not a shamed) there are still too many bugs but im not gonna fix them im so f*cking bored of this project"}, {"post_id": 37564, "ts": "2026-07-30T11:46:53Z", "hours": 3.8228, "text": "finally i have added the ability to select and drag now the user wont have to delete if he want’s to move something this took quite some time data persistence between session im trying to make this serverless but i dont know how to and there are so many problem with the selection tool and i have also put more logic to the rust wasm side"}, {"post_id": 36918, "ts": "2026-07-29T10:00:09Z", "hours": 1.0817, "text": "i have added a minimal websocket so multiple user can draw on a single canvas"}, {"post_id": 36884, "ts": "2026-07-29T08:13:24Z", "hours": 1.3283, "text": "i have made the canvas infinite added some basic shapes like reac, circle, arrow also if grid mode is enable the shape will snape to the grid also make the brush strock little better but it’s not perfect i have also updated the ui"}, {"post_id": 36298, "ts": "2026-07-28T09:50:48Z", "hours": 0.5689, "text": "added erase tool 5 color palate and made the brush not smooth but i have a vision"}, {"post_id": 35625, "ts": "2026-07-27T05:29:19Z", "hours": 0.3778, "text": "i have added a simple html frontend using wasm we can now draw on the web browser"}, {"post_id": 34470, "ts": "2026-07-25T06:17:11Z", "hours": 0.5047, "text": "I’m build an freehand algo in rust the algorithem which excalidraw uses for the smooth brush tool."}]...
|
Title: scrib by @ttyChud | Stardance
Devlogs:
I’m Title: scrib by @ttyChud | Stardance
Devlogs:
I’m build an freehand algo in rust the algorithem which excalidraw uses for the smooth brush tool.
i have added a simple html frontend using wasm we can now draw on the web browser
added erase tool 5 color palate and made the brush not smooth but i have a vision
i have made the canvas infinite added some basic shapes like reac, circle, arrow also if grid mode is enable the shape will snape to the grid also make the brush strock little better but it’s not perfect i have also updated the ui
i have added a minimal websocket so multiple user can draw on a single canvas
finally i have added the ability to select and drag now the user wont have to delete if he want’s to move something this took quite some time data persistence between session im trying to make this serverless but i dont know how to and there are so many problem with the selection tool and i have also put more logic to the rust wasm side
ok so finally!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! selection tools works now and i have also changed room based to a single canvas type where everyone who open the website draw on the same canvas and i have also added the ability to control brush tool smoothness stuff took me way to long to be able to do it and i had to use a little bit of ai (I’m not a shamed) there are still too many bugs but im not gonna fix them im so f*cking bored of this project
Ships:
Scrib is a browser drawing app written in Rust (WASM + WebSocket). Everyone connected to the server draws on one shared, in-memory canvas. so what i have done is wrote the freehand algorithm(excalidraw brush algo) in rust. and i have used websocket so that everyone can use a single canvas and be able to draw together it’s written in rust and it’s very fast...
|
1792878535.106922
|
1793742535.106922
|
|
43047
|
rig-wave by @ttyChud | Stardance
|
ttyChud
|
1
|
3.0
|
8
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-12T08:51:29Z", "hours": 3.0, "multiplier": 2.21, "payout": 8, "blessing": "neutral", "text": "For a while it was quiet around here, but Rig Wave is finally live on Vercel — check out the demo at rigwave.vercel.app ( https://rigwave.vercel.app/ )! It’s an ambient wave background where light sweeps across a grid, a glowing trail follows your cursor, and clicks send ripples across the canvas. And if you want it in your own project, you can grab it the shadcn way: npx shadcn@latest add Himanshu121865/rig-wave/rig-wave — it pulls the component straight from the GitHub repo into your code, ready to tweak.", "repo": "https://github.com/Himanshu121865/rig-wave", "demo": "https://rigwave.vercel.app/"}]...
|
[{"post_id": 45647, "ts": "202 [{"post_id": 45647, "ts": "2026-08-12T08:46:24Z", "hours": 0.35, "text": "it’s been quiet sometime but i have now hosted it on vercel for demo rigwave.vercel.app ( https://rigwave.vercel.app/ ) and if someone wanna use it they can also use it through shadcn way (npx shadcn@latest add Himanshu121865/rig-wave/rig-wave) this puts the component straight for the github repo"}, {"post_id": 39459, "ts": "2026-08-02T12:52:12Z", "hours": 3.0864, "text": "so I wanted to build an fragment shader like we see on reactbits but then i got a better idea and here is the final result."}]...
|
Title: rig-wave by @ttyChud | Stardance
Devlogs:
Title: rig-wave by @ttyChud | Stardance
Devlogs:
so I wanted to build an fragment shader like we see on reactbits but then i got a better idea and here is the final result.
it’s been quiet sometime but i have now hosted it on vercel for demo rigwave.vercel.app ( https://rigwave.vercel.app/ ) and if someone wanna use it they can also use it through shadcn way (npx shadcn@latest add Himanshu121865/rig-wave/rig-wave) this puts the component straight for the github repo
Ships:
For a while it was quiet around here, but Rig Wave is finally live on Vercel — check out the demo at rigwave.vercel.app ( https://rigwave.vercel.app/ )! It’s an ambient wave background where light sweeps across a grid, a glowing trail follows your cursor, and clicks send ripples across the canvas. And if you want it in your own project, you can grab it the shadcn way: npx shadcn@latest add Himanshu121865/rig-wave/rig-wave — it pulls the component straight from the GitHub repo into your code, ready to tweak....
|
1792878704.3391025
|
1793742704.3391025
|
|
52216
|
orbital by @ttyChud | Stardance
|
ttyChud
|
1
|
56.0
|
993
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-02T04:23:11Z", "hours": 56.0, "multiplier": 17.6, "payout": 993, "blessing": "neutral", "text": "This is Orbit Lens, a real-time 3D satellite tracking website built using vanilla JavaScript and Three.js. It tracks over 16,000 live space objects around earth using real-time data from CelesTrak. It has many features including 3d and 2d orbit tracking, 3d models of select satellites (ISS, Terra, HST, and Aqua). It also includes a filtering feature where you can filter satellites based on specific categories Before testing this project, it is important to know some stuff: You will have the best experience if you access this through a laptop or desktop Sometimes, the api maybe down or is not responding to requests so please keep in mind that if you see an alert saying API not responding, it is out of the website’s hands and it an error outside of my control. That’s it. Thank you for testing this project and hope you like it :)", "repo": "https://github.com/Himanshu121865/orbital", "demo": "https://orbital-sandy.vercel.app/"}]...
|
[{"post_id": 60029, "ts": "202 [{"post_id": 60029, "ts": "2026-09-02T04:19:17Z", "hours": 0.5989, "text": "OrbitLens Devlog #13: fixing deployment bugs 😭😭 Before i continue with this devlog, let me start by saying that modern security rules are the worst. Like istg, why do they have to be so strict? Anyway, you’ll see what i mean by that down below. THis session was all about fixing the deployment bugs. I was almost done and then these f bugs ruined it. This devlog has only abt 30 mins logged because i had the help of ai to fix this because this was way way out of my expertise. Here are the changes. I used ai for this devlog though cus i didn’t understand what it did (but i only used it for htis devlog): Problem 1: The [UNSUPPORTED_FEATURE] Vite Crash My very first Vercel build crashed immediately with a “Top-level await is currently not supported with the ‘iife’ output format” error. Apparently, the satellite.js library I use for SGP4 orbital propagation runs heavy calculations using Web Workers and WebAssembly. By default, Vite tries to bundle everything into an older iife format for maximum browser compatibility, which completely choked on the newer await feature inside the worker file. I fixed this (with the help of ai) by explicitly telling Vite’s internal bundler (Rolldown) to output modern ES modules for both the main thread and the background workers. I created a vite.config.js file and updated the configuration (see vite.config.js in the github repo) Problem 2: 404 Missing 3D Models After fixing the build, the site successfully deployed, but my 3D models (like the ISS and Hubble) and Earth textures threw 404 Not Found errors in the console. Because I was loading these assets while the app was running in my Three.js code using string paths (e.g., ‘/models/iss.glb’), Vite didn’t know they existed and simply excluded them from the final production build. I moved my models and textures folders into Vite’s public directory. Anything placed in the public folder gets copied exactly as is to the root of the final build. This bug wasn’t too bad but the next one was absolute hell. Problem 3: API, Cloudflare and CORS block This was the hardest part. Orbit Lens fetches live Two-Line Element (TLE) data for over 16,000 satellites directly from CelesTrak. It worked perfectly when i hosted it locally, but on Vercel, the browser instantly threw a 403 Forbidden error. CelesTrak uses Cloudflare to prevent automated scraping. When Cloudflare saw an Origin header coming from a deployed Vercel frontend instead of an normaly IP like my computer’s, it blocked the connection. Attempts to use public proxies (like allorigins) resulted in 408 Request Timeout errors because the multiple mb big satellite data took too long to transfer. To fix this, I used Vercel’s Native Rewrites (i have no idea how to use this so i asked ai to do it for me). “I” ;) created a vercel.json file in the root directory to act as a silent backend proxy. By fetching from my own local route (/api/celestrak), the browser doesn’t trigger CORS security. Vercel’s backend intercepts the request, strips the frontend Origin header that was triggering the firewall, and routes the raw data back to the application. This worked! And the website is finally live and i am about to ship the project!"}, {"post_id": 60005, "ts": "2026-09-02T03:10:06Z", "hours": 1.5539, "text": "OrbitLens Devlog #12: Added README.md and ARCHITECTURE.md In this session, i added the README and ARCHITECTURE.md. The README.md highlights the basic features of the website, the tech stack used and how to run this project locally. The ARCHITECTURE.md goes deeper into how the code itself works so anyone perusing it can get a better idea on how i built this project."}, {"post_id": 59764, "ts": "2026-09-01T18:10:36Z", "hours": 2.1944, "text": "OrbitLens Devlog #11: Semi-final changes In this session, i focused on finding small aspects that need to be improved and improved them. Change 1: Firstly, i realised that the dropdown i had implemented was the default dropdown and it didn’t rlly fare well when there were 16000 items to choose from. So i made a custom dropdown, which looks much better than the default one, and made a funciton along with it that shows like the first 200 items matching the search query or, if nothing in being searched, the first 200 items in the list that the API gave. This made the entire experiene so much better because the default dropdown looked kinda ugly cus it took the whole length of the screen. Normally, this wouldnt take too long but i accidentally deleted the wrong eventListeners multiple times because satFilter and satSearch were so similar. So i spent like a good amount of time trying ot find the problem, and it turned out that i justmodified or deleted the wrong thing. Change 2: I found a problem with the filtering system, more specifically in filtering the space stations. Previously, i just had all the satellites with ISS or CSS in their names classified as space station because there are only two space statoins in space right now (ISS and Tiangong) so i filtered any satellites with those two names. But i failed to take into account that other satellites might also have ISS or CSS in their names so instead of two satellites showin up, 16 satellites were avaialbe in that filter. And these were not space stations but rather other statellits which had like ISS or CSS in their names (e.g. Swisscube). So i changed the filter to filter the space stations by their respective NoradIDs, which worked. Change 3: This change wasnt too big; i modified the expanded map layout becaues how it was before led to it having a lot of blank space and probalby wouldnt have looked good in differnet devices."}, {"post_id": 59360, "ts": "2026-09-01T03:31:31Z", "hours": 4.2022, "text": "OrbitLens Devlog #10: mobile layout implementation + better loading screen I am nearing the first ship of this project so this session were just about the final aspects that needed to be improved Change 1: I completely changed the loading screen. Firstly, it now displays the loading percentage that accurately shows the real time progress. Secondly, overall it just looks much better. Thirdly, i also implemented an error notification in the main dashboard in case the API doesnt work and so the website doesnt look like it’s broken Change 2: I added a mobile layout option. by that i mean that if the user is accessing this website on a mobile, it won’t be completely botched (hopefully) p.s. i know this devlog isnt that detailed as my previous ones and that’s because there isn’t much to talk about in this session cus the main changes were in the styles.css (and i’m hella tired)"}, {"post_id": 58733, "ts": "2026-08-31T08:54:43Z", "hours": 6.5158, "text": "OrbitLens Devlog #9: implemented satellite filtering + earth connecting line and complete UI overhaul Now that the website has a proper engine and everything was working well, i decided to add some more stuff. I had two goals for this session. One was to add a satellite filtering option where the user can filter categories of satellites. The other is to change the ui because there were many imprefectoins. Here is a breakdown of what i changed and the challenges i faced: Change 1: I added a global filtering system to fiter satellites by categories. To do this i first built a string-matching engine directly into the TLE parsing loop. As the engine downloads the TLE data from the API, it scans the satellite names and tags them each with categories. I didn’t really know what to categorise them so i thought of some categories and i asked ai to think of some categories. These are the categories: StarlinkOnewebCommsNavigationWeatherand Other/Miscallaneous (which i impemented later; read below) I then wired the HTML dropdown directly into the WebGL gpu loop. Instead of deleting unselected satellites (which would take up too much gpu memory), the gpu simply multiplies their matrix scale to 0, 0, 0, which would just hide them. But there was a challenge that i faced, though it wasn’t a big one. When i first implemented the filter, I noticed that the total satellite count dropped to around 12,000. It turned out that all the satellites that didnt fit into any cateogry were not shown at all so i expanded the categories to include an OTHER category. I also had to make some changes in the raycaster or the users would accidentally be clicking on the hidden satellites. Change 2: I also added a line connecting the selected satellite directly to its exact spot on the Earth’s surface directly beneath it. I did this by first pre-allocating a THREE.BufferGeometry with exactly two vertices. Inside the animation loop, i then took the satellite’s live 3D coordinates and use a .normalize() math function. Because the Earth has a radius of exactly 1, normalizing the 3d coordinates perfectly attaches the bottom of the line to the planet’s surface. But, i ran into a bug where the line would randomly disappear depending on the camera angle. After some research (ai) i found out that this was caused by Three.js’s “Frustum Culling.” The code calculated the line bounding box once when the websited started up and when the camera moved away from that initial box, the gpu assumed the line was out of sight and stopped rendering it to save memory. So i just added a line of code (frustumCulled = false) that just overrode that. Change 3: Lastly, i essentially completely rewrote the styles.css to change how the ui looked cus i didn’t relaly like how it looked before. So this was the third change."}, {"post_id": 57886, "ts": "2026-08-30T06:40:40Z", "hours": 6.5181, "text": "OrbitLens Devlog #8: Scaling the 3d globe and some other stuff In the last update, i finally implemented the 2d map so this time i want to take this website a step further since the foundation is stable enough. I decided to go from tracking 5 hardcoded satellites to over 16,000 space objects. Here is what i changed, how i changed it and the challenges i faced: Change 1: Originally, i just added the starlink satellites to what i already had which was my initial goal. but the thing was, i was requesting the API for thousands of satellites, which did work once and all of them were stored in localStorage but for ‘testing purposes’ (i was just stupif), i cleared the localStorage and re-requested the TLE which it then instantly rejected cus of its ‘anti-bot firewalls’ and i got ip banned for like a couple of hours and it gave a 403 error aswell. To fix this, i read some CelesTrak documentation and i realised that there is a way to ismply request all the satellite (every satellite that it had) data in one request. Apparently there was a special search query (‘active’) that i could’ve used but instead i individually fetched everything. So once i used that query, i got all of the satellitse (a bit more than 16000) rendered on the earth but it was laggy, which leads to my second change. Change 2 To fix this massive lag caused by the 16000+ satellites, I completely replaced the standard 3D mesh pipeline with THREE.InstancedMesh so that instead of creating 16,000 individual sphere objects (which would like instantly crashes the browser), i can feed the GPU a single geometry and material, along with an array of 16,000 matrixes. That means now the gpu like renders everything in one go. But, I hit a massive 5-second freeze whenever a user clicked the ISS (which makes sense cus this was a 4k extremely detailed 3d model). The thing was, WebGL delays uploading heavy 3D textures to the GPU until an object is actually rendered on screen. And because the ISS model was hidden on startup, the compiler skipped it, so the website was stuck trying to render it when i selected the ISS. I solved this by forcing the renderer to draw one “dummy frame” with all models visible during the loading screen, which, in a sense, ‘warmed up’ the GPU. Change 3: The lag was better but it was still there and i realised the problem was that each of the dots representing a satellite were smoothly moving in space. This smooth-moving physics applied to over 16000 dots was what slowed down the website. To fix this, I rewrote the loop that propogates the satellite dots so physics calculations wouldn’t choke the main JavaScript thread. To do this i built a system to process the satellites in batches of 4,000 satellites per frame instead of all 16,000. Second, i scrapped geodetic trigonometry (latitude/longitude conversions; see one of the earlier devlogs) and replaced it with direct Earth-Centered, Earth-Fixed (ECEF) 3D vector rotation. Initially, our batches were too small, causing satellites to visually ‘teleport’ instead of smoothly gliding, which looked really glitchy. But by upgrading to matrix rotation, i managed to get a huge increase in speed. This allowed me to crank the batch size up and get that smooth motion across the entire thing. Change(s) 4: There were still some small bugs in the visual aspects like the dots disappearing or the transition jump (see previous devlog(s) to understand) and stuff but i took care of them."}, {"post_id": 56499, "ts": "2026-08-28T09:22:18Z", "hours": 3.8858, "text": "OrbitLens Devlog #7: Implementing a 2D orbit map To expand the functinality of the website, i wanted to add a 2D world map that has the 3d orbit projected on to it. Here is a breakdown of what i built, how i built it and the challenge i faced. What I Built: I made a 2D projection of the 3d globe using the HTML5 Canvas API that runs at the same time with the WebGL 3D engine. The map automatically appears when a satellite is selected, and fetches live telemetry to draw exactly one full orbital period (half past, half future). The orbit line looks like how it does on the 3d globe with a yellow line representing the past trail and a dotted blue line representing the predicted future track. I also built an “EXPAND” toggle that expands the map to fill most of the screen if the user wants to take a close look. Challenges: If a satellite flies east across the Pacific Ocean (where the International Date Line is), its longitude coordinates suddenly jump from +179deg to -179deg. I originally didnt take this into account and it had like this massive, horizontal glitch streak entirely across the screen cus of the sudden coordinate shift. To fix this, I programmed a strict mathematical distance gate into the drawing loop. If the engine detects that the X-coordinate has jumped by more than half the width of the canvas, it forces the renderer to break the current stroke (mapCtx.stroke()), lift the ‘pen’, and begin a completely new path on the opposite edge of the map (mapCtx.beginPath()). When plotting a full 90-minute orbit, the beginning of the yellow line and the end of the cyan line do not connect perfectly, leaving a massive gap. I originally thought this was a problem and tried for quite a while to fix this and i double checked the math formulas again and again. But i realised this isnt a math error, it’s just physics. While the satellite flies in a continuous circle, the Earth is physically rotating underneath it. By the time the satellite completes one lap, the ground has shifted roughly 22.5 degrees to the east, pushing the satellite’s relative ground track to the west. So i just left it like that to accurately represent the Earth’s rotation. This was the biggest problem and took the most time to fix. Three.js orbital camera controls are incredibly aggressive about capturing mouse events. The 3D engine was always suppressing the HTML ‘click’ events, making the “EXPAND” button not work. Not only that, the standard inline CSS was pushing the 3D canvas down the page, which misaligned everything and didnt allow me to select the satellites at all. To fix this, fisrt, i locked the 3D canvas to a fixed background layer (z-index: -1) to completely isolate it from the UI layout. Second, i bypassed the WebGL event interceptors entirely and connected the code that handles the expansion directly to a global window function (window.toggleMap) and just injected the button with the HTML onclick attribute. This fixed everything and now it works really great."}, {"post_id": 55587, "ts": "2026-08-27T15:15:22Z", "hours": 6.2028, "text": "OrbitLens Devlog #6: Implemented Sun and the day night cycles + camera panning improvements The core engine was working smoothly, so this session was focused on the ui and aesthetics and realism. Here are the changes i made, how i made them, and the challenges i faced: Change 1: Implemented the Sun The first major goal was replacing the static and boring lighting the 3D earth originally had with a Sun. To do this, I wrote a custom Solar Ephemeris algorithm. Using the current Julian date, it calculates the sun’s exact Right Ascension, Declination, and Earth’s Greenwich Mean Sidereal Time (GMST) to pinpoint the real-time subsolar vector. Since this was some complicated math, i had to use some ai for this. But in a WebGL engine, lights are purely mathematical vectors and there is no physical object in the sky. So when i first added a solid white sphere, it literally looked like a flat plastic toy and looked really ugly. To fix this, I abandoned the 3D ball and built a 2D Sprite using the HTML5 Canvas API to generate a radial gradient. By using Additive Blending to the material, I forced it to mathematically layer the light over the space, which created like this blinding, light that looked like the sun, which was good. Change 2: The Day/Night City lights cycle: To make the globe even more realistic, I wanted the night side of the Earth to have like the night time city lights rather than just a dark shadow. To build this, I added an 8k night-map texture (from Solar System Scope) and implemented a WebGL fragment shader into the Three.js’s native MeshPhongMaterial using a compiler hook. But there was a problem, the free night map that i implemented had this blue tint to it, and when i tried to correct it, it literally turned to this muddy, polluted yellow. To fix this, I programmed the shader to intercept the texture data, remove the color tint by calculating luminance, and pass it through a smoothstep noise gate. Anything below a 10% threshold was forced to pitch black, while populated areas were recolored with a warm golden orange hue. And it worked great! Change 3: More camera improvements Despite the previous session having to do with correcting the camera engine, there were still some stuff that i fixed here. The problem was since i removed OrbitControls in the last session (read previous devlog), once i had like hte earth upside, it was very hard to make it upright again. like at one point, i had the entire europe upside down and Africa was at the top of the globe but i couldnt get it back to normal. To fix this I changed the code so that the panning controls thing swaps between OrbitControls (for the 3D globe) and TrackballControls (for the satellites/spacecrafts). But there were some more challenges: When a zoom-in animation (read previous devlogs) finished (after selecting e.g. a satellite), the camera would like glitch backward into a less zoomed in position which was kinds uncomfortable to look at. Because the satellites were moving a static transition speed couldn’t catch them before the animation finished, so the final frame was a bit glitchy and the screen like jumped a bit. To fix all of these problems, I first made sure that disabled camera controls are completely turned off so they can’t fight the active zoom animations. I also made it that instead of moving at a steady speed, I added a speed-up effect as the camera gets closer to the target. This ensures that the camera glides smoothly into place right on time without any jerky jumps."}, {"post_id": 55313, "ts": "2026-08-27T01:49:10Z", "hours": 7.3289, "text": "OrbitLens Devlog #5: Camera panning improvements and performance updates After the changes from Devlog #4, all the math and the 3d models were all working but i faced some problems in other aspects of the website. Here are soe of the changes i made: Change 1: Correct orientation This was a small change, but i noticed that some satellites were a bit too big (like Aqua) and were positioned wrongly, so i just chaged teh scale and the rotation to make it a bit more realistic Changes 2, 3, and 4: The camera improvements I faced a lots of problems with the camera and how it worked. Before, i couldn’t rotated in all directions around the earth or the satellites because they were using OrbitControls so i swapped that out with TrackballControls, which allows for 360deg panninh There was also like a rubber band effect where the camera, when the camera lock was selected as satellite, zoomed in towards a satellite, i couldn’t interact with the satellite at all. THis was because as the satellite’s moving, the camera is also actuvely trying to catch up so it never actually ‘ended’ its animation so i was blocked from interacting with the satellite. To fix this i implemented delta tracking. The engine now calculates the exact mathematical vector the satellite moves every frame and shifts the camera’s physical position by that exact same amount, which worked. Previously, switching targets caused the camera to travel in a straight line, clipping through the Earth, which looked kinda unprofessional so I engineered a custom transition that separates the camera’s direction from its altitude. Now, when you select a new satellite, the camera zooms out, tracels in a an arc over the globe, and zooms in to the destination satellite. The animation still needs a lot of improvement cus some parts are still a bit glitchy, but i’m happy for now. Change 5: I implemented it that the TLEs are now stored in the actual localStorage for like 6 hours and then fetch new TLEs. So the user will always have the latest TLEs cus they update evey 12hrs."}, {"post_id": 54315, "ts": "2026-08-25T08:17:16Z", "hours": 5.8253, "text": "OrbitLens Devlog #4: Adding multiple satellites In my last update, I finally got a 3D model of the ISS rendering on the globe with a basic UI dashboard. It looked cool, but I wanted to scale it up. I wanted to add multiple famous satellites on top of the ISS: The Hubble Space Telescope (HST)NASA’s AquaNASA’s TerraTiangongISS (which already exists) At least for now. Maybe in later stages, I can add Starlink satellites or sth. Here is waht I built, how I built it, and the challenges I faced. Change/Challenge 1: the orbit that looked like a slinky I hardcoded a 90-minute orbit line (the ISS orbit time). But other satellites have different orbital periods, so 90 mins fell short. Increasing it to a 12-hour calculation made the ISS orbit look like a massive slinky wrapping around the Earth cus its orbit is only 90mins. I fixed this by dynamically calculating the exact total orbit time using the satellite’s math: const periodMinutes = Math.ceil((2 * Math.PI) / satrec.no); const halfPeriod = Math.floor(periodMinutes / 2); Change/Challenge 2: IP ban (again) The JS fetch() doesn’t consider a ‘429 too many requests’ (i got this cus vite reloaded the page every time i saved something) response as a network error, so it tried calculating the HTML error page as orbital math and crashed. I fixed this by manually checking the response.ok HTTP status. If the API blocks me, the code redirects to an “Offline Fallback Mode”—loading a hardcoded string of ISS TLE math so the app survives. Change/Challenge 3: improper API request After like 4 hours, I realized I still wasn’t getting a proper API response even though the IP ban would have worn off. I looked at the code and realized I was pulling data for all five satellites in one go by just comma-separating the values in the URL like this: …/gp.php?CATNR=25544,20580,48274&FORMAT=tle (each number references to a satellite) But after CelesTrak’s documentation, it strictly dictated that the CATNR parameter only accepts a single catalog number. The server rejected the request, my code assumed 0 satellites, and the engine crashed. The fix: Writing five separate fetch() blocks is messy, and implementing an await fetch() in a for-loop creates a slow “waterfall” effect (waiting for one to finish before starting the next). I fixed this with JavaScript’s Promise.all. I created an array of the exact NORAD IDs, mapped over it to generate separate, perfectly formatted fetch requests, and Promise.all fires them all at the exact same time. Change/Challenge 4: I wanted 3D models for all of these. I found Aqua and HST easily from NASA. I found Terra, but it was fetching some other incompatible file I didn’t have, so I just scratched the Terra model. Tiangong was the biggest pain—everywhere I looked was either paid or on Sketchfab, and I cant create a Sketchfab account cus of some stupid Epic Games restriction. Implementing the files I did have was the next issue. Hardcoding multiple GLTFLoader blocks would turn the code into spaghetti. Plus, 3D models from the internet aren’t scaled equally—my Hubble was massive, and my Aqua model was tiny. The fix: I built a central Model Registry object. It maps a satellite’s NORAD ID to its file path and a specific scale multiplier. Even better, I implemented a fallback for satellites I done have a model for. If I track a satellite (like Tiangong) but leave the file path as null, the code detects this and dynamically generates a glowing cyan sphere using Three.js math to take its place. Changes 5 and 6: I updated the dashboard to include a dropdown to select the satellite and the telemetry updates accordingly. I also added a camera toggle feature where the user can lock the camera to follow the satellite or stay locked on the Earth. Lastly, I implemented a custom loading screen while the models load. P.S.Lots of info is compressed cus i crossed the 4000 char limit."}, {"post_id": 53856, "ts": "2026-08-24T15:41:08Z", "hours": 5.4819, "text": "OrbitLens Devlog #3: Adding a dashboard + ISS 3d model implementation I had two goals in my mind in this session. One was to add a dashboard which displays some stats of the ISS and the other is to replace the red dot with a 3d model of the ISS. Here is what and how I implemented these stuff and the challenges i faced: Change/Problem 1: Before I even got started on the new stuff i wanted to add, i faced a big problem. While testing the physics code and other stuff, my build tool (Vite) was auto-refreshing the browser every time I hit save. This I spammed CelesTrak’s public API with dozens of requests per minute. This lead to me kinda getting IP blocked temporarily, at least that’s what i think happend because it always returned an HTML error page instead of a TLE string. My engine tried to calculate stuff with that empty TLE and just crashed the engine The fix: It is important to know that a TLE is not like a live GPS broadcast that gets transmitted every second. It’s literally like a mathematical snapshot of a ton of stuff of the ISS like its position and its orbit and NORAD only updates these TLEs like twice a day or sth. So I fixed this api problem by making it such that the localStorage caches the TLE once and uses it for the calculation for the next 12 hours and then updates the TLE after that. Change 2: Dashboard implementation I implemented a dashboard that shows up on the top left of the screen and shows the following stuff abotu the ISS: Longitude: the method i used to calculate this is in one of my previous devlogs (i think my last one). But here is a quick summary: To find coordinates I first calculated the Greenwich Mean Sidereal Time (gmst), which gives me the exact rotational angle of the Earth at that specific millisecond. I passed the ECI position (one of the previosu devlogs) and gmst into satellite.eciToGeodetic(), which projects the point onto the spinning globe in radians. I then multiplied those values by 180/pi to convert the radians into standard degrees latitude: same as longitude -altitude: The eciToGeodetic() function also calculates the distance from the satellite’s coordinates down to the mathematical surface of the Earth (the WGS84 or the ‘World Geodetic System 1984’ ellipsoid which is like a mathematical reference representation of the earth that is used in calculatoin and stuff). It outputs this directly as height in kilometers, which I then simply rounded to two dp. -velocity: The propagate() function outputs the satellite’s speed broken into X, Y, and Z axes (measured in km/s). To get a single speed, I calculated the magnitude of that 3D vector using the 3D Pythagorean theorem: v = squareroot(x^2 + y^2 + z^2) Change 3: To implement a 3d model, i first needed that 3d image. I wanted the highest quality NASA model available (Model D - IGOAL). I downloaded the official .fbx, converted it to a .glb, and ended up with a 255mb file. Which is really bad because shoving a 255mb file into a web browser would just crash the entire thing. So i just ran that through a draco compression and a texture compression (WebP 1024x1024) which brought the size to about 18mb which was much better. To render this, I used Three.js’s GLTFLoader with a dedicated Google WebAssembly DRACOLoader to decode the compressed math. The next couple of changes were just to make it more realistic: i changed the scale from 0.02 (where it was the size of a continent) to 0.001 (which made it a good size) the direction the ISS faced was not accurate at all so I wanted to rotate until its in the correct position. But because the animate() loop was actively using math to point the model forward 60 times a second, it kept overriding my manual rotation. So I wrapped the ISS in a THREE.Group, rotated the mesh 90 degrees inside that container, and then applied the math."}, {"post_id": 52416, "ts": "2026-08-22T15:23:19Z", "hours": 3.9075, "text": "OrbitLens Devlog #2: Adding ISS + Orbit This session was mainly focused on implementing the ISS first to the satellite tracker. Here are the changes I made: Satellite Data Extraction and ISS Positioning To understand what I did in this session, it is important to know how I can get the ‘live’ location of the ISS works: firstly, satellites don’t broadcast live GPS coordinates to the internet. Instead, radars track them and publish Two-Line Element (TLE) sets. A TLE is like a raw string that “acts as a mathematical variable of an orbit’s shape at a specific moment.” I got these TLE from a non-profit API called CelesTrak. these TLEs are kinda useless so I used the satellite.js library to parse te TLEs. This js engine also allows you to run what is known as SGP4 models (Simplified General Perturbations 4) which is a mathematical model used to predict an orbit. Using this, TLEs are then converted to what’s known as Earth-Centered Inertial (ECI) vectors which is a “non-rotating 3D coordinate system anchored to the center of the Earth with its axes fixed relative to the stars, allowing you to calculate a satellite’s absolute mathematical position in space independent of the Earth spinning beneath it.” The ECI is still not useful so I passed it through satellite.eciToGeodetic which converted the eci to geodetic coordinates (longitude, latitude and altitude) But there’s one more step before the data is useful. The thing is Three.js only understands Cartesian coordinates (x, y, z) so the geodetic coordinates need to be converted to catesian. I did that using these mathematical formulas: x = r * cos(lat) * cos(lon) y = r * sin(lat) z = -r * cos(lat) * sin(lon) Orbit Implementation Satellites do not orbit in perfect circles; they follow complex trajectories that shift as the Earth rotates underneath them. The ISS takes roughly 92 minutes to complete one full orbit around the Earth. I captured this entire window by running two separate for loops. For these loops, i created 92 differed Date objects spaced exactly 1 second apart. here are the loops and how they work in a small nutshell: The Past: I looped backward from -46 minutes up to 0 (the current moment) and inputted the X, Y, and Z coordinates in each loop into THREE.BufferGeometry to draw a solid yellow LineBasicMaterial. The Future: I looped forward from 0 to +46 minutes. In every single iteration of those loops, and did the same thing. Challenges: the hemisphere and orbit were originally flipped or were completely false so i had to wrack my brain and dind the cause. I spent more than an hour debugging this. Turns out the formula was wrong and i used sin instaed of cos. In te end, I also double checked my orbit and position with official ISS trackers, and they matched!"}, {"post_id": 51593, "ts": "2026-08-21T11:15:14Z", "hours": 2.2086, "text": "OrbitLens Devlog #1: Rendering the Earth 3D I just kick started this project, Orbit Lens, and my aim is to build a fully free, real-time 3D satellite tracker from scratch using Three.js and maybe some other libraries. Today was all about creating the core 3D arch. You can’t track a satellite without a planet to orbit, so Phase 1 was focused on rendering the Earth and setting up the Three.js environment. What I accomplished in Phase 1: Set up my environment with ViteBuilt the Three.js scene, camera, and render loop.Rendered a 3D Earth utilizing maps from solar system scope.Enabled OrbitControls to enable camera panning This is just the basic foundations of the project so there’ll be much more development in the future."}]...
|
Title: orbital by @ttyChud | Stardance
Devlogs:
O Title: orbital by @ttyChud | Stardance
Devlogs:
OrbitLens Devlog #1: Rendering the Earth 3D I just kick started this project, Orbit Lens, and my aim is to build a fully free, real-time 3D satellite tracker from scratch using Three.js and maybe some other libraries. Today was all about creating the core 3D arch. You can’t track a satellite without a planet to orbit, so Phase 1 was focused on rendering the Earth and setting up the Three.js environment. What I accomplished in Phase 1: Set up my environment with ViteBuilt the Three.js scene, camera, and render loop.Rendered a 3D Earth utilizing maps from solar system scope.Enabled OrbitControls to enable camera panning This is just the basic foundations of the project so there’ll be much more development in the future.
OrbitLens Devlog #2: Adding ISS + Orbit This session was mainly focused on implementing the ISS first to the satellite tracker. Here are the changes I made: Satellite Data Extraction and ISS Positioning To understand what I did in this session, it is important to know how I can get the ‘live’ location of the ISS works: firstly, satellites don’t broadcast live GPS coordinates to the internet. Instead, radars track them and publish Two-Line Element (TLE) sets. A TLE is like a raw string that “acts as a mathematical variable of an orbit’s shape at a specific moment.” I got these TLE from a non-profit API called CelesTrak. these TLEs are kinda useless so I used the satellite.js library to parse te TLEs. This js engine also allows you to run what is known as SGP4 models (Simplified General Perturbations 4) which is a mathematical model used to predict an orbit. Using this, TLEs are then converted to what’s known as Earth-Centered Inertial (ECI) vectors which is a “non-rotating 3D coordinate system anchored to the center of the Earth with its axes fixed relative to the stars, allowing you to calculate a satellite’s absolute mathematical position in space independent of the Earth spinning beneath it.” The ECI is still not useful so I passed it through satellite.eciToGeodetic which converted the eci to geodetic coordinates (longitude, latitude and altitude) But there’s one more step before the data is useful. The thing is Three.js only understands Cartesian coordinates (x, y, z) so the geodetic coordinates need to be converted to catesian. I did that using these mathematical formulas: x = r * cos(lat) * cos(lon) y = r * sin(lat) z = -r * cos(lat) * sin(lon) Orbit Implementation Satellites do not orbit in perfect circles; they follow complex trajectories that shift as the Earth rotates underneath them. The ISS takes roughly 92 minutes to complete one full orbit around the Earth. I captured this entire window by running two separate for loops. For these loops, i created 92 differed Date objects spaced exactly 1 second apart. here are the loops and how they work in a small nutshell: The Past: I looped backward from -46 minutes up to 0 (the current moment) and inputted the X, Y, and Z coordinates in each loop into THREE.BufferGeometry to draw a solid yellow LineBasicMaterial. The Future: I looped forward from 0 to +46 minutes. In every single iteration of those loops, and did the same thing. Challenges: the hemisphere and orbit were originally flipped or were completely false so i had to wrack my brain and dind the cause. I spent more than an hour debugging this. Turns out the formula was wrong and i used sin instaed of cos. In te end, I also double checked my orbit and position with official ISS trackers, and they matched!
OrbitLens Devlog #3: Adding a dashboard + ISS 3d model implementation I had two goals in my mind in this session. One was to add a dashboard which displays some stats of the ISS and the other is to replace the red dot with a 3d model of the ISS. Here is what and how I implemented these stuff and the challenges i faced: Change/Problem 1: Before I even got started on the new stuff i wanted to add, i faced a big problem. While testing the physics code and other stuff, my build tool (Vite) was auto-refreshing the browser every time I hit save. This I spammed CelesTrak’s public API with dozens of requests per minute. This lead to me kinda getting IP blocked temporarily, at least that’s what i think happend because it always returned an HTML error page instead of a TLE string. My engine tried to calculate stuff with that empty TLE and just crashed the engine The fix: It is important to know that a TLE is not like a live GPS broadcast that gets transmitted every second. It’s literally like a mathematical snapshot of a ton of stuff of the ISS like its position and its orbit and NORAD only updates these TLEs like twice a day or sth. So I fixed this api problem by making it such that the localStorage caches the TLE once and uses it for the calculation for the next 12 hours and then updates the TLE after that. Change 2: Dashboard implementation I implemented a dashboard that shows up on the top left of the screen and shows the following stuff abotu the ISS: Longitude: the method i used to calculate this is in one of my previous devlogs (i think my last one). But here is a quick summary: To find coordinates I first calculated the Greenwich Mean Sidereal Time (gmst), which gives me the exact rotational angle of the Earth at that specific millisecond. I passed the ECI position (one of the previosu devlogs) and gmst into satellite.eciToGeodetic(), which projects the point onto the spinning globe in radians. I then multiplied those values by 180/pi to convert the radians into standard degrees latitude: same as longitude -altitude: The eciToGeodetic() function also calculates the distance from the satellite’s coordinates down to the mathematical surface of the Earth (the WGS84 or the ‘World Geodetic System 1984’ ellipsoid which is like a mathematical reference representation of the earth that is used in calculatoin and stuff). It outputs this directly as height in kilometers, which I then simply rounded to two dp. -velocity: The propagate() function outputs the satellite’s speed broken into X, Y, and Z axes (measured in km/s). To get a single speed, I calculated the magnitude of that 3D vector using the 3D Pythagorean theorem: v = squareroot(x^2 + y^2 + z^2) Change 3: To implement a 3d model, i first needed that 3d image. I wanted the highest quality NASA model available (Model D - IGOAL). I downloaded the official .fbx, converted it to a .glb, and ended up with a 255mb file. Which is really bad because shoving a 255mb file into a web browser would just crash the entire thing. So i just ran that through a draco compression and a texture compression (WebP 1024x1024) which brought the size to about 18mb which was much better. To render this, I used Three.js’s GLTFLoader with a dedicated Google WebAssembly DRACOLoader to decode the compressed math. The next couple of changes were just to make it more realistic: i changed the scale from 0.02 (where it was the size of a continent) to 0.001 (which made it a good size) the direction the ISS faced was not accurate at all so I wanted to rotate until its in the correct position. But because the animate() loop was actively using math to point the model forward 60 times a second, it kept overriding my manual rotation. So I wrapped the ISS in a THREE.Group, rotated the mesh 90 degrees inside that container, and then applied the math.
OrbitLens Devlog #4: Adding multiple satellites In my last update, I finally got a 3D model of the ISS rendering on the globe with a basic UI dashboard. It looked cool, but I wanted to scale it up. I wanted to add multiple famous satellites on top of the ISS: The Hubble Space Telescope (HST)NASA’s AquaNASA’s TerraTiangongISS (which already exists) At least for now. Maybe in later stages, I can add Starlink satellites or sth. Here is waht I built, how I built it, and the challenges I faced. Change/Challenge 1: the orbit that looked like a slinky I hardcoded a 90-minute orbit line (the ISS orbit time). But other satellites have different orbital periods, so 90 mins fell short. Increasing it to a 12-hour calculation made the ISS orbit look like a massive slinky wrapping around the Earth cus its orbit is only 90mins. I fixed this by dynamically calculating the exact total orbit time using the satellite’s math: const periodMinutes = Math.ceil((2 * Math.PI) / satrec.no); const halfPeriod = Math.floor(periodMinutes / 2); Change/Challenge 2: IP ban (again) The JS fetch() doesn’t consider a ‘429 too many requests’ (i got this cus vite reloaded the page every time i saved something) response as a network error, so it tried calculating the HTML error page as orbital math and crashed. I fixed this by manually checking the response.ok HTTP status. If the API blocks me, the code redirects to an “Offline Fallback Mode”—loading a hardcoded string of ISS TLE math so the app survives. Change/Challenge 3: improper API request After like 4 hours, I realized I still wasn’t getting a proper API response even though the IP ban would have worn off. I looked at the code and realized I was pulling data for all five satellites in one go by just comma-separating the values in the URL like this: …/gp.php?CATNR=25544,20580,48274&FORMAT=tle (each number references to a satellite) But after CelesTrak’s documentation, it strictly dictated that the CATNR parameter only accepts a single catalog number. The server rejected the request, my code assumed 0 satellites, and the engine crashed. The fix: Writing five separate fetch() blocks is messy, and implementing an await fetch() in a for-loop creates a slow “waterfall” effect (waiting for one to finish before starting the next). I fixed this with JavaScript’s Promise.all. I created an array of the exact NORAD IDs, mapped over it to generate separate, perfectly formatted fetch requests, and Promise.all fires them all at the exact same time. Change/Challenge 4: I wanted 3D models for all of these. I found Aqua and HST easily from NASA. I found Terra, but it was fetching some other incompatible file I didn’t have, so I just scratched the Terra model. Tiangong was the biggest pain—everywhere I looked was either paid or on Sketchfab, and I cant create a Sketchfab account cus of some stupid Epic Games restriction. Implementing the files I did have was the next issue. Hardcoding multiple GLTFLoader blocks would turn the code into spaghetti. Plus, 3D models from the internet aren’t scaled equally—my Hubble was massive, and my Aqua model was tiny. The fix: I built a central Model Registry object. It maps a satellite’s NORAD ID to its file path and a specific scale multiplier. Even better, I implemented a fallback for satellites I done have a model for. If I track a satellite (like Tiangong) but leave the file path as null, the code detects this and dynamically generates a glowing cyan sphere using Three.js math to take its place. Changes 5 and 6: I updated the dashboard to include a dropdown to select the satellite and the telemetry updates accordingly. I also added a camera toggle feature where the user can lock the camera to follow the satellite or stay locked on the Earth. Lastly, I implemented a custom loading screen while the models load. P.S.Lots of info is compressed cus i crossed the 4000 char limit.
OrbitLens Devlog #5: Camera panning improvements and performance updates After the changes from Devlog #4, all the math and the 3d models were all working but i faced some problems in other aspects of the website. Here are soe of the changes i made: Change 1: Correct orientation This was a small change, but i noticed that some satellites were a bit too big (like Aqua) and were positioned wrongly, so i just chaged teh scale and the rotation to make it a bit more realistic Changes 2, 3, and 4: The camera improvements I faced a lots of problems with the camera and how it worked. Before, i couldn’t rotated in all directions around the earth or the satellites because they were using OrbitControls so i swapped that out with TrackballControls, which allows for 360deg panninh There was also like a rubber band effect where the camera, when the camera lock was selected as satellite, zoomed in towards a satellite, i couldn’t interact with the satellite at all. THis was because as the satellite’s moving, the camera is also actuvely trying to catch up so it never actually ‘ended’ its animation so i was blocked from interacting with the satellite. To fix this i implemented delta tracking. The engine now calculates the exact mathematical vector the satellite moves every frame and shifts the camera’s physical position by that exact same amount, which worked. Previously, switching targets caused the camera to travel in a straight line, clipping through the Earth, which looked kinda unprofessional so I engineered a custom transition that separates the camera’s direction from its altitude. Now, when you select a new satellite, the camera zooms out, tracels in a an arc over the globe, and zooms in to the destination satellite. The animation still needs a lot of improvement cus some parts are still a bit glitchy, but i’m happy for now. Change 5: I implemented it that the TLEs are now stored in the actual localStorage for like 6 hours and then fetch new TLEs. So the user will always have the latest TLEs cus they update evey 12hrs.
OrbitLens Devlog #6: Implemented Sun and the day night cycles + camera panning improvements The core engine was working smoothly, so this session was focused on the ui and aesthetics and realism. Here are the changes i made, how i made them, and the challenges i faced: Change 1: Implemented the Sun The first major goal was replacing the static and boring lighting the 3D earth originally had with a Sun. To do this, I wrote a custom Solar Ephemeris algorithm. Using the current Julian date, it calculates the sun’s exact Right Ascension, Declination, and Earth’s Greenwich Mean Sidereal Time (GMST) to pinpoint the real-time subsolar vector. Since this was some complicated math, i had to use some ai for this. But in a WebGL engine, lights are purely mathematical vectors and there is no physical object in the sky. So when i first added a solid white sphere, it literally looked like a flat plastic toy and looked really ugly. To fix this, I abandoned the 3D ball and built a 2D Sprite using the HTML5 Canvas API to generate a radial gradient. By using Additive Blending to the material, I forced it to mathematically layer the light over the space, which created like this blinding, light that looked like the sun, which was good. Change 2: The Day/Night City lights cycle: To make the globe even more realistic, I wanted the night side of the Earth to have like the night time city lights rather than just a dark shadow. To build this, I added an 8k night-map texture (from Solar System Scope) and implemented a WebGL fragment shader into the Three.js’s native MeshPhongMaterial using a compiler hook. But there was a problem, the free night map that i implemented had this blue tint to it, and when i tried to correct it, it literally turned to this muddy, polluted yellow. To fix this, I programmed the shader to intercept the texture data, remove the color tint by calculating luminance, and pass it through a smoothstep noise gate. Anything below a 10% threshold was forced to pitch black, while populated areas were recolored with a warm golden orange hue. And it worked great! Change 3: More camera improvements Despite the previous session having to do with correcting the camera engine, there were still some stuff that i fixed here. The problem was since i removed OrbitControls in the last session (read previous devlog), once i had like hte earth upside, it was very hard to make it upright again. like at one point, i had the entire europe upside down and Africa was at the top of the globe but i couldnt get it back to normal. To fix this I changed the code so that the panning controls thing swaps between OrbitControls (for the 3D globe) and TrackballControls (for the satellites/spacecrafts). But there were some more challenges: When a zoom-in animation (read previous devlogs) finished (after selecting e.g. a satellite), the camera would like glitch backward into a less zoomed in position which was kinds uncomfortable to look at. Because the satellites were moving a static transition speed couldn’t catch them before the animation finished, so the final frame was a bit glitchy and the screen like jumped a bit. To fix all of these problems, I first made sure that disabled camera controls are completely turned off so they can’t fight the active zoom animations. I also made it that instead of moving at a steady speed, I added a speed-up effect as the camera gets closer to the target. This ensures that the camera glides smoothly into place right on time without any jerky jumps.
OrbitLens Devlog #7: Implementing a 2D orbit map To expand the functinality of the website, i wanted to add a 2D world map that has the 3d orbit projected on to it. Here is a breakdown of what i built, how i built it and the challenge i faced. What I Built: I made a 2D projection of the 3d globe using the HTML5 Canvas API that runs at the same time with the WebGL 3D engine. The map automatically appears when a satellite is selected, and fetches live telemetry to draw exactly one full orbital period (half past, half future). The orbit line looks like how it does on the 3d globe with a yellow line representing the past trail and a dotted blue line representing the predicted future track. I also built an “EXPAND” toggle that expands the map to fill most of the screen if the user wants to take a close look. Challenges: If a satellite flies east across the Pacific Ocean (where the International Date Line is), its longitude coordinates suddenly jump from +179deg to -179deg. I originally didnt take this into account and it had like this massive, horizontal glitch streak entirely across the screen cus of the sudden coordinate shift. To fix this, I programmed a strict mathematical distance gate into the drawing loop. If the engine detects that the X-coordinate has jumped by more than half the width of the canvas, it forces the renderer to break the current stroke (mapCtx.stroke()), lift the ‘pen’, and begin a completely new path on the opposite edge of the map (mapCtx.beginPath()). When plotting a full 90-minute orbit, the beginning of the yellow line and the end of the cyan line do not connect perfectly, leaving a massive gap. I originally thought this was a problem and tried for quite a while to fix this and i double checked the math formulas again and again. But i realised this isnt a math error, it’s just physics. While the satellite flies in a continuous circle, the Earth is physically rotating underneath it. By the time the satellite completes one lap, the ground has shifted roughly 22.5 degrees to the east, pushing the satellite’s relative ground track to the west. So i just left it like that to accurately represent the Earth’s rotation. This was the biggest problem and took the most time to fix. Three.js orbital camera controls are incredibly aggressive about capturing mouse events. The 3D engine was always suppressing the HTML ‘click’ events, making the “EXPAND” button not work. Not only that, the standard inline CSS was pushing the 3D canvas down the page, which misaligned everything and didnt allow me to select the satellites at all. To fix this, fisrt, i locked the 3D canvas to a fixed background layer (z-index: -1) to completely isolate it from the UI layout. Second, i bypassed the WebGL event interceptors entirely and connected the code that handles the expansion directly to a global window function (window.toggleMap) and just injected the button with the HTML onclick attribute. This fixed everything and now it works really great.
OrbitLens Devlog #8: Scaling the 3d globe and some other stuff In the last update, i finally implemented the 2d map so this time i want to take this website a step further since the foundation is stable enough. I decided to go from tracking 5 hardcoded satellites to over 16,000 space objects. Here is what i changed, how i changed it and the challenges i faced: Change 1: Originally, i just added the starlink satellites to what i already had which was my initial goal. but the thing was, i was requesting the API for thousands of satellites, which did work once and all of them were stored in localStorage but for ‘testing purposes’ (i was just stupif), i cleared the localStorage and re-requested the TLE which it then instantly rejected cus of its ‘anti-bot firewalls’ and i got ip banned for like a couple of hours and it gave a 403 error aswell. To fix this, i read some CelesTrak documentation and i realised that there is a way to ismply request all the satellite (every satellite that it had) data in one request. Apparently there was a special search query (‘active’) that i could’ve used but instead i individually fetched everything. So once i used that query, i got all of the satellitse (a bit more than 16000) rendered on the earth but it was laggy, which leads to my second change. Change 2 To fix this massive lag caused by the 16000+ satellites, I completely replaced the standard 3D mesh pipeline with THREE.InstancedMesh so that instead of creating 16,000 individual sphere objects (which would like instantly crashes the browser), i can feed the GPU a single geometry and material, along with an array of 16,000 matrixes. That means now the gpu like renders everything in one go. But, I hit a massive 5-second freeze whenever a user clicked the ISS (which makes sense cus this was a 4k extremely detailed 3d model). The thing was, WebGL delays uploading heavy 3D textures to the GPU until an object is actually rendered on screen. And because the ISS model was hidden on startup, the compiler skipped it, so the website was stuck trying to render it when i selected the ISS. I solved this by forcing the renderer to draw one “dummy frame” with all models visible during the loading screen, which, in a sense, ‘warmed up’ the GPU. Change 3: The lag was better but it was still there and i realised the problem was that each of the dots representing a satellite were smoothly moving in space. This smooth-moving physics applied to over 16000 dots was what slowed down the website. To fix this, I rewrote the loop that propogates the satellite dots so physics calculations wouldn’t choke the main JavaScript thread. To do this i built a system to process the satellites in batches of 4,000 satellites per frame instead of all 16,000. Second, i scrapped geodetic trigonometry (latitude/longitude conversions; see one of the earlier devlogs) and replaced it with direct Earth-Centered, Earth-Fixed (ECEF) 3D vector rotation. Initially, our batches were too small, causing satellites to visually ‘teleport’ instead of smoothly gliding, which looked really glitchy. But by upgrading to matrix rotation, i managed to get a huge increase in speed. This allowed me to crank the batch size up and get that smooth motion across the entire thing. Change(s) 4: There were still some small bugs in the visual aspects like the dots disappearing or the transition jump (see previous devlog(s) to understand) and stuff but i took care of them.
OrbitLens Devlog #9: implemented satellite filtering + earth connecting line and complete UI overhaul Now that the website has a proper engine and everything was working well, i decided to add some more stuff. I had two goals for this session. One was to add a satellite filtering option where the user can filter categories of satellites. The other is to change the ui because there were many imprefectoins. Here is a breakdown of what i changed and the challenges i faced: Change 1: I added a global filtering system to fiter satellites by categories. To do this i first built a string-matching engine directly into the TLE parsing loop. As the engine downloads the TLE data from the API, it scans the satellite names and tags them each with categories. I didn’t really know what to categorise them so i thought of some categories and i asked ai to think of some categories. These are the categories: StarlinkOnewebCommsNavigationWeatherand Other/Miscallaneous (which i impemented later; read below) I then wired the HTML dropdown directly into the WebGL gpu loop. Instead of deleting unselected satellites (which would take up too much gpu memory), the gpu simply multiplies their matrix scale to 0, 0, 0, which would just hide them. But there was a challenge that i faced, though it wasn’t a big one. When i first implemented the filter, I noticed that the total satellite count dropped to around 12,000. It turned out that all the satellites that didnt fit into any cateogry were not shown at all so i expanded the categories to include an OTHER category. I also had to make some changes in the raycaster or the users would accidentally be clicking on the hidden satellites. Change 2: I also added a line connecting the selected satellite directly to its exact spot on the Earth’s surface directly beneath it. I did this by first pre-allocating a THREE.BufferGeometry with exactly two vertices. Inside the animation loop, i then took the satellite’s live 3D coordinates and use a .normalize() math function. Because the Earth has a radius of exactly 1, normalizing the 3d coordinates perfectly attaches the bottom of the line to the planet’s surface. But, i ran into a bug where the line would randomly disappear depending on the camera angle. After some research (ai) i found out that this was caused by Three.js’s “Frustum Culling.” The code calculated the line bounding box once when the websited started up and when the camera moved away from that initial box, the gpu assumed the line was out of sight and stopped rendering it to save memory. So i just added a line of code (frustumCulled = false) that just overrode that. Change 3: Lastly, i essentially completely rewrote the styles.css to change how the ui looked cus i didn’t relaly like how it looked before. So this was the third change.
OrbitLens Devlog #10: mobile layout implementation + better loading screen I am nearing the first ship of this project so this session were just about the final aspects that needed to be improved Change 1: I completely changed the loading screen. Firstly, it now displays the loading percentage that accurately shows the real time progress. Secondly, overall it just looks much better. Thirdly, i also implemented an error notification in the main dashboard in case the API doesnt work and so the website doesnt look like it’s broken Change 2: I added a mobile layout option. by that i mean that if the user is accessing this website on a mobile, it won’t be completely botched (hopefully) p.s. i know this devlog isnt that detailed as my previous ones and that’s because there isn’t much to talk about in this session cus the main changes were in the styles.css (and i’m hella tired)
OrbitLens Devlog #11: Semi-final changes In this session, i focused on finding small aspects that need to be improved and improved them. Change 1: Firstly, i realised that the dropdown i had implemented was the default dropdown and it didn’t rlly fare well when there were 16000 items to choose from. So i made a custom dropdown, which looks much better than the default one, and made a funciton along with it that shows like the first 200 items matching the search query or, if nothing in being searched, the first 200 items in the list that the API gave. This made the entire experiene so much better because the default dropdown looked kinda ugly cus it took the whole length of the screen. Normally, this wouldnt take too long but i accidentally deleted the wrong eventListeners multiple times because satFilter and satSearch were so similar. So i spent like a good amount of time trying ot find the problem, and it turned out that i justmodified or deleted the wrong thing. Change 2: I found a problem with the filtering system, more specifically in filtering the space stations. Previously, i just had all the satellites with ISS or CSS in their names classified as space station because there are only two space statoins in space right now (ISS and Tiangong) so i filtered any satellites with those two names. But i failed to take into account that other satellites might also have ISS or CSS in their names so instead of two satellites showin up, 16 satellites were avaialbe in that filter. And these were not space stations but rather other statellits which had like ISS or CSS in their names (e.g. Swisscube). So i changed the filter to filter the space stations by their respective NoradIDs, which worked. Change 3: This change wasnt too big; i modified the expanded map layout becaues how it was before led to it having a lot of blank space and probalby wouldnt have looked good in differnet devices.
OrbitLens Devlog #12: Added README.md and ARCHITECTURE.md In this session, i added the README and ARCHITECTURE.md. The README.md highlights the basic features of the website, the tech stack used and how to run this project locally. The ARCHITECTURE.md goes deeper into how the code itself works so anyone perusing it can get a better idea on how i built this project.
OrbitLens Devlog #13: fixing deployment bugs 😭😭 Before i continue with this devlog, let me start by saying that modern security rules are the worst. Like istg, why do they have to be so strict? Anyway, you’ll see what i mean by that down below. THis session was all about fixing the deployment bugs. I was almost done and then these f bugs ruined it. This devlog has only abt 30 mins logged because i had the help of ai to fix this because this was way way out of my expertise. Here are the changes. I used ai for this devlog though cus i didn’t understand what it did (but i only used it for htis devlog): Problem 1: The [UNSUPPORTED_FEATURE] Vite Crash My very first Vercel build crashed immediately with a “Top-level await is currently not supported with the ‘iife’ output format” error. Apparently, the satellite.js library I use for SGP4 orbital propagation runs heavy calculations using Web Workers and WebAssembly. By default, Vite tries to bundle everything into an older iife format for maximum browser compatibility, which completely choked on the newer await feature inside the worker file. I fixed this (with the help of ai) by explicitly telling Vite’s internal bundler (Rolldown) to output modern ES modules for both the main thread and the background workers. I created a vite.config.js file and updated the configuration (see vite.config.js in the github repo) Problem 2: 404 Missing 3D Models After fixing the build, the site successfully deployed, but my 3D models (like the ISS and Hubble) and Earth textures threw 404 Not Found errors in the console. Because I was loading these assets while the app was running in my Three.js code using string paths (e.g., ‘/models/iss.glb’), Vite didn’t know they existed and simply excluded them from the final production build. I moved my models and textures folders into Vite’s public directory. Anything placed in the public folder gets copied exactly as is to the root of the final build. This bug wasn’t too bad but the next one was absolute hell. Problem 3: API, Cloudflare and CORS block This was the hardest part. Orbit Lens fetches live Two-Line Element (TLE) data for over 16,000 satellites directly from CelesTrak. It worked perfectly when i hosted it locally, but on Vercel, the browser instantly threw a 403 Forbidden error. CelesTrak uses Cloudflare to prevent automated scraping. When Cloudflare saw an Origin header coming from a deployed Vercel frontend instead of an normaly IP like my computer’s, it blocked the connection. Attempts to use public proxies (like allorigins) resulted in 408 Request Timeout errors because the multiple mb big satellite data took too long to transfer. To fix this, I used Vercel’s Native Rewrites (i have no idea how to use this so i asked ai to do it for me). “I” ;) created a vercel.json file in the root directory to act as a silent backend proxy. By fetching from my own local route (/api/celestrak), the browser doesn’t trigger CORS security. Vercel’s backend intercepts the request, strips the frontend Origin header that was triggering the firewall, and routes the raw data back to the application. This worked! And the website is finally live and i am about to ship the project!
Ships:
This is Orbit Lens, a real-time 3D satellite tracking website built using vanilla JavaScript and Three.js. It tracks over 16,000 live space objects around earth using real-time data from CelesTrak. It has many features including 3d and 2d orbit tracking, 3d models of select satellites (ISS, Terra, HST, and Aqua). It also includes a filtering feature where you can filter satellites based on specific categories Before testing this project, it is important to know some stuff: You will have the best experience if you access this through a laptop or desktop Sometimes, the api maybe down or is not responding to requests so please keep in mind that if you see an alert saying API not responding, it is out of the website’s hands and it an error outside of my control. That’s it. Thank you for testing this project and hope you like it :)...
|
1792878696.1561775
|
1793742696.1561775
|
|
57736
|
graphite by @ttyChud | Stardance
|
ttyChud
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: graphite by @ttyChud | Stardance
|
1792929166.4051642
|
1793793166.4051642
|
|
58464
|
atomic by @ttyChud | Stardance
|
ttyChud
|
0
|
36.45
|
0
|
[]
|
[{"post_id": 65584, "ts": "202 [{"post_id": 65584, "ts": "2026-09-10T20:25:58Z", "hours": 7.5739, "text": "atomic Devlog #6: the atom stops lying and starts solving itself Since last time i added a whole layer: fine structure, real spectral lines, a hot-gas version, and Hartree-Fock — the atom now solves its own electrons. Change 1: real levels. The clean Bohr ladder hides structure, so i added five closed-form refinements: fine structure, Dirac (which shows 2s1/2=2p1/2 exactly — reality splits them with the Lamb shift, and the model admits it), Zeeman’s full Breit-Rabi crossover, Stark, and the hyperfine 21 cm line. Each carries its own trust tier. Change 2: line strengths. I compute the dipole integral, then oscillator strength, Einstein A and lifetimes, and check everything against vendored NIST wavelengths (never live). The silent killer: both states in a transition must share one grid, so a test feeds a pair whose natural boxes differ. Change 3: it’s a gas now. Boltzmann + Saha populations, Gaussian/Lorentzian/Voigt profiles, optical depth, transfer I=B(1-e^-tau), and the curve of growth. Where a choice is a choice (plasma level truncation), it’s tagged MODEL. Change 4: Hartree-Fock. GSZ was a fitted model — no sulfur or chlorine, double-counted energy, unsigned error. HF is variational, so E_HF >= E_exact: a bounded, one-signed error the provenance can state. Slater integrals, angular coefficients pinned four ways, matrix-free LOBPCG for the non-local exchange, three independent energy checks. Payoff: Li->P, plus sulfur and chlorine — atoms GSZ couldn’t do. Result: 888 Python + 179 frontend tests green. Next: counterfactual electrons and HF 3D clouds."}, {"post_id": 65048, "ts": "2026-09-09T21:38:28Z", "hours": 8.0586, "text": "atomic Devlog #5: breaking physics on purpose, then adding real atoms Two big landings since last time: the What-If labs (altered constants, custom force laws, classical ghosts) and screened multi-electron atoms all the way from engine to UI. 359 tests green. You can now break the laws of physics Five sliders over the raw constants of nature — double the electron charge, quadruple vacuum permittivity, watch alpha, the Bohr radius and binding energy refuse to move. That degeneracy is the whole lesson: only dimensionless combinations are observable. Next to it, force-law presets (power law, Yukawa, harmonic, finite well, Coulomb-plus-core) plus a type-your-own V(r) box with a whitelist parser and a trust gate that flags unconverged levels instead of silently serving them. And the classical ghost: what Newton predicts for hydrogen, a spiral into the nucleus in picoseconds, which quantum mechanics forbids. That refusal is the point. Real multi-electron atoms GSZ screened model with honest transcribed parameters for 15 elements, self-consistent-solver-free but validated against ionization data. Monte-Carlo cloud sampling with KS-tested distributions, y=0 plane cross-sections, screened levels and radial endpoints on the API, atom picker entries and an occupancy ladder in the UI. Sulfur and chlorine get a named refusal instead of invented numbers — no fitted parameters exist for them, so the server says exactly that."}, {"post_id": 64197, "ts": "2026-09-08T12:55:37Z", "hours": 8.1053, "text": "atomic Devlog #3: solver, server, and the web instrument Three phases landed since last time: the numerical solver, the FastAPI backend, and the React + Three.js frontend. 193 backend tests and 48 frontend tests green, everything pushed. Change 1: numerical radial solver Built a 3-point finite-difference solver for arbitrary central potentials, plus a grid-halving error estimator. Validated against the exact hydrogen answers: energies match, 1s overlap > 0.99999, convergence measures exactly 2.00 across all cases. Two of my own test assertions were wrong along the way (forgot reduced mass in the expected energy, grid too coarse for the normalization check) — the engine was right both times. Change 2: FastAPI backend atomic serve now runs a real server: health, systems, state, levels, radial endpoints, plus background jobs (cloud sampling, plane cross-sections) with websocket progress and binary data channels. Sampling is honest inverse-transform Monte Carlo of |psi|². Also fixed a URL-encoding bug where the he+ key decoded as “he “ and got refused everywhere — verified against the live server. Change 3: web instrument Full frontend: orbitable 3D point clouds with density/phase coloring, y=0 plane canvas views, clickable energy ladders, radial R/P plots with node marks and mean-radius markers, shareable URLs for every state, zustand store underneath. Production build splits Three.js into a lazy chunk; the server mounts the built UI directly."}, {"post_id": 63080, "ts": "2026-09-06T17:50:33Z", "hours": 6.7197, "text": "atomic Devlog #2: exact hydrogen engine + systems registry I had two goals in my mind in this session. One was to build the exact hydrogen-like physics engine and the other is to add a systems registry plus the element tables. Here is what and how I implemented this stuff and the challenges i faced: Change/Problem 1: Before I even got started on the new stuff i wanted to add, i faced a big problem. The moment i wired the new physics into last session’s spine, 4 tests instantly failed. My Field type (the container every array result travels in) demanded its grid be strictly increasing, but wavefunction sampling evaluates on scattered, unsorted points, so every single evaluation got rejected with a ValueError. The fix: It is important to know what a Field actually is here. It’s not a mesh — it’s just samples of a function on a set of points, plus the provenance saying how they were computed. Sorted-ness is a quadrature concern and belongs to the mesh module, not the container. So i dropped just the ordering rule and kept the finite/shape guards, then added a regression test pinning the decision so nobody re-adds it later and silently breaks everything again. Change 2: hydrogen engine implementation I implemented the exact closed-form hydrogen-like solutions, all in Hartree atomic units. The energy is E_n = −mu_ratio · Z² / (2n²), and the trick that makes it powerful is the reduced-mass ratio mu/m_e sitting right in the formula — deuterium, tritium, muonic hydrogen and positronium all fall out of the same code just by changing that one number. The radial functions use the normalized generalized-Laguerre form R_nl = N · exp(−ρ/2) · ρ^l · L(ρ) with ρ = 2Zμ′r/n, and mean radii come from = (3n² − l(l+1)) / (2Zμ′). I checked the 1s case by hand: = 1.5 bohr, exactly like the textbooks say. Change 3: angular bases + systems + proof I implemented both angular bases as first-class outputs: complex spherical harmonics (with the Condon-Shortley phase, so Y_1^1 has a negative real part at phi=0) and real chemistry orbitals (p_x, p_y, d_xy and friends with proper orientation). On top of that sits the systems registry — H, D, T, muonic hydrogen, positronium, He+, plus a generic hydrogen_like(Z) — each carrying CODATA-cited reduced masses and honest nuclear radii (positronium gets None instead of a fake zero, because its “nucleus” is a point positron). The last batch of work was the proof: 139 tests green. Normalization, orthogonality, node counts coming out as exactly n−l−1 every time, angular orthonormality up to l=3 in both bases. Nothing’s shipped anywhere yet though — next is Phase 2, the numerical solver, validated against these exact answers. That’s the first real solver-vs-truth showdown."}, {"post_id": 62261, "ts": "2026-09-05T15:27:04Z", "hours": 5.99, "text": "atomic Devlog #1: foundation is done, the atom has a spine i just kick started a new project called atomic, and the aim is kinda crazy: a quantum-mechanical atom model that never quietly lies about its physics. every number that crosses a module boundary carries a record of how it was computed and how far it can be trusted, with tiers going from EXACT (closed-form) all the way to COUNTERFACTUAL (deliberately altered physics, computed rigorously). i’ve got the whole thing mapped out as a 15-phase plan. today was all about Phase 0: the foundation. no physics yet, just the spine everything else will stand on. Change 1: environment setup (this fought me) my machine had no conda, no pip, no uv, nothing. just bare python 3.14. i almost gave up and then found out python ships with ensurepip, so i bootstrapped a venv with python3 -m venv .venv and pip-installed numpy, scipy, pytest and ruff into it. worked first try after that. lesson learned: check ensurepip before panicking. Change 2: the provenance spine + constants + mesh i scaffolded the actual package: provenance.py (the fidelity tiers plus the Quantity and Field types that carry them), constants.py (CODATA values with a counterfactual-universe hook for the future What-If lab, where you’ll be able to mess with constants like e and watch what breaks), and numerics/mesh.py (uniform + exponential radial meshes with a ghost-node fix at the inner wall, since an exponential mesh can’t reach the origin). getting the discretization right now means every solver later stands on solid ground. Change 3: evidence-style tests, all green i wrote 34 tests and they all pass in 0.2 seconds. they’re written as evidence, not coverage: solver checks against the exact hydrogen ground state, mesh guards that refuse bad inputs, constants checked against published CODATA values. the idea is that if i ever break the physics, CI screams at me immediately."}]...
|
Title: atomic by @ttyChud | Stardance
Devlogs:
at Title: atomic by @ttyChud | Stardance
Devlogs:
atomic Devlog #1: foundation is done, the atom has a spine i just kick started a new project called atomic, and the aim is kinda crazy: a quantum-mechanical atom model that never quietly lies about its physics. every number that crosses a module boundary carries a record of how it was computed and how far it can be trusted, with tiers going from EXACT (closed-form) all the way to COUNTERFACTUAL (deliberately altered physics, computed rigorously). i’ve got the whole thing mapped out as a 15-phase plan. today was all about Phase 0: the foundation. no physics yet, just the spine everything else will stand on. Change 1: environment setup (this fought me) my machine had no conda, no pip, no uv, nothing. just bare python 3.14. i almost gave up and then found out python ships with ensurepip, so i bootstrapped a venv with python3 -m venv .venv and pip-installed numpy, scipy, pytest and ruff into it. worked first try after that. lesson learned: check ensurepip before panicking. Change 2: the provenance spine + constants + mesh i scaffolded the actual package: provenance.py (the fidelity tiers plus the Quantity and Field types that carry them), constants.py (CODATA values with a counterfactual-universe hook for the future What-If lab, where you’ll be able to mess with constants like e and watch what breaks), and numerics/mesh.py (uniform + exponential radial meshes with a ghost-node fix at the inner wall, since an exponential mesh can’t reach the origin). getting the discretization right now means every solver later stands on solid ground. Change 3: evidence-style tests, all green i wrote 34 tests and they all pass in 0.2 seconds. they’re written as evidence, not coverage: solver checks against the exact hydrogen ground state, mesh guards that refuse bad inputs, constants checked against published CODATA values. the idea is that if i ever break the physics, CI screams at me immediately.
atomic Devlog #2: exact hydrogen engine + systems registry I had two goals in my mind in this session. One was to build the exact hydrogen-like physics engine and the other is to add a systems registry plus the element tables. Here is what and how I implemented this stuff and the challenges i faced: Change/Problem 1: Before I even got started on the new stuff i wanted to add, i faced a big problem. The moment i wired the new physics into last session’s spine, 4 tests instantly failed. My Field type (the container every array result travels in) demanded its grid be strictly increasing, but wavefunction sampling evaluates on scattered, unsorted points, so every single evaluation got rejected with a ValueError. The fix: It is important to know what a Field actually is here. It’s not a mesh — it’s just samples of a function on a set of points, plus the provenance saying how they were computed. Sorted-ness is a quadrature concern and belongs to the mesh module, not the container. So i dropped just the ordering rule and kept the finite/shape guards, then added a regression test pinning the decision so nobody re-adds it later and silently breaks everything again. Change 2: hydrogen engine implementation I implemented the exact closed-form hydrogen-like solutions, all in Hartree atomic units. The energy is E_n = −mu_ratio · Z² / (2n²), and the trick that makes it powerful is the reduced-mass ratio mu/m_e sitting right in the formula — deuterium, tritium, muonic hydrogen and positronium all fall out of the same code just by changing that one number. The radial functions use the normalized generalized-Laguerre form R_nl = N · exp(−ρ/2) · ρ^l · L(ρ) with ρ = 2Zμ′r/n, and mean radii come from = (3n² − l(l+1)) / (2Zμ′). I checked the 1s case by hand: = 1.5 bohr, exactly like the textbooks say. Change 3: angular bases + systems + proof I implemented both angular bases as first-class outputs: complex spherical harmonics (with the Condon-Shortley phase, so Y_1^1 has a negative real part at phi=0) and real chemistry orbitals (p_x, p_y, d_xy and friends with proper orientation). On top of that sits the systems registry — H, D, T, muonic hydrogen, positronium, He+, plus a generic hydrogen_like(Z) — each carrying CODATA-cited reduced masses and honest nuclear radii (positronium gets None instead of a fake zero, because its “nucleus” is a point positron). The last batch of work was the proof: 139 tests green. Normalization, orthogonality, node counts coming out as exactly n−l−1 every time, angular orthonormality up to l=3 in both bases. Nothing’s shipped anywhere yet though — next is Phase 2, the numerical solver, validated against these exact answers. That’s the first real solver-vs-truth showdown.
atomic Devlog #3: solver, server, and the web instrument Three phases landed since last time: the numerical solver, the FastAPI backend, and the React + Three.js frontend. 193 backend tests and 48 frontend tests green, everything pushed. Change 1: numerical radial solver Built a 3-point finite-difference solver for arbitrary central potentials, plus a grid-halving error estimator. Validated against the exact hydrogen answers: energies match, 1s overlap > 0.99999, convergence measures exactly 2.00 across all cases. Two of my own test assertions were wrong along the way (forgot reduced mass in the expected energy, grid too coarse for the normalization check) — the engine was right both times. Change 2: FastAPI backend atomic serve now runs a real server: health, systems, state, levels, radial endpoints, plus background jobs (cloud sampling, plane cross-sections) with websocket progress and binary data channels. Sampling is honest inverse-transform Monte Carlo of |psi|². Also fixed a URL-encoding bug where the he+ key decoded as “he “ and got refused everywhere — verified against the live server. Change 3: web instrument Full frontend: orbitable 3D point clouds with density/phase coloring, y=0 plane canvas views, clickable energy ladders, radial R/P plots with node marks and mean-radius markers, shareable URLs for every state, zustand store underneath. Production build splits Three.js into a lazy chunk; the server mounts the built UI directly.
atomic Devlog #5: breaking physics on purpose, then adding real atoms Two big landings since last time: the What-If labs (altered constants, custom force laws, classical ghosts) and screened multi-electron atoms all the way from engine to UI. 359 tests green. You can now break the laws of physics Five sliders over the raw constants of nature — double the electron charge, quadruple vacuum permittivity, watch alpha, the Bohr radius and binding energy refuse to move. That degeneracy is the whole lesson: only dimensionless combinations are observable. Next to it, force-law presets (power law, Yukawa, harmonic, finite well, Coulomb-plus-core) plus a type-your-own V(r) box with a whitelist parser and a trust gate that flags unconverged levels instead of silently serving them. And the classical ghost: what Newton predicts for hydrogen, a spiral into the nucleus in picoseconds, which quantum mechanics forbids. That refusal is the point. Real multi-electron atoms GSZ screened model with honest transcribed parameters for 15 elements, self-consistent-solver-free but validated against ionization data. Monte-Carlo cloud sampling with KS-tested distributions, y=0 plane cross-sections, screened levels and radial endpoints on the API, atom picker entries and an occupancy ladder in the UI. Sulfur and chlorine get a named refusal instead of invented numbers — no fitted parameters exist for them, so the server says exactly that.
atomic Devlog #6: the atom stops lying and starts solving itself Since last time i added a whole layer: fine structure, real spectral lines, a hot-gas version, and Hartree-Fock — the atom now solves its own electrons. Change 1: real levels. The clean Bohr ladder hides structure, so i added five closed-form refinements: fine structure, Dirac (which shows 2s1/2=2p1/2 exactly — reality splits them with the Lamb shift, and the model admits it), Zeeman’s full Breit-Rabi crossover, Stark, and the hyperfine 21 cm line. Each carries its own trust tier. Change 2: line strengths. I compute the dipole integral, then oscillator strength, Einstein A and lifetimes, and check everything against vendored NIST wavelengths (never live). The silent killer: both states in a transition must share one grid, so a test feeds a pair whose natural boxes differ. Change 3: it’s a gas now. Boltzmann + Saha populations, Gaussian/Lorentzian/Voigt profiles, optical depth, transfer I=B(1-e^-tau), and the curve of growth. Where a choice is a choice (plasma level truncation), it’s tagged MODEL. Change 4: Hartree-Fock. GSZ was a fitted model — no sulfur or chlorine, double-counted energy, unsigned error. HF is variational, so E_HF >= E_exact: a bounded, one-signed error the provenance can state. Slater integrals, angular coefficients pinned four ways, matrix-free LOBPCG for the non-local exchange, three independent energy checks. Payoff: Li->P, plus sulfur and chlorine — atoms GSZ couldn’t do. Result: 888 Python + 179 frontend tests green. Next: counterfactual electrons and HF 3D clouds....
|
1792932855.3437366
|
1793796855.3437366
|
|
10421
|
Canputer by @tttimtw | Stardance
|
tttimtw
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Canputer by @tttimtw | Stardance
|
1793404481.6762645
|
1794009281.6762645
|
|
2716
|
Untitled project by @ttt600161 | Stardance
|
ttt600161
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @ttt600161 | Stardance
|
1792918347.20832
|
1793782347.20832
|
|
51336
|
My awesome macropad! by @ttt600161 | Stardance
|
ttt600161
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @ttt600161 | Starda Title: My awesome macropad! by @ttt600161 | Stardance...
|
1793386351.5531867
|
1793991151.5531867
|
|
57371
|
GitMC by @ttt600161 | Stardance
|
ttt600161
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: GitMC by @ttt600161 | Stardance
|
1793436525.1764095
|
1794041325.1764095
|
|
42278
|
Monado Phone Driver by @ttomf | Stardance
|
ttomf
|
3
|
76.94
|
1364
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-16T16:44:11Z", "hours": 22.0, "multiplier": 19.73, "payout": 430, "blessing": "neutral", "text": "I made Monado Phone Driver - a bridge between VR app and phone in cardboard headset. This allows you to play VR games just with Linux PC and Android phone, without buying expensive VR headset. There are alternatives, like ALVR and WiVRn , but my driver has 6DOF tracking (you can move and rotate in space) and hand tracking (it takes hand landmarks from PC or phone camera). Since last ship, I improved stability, added Android app settings, created auto installer, and mainly tracking from PC camera, because phone has small FOV and limited performance.", "repo": "https://github.com/ttomf/monado-phone", "demo": "https://github.com/ttomf/monado-phone/releases/"}, {"ship_num": 2, "ts": "2026-09-04T08:04:23Z", "hours": 32.0, "multiplier": 19.12, "payout": 609, "blessing": "neutral", "text": "Hi! This is my second ship of this project, Monado Phone Driver. It’s bridge between your VR app and your phone in headset ( Google Cardboard ). I wanted to make it better than ALVR , because it has only 3DOF tracking, so I created 6DOF tracking and hand tracking, like professional headsets. The most challenging part of this was debugging all of these. From Vulkan swapchain management and GStreamer pipeline to hand and 6DOF tracking. I am proud of it, because this will help people without VR headsets to enjoy VR games. NOTE: Hand tracking is done the best possible way, but I think it still doesn’t compete with real VR headsets. Next ship should add better tracking with PC camera.", "repo": "https://github.com/ttomf/monado-phone", "demo": "https://github.com/ttomf/monado-phone/releases/"}, {"ship_num": 3, "ts": "2026-08-05T13:16:21Z", "hours": 19.0, "multiplier": 17.05, "payout": 325, "blessing": "neutral", "text": "Hi! I ship my Monado Phone Driver ! I worked on it for last week and it was really challenging. My vision was to build something with what you can play VR games on phone (with Google Cardboard), like iVRy, but open-source and simple. I worked on streaming pipeline, UDP discovery, pose tracking and gluing it all together with Monado. I hope this will help people that wanted to play VR games without expensive headset.", "repo": "https://github.com/ttomf/monado-phone", "demo": "https://github.com/ttomf/monado-phone/releases/"}]...
|
[{"post_id": 73208, "ts": "202 [{"post_id": 73208, "ts": "2026-09-24T16:33:26Z", "hours": 3.9361, "text": "Hi! So I’m here again after many exams (I didn’t have time and strength to iteratively test this ) and I’m gonna make this better using better Hand Landmarkers and (hopefully) run on Window$."}, {"post_id": 69212, "ts": "2026-09-16T16:31:16Z", "hours": 1.6044, "text": "I think it’s time to new release! I merged upstream, created tag, built app and driver and published on GitHub."}, {"post_id": 68141, "ts": "2026-09-14T16:07:57Z", "hours": 3.4667, "text": "I am working on implementing hand controller using same data as hand tracking does. It also includes the “aim pose” - where does controller point. On video, it’s shown as red line, I take it from the index finger. I hope I will be able to play some better VR games!"}, {"post_id": 66631, "ts": "2026-09-12T14:11:34Z", "hours": 5.8714, "text": "I’ve fixed some bugs and leaks, added more configuration to Android app and created hand tracking vizualization for the PC script. Also, I am working on integrating hands as controllers (because controllers have better support across games)."}, {"post_id": 63611, "ts": "2026-09-07T15:18:52Z", "hours": 3.8808, "text": "YEAH! I have finally done the PC camera hand tracking! It has much better FOV than phone camera and more computing power. It’s just Python script with MediaPipe, sending the data to 127.0.0.1 to hand port, and it has same format, so the driver doesn’t even know the data is sending someone other than phone. You will ofc need to disable phone hand tracking, otherwise they will collide. As you see in the video, I can move the hands far and they still get tracked. (End of the video is when I took off the headset - it was also tracked :D)"}, {"post_id": 62773, "ts": "2026-09-06T09:09:55Z", "hours": 1.3114, "text": "Now I am making just minor changes to the driver as the base is nearly done. I added screen size synchronization with phone, so the driver now can send right stream. Also I am making small bugfixes and improvements."}, {"post_id": 62286, "ts": "2026-09-05T16:11:29Z", "hours": 1.7353, "text": "I added settings on phone, so now you can really configure the ports on both sides! Also there’s option to disable hand tracking or 6DOF (then it will send only rotation of headset)"}, {"post_id": 62060, "ts": "2026-09-05T09:18:28Z", "hours": 3.9211, "text": "I created simple terminal installer in python that downloads and setups Monado Phone Driver. Thanks also for the positive reviews and the 19.12x stardust multiplier — when I started this project, I didn’t think I’d ever finish it :D"}, {"post_id": 61371, "ts": "2026-09-04T07:52:18Z", "hours": 0.4617, "text": "Last devlog before ship! I just merged upstream monado, built release binaries and created GitHub release."}, {"post_id": 61334, "ts": "2026-09-04T06:19:09Z", "hours": 2.1025, "text": "So I finished the hand tracking! I tried to make it as good as possible on a phone, and it looks like it might actually work! Even though I’m limited by the hardware, you can see in the video that it tracks pretty well. (video from openxr-simple-playground )"}, {"post_id": 60746, "ts": "2026-09-03T09:54:46Z", "hours": 5.6369, "text": "I am enhancing hand tracking now, and it’s starting to look good! Here is how: I use MediaPipe by Google to analyze image from front camera. MediaPipe Hand Landmarker returns hand landmarks in camera-relative format in two dimensions, so I need to make depth (z-coordinate). I measure distance between wrist and fingers, in 2D space this means distance from camera (the farther away they are, the smaller they get). Now, they are 3D, but still relative to camera. Then I simply send both hands as UDP packet for the driver. The driver (PC side) computes real-world coordinates of the hands using saved earlier sent from ARCore and pushes them into Monado."}, {"post_id": 59610, "ts": "2026-09-01T15:01:51Z", "hours": 6.9739, "text": "I worked hard on both the Android app and the Monado driver and finally: I have working hand tracking! It is very laggy, needs many optimizations, and isn’t even in alpha state yet, but I can see that it is possible to do it. This was my dream when I began this project, and finally, it has come true. I hope it will help many people who cannot afford a professional headset :D"}, {"post_id": 58719, "ts": "2026-08-31T08:20:00Z", "hours": 2.2467, "text": "So today I finished image settings (you can configure them in the config file). They control how the image is rendered, because every headset has different lenses, distance between lenses, distance from screen to lenses etc. To find your headset’s properties, go to https://wwgc.firebaseapp.com/ ."}, {"post_id": 58171, "ts": "2026-08-30T15:09:22Z", "hours": 3.5397, "text": "I created new TCP socket logic for configuration sharing and added logic for loading configuration file. Now I am trying to change the x265enc software encoding to something faster on GPU. Unfortunately, nvenc (nvidia encoding) is really hard to configure properly, as you can see for yourselves."}, {"post_id": 57515, "ts": "2026-08-29T17:59:31Z", "hours": 9.2639, "text": "Phew, I almost went over the time limit (10 hours) :D I tried to get it running on Windows, and I partially succeeded, but it’s still not stable. Aside from that, I mostly cleaned up the code, improved usability, and removed unnecessary modules from CMake. Now I’m working on an improved distortion using Monado’s u_distortion_cardboard_calculate (cardboard stands for Google Cardboard btw) And one more thing: thanks to everyone for the positive feedback on the project — I really didn’t expect that!"}, {"post_id": 46899, "ts": "2026-08-14T13:22:12Z", "hours": 1.6314, "text": "Since nobody reviewed my submission, I don’t want to add more features, so I only updated the README and made small changes to the app. If anyone wants to play VR games on their phone, they can just download the files from Releases and run them without hard compiling!"}, {"post_id": 41279, "ts": "2026-08-05T12:09:23Z", "hours": 6.8658, "text": "Devlog 4 : I replaced boilerplate LLM code with my own. I also wrote README with instructions, so you can now try it!"}, {"post_id": 40628, "ts": "2026-08-04T09:25:23Z", "hours": 0.6022, "text": "I am making minor adjustments to run with SteamVR. I use opencomposite as layer between OpenXR and OpenVR/SteamVR. Video is phone screencap from free Steam game “Aircar”."}, {"post_id": 39990, "ts": "2026-08-03T10:37:11Z", "hours": 3.0761, "text": "Devlog 3 : I made 6DOF (6 degrees of freedom = position+rotation in space) tracking with ARCore. It’s a bit laggy, but it works. This is just test, I plan to optimize it later. Video is from xrgears with looking around."}, {"post_id": 39422, "ts": "2026-08-02T11:32:08Z", "hours": 1.5058, "text": "Devlog 2 : Finally I made working streaming pipeline! My driver takes image from Monado, gstreamer encodes it and sends via UDP. On phone, there is AMediaCodec that takes the packets, joins them and renders. Used codec is HEVC (H265). Video is from xrgears demo."}, {"post_id": 38950, "ts": "2026-08-01T15:47:39Z", "hours": 4.6072, "text": "So now I’m basically stuck. Three hours of debugging the streaming pipeline, refractoring with Opencode and trying to make it work. As you see, even Deepseek is struggling with it… Wish me luck 🤞"}, {"post_id": 38092, "ts": "2026-07-31T09:43:03Z", "hours": 2.3839, "text": "Hi! So I have started this project because I want to play VR games, but I don’t have any headset, only Google Cardboard. I know there is ALVR and iVRy, but: ALVR doesn’t have support for hand tracking and 6DOF iVRy is closed-source and wants to pay Sorry, but I don’t plan to add Windows support soon. Devlog 1 : I forked Monado and made some bureaucracy (like adding my driver to CMakeLists.txt etc.) I made simple Android app that pairs over UDP multicast with my driver. The image is from editor, because I don’t have anything interesting to post (except maybe positive logs 😁)"}]...
|
Title: Monado Phone Driver by @ttomf | Stardance
Title: Monado Phone Driver by @ttomf | Stardance
Devlogs:
Hi! So I have started this project because I want to play VR games, but I don’t have any headset, only Google Cardboard. I know there is ALVR and iVRy, but: ALVR doesn’t have support for hand tracking and 6DOF iVRy is closed-source and wants to pay Sorry, but I don’t plan to add Windows support soon. Devlog 1 : I forked Monado and made some bureaucracy (like adding my driver to CMakeLists.txt etc.) I made simple Android app that pairs over UDP multicast with my driver. The image is from editor, because I don’t have anything interesting to post (except maybe positive logs 😁)
So now I’m basically stuck. Three hours of debugging the streaming pipeline, refractoring with Opencode and trying to make it work. As you see, even Deepseek is struggling with it… Wish me luck 🤞
Devlog 2 : Finally I made working streaming pipeline! My driver takes image from Monado, gstreamer encodes it and sends via UDP. On phone, there is AMediaCodec that takes the packets, joins them and renders. Used codec is HEVC (H265). Video is from xrgears demo.
Devlog 3 : I made 6DOF (6 degrees of freedom = position+rotation in space) tracking with ARCore. It’s a bit laggy, but it works. This is just test, I plan to optimize it later. Video is from xrgears with looking around.
I am making minor adjustments to run with SteamVR. I use opencomposite as layer between OpenXR and OpenVR/SteamVR. Video is phone screencap from free Steam game “Aircar”.
Devlog 4 : I replaced boilerplate LLM code with my own. I also wrote README with instructions, so you can now try it!
Since nobody reviewed my submission, I don’t want to add more features, so I only updated the README and made small changes to the app. If anyone wants to play VR games on their phone, they can just download the files from Releases and run them without hard compiling!
Phew, I almost went over the time limit (10 hours) :D I tried to get it running on Windows, and I partially succeeded, but it’s still not stable. Aside from that, I mostly cleaned up the code, improved usability, and removed unnecessary modules from CMake. Now I’m working on an improved distortion using Monado’s u_distortion_cardboard_calculate (cardboard stands for Google Cardboard btw) And one more thing: thanks to everyone for the positive feedback on the project — I really didn’t expect that!
I created new TCP socket logic for configuration sharing and added logic for loading configuration file. Now I am trying to change the x265enc software encoding to something faster on GPU. Unfortunately, nvenc (nvidia encoding) is really hard to configure properly, as you can see for yourselves.
So today I finished image settings (you can configure them in the config file). They control how the image is rendered, because every headset has different lenses, distance between lenses, distance from screen to lenses etc. To find your headset’s properties, go to https://wwgc.firebaseapp.com/ .
I worked hard on both the Android app and the Monado driver and finally: I have working hand tracking! It is very laggy, needs many optimizations, and isn’t even in alpha state yet, but I can see that it is possible to do it. This was my dream when I began this project, and finally, it has come true. I hope it will help many people who cannot afford a professional headset :D
I am enhancing hand tracking now, and it’s starting to look good! Here is how: I use MediaPipe by Google to analyze image from front camera. MediaPipe Hand Landmarker returns hand landmarks in camera-relative format in two dimensions, so I need to make depth (z-coordinate). I measure distance between wrist and fingers, in 2D space this means distance from camera (the farther away they are, the smaller they get). Now, they are 3D, but still relative to camera. Then I simply send both hands as UDP packet for the driver. The driver (PC side) computes real-world coordinates of the hands using saved earlier sent from ARCore and pushes them into Monado.
So I finished the hand tracking! I tried to make it as good as possible on a phone, and it looks like it might actually work! Even though I’m limited by the hardware, you can see in the video that it tracks pretty well. (video from openxr-simple-playground )
Last devlog before ship! I just merged upstream monado, built release binaries and created GitHub release.
I created simple terminal installer in python that downloads and setups Monado Phone Driver. Thanks also for the positive reviews and the 19.12x stardust multiplier — when I started this project, I didn’t think I’d ever finish it :D
I added settings on phone, so now you can really configure the ports on both sides! Also there’s option to disable hand tracking or 6DOF (then it will send only rotation of headset)
Now I am making just minor changes to the driver as the base is nearly done. I added screen size synchronization with phone, so the driver now can send right stream. Also I am making small bugfixes and improvements.
YEAH! I have finally done the PC camera hand tracking! It has much better FOV than phone camera and more computing power. It’s just Python script with MediaPipe, sending the data to 127.0.0.1 to hand port, and it has same format, so the driver doesn’t even know the data is sending someone other than phone. You will ofc need to disable phone hand tracking, otherwise they will collide. As you see in the video, I can move the hands far and they still get tracked. (End of the video is when I took off the headset - it was also tracked :D)
I’ve fixed some bugs and leaks, added more configuration to Android app and created hand tracking vizualization for the PC script. Also, I am working on integrating hands as controllers (because controllers have better support across games).
I am working on implementing hand controller using same data as hand tracking does. It also includes the “aim pose” - where does controller point. On video, it’s shown as red line, I take it from the index finger. I hope I will be able to play some better VR games!
I think it’s time to new release! I merged upstream, created tag, built app and driver and published on GitHub.
Hi! So I’m here again after many exams (I didn’t have time and strength to iteratively test this ) and I’m gonna make this better using better Hand Landmarkers and (hopefully) run on Window$.
Ships:
Hi! I ship my Monado Phone Driver ! I worked on it for last week and it was really challenging. My vision was to build something with what you can play VR games on phone (with Google Cardboard), like iVRy, but open-source and simple. I worked on streaming pipeline, UDP discovery, pose tracking and gluing it all together with Monado. I hope this will help people that wanted to play VR games without expensive headset.
Hi! This is my second ship of this project, Monado Phone Driver. It’s bridge between your VR app and your phone in headset ( Google Cardboard ). I wanted to make it better than ALVR , because it has only 3DOF tracking, so I created 6DOF tracking and hand tracking, like professional headsets. The most challenging part of this was debugging all of these. From Vulkan swapchain management and GStreamer pipeline to hand and 6DOF tracking. I am proud of it, because this will help people without VR headsets to enjoy VR games. NOTE: Hand tracking is done the best possible way, but I think it still doesn’t compete with real VR headsets. Next ship should add better tracking with PC camera.
I made Monado Phone Driver - a bridge between VR app and phone in cardboard headset. This allows you to play VR games just with Linux PC and Android phone, without buying expensive VR headset. There are alternatives, like ALVR and WiVRn , but my driver has 6DOF tracking (you can move and rotate in space) and hand tracking (it takes hand landmarks from PC or phone camera). Since last ship, I improved stability, added Android app settings, created auto installer, and mainly tracking from PC camera, because phone has small FOV and limited performance....
|
1793515750.3475137
|
1793602150.3475137
|
|
32386
|
tpad by @ttj | Stardance
|
ttj
|
0
|
4.52
|
0
|
[]
|
[{"post_id": 32729, "ts": "202 [{"post_id": 32729, "ts": "2026-07-22T02:02:13Z", "hours": 1.925, "text": "made the case and the firmware for my tpad :D (a whole 4 hours wasnt recorded because of an error with the recording on an ipad ;-;)"}, {"post_id": 25060, "ts": "2026-07-09T00:46:47Z", "hours": 2.5944, "text": "making the pcb of my cooler hackpad"}]...
|
Title: tpad by @ttj | Stardance
Devlogs:
making t Title: tpad by @ttj | Stardance
Devlogs:
making the pcb of my cooler hackpad
made the case and the firmware for my tpad :D (a whole 4 hours wasnt recorded because of an error with the recording on an ipad ;-;)...
|
1793378942.7788053
|
1793983742.7788053
|
|
9179
|
competition dashboard by @ttiramisu | Stardance
|
ttiramisu
|
0
|
3.83
|
0
|
[]
|
[{"post_id": 4129, "ts": "2026 [{"post_id": 4129, "ts": "2026-06-07T10:10:44Z", "hours": 1.1992, "text": "added timer configs…"}, {"post_id": 3983, "ts": "2026-06-07T03:53:12Z", "hours": 2.2531, "text": "finally finished the login and added some simple add and view functions. imma have to translate the keys later cuz i wrote stuff in english instead to make it easier to read. also added firebase to this thing to allow storage to be kept consistent throughout"}, {"post_id": 3917, "ts": "2026-06-07T01:04:13Z", "hours": 0.3772, "text": "just finished working on the admin login page. im planning to finish all the basic functions first before adding styles"}]...
|
Title: competition dashboard by @ttiramisu | Stard Title: competition dashboard by @ttiramisu | Stardance
Devlogs:
just finished working on the admin login page. im planning to finish all the basic functions first before adding styles
finally finished the login and added some simple add and view functions. imma have to translate the keys later cuz i wrote stuff in english instead to make it easier to read. also added firebase to this thing to allow storage to be kept consistent throughout
added timer configs…...
|
1793224258.879268
|
1793829058.879268
|
|
10019
|
learn react by @ttiramisu | Stardance
|
ttiramisu
|
0
|
0.92
|
0
|
[]
|
[{"post_id": 3920, "ts": "2026 [{"post_id": 3920, "ts": "2026-06-07T01:09:27Z", "hours": 0.9158, "text": "working on learning react while making some bad ui designs for fun. no css yet though cuz i didnt have the time for it…."}]...
|
Title: learn react by @ttiramisu | Stardance
Devl Title: learn react by @ttiramisu | Stardance
Devlogs:
working on learning react while making some bad ui designs for fun. no css yet though cuz i didnt have the time for it…....
|
1793444016.322345
|
1794048816.322345
|
|
11172
|
worst ui design by @ttiramisu | Stardance
|
ttiramisu
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-09T11:32:15Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a website that contains some of the cursed UI/UX designs that possibly exists out there with source code and examples!", "repo": "https://github.com/ttiramisu/mesuem-of-worst-ui", "demo": "https://muesum.netlify.app"}]...
|
[{"post_id": 5545, "ts": "2026 [{"post_id": 5545, "ts": "2026-06-09T11:13:13Z", "hours": 1.0986, "text": "added some css! tailwind to be exact…"}, {"post_id": 5513, "ts": "2026-06-09T10:07:43Z", "hours": 1.5347, "text": "imma start work on the ui of the main site itself now…"}, {"post_id": 4300, "ts": "2026-06-07T15:42:55Z", "hours": 0.6619, "text": "added some of the uis….."}]...
|
Title: worst ui design by @ttiramisu | Stardance
Title: worst ui design by @ttiramisu | Stardance
Devlogs:
added some of the uis…..
imma start work on the ui of the main site itself now…
added some css! tailwind to be exact…
Ships:
I made a website that contains some of the cursed UI/UX designs that possibly exists out there with source code and examples!...
|
1793483508.7598352
|
1793569908.7598352
|
|
13866
|
Plant Care Taker by @ttf2010 | Stardance
|
ttf2010
|
0
|
13.62
|
0
|
[]
|
[{"post_id": 18094, "ts": "202 [{"post_id": 18094, "ts": "2026-06-29T03:03:56Z", "hours": 2.4797, "text": "Just started working on the Care Plan for the code. Basically, it takes info from the user’s environment and the logs they have submitted to create a custom care plan that will boost growth for plants. It will be pretty simple for now. However, I want it to eventually work without asking questions. I want it to use sensors and data about the real world, location, climate, and the plant to create custom plans."}, {"post_id": 14540, "ts": "2026-06-23T18:05:29Z", "hours": 4.5525, "text": "Just finished working on an issue in my code. Basically, I wanted to utilize the name of the user’s plant to save info of plant under the plant name as a variable. I didn’t know how to do this effectively without sparking a heap of errors. I learned a lot while doing this. That’s what I love about learning how to code on my own, it allows me to experience errors and fix them through gaining extra info. Anyways I found out I can utilize an empty dictionary and add in all the data in the object as a value under the plant name saved as a key. I know it sounds simple, but it was so satisfying figuring it out."}, {"post_id": 10448, "ts": "2026-06-17T05:34:55Z", "hours": 2.5553, "text": "Spent a lot of time working on about 6 bugs. The bigs were messing up the models that were meant to perform different tasks based on the plant’s information. Luckily I have now fixed it and going to sleep lol."}, {"post_id": 8907, "ts": "2026-06-14T20:31:48Z", "hours": 0.5572, "text": "Just read about OOP on Python and decided to give it a go in this code. A lot of things became much easier to add in and code using this. Now storing data and using functions is much more possible and takes way less time!"}, {"post_id": 8494, "ts": "2026-06-14T03:53:26Z", "hours": 3.4714, "text": "Been working on this plant care taker. I like to plant with my mom and I thought this might be a good idea to keep info about our plants. It can also detect problems based on growth patterns, soil, climate, etc. I’ve been working on it for a while but it’s pretty basic and inefficient. I want it to be more complex, ai-like, and be able to work without human supervision."}]...
|
Title: Plant Care Taker by @ttf2010 | Stardance
D Title: Plant Care Taker by @ttf2010 | Stardance
Devlogs:
Been working on this plant care taker. I like to plant with my mom and I thought this might be a good idea to keep info about our plants. It can also detect problems based on growth patterns, soil, climate, etc. I’ve been working on it for a while but it’s pretty basic and inefficient. I want it to be more complex, ai-like, and be able to work without human supervision.
Just read about OOP on Python and decided to give it a go in this code. A lot of things became much easier to add in and code using this. Now storing data and using functions is much more possible and takes way less time!
Spent a lot of time working on about 6 bugs. The bigs were messing up the models that were meant to perform different tasks based on the plant’s information. Luckily I have now fixed it and going to sleep lol.
Just finished working on an issue in my code. Basically, I wanted to utilize the name of the user’s plant to save info of plant under the plant name as a variable. I didn’t know how to do this effectively without sparking a heap of errors. I learned a lot while doing this. That’s what I love about learning how to code on my own, it allows me to experience errors and fix them through gaining extra info. Anyways I found out I can utilize an empty dictionary and add in all the data in the object as a value under the plant name saved as a key. I know it sounds simple, but it was so satisfying figuring it out.
Just started working on the Care Plan for the code. Basically, it takes info from the user’s environment and the logs they have submitted to create a custom care plan that will boost growth for plants. It will be pretty simple for now. However, I want it to eventually work without asking questions. I want it to use sensors and data about the real world, location, climate, and the plant to create custom plans....
|
1793137773.0716436
|
1793742573.0716436
|
|
16923
|
Exo Hand Starter by @ttf2010 | Stardance
|
ttf2010
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T23:42:22Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This project really helped challenge me to learn a new form of coding I never thought I could achieve. Through all the mistakes and bugs, I learned and understood a little bit each time. Now that I KIND OF understand OpenCV, I can utilize it for other projects that need computer vision and computation!", "repo": "https://github.com/tobi0106/exohand-proj", "demo": "https://drive.google.com/file/d/1JH82twQb0J3Pfb6GGf9Z0DyhzGubE2F2/view?usp=sharing"}]...
|
[{"post_id": 20349, "ts": "202 [{"post_id": 20349, "ts": "2026-07-01T22:30:04Z", "hours": 0.3603, "text": "just doing some last tests on my project before shipping! Haven’t touched it much after the first log since it was just a fun way for me to learn a little bit of computer vision."}, {"post_id": 7183, "ts": "2026-06-12T00:03:01Z", "hours": 2.3819, "text": "I am an intermediate beginner in coding so far. I have been working on this starter code to learn how to work with OpenCV and MediaPipe. I want to create a robotic hand that can use recognized hand gestures and machine learning to perform tasks from anywhere."}]...
|
Title: Exo Hand Starter by @ttf2010 | Stardance
D Title: Exo Hand Starter by @ttf2010 | Stardance
Devlogs:
I am an intermediate beginner in coding so far. I have been working on this starter code to learn how to work with OpenCV and MediaPipe. I want to create a robotic hand that can use recognized hand gestures and machine learning to perform tasks from anywhere.
just doing some last tests on my project before shipping! Haven’t touched it much after the first log since it was just a fun way for me to learn a little bit of computer vision.
Ships:
This project really helped challenge me to learn a new form of coding I never thought I could achieve. Through all the mistakes and bugs, I learned and understood a little bit each time. Now that I KIND OF understand OpenCV, I can utilize it for other projects that need computer vision and computation!...
|
1793469362.3671527
|
1793555762.3671527
|
|
28852
|
My awesome macropad! by @ttf2010 | Stardance
|
ttf2010
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @ttf2010 | Stardanc Title: My awesome macropad! by @ttf2010 | Stardance...
|
1793163263.0538335
|
1793768063.0538335
|
|
5474
|
My awesome macropad! by @tterbg13 | Stardance
|
tterbg13
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @tterbg13 | Stardan Title: My awesome macropad! by @tterbg13 | Stardance...
|
1793476610.8007305
|
1794081410.8007305
|
|
3503
|
Time Bomb by @tsureshot101 | Stardance
|
tsureshot101
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Time Bomb by @tsureshot101 | Stardance
|
1793501769.1846623
|
1794106569.1846623
|
|
26626
|
Grapefruit by @tsunami014 | Stardance
|
tsunami014
|
2
|
135.0
|
2180
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-12T22:08:50Z", "hours": 25.0, "multiplier": 16.69, "payout": 421, "blessing": "neutral", "text": "FIXED THE UI with dynamic colours and themes! Fixed some layouts Improved how tasks are made (including a not overwhelming amount of qualities and changed the ambiguous “reasoning” into a much less so “goals” As well as many minor also cool things! (See the devlogs after ship 1 for the full account)", "repo": "https://github.com/Tsunami014/Grapefruit/tree/v2.0", "demo": "https://github.com/Tsunami014/Grapefruit/releases/tag/v2.0"}, {"ship_num": 2, "ts": "2026-08-20T11:10:17Z", "hours": 110.0, "multiplier": 15.99, "payout": 1759, "blessing": "neutral", "text": "I finally decided I had done enough and it was really good! This app contains the conversation, a scene with Grapefruit in it, a basic settings page with not much in it, a tasks manager with categories (including a today category) and tasks with importance, reasoning, qualities, items! Also has a great bottom bar for easier text editing and has everything layed out in a mobile-friendly manner! Installation instructions are in the README", "repo": "https://github.com/Tsunami014/Grapefruit/tree/v2.0", "demo": "https://github.com/Tsunami014/Grapefruit/releases/tag/v2.0"}]...
|
[{"post_id": 66920, "ts": "202 [{"post_id": 66920, "ts": "2026-09-12T21:50:02Z", "hours": 2.17, "text": "I improved how tasks are made, making the task overlay centred instead of to the side, changed “reasoning” into “goals” which is easier to understand and still useful, reduced the number of qualities and added some new ones similar to the old reasoning (e.g. ‘obligation’ & ‘reward’), came up with MUCH better sample tasks and fixed a small issue with the bottom bar!"}, {"post_id": 65770, "ts": "2026-09-11T04:14:17Z", "hours": 6.3225, "text": "I did a bunch of work on the settings and added a “theme”! (Different variations of the base colour - which is now changeable in the settings!) I also used HSLuv instead of just HSL (which I tried before and thought it didn’t do much but now I realise it did help make everything nicer). I also added an effect so when you press on buttons it decreases the border radius a bit! And lastly I thought I’d fix some issues super quick due to the increased layout diversity from the settings but ended up spending much longer on them than expected, those being the jumpyness of the settings dropdowns (so I removed the animations and fixed it up a bit more and also fixed the flowlayout because it turns out everything is broken), fixed scrollbars inside other scrollbars, and probably more I forgot."}, {"post_id": 65060, "ts": "2026-09-09T22:07:39Z", "hours": 4.7747, "text": "Tweaked the colours lots and I’m now quite happy with how it’s at! Added auto generating colours for everything I didn’t before (the calendar, settings, importance and some buttons in overlays) Saved the dark/light theme to a settings file And fixed a bug with the confirm and move overlays being a strange fixed width!"}, {"post_id": 64549, "ts": "2026-09-09T01:39:01Z", "hours": 7.5414, "text": "Added dynamic colours! Don’t worry that it looks kinda bad right now, I had to learn UI design from scratch for this, and I will improve it soon. Made all the colours (well, most of them for now) generate based on a base colour and added a light and dark theme! I also made the Android navigation icons and the svgs change between light and dark properly. I spent quite some time trying to implement HSLuv or HCT in the hopes it would improve the colours but ended up scrapping that due to many reasons, including too much extra stuff, wasn’t making much (or any) difference, and my HCT implementation was just so broken and I wasn’t bothered to try and fix it. Also some parts are now extra broken, I’ll fix them soon too don’t worry! I had to devlog this in case I went over 10h by accident, hopefully will be resolved before the next one"}, {"post_id": 62540, "ts": "2026-09-05T23:38:38Z", "hours": 4.4194, "text": "Improved some UI layouts, clarified a sentence or two in the conversation, reordered the tasks page, made selecting the title in the task overlay hide the buttons (to make it easier to see), fixed some visual bugs (maybe?), improved some icons, changed ‘today’ to ‘starred’ (and made it not clear at the end of the day; I wanted to plan for the future) and last but not least I made the grey background for some of the overlays reach past the navigation AT LAST! So now the title bar doesn’t look off when the overlays are open!"}, {"post_id": 50885, "ts": "2026-08-20T10:54:28Z", "hours": 3.4444, "text": "Added an app icon and FINALLY got around to actually drawing the Grapefruit character! Also improved some parts of the conversation a bit more, improved the default tasks, improved the date importance calculations a smidge and fixed many tiny issues. It should now be DONE!"}, {"post_id": 47411, "ts": "2026-08-15T10:28:21Z", "hours": 0.8222, "text": "I thought I was done but turns out I forgot to add scrolling to the tasks list, so it would cause large issues if there were many tasks (or if the screen height was very low, as it does get on mobile when the keyboard is up)"}, {"post_id": 47355, "ts": "2026-08-15T07:43:42Z", "hours": 1.3553, "text": "Improved the “X weeks away” text (which was just wrong before) and added a today toggle and category button!"}, {"post_id": 46825, "ts": "2026-08-14T10:57:19Z", "hours": 6.6328, "text": "Did various small improvements, including: Many many bugfixes, rearranging the task and settings display to have buttons on the bottom (from user feedback), a help screen, a ‘move task to another category’ button and dialogue (which I cannot believe I forgot about until now) and added another purpose in the conversation for the user designated reason (so it actually gets shown sometimes)!"}, {"post_id": 42346, "ts": "2026-08-07T00:53:14Z", "hours": 5.9806, "text": "Added all sorts of cool things, including info in the settings page, bullet points to the text edits, changed the preset times and tasks, extra conversation features (failsafes and external functions), and improved the conversation some more (because it was fun)!"}, {"post_id": 41181, "ts": "2026-08-05T07:11:58Z", "hours": 8.2414, "text": "Finished the conversation! (It may change/get improved more later, but for now I’m happy with it!) I made many changes to some terrible phrasing choices I made previously (e.g. “But why won’t you do xyz? It’s super fun!” -> “You don’t have to do it if you don’t want to”), rewriting huge chunks of it and adding other huge chunks. (I hope you appreciate the dialogue, I’ve apparently spent 20 hours by now JUST on that, not even the code behind it) Also changed times to use +...m as well as +...h and included a preset range of times which are more on the short side to incentavise shorter tasks."}, {"post_id": 39244, "ts": "2026-08-02T02:43:56Z", "hours": 1.5244, "text": "Added buttons to insert new lines above/below, saving information to an external file automatically and trimming whitespace off of some things (a small convenience when on mobile)"}, {"post_id": 38611, "ts": "2026-08-01T02:54:26Z", "hours": 7.6272, "text": "Finalised the connection between the task engine and the conversation including adding variety, conversation suggestions knowing about the qualities and reasons, a significantly improved conversation (that’s almost done!!), a lot of conversation backend (including a custom parser for recursive synonym choices) and heaps more!"}, {"post_id": 36925, "ts": "2026-07-29T10:13:07Z", "hours": 6.4594, "text": "Spent pretty much the entire time working on the conversation choices and options (yes it’s that difficult). Also made some improvements to the backend (extra features making it easier/possible to do some things, fixed bugs). Still not done the conversation, will be another long stretch until I finish it but it’s nearly there!"}, {"post_id": 35517, "ts": "2026-07-27T00:18:06Z", "hours": 4.7739, "text": "Worked on the conversation, improving the quality of texts and options, and added some new options and features! Also added some cool mathy functions for determining task urgency/load!"}, {"post_id": 33452, "ts": "2026-07-23T12:45:03Z", "hours": 3.1211, "text": "Added the beginnings to the task importance system and implemented a cool task bottom text including progress, and also included that task progress in the task overlay popup at the bottom!"}, {"post_id": 33268, "ts": "2026-07-23T01:41:19Z", "hours": 1.11, "text": "Implemented a bunch of small improvements and fixes to the calendar popup and date highlight!"}, {"post_id": 32915, "ts": "2026-07-22T11:46:31Z", "hours": 4.1114, "text": "Spent the whole time working on a date selector! Also added text about the due date, e.g. “was due yesterday”, “due next Monday (in 5 days)”, etc."}, {"post_id": 32801, "ts": "2026-07-22T05:52:27Z", "hours": 1.6331, "text": "Implemented many extremely minor things brought up from user feedback, including: adding titles to the category and task list, using e.g. +2.5h instead of #E for counting time, improved the importance selection layout, ordering tasks, improving done task formatting (with tick and strikethrough) and other even more minor things!"}, {"post_id": 32262, "ts": "2026-07-21T10:09:04Z", "hours": 4.2289, "text": "Added a qualities screen to add qualities to tasks by clicking on the buttons and a lot of backend work to make everything run smoother and easier to code!"}, {"post_id": 31592, "ts": "2026-07-20T03:27:25Z", "hours": 3.4722, "text": "Added an importance slider, an info text and some minor things to the task overlay"}, {"post_id": 31054, "ts": "2026-07-19T04:15:30Z", "hours": 3.5669, "text": "Fixed a lot of bugs in the tasks area; including resizing issues, inability to scroll, and wrapping problems."}, {"post_id": 30597, "ts": "2026-07-18T09:33:18Z", "hours": 6.4275, "text": "Added task groups and an add, rename, and delete task group button that do things! Deleting, naming collisions and other problems are also handled with dialogues! Also added a slightly better colour scheme"}, {"post_id": 30005, "ts": "2026-07-17T07:38:26Z", "hours": 3.5383, "text": "Added a basic scene!!"}, {"post_id": 23344, "ts": "2026-07-06T07:27:06Z", "hours": 5.0297, "text": "Dramatically improved the backend for the conversation, adding many new features!"}, {"post_id": 23221, "ts": "2026-07-06T01:25:52Z", "hours": 5.4508, "text": "Added a parser for conversation backend data and an options list and text box to display it in!"}, {"post_id": 20674, "ts": "2026-07-02T10:21:27Z", "hours": 4.2228, "text": "Added a bottom bar to the task input including some utility functions like move up and down, a sample highlight that can get modified with the + and - timer buttons and a scrollbar!"}, {"post_id": 20454, "ts": "2026-07-02T01:36:55Z", "hours": 7.5497, "text": "Added an item input field with a bottom bar with utilities in it!"}, {"post_id": 19643, "ts": "2026-07-01T00:49:45Z", "hours": 4.1286, "text": "Added more to the UI layout, including a settings (with accordian sections) and new tasks (currently empty) page!"}, {"post_id": 19012, "ts": "2026-06-30T05:31:27Z", "hours": 5.6044, "text": "Added the very basic interface! The reason it took so long was because I had zero idea how to compile anything and took way too long figuring that out. But it can compile for desktop or mobile now! (although desktop is only for testing)"}]...
|
Title: Grapefruit by @tsunami014 | Stardance
Devl Title: Grapefruit by @tsunami014 | Stardance
Devlogs:
Added the very basic interface! The reason it took so long was because I had zero idea how to compile anything and took way too long figuring that out. But it can compile for desktop or mobile now! (although desktop is only for testing)
Added more to the UI layout, including a settings (with accordian sections) and new tasks (currently empty) page!
Added an item input field with a bottom bar with utilities in it!
Added a bottom bar to the task input including some utility functions like move up and down, a sample highlight that can get modified with the + and - timer buttons and a scrollbar!
Added a parser for conversation backend data and an options list and text box to display it in!
Dramatically improved the backend for the conversation, adding many new features!
Added a basic scene!!
Added task groups and an add, rename, and delete task group button that do things! Deleting, naming collisions and other problems are also handled with dialogues! Also added a slightly better colour scheme
Fixed a lot of bugs in the tasks area; including resizing issues, inability to scroll, and wrapping problems.
Added an importance slider, an info text and some minor things to the task overlay
Added a qualities screen to add qualities to tasks by clicking on the buttons and a lot of backend work to make everything run smoother and easier to code!
Implemented many extremely minor things brought up from user feedback, including: adding titles to the category and task list, using e.g. +2.5h instead of #E for counting time, improved the importance selection layout, ordering tasks, improving done task formatting (with tick and strikethrough) and other even more minor things!
Spent the whole time working on a date selector! Also added text about the due date, e.g. “was due yesterday”, “due next Monday (in 5 days)”, etc.
Implemented a bunch of small improvements and fixes to the calendar popup and date highlight!
Added the beginnings to the task importance system and implemented a cool task bottom text including progress, and also included that task progress in the task overlay popup at the bottom!
Worked on the conversation, improving the quality of texts and options, and added some new options and features! Also added some cool mathy functions for determining task urgency/load!
Spent pretty much the entire time working on the conversation choices and options (yes it’s that difficult). Also made some improvements to the backend (extra features making it easier/possible to do some things, fixed bugs). Still not done the conversation, will be another long stretch until I finish it but it’s nearly there!
Finalised the connection between the task engine and the conversation including adding variety, conversation suggestions knowing about the qualities and reasons, a significantly improved conversation (that’s almost done!!), a lot of conversation backend (including a custom parser for recursive synonym choices) and heaps more!
Added buttons to insert new lines above/below, saving information to an external file automatically and trimming whitespace off of some things (a small convenience when on mobile)
Finished the conversation! (It may change/get improved more later, but for now I’m happy with it!) I made many changes to some terrible phrasing choices I made previously (e.g. “But why won’t you do xyz? It’s super fun!” -> “You don’t have to do it if you don’t want to”), rewriting huge chunks of it and adding other huge chunks. (I hope you appreciate the dialogue, I’ve apparently spent 20 hours by now JUST on that, not even the code behind it) Also changed times to use +...m as well as +...h and included a preset range of times which are more on the short side to incentavise shorter tasks.
Added all sorts of cool things, including info in the settings page, bullet points to the text edits, changed the preset times and tasks, extra conversation features (failsafes and external functions), and improved the conversation some more (because it was fun)!
Did various small improvements, including: Many many bugfixes, rearranging the task and settings display to have buttons on the bottom (from user feedback), a help screen, a ‘move task to another category’ button and dialogue (which I cannot believe I forgot about until now) and added another purpose in the conversation for the user designated reason (so it actually gets shown sometimes)!
Improved the “X weeks away” text (which was just wrong before) and added a today toggle and category button!
I thought I was done but turns out I forgot to add scrolling to the tasks list, so it would cause large issues if there were many tasks (or if the screen height was very low, as it does get on mobile when the keyboard is up)
Added an app icon and FINALLY got around to actually drawing the Grapefruit character! Also improved some parts of the conversation a bit more, improved the default tasks, improved the date importance calculations a smidge and fixed many tiny issues. It should now be DONE!
Improved some UI layouts, clarified a sentence or two in the conversation, reordered the tasks page, made selecting the title in the task overlay hide the buttons (to make it easier to see), fixed some visual bugs (maybe?), improved some icons, changed ‘today’ to ‘starred’ (and made it not clear at the end of the day; I wanted to plan for the future) and last but not least I made the grey background for some of the overlays reach past the navigation AT LAST! So now the title bar doesn’t look off when the overlays are open!
Added dynamic colours! Don’t worry that it looks kinda bad right now, I had to learn UI design from scratch for this, and I will improve it soon. Made all the colours (well, most of them for now) generate based on a base colour and added a light and dark theme! I also made the Android navigation icons and the svgs change between light and dark properly. I spent quite some time trying to implement HSLuv or HCT in the hopes it would improve the colours but ended up scrapping that due to many reasons, including too much extra stuff, wasn’t making much (or any) difference, and my HCT implementation was just so broken and I wasn’t bothered to try and fix it. Also some parts are now extra broken, I’ll fix them soon too don’t worry! I had to devlog this in case I went over 10h by accident, hopefully will be resolved before the next one
Tweaked the colours lots and I’m now quite happy with how it’s at! Added auto generating colours for everything I didn’t before (the calendar, settings, importance and some buttons in overlays) Saved the dark/light theme to a settings file And fixed a bug with the confirm and move overlays being a strange fixed width!
I did a bunch of work on the settings and added a “theme”! (Different variations of the base colour - which is now changeable in the settings!) I also used HSLuv instead of just HSL (which I tried before and thought it didn’t do much but now I realise it did help make everything nicer). I also added an effect so when you press on buttons it decreases the border radius a bit! And lastly I thought I’d fix some issues super quick due to the increased layout diversity from the settings but ended up spending much longer on them than expected, those being the jumpyness of the settings dropdowns (so I removed the animations and fixed it up a bit more and also fixed the flowlayout because it turns out everything is broken), fixed scrollbars inside other scrollbars, and probably more I forgot.
I improved how tasks are made, making the task overlay centred instead of to the side, changed “reasoning” into “goals” which is easier to understand and still useful, reduced the number of qualities and added some new ones similar to the old reasoning (e.g. ‘obligation’ & ‘reward’), came up with MUCH better sample tasks and fixed a small issue with the bottom bar!
Ships:
I finally decided I had done enough and it was really good! This app contains the conversation, a scene with Grapefruit in it, a basic settings page with not much in it, a tasks manager with categories (including a today category) and tasks with importance, reasoning, qualities, items! Also has a great bottom bar for easier text editing and has everything layed out in a mobile-friendly manner! Installation instructions are in the README
FIXED THE UI with dynamic colours and themes! Fixed some layouts Improved how tasks are made (including a not overwhelming amount of qualities and changed the ambiguous “reasoning” into a much less so “goals” As well as many minor also cool things! (See the devlogs after ship 1 for the full account)...
|
1793325147.0570273
|
1793411547.0570273
|
|
37095
|
My very own WebOS by @tsumilydev | Stardance
|
tsumilydev
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @tsumilydev | Stardanc Title: My very own WebOS by @tsumilydev | Stardance...
|
1793184633.1241393
|
1793789433.1241393
|
|
37096
|
Terminal-based Rust Game by @tsumilydev | Stardanc Terminal-based Rust Game by @tsumilydev | Stardance...
|
tsumilydev
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Terminal-based Rust Game by @tsumilydev | S Title: Terminal-based Rust Game by @tsumilydev | Stardance...
|
1793404599.6937017
|
1794009399.6937017
|
|
16824
|
My awesome macropad! by @tsuki | Stardance
|
tsuki
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @tsuki | Stardance
|
1793418907.3548665
|
1794023707.3548665
|
|
39686
|
Website by @tsubject306 | Stardance
|
tsubject306
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Website by @tsubject306 | Stardance
|
1793400484.418285
|
1794005284.418285
|
|
5702
|
My first slack bot! by @tstellar | Stardance
|
tstellar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @tstellar | Stardanc Title: My first slack bot! by @tstellar | Stardance...
|
1793505269.8445625
|
1794110069.8445625
|
|
20727
|
Frictionless by @tsrivarshini0104 | Stardance
|
tsrivarshini0104
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @tsrivarshini0104 | Stardan Title: Frictionless by @tsrivarshini0104 | Stardance...
|
1793303413.7195673
|
1793908213.7195673
|
|
20729
|
Untitled by @tsrivarshini0104 | Stardance
|
tsrivarshini0104
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @tsrivarshini0104 | Stardance
|
1793465398.8322978
|
1794070198.8322978
|
|
20730
|
Untitled by @tsrivarshini0104 | Stardance
|
tsrivarshini0104
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @tsrivarshini0104 | Stardance
|
1793382739.6959202
|
1793987539.6959202
|
|
39516
|
Frictionless by @tsiong077 | Stardance
|
tsiong077
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @tsiong077 | Stardance
|
1793461973.9695737
|
1794066773.9695737
|
|
25419
|
My awesome macropad! by @tsimur | Stardance
|
tsimur
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @tsimur | Stardance
|
1792806493.0094995
|
1793411293.0094995
|
|
60726
|
NicoEdu AI Study system by @tshriramp | Stardance
|
tshriramp
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: NicoEdu AI Study system by @tshriramp | Sta Title: NicoEdu AI Study system by @tshriramp | Stardance...
|
1793036981.8287137
|
1793641781.8287137
|
|
28547
|
My awesome macropad! by @tselvi | Stardance
|
tselvi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @tselvi | Stardance
|
1793216856.0974958
|
1793821656.0974958
|
|
39671
|
My own site! by @tsellios | Stardance
|
tsellios
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @tsellios | Stardance
|
1793339881.104282
|
1793944681.104282
|
|
54670
|
language learning helper (llh) by @tsellios | Star language learning helper (llh) by @tsellios | Stardance...
|
tsellios
|
0
|
11.78
|
0
|
[]
|
[{"post_id": 68202, "ts": "202 [{"post_id": 68202, "ts": "2026-09-14T18:09:44Z", "hours": 0.8333, "text": "FINALLY completed the case!! After a lot of work I finally completed the case for the llh. The project might be pretty much ready for funding. Although it is an issue, I guess, that the words can only be up to 16 characters (size of each block), I might find a way of doubling that tomorrow like using 2 blocks and that Ill submit it!!"}, {"post_id": 66700, "ts": "2026-09-12T16:05:46Z", "hours": 1.2, "text": "Almost completed the case!!! Today I finished the bottom and top part of the case. Only thing left before this project is finished is adding a way to connect the 2 parts, adding the handle, and an opening for the switch. In contrast with how it looked yesterday, i am much more proud today. (almost done :))"}, {"post_id": 66109, "ts": "2026-09-11T18:17:15Z", "hours": 1.0, "text": "Made significant progress on the case today I mapped out every other part and finally got it into the 3rd dimension. I decided that making threads was too hard for my first project, so I will make the holes a bit smaller than the screws, so that the will be able to screw on easily (hopefully). Additionally, I will need to add a hole on the side, since i decided to add a switch to turn it one and off."}, {"post_id": 65543, "ts": "2026-09-10T19:05:25Z", "hours": 1.1, "text": "Made for progress on the case Today I added the esp and the mfrc552 in the sketch, (the lcd and the button I will have to do tomorrow). The size is kind of, funky. Once completed it will be 15 10cm (apprx. 6 4 inch.) and will be kind of flat, and with the addition of the handle, I am not sure how I will look holding the printed case irl. I also will have to consider stability and have to start thinking how to make the handle. Lastly, I need to consider how the power will be supplied, which is something I have given enough thought. I hope to get this done by Sunday, but we’ll see. I am kind of proud of myself."}, {"post_id": 64933, "ts": "2026-09-09T17:33:50Z", "hours": 1.7503, "text": "Started working on the 3d case for the llh I had no idea where to start from, and to be honest, I was afraid to start. I watched a tutorial, that suggested openscad, which while seems cool, just didnt work for me. I instead chose onshape. While this thing ,might not look like much, it took me a fair while and i am really proud. Despite now having much time with school, i will try to finish the case within the week to finally ship. i hope ill get better at cad and make something that actually looks pleasing to the eye."}, {"post_id": 62402, "ts": "2026-09-05T18:58:40Z", "hours": 0.5833, "text": "redid the circuit in wokwi I needed to remake it since it was not properly saved. Now its time to make the case it cad which really scares me and so I researched a bit abt it."}, {"post_id": 61037, "ts": "2026-09-03T19:01:22Z", "hours": 1.2317, "text": "I completed the main code for the llh today I basically completed the main code for the llh today, I was pretty pleased with the code I had written, until I compiled it and a lot of errors showed up. Most of them were just mistakes I made when writing the code. The rest was the lcd i2c library not working. Despite that, I think the code will work great and i am really proud. I will look into the i2c library tomorrow"}, {"post_id": 60438, "ts": "2026-09-02T19:27:57Z", "hours": 0.6167, "text": "Started the main code for the llh Wrote the code that will read the words off the NFC stickers. I am pretty happy about the progress since this got done pretty fast. Tomorrow, I will complete the rest of the code (LDC, buttons)."}, {"post_id": 59709, "ts": "2026-09-01T17:10:57Z", "hours": 1.4833, "text": "Finally completed the code for writing on nfc stickers with the MFRC522. Started by modifying the code I made yesterday, but I realised that it just wasnt functional, so I scraped it and found a perfect tutorial on yt, that helped me understand how the coding of the MFRC522 works. By using the source code as a basis, I wrote a working code for writing a english word and, (in this instance) its german translation on a nfc sticker, (blocks 4&5). I am really happy with my progress today, and with what I learned today, I think writing the main LLH code will be easier."}, {"post_id": 58346, "ts": "2026-08-30T18:48:52Z", "hours": 1.5789, "text": "writing code for the llh in order for the llh to read information off the nfc stickers, the stickers should contain the information, in this case the words. I have coded before in c++, but this really had me stumped. I had to watch a couple of videos and do some research before understanding how most of the code for writing information works. I think that what I have coded could work, however I am not satisfied and will continue tomorrow. I also read that you should do something regarding authentication, which I have no idea how to do. All in all, I think today was really productive, since I learned how to kind of code for the MFRC522, more tomorrow"}, {"post_id": 57431, "ts": "2026-08-29T16:05:27Z", "hours": 0.4056, "text": "Started work on the LLH(Language learning helper) by designing the circuit. It consists of an esp32, connected to an MFRC522, which is a nfc/rfid reader. To write and read the words on the nfc tags that you stick on items. By clicking the button, the translation of the word in the foreign language should appear on the lcd i2c screen."}]...
|
Title: language learning helper (llh) by @tsellios Title: language learning helper (llh) by @tsellios | Stardance
Devlogs:
Started work on the LLH(Language learning helper) by designing the circuit. It consists of an esp32, connected to an MFRC522, which is a nfc/rfid reader. To write and read the words on the nfc tags that you stick on items. By clicking the button, the translation of the word in the foreign language should appear on the lcd i2c screen.
writing code for the llh in order for the llh to read information off the nfc stickers, the stickers should contain the information, in this case the words. I have coded before in c++, but this really had me stumped. I had to watch a couple of videos and do some research before understanding how most of the code for writing information works. I think that what I have coded could work, however I am not satisfied and will continue tomorrow. I also read that you should do something regarding authentication, which I have no idea how to do. All in all, I think today was really productive, since I learned how to kind of code for the MFRC522, more tomorrow
Finally completed the code for writing on nfc stickers with the MFRC522. Started by modifying the code I made yesterday, but I realised that it just wasnt functional, so I scraped it and found a perfect tutorial on yt, that helped me understand how the coding of the MFRC522 works. By using the source code as a basis, I wrote a working code for writing a english word and, (in this instance) its german translation on a nfc sticker, (blocks 4&5). I am really happy with my progress today, and with what I learned today, I think writing the main LLH code will be easier.
Started the main code for the llh Wrote the code that will read the words off the NFC stickers. I am pretty happy about the progress since this got done pretty fast. Tomorrow, I will complete the rest of the code (LDC, buttons).
I completed the main code for the llh today I basically completed the main code for the llh today, I was pretty pleased with the code I had written, until I compiled it and a lot of errors showed up. Most of them were just mistakes I made when writing the code. The rest was the lcd i2c library not working. Despite that, I think the code will work great and i am really proud. I will look into the i2c library tomorrow
redid the circuit in wokwi I needed to remake it since it was not properly saved. Now its time to make the case it cad which really scares me and so I researched a bit abt it.
Started working on the 3d case for the llh I had no idea where to start from, and to be honest, I was afraid to start. I watched a tutorial, that suggested openscad, which while seems cool, just didnt work for me. I instead chose onshape. While this thing ,might not look like much, it took me a fair while and i am really proud. Despite now having much time with school, i will try to finish the case within the week to finally ship. i hope ill get better at cad and make something that actually looks pleasing to the eye.
Made for progress on the case Today I added the esp and the mfrc552 in the sketch, (the lcd and the button I will have to do tomorrow). The size is kind of, funky. Once completed it will be 15 10cm (apprx. 6 4 inch.) and will be kind of flat, and with the addition of the handle, I am not sure how I will look holding the printed case irl. I also will have to consider stability and have to start thinking how to make the handle. Lastly, I need to consider how the power will be supplied, which is something I have given enough thought. I hope to get this done by Sunday, but we’ll see. I am kind of proud of myself.
Made significant progress on the case today I mapped out every other part and finally got it into the 3rd dimension. I decided that making threads was too hard for my first project, so I will make the holes a bit smaller than the screws, so that the will be able to screw on easily (hopefully). Additionally, I will need to add a hole on the side, since i decided to add a switch to turn it one and off.
Almost completed the case!!! Today I finished the bottom and top part of the case. Only thing left before this project is finished is adding a way to connect the 2 parts, adding the handle, and an opening for the switch. In contrast with how it looked yesterday, i am much more proud today. (almost done :))
FINALLY completed the case!! After a lot of work I finally completed the case for the llh. The project might be pretty much ready for funding. Although it is an issue, I guess, that the words can only be up to 16 characters (size of each block), I might find a way of doubling that tomorrow like using 2 blocks and that Ill submit it!!...
|
1792799496.497165
|
1793404296.497165
|
|
62877
|
binary hackpad by @tsellios | Stardance
|
tsellios
|
0
|
7.0
|
0
|
[]
|
[{"post_id": 72376, "ts": "202 [{"post_id": 72376, "ts": "2026-09-22T19:47:28Z", "hours": 1.2333, "text": "3rd times the charm ;) Ok, so this is the third case I had to make, but I think that everything is ready. The case was pretty easy to make, since I have learned how to make cases for hackpads by heart at this point . To be fair, I think this one looks the best from the three, but im biased. I think maybe the code needs a last looking over and I’ll be ready to ask for the parts to build this. I hope that they arrive sooner that later. Thats all."}, {"post_id": 71247, "ts": "2026-09-20T14:58:31Z", "hours": 1.5333, "text": "I completed the qmk code Downloading QMK was a nightmare, thank god for tutorials and youtube. The coding part was easy i guess. However the time i spent coding on vscode with hackatime was added to the qmk_firmware file and not this project which sucks. I also realised that I forgot to add an “enter” button, which I will either do today or tomorrow."}, {"post_id": 70588, "ts": "2026-09-19T12:20:52Z", "hours": 2.0333, "text": "Redesigned EVERYTHING! I thought that what I had made until this point was, well, very much basic and nothing significant, so I had the idea, to make a keyboard that types in binary. One keycap for 0, one for 1, one for space, one for delete. I redid the kicad pcb, and remade the case. Now I need to figure out how this is even coded. Is this going to be a revolutionary invention that will change how humans type? No. Will it help me learn binary? Maybe."}, {"post_id": 70510, "ts": "2026-09-19T09:32:34Z", "hours": 0.3333, "text": "Finished the case with cutouts for the keycaps. I dont think Ill add anything else, ill just ship it. I think for my first pcb its pretty ok"}, {"post_id": 69720, "ts": "2026-09-17T17:24:08Z", "hours": 1.0833, "text": "Built the pcb and the case for the hackpad I started with finishing the pcb, which was relatively ok. Then I did the case, but the plate couldn’t load, so I built one from scratch instead. I would assume that the project is pretty much finished. Ill see what other things need to be done and ship tmrw"}, {"post_id": 69308, "ts": "2026-09-16T19:33:34Z", "hours": 0.7833, "text": "Started with kicad and the hackpad I downloaded kicad, and, following the tutorial, I had to download the libraries, which I had trouble doing so. To be honest I had diffucilties with a lot of things. But in the end I got this result and Im proud!"}]...
|
Title: binary hackpad by @tsellios | Stardance
De Title: binary hackpad by @tsellios | Stardance
Devlogs:
Started with kicad and the hackpad I downloaded kicad, and, following the tutorial, I had to download the libraries, which I had trouble doing so. To be honest I had diffucilties with a lot of things. But in the end I got this result and Im proud!
Built the pcb and the case for the hackpad I started with finishing the pcb, which was relatively ok. Then I did the case, but the plate couldn’t load, so I built one from scratch instead. I would assume that the project is pretty much finished. Ill see what other things need to be done and ship tmrw
Finished the case with cutouts for the keycaps. I dont think Ill add anything else, ill just ship it. I think for my first pcb its pretty ok
Redesigned EVERYTHING! I thought that what I had made until this point was, well, very much basic and nothing significant, so I had the idea, to make a keyboard that types in binary. One keycap for 0, one for 1, one for space, one for delete. I redid the kicad pcb, and remade the case. Now I need to figure out how this is even coded. Is this going to be a revolutionary invention that will change how humans type? No. Will it help me learn binary? Maybe.
I completed the qmk code Downloading QMK was a nightmare, thank god for tutorials and youtube. The coding part was easy i guess. However the time i spent coding on vscode with hackatime was added to the qmk_firmware file and not this project which sucks. I also realised that I forgot to add an “enter” button, which I will either do today or tomorrow.
3rd times the charm ;) Ok, so this is the third case I had to make, but I think that everything is ready. The case was pretty easy to make, since I have learned how to make cases for hackpads by heart at this point . To be fair, I think this one looks the best from the three, but im biased. I think maybe the code needs a last looking over and I’ll be ready to ask for the parts to build this. I hope that they arrive sooner that later. Thats all....
|
1793047855.6045012
|
1793652655.6045012
|