|
45212
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943490.3483865
|
1793807490.3483865
|
|
13838
|
Fro by @AD | Stardance
|
AD
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Fro by @AD | Stardance
|
1792943489.5308094
|
1793807489.5308094
|
|
23649
|
My awesome macropad! by @Suby | Stardance
|
Suby
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Suby | Stardance
|
1793202689.469068
|
1793807489.469068
|
|
45202
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943488.705221
|
1793807488.705221
|
|
45083
|
Breakitt by @akshara | Stardance
|
akshara
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-24T16:15:40Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a dumb site where you just smash plates, cups, etc. I made it with the idea of a stress-relief website in mind. I built it as an experiment to learn about Matter.js — it’s not up to the mark, but I learned a lot while building it. The hardest part was definitely creating the shard shapes, and also lining up the objects to the shelf. The thing I’m most proud of is the sound — it’s completely generated live with the Web Audio API and sounds pretty realistic. To test it, just swipe or drag through any item.", "repo": "https://github.com/akshara200829-lgtm/Breakitt", "demo": "https://akshara200829-lgtm.github.io/Breakitt/"}]...
|
[{"post_id": 53876, "ts": "202 [{"post_id": 53876, "ts": "2026-08-24T16:08:15Z", "hours": 0.4339, "text": "Finally completed building Breakitt!!I made it to learn Matter.js and mess around with physics — it was so much fun to build. It’s not up to the mark, but I learned a lot doing it"}, {"post_id": 43430, "ts": "2026-08-08T17:47:36Z", "hours": 2.7619, "text": "Started building a plate-breaking simulation. This is my first time trying Matter.js, so I’ve been experimenting with physics, collisions, and procedural shattering. Till now , I’ve set up the physics using Matter.js, added a plate that stays in place until it’s hit, responsive canvas resizing, a simple sound using the Web Audio API, and a procedural shatter system that breaks the plate into random shards with physics. I’ve also added screen shake and drag-based interactions to make the impact feel more satisfying. I plan on improving the plate shading and shatter visuals to make the breaking look more realistic, along with adding a few more features. Would love some suggestions or tips!!"}]...
|
Title: Breakitt by @akshara | Stardance
Devlogs:
Title: Breakitt by @akshara | Stardance
Devlogs:
Started building a plate-breaking simulation. This is my first time trying Matter.js, so I’ve been experimenting with physics, collisions, and procedural shattering. Till now , I’ve set up the physics using Matter.js, added a plate that stays in place until it’s hit, responsive canvas resizing, a simple sound using the Web Audio API, and a procedural shatter system that breaks the plate into random shards with physics. I’ve also added screen shake and drag-based interactions to make the impact feel more satisfying. I plan on improving the plate shading and shatter visuals to make the breaking look more realistic, along with adding a few more features. Would love some suggestions or tips!!
Finally completed building Breakitt!!I made it to learn Matter.js and mess around with physics — it was so much fun to build. It’s not up to the mark, but I learned a lot doing it
Ships:
I made a dumb site where you just smash plates, cups, etc. I made it with the idea of a stress-relief website in mind. I built it as an experiment to learn about Matter.js — it’s not up to the mark, but I learned a lot while building it. The hardest part was definitely creating the shard shapes, and also lining up the objects to the shelf. The thing I’m most proud of is the sound — it’s completely generated live with the Web Audio API and sounds pretty realistic. To test it, just swipe or drag through any item....
|
1793721088.5369022
|
1793807488.5369022
|
|
45201
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943487.8758128
|
1793807487.8758128
|
|
52918
|
ONEGLASS UNIVERSE by @Devadutt | Stardance
|
Devadutt
|
1
|
2.74
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T18:16:29Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a website that shows my stardance journey so far. The challenging part was to build the courage after my first project was flagged due to overuse of AI. Now I am proud of the fact that this one is entirely written by me. I hope you like it. I know it looks ugly but this my first time using visual studio", "repo": "https://github.com/Devadutt-11/ONEGLASS-UNIVERSE", "demo": "https://devadutt-11.github.io/ONEGLASS-UNIVERSE/"}]...
|
[{"post_id": 52824, "ts": "202 [{"post_id": 52824, "ts": "2026-08-23T05:36:49Z", "hours": 0.7417, "text": "Added about me as per the feedback"}, {"post_id": 52518, "ts": "2026-08-22T17:43:16Z", "hours": 1.6903, "text": "created my first website. I know it looks ugly but it is my first time building one!."}]...
|
Title: ONEGLASS UNIVERSE by @Devadutt | Stardance
Title: ONEGLASS UNIVERSE by @Devadutt | Stardance
Devlogs:
created my first website. I know it looks ugly but it is my first time building one!.
Added about me as per the feedback
Ships:
I made a website that shows my stardance journey so far. The challenging part was to build the courage after my first project was flagged due to overuse of AI. Now I am proud of the fact that this one is entirely written by me. I hope you like it. I know it looks ugly but this my first time using visual studio...
|
1793721087.3210495
|
1793807487.3210495
|
|
45200
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943487.058538
|
1793807487.058538
|
|
23797
|
Kronos by @harry_ | Stardance
|
harry_
|
0
|
8.29
|
0
|
[]
|
[{"post_id": 61768, "ts": "202 [{"post_id": 61768, "ts": "2026-09-04T20:43:02Z", "hours": 3.4586, "text": "Devlog 2 - 9/4/2026 took another long break but did occasionally work on Kronos here and there, today was a big working session, i fixed up some storage issues, implemented sql database, made the delete and finish task buttons work, added 2 pages, one being the landing page which is the one with ‘THIS IS A TEST PAGE’ and the other page being the one with Task and Submit and the task list itself. hopefully i dont take any more super long breaks even with school being started but i will continue to work on or atleast churn out 1 devlog a week."}, {"post_id": 47474, "ts": "2026-08-15T12:19:42Z", "hours": 4.8314, "text": "Devlog 1 - 8/15/2026 its been quite a bit of time since ive posted anything but ive been working and ive decided to start another project, Kronos, its a ‘reminder app’ but better, thats all i will say for now. currently, i only have the barebones of the app as im still learning web development and python (as the image below shows), more will be said and done in the coming weeks. thats all i got for now!"}]...
|
Title: Kronos by @harry_ | Stardance
Devlogs:
Dev Title: Kronos by @harry_ | Stardance
Devlogs:
Devlog 1 - 8/15/2026 its been quite a bit of time since ive posted anything but ive been working and ive decided to start another project, Kronos, its a ‘reminder app’ but better, thats all i will say for now. currently, i only have the barebones of the app as im still learning web development and python (as the image below shows), more will be said and done in the coming weeks. thats all i got for now!
Devlog 2 - 9/4/2026 took another long break but did occasionally work on Kronos here and there, today was a big working session, i fixed up some storage issues, implemented sql database, made the delete and finish task buttons work, added 2 pages, one being the landing page which is the one with ‘THIS IS A TEST PAGE’ and the other page being the one with Task and Submit and the task list itself. hopefully i dont take any more super long breaks even with school being started but i will continue to work on or atleast churn out 1 devlog a week....
|
1793202686.5557792
|
1793807486.5557792
|
|
36503
|
Dualboot my old crappy laptop by @mateiang169 | St Dualboot my old crappy laptop by @mateiang169 | Stardance...
|
mateiang169
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Dualboot my old crappy laptop by @mateiang1 Title: Dualboot my old crappy laptop by @mateiang169 | Stardance...
|
1792943486.2293222
|
1793807486.2293222
|
|
11441
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943485.432914
|
1793807485.432914
|
|
21501
|
Nicholas' OS by @nicholas1023 | Stardance
|
nicholas1023
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T03:52:32Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a web-based OS that includes a panel with a clock and power off button, a file viewer, a terminal version of my personal website, and a web app installer that allows you to install websites that are not web app as well. The most challenging part was the web app installer as I needed to develop the logic to integrate the website as an app and allow them to have a top bar as well. I was quite surprised with the result, as it was able to make a website look like a native app (In fact, the terminal is a web app!) and the power off button made it really look like a real low level OS running on a computer. One thing to note is that the installer is not able to launch sites that disallow 3rd party embedding.", "repo": "https://github.com/Nicholas1023/Nicholas-OS", "demo": "https://nicholas1023.github.io/Nicholas-OS/"}]...
|
[{"post_id": 14133, "ts": "202 [{"post_id": 14133, "ts": "2026-06-23T03:35:05Z", "hours": 2.4094, "text": "New app installer for my OS! In this devlog, I have created an app installer that installs a website as an app, much like how a web app works. However, this function only works for URLs that allow embedding. I have also solved a bug where apps dragged past the viewport creates a scrollable viewport by adding this: overflow-y : hidden ; overflow-x : hidden ; I’ll be shipping it soon! Try my OS out at https://nicholas1023.github.io/Nicholas-OS/ ! Here’s a demo video of the installer installing hackclub.com as an app!"}, {"post_id": 13649, "ts": "2026-06-22T12:24:39Z", "hours": 2.3744, "text": "Added new apps to my OS! I’ve added a file viewer and terminal app to my operating system! What’s new? Window dragging finally works! Windows are able to move to the front! Problems I’ve faced I had issues making a window come to the front when clicked or move. Initially, I was using .style.zIndex++ , but it did not seem to work when a window was clicked multiple times. To solve this, I changed all the z-index of all windows when one is clicked, to ensure all of the values sync. The buttons on the top bar are currently text-based, so I’ll be creating icons for them, and to declutter the buttons top bar on apps."}, {"post_id": 13528, "ts": "2026-06-22T04:24:03Z", "hours": 2.0283, "text": "Finished the windowing system and a bottom panel! What’s new Loading screen Windows with maximise, minimise and close buttons Bottom panel with time and power off button What I’ll be working on next Next, I will be making the windows draggable, and creating icons for the apps. I’ll also be improving the loading screen, which currently only consists of the following code. <div id= \"boot\" > <div style= \"text-align: center;\" > <h1> Nicholas' Operating System </h1> <p id= \"loading\" > Loading... </p> </div> </div> Problems I faced When creating the window functions, which manages maximise, minimise and close buttons, it did not seem to work. I realised later that the function name was actually overwriting a built-in function as it was initially named close() ! In the end I renamed it to closeW() , where W stands for window. I also faced issues with the height of the <main> . Initially, the height of main was set to 100% , which failed to work. After some searches online, I tried replacing 100% with 100dvh , which worked perfectly!"}]...
|
Title: Nicholas' OS by @nicholas1023 | Stardan Title: Nicholas' OS by @nicholas1023 | Stardance
Devlogs:
Finished the windowing system and a bottom panel! What’s new Loading screen Windows with maximise, minimise and close buttons Bottom panel with time and power off button What I’ll be working on next Next, I will be making the windows draggable, and creating icons for the apps. I’ll also be improving the loading screen, which currently only consists of the following code. <div id= "boot" > <div style= "text-align: center;" > <h1> Nicholas' Operating System </h1> <p id= "loading" > Loading... </p> </div> </div> Problems I faced When creating the window functions, which manages maximise, minimise and close buttons, it did not seem to work. I realised later that the function name was actually overwriting a built-in function as it was initially named close() ! In the end I renamed it to closeW() , where W stands for window. I also faced issues with the height of the <main> . Initially, the height of main was set to 100% , which failed to work. After some searches online, I tried replacing 100% with 100dvh , which worked perfectly!
Added new apps to my OS! I’ve added a file viewer and terminal app to my operating system! What’s new? Window dragging finally works! Windows are able to move to the front! Problems I’ve faced I had issues making a window come to the front when clicked or move. Initially, I was using .style.zIndex++ , but it did not seem to work when a window was clicked multiple times. To solve this, I changed all the z-index of all windows when one is clicked, to ensure all of the values sync. The buttons on the top bar are currently text-based, so I’ll be creating icons for them, and to declutter the buttons top bar on apps.
New app installer for my OS! In this devlog, I have created an app installer that installs a website as an app, much like how a web app works. However, this function only works for URLs that allow embedding. I have also solved a bug where apps dragged past the viewport creates a scrollable viewport by adding this: overflow-y : hidden ; overflow-x : hidden ; I’ll be shipping it soon! Try my OS out at https://nicholas1023.github.io/Nicholas-OS/ ! Here’s a demo video of the installer installing hackclub.com as an app!
Ships:
I made a web-based OS that includes a panel with a clock and power off button, a file viewer, a terminal version of my personal website, and a web app installer that allows you to install websites that are not web app as well. The most challenging part was the web app installer as I needed to develop the logic to integrate the website as an app and allow them to have a top bar as well. I was quite surprised with the result, as it was able to make a website look like a native app (In fact, the terminal is a web app!) and the power off button made it really look like a real low level OS running on a computer. One thing to note is that the installer is not able to launch sites that disallow 3rd party embedding....
|
1793721085.2968743
|
1793807485.2968743
|
|
32051
|
My very own WebOS by @Yashveer | Stardance
|
Yashveer
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @Yashveer | Stardance
|
1793202685.2568505
|
1793807485.2568505
|
|
52196
|
Ai desk buddy(esp32 version) by @Sid | Stardance
|
Sid
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Ai desk buddy(esp32 version) by @Sid | Star Title: Ai desk buddy(esp32 version) by @Sid | Stardance...
|
1792943484.6170201
|
1793807484.6170201
|
|
12925
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943483.7939253
|
1793807483.7939253
|
|
28085
|
Frictionless by @sebastian_steinmaurer | Stardance
|
sebastian_steinmaurer
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @sebastian_steinmaurer | St Title: Frictionless by @sebastian_steinmaurer | Stardance...
|
1793202683.3022554
|
1793807483.3022554
|
|
11294
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943482.976749
|
1793807482.976749
|
|
24938
|
My first slack bot! by @AwesomeFreshDay | Stardanc My first slack bot! by @AwesomeFreshDay | Stardance...
|
AwesomeFreshDay
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T21:51:57Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Simple Slack bot running on Nest server 24/7 with 6 different commands Name Description /adam-ping Pings the bot /adam-help Provides help /adam-catfact Provides cat fact /adam-joke Provides a joke /adam-color Porivde’s Adam’s favorite color /adam-sport Provides Adam’s favorite sport", "repo": "https://github.com/AdamT2529/Build-a-Slack-Bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354?skip_today=1"}]...
|
[{"post_id": 21094, "ts": "202 [{"post_id": 21094, "ts": "2026-07-02T21:48:53Z", "hours": 0.8267, "text": "Finished creating the slack bot with different commands"}]...
|
Title: My first slack bot! by @AwesomeFreshDay | S Title: My first slack bot! by @AwesomeFreshDay | Stardance
Devlogs:
Finished creating the slack bot with different commands
Ships:
Simple Slack bot running on Nest server 24/7 with 6 different commands Name Description /adam-ping Pings the bot /adam-help Provides help /adam-catfact Provides cat fact /adam-joke Provides a joke /adam-color Porivde’s Adam’s favorite color /adam-sport Provides Adam’s favorite sport...
|
1793721082.46794
|
1793807482.46794
|
|
36353
|
Untitled by @Loibo_2 | Stardance
|
Loibo_2
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Loibo_2 | Stardance
|
1792943482.1573555
|
1793807482.1573555
|
|
25486
|
jigsaw puzzle styled multi purpose board by @boipo jigsaw puzzle styled multi purpose board by @boipogi | Stardance...
|
boipogi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: jigsaw puzzle styled multi purpose board by Title: jigsaw puzzle styled multi purpose board by @boipogi | Stardance...
|
1793202681.4770195
|
1793807481.4770195
|
|
52184
|
PITTWALL by @adityajain1225 | Stardance
|
adityajain1225
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: PITTWALL by @adityajain1225 | Stardance
|
1792943481.327957
|
1793807481.327957
|
|
28284
|
zenly by @andrewh | Stardance
|
andrewh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: zenly by @andrewh | Stardance
|
1793202680.6095748
|
1793807480.6095748
|
|
10977
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943480.5161328
|
1793807480.5161328
|
|
42090
|
My own new tab by @Pery | Stardance
|
Pery
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-21T22:05:08Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Project is finally done! more updates coming soon!", "repo": "https://github.com/davidperyro-stack/newtab", "demo": "https://davidperyro-stack.github.io/newtab/"}]...
|
[{"post_id": 51940, "ts": "202 [{"post_id": 51940, "ts": "2026-08-21T21:46:55Z", "hours": 1.0675, "text": "devlog 5# Updated the project with a few bigger additions. Added NASA’s Astronomy Picture of the Day API that fetches a real space photo (or video) every day and caches it so it only pulls fresh data once daily instead of every load. Had a bug where nothing showed up at all, turned out to be a day where NASA’s photo was actually a video, so added handling for that. Also reworked the layout of the quote card and APOD card they used to be stacked on top of each other, now they sit side-by-side as a matched pair below the search bar, which reads a lot more intentional than one long column. Also added a focus mode (top-right corner) that hides everything except the clock, greeting, and search bar for when you just want a clean minimal tab."}, {"post_id": 51298, "ts": "2026-08-20T21:10:10Z", "hours": 1.07, "text": "devlog 3# Updated the project with a bunch of new stuff. Added a quote card that pulls a random quote from an API each time you open a new tab, with a “New thought” button for another one on demand. Built a bookmarks row too (with the help of AI), turned it into a floating dock at the bottom of the screen instead of just another block on the page feels way more like a real product now. Then added weather using OpenMeteo (grabs your location through the browser) showing temp and conditions under the greeting, plus a / shortcut (and Ctrl+K) that jumps straight into the search bar from anywhere on the page."}, {"post_id": 49129, "ts": "2026-08-17T19:21:33Z", "hours": 0.8922, "text": "devlog 2# Day 2 of working on a custom new tab. Ive added a search bar that uses google (like you type anything inside it, press enter and it goes straight to google with what youre trying to find."}, {"post_id": 48491, "ts": "2026-08-16T21:13:22Z", "hours": 0.6119, "text": "Devlog #1 Today ive started building my own custom new tab, aka doing the “give your website a pulse” mission. I began with a completely blank project and built the foundation using HTML, CSS, and JavaScript. The first goal wasnt to make everything at once, but to get the personality of the page right before adding more features. The first major feature is now working: a live digital clock that updates automatically. I also added a time-based greeting. I also started shaping the visual identity. I decided to build the interface around #6A498E, using a dark purple background, softer lavender highlights, and a subtle purple glow behind the main content. (thanks chatGPT for finding this beautiful pallate by using my favorite color)"}]...
|
Title: My own new tab by @Pery | Stardance
Devlog Title: My own new tab by @Pery | Stardance
Devlogs:
Devlog #1 Today ive started building my own custom new tab, aka doing the “give your website a pulse” mission. I began with a completely blank project and built the foundation using HTML, CSS, and JavaScript. The first goal wasnt to make everything at once, but to get the personality of the page right before adding more features. The first major feature is now working: a live digital clock that updates automatically. I also added a time-based greeting. I also started shaping the visual identity. I decided to build the interface around #6A498E, using a dark purple background, softer lavender highlights, and a subtle purple glow behind the main content. (thanks chatGPT for finding this beautiful pallate by using my favorite color)
devlog 2# Day 2 of working on a custom new tab. Ive added a search bar that uses google (like you type anything inside it, press enter and it goes straight to google with what youre trying to find.
devlog 3# Updated the project with a bunch of new stuff. Added a quote card that pulls a random quote from an API each time you open a new tab, with a “New thought” button for another one on demand. Built a bookmarks row too (with the help of AI), turned it into a floating dock at the bottom of the screen instead of just another block on the page feels way more like a real product now. Then added weather using OpenMeteo (grabs your location through the browser) showing temp and conditions under the greeting, plus a / shortcut (and Ctrl+K) that jumps straight into the search bar from anywhere on the page.
devlog 5# Updated the project with a few bigger additions. Added NASA’s Astronomy Picture of the Day API that fetches a real space photo (or video) every day and caches it so it only pulls fresh data once daily instead of every load. Had a bug where nothing showed up at all, turned out to be a day where NASA’s photo was actually a video, so added handling for that. Also reworked the layout of the quote card and APOD card they used to be stacked on top of each other, now they sit side-by-side as a matched pair below the search bar, which reads a lot more intentional than one long column. Also added a focus mode (top-right corner) that hides everything except the clock, greeting, and search bar for when you just want a clean minimal tab.
Ships:
Project is finally done! more updates coming soon!...
|
1793721080.054894
|
1793807480.054894
|
|
10613
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943479.6799335
|
1793807479.6799335
|
|
23437
|
My very own WebOS by @Mithunbalaa | Stardance
|
Mithunbalaa
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @Mithunbalaa | Stardan Title: My very own WebOS by @Mithunbalaa | Stardance...
|
1793202679.67228
|
1793807479.67228
|
|
12849
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943478.855651
|
1793807478.855651
|
|
33573
|
Kestrel EO/IR Pod by @benjaminliu | Stardance
|
benjaminliu
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Kestrel EO/IR Pod by @benjaminliu | Stardan Title: Kestrel EO/IR Pod by @benjaminliu | Stardance...
|
1792943478.0277288
|
1793807478.0277288
|
|
3479
|
Unofficial Google Docs Client by @nolanqsp | Stard Unofficial Google Docs Client by @nolanqsp | Stardance...
|
nolanqsp
|
1
|
81.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-31T20:55:29Z", "hours": 81.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "At Last It finally works. I have been working on this project for months now and I finally got it to a point where I think its good enough. The past few hours I have really just been dialed in on getting Linux support and other strange issues. Over the past few months there has been huge progress. From saving, and incoming changes working to installers. At the beginning of stardance, I was able to fetch the contents of a document with every path hardcoded and little rendering fanciness. Now saving, and realtime collaboration works across multiple devices, there are installers for different platforms, and cookies are dynamically fetched. Have fun Internet!", "repo": "https://github.com/doopyelephant/GoogleDocs", "demo": "https://github.com/doopyelephant/GoogleDocs/blob/master/Demoing.md"}]...
|
[{"post_id": 85879, "ts": "202 [{"post_id": 85879, "ts": "2026-10-31T20:52:27Z", "hours": 8.9053, "text": "Polish Polish Polish No flashy new features this devlog, mainly just making linux work properly and fixing mountains and mountains of bugs. My Github account got restored eventually though! It took a decent amount of back and forth, but I got it back without too much hassle , just took a while."}, {"post_id": 79028, "ts": "2026-10-12T12:39:09Z", "hours": 10.2656, "text": "GitHub, Why? Last weekend GitHub decided to suspend my account for no apparent reason(No it wasn’t a DMCA from Google). I got an email saying for me to “reverify my academic status” for the student developer pack at the same time I got suspended. I tried to do that but… you can’t reverify without being logged in, and you can’t login when you are suspended. So I contacted support and they asked “how [I] plan to use GitHub” and that “[my] account was flagged by [their] abuse-detection systems for manual review, as it may conflict with [their] Terms of Service”. I responded but haven’t gotten any response since then(that was a week ago). I ended up moving at least temporarily to GitLab. While I had a copy of the git repository on my development machine, unfortunately this doesn’t include GitHub releases. I created a new one on GitLab but there aren’t any before the newest one. Anyhow, lets get to the new features: Fix crashing when exiting causing lingering threads Add support for the space key & several special characters including Enter for newlines Add support for different font sizes Add support for downloading and applying font families at runtime (Huge thanks to Jonathan Neal for Google Fonts catalog) Improve install script by supporting powershell 5(the one included in windows) and fixing several errors Fix bug where installer’s progress bar wouldn’t update until completed Cache parsed Savekeys to prevent additional wasted compute Update installers to use GitLab Anyhow, those are the recent updates! Hopefully GitHub reviews my reinstatement request soon. :)"}, {"post_id": 72171, "ts": "2026-09-22T11:10:12Z", "hours": 9.4697, "text": "Lots more marginal improvements + New Rendering Engine + Pain Recently I have been adding: Support for more keys(symbols, numbers, numpad numbers & arrow keys) Paste (CTRL + V) support More verbose logging New Rendering Engine Can include additional data(underline color, etc) for the future Seems more stable(the old one was kind of jank) But to be honest, most of the time was spent trying to fix some unliveable bugs, when typing to quickly, stuff appears after the cursor. In addition when typing, bold text after the cursor seems to offset. I learned something that can help with the latter bug, but I wasn’t able to fix either."}, {"post_id": 66698, "ts": "2026-09-12T16:02:24Z", "hours": 7.985, "text": "Building Up to Release I’ve been working on numerous small issues that I have been putting off. One of these is that all documents over ~1.5 pages were getting cut off, it turns out the contents of the document is split into multiple chunks, each around ~1.5 pages long. It was a relatively simple problem, just needed to fix it. Also binding(incoming changes) now runs on a separate thread so that the UI doesn’t freeze when somebody else types. Saving also now runs on a separate thread, it auto saves every ~1 second, which caused another problem, outgoing changes got relayed back as incoming changes by Google’s servers, meaning everything you typed got duplicated. Again, simple fix, just needed doing. The main thing however is the caret/cursor behavior, which was/is doing some funky stuff, jumping around whenever you changed lines. I added a binary search to help with this, which helped but didnt completely fix it. So there is still some work there. I also added some savekeys to minimize the log output, because before…… there were almost a MB of logs from each run. The main things that stand before release are to finish the cursor behaviour, bolds & italics shifting, and add a home screen with your documents."}, {"post_id": 62838, "ts": "2026-09-06T11:25:02Z", "hours": 5.5689, "text": "HUGE Progress The past few hours I have worked on this project have been extremely productive. I found a header that genuine Google Docs sends, “X-Same-Domain”, which I believe just indicates whether the request is being sent to the same domain as the sender. It turns out that Google actively blocks requests from other domains, but luckily we can just send “X-Same-Domain” with a value of 1, pretending to be coming from the “docs.google.com” domain. After this realization the “/save” endpoint returned 200 (OK) . This was huge progress, this has been a major blocker for months . The one problem was that while the status code stated that the request was successful, the actual request payload contained an error “XSRF” and a string of numbers and letters, which I thought was probably some kind of authentication/coordination token. After a quick Google search, I realized that this was a token to prevent other websites in the same browser from sending requests impersonating Google Docs as the browser auto attaches authentication cookies. To my surprise, when I added “&token=XXXXXX” (with XXXXXX being the string of numbers and letters) to the request url, we get a different error! This one was very ambiguous though, it just was a JSON payload containing nothing but the number “400” , as in 400 (Bad Request) which I had become to dread. After searching around the codebase for a while I found a problem with the url encoding logic, Url encoding is the proccess of replacing invalid character with %XX (XX being the ASCII code for the invalid character), it turns out “&“s are valid characters……. but I was replacing them. Ampersands are also the seperator for parameters. I think the problem was that within the Google Docs server code, it seperates the parameters then decodes each one. With this problem fixed, saving worked!!!! There were a few tiny bugs I wont get into, but largely it worked. I implemented merging changes(sending “hello” rather than “h” + “e” + “l”+ “l”+ “o”). With saving working, I decided to start working on seeing whether these solutions also worked on “/bind” (real-time incoming changes), they didn’t immediately, but after a few tweaks trying to replicate the URL parameters that Google Docs uses, we had incoming changes! I had to do some fancy async enumerable shenanigans to get them to come in asynchronously. The main thing left to do on incoming changes is to set up a seperate thread. Anyhow, Big Devlog, just felt that if I wrote a devlog, it would be outdated within the hour. See ya next time! ; )"}, {"post_id": 60276, "ts": "2026-09-02T15:29:13Z", "hours": 3.3589, "text": "Polish ™ Worked on polishing up the UI, now the title of the document along with your Google account name and profile picture are displayed in the open document screen. Also text wrapping behaves much better. I also have been expermenting alot on how to get saving and realtime collaboration, since the last piece of progress, not much, just alot of 400 (Bad Request)s"}, {"post_id": 59515, "ts": "2026-09-01T11:51:25Z", "hours": 1.7619, "text": "Progress on Collaboration and saving Made some substantial progress on realtime collaboration, now I can successfully authenticate by posting to /bind to get a SID to then eventually make requests to /bind and /save. This was made possible by scraping the main web endpoint."}, {"post_id": 51809, "ts": "2026-08-21T17:28:55Z", "hours": 3.5811, "text": "Linux Compatibility And Polish The past few hours have been spent on refining the installer and associated scripts to work better on Linux and give a more reliable experience. Along with cleaning up some unimplemented features. A clear permission prompt for browser-scraping has been added. The past few Devlogs were focused on Internal Mode(Logging in without an external Browser), I still have plans to work on this but it is no longer the most pressing for me right now. School is starting soon for me, and I will have less time to work on this. I Want to get this ready to ship before the start of school so I can get this shipped before the end of the challenge. I will be focusing more on polish, installers, and getting it into a shippable state, If I can get saving to work before then, that’s great. But if not, I want to be able to ship a polished product even if it is missing a crucial feature(saving). But there is no guarantee that I will get it working by sinking more time into it, because it needs more reverse-engineering, I could get it to work in 3 Hours or 500, its down to how quickly I can crack the code in Wireshark(if ever)."}, {"post_id": 42573, "ts": "2026-08-07T12:04:37Z", "hours": 0.36, "text": "Welp, so much for that 2 Devlogs Ago I said I would create a CEF based C# app to authenticate with google. I did not realize that google explicitly blocks this. You might think, just change the “User-Agent: xxxxxx”, but no, Google has an entire JS detection system to stop exactly that. So then I tried making a web wrapper around “accounts.google.com” but Google has a CORS policy around this. So back to Servo it is!"}, {"post_id": 36980, "ts": "2026-07-29T12:37:08Z", "hours": 0.25, "text": "Progress! See Previous devlog."}, {"post_id": 36348, "ts": "2026-07-28T12:21:12Z", "hours": 4.8356, "text": "Internal Mode Been working on a Servo based google login (Internal Mode )(based on the servo slint example) in rust. I got far enough to be able to login, but it would take a lot more work in order to get to actually being able to login to google docs. This is my first rust project that goes beyond “Hello World!” so I have been trial and erroring my way through this proccess. I have realised that: My rust is not even close enough to being able to complete this within a reasonable timeframe(or ever) Servo doesn’t have any C#(my first and most experienced language) bindings(or not that I can find) CEF(Chromium Embedded Framework) does have C# bindings (Unfortunately is ALOT more bloated compared to Servo), aand Avalonia integration (I use Avalonia for the rest of the Google Docs App) Servo based login: doopyelephant/ServoGoogleLogin I Have started work on a CEF based google login in C#. Hopefully it plays out :)"}, {"post_id": 27686, "ts": "2026-07-13T13:59:14Z", "hours": 3.8225, "text": "Chromium App-Based-Encryption I have been working on chromium based browser support. Chrome & other modern Chromium based browsers use App-Bound-Encryption to encrypt their cookies. This is the reason why this unofficial Google Docs Client is currently unable to fully decrypt cookies from modern chromium based browsers out of the box on Windows. Chromium encrypts its cookies using the Windows DDAPI(Figure 2). Chromium used to decrypt cookies using the methods implemented in this repository before Chromium 127, this repository should decrypt cookies from chromium versions 127 and below(Figure 1). Figure 1 (C4 Bomb: Blowing up Chrome’s Appbound Cookie Encryption, www.cyberark.com/resources/threat-research-blog/c4-bomb-blowing-up-chromes-appbound-cookie-encryption . Accessed 13 July 2026.) Figure 2 (C4 Bomb: Blowing up Chrome’s Appbound Cookie Encryption, www.cyberark.com/resources/threat-research-blog/c4-bomb-blowing-up-chromes-appbound-cookie-encryption . Accessed 13 July 2026. ) Path forward On Windows ABE is in full effect, we would need SYSTEM perms, and try to impersonate Chrome. I plan to integrate xaitax/Chrome-App-Bound-Encryption-Decryption but this likely will not work forever, it is an arms race with Google and xaitax. Currently it works but likely Google with shut it down eventually. On Linux ABE is only used on Windows, on Linux Chromium uses the system Keychain over DBUS. (Gnome or KWallet) If these are unavailable it uses a completely exposed key in a file(basic encyption). This is very surpassable, it just needs implementation."}, {"post_id": 20798, "ts": "2026-07-02T14:33:09Z", "hours": 1.9575, "text": "Dynamic Path Support! Dynamic Paths are now enabled by default! Currently only Firefox works reliably from my limited testing. Zen(Fork of Firefox) works like 1/2 the time, and chromium based browsers get found but don’t work properly. The UI is kind of broken but it works for now(Working on it). Beta 3 is now released on Github with builds from the new Package&Release Script mentioned in the previous devlog."}, {"post_id": 19195, "ts": "2026-06-30T13:43:50Z", "hours": 1.8528, "text": "Platforms Platforms Platforms! Today I worked on yet more build scripts , now .zip files can be generated for every supported platform and placed in a folder with a single command! I still need to update the installer to fetch the corresponding .zip for the OS and Arch automatically. I am planning on doing my first ship once the installer & associated scripts are in a finished state where you can just paste one command into the terminal (for Win/Linux) and it opens the installer application which walks through the installation. After the installation the application should be able to be launched from the Start Menu/App Launcher along with an icon. Also the Dynamic Browser Paths(automatically finding the cookie directory of the user’s installed browser) should be stable, or if not then Internal Mode(planned mode which packages a Servo based browser to login with google to get cookies for auth)."}, {"post_id": 15601, "ts": "2026-06-25T11:20:57Z", "hours": 5.0742, "text": "Beta 2: Unofficial Google Docs Client I have worked more on RE’ing in Wireshark to RE saving and binding to a document(receive realtime updates), Implemented the infrastructure in the application, but both currently return a 400 (Bad Request), I am still working on it. There is a new material 3 theme with some other subtle UI changes. Various little fixes aswell. Also, you used to have to unzip and run the installer manually, but now there is a curl install command on the repo that downloads it to AppData and runs it."}, {"post_id": 8050, "ts": "2026-06-13T13:03:13Z", "hours": 4.2731, "text": "Finished Installer Flow! The installer now successfully downloads & installs the Google Docs application. It downloads the icon and adds a shortcut to the start menu, and adds Registry entries to add the uninstall script to the Add & Remove Programs Page in the windows settings app."}, {"post_id": 6249, "ts": "2026-06-10T14:33:35Z", "hours": 1.5903, "text": "Installer flow complete! It doesnt do any installing yet but we have a framework that calls a powershell script with progress updates and a progress bar"}, {"post_id": 3752, "ts": "2026-06-06T20:01:31Z", "hours": 0.7344, "text": "Avalonia Animations keep overlapping the pages!?!?"}, {"post_id": 3456, "ts": "2026-06-06T12:20:44Z", "hours": 0.8483, "text": "Made some fancy installer UI (Avalonia wwhhhyyy does your styling have to be so finicky!!!!!!)"}, {"post_id": 2876, "ts": "2026-06-05T19:16:51Z", "hours": 1.9375, "text": "Made a Build script to automate building and compiling the application for people!"}, {"post_id": 2728, "ts": "2026-06-05T14:07:58Z", "hours": 2.2578, "text": "-Demo of Unofficial Google Docs Client This is the status of my Unofficial Google Docs Client(Most of what is demoed in this devlog is done before stardance, this is a recap before i get into new features) Can authenticate with google to fetch public & private documents(using browser cookies) Can view documents including text(including bolds and italics) and tables Can move a cursor around and type, but cannot save to google’s servers yet"}]...
|
Title: Unofficial Google Docs Client by @nolanqsp Title: Unofficial Google Docs Client by @nolanqsp | Stardance
Devlogs:
-Demo of Unofficial Google Docs Client This is the status of my Unofficial Google Docs Client(Most of what is demoed in this devlog is done before stardance, this is a recap before i get into new features) Can authenticate with google to fetch public & private documents(using browser cookies) Can view documents including text(including bolds and italics) and tables Can move a cursor around and type, but cannot save to google’s servers yet
Made a Build script to automate building and compiling the application for people!
Made some fancy installer UI (Avalonia wwhhhyyy does your styling have to be so finicky!!!!!!)
Avalonia Animations keep overlapping the pages!?!?
Installer flow complete! It doesnt do any installing yet but we have a framework that calls a powershell script with progress updates and a progress bar
Finished Installer Flow! The installer now successfully downloads & installs the Google Docs application. It downloads the icon and adds a shortcut to the start menu, and adds Registry entries to add the uninstall script to the Add & Remove Programs Page in the windows settings app.
Beta 2: Unofficial Google Docs Client I have worked more on RE’ing in Wireshark to RE saving and binding to a document(receive realtime updates), Implemented the infrastructure in the application, but both currently return a 400 (Bad Request), I am still working on it. There is a new material 3 theme with some other subtle UI changes. Various little fixes aswell. Also, you used to have to unzip and run the installer manually, but now there is a curl install command on the repo that downloads it to AppData and runs it.
Platforms Platforms Platforms! Today I worked on yet more build scripts , now .zip files can be generated for every supported platform and placed in a folder with a single command! I still need to update the installer to fetch the corresponding .zip for the OS and Arch automatically. I am planning on doing my first ship once the installer & associated scripts are in a finished state where you can just paste one command into the terminal (for Win/Linux) and it opens the installer application which walks through the installation. After the installation the application should be able to be launched from the Start Menu/App Launcher along with an icon. Also the Dynamic Browser Paths(automatically finding the cookie directory of the user’s installed browser) should be stable, or if not then Internal Mode(planned mode which packages a Servo based browser to login with google to get cookies for auth).
Dynamic Path Support! Dynamic Paths are now enabled by default! Currently only Firefox works reliably from my limited testing. Zen(Fork of Firefox) works like 1/2 the time, and chromium based browsers get found but don’t work properly. The UI is kind of broken but it works for now(Working on it). Beta 3 is now released on Github with builds from the new Package&Release Script mentioned in the previous devlog.
Chromium App-Based-Encryption I have been working on chromium based browser support. Chrome & other modern Chromium based browsers use App-Bound-Encryption to encrypt their cookies. This is the reason why this unofficial Google Docs Client is currently unable to fully decrypt cookies from modern chromium based browsers out of the box on Windows. Chromium encrypts its cookies using the Windows DDAPI(Figure 2). Chromium used to decrypt cookies using the methods implemented in this repository before Chromium 127, this repository should decrypt cookies from chromium versions 127 and below(Figure 1). Figure 1 (C4 Bomb: Blowing up Chrome’s Appbound Cookie Encryption, www.cyberark.com/resources/threat-research-blog/c4-bomb-blowing-up-chromes-appbound-cookie-encryption . Accessed 13 July 2026.) Figure 2 (C4 Bomb: Blowing up Chrome’s Appbound Cookie Encryption, www.cyberark.com/resources/threat-research-blog/c4-bomb-blowing-up-chromes-appbound-cookie-encryption . Accessed 13 July 2026. ) Path forward On Windows ABE is in full effect, we would need SYSTEM perms, and try to impersonate Chrome. I plan to integrate xaitax/Chrome-App-Bound-Encryption-Decryption but this likely will not work forever, it is an arms race with Google and xaitax. Currently it works but likely Google with shut it down eventually. On Linux ABE is only used on Windows, on Linux Chromium uses the system Keychain over DBUS. (Gnome or KWallet) If these are unavailable it uses a completely exposed key in a file(basic encyption). This is very surpassable, it just needs implementation.
Internal Mode Been working on a Servo based google login (Internal Mode )(based on the servo slint example) in rust. I got far enough to be able to login, but it would take a lot more work in order to get to actually being able to login to google docs. This is my first rust project that goes beyond “Hello World!” so I have been trial and erroring my way through this proccess. I have realised that: My rust is not even close enough to being able to complete this within a reasonable timeframe(or ever) Servo doesn’t have any C#(my first and most experienced language) bindings(or not that I can find) CEF(Chromium Embedded Framework) does have C# bindings (Unfortunately is ALOT more bloated compared to Servo), aand Avalonia integration (I use Avalonia for the rest of the Google Docs App) Servo based login: doopyelephant/ServoGoogleLogin I Have started work on a CEF based google login in C#. Hopefully it plays out :)
Progress! See Previous devlog.
Welp, so much for that 2 Devlogs Ago I said I would create a CEF based C# app to authenticate with google. I did not realize that google explicitly blocks this. You might think, just change the “User-Agent: xxxxxx”, but no, Google has an entire JS detection system to stop exactly that. So then I tried making a web wrapper around “accounts.google.com” but Google has a CORS policy around this. So back to Servo it is!
Linux Compatibility And Polish The past few hours have been spent on refining the installer and associated scripts to work better on Linux and give a more reliable experience. Along with cleaning up some unimplemented features. A clear permission prompt for browser-scraping has been added. The past few Devlogs were focused on Internal Mode(Logging in without an external Browser), I still have plans to work on this but it is no longer the most pressing for me right now. School is starting soon for me, and I will have less time to work on this. I Want to get this ready to ship before the start of school so I can get this shipped before the end of the challenge. I will be focusing more on polish, installers, and getting it into a shippable state, If I can get saving to work before then, that’s great. But if not, I want to be able to ship a polished product even if it is missing a crucial feature(saving). But there is no guarantee that I will get it working by sinking more time into it, because it needs more reverse-engineering, I could get it to work in 3 Hours or 500, its down to how quickly I can crack the code in Wireshark(if ever).
Progress on Collaboration and saving Made some substantial progress on realtime collaboration, now I can successfully authenticate by posting to /bind to get a SID to then eventually make requests to /bind and /save. This was made possible by scraping the main web endpoint.
Polish ™ Worked on polishing up the UI, now the title of the document along with your Google account name and profile picture are displayed in the open document screen. Also text wrapping behaves much better. I also have been expermenting alot on how to get saving and realtime collaboration, since the last piece of progress, not much, just alot of 400 (Bad Request)s
HUGE Progress The past few hours I have worked on this project have been extremely productive. I found a header that genuine Google Docs sends, “X-Same-Domain”, which I believe just indicates whether the request is being sent to the same domain as the sender. It turns out that Google actively blocks requests from other domains, but luckily we can just send “X-Same-Domain” with a value of 1, pretending to be coming from the “docs.google.com” domain. After this realization the “/save” endpoint returned 200 (OK) . This was huge progress, this has been a major blocker for months . The one problem was that while the status code stated that the request was successful, the actual request payload contained an error “XSRF” and a string of numbers and letters, which I thought was probably some kind of authentication/coordination token. After a quick Google search, I realized that this was a token to prevent other websites in the same browser from sending requests impersonating Google Docs as the browser auto attaches authentication cookies. To my surprise, when I added “&token=XXXXXX” (with XXXXXX being the string of numbers and letters) to the request url, we get a different error! This one was very ambiguous though, it just was a JSON payload containing nothing but the number “400” , as in 400 (Bad Request) which I had become to dread. After searching around the codebase for a while I found a problem with the url encoding logic, Url encoding is the proccess of replacing invalid character with %XX (XX being the ASCII code for the invalid character), it turns out “&“s are valid characters……. but I was replacing them. Ampersands are also the seperator for parameters. I think the problem was that within the Google Docs server code, it seperates the parameters then decodes each one. With this problem fixed, saving worked!!!! There were a few tiny bugs I wont get into, but largely it worked. I implemented merging changes(sending “hello” rather than “h” + “e” + “l”+ “l”+ “o”). With saving working, I decided to start working on seeing whether these solutions also worked on “/bind” (real-time incoming changes), they didn’t immediately, but after a few tweaks trying to replicate the URL parameters that Google Docs uses, we had incoming changes! I had to do some fancy async enumerable shenanigans to get them to come in asynchronously. The main thing left to do on incoming changes is to set up a seperate thread. Anyhow, Big Devlog, just felt that if I wrote a devlog, it would be outdated within the hour. See ya next time! ; )
Building Up to Release I’ve been working on numerous small issues that I have been putting off. One of these is that all documents over ~1.5 pages were getting cut off, it turns out the contents of the document is split into multiple chunks, each around ~1.5 pages long. It was a relatively simple problem, just needed to fix it. Also binding(incoming changes) now runs on a separate thread so that the UI doesn’t freeze when somebody else types. Saving also now runs on a separate thread, it auto saves every ~1 second, which caused another problem, outgoing changes got relayed back as incoming changes by Google’s servers, meaning everything you typed got duplicated. Again, simple fix, just needed doing. The main thing however is the caret/cursor behavior, which was/is doing some funky stuff, jumping around whenever you changed lines. I added a binary search to help with this, which helped but didnt completely fix it. So there is still some work there. I also added some savekeys to minimize the log output, because before…… there were almost a MB of logs from each run. The main things that stand before release are to finish the cursor behaviour, bolds & italics shifting, and add a home screen with your documents.
Lots more marginal improvements + New Rendering Engine + Pain Recently I have been adding: Support for more keys(symbols, numbers, numpad numbers & arrow keys) Paste (CTRL + V) support More verbose logging New Rendering Engine Can include additional data(underline color, etc) for the future Seems more stable(the old one was kind of jank) But to be honest, most of the time was spent trying to fix some unliveable bugs, when typing to quickly, stuff appears after the cursor. In addition when typing, bold text after the cursor seems to offset. I learned something that can help with the latter bug, but I wasn’t able to fix either.
GitHub, Why? Last weekend GitHub decided to suspend my account for no apparent reason(No it wasn’t a DMCA from Google). I got an email saying for me to “reverify my academic status” for the student developer pack at the same time I got suspended. I tried to do that but… you can’t reverify without being logged in, and you can’t login when you are suspended. So I contacted support and they asked “how [I] plan to use GitHub” and that “[my] account was flagged by [their] abuse-detection systems for manual review, as it may conflict with [their] Terms of Service”. I responded but haven’t gotten any response since then(that was a week ago). I ended up moving at least temporarily to GitLab. While I had a copy of the git repository on my development machine, unfortunately this doesn’t include GitHub releases. I created a new one on GitLab but there aren’t any before the newest one. Anyhow, lets get to the new features: Fix crashing when exiting causing lingering threads Add support for the space key & several special characters including Enter for newlines Add support for different font sizes Add support for downloading and applying font families at runtime (Huge thanks to Jonathan Neal for Google Fonts catalog) Improve install script by supporting powershell 5(the one included in windows) and fixing several errors Fix bug where installer’s progress bar wouldn’t update until completed Cache parsed Savekeys to prevent additional wasted compute Update installers to use GitLab Anyhow, those are the recent updates! Hopefully GitHub reviews my reinstatement request soon. :)
Polish Polish Polish No flashy new features this devlog, mainly just making linux work properly and fixing mountains and mountains of bugs. My Github account got restored eventually though! It took a decent amount of back and forth, but I got it back without too much hassle , just took a while.
Ships:
At Last It finally works. I have been working on this project for months now and I finally got it to a point where I think its good enough. The past few hours I have really just been dialed in on getting Linux support and other strange issues. Over the past few months there has been huge progress. From saving, and incoming changes working to installers. At the beginning of stardance, I was able to fetch the contents of a document with every path hardcoded and little rendering fanciness. Now saving, and realtime collaboration works across multiple devices, there are installers for different platforms, and cookies are dynamically fetched. Have fun Internet!...
|
1793721077.7391202
|
1793807477.7391202
|
|
8695
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943477.2030451
|
1793807477.2030451
|
|
52164
|
RaizenOS by @ryu_ | Stardance
|
ryu_
|
0
|
3.09
|
0
|
[]
|
[{"post_id": 52267, "ts": "202 [{"post_id": 52267, "ts": "2026-08-22T11:30:16Z", "hours": 0.9333, "text": "I added JavaScript functionality to the Raizen OS welcome screen. The boot sequence now loads system messages, animates the progress bar, enables the Start button when the system is ready, and supports pressing Enter to start. The welcome screen is officially interactive now. ⚡"}, {"post_id": 52180, "ts": "2026-08-22T08:35:53Z", "hours": 1.2, "text": "Raizen OS — Devlog #2 I worked on the CSS for Raizen OS. I transformed the basic HTML structure into a futuristic OS-style welcome screen with a tech grid, glowing UI, terminal panel, animations, and responsive design. The foundation is starting to look like an actual OS now. 👀"}, {"post_id": 52096, "ts": "2026-08-22T05:25:30Z", "hours": 0.9586, "text": "Raizen OS — Devlog #1Starting the Raizen OS build from scratch.Today I focused only on the HTML structure — setting up the foundation of the welcome screen and preparing the layout for the OS interface.No fancy styling yet. Just the structure."}]...
|
Title: RaizenOS by @ryu_ | Stardance
Devlogs:
Rai Title: RaizenOS by @ryu_ | Stardance
Devlogs:
Raizen OS — Devlog #1Starting the Raizen OS build from scratch.Today I focused only on the HTML structure — setting up the foundation of the welcome screen and preparing the layout for the OS interface.No fancy styling yet. Just the structure.
Raizen OS — Devlog #2 I worked on the CSS for Raizen OS. I transformed the basic HTML structure into a futuristic OS-style welcome screen with a tech grid, glowing UI, terminal panel, animations, and responsive design. The foundation is starting to look like an actual OS now. 👀
I added JavaScript functionality to the Raizen OS welcome screen. The boot sequence now loads system messages, animates the progress bar, enables the Start button when the system is ready, and supports pressing Enter to start. The welcome screen is officially interactive now. ⚡...
|
1792943476.3347392
|
1793807476.3347392
|
|
29018
|
My awesome macropad! by @lyssie | Stardance
|
lyssie
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @lyssie | Stardance
|
1793202675.967554
|
1793807475.967554
|
|
27386
|
My first Macropad by @nathanielramirez | Stardance
|
nathanielramirez
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first Macropad by @nathanielramirez | St Title: My first Macropad by @nathanielramirez | Stardance...
|
1792943475.516262
|
1793807475.516262
|
|
4636
|
MAKRYAM by @PanAnton11 | Stardance
|
PanAnton11
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: MAKRYAM by @PanAnton11 | Stardance
|
1793202675.0705485
|
1793807475.0705485
|
|
24181
|
Project Horizon by @SubTomic | Stardance
|
SubTomic
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-25T17:14:22Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Project Horizon I built a custom, real-time browser flight simulator from scratch using pure JavaScript and an HTML5 canvas. The rendering engine utilizes custom pseudo-3D matrix projection to dynamically calculate and display infinite terrain grid blocks, including mountain ranges and water tiles, completely independent of external 3D libraries like WebGL or Three.js. The core of the project is the physical hardware integration. I designed and 3D printed a custom flight yoke assembly that houses a Raspberry Pi 5 equipped with a Sense HAT. The Pi polls the integrated IMU sensor and streams live pitch, roll, and throttle variables over a local WebSocket server , allowing the user to manipulate the aircraft’s cockpit view seamlessly via physical motion. The primary technical challenges involved implementing the manual projection mathematics and filtering the raw sensor telemetry to eliminate signal noise and jitter. I am particularly proud of achieving a stable hardware-to-software data stream and developing a high-visibility, responsive glass-cockpit HUD featuring synchronized airspeed and altitude instrument tapes. How to Test the Project : If you are reviewing this project without the physical Raspberry Pi yoke connected, the flight simulator automatically initializes a desktop fallback mode with interactive manual controls: Pitch (Climb/Dive): Use W / S Roll (Bank wings): Use A / D Throttle (Engine Thrust): Scroll the Mouse Wheel to adjust power linearly from 0% to 100%", "repo": "https://github.com/SubTomic1833/Project-Horizon", "demo": ""}]...
|
[{"post_id": 15733, "ts": "202 [{"post_id": 15733, "ts": "2026-06-25T16:28:29Z", "hours": 1.5669, "text": "Devlog 6/25 Done : Website working with speedometer and altitude indicator Backend code for the Raspberry Pi 5 for gyroscopic data telemetry Physical model featuring a yoke design with a Raspberry Pi 5 holder in the center Whats next? SHIP"}, {"post_id": 15328, "ts": "2026-06-24T22:05:17Z", "hours": 2.1169, "text": "Devlog 6/24 Done : Started HTML Script to test roll, pitch and yaw data from Raspberry Pi 5 Set up WebSockets on Raspberry Pi to stream gyroscope data to HTML Code Whats next? Change UI to a more modern look Possibly add more features to enhance the look of the UI"}, {"post_id": 15150, "ts": "2026-06-24T16:45:14Z", "hours": 2.2344, "text": "Devlog - 6/24 Lot of work done today Done : Hardware side of the project, which includes: Main Assembly Raspberry Pi Holder Main Frame Joystick piece Full CAD of Raspberry Pi 5 The idea of the frame was that it looks like a Yoke you would see inside a cessna 172 or other aircraft, creating the sensation that you were actually flying the plane when looking into the horizon. Whats next? Start using VSCode and Thonny on Raspberry Pi to send data from Sense Hat to the code in order to control the horizon"}, {"post_id": 14414, "ts": "2026-06-23T15:17:26Z", "hours": 0.6669, "text": "Project Horizon - 6/23 Dev Log : This Dev Log is mainly focused on the Block CAD Model of the Raspberry Pi 5, as this was crucial for the later design of the physical structure/device. Added CPU, RAM, and I/O blocks, as well as the USB 2.0, USB 3.0, ethernet port and 40 PIN GPIO Header w/ extension. This is crucial since I will need to design the physical structure of the device around the R PI."}, {"post_id": 14009, "ts": "2026-06-22T23:55:46Z", "hours": 0.3006, "text": "Project Horizon - Started on : Raspberry Pi 5 Case Raspberry Pi 5 Block CAD Model This is crucial for the design of the case/holder since the entire physical prototype will be designed and assembled around the Pi itself. Whats next : Finish Pi Holder CAD Finish Pi Block CAD Model Start CAD on physical structure/device Hopefully start some basic HTML Code"}]...
|
Title: Project Horizon by @SubTomic | Stardance
D Title: Project Horizon by @SubTomic | Stardance
Devlogs:
Project Horizon - Started on : Raspberry Pi 5 Case Raspberry Pi 5 Block CAD Model This is crucial for the design of the case/holder since the entire physical prototype will be designed and assembled around the Pi itself. Whats next : Finish Pi Holder CAD Finish Pi Block CAD Model Start CAD on physical structure/device Hopefully start some basic HTML Code
Project Horizon - 6/23 Dev Log : This Dev Log is mainly focused on the Block CAD Model of the Raspberry Pi 5, as this was crucial for the later design of the physical structure/device. Added CPU, RAM, and I/O blocks, as well as the USB 2.0, USB 3.0, ethernet port and 40 PIN GPIO Header w/ extension. This is crucial since I will need to design the physical structure of the device around the R PI.
Devlog - 6/24 Lot of work done today Done : Hardware side of the project, which includes: Main Assembly Raspberry Pi Holder Main Frame Joystick piece Full CAD of Raspberry Pi 5 The idea of the frame was that it looks like a Yoke you would see inside a cessna 172 or other aircraft, creating the sensation that you were actually flying the plane when looking into the horizon. Whats next? Start using VSCode and Thonny on Raspberry Pi to send data from Sense Hat to the code in order to control the horizon
Devlog 6/24 Done : Started HTML Script to test roll, pitch and yaw data from Raspberry Pi 5 Set up WebSockets on Raspberry Pi to stream gyroscope data to HTML Code Whats next? Change UI to a more modern look Possibly add more features to enhance the look of the UI
Devlog 6/25 Done : Website working with speedometer and altitude indicator Backend code for the Raspberry Pi 5 for gyroscopic data telemetry Physical model featuring a yoke design with a Raspberry Pi 5 holder in the center Whats next? SHIP
Ships:
Project Horizon I built a custom, real-time browser flight simulator from scratch using pure JavaScript and an HTML5 canvas. The rendering engine utilizes custom pseudo-3D matrix projection to dynamically calculate and display infinite terrain grid blocks, including mountain ranges and water tiles, completely independent of external 3D libraries like WebGL or Three.js. The core of the project is the physical hardware integration. I designed and 3D printed a custom flight yoke assembly that houses a Raspberry Pi 5 equipped with a Sense HAT. The Pi polls the integrated IMU sensor and streams live pitch, roll, and throttle variables over a local WebSocket server , allowing the user to manipulate the aircraft’s cockpit view seamlessly via physical motion. The primary technical challenges involved implementing the manual projection mathematics and filtering the raw sensor telemetry to eliminate signal noise and jitter. I am particularly proud of achieving a stable hardware-to-software data stream and developing a high-visibility, responsive glass-cockpit HUD featuring synchronized airspeed and altitude instrument tapes. How to Test the Project : If you are reviewing this project without the physical Raspberry Pi yoke connected, the flight simulator automatically initializes a desktop fallback mode with interactive manual controls: Pitch (Climb/Dive): Use W / S Roll (Bank wings): Use A / D Throttle (Engine Thrust): Scroll the Mouse Wheel to adjust power linearly from 0% to 100%...
|
1793721074.8277776
|
1793807474.8277776
|
|
52162
|
Arya os 2 by @aryamankumar2403 | Stardance
|
aryamankumar2403
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Arya os 2 by @aryamankumar2403 | Stardance
|
1792943474.7047927
|
1793807474.7047927
|
|
37994
|
Mini Space Shooter Game by @Vansh_7 | Stardance
|
Vansh_7
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Mini Space Shooter Game by @Vansh_7 | Stard Title: Mini Space Shooter Game by @Vansh_7 | Stardance...
|
1792943473.8728602
|
1793807473.8728602
|
|
3729
|
My awesome macropad! by @guhann | Stardance
|
guhann
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @guhann | Stardance
|
1793202673.132263
|
1793807473.132263
|
|
6737
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943473.0570087
|
1793807473.0570087
|
|
2930
|
testing project? by @chocfrostedsugarbombs | Stard testing project? by @chocfrostedsugarbombs | Stardance...
|
chocfrostedsugarbombs
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: testing project? by @chocfrostedsugarbombs Title: testing project? by @chocfrostedsugarbombs | Stardance...
|
1793202672.2509274
|
1793807472.2509274
|
|
52153
|
Cat Game by @Air-Fryer | Stardance
|
Air-Fryer
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Cat Game by @Air-Fryer | Stardance
|
1792943472.2221925
|
1793807472.2221925
|
|
36922
|
A clone hero cyberdeck by @Mima | Stardance
|
Mima
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: A clone hero cyberdeck by @Mima | Stardance
|
1792943471.3945513
|
1793807471.3945513
|
|
31337
|
My awesome macropad! by @muindubrian | Stardance
|
muindubrian
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @muindubrian | Star Title: My awesome macropad! by @muindubrian | Stardance...
|
1793202671.3411071
|
1793807471.3411071
|
|
27588
|
sejmle by @wavy | Stardance
|
wavy
|
1
|
15.0
|
118
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-05T19:36:11Z", "hours": 15.0, "multiplier": 8.05, "payout": 118, "blessing": "neutral", "text": "I built Sejmle, a daily Wordle-inspired game where you guess Polish MPs. Since our parliament is basically a viral reality show with millions of views on YouTube, I wanted to turn it into a fun game. It tracks your stats, has clean animations, and shoots confetti when you win Getting React state and charts to load from localStorage without breaking Next.js SSR (hydration errors). I fixed it by importing the charts dynamically on the client side. Also, rendering the guess grid dynamically took some neat config mapping to keep the code clean Building the entire UI from scratch so it looks unique and snappy. I’m also hyped about how fast the code is, it saves all your stats offline with zero database latency, so there is no lag at all How to test it? Open the live site at https://sejmle.vercel.app/ Read the quick tutorial popup Type an MP’s name and hit guess Use the colored feedback tiles to find the daily MP Enjoy the win confetti and check your stats!", "repo": "https://github.com/WavyWare/sejmle", "demo": "https://sejmle.vercel.app"}]...
|
[{"post_id": 23021, "ts": "202 [{"post_id": 23021, "ts": "2026-07-05T19:04:28Z", "hours": 4.2778, "text": "This is probably last devlog on this project. Now there are pop-ups for tutorial and victory. Metadata is added, leaderboard is added so I can see my previous guesses and timer is done. Everything I planned is done and I’ve done a little bit more e.g. hint, some debugging and local storage is done so every data is saved like if you guessed that day or guesses. I’m going to ship this project now so this is done!"}, {"post_id": 22396, "ts": "2026-07-04T21:14:03Z", "hours": 3.5775, "text": "Hi there! I’ve done quite a good job on last days. So now there are animations to get that smooth feeling, tutorial pop up, animated suggestion box and solving problems I’ve found. So for now, all the layout of pop up is done and it’s waiting for continuation for pop up when you guessed correctly. Next up to do are: SEO and basic metadata (I don’t even have a title in search bar), simple leaderboard to show average guesses on daily challenge and function that converts input field to timer when you guessed correctly for that day. Have a nice one!"}, {"post_id": 20233, "ts": "2026-07-01T19:40:48Z", "hours": 5.5653, "text": "I’ve added basic logic to my game, so now it works. I have to add announcement if player wins and then minor changes like animations. If you’re not from Poland you may not know polish parliament members, but I would really love you to check and write some comment about my game. Sejmle is available at https://sejmle.vercel.app"}, {"post_id": 17599, "ts": "2026-06-28T13:48:26Z", "hours": 1.2436, "text": "I’ve added system that saves all and most recognizable members of parliament to JSON files."}]...
|
Title: sejmle by @wavy | Stardance
Devlogs:
I’ve Title: sejmle by @wavy | Stardance
Devlogs:
I’ve added system that saves all and most recognizable members of parliament to JSON files.
I’ve added basic logic to my game, so now it works. I have to add announcement if player wins and then minor changes like animations. If you’re not from Poland you may not know polish parliament members, but I would really love you to check and write some comment about my game. Sejmle is available at https://sejmle.vercel.app
Hi there! I’ve done quite a good job on last days. So now there are animations to get that smooth feeling, tutorial pop up, animated suggestion box and solving problems I’ve found. So for now, all the layout of pop up is done and it’s waiting for continuation for pop up when you guessed correctly. Next up to do are: SEO and basic metadata (I don’t even have a title in search bar), simple leaderboard to show average guesses on daily challenge and function that converts input field to timer when you guessed correctly for that day. Have a nice one!
This is probably last devlog on this project. Now there are pop-ups for tutorial and victory. Metadata is added, leaderboard is added so I can see my previous guesses and timer is done. Everything I planned is done and I’ve done a little bit more e.g. hint, some debugging and local storage is done so every data is saved like if you guessed that day or guesses. I’m going to ship this project now so this is done!
Ships:
I built Sejmle, a daily Wordle-inspired game where you guess Polish MPs. Since our parliament is basically a viral reality show with millions of views on YouTube, I wanted to turn it into a fun game. It tracks your stats, has clean animations, and shoots confetti when you win Getting React state and charts to load from localStorage without breaking Next.js SSR (hydration errors). I fixed it by importing the charts dynamically on the client side. Also, rendering the guess grid dynamically took some neat config mapping to keep the code clean Building the entire UI from scratch so it looks unique and snappy. I’m also hyped about how fast the code is, it saves all your stats offline with zero database latency, so there is no lag at all How to test it? Open the live site at https://sejmle.vercel.app/ Read the quick tutorial popup Type an MP’s name and hit guess Use the colored feedback tiles to find the daily MP Enjoy the win confetti and check your stats!...
|
1793721070.7814045
|
1793807470.7814045
|
|
10968
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943470.561943
|
1793807470.561943
|
|
12963
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943469.7507634
|
1793807469.7507634
|
|
16144
|
My very own WebOS by @Jeffrey | Stardance
|
Jeffrey
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @Jeffrey | Stardance
|
1793202669.4320865
|
1793807469.4320865
|
|
27898
|
1lb plastic antweight battlebot by @trapmoneypoop2 1lb plastic antweight battlebot by @trapmoneypoop2 | Stardance...
|
trapmoneypoop2
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: 1lb plastic antweight battlebot by @trapmon Title: 1lb plastic antweight battlebot by @trapmoneypoop2 | Stardance...
|
1793202668.5590444
|
1793807468.5590444
|
|
26452
|
Orbital by @Mehmet | Stardance
|
Mehmet
|
2
|
32.0
|
390
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-07T19:39:02Z", "hours": 17.0, "multiplier": 12.19, "payout": 201, "blessing": "neutral", "text": "I built Orbital, the all-in-one project that encompasses whatever you need from a 2D astronomical simulator. When first loading it up, a window titled “Orbital” pops up, and you will see a star right at the center. You can change the window dimensions however you would like, whether fullscreen or resized small. This is where the fun starts: I spent tireless hours implementing a slingshot mechanism where you can intuitively and easily launch “orbitals,” as I like to call them. You can think of these as small planets that you can send to orbit around each other and around bigger stars, masses, and objects that you create yourself. The starting star is just to get you going. Controls and Features: • Navigation: Use the WASD keys and/or arrow keys to navigate around this 2D world and find different orbits across the gigantic canvas. It does not have an end (unless you spend 10 hours of unemployment trying to find it, but I am sure you are not that stubborn). • Mass Adjustment: Use the plus (+) and minus (-) keys to change the mass of the objects you throw into the simulation. • Physics: It runs on full n-body physics; nothing is hard-coded and everything is dynamic. No matter how quirky and interesting your orbits are, they will be solely and originally yours. • Visuals: The colors change up every once in a while. I really tried to make it as minimalist and physics-identifying as possible. • Reset: Press the R key on your keyboard to reset the world and start from a fresh universe, marked by the reset star that kickstarts everything again. I am really proud of the n-body physics because it was surprisingly manageable and cool to work on. Where I really struggled was on advanced merging. Normally, if objects are touching, you can simply merge them. But when objects move super fast, one frame they are far away, and by the next frame, high velocity math teleports them right past or into the other object. If you slingshot a planet relatively fast, it could easily glitch and teleport through objects. To fix this, I had to calculate whether the path the object took from frame 0 to frame 1 intersected any other objects along its trajectory. That was an especially hard, albeit depressing challenge, but nevertheless, it was encountered and defeated so you could enjoy astronomical bliss. Thank you!", "repo": "https://github.com/SameRainbows/Starshell", "demo": "https://github.com/SameRainbows/Orbital/releases/tag/v1.0.0"}, {"ship_num": 2, "ts": "2026-07-05T15:30:25Z", "hours": 15.0, "multiplier": 12.8, "payout": 189, "blessing": "neutral", "text": "Initial Ship Update (v1.0.0) What did I make? I built Orbital , a 2D gravitational physics sandbox created entirely in Python using only standard library modules ( turtle and tkinter ). Orbits are not hardcoded; they emerge dynamically from Newton’s Law of Universal Gravitation calculated between every single body frame-by-frame. You can interactively slingshot planets into orbit, pan a camera infinitely around the universe using WASD or Arrow keys, adjust the laws of physics on the fly using a Tkinter-based HUD, and watch planets collide and merge under the conservation of momentum. What was challenging? The Coordinates Separation: Early on, a planet’s physics position was its drawing position. To build a panning camera, I had to decouple them—creating a 9-element list structure to track world coordinates privately while subtracting camera offsets only for rendering. The “Tunneling” Bug: Fast slingshotted planets would frequently phase straight through the central star between frames. I solved this by implementing Continuous Collision Detection (CCD)—using vector dot-product projection to check if the line segment traveled during a frame intersected the star. Singularity Prevention: As merging planets got infinitesimally close, the gravity force equation approached divide-by-zero, creating infinite force that would sling bodies off screen at lightspeed. I had to write custom logic to disable gravity between two bodies the exact frame they overlap. A Responsive HUD: Nesting Tkinter widgets on a Turtle ScrolledCanvas caused nesting errors. I resolved this by passing the raw screen._root as the parent, and binding the canvas <Configure> event to dynamically slide the widgets so they stay pinned to the top-right corner when resizing. What am I proud of? Conserving Density: When two bodies merge, the new object’s size is calculated using sqrt(r1² + r2²) rather than just adding the radii. This ensures area is conserved, keeping physical density mathematically consistent. Conservation of Momentum: If you launch two equal-mass planets head-on at the same speed, they will perfectly cancel out and stop dead in space upon impact, exactly as real-world physics dictates. What should people know so they can test my project? Slingshot: Click, drag, and release to fling planets into the cosmos. HUD Controls: Adjust the Gravity slider to warp orbits in real-time, and slide the Mass slider to change the size and weight of the next planet you launch. Color Picker: Click the color button to cycle the launching color (the button text dynamically updates to show what is selected). Navigation: Use WASD or Arrow keys to pan the camera around. Rebuilding: Press the Reset button to wipe the board and start a clean universe. No Python installed? Zero-dependency, standalone executables for Windows , macOS , and Linux are automatically built and attached directly to the GitHub Release!", "repo": "https://github.com/SameRainbows/Starshell", "demo": "https://github.com/SameRainbows/Orbital/releases/tag/v1.0.0"}]...
|
[{"post_id": 63802, "ts": "202 [{"post_id": 63802, "ts": "2026-09-07T19:26:27Z", "hours": 1.2872, "text": "I updated the project. I was notified that it initially crashed on macOS, and the arrow keys were a bit janky on macOS as well. All of that has been completely fixed, and I’ve updated the readme and the latest code on GitHub to encompass those changes."}, {"post_id": 38456, "ts": "2026-07-31T20:42:59Z", "hours": 0.3458, "text": "A few cleanups on the size of the grid."}, {"post_id": 37557, "ts": "2026-07-30T11:27:46Z", "hours": 0.4203, "text": "Today I changed the title card of the window that pops up. A few other updates: • I tweaked the final game feel a bit. • I made the initial spawning star spawn in a sort of light yellow color, and I also added that light yellow color to the colors list. • I made sure that the window of the simulation is also in dark mode, so you get more encapsulated in it."}, {"post_id": 37243, "ts": "2026-07-29T20:01:14Z", "hours": 0.3844, "text": "Added a background grid so that you get a sense of spatial bigness and tininess. You get a feel for how big and small your orbitals really are."}, {"post_id": 36907, "ts": "2026-07-29T09:37:56Z", "hours": 0.5981, "text": "I finally got the complex merging done. Before, when an orbital was going too fast, one frame it was at the back of another orbital, and the next frame, it was in front of it. Since its velocity was so high, the radii didn’t ever collide, so it just went through other ones without merging. That was really not acceptable, so I worked a lot on making sure it works. How I did it is actually very interesting: Get the starting position of the moving object and its ending position on the next frame. Get the coordinates of the target object you want to check for a potential merge. Draw a line from where the moving object started to where it ended, and check if the target object is intersecting that line (calculating what percentage along that line the checked object sits). If it intersects, you merge them."}, {"post_id": 34557, "ts": "2026-07-25T11:31:10Z", "hours": 1.9503, "text": "Added some instructions to make it easier, added more colors, and I’m now working on making more rigorous merge logic."}, {"post_id": 31787, "ts": "2026-07-20T13:42:17Z", "hours": 0.7153, "text": "Today I added zooming that works with scrolling up and scrolling down appropriately: when you scroll down, everything gets smaller, and when you scroll up, everything gets bigger. Mass and gravity, of course, stay the same. I made sure that the sling function (basically spawning new orbitals) works flawlessly. Our aim function—which draws that mini press-and-drag indicator to make it easier to see where you are spawning orbitals—is also working with both camera differentiation and zoom differentiation. This way, you can zoom all the way out and still spawn orbitals in the correct way, or zoom all the way in and spawn them super close up. All the physics and rendering works beautifully."}, {"post_id": 31286, "ts": "2026-07-19T15:52:23Z", "hours": 0.4508, "text": "I made some more intuitive user changes: Slingshot Dampening: Now, the slingshot isn’t like an Angry Bird slingshot that propels your particles to the other side of the universe (though you could do that if you want, just open the code). All the slingshot coordinates and values are now multiplied by 0.2. We’re nerfing it a lot, but it seems more intuitive that way. Since you don’t know it’s nerfed, you won’t notice there is a higher capacity. In our case, a higher capacity actually means friction. Don’t get me wrong: it’s not particle friction, because they go super fast. It’s friction when trying to get orbits to work. Repository Tweaks: Calling the script from_scratch.py was killing me, so I found something simpler: orbital.py. It’s much better. I updated the GitHub repository so that the current release is orbital.py (the refactored version). While main.py (the previous version) has a few more features right now, orbital.py is much cleaner. Main.py was more of a learning run, and I feel like I’m bringing my A-game with this new refactor. Look and Feel: I really liked the black background and white orbitals of the previous main.py version, so I changed the clinical-seeming style of from_scratch.py. I scrapped that look and made sure the new orbital.py has some taste."}, {"post_id": 30665, "ts": "2026-07-18T12:54:27Z", "hours": 0.4531, "text": "I fixed the “merging from hell”. The first issue was the radius calculation. When two circles merge, simply adding their radii ( r1 + r2 ) is physically wrong because the combined area grows way too fast. In reality, the area of the circles should add up: A_new = A1 + A2 . By plugging in the area formula π × r² , we get π × r_new² = (π × r1²) + (π × r2²) . The π cancels out completely, leaving r_new = math.sqrt(r1² + r2²) . I updated the collision code with this, and now the combined masses have physically accurate sizes.To make this look right, I also fixed the visual scaling issue. Previously, every particle rendered at shapesize(1, 1) regardless of its actual mass or radius. I changed the instantiator so that a body’s shapesize dynamically scales with its physics radius: self.turt.shapesize(self.radius / 10, self.radius / 10) . Now when objects collide, you can actually see the merged planet grow on the screen.Lastly, I added a quick reset button . Pressing the R key runs a function that loops through the current objects, hides all their turtles to prevent visual ghosts, clears the main objects list, resets the camera back to center coordinates, and spawns a fresh central star"}, {"post_id": 30329, "ts": "2026-07-17T20:01:25Z", "hours": 0.7283, "text": "Hey, I added merging, but it’s “merging out of hell” because I made a very unphysically true and crude (if you’d call it that), but working prototype of merge_collisions and the merge function itself. It works as I intended, but not physically truly. Right now, it adds the radii of the circles themselves. If you think about it, that’s physically wrong because there’s a big difference between adding the areas of the circles versus their radii. That’s something I want to get right, so the next time I’m working on it, I’ll make sure to fix it so that we are adding the areas of the circles rather than their radii. I also found a bit of a problem where the merged objects themselves have a shape size of (1, 1). That’s not right because if you merge two objects with shape size 1, you’d expect the new shape size to be 2. Right now, no matter how many objects you merge, it still stays at 1, resulting in a very, very dense circle. I’m going to change that so we add the areas themselves, and have that new, bigger area update the visual representation of those astronomical objects. I’ll keep you guys updated. See you next time."}, {"post_id": 29651, "ts": "2026-07-16T18:34:38Z", "hours": 2.6961, "text": "Lots of stuff today: Camera movement: I added camera movement to our new refractor. Better version of the sling: The older one just expected you to press, drag, and release without seeing much of an indicator. While that works if you know the program a bit, I think a direct, laser-esque pointer that shows you actively as you’re pressing, dragging, and releasing is more intuitive and easier to work with. So I added that. Now we have intuitive camera movement and intuitive spawning. For this refactor, we won’t have any UI. All the sliders for gravity and mass will be per keyboard or hotkey."}, {"post_id": 27197, "ts": "2026-07-12T15:21:09Z", "hours": 0.7889, "text": "Welcome! Today, I fully migrated to the object-oriented programming architecture. Earlier, the class wasn’t really full OOP; it was just a hidden list factory that appended the stuff via a class instead of doing it manually. I wanted to change that because this is going to be a refactor in an OOP perspective , and that’s what I did.I made sure that all the formulas used the latest changes:1. Earlier, they would use the index of the objects inside the objs list of lists. It would be something like object1 and the index of whichever element it wants to access, like mass , radius , velocity , or coordinates. It was very sloppy, and you had to keep up with what each index meant.2. With an OOP version, you just write object1.mass , object1.x , or object1.vx . Each and every line is more intuitive.I also worked more on the planet spawning . Remember, this is a new file with a different perspective of trying to remake this in an OOP sense, using classes and the benefits that ensue from them.Additionally, today I implemented the balancing of the canvas differences in Tkinter and Turtle :- In Turtle, the (0, 0) coordinate is directly in the middle of the screen .- In Tkinter, it’s at the absolute top left of the screen.You have to make sure that all the formulas and all the logic get the correct version, which in my project is the Turtle version . I added and worked out the logic that would make sure that balance is kept."}, {"post_id": 26600, "ts": "2026-07-11T14:59:24Z", "hours": 0.7944, "text": "Actively working on making Orbital (via the from_scratch.py file) more object-oriented. I think OOP (object-oriented programming) will be a great addition to Orbital because we have lots of stuff that can be simplified. These could be new particles, like new planets, and I think grouping everything into classes would be a better way to handle these. Right now, our sling function just does the same thing again and again. A class that could be called any time we want to make a new particle is probably the way to go. I’ll keep you guys updated."}, {"post_id": 25989, "ts": "2026-07-10T15:20:31Z", "hours": 0.7464, "text": "Today I spent all my time on from_scratch.py to really get to understand the physics of it all. Before, I just relied on a few formulas.That’s why I’m going to try and maximize my gains from this project by re-understanding all the logic and trying to write it from scratch, using only my notes and not looking at any AI or code from main.py .It’s going good! I added quite a few functions:- A distance function- A force function- An angle function (all of these take two objects, by the way — I still have the same objs list, which is a list of lists)- A velocity update function called velo_update that takes an object , a force , angle , and mass , and updates the velocities of those objects depending on their forces, angles, and massMaybe I can cut back on mass . I don’t know why I added it, since we can already get it from the objs list with our object parameter. I’ll look into that.I also created the scaffold for an update function, which is going to be the main function . I added screen.ontimer(update, 10) to run it every 10 milliseconds. It’s just the main scaffold for now, but I’m really focusing on the logic of it all."}, {"post_id": 25611, "ts": "2026-07-10T00:02:56Z", "hours": 3.3097, "text": "Hey, this is another mini devlog. I just wanted to say that while waiting for my initial ship to get reviewed, I was working on reviewing my current code and remembering how every part interacted. I’m doing this by making a from-scratch.py file where I just try to build the general project from the ground up with my direct understanding and recall of it, without looking at every line of code. This is like a mini side quest in the background so that as the file gets big, I don’t lose where I’m going. Right now, it just has the basic functions like distance and force, and has two Python turtles set to circles with different colors. I’m going to build this from the ground up and really focus on the struggle and pain through the process. I want to maximize my gains from this project this way."}, {"post_id": 23423, "ts": "2026-07-06T11:33:26Z", "hours": 0.8419, "text": "The UI was a very wretched default gray, and to be honest, it didn’t look so visually appealing. Mine still isn’t all peaches and cream, but it’s less of a distraction and more of a subtlety in the grand scheme of things. I changed this to a better, harmonizing dark charcoal color that I think goes pretty well with the minimalist design of all-white Orbitals and a pure black background."}, {"post_id": 22825, "ts": "2026-07-05T12:58:40Z", "hours": 0.5425, "text": "Hey, remember the UI I had in earlier? Well, when you change the window size, it just stays hard-coded. If you maximize your window, there’s suddenly a piece of UI that was supposed to help you navigate the simulator that’s in your way. So, I did some math so that the UI is at the perfect top right of any shape and size of the windows you make. It’s a dynamic UI layout, and it’s dynamic enough to survive window resizing. Pretty cool."}, {"post_id": 22811, "ts": "2026-07-05T12:15:42Z", "hours": 1.3161, "text": "Today I added some UI, so we have some actually good interactive elements. We can use sliders to, in real time, update our gravity. And I also added a reset button that basically lets you clean up all the messes and start from a fresh place."}, {"post_id": 22124, "ts": "2026-07-04T12:42:36Z", "hours": 2.3839, "text": "This is not a full devlog. Because I’m typing this on my phone. Came to say that I’m working on adding a minimalistic UI to the project, like small buttons and maybe sliders for mass and color control. Using tkinter, the underlying library in which turtle was built. I don’t have any screenshots with me, so enjoy this photo from my gallery, shot at the beach at night."}, {"post_id": 21435, "ts": "2026-07-03T11:55:53Z", "hours": 3.6731, "text": "Today I added merging. Now, objects that get too close to each other don’t do weird physics-breaking stuff. They intuitively merge into an object with a total mass, total area, and a new velocity depending on the previous velocities. This way, you can actually build complex systems that fall apart in at least an ordered way. There was a slight problem if the objects were going too fast: because of their speed, one frame they would be behind each other and the next frame they would be ahead of each other. I had to do some math to see if the path they took went through the object we were checking. That was a very fun, intuitive piece to work on, and merging now works very intuitively and very well."}, {"post_id": 19114, "ts": "2026-06-30T11:02:05Z", "hours": 1.3767, "text": "Added camera movement with WASD. Now, the objects that run out of your view aren’t lost forever: you can catch up to them with only your keyboard and a few fingers."}, {"post_id": 18601, "ts": "2026-06-29T19:53:31Z", "hours": 2.1206, "text": "I finally added slingshotting! Basically, the planets aren’t hidden in the code itself anymore; they are right at your fingertips. You can spawn planets just by clicking and dragging. It’s that simple. This was a feature I wanted for a very long time, and I’m really satisfied with how it turned out."}, {"post_id": 16991, "ts": "2026-06-27T15:56:02Z", "hours": 0.7453, "text": "Devlog #2 — N-Body Physics Today I implemented dynamic physics and dynamic moving. Basically, before, the move function—the function on a one-millisecond timer that updated everything—was extremely hard-coded. It just used the data of the existing two turtles (the two bodies I made myself), and it definitely wasn’t scalable. So that was what I tackled today. Now, the main function that runs our whole physics simulation is a tad bit less torturous."}, {"post_id": 16363, "ts": "2026-06-26T16:57:58Z", "hours": 2.59, "text": "I’m building Starshell, a 2D astronomical physics simulator in pure Python turtle. No game engine, no physics library—just the standard library, a turtle canvas, and physics and math. The idea in my head is quite simple: I want to simulate how gravity actually works. Bodies with mass attract each other, their paths bend, and orbits merge. Eventually, I want collisions, multi-body chaos, and a UI where you click to place stars and planets. Today’s milestone was the first orbit. To get here, I didn’t just plug in some formulas; I had to build the physics chains from a blank turtle canvas: Distance between two bodies Gravitational force: F = G × (m1 × m2) / r² Direction of that force: atan2(y, x) Force components: splitting into x and y with cos and sin Acceleration: a = F / m Velocity update: adding acceleration each frame Position update: moving the turtle by velocity each frame The orbit isn’t actually hard to code. The planet doesn’t know it’s supposed to go in a circle; I don’t tell it to trace a circle. It just responds to the pull of the star every single frame. The circle is what falls out of the math when the initial velocity is balanced just right. One of the trickiest moments was realizing my gravitational constant (G = 1) made the force so small—around 0.0004—that compared to my velocity of two units per frame, the planet just flew away in a straight line. I couldn’t see any curve at all, let alone an orbit. Cranking the gravity up to something like 1,000 to 1,600 (found by experimentation) made the orbits visible. That moment when the blue dot actually curved and came back around in a full orbit felt very satisfying. Next up, I want multiple bodies that interact with each other, not just a fixed point (aka a star). Follow Along!"}]...
|
Title: Orbital by @Mehmet | Stardance
Devlogs:
I’ Title: Orbital by @Mehmet | Stardance
Devlogs:
I’m building Starshell, a 2D astronomical physics simulator in pure Python turtle. No game engine, no physics library—just the standard library, a turtle canvas, and physics and math. The idea in my head is quite simple: I want to simulate how gravity actually works. Bodies with mass attract each other, their paths bend, and orbits merge. Eventually, I want collisions, multi-body chaos, and a UI where you click to place stars and planets. Today’s milestone was the first orbit. To get here, I didn’t just plug in some formulas; I had to build the physics chains from a blank turtle canvas: Distance between two bodies Gravitational force: F = G × (m1 × m2) / r² Direction of that force: atan2(y, x) Force components: splitting into x and y with cos and sin Acceleration: a = F / m Velocity update: adding acceleration each frame Position update: moving the turtle by velocity each frame The orbit isn’t actually hard to code. The planet doesn’t know it’s supposed to go in a circle; I don’t tell it to trace a circle. It just responds to the pull of the star every single frame. The circle is what falls out of the math when the initial velocity is balanced just right. One of the trickiest moments was realizing my gravitational constant (G = 1) made the force so small—around 0.0004—that compared to my velocity of two units per frame, the planet just flew away in a straight line. I couldn’t see any curve at all, let alone an orbit. Cranking the gravity up to something like 1,000 to 1,600 (found by experimentation) made the orbits visible. That moment when the blue dot actually curved and came back around in a full orbit felt very satisfying. Next up, I want multiple bodies that interact with each other, not just a fixed point (aka a star). Follow Along!
Devlog #2 — N-Body Physics Today I implemented dynamic physics and dynamic moving. Basically, before, the move function—the function on a one-millisecond timer that updated everything—was extremely hard-coded. It just used the data of the existing two turtles (the two bodies I made myself), and it definitely wasn’t scalable. So that was what I tackled today. Now, the main function that runs our whole physics simulation is a tad bit less torturous.
I finally added slingshotting! Basically, the planets aren’t hidden in the code itself anymore; they are right at your fingertips. You can spawn planets just by clicking and dragging. It’s that simple. This was a feature I wanted for a very long time, and I’m really satisfied with how it turned out.
Added camera movement with WASD. Now, the objects that run out of your view aren’t lost forever: you can catch up to them with only your keyboard and a few fingers.
Today I added merging. Now, objects that get too close to each other don’t do weird physics-breaking stuff. They intuitively merge into an object with a total mass, total area, and a new velocity depending on the previous velocities. This way, you can actually build complex systems that fall apart in at least an ordered way. There was a slight problem if the objects were going too fast: because of their speed, one frame they would be behind each other and the next frame they would be ahead of each other. I had to do some math to see if the path they took went through the object we were checking. That was a very fun, intuitive piece to work on, and merging now works very intuitively and very well.
This is not a full devlog. Because I’m typing this on my phone. Came to say that I’m working on adding a minimalistic UI to the project, like small buttons and maybe sliders for mass and color control. Using tkinter, the underlying library in which turtle was built. I don’t have any screenshots with me, so enjoy this photo from my gallery, shot at the beach at night.
Today I added some UI, so we have some actually good interactive elements. We can use sliders to, in real time, update our gravity. And I also added a reset button that basically lets you clean up all the messes and start from a fresh place.
Hey, remember the UI I had in earlier? Well, when you change the window size, it just stays hard-coded. If you maximize your window, there’s suddenly a piece of UI that was supposed to help you navigate the simulator that’s in your way. So, I did some math so that the UI is at the perfect top right of any shape and size of the windows you make. It’s a dynamic UI layout, and it’s dynamic enough to survive window resizing. Pretty cool.
The UI was a very wretched default gray, and to be honest, it didn’t look so visually appealing. Mine still isn’t all peaches and cream, but it’s less of a distraction and more of a subtlety in the grand scheme of things. I changed this to a better, harmonizing dark charcoal color that I think goes pretty well with the minimalist design of all-white Orbitals and a pure black background.
Hey, this is another mini devlog. I just wanted to say that while waiting for my initial ship to get reviewed, I was working on reviewing my current code and remembering how every part interacted. I’m doing this by making a from-scratch.py file where I just try to build the general project from the ground up with my direct understanding and recall of it, without looking at every line of code. This is like a mini side quest in the background so that as the file gets big, I don’t lose where I’m going. Right now, it just has the basic functions like distance and force, and has two Python turtles set to circles with different colors. I’m going to build this from the ground up and really focus on the struggle and pain through the process. I want to maximize my gains from this project this way.
Today I spent all my time on from_scratch.py to really get to understand the physics of it all. Before, I just relied on a few formulas.That’s why I’m going to try and maximize my gains from this project by re-understanding all the logic and trying to write it from scratch, using only my notes and not looking at any AI or code from main.py .It’s going good! I added quite a few functions:- A distance function- A force function- An angle function (all of these take two objects, by the way — I still have the same objs list, which is a list of lists)- A velocity update function called velo_update that takes an object , a force , angle , and mass , and updates the velocities of those objects depending on their forces, angles, and massMaybe I can cut back on mass . I don’t know why I added it, since we can already get it from the objs list with our object parameter. I’ll look into that.I also created the scaffold for an update function, which is going to be the main function . I added screen.ontimer(update, 10) to run it every 10 milliseconds. It’s just the main scaffold for now, but I’m really focusing on the logic of it all.
Actively working on making Orbital (via the from_scratch.py file) more object-oriented. I think OOP (object-oriented programming) will be a great addition to Orbital because we have lots of stuff that can be simplified. These could be new particles, like new planets, and I think grouping everything into classes would be a better way to handle these. Right now, our sling function just does the same thing again and again. A class that could be called any time we want to make a new particle is probably the way to go. I’ll keep you guys updated.
Welcome! Today, I fully migrated to the object-oriented programming architecture. Earlier, the class wasn’t really full OOP; it was just a hidden list factory that appended the stuff via a class instead of doing it manually. I wanted to change that because this is going to be a refactor in an OOP perspective , and that’s what I did.I made sure that all the formulas used the latest changes:1. Earlier, they would use the index of the objects inside the objs list of lists. It would be something like object1 and the index of whichever element it wants to access, like mass , radius , velocity , or coordinates. It was very sloppy, and you had to keep up with what each index meant.2. With an OOP version, you just write object1.mass , object1.x , or object1.vx . Each and every line is more intuitive.I also worked more on the planet spawning . Remember, this is a new file with a different perspective of trying to remake this in an OOP sense, using classes and the benefits that ensue from them.Additionally, today I implemented the balancing of the canvas differences in Tkinter and Turtle :- In Turtle, the (0, 0) coordinate is directly in the middle of the screen .- In Tkinter, it’s at the absolute top left of the screen.You have to make sure that all the formulas and all the logic get the correct version, which in my project is the Turtle version . I added and worked out the logic that would make sure that balance is kept.
Lots of stuff today: Camera movement: I added camera movement to our new refractor. Better version of the sling: The older one just expected you to press, drag, and release without seeing much of an indicator. While that works if you know the program a bit, I think a direct, laser-esque pointer that shows you actively as you’re pressing, dragging, and releasing is more intuitive and easier to work with. So I added that. Now we have intuitive camera movement and intuitive spawning. For this refactor, we won’t have any UI. All the sliders for gravity and mass will be per keyboard or hotkey.
Hey, I added merging, but it’s “merging out of hell” because I made a very unphysically true and crude (if you’d call it that), but working prototype of merge_collisions and the merge function itself. It works as I intended, but not physically truly. Right now, it adds the radii of the circles themselves. If you think about it, that’s physically wrong because there’s a big difference between adding the areas of the circles versus their radii. That’s something I want to get right, so the next time I’m working on it, I’ll make sure to fix it so that we are adding the areas of the circles rather than their radii. I also found a bit of a problem where the merged objects themselves have a shape size of (1, 1). That’s not right because if you merge two objects with shape size 1, you’d expect the new shape size to be 2. Right now, no matter how many objects you merge, it still stays at 1, resulting in a very, very dense circle. I’m going to change that so we add the areas themselves, and have that new, bigger area update the visual representation of those astronomical objects. I’ll keep you guys updated. See you next time.
I fixed the “merging from hell”. The first issue was the radius calculation. When two circles merge, simply adding their radii ( r1 + r2 ) is physically wrong because the combined area grows way too fast. In reality, the area of the circles should add up: A_new = A1 + A2 . By plugging in the area formula π × r² , we get π × r_new² = (π × r1²) + (π × r2²) . The π cancels out completely, leaving r_new = math.sqrt(r1² + r2²) . I updated the collision code with this, and now the combined masses have physically accurate sizes.To make this look right, I also fixed the visual scaling issue. Previously, every particle rendered at shapesize(1, 1) regardless of its actual mass or radius. I changed the instantiator so that a body’s shapesize dynamically scales with its physics radius: self.turt.shapesize(self.radius / 10, self.radius / 10) . Now when objects collide, you can actually see the merged planet grow on the screen.Lastly, I added a quick reset button . Pressing the R key runs a function that loops through the current objects, hides all their turtles to prevent visual ghosts, clears the main objects list, resets the camera back to center coordinates, and spawns a fresh central star
I made some more intuitive user changes: Slingshot Dampening: Now, the slingshot isn’t like an Angry Bird slingshot that propels your particles to the other side of the universe (though you could do that if you want, just open the code). All the slingshot coordinates and values are now multiplied by 0.2. We’re nerfing it a lot, but it seems more intuitive that way. Since you don’t know it’s nerfed, you won’t notice there is a higher capacity. In our case, a higher capacity actually means friction. Don’t get me wrong: it’s not particle friction, because they go super fast. It’s friction when trying to get orbits to work. Repository Tweaks: Calling the script from_scratch.py was killing me, so I found something simpler: orbital.py. It’s much better. I updated the GitHub repository so that the current release is orbital.py (the refactored version). While main.py (the previous version) has a few more features right now, orbital.py is much cleaner. Main.py was more of a learning run, and I feel like I’m bringing my A-game with this new refactor. Look and Feel: I really liked the black background and white orbitals of the previous main.py version, so I changed the clinical-seeming style of from_scratch.py. I scrapped that look and made sure the new orbital.py has some taste.
Today I added zooming that works with scrolling up and scrolling down appropriately: when you scroll down, everything gets smaller, and when you scroll up, everything gets bigger. Mass and gravity, of course, stay the same. I made sure that the sling function (basically spawning new orbitals) works flawlessly. Our aim function—which draws that mini press-and-drag indicator to make it easier to see where you are spawning orbitals—is also working with both camera differentiation and zoom differentiation. This way, you can zoom all the way out and still spawn orbitals in the correct way, or zoom all the way in and spawn them super close up. All the physics and rendering works beautifully.
Added some instructions to make it easier, added more colors, and I’m now working on making more rigorous merge logic.
I finally got the complex merging done. Before, when an orbital was going too fast, one frame it was at the back of another orbital, and the next frame, it was in front of it. Since its velocity was so high, the radii didn’t ever collide, so it just went through other ones without merging. That was really not acceptable, so I worked a lot on making sure it works. How I did it is actually very interesting: Get the starting position of the moving object and its ending position on the next frame. Get the coordinates of the target object you want to check for a potential merge. Draw a line from where the moving object started to where it ended, and check if the target object is intersecting that line (calculating what percentage along that line the checked object sits). If it intersects, you merge them.
Added a background grid so that you get a sense of spatial bigness and tininess. You get a feel for how big and small your orbitals really are.
Today I changed the title card of the window that pops up. A few other updates: • I tweaked the final game feel a bit. • I made the initial spawning star spawn in a sort of light yellow color, and I also added that light yellow color to the colors list. • I made sure that the window of the simulation is also in dark mode, so you get more encapsulated in it.
A few cleanups on the size of the grid.
I updated the project. I was notified that it initially crashed on macOS, and the arrow keys were a bit janky on macOS as well. All of that has been completely fixed, and I’ve updated the readme and the latest code on GitHub to encompass those changes.
Ships:
Initial Ship Update (v1.0.0) What did I make? I built Orbital , a 2D gravitational physics sandbox created entirely in Python using only standard library modules ( turtle and tkinter ). Orbits are not hardcoded; they emerge dynamically from Newton’s Law of Universal Gravitation calculated between every single body frame-by-frame. You can interactively slingshot planets into orbit, pan a camera infinitely around the universe using WASD or Arrow keys, adjust the laws of physics on the fly using a Tkinter-based HUD, and watch planets collide and merge under the conservation of momentum. What was challenging? The Coordinates Separation: Early on, a planet’s physics position was its drawing position. To build a panning camera, I had to decouple them—creating a 9-element list structure to track world coordinates privately while subtracting camera offsets only for rendering. The “Tunneling” Bug: Fast slingshotted planets would frequently phase straight through the central star between frames. I solved this by implementing Continuous Collision Detection (CCD)—using vector dot-product projection to check if the line segment traveled during a frame intersected the star. Singularity Prevention: As merging planets got infinitesimally close, the gravity force equation approached divide-by-zero, creating infinite force that would sling bodies off screen at lightspeed. I had to write custom logic to disable gravity between two bodies the exact frame they overlap. A Responsive HUD: Nesting Tkinter widgets on a Turtle ScrolledCanvas caused nesting errors. I resolved this by passing the raw screen._root as the parent, and binding the canvas <Configure> event to dynamically slide the widgets so they stay pinned to the top-right corner when resizing. What am I proud of? Conserving Density: When two bodies merge, the new object’s size is calculated using sqrt(r1² + r2²) rather than just adding the radii. This ensures area is conserved, keeping physical density mathematically consistent. Conservation of Momentum: If you launch two equal-mass planets head-on at the same speed, they will perfectly cancel out and stop dead in space upon impact, exactly as real-world physics dictates. What should people know so they can test my project? Slingshot: Click, drag, and release to fling planets into the cosmos. HUD Controls: Adjust the Gravity slider to warp orbits in real-time, and slide the Mass slider to change the size and weight of the next planet you launch. Color Picker: Click the color button to cycle the launching color (the button text dynamically updates to show what is selected). Navigation: Use WASD or Arrow keys to pan the camera around. Rebuilding: Press the Reset button to wipe the board and start a clean universe. No Python installed? Zero-dependency, standalone executables for Windows , macOS , and Linux are automatically built and attached directly to the GitHub Release!
I built Orbital, the all-in-one project that encompasses whatever you need from a 2D astronomical simulator. When first loading it up, a window titled “Orbital” pops up, and you will see a star right at the center. You can change the window dimensions however you would like, whether fullscreen or resized small. This is where the fun starts: I spent tireless hours implementing a slingshot mechanism where you can intuitively and easily launch “orbitals,” as I like to call them. You can think of these as small planets that you can send to orbit around each other and around bigger stars, masses, and objects that you create yourself. The starting star is just to get you going. Controls and Features: • Navigation: Use the WASD keys and/or arrow keys to navigate around this 2D world and find different orbits across the gigantic canvas. It does not have an end (unless you spend 10 hours of unemployment trying to find it, but I am sure you are not that stubborn). • Mass Adjustment: Use the plus (+) and minus (-) keys to change the mass of the objects you throw into the simulation. • Physics: It runs on full n-body physics; nothing is hard-coded and everything is dynamic. No matter how quirky and interesting your orbits are, they will be solely and originally yours. • Visuals: The colors change up every once in a while. I really tried to make it as minimalist and physics-identifying as possible. • Reset: Press the R key on your keyboard to reset the world and start from a fresh universe, marked by the reset star that kickstarts everything again. I am really proud of the n-body physics because it was surprisingly manageable and cool to work on. Where I really struggled was on advanced merging. Normally, if objects are touching, you can simply merge them. But when objects move super fast, one frame they are far away, and by the next frame, high velocity math teleports them right past or into the other object. If you slingshot a planet relatively fast, it could easily glitch and teleport through objects. To fix this, I had to calculate whether the path the object took from frame 0 to frame 1 intersected any other objects along its trajectory. That was an especially hard, albeit depressing challenge, but nevertheless, it was encountered and defeated so you could enjoy astronomical bliss. Thank you!...
|
1793721067.7232769
|
1793807467.7232769
|
|
10109
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1792943466.921827
|
1793807466.921827
|