|
4430
|
open weather by @abdullahmir2010_8 | Stardance
|
abdullahmir2010_8
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: open weather by @abdullahmir2010_8 | Starda Title: open weather by @abdullahmir2010_8 | Stardance...
|
1792749270.5987043
|
1793354070.5987043
|
|
30282
|
open world game by @Batiskaffth | Stardance
|
Batiskaffth
|
0
|
6.35
|
0
|
[]
|
[{"post_id": 27229, "ts": "202 [{"post_id": 27229, "ts": "2026-07-12T16:45:15Z", "hours": 1.0575, "text": "Just wanna say that for now it’s probably my last devlog for this project because Godot always crashes and I can’t recover what I was working on. So probably I will start working on another project……bye"}, {"post_id": 23114, "ts": "2026-07-05T21:25:57Z", "hours": 0.645, "text": "day 3. Today I didn’t did that much but I was reasirching how to make a good looking terrain and I made an intractable system"}, {"post_id": 22384, "ts": "2026-07-04T20:39:21Z", "hours": 1.7364, "text": "today is day 2 of me trying to make a game. Today a made a stamina bar system so when you run it goes down and when I reaches 0% you can’t run till 50%"}, {"post_id": 21697, "ts": "2026-07-03T19:50:37Z", "hours": 2.9153, "text": "Today I started my journey at making an open world game. But since it’s my first time ever making a game, this day was taught……at first it seemed okay, but then problems started. First was that my game started crashing, and the only way to stop it was to start again, but only then that I realized that the problem with crashing was grasss…… yeah the jpg of grass. Second problem was that hackatime wasn’t connected to godot (game engine in what I’m making a game) and my 4 hours of work where for nothing…….then I didn’t understand how to connect it, so for another 2 hours I tried everything until it worked. In the end I started working with terrain."}]...
|
Title: open world game by @Batiskaffth | Stardance Title: open world game by @Batiskaffth | Stardance
Devlogs:
Today I started my journey at making an open world game. But since it’s my first time ever making a game, this day was taught……at first it seemed okay, but then problems started. First was that my game started crashing, and the only way to stop it was to start again, but only then that I realized that the problem with crashing was grasss…… yeah the jpg of grass. Second problem was that hackatime wasn’t connected to godot (game engine in what I’m making a game) and my 4 hours of work where for nothing…….then I didn’t understand how to connect it, so for another 2 hours I tried everything until it worked. In the end I started working with terrain.
today is day 2 of me trying to make a game. Today a made a stamina bar system so when you run it goes down and when I reaches 0% you can’t run till 50%
day 3. Today I didn’t did that much but I was reasirching how to make a good looking terrain and I made an intractable system
Just wanna say that for now it’s probably my last devlog for this project because Godot always crashes and I can’t recover what I was working on. So probably I will start working on another project……bye...
|
1793202660.613272
|
1793807460.613272
|
|
11614
|
openSpikePrime by @hectorOmar | Stardance
|
hectorOmar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: openSpikePrime by @hectorOmar | Stardance
|
1793382830.9013305
|
1793987630.9013305
|
|
44062
|
openTunes by @sometgirldotonline | Stardance
|
sometgirldotonline
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: openTunes by @sometgirldotonline | Stardanc Title: openTunes by @sometgirldotonline | Stardance...
|
1793253243.264621
|
1793858043.264621
|
|
4340
|
openagent by @satvikhardat | Stardance
|
satvikhardat
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: openagent by @satvikhardat | Stardance
|
1792939806.3902693
|
1793803806.3902693
|
|
10151
|
openboxoffice by @makors | Stardance
|
makors
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: openboxoffice by @makors | Stardance
|
1793198981.4769926
|
1793803781.4769926
|
|
50958
|
opencode by @Lalith | Stardance
|
Lalith
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: opencode by @Lalith | Stardance
|
1793368547.946534
|
1793973347.946534
|
|
52488
|
opencode by @Lalith | Stardance
|
Lalith
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: opencode by @Lalith | Stardance
|
1793443836.2735522
|
1794048636.2735522
|
|
36110
|
opencode-copilot-chat by @Pikacnu | Stardance
|
Pikacnu
|
1
|
4.0
|
20
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-17T19:55:45Z", "hours": 4.0, "multiplier": 5.17, "payout": 20, "blessing": "neutral", "text": "Add a action(for json build) / cli(for sync config in cli) / github guide to let people add opencode endpoint to copliot more easily.", "repo": "https://github.com/Pikacnu/opencode-copilot-chat", "demo": "https://github.com/Pikacnu/opencode-copilot-chat/releases"}]...
|
[{"post_id": 30317, "ts": "202 [{"post_id": 30317, "ts": "2026-07-17T19:28:24Z", "hours": 1.3814, "text": "Add a cli tool to update / sync config"}, {"post_id": 29669, "ts": "2026-07-16T18:52:35Z", "hours": 2.5019, "text": "Add price tip to notify price of tokens. Add a json file for free models."}]...
|
Title: opencode-copilot-chat by @Pikacnu | Stardan Title: opencode-copilot-chat by @Pikacnu | Stardance
Devlogs:
Add price tip to notify price of tokens. Add a json file for free models.
Add a cli tool to update / sync config
Ships:
Add a action(for json build) / cli(for sync config in cli) / github guide to let people add opencode endpoint to copliot more easily....
|
1793321365.5415056
|
1793407765.5415056
|
|
31680
|
opencv by @elisa | Stardance
|
elisa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: opencv by @elisa | Stardance
|
1793292738.529034
|
1793897538.529034
|
|
61475
|
openflash by @rehankasim | Stardance
|
rehankasim
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: openflash by @rehankasim | Stardance
|
1793040629.662316
|
1793645429.662316
|
|
8210
|
openrazer revived by @encompl | Stardance
|
encompl
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: openrazer revived by @encompl | Stardance
|
1792785176.0144877
|
1793389976.0144877
|
|
43070
|
optimize by @2soneon | Stardance
|
2soneon
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: optimize by @2soneon | Stardance
|
1793202476.1563795
|
1793807276.1563795
|
|
3749
|
options_engine by @Aarnav | Stardance
|
Aarnav
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: options_engine by @Aarnav | Stardance
|
1792806571.5922494
|
1793411371.5922494
|
|
679
|
oral-b Library by @brian | Stardance
|
brian
|
1
|
22.0
|
399
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-14T03:43:08Z", "hours": 22.0, "multiplier": 18.43, "payout": 399, "blessing": "neutral", "text": "I built a Node.js library for bidirectional Bluetooth communication with Oral-B smart toothbrushes, without needing the app! The most challenging part was definitely reverse engineering the Bluetooth characteristic logic in the Oral-B Android app using jadx. Since testing out this project may be difficult for obvious reasons (not too many people have an overpriced smart toothbrush xD), the demo link will bring you to a sample demo video of how it works!", "repo": "https://github.com/brianwalczak/oral-b", "demo": "https://github.com/brianwalczak/oral-b/releases/tag/v0.1.0"}]...
|
[{"post_id": 46678, "ts": "202 [{"post_id": 46678, "ts": "2026-08-14T03:40:12Z", "hours": 0.5619, "text": "I made a quick demonstration video and added some example scripts to the project!"}, {"post_id": 45767, "ts": "2026-08-12T13:53:31Z", "hours": 1.6933, "text": "I spent some time cleaning up the package.json and implementing some bug fixes like adding reads and subscriptions to a queue (since before it would send them at the same time and crash the brush occasionally). Some newer brushes also require an “unlock code” to use the Bluetooth API, so I implemented that too! The first version is now live on npm.js!"}, {"post_id": 44277, "ts": "2026-08-09T22:30:20Z", "hours": 3.8067, "text": "I’ve finally finished working on the documentation! I also added a commands table in the README.md which lists all of the current commands and a link to their designated Markdown page. I’m preparing to publish it to npm.js now!"}, {"post_id": 43100, "ts": "2026-08-08T05:44:03Z", "hours": 1.8494, "text": "I finished adding some more commands: deviceState which tells you what “state” the brush is in (running, idle, charging, etc), buttonState which allows you to subscribe to button events and notifies you when the power or mode button was pressed, and brushingTime which allows you to view the live stopwatch as you brush your teeth. I built a simple demo script to give you all a visual example of how these can be used!"}, {"post_id": 38363, "ts": "2026-07-31T18:24:38Z", "hours": 7.2906, "text": "Been a while! Most of this 7 hours was spent digging through the source code of the Oral-B codebase again, but I finished implementing a Bluetooth command transport layer and added a command handler for easy additions. I also implemented protocol versioning, which each brush specifies in its manufacturer data so the host knows what commands/values are available for the brush. In most cases, the newer the brush model (especially in the iO series of brushes), the higher the protocol, resulting in more available commands / data values to read from. I’ve also added the first incoming command: batteryLevel ! This method requests battery data from the brush, and depending on the protocol version of your brush, you’ll be able to view info like the battery percentage, estimated runtime, and even the technical specifications of the battery (like voltage, current, temperature, etc). From here on, all I’ll be doing is adding more support for commands!"}, {"post_id": 27549, "ts": "2026-07-13T06:54:55Z", "hours": 2.1819, "text": "It’s been a while but I’m back! I made huge changes to the overall layout of the library, and decided that… Brush objects are the devices themselves, and will allow you to connect, disconnect, view its state, send/receive BLE commands, etc. OralBClient will only act as a “discovery layer”, which lets you search for new Brush objects and keep track of your connections (like a “management” layer I guess you could call it???) I finished building the connect/disconnect commands with an optional timeout option for connections, and I moved rssi and macAddress into getters so they’re read directly from the peripheral and update automatically. Had to switch to the @stoprocent/noble fork because the previous one caused issues with discovery in Fedora. In OralBClient , I added a way to track the brushes and store the connected ones in a Map (so users don’t have to keep track of the Brush objects elsewhere). I also added the option to stop discovery early, and an adapter state check before it starts discovering (so it waits for the Bluetooth adapter to power on first!)"}, {"post_id": 1031, "ts": "2026-06-02T20:27:41Z", "hours": 4.2644, "text": "First devlog! Spent a LONG time exploring the Oral-B app codebase to learn about how devices are discovered, and what bytes are interpreted from the manufacturer data. So far I’ve built a discover() method which hooks onto the @abandonware/noble library and searches for brushes nearby. I managed to reverse engineer the manufacturer data payload which let’s me identify the model line of the brush and filter out non Oral-B devices! :D"}]...
|
Title: oral-b Library by @brian | Stardance
Devlo Title: oral-b Library by @brian | Stardance
Devlogs:
First devlog! Spent a LONG time exploring the Oral-B app codebase to learn about how devices are discovered, and what bytes are interpreted from the manufacturer data. So far I’ve built a discover() method which hooks onto the @abandonware/noble library and searches for brushes nearby. I managed to reverse engineer the manufacturer data payload which let’s me identify the model line of the brush and filter out non Oral-B devices! :D
It’s been a while but I’m back! I made huge changes to the overall layout of the library, and decided that… Brush objects are the devices themselves, and will allow you to connect, disconnect, view its state, send/receive BLE commands, etc. OralBClient will only act as a “discovery layer”, which lets you search for new Brush objects and keep track of your connections (like a “management” layer I guess you could call it???) I finished building the connect/disconnect commands with an optional timeout option for connections, and I moved rssi and macAddress into getters so they’re read directly from the peripheral and update automatically. Had to switch to the @stoprocent/noble fork because the previous one caused issues with discovery in Fedora. In OralBClient , I added a way to track the brushes and store the connected ones in a Map (so users don’t have to keep track of the Brush objects elsewhere). I also added the option to stop discovery early, and an adapter state check before it starts discovering (so it waits for the Bluetooth adapter to power on first!)
Been a while! Most of this 7 hours was spent digging through the source code of the Oral-B codebase again, but I finished implementing a Bluetooth command transport layer and added a command handler for easy additions. I also implemented protocol versioning, which each brush specifies in its manufacturer data so the host knows what commands/values are available for the brush. In most cases, the newer the brush model (especially in the iO series of brushes), the higher the protocol, resulting in more available commands / data values to read from. I’ve also added the first incoming command: batteryLevel ! This method requests battery data from the brush, and depending on the protocol version of your brush, you’ll be able to view info like the battery percentage, estimated runtime, and even the technical specifications of the battery (like voltage, current, temperature, etc). From here on, all I’ll be doing is adding more support for commands!
I finished adding some more commands: deviceState which tells you what “state” the brush is in (running, idle, charging, etc), buttonState which allows you to subscribe to button events and notifies you when the power or mode button was pressed, and brushingTime which allows you to view the live stopwatch as you brush your teeth. I built a simple demo script to give you all a visual example of how these can be used!
I’ve finally finished working on the documentation! I also added a commands table in the README.md which lists all of the current commands and a link to their designated Markdown page. I’m preparing to publish it to npm.js now!
I spent some time cleaning up the package.json and implementing some bug fixes like adding reads and subscriptions to a queue (since before it would send them at the same time and crash the brush occasionally). Some newer brushes also require an “unlock code” to use the Bluetooth API, so I implemented that too! The first version is now live on npm.js!
I made a quick demonstration video and added some example scripts to the project!
Ships:
I built a Node.js library for bidirectional Bluetooth communication with Oral-B smart toothbrushes, without needing the app! The most challenging part was definitely reverse engineering the Bluetooth characteristic logic in the Oral-B Android app using jadx. Since testing out this project may be difficult for obvious reasons (not too many people have an overpriced smart toothbrush xD), the demo link will bring you to a sample demo video of how it works!...
|
1793440147.5977426
|
1793526547.5977426
|
|
29851
|
orange by @cpplover0 | Stardance
|
cpplover0
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: orange by @cpplover0 | Stardance
|
1793245804.7911968
|
1793850604.7911968
|
|
45979
|
orbit os by @dineshkarthik | Stardance
|
dineshkarthik
|
1
|
3.33
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T18:18:51Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? I made OrbitOS, a cute little browser based OS for Hack Club Stardance WebOS 1! It includes draggable windows, a dock, Notes, Terminal, Mission Control, Settings, customizable backgrounds and a clock, and persistent workspace saves! Everything is made in just HTML, CSS and JS as well! What was challenging? The most challenging bits were implementing the dragging and focus behaviors for the windows, along with getting the buttons and clock to work properly with a JS Init bug that was really hard to find What are you proud of? I’m really proud of getting to make an OS that actually feels like my own, and not just a generic template everyone else is using, and I got to implement multiple notes, customizability, desktop persistence, mission control, and my own cool electric cyano/blue/green color scheme What should people know so they can test your project? All you have to do is open the demo and start clicking around, there’s no need for an account or password You can try opening up multiple apps from the dock, dragging the windows, closing them, reopening them, making multiple notes, trying out the terminal, and changing your settings and backgrounds in Settings! Everything is persistent in your local storage so your notes and settings will all be saved on your device!", "repo": "https://github.com/Karthik-854321/ORBIT-OS", "demo": "https://karthik-854321.github.io/ORBIT-OS/"}]...
|
[{"post_id": 44607, "ts": "202 [{"post_id": 44607, "ts": "2026-08-10T14:25:52Z", "hours": 0.3258, "text": "Devlog Update Finished the project with my own css styling and taken out the AI polish. Using the AI to help me style was a mistake because it made the project look nice but I also didn’t put my own ideas and creativity into the project I’ve now learned that you can use AI to help you and make you more efficient but you shouldn’t rely on it to do everything for you."}, {"post_id": 44127, "ts": "2026-08-09T18:08:02Z", "hours": 0.4244, "text": "OrbitOS — My Little WebOSOrbitOS is a small browser-based operating system I built for the Hack Club Stardance WebOS 1 mission.It has draggable windows, a dock, Notes, Terminal, Mission Control, Settings, a live clock, custom backgrounds, and local workspace saving.I also gave it my own visual identity with an electric color palette instead of following the usual cyberpunk look.Built withHTML • CSS • JavaScript • LocalStorage • Browser APIsThe goal was simple: make a little desktop that feels like mine.🔗 GitHub: https://github.com/Karthik-854321/ORBIT-OS"}, {"post_id": 44098, "ts": "2026-08-09T17:07:17Z", "hours": 0.825, "text": "Devlog 04 - OrbitOS WebOS 1 Final Update OrbitOS is complete for WebOS 1, having focused development on making the OS more approachable and expressive rather than adding more windows. Added features include multiple-note support, desktop customization, custom backgrounds, clock controls, workspace saving/restoration, and LocalStorage-based persistent settings Several bugs found during testing have been fixed, including the bug that broke the clock and app buttons by not initializing properly with JavaScript. The final version of OrbitOS includes Home, About, Notes, Terminal, Mission Control, and Settings, with draggable and reopenable windows and a responsive desktop. Testing the apps, windows, persistence, desktop customization, and Terminal make it ready for the WebOS 1 submission."}, {"post_id": 44041, "ts": "2026-08-09T15:32:40Z", "hours": 0.5917, "text": "Devlog 03 - Applications Complete OrbitOS now has a proper set of working applications instead of just placeholder windows. Added Home dashboard with quick access About application Notes editor with local saving Terminal with basic commands Mission control with live system information Working application dock Multiple draggable windows Window focus and z-index Close and reopen functionality The main part of this update was connecting the applications together so that they feel like a smaller operating system rather than just a set of webpages. I also prepeared the Settings application for the final WebOS 1 update Next The final update will focus on persistence, customization, workspace saving and final testing before the Stardance submission."}, {"post_id": 44009, "ts": "2026-08-09T14:37:01Z", "hours": 0.4333, "text": "Devlog 02 - Window Manager I have been working on implementing the window system to make the OS feel more complete as an operating system. Added Multiple application windows Open/close Draggable Focus and z-index Basic viewport boundaries Pointer interaction Responsive behavior The main challenge was implementing the natural movement of windows without making them impossible to reach on the edges of the screen. Next, I will be working on fleshing out the applications that have been stubbed so far."}, {"post_id": 43980, "ts": "2026-08-09T13:46:24Z", "hours": 0.9869, "text": "Devlog 01 - Starting OrbitOS I started working on the OrbitOS project with a simple idea in mind - to create a mini operating system that would run inside a browser. I didn’t want the first build to be something too big, a complicated standalone application or framework, so I set off to construct simple HTML, CSS and JavaScript foundation. For the first step I made the desktop, the top system bar, a clock, the dock, and the first home screen window. The window is currently not draggable and that’s something I want to work on in the next steps as the window system is going to be the central part of the OS. What’s been done I’ve built the following: Basic OrbitOS desktop System bar Live clock Application dock First application window Responsive starting layout What’s been learned Working on such a small first build helped to have an idea on what else is needed for the operating system to be actually useful. What’s next Work on the window manager and make the applications movable."}]...
|
Title: orbit os by @dineshkarthik | Stardance
Dev Title: orbit os by @dineshkarthik | Stardance
Devlogs:
Devlog 01 - Starting OrbitOS I started working on the OrbitOS project with a simple idea in mind - to create a mini operating system that would run inside a browser. I didn’t want the first build to be something too big, a complicated standalone application or framework, so I set off to construct simple HTML, CSS and JavaScript foundation. For the first step I made the desktop, the top system bar, a clock, the dock, and the first home screen window. The window is currently not draggable and that’s something I want to work on in the next steps as the window system is going to be the central part of the OS. What’s been done I’ve built the following: Basic OrbitOS desktop System bar Live clock Application dock First application window Responsive starting layout What’s been learned Working on such a small first build helped to have an idea on what else is needed for the operating system to be actually useful. What’s next Work on the window manager and make the applications movable.
Devlog 02 - Window Manager I have been working on implementing the window system to make the OS feel more complete as an operating system. Added Multiple application windows Open/close Draggable Focus and z-index Basic viewport boundaries Pointer interaction Responsive behavior The main challenge was implementing the natural movement of windows without making them impossible to reach on the edges of the screen. Next, I will be working on fleshing out the applications that have been stubbed so far.
Devlog 03 - Applications Complete OrbitOS now has a proper set of working applications instead of just placeholder windows. Added Home dashboard with quick access About application Notes editor with local saving Terminal with basic commands Mission control with live system information Working application dock Multiple draggable windows Window focus and z-index Close and reopen functionality The main part of this update was connecting the applications together so that they feel like a smaller operating system rather than just a set of webpages. I also prepeared the Settings application for the final WebOS 1 update Next The final update will focus on persistence, customization, workspace saving and final testing before the Stardance submission.
Devlog 04 - OrbitOS WebOS 1 Final Update OrbitOS is complete for WebOS 1, having focused development on making the OS more approachable and expressive rather than adding more windows. Added features include multiple-note support, desktop customization, custom backgrounds, clock controls, workspace saving/restoration, and LocalStorage-based persistent settings Several bugs found during testing have been fixed, including the bug that broke the clock and app buttons by not initializing properly with JavaScript. The final version of OrbitOS includes Home, About, Notes, Terminal, Mission Control, and Settings, with draggable and reopenable windows and a responsive desktop. Testing the apps, windows, persistence, desktop customization, and Terminal make it ready for the WebOS 1 submission.
OrbitOS — My Little WebOSOrbitOS is a small browser-based operating system I built for the Hack Club Stardance WebOS 1 mission.It has draggable windows, a dock, Notes, Terminal, Mission Control, Settings, a live clock, custom backgrounds, and local workspace saving.I also gave it my own visual identity with an electric color palette instead of following the usual cyberpunk look.Built withHTML • CSS • JavaScript • LocalStorage • Browser APIsThe goal was simple: make a little desktop that feels like mine.🔗 GitHub: https://github.com/Karthik-854321/ORBIT-OS
Devlog Update Finished the project with my own css styling and taken out the AI polish. Using the AI to help me style was a mistake because it made the project look nice but I also didn’t put my own ideas and creativity into the project I’ve now learned that you can use AI to help you and make you more efficient but you shouldn’t rely on it to do everything for you.
Ships:
What did you make? I made OrbitOS, a cute little browser based OS for Hack Club Stardance WebOS 1! It includes draggable windows, a dock, Notes, Terminal, Mission Control, Settings, customizable backgrounds and a clock, and persistent workspace saves! Everything is made in just HTML, CSS and JS as well! What was challenging? The most challenging bits were implementing the dragging and focus behaviors for the windows, along with getting the buttons and clock to work properly with a JS Init bug that was really hard to find What are you proud of? I’m really proud of getting to make an OS that actually feels like my own, and not just a generic template everyone else is using, and I got to implement multiple notes, customizability, desktop persistence, mission control, and my own cool electric cyano/blue/green color scheme What should people know so they can test your project? All you have to do is open the demo and start clicking around, there’s no need for an account or password You can try opening up multiple apps from the dock, dragging the windows, closing them, reopening them, making multiple notes, trying out the terminal, and changing your settings and backgrounds in Settings! Everything is persistent in your local storage so your notes and settings will all be saved on your device!...
|
1792878539.265924
|
1793742539.265924
|
|
71162
|
orbit os by @dkarthikofficial | Stardance
|
dkarthikofficial
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: orbit os by @dkarthikofficial | Stardance
|
1792842440.070952
|
1793447240.070952
|
|
25056
|
orbit.mp3 by @dylpickle | Stardance
|
dylpickle
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: orbit.mp3 by @dylpickle | Stardance
|
1793260329.1822767
|
1793865129.1822767
|
|
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
|
|
45077
|
orbital mech by @speetham10 | Stardance
|
speetham10
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: orbital mech by @speetham10 | Stardance
|
1793314082.8439698
|
1793918882.8439698
|
|
43059
|
orbitview by @gautamagrawal5067 | Stardance
|
gautamagrawal5067
|
1
|
11.0
|
64
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-07T11:45:11Z", "hours": 11.0, "multiplier": 6.08, "payout": 64, "blessing": "neutral", "text": "I have built a space explorer website called OrbitView that uses NASA APIs to show real-time information regarding asteroids close to our planet Earth. The project contains a modern space-themed design, a glassmorphism interface, responsive design, interactive data cards, and navigation. I wanted to build an educational yet fun space exploration website that would provide information from NASA APIs. The hardest part of the work was implementing the NASA APIs and making sure that the data loading was done successfully in any circumstances. Moreover, the design of the user interface took a lot of time, as it needed to be both beautiful and readable, and fit the different screen sizes. Testing the working of JavaScript modules, as well as the loading of the API data was hard but necessary. The thing that I am most proud of is turning the concept of the project into a working website. All the elements of the website were developed through the process of testing and improving. OrbitView can be tested by opening the website in the modern web browser that is connected to the Internet, since the project uses NASA’s public APIs.", "repo": "https://github.com/gautamagrawal5068-maker/orbitview", "demo": "https://vieworbit.netlify.app"}]...
|
[{"post_id": 42560, "ts": "202 [{"post_id": 42560, "ts": "2026-08-07T11:43:24Z", "hours": 1.9978, "text": "This session brought about the completion of OrbitView. The work that I did included integration of the rest of the pieces together, bug fixing, and improving the overall experience. I was successful in getting the frontend working with the NASA APIs and hence live asteroid data. I also completed the responsive design, made improvements in animations, optimized the performance, and did extensive testing to ensure that all the functionality works perfectly well. The problem: The challenges in this phase of the development were dealing with a couple of bugs such as API request errors, inconsistencies in the UI functionality on various screen sizes, and some JavaScript bugs that affected data rendering. Fixing these bugs involved a lot of testing and several revisions to get everything running. The plan ahead: Now that OrbitView is complete, the way forward is to deploy it by improving the documentation and refining the README file and then deploying this latest build and submitting it as my project for the Hack Club Stardance challenge."}, {"post_id": 41847, "ts": "2026-08-06T10:00:14Z", "hours": 4.61, "text": "In this session, I was able to completely write the CSS code for the whole OrbitView website. Most of the time was dedicated to adjusting the dark-space inspired UI to ensure that all its elements conform to the general futuristic dashboard design style. I made sure that the styling of sidebars, navigation, modals, buttons, information blocks, and responsive design were done to the fullest. I also perfected glassmorphism, animations, spaces, and fonts in order to create an appealing user experience. At this point, with the frontend being completely styled, the website is ready for the functional part of development. The problem: The process of fine-tuning glassmorphism turned out to be quite challenging, as finding the correct balance between transparency, blur effect, and readability involved many trials. In addition, there were some issues with the layout and responsiveness, when some elements overlapped each other or were misaligned at certain screen sizes, and therefore, I had to do several corrections. The plan ahead: After the completion of the CSS code, the next step is the development of api.js file. In it, I am going to implement the NASA NeoWs API to show up-to-date information about asteroids in OrbitView."}, {"post_id": 41085, "ts": "2026-08-05T01:32:19Z", "hours": 3.9389, "text": "This session saw me spend a lot of time setting up the frontend UI architecture. I created style.css to develop the dark space-themed UI where I used glassmorphism to build my sidebars and modals to make it look like a dashboard interface. Also, I began working on the Javascript architecture by splitting it into multiple files (ui.js, api.js, scene.js). The problem: Getting the CSS backdrop-filter (blurring effect) working properly and not making everything too blurry was a pain in the neck. In addition to this, I had some difficulties while trying to test my JS modules because of CORS issues until I figured out that I had to use a Python HTTP server to test them. The plan ahead: Now, the UI is done but it is still an empty shell. Next session, I am going to start working on api.js to get my asteroids from NASA NeoWs API endpoint."}]...
|
Title: orbitview by @gautamagrawal5067 | Stardance Title: orbitview by @gautamagrawal5067 | Stardance
Devlogs:
This session saw me spend a lot of time setting up the frontend UI architecture. I created style.css to develop the dark space-themed UI where I used glassmorphism to build my sidebars and modals to make it look like a dashboard interface. Also, I began working on the Javascript architecture by splitting it into multiple files (ui.js, api.js, scene.js). The problem: Getting the CSS backdrop-filter (blurring effect) working properly and not making everything too blurry was a pain in the neck. In addition to this, I had some difficulties while trying to test my JS modules because of CORS issues until I figured out that I had to use a Python HTTP server to test them. The plan ahead: Now, the UI is done but it is still an empty shell. Next session, I am going to start working on api.js to get my asteroids from NASA NeoWs API endpoint.
In this session, I was able to completely write the CSS code for the whole OrbitView website. Most of the time was dedicated to adjusting the dark-space inspired UI to ensure that all its elements conform to the general futuristic dashboard design style. I made sure that the styling of sidebars, navigation, modals, buttons, information blocks, and responsive design were done to the fullest. I also perfected glassmorphism, animations, spaces, and fonts in order to create an appealing user experience. At this point, with the frontend being completely styled, the website is ready for the functional part of development. The problem: The process of fine-tuning glassmorphism turned out to be quite challenging, as finding the correct balance between transparency, blur effect, and readability involved many trials. In addition, there were some issues with the layout and responsiveness, when some elements overlapped each other or were misaligned at certain screen sizes, and therefore, I had to do several corrections. The plan ahead: After the completion of the CSS code, the next step is the development of api.js file. In it, I am going to implement the NASA NeoWs API to show up-to-date information about asteroids in OrbitView.
This session brought about the completion of OrbitView. The work that I did included integration of the rest of the pieces together, bug fixing, and improving the overall experience. I was successful in getting the frontend working with the NASA APIs and hence live asteroid data. I also completed the responsive design, made improvements in animations, optimized the performance, and did extensive testing to ensure that all the functionality works perfectly well. The problem: The challenges in this phase of the development were dealing with a couple of bugs such as API request errors, inconsistencies in the UI functionality on various screen sizes, and some JavaScript bugs that affected data rendering. Fixing these bugs involved a lot of testing and several revisions to get everything running. The plan ahead: Now that OrbitView is complete, the way forward is to deploy it by improving the documentation and refining the README file and then deploying this latest build and submitting it as my project for the Hack Club Stardance challenge.
Ships:
I have built a space explorer website called OrbitView that uses NASA APIs to show real-time information regarding asteroids close to our planet Earth. The project contains a modern space-themed design, a glassmorphism interface, responsive design, interactive data cards, and navigation. I wanted to build an educational yet fun space exploration website that would provide information from NASA APIs. The hardest part of the work was implementing the NASA APIs and making sure that the data loading was done successfully in any circumstances. Moreover, the design of the user interface took a lot of time, as it needed to be both beautiful and readable, and fit the different screen sizes. Testing the working of JavaScript modules, as well as the loading of the API data was hard but necessary. The thing that I am most proud of is turning the concept of the project into a working website. All the elements of the website were developed through the process of testing and improving. OrbitView can be tested by opening the website in the modern web browser that is connected to the Internet, since the project uses NASA’s public APIs....
|
1793465310.9410617
|
1793551710.9410617
|
|
64559
|
order by @parobryan009 | Stardance
|
parobryan009
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: order by @parobryan009 | Stardance
|
1793065728.5333061
|
1793670528.5333061
|
|
9444
|
order-tool by @derjan_albrecht | Stardance
|
derjan_albrecht
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: order-tool by @derjan_albrecht | Stardance
|
1793325168.5460658
|
1793929968.5460658
|
|
54393
|
orezOS by @hamarisun | Stardance
|
hamarisun
|
0
|
14.87
|
0
|
[]
|
[{"post_id": 81567, "ts": "202 [{"post_id": 81567, "ts": "2026-10-21T18:20:06Z", "hours": 5.5361, "text": "##H2 Another app previously i had made the notes app following the guide. this time i have made photo gallery. Scroll able window!!! Things left to do -login screen -super app(calculator probably"}, {"post_id": 78432, "ts": "2026-10-10T19:54:00Z", "hours": 8.2719, "text": "apps! im trying to make apps. As usually i m not successful. This time at least i know that i just dont get how Java works due to lenguage barrier. Too bad :|"}, {"post_id": 59858, "ts": "2026-09-01T20:39:58Z", "hours": 1.0608, "text": "starting the os"}]...
|
Title: orezOS by @hamarisun | Stardance
Devlogs:
Title: orezOS by @hamarisun | Stardance
Devlogs:
starting the os
apps! im trying to make apps. As usually i m not successful. This time at least i know that i just dont get how Java works due to lenguage barrier. Too bad :|
##H2 Another app previously i had made the notes app following the guide. this time i have made photo gallery. Scroll able window!!! Things left to do -login screen -super app(calculator probably...
|
1792788527.145387
|
1793393327.145387
|
|
18764
|
origamiking3612.com by @OrigamiKing3612 | Stardanc origamiking3612.com by @OrigamiKing3612 | Stardance...
|
OrigamiKing3612
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: origamiking3612.com by @OrigamiKing3612 | S Title: origamiking3612.com by @OrigamiKing3612 | Stardance...
|
1792810069.9677825
|
1793414869.9677825
|
|
61711
|
orion by @babatetu | Stardance
|
babatetu
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: orion by @babatetu | Stardance
|
1793040802.707808
|
1793645602.707808
|
|
61458
|
orion os by @rehankasim | Stardance
|
rehankasim
|
0
|
1.4
|
0
|
[]
|
[{"post_id": 67236, "ts": "202 [{"post_id": 67236, "ts": "2026-09-13T09:16:33Z", "hours": 1.4025, "text": "orion os first and last devlog not much to add it was a little bit easy becuase i only made a single html file took me time hackatime didnt counted it it could be because i dont save my file every time i started late wanted that mac air but i am late but still coding so i can get atleast anything"}]...
|
Title: orion os by @rehankasim | Stardance
Devlog Title: orion os by @rehankasim | Stardance
Devlogs:
orion os first and last devlog not much to add it was a little bit easy becuase i only made a single html file took me time hackatime didnt counted it it could be because i dont save my file every time i started late wanted that mac air but i am late but still coding so i can get atleast anything...
|
1793040620.6911652
|
1793645420.6911652
|
|
53466
|
oro by @Wajeeh | Stardance
|
Wajeeh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: oro by @Wajeeh | Stardance
|
1792749129.9892385
|
1793353929.9892385
|
|
2499
|
orph-os by @brny | Stardance
|
brny
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: orph-os by @brny | Stardance
|
1792781427.6049147
|
1793386227.6049147
|
|
50076
|
orph32 by @pizzalover125 | Stardance
|
pizzalover125
|
1
|
15.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-08T00:11:52Z", "hours": 15.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "an esp32 devboard to be sold at hack club shops; Orpheus Pico, but with an ESP32 chip", "repo": "https://github.com/pizzalover125/orpheus32", "demo": ""}]...
|
[{"post_id": 56129, "ts": "202 [{"post_id": 56129, "ts": "2024-06-04T00:00:00Z", "hours": 1.0, "text": "im locking in polish today this bout to be the most polished thing ever first things first, delete whatever i made b4 start w blank slate okay, time to design a logo will use Figma o, r, p, h all layered on top of each other v2 of logo need to add 32 component to it bruh ts is so hard idk ill start afresh ok im back at 3:45 pm time to get back to work on this ok that looks better ok who let me cook something needs to be in the middle also got tons of positive feedback which is nice to hear who let me cook something forming? i feel like this is enough"}, {"post_id": 56079, "ts": "2024-06-03T00:00:00Z", "hours": 0.25, "text": "ahhhhhh im trying to make it better i tried to brand it as “the most comical devboard” but it did not end up working i need to find a way to make this more personalized ahhhh why is this so hard"}, {"post_id": 56078, "ts": "2024-06-02T00:00:00Z", "hours": 0.5, "text": "project rejected :( apparently it is too generic in terms of art need to fix that! looking at https://hardware.hackclub.com/gallery for inspo i like https://github.com/NotARoomba/ember and Taranium-RP2040 made it comic sans ahhhhh idk how to make the art better"}, {"post_id": 56077, "ts": "2024-05-21T00:00:00Z", "hours": 3.0, "text": "redoing all the passives going to change placement as well some changes to values + decoupling caps added done with pairs + placement! wowoowowowow time to see price bc i lessened number of items bruh price is $93 now $180 w customs and shipping 😢 I HAVE TO RESTART bc ESP32-S3 is too expensive luckily i have rev2 still available which uses routing time wait ill add SK6218-mini ok added PCB done! need to add silkscreen now! both sides done! time to add Hack Club logo BOOM! ok sent message in slack idk i feel like accelorometer is not needed i think i might prepare for submission now ok going to prepare for submission added cool labels to evrything creating render cause why not Render PCB + Schematic KiCAD Render JLC comes out to $40.30 👀 ok time to upload files and prepare README"}, {"post_id": 56076, "ts": "2024-05-20T00:00:00Z", "hours": 2.0, "text": "I fixed DRC errors that Taran pointed out now i want to add a neopixel to make it look cooler going to use SK6812 cause why not routed it! will add 3d model ok added it from SnapEDA wait the headers are reversed; need to fix time for silkscreen raygen wants me to add another neopixel was not planning to, but sure added! going to view other devboards notes from other breadboards: label schematic to make it pretty label pins (seems to be very important) hack club logo + other silkscreen art ok im locked in now wow this is harder than I expected first half done! one more half to go had a bunch of problems choosing font and positioning properly made post on Hack Club Slack ok i think thats it for now; will come back to fix problems, tidy schematic, and prepare to submit! seems like no major errors as nobody has said much on Slack Taran told me to add which GPIO are being used for sensors, so I did that! going to create order on JLC and source parts! im doing everything except the pins cause i don’t really need them PCBA ok i can do a lot of optimization but first, i need to fix all the things Rudy mentioned ahhh too tired for this; will do tmrw ig"}, {"post_id": 56075, "ts": "2024-05-19T00:00:00Z", "hours": 3.0, "text": "@Rudy on Slack told me to use a ESP32 with built-in UART-to-USB ig thats what we are doing for this after brief research, I found ESP32-S3-WROOM-1 with 36 GPIO will read https://documentation.espressif.com/esp32-s3-wroom-1_wroom-1u_datasheet_en.pdf idk if I even should create a board bc its going to be super basic copied USB-C w/o diode going to use same power circuitry added buttons bruh my schematic feels so basic pcb also feels too basic… idk if this is worth it cause its too basic ok im back after a couple of hours i’m going to make this a sensor board finally mastered differential pairs in KiCad w https://www.youtube.com/watch?v=M13QxtPVrXY ! wait routing this is impossible waiting for expert resposne in Slack; going to select some chips to use after brief research, i’ve decided to use BME280 and LSM6DS3 BME280 is temperature, while the LSM6DS3 is accelorometer after much reading of datasheets, came up with this! hopefully it is correct rev 3 is complete!"}, {"post_id": 56074, "ts": "2024-05-18T00:00:00Z", "hours": 2.0, "text": "time to fix everything I did wrong, such as: also apparently my routing is inefficient REROUTED EVERYTHING AGAIN BUT IT STILL DIDN”T WORK AHHHHH time to watch https://www.youtube.com/watch?v=KgOQaBUPiBo ok that vid no good lets try https://www.youtube.com/watch?v=v2okbB05piE AI slop vid; nvm lets try https://www.youtube.com/watch?v=0tuuMSxcVxg got it working! w render and we are done with routing for rev2… wow this is turning out great! next rev, need to minimize vias from 15 to like 5"}, {"post_id": 56073, "ts": "2024-05-18T00:00:00Z", "hours": 3.0, "text": "During highway, Jenin had this idea to make an ESP32 devboard called Orpheus32, but ended up never making it and granted me permission to make it I never made it… until now! im going to use KiCad going to use WROOM-32 realized that it doesn’t have easy USB pins like RP2040; need a USB to UART coverter after some vary minimal research, it looks like CH340C is the standard for the converter using LDO AMS117 3.3v edition working on USB-C need B5819W diode adding power LED following standard conventions for the first time by having GND face down and VCC/VBUS/+5V/etc face up USBC done LDO done USB to UART done buttons done actual ESP32 + pins done also! ok assigned footprints will start PCB now… wow this project is super easy thus far got general layout sort of… need to add components components added time to route ill use differential pair surprisingly not too difficult bruh i messed up schematic ok i added ground planes and am done with rev1! ill get a 3d model of the USBC first ok time to find bugs and do more revisions!"}]...
|
Title: orph32 by @pizzalover125 | Stardance
Devlo Title: orph32 by @pizzalover125 | Stardance
Devlogs:
During highway, Jenin had this idea to make an ESP32 devboard called Orpheus32, but ended up never making it and granted me permission to make it I never made it… until now! im going to use KiCad going to use WROOM-32 realized that it doesn’t have easy USB pins like RP2040; need a USB to UART coverter after some vary minimal research, it looks like CH340C is the standard for the converter using LDO AMS117 3.3v edition working on USB-C need B5819W diode adding power LED following standard conventions for the first time by having GND face down and VCC/VBUS/+5V/etc face up USBC done LDO done USB to UART done buttons done actual ESP32 + pins done also! ok assigned footprints will start PCB now… wow this project is super easy thus far got general layout sort of… need to add components components added time to route ill use differential pair surprisingly not too difficult bruh i messed up schematic ok i added ground planes and am done with rev1! ill get a 3d model of the USBC first ok time to find bugs and do more revisions!
time to fix everything I did wrong, such as: also apparently my routing is inefficient REROUTED EVERYTHING AGAIN BUT IT STILL DIDN”T WORK AHHHHH time to watch https://www.youtube.com/watch?v=KgOQaBUPiBo ok that vid no good lets try https://www.youtube.com/watch?v=v2okbB05piE AI slop vid; nvm lets try https://www.youtube.com/watch?v=0tuuMSxcVxg got it working! w render and we are done with routing for rev2… wow this is turning out great! next rev, need to minimize vias from 15 to like 5
@Rudy on Slack told me to use a ESP32 with built-in UART-to-USB ig thats what we are doing for this after brief research, I found ESP32-S3-WROOM-1 with 36 GPIO will read https://documentation.espressif.com/esp32-s3-wroom-1_wroom-1u_datasheet_en.pdf idk if I even should create a board bc its going to be super basic copied USB-C w/o diode going to use same power circuitry added buttons bruh my schematic feels so basic pcb also feels too basic… idk if this is worth it cause its too basic ok im back after a couple of hours i’m going to make this a sensor board finally mastered differential pairs in KiCad w https://www.youtube.com/watch?v=M13QxtPVrXY ! wait routing this is impossible waiting for expert resposne in Slack; going to select some chips to use after brief research, i’ve decided to use BME280 and LSM6DS3 BME280 is temperature, while the LSM6DS3 is accelorometer after much reading of datasheets, came up with this! hopefully it is correct rev 3 is complete!
I fixed DRC errors that Taran pointed out now i want to add a neopixel to make it look cooler going to use SK6812 cause why not routed it! will add 3d model ok added it from SnapEDA wait the headers are reversed; need to fix time for silkscreen raygen wants me to add another neopixel was not planning to, but sure added! going to view other devboards notes from other breadboards: label schematic to make it pretty label pins (seems to be very important) hack club logo + other silkscreen art ok im locked in now wow this is harder than I expected first half done! one more half to go had a bunch of problems choosing font and positioning properly made post on Hack Club Slack ok i think thats it for now; will come back to fix problems, tidy schematic, and prepare to submit! seems like no major errors as nobody has said much on Slack Taran told me to add which GPIO are being used for sensors, so I did that! going to create order on JLC and source parts! im doing everything except the pins cause i don’t really need them PCBA ok i can do a lot of optimization but first, i need to fix all the things Rudy mentioned ahhh too tired for this; will do tmrw ig
redoing all the passives going to change placement as well some changes to values + decoupling caps added done with pairs + placement! wowoowowowow time to see price bc i lessened number of items bruh price is $93 now $180 w customs and shipping 😢 I HAVE TO RESTART bc ESP32-S3 is too expensive luckily i have rev2 still available which uses routing time wait ill add SK6218-mini ok added PCB done! need to add silkscreen now! both sides done! time to add Hack Club logo BOOM! ok sent message in slack idk i feel like accelorometer is not needed i think i might prepare for submission now ok going to prepare for submission added cool labels to evrything creating render cause why not Render PCB + Schematic KiCAD Render JLC comes out to $40.30 👀 ok time to upload files and prepare README
project rejected :( apparently it is too generic in terms of art need to fix that! looking at https://hardware.hackclub.com/gallery for inspo i like https://github.com/NotARoomba/ember and Taranium-RP2040 made it comic sans ahhhhh idk how to make the art better
ahhhhhh im trying to make it better i tried to brand it as “the most comical devboard” but it did not end up working i need to find a way to make this more personalized ahhhh why is this so hard
im locking in polish today this bout to be the most polished thing ever first things first, delete whatever i made b4 start w blank slate okay, time to design a logo will use Figma o, r, p, h all layered on top of each other v2 of logo need to add 32 component to it bruh ts is so hard idk ill start afresh ok im back at 3:45 pm time to get back to work on this ok that looks better ok who let me cook something needs to be in the middle also got tons of positive feedback which is nice to hear who let me cook something forming? i feel like this is enough
Ships:
an esp32 devboard to be sold at hack club shops; Orpheus Pico, but with an ESP32 chip...
|
1793378966.7281199
|
1794242966.7281199
|
|
57215
|
orphOS by @cyclic | Stardance
|
cyclic
|
0
|
1.66
|
0
|
[]
|
[{"post_id": 60219, "ts": "202 [{"post_id": 60219, "ts": "2026-09-02T13:33:15Z", "hours": 1.6561, "text": "I started making my own custom Operating System in rust using https://os.phil-opp.com/ as my guide as well as https://wiki.osdev.org/ Right now I have the bare bones to an OS that can just print to the VGA buffer"}]...
|
Title: orphOS by @cyclic | Stardance
Devlogs:
I s Title: orphOS by @cyclic | Stardance
Devlogs:
I started making my own custom Operating System in rust using https://os.phil-opp.com/ as my guide as well as https://wiki.osdev.org/ Right now I have the bare bones to an OS that can just print to the VGA buffer...
|
1793422529.7319727
|
1794027329.7319727
|
|
3297
|
orpheus-buddy by @Leon | Stardance
|
Leon
|
0
|
14.27
|
0
|
[]
|
[{"post_id": 33106, "ts": "202 [{"post_id": 33106, "ts": "2026-07-22T18:40:07Z", "hours": 3.7742, "text": "well after getting only slack notification…i asked myself…why not show also system notifications (only windows bc I dont even know if orpheus works on other os) yeaaa tried like 2 diffrent approches….settled on using the windows lib creating a nother tauri command…anddd its sad this complete thing took me almost 4h just to see orpheus holding a letter…like not even stacking letters…just holding them… and the scnd image is just the complete (hopefully final code for getting the image (got a little help by my friend deepseek for it in the end…i hate windows))"}, {"post_id": 2446, "ts": "2026-06-04T22:52:14Z", "hours": 4.8428, "text": "ouch….sooooooooooooooo Tried like 3 different approaches to make the notification onclick work on windows…first the web notification api with onclick handler, then tauri’s notification plugin with registerActionTypes, then even tried using the windows crate directly with WinRT ToastNotification.Activated events…none of it worked, turns out windows just doesnt fire any in-process event when you click a toast unless your app is properly registered in the start menu with a COM AUMID which is a whole thing ended up going with a system tray icon instead which is honestly the better solution anyway…left click opens the config modal, right click gives a menu with Open Config and Quit…no buttons or text on screen, orpheus just sits there being cute which is exactly what i wanted also cleaned up a bunch of dead code from all the failed attempts, removed the old permission flow, the test notification button, startup notification spam…its much cleaner now next up…idk man…smth fun, like ui, or homepage…no more backand for now (and sorry for calling orpheus he/him a few times, always forgetting it haha)"}, {"post_id": 1486, "ts": "2026-06-03T15:16:31Z", "hours": 1.8033, "text": "Got notifications tunning…sadly cannot manage to make the onclick work yet, trying several things for that…web api…tauri notification plugin…and one more npm package i forgot, and nothings seems to work rn…this is my biggest todo rn bc i dont want the actual orpheus himself have any text…or buttons or anything on the screen…thats why i have choosen to make the config over notification that should open a modal"}, {"post_id": 1369, "ts": "2026-06-03T11:14:08Z", "hours": 1.7461, "text": "soo, cleaned up the filesystem…aka dont have just one file anymore, but some more readable order….and tried making a slack notification helper…like when you get mentioned, a new message pops up in a thread you are in, you get a dm or smth…orpheus will show you, that part is not completely tested…soo could be that it does not work…dont know tho"}, {"post_id": 579, "ts": "2026-06-02T02:23:29Z", "hours": 1.1211, "text": "sooo, quick one, addded slack auth again…for getting notifications….so orpheus knows that…but need to add some helpers and stuff now, meaning will be a small hustle to add that completely, also made a plan for the visualistaion….thank you, gooddd nighttt"}, {"post_id": 537, "ts": "2026-06-02T00:31:39Z", "hours": 0.9831, "text": "Reviving my old project (and changing from slack auth, to hackclub auth…"}]...
|
Title: orpheus-buddy by @Leon | Stardance
Devlogs Title: orpheus-buddy by @Leon | Stardance
Devlogs:
Reviving my old project (and changing from slack auth, to hackclub auth…
sooo, quick one, addded slack auth again…for getting notifications….so orpheus knows that…but need to add some helpers and stuff now, meaning will be a small hustle to add that completely, also made a plan for the visualistaion….thank you, gooddd nighttt
soo, cleaned up the filesystem…aka dont have just one file anymore, but some more readable order….and tried making a slack notification helper…like when you get mentioned, a new message pops up in a thread you are in, you get a dm or smth…orpheus will show you, that part is not completely tested…soo could be that it does not work…dont know tho
Got notifications tunning…sadly cannot manage to make the onclick work yet, trying several things for that…web api…tauri notification plugin…and one more npm package i forgot, and nothings seems to work rn…this is my biggest todo rn bc i dont want the actual orpheus himself have any text…or buttons or anything on the screen…thats why i have choosen to make the config over notification that should open a modal
ouch….sooooooooooooooo Tried like 3 different approaches to make the notification onclick work on windows…first the web notification api with onclick handler, then tauri’s notification plugin with registerActionTypes, then even tried using the windows crate directly with WinRT ToastNotification.Activated events…none of it worked, turns out windows just doesnt fire any in-process event when you click a toast unless your app is properly registered in the start menu with a COM AUMID which is a whole thing ended up going with a system tray icon instead which is honestly the better solution anyway…left click opens the config modal, right click gives a menu with Open Config and Quit…no buttons or text on screen, orpheus just sits there being cute which is exactly what i wanted also cleaned up a bunch of dead code from all the failed attempts, removed the old permission flow, the test notification button, startup notification spam…its much cleaner now next up…idk man…smth fun, like ui, or homepage…no more backand for now (and sorry for calling orpheus he/him a few times, always forgetting it haha)
well after getting only slack notification…i asked myself…why not show also system notifications (only windows bc I dont even know if orpheus works on other os) yeaaa tried like 2 diffrent approches….settled on using the windows lib creating a nother tauri command…anddd its sad this complete thing took me almost 4h just to see orpheus holding a letter…like not even stacking letters…just holding them… and the scnd image is just the complete (hopefully final code for getting the image (got a little help by my friend deepseek for it in the end…i hate windows))...
|
1793317700.8411276
|
1793922500.8411276
|
|
460
|
orphpost by @Enderman | Stardance
|
Enderman
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: orphpost by @Enderman | Stardance
|
1793029777.582214
|
1793634577.582214
|
|
21096
|
os by @Amadeus | Stardance
|
Amadeus
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: os by @Amadeus | Stardance
|
1793198869.055959
|
1793803669.055959
|
|
5244
|
os by @S4x0o | Stardance
|
S4x0o
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: os by @S4x0o | Stardance
|
1793242521.441959
|
1793847321.441959
|
|
66259
|
os by @fraunzen07 | Stardance
|
fraunzen07
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-28T08:38:36Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a simple OS running completely locally on your browser. I am currently working on other function, this is just a demo. It would be really helpful if you tell me what you think about it!", "repo": "https://github.com/neverwinter6/bobOS", "demo": "https://bob-os-lac.vercel.app/"}]...
|
[{"post_id": 74792, "ts": "202 [{"post_id": 74792, "ts": "2026-09-28T08:17:13Z", "hours": 0.2667, "text": "Demo is finished!"}, {"post_id": 74469, "ts": "2026-09-27T13:29:07Z", "hours": 1.9147, "text": "Currently working on the OS layout"}]...
|
Title: os by @fraunzen07 | Stardance
Devlogs:
Cur Title: os by @fraunzen07 | Stardance
Devlogs:
Currently working on the OS layout
Demo is finished!
Ships:
This is a simple OS running completely locally on your browser. I am currently working on other function, this is just a demo. It would be really helpful if you tell me what you think about it!...
|
1793422595.2028363
|
1793508995.2028363
|
|
72342
|
os by @jackson_penn567 | Stardance
|
jackson_penn567
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: os by @jackson_penn567 | Stardance
|
1793447246.5664065
|
1794052046.5664065
|
|
21194
|
os by @karex | Stardance
|
karex
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: os by @karex | Stardance
|
1792795804.4418118
|
1793400604.4418118
|
|
43461
|
os by @neb | Stardance
|
neb
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: os by @neb | Stardance
|
1793224424.264909
|
1793829224.264909
|
|
49383
|
os compiller by @Ggiver | Stardance
|
Ggiver
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T15:41:18Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is my first try at making a fully fledged compiler. My twist on the project is that instead of compiling the source code into an executable, it turns it into a whole operating system (bootloader actually)! I was unfortunately not able to manage the memory nor make loops (that’s because you have to manage memory for that), the instruction set is very limited (you can basically just print, restart the computer, and get keyboard input). Even if the projects does poorly, i will still retain that as a valuable lesson on knowing how computers work. Thank you for trying out my project!", "repo": "https://github.com/supr10/os_compiler", "demo": "https://github.com/supr10/os_compiler/releases/tag/release"}]...
|
[{"post_id": 62981, "ts": "202 [{"post_id": 62981, "ts": "2026-09-06T15:31:58Z", "hours": 1.2494, "text": "This is the final version. I’m very sad that this is, because it is still very buggy and i couldn’t implement what i originally wanted to add. You can still print characters, do infinite loops and get a character to print later (don’t forget that the program compiles your code into an operating system, hence the trouble with memory management) I cannot finish it because my school has a too harsh schedule to keep up. I hope to be able to re join and finish it in later editions… Goodbye world!"}, {"post_id": 52927, "ts": "2026-08-23T09:36:43Z", "hours": 1.6642, "text": "writing operating systems in pure hexadecimal, like the good ol’ days"}, {"post_id": 52238, "ts": "2026-08-22T10:28:35Z", "hours": 1.3447, "text": "I just made the first instruction, it prints a character on the BIOS."}, {"post_id": 48174, "ts": "2026-08-16T13:56:26Z", "hours": 0.5256, "text": "I’m building the initial UI (yes, before the actual compiler part)"}]...
|
Title: os compiller by @Ggiver | Stardance
Devlog Title: os compiller by @Ggiver | Stardance
Devlogs:
I’m building the initial UI (yes, before the actual compiler part)
I just made the first instruction, it prints a character on the BIOS.
writing operating systems in pure hexadecimal, like the good ol’ days
This is the final version. I’m very sad that this is, because it is still very buggy and i couldn’t implement what i originally wanted to add. You can still print characters, do infinite loops and get a character to print later (don’t forget that the program compiles your code into an operating system, hence the trouble with memory management) I cannot finish it because my school has a too harsh schedule to keep up. I hope to be able to re join and finish it in later editions… Goodbye world!
Ships:
This is my first try at making a fully fledged compiler. My twist on the project is that instead of compiling the source code into an executable, it turns it into a whole operating system (bootloader actually)! I was unfortunately not able to manage the memory nor make loops (that’s because you have to manage memory for that), the instruction set is very limited (you can basically just print, restart the computer, and get keyboard input). Even if the projects does poorly, i will still retain that as a valuable lesson on knowing how computers work. Thank you for trying out my project!...
|
1793274678.7149763
|
1793361078.7149763
|
|
60158
|
os wep by @masterjordan | Stardance
|
masterjordan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: os wep by @masterjordan | Stardance
|
1793033291.9750485
|
1793638091.9750485
|
|
61063
|
os work(I am not creative) by @Richtor | Stardance
|
Richtor
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: os work(I am not creative) by @Richtor | St Title: os work(I am not creative) by @Richtor | Stardance...
|
1793037192.0710454
|
1793641992.0710454
|
|
46554
|
osrs-slack by @jworden | Stardance
|
jworden
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: osrs-slack by @jworden | Stardance
|
1792932625.5869036
|
1793796625.5869036
|
|
19553
|
ostenbloom by @wickk | Stardance
|
wickk
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: ostenbloom by @wickk | Stardance
|
1793256959.819815
|
1793861759.819815
|
|
65570
|
osu!mania 4K Hackpad ! by @abieprxalt | Stardance
|
abieprxalt
|
0
|
3.2
|
0
|
[]
|
[{"post_id": 74781, "ts": "202 [{"post_id": 74781, "ts": "2026-09-28T07:15:19Z", "hours": 3.2031, "text": "What you’re seeing: This is my hackpad, and designed to be used for osu!mania, hence the presence of only 4 keys. PCB COMPLETE ! After three hours, I managed to fully complete the PCB of the hackpad, and is ready for production. As always, you can view the CAD & production files in the github repo Or view the Stardance project"}]...
|
Title: osu!mania 4K Hackpad ! by @abieprxalt | Sta Title: osu!mania 4K Hackpad ! by @abieprxalt | Stardance
Devlogs:
What you’re seeing: This is my hackpad, and designed to be used for osu!mania, hence the presence of only 4 keys. PCB COMPLETE ! After three hours, I managed to fully complete the PCB of the hackpad, and is ready for production. As always, you can view the CAD & production files in the github repo Or view the Stardance project...
|
1793087731.099095
|
1793692531.099095
|
|
70420
|
osu-monster by @alexd229 | Stardance
|
alexd229
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: osu-monster by @alexd229 | Stardance
|
1793008428.966918
|
1793872428.966918
|
|
25437
|
os™ by @e | Stardance
|
e
|
0
|
0.27
|
0
|
[]
|
[{"post_id": 15303, "ts": "202 [{"post_id": 15303, "ts": "2026-06-24T21:05:18Z", "hours": 0.2747, "text": "stuff has begun taking shape i guess it looks existing now"}]...
|
Title: os™ by @e | Stardance
Devlogs:
stuff has b Title: os™ by @e | Stardance
Devlogs:
stuff has begun taking shape i guess it looks existing now...
|
1793292731.4679832
|
1793897531.4679832
|
|
14757
|
ov0OS by @Ikira | Stardance
|
Ikira
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-25T17:57:39Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A website or a small introduction. Similar to a website I make before but it was all HTML. Besides the guide, I added spotify playlist embled in the window, extending, buttons at the bottom (not sure if that’s in the guide or not). I’m proud of it, making things work after they wouldn’t work is like solving a puzzle! This is so entertaining, thank you for the opportunity.", "repo": "https://github.com/Nananoovo/Webos", "demo": "https://nananoovo.github.io/Webos/"}]...
|
[{"post_id": 15791, "ts": "202 [{"post_id": 15791, "ts": "2026-06-25T17:48:27Z", "hours": 0.3125, "text": "SHIP! Image from before is too blurry, changed some font and more! That will be it"}, {"post_id": 15269, "ts": "2026-06-24T20:02:05Z", "hours": 0.8569, "text": "Finishing up"}, {"post_id": 10491, "ts": "2026-06-17T07:24:39Z", "hours": 0.4525, "text": "FINAL UPDATE ON THE WINDOWS LOGIC Basically now I finalized how to open and close window (buttons at the bottom) and it’ll be way easier now for me do make a window that is draggable, open and closable, but not adjusting the size.. But I don’t want to use classic red, yellow green dots and etc so I”M FINDING cute faces as the dragging functions and make my buttons more like a “app” so people will know when they see it. Let me copy Apple (jk) And that’s about it for the logics, next update will prob be content (windows) and aesthetics (the emoji faces and diff picture other than the cute cat) ! Next project I’ll be more clear on what I want…Currently I’m thinking about…recipe book!"}, {"post_id": 9704, "ts": "2026-06-16T03:46:09Z", "hours": 2.5389, "text": "QiwenOs! Okay perfecto I have some basic functions…Now I just gotta edit the entire thing to match “UI” and make more webs! Since it’s about me..I’ll add a Spotify player, pictures of me in a gallery, more and etc, and make it prettier…but thats for tmr!"}, {"post_id": 9104, "ts": "2026-06-15T06:58:11Z", "hours": 0.9608, "text": "Progress Another around 50 min… SO basically I ctrl c ctrl v the dragging script and got it to work but then it crashes with the open and close window function….boi ANYWAYS at the same time I updated some color, background, and I figured that I’d use those emoji faces from pinterest as the ‘button’ to drag my screen! but i have no clue why the dragging is not working in the actual web cuz I copied everything exactly the same from codepen (stimulator) and somehow it doesn’t work dont do this to me…"}, {"post_id": 8572, "ts": "2026-06-14T07:50:41Z", "hours": 0.7428, "text": "MY WEB So basically i tried to link a background image but kinda failed…give me a few days been busy working so only spent 15 min ish per day for 3 days here is how it look so far… maybe I’ll add a few more windows and a diff function (pending)! thank you…"}]...
|
Title: ov0OS by @Ikira | Stardance
Devlogs:
MY WE Title: ov0OS by @Ikira | Stardance
Devlogs:
MY WEB So basically i tried to link a background image but kinda failed…give me a few days been busy working so only spent 15 min ish per day for 3 days here is how it look so far… maybe I’ll add a few more windows and a diff function (pending)! thank you…
Progress Another around 50 min… SO basically I ctrl c ctrl v the dragging script and got it to work but then it crashes with the open and close window function….boi ANYWAYS at the same time I updated some color, background, and I figured that I’d use those emoji faces from pinterest as the ‘button’ to drag my screen! but i have no clue why the dragging is not working in the actual web cuz I copied everything exactly the same from codepen (stimulator) and somehow it doesn’t work dont do this to me…
QiwenOs! Okay perfecto I have some basic functions…Now I just gotta edit the entire thing to match “UI” and make more webs! Since it’s about me..I’ll add a Spotify player, pictures of me in a gallery, more and etc, and make it prettier…but thats for tmr!
FINAL UPDATE ON THE WINDOWS LOGIC Basically now I finalized how to open and close window (buttons at the bottom) and it’ll be way easier now for me do make a window that is draggable, open and closable, but not adjusting the size.. But I don’t want to use classic red, yellow green dots and etc so I”M FINDING cute faces as the dragging functions and make my buttons more like a “app” so people will know when they see it. Let me copy Apple (jk) And that’s about it for the logics, next update will prob be content (windows) and aesthetics (the emoji faces and diff picture other than the cute cat) ! Next project I’ll be more clear on what I want…Currently I’m thinking about…recipe book!
Finishing up
SHIP! Image from before is too blurry, changed some font and more! That will be it
Ships:
A website or a small introduction. Similar to a website I make before but it was all HTML. Besides the guide, I added spotify playlist embled in the window, extending, buttons at the bottom (not sure if that’s in the guide or not). I’m proud of it, making things work after they wouldn’t work is like solving a puzzle! This is so entertaining, thank you for the opportunity....
|
1793451382.5510345
|
1793537782.5510345
|
|
24372
|
over-rated by @Huseyin | Stardance
|
Huseyin
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: over-rated by @Huseyin | Stardance
|
1792939686.757661
|
1793803686.757661
|