|
52163
|
ThirdView by @shivakaushal | Stardance
|
shivakaushal
|
1
|
16.29
|
39
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T11:57:29Z", "hours": 6.0, "multiplier": 6.82, "payout": 39, "blessing": "neutral", "text": "I made ThirdView - you type a description of a scene and it jumps straight to that moment in a video, instead of scrubbing through the timeline forever. It runs fully in the browser using CLIP through Transformer.js, no uploads, no server. The hard part was getting an actual ML model to run smoothly with zero backend, plus CLIP wasn’t built for video, so figuring out how often to sample frames took a lot of trial and error. What we’re proud of is that it just works fully private, fully free, and it actually fixes something that annoys us every single time we watch something not together, without turning into some bloated overengineered app.", "repo": "https://github.com/ThisShivaKaushal/ThirdView-Max", "demo": ""}]...
|
[{"post_id": 71013, "ts": "202 [{"post_id": 71013, "ts": "2026-09-20T06:28:36Z", "hours": 0.9111, "text": "I have changed the UI, and some elements are hidden, because when we upload video then it appears. And now I’m going to write the logic(Javascript), i’m too fast because I have already made it, so basic things don’t take much time, but now i’m going to work on logic, and i also have to add some more features, so i think it usually takes 3-4 hours, and then the projects will get completed."}, {"post_id": 70990, "ts": "2026-09-20T05:14:27Z", "hours": 0.4422, "text": "HTML is completed, now I have to style it, and have to make the logic. Because our project is completely base on logic, so the javascript will be too long. Nd i also suffer sometimes with making logic, and let see what happen:D"}, {"post_id": 70487, "ts": "2026-09-19T08:41:14Z", "hours": 2.0139, "text": "Hey Everyone, I’m going to continue my ThirdView project again but this time, its name will be Thirdview Max, because it is the updated version, so. Now, you can also see the old version at github, which is at another repo. But Thirdview Max have more and extra feature then Thirdview, now it can give accurate result, but in past I said that it also have feature, by which you can just paste link, nd find the part. But because, i have to fetch the video in .mp4 first, which is difficult part, I tried, but i failed. That’s why I decided to skip this feature. and the main things, the Ui is going to completely change."}, {"post_id": 58121, "ts": "2026-08-30T13:56:28Z", "hours": 0.5769, "text": "#Devlog:6 of #Ship:2 I have made these files, but now my logic has hit a limitation because YouTube doesn’t allow frame extraction. To solve this, we are using a public API which helps a lot with YouTube search. I use yt-dlp to resolve the YouTube URL, specifically using an Invidious public API. I know it might get shut down sometimes by YouTube, but what can we do? I will use my own yt-dlp backend to get a CORS-friendly video stream. By doing this, we can access the YouTube video as a .mp4 file, which allows us to extract frames. Let’s see if it works perfectly or not. However, my own backend will work for only 7 days because it is an open-source project."}, {"post_id": 58009, "ts": "2026-08-30T10:54:52Z", "hours": 2.6042, "text": "#Devlog:5 of #Ship:2 I have made my UI, and now I have to write the logic. The best part is that I have messed up my style.css file. I want to improve it more, but I got confused with my colors. I gave names to the colors, but in the end, I could not understand my own color pattern or what I had decided to use each color for. By the way, I think the UI looks good. Now, let’s talk about the UI features: I have made the header sticky and also added a blur effect to it. Instead of taking YouTube’s color palette, I used a popular palette from coolors.co because I liked it at first sight. You can see the UI below."}, {"post_id": 57238, "ts": "2026-08-29T10:45:40Z", "hours": 0.9719, "text": "#Devlog:4 of #Ship:2 I have made the HTML, and now I’m working on the CSS. I am making the UI look good. By the way, I think I have done only 30-40% of the CSS, and I think I’ll try to complete it today. Then, I’ll start focusing on the logic, like JavaScript, because it is our main stuff. I’d take inspiration from YouTube, like using YouTube’s color palette, and the structure is like the old one."}, {"post_id": 57189, "ts": "2026-08-29T09:24:01Z", "hours": 0.2992, "text": "#Devlog:3 of #Ship:2 I have just put my real hosted website into maintenance mode. Normally, if I push code to GitHub, Vercel automatically hosts the new version. If someone visits suddenly during that time, they might think the website has a code error. That’s why I created a vercel.json file a week ago and now pushed it to GitHub. Now, I can continuously make changes for a while without any tension related to the main website, because it always shows that it is in maintenance."}, {"post_id": 57145, "ts": "2026-08-29T07:49:32Z", "hours": 0.5208, "text": "#Devlog:2 of #Ship:2 I have implemented two things: 1.Now you can paste the link of a YouTube video and it will help you find the timestamp. Although I have just created the HTML, this time I didn’t have an idea of how I will grab the frames. By the way, I think I’ll try to download the video in low quality, and then grab the frames. If anyone has any ideas, just let me know, or I’ll try to serch and understand an easier way. 2. I have implemented a new model (Audio Model). In the Shipwright review video, I saw that the reviewer typed “MrBeast saying ‘Red Light,’” and my website at that time was only able to search through visuals. But now it can walk through the vocal parts. It converts the video’s audio into text, and then it will match the query. But here’s an error: we can’t check the query’s exact result matching percentage, and it may create some problems. By the way, when you search, it has two options like @visual and @vocal . So when you select one, it only runs that one model. But if you have added say or said, then it also runs both things simultaneously. If you only put one thing, then it runs one model only, so it saves memory and works fast. But let’s suppose you didn’t select either one; then for accurate results, it runs both models."}, {"post_id": 57108, "ts": "2026-08-29T06:36:15Z", "hours": 0.7319, "text": "#Devlog:1 of #Ship:2 Hi guys, when I shipped my first project, 2-3 people said that I used AI. I really did use it, but in different ways, and now I am also feeling ashamed of myself. Why? Because that was my first project, and my manner of writing code is not good, I even dn’t like what I write myself. That’s why I used AI by giving it my own code and tellng it to make it professional, understandable, and much more. That was my mistake, but now after searching a lot, I understand it didn’t matter. So now I am going to write this project again with some more features, and mainly the UI, which looked very cheap (and I know people were also saying it is AI—by the way, I took color decisions from AI). But now, instead of asking any AI out of fear of making mistakes, that fear has gone, and I am going to design everything by myself. However, my JavaScript is a little bit weak, so I am gong to use AI for learning purposes, but now I will upload the raw code that I write. By the way, the new feature will contain a YouTube video link."}, {"post_id": 53602, "ts": "2026-08-24T07:22:10Z", "hours": 0.7489, "text": "Another new feature, I copied it from Github, because I have used it many time."}, {"post_id": 53591, "ts": "2026-08-24T06:28:53Z", "hours": 0.47, "text": "I built the Thirdview project, but after shipping it, I received requests to make the design more appealing. I didn’t love the original look either, so I am redesigning the UI and adding more color. By the way, I am also working on a new feature—see if you can guess what it is!"}, {"post_id": 52890, "ts": "2026-08-23T08:37:28Z", "hours": 0.9194, "text": "Guys, I was suffering from a problem. When my friends and I watch any movies or something else, mostly anime, then we surely find a scene where me and my boys melt. And when we meet physically, we have to tell each other about that. And this is the most time-consuming part. My one friend who doesn’t even know the episode, then how can we think he will remember the timestamp? That’s why, by the way, I’m also like my friend. That’s why I built this app. It means you just have to upload the videos and then tell about the scene, like, “the main character, who wears yellow clothes, is beating the man,” and you will get the timestamp without any problem. Now, my friends and I don’t have to waste more than 30 minutes for just a 10- to 15-second clip in a one-hour episode. Maybe we can get the correct timestamp in just two or three minutes. Hold a minute. If you are lucky, then you might get the correct timestamp randomly. But I know our and your luck are not that great. And it’s just HTML, CSS, and JavaScript. By the way, let me tell you how it is working. For this, you can read the README.md. For the trial, you can visit thirdview.vercel.app. By the way, for most people, it is just extra storage. But for me, this is my first project, such a great project I made. Bye-bye. Just visit the repo. Oh, and it completely works locally, means in the browser, but it’s not connected to the cloud. That’s why it may be slow. I have just host my project on Vercel, and I will ship this project today after making a show video."}, {"post_id": 52402, "ts": "2026-08-22T15:03:55Z", "hours": 4.8003, "text": "My first project is almost ready to ship! I can’t wait to show you guys. It’s just HTML, CSS, and JavaScript, but it solves a really annoying problem in our friend group. I’ll try to publish it tomorrow. Bye for now!"}]...
|
Title: ThirdView by @shivakaushal | Stardance
Dev Title: ThirdView by @shivakaushal | Stardance
Devlogs:
My first project is almost ready to ship! I can’t wait to show you guys. It’s just HTML, CSS, and JavaScript, but it solves a really annoying problem in our friend group. I’ll try to publish it tomorrow. Bye for now!
Guys, I was suffering from a problem. When my friends and I watch any movies or something else, mostly anime, then we surely find a scene where me and my boys melt. And when we meet physically, we have to tell each other about that. And this is the most time-consuming part. My one friend who doesn’t even know the episode, then how can we think he will remember the timestamp? That’s why, by the way, I’m also like my friend. That’s why I built this app. It means you just have to upload the videos and then tell about the scene, like, “the main character, who wears yellow clothes, is beating the man,” and you will get the timestamp without any problem. Now, my friends and I don’t have to waste more than 30 minutes for just a 10- to 15-second clip in a one-hour episode. Maybe we can get the correct timestamp in just two or three minutes. Hold a minute. If you are lucky, then you might get the correct timestamp randomly. But I know our and your luck are not that great. And it’s just HTML, CSS, and JavaScript. By the way, let me tell you how it is working. For this, you can read the README.md. For the trial, you can visit thirdview.vercel.app. By the way, for most people, it is just extra storage. But for me, this is my first project, such a great project I made. Bye-bye. Just visit the repo. Oh, and it completely works locally, means in the browser, but it’s not connected to the cloud. That’s why it may be slow. I have just host my project on Vercel, and I will ship this project today after making a show video.
I built the Thirdview project, but after shipping it, I received requests to make the design more appealing. I didn’t love the original look either, so I am redesigning the UI and adding more color. By the way, I am also working on a new feature—see if you can guess what it is!
Another new feature, I copied it from Github, because I have used it many time.
#Devlog:1 of #Ship:2 Hi guys, when I shipped my first project, 2-3 people said that I used AI. I really did use it, but in different ways, and now I am also feeling ashamed of myself. Why? Because that was my first project, and my manner of writing code is not good, I even dn’t like what I write myself. That’s why I used AI by giving it my own code and tellng it to make it professional, understandable, and much more. That was my mistake, but now after searching a lot, I understand it didn’t matter. So now I am going to write this project again with some more features, and mainly the UI, which looked very cheap (and I know people were also saying it is AI—by the way, I took color decisions from AI). But now, instead of asking any AI out of fear of making mistakes, that fear has gone, and I am going to design everything by myself. However, my JavaScript is a little bit weak, so I am gong to use AI for learning purposes, but now I will upload the raw code that I write. By the way, the new feature will contain a YouTube video link.
#Devlog:2 of #Ship:2 I have implemented two things: 1.Now you can paste the link of a YouTube video and it will help you find the timestamp. Although I have just created the HTML, this time I didn’t have an idea of how I will grab the frames. By the way, I think I’ll try to download the video in low quality, and then grab the frames. If anyone has any ideas, just let me know, or I’ll try to serch and understand an easier way. 2. I have implemented a new model (Audio Model). In the Shipwright review video, I saw that the reviewer typed “MrBeast saying ‘Red Light,’” and my website at that time was only able to search through visuals. But now it can walk through the vocal parts. It converts the video’s audio into text, and then it will match the query. But here’s an error: we can’t check the query’s exact result matching percentage, and it may create some problems. By the way, when you search, it has two options like @visual and @vocal . So when you select one, it only runs that one model. But if you have added say or said, then it also runs both things simultaneously. If you only put one thing, then it runs one model only, so it saves memory and works fast. But let’s suppose you didn’t select either one; then for accurate results, it runs both models.
#Devlog:3 of #Ship:2 I have just put my real hosted website into maintenance mode. Normally, if I push code to GitHub, Vercel automatically hosts the new version. If someone visits suddenly during that time, they might think the website has a code error. That’s why I created a vercel.json file a week ago and now pushed it to GitHub. Now, I can continuously make changes for a while without any tension related to the main website, because it always shows that it is in maintenance.
#Devlog:4 of #Ship:2 I have made the HTML, and now I’m working on the CSS. I am making the UI look good. By the way, I think I have done only 30-40% of the CSS, and I think I’ll try to complete it today. Then, I’ll start focusing on the logic, like JavaScript, because it is our main stuff. I’d take inspiration from YouTube, like using YouTube’s color palette, and the structure is like the old one.
#Devlog:5 of #Ship:2 I have made my UI, and now I have to write the logic. The best part is that I have messed up my style.css file. I want to improve it more, but I got confused with my colors. I gave names to the colors, but in the end, I could not understand my own color pattern or what I had decided to use each color for. By the way, I think the UI looks good. Now, let’s talk about the UI features: I have made the header sticky and also added a blur effect to it. Instead of taking YouTube’s color palette, I used a popular palette from coolors.co because I liked it at first sight. You can see the UI below.
#Devlog:6 of #Ship:2 I have made these files, but now my logic has hit a limitation because YouTube doesn’t allow frame extraction. To solve this, we are using a public API which helps a lot with YouTube search. I use yt-dlp to resolve the YouTube URL, specifically using an Invidious public API. I know it might get shut down sometimes by YouTube, but what can we do? I will use my own yt-dlp backend to get a CORS-friendly video stream. By doing this, we can access the YouTube video as a .mp4 file, which allows us to extract frames. Let’s see if it works perfectly or not. However, my own backend will work for only 7 days because it is an open-source project.
Hey Everyone, I’m going to continue my ThirdView project again but this time, its name will be Thirdview Max, because it is the updated version, so. Now, you can also see the old version at github, which is at another repo. But Thirdview Max have more and extra feature then Thirdview, now it can give accurate result, but in past I said that it also have feature, by which you can just paste link, nd find the part. But because, i have to fetch the video in .mp4 first, which is difficult part, I tried, but i failed. That’s why I decided to skip this feature. and the main things, the Ui is going to completely change.
HTML is completed, now I have to style it, and have to make the logic. Because our project is completely base on logic, so the javascript will be too long. Nd i also suffer sometimes with making logic, and let see what happen:D
I have changed the UI, and some elements are hidden, because when we upload video then it appears. And now I’m going to write the logic(Javascript), i’m too fast because I have already made it, so basic things don’t take much time, but now i’m going to work on logic, and i also have to add some more features, so i think it usually takes 3-4 hours, and then the projects will get completed.
Ships:
I made ThirdView - you type a description of a scene and it jumps straight to that moment in a video, instead of scrubbing through the timeline forever. It runs fully in the browser using CLIP through Transformer.js, no uploads, no server. The hard part was getting an actual ML model to run smoothly with zero backend, plus CLIP wasn’t built for video, so figuring out how often to sample frames took a lot of trial and error. What we’re proud of is that it just works fully private, fully free, and it actually fixes something that annoys us every single time we watch something not together, without turning into some bloated overengineered app....
|
1793407968.4340563
|
1793494368.4340563
|
|
44945
|
Short Frog Game by @jl1 | Stardance
|
jl1
|
1
|
10.0
|
44
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T11:57:08Z", "hours": 10.0, "multiplier": 4.51, "payout": 44, "blessing": "neutral", "text": "Finally finished my short platformer game about a frog who collets stars through sticking its tongue and swinging.", "repo": "https://github.com/psalmsfr/Short-Frog-Game", "demo": "https://sirvant.itch.io/short-frog-game"}]...
|
[{"post_id": 52915, "ts": "202 [{"post_id": 52915, "ts": "2026-08-23T09:17:41Z", "hours": 9.68, "text": "Just finished my game!"}]...
|
Title: Short Frog Game by @jl1 | Stardance
Devlog Title: Short Frog Game by @jl1 | Stardance
Devlogs:
Just finished my game!
Ships:
Finally finished my short platformer game about a frog who collets stars through sticking its tongue and swinging....
|
1793458270.8959603
|
1793544670.8959603
|
|
40484
|
RaidenScript by @RaidenTechnology | Stardance
|
RaidenTechnology
|
2
|
58.97
|
231
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T11:46:51Z", "hours": 31.0, "multiplier": 10.41, "payout": 104, "blessing": "neutral", "text": "RaidenScript v0.2 Update I wrote RaidenScript (RS) from scratch in C++20 as a small embeddable scripting language. In Ship #1 I had it running in three hosts. Since then I gave it a browser you can try it in, and I turned the Minecraft host into a real game running on a live server. I put the language in a browser. I compiled the C API to WebAssembly, served it from GitHub Pages, and wrote an editor with a Run button and four example programs: raidentechnology.github.io/raidenscript. I send nothing to a server; the page is the interpreter. I stopped treating the Minecraft host as a demo. I wrote 144 commits on it since the last devlog, and I keep the rules out of Java entirely: they sit in one .rai file the server loads at boot and reloads while players are online. I wrote a whole farming layer as script rules. Every crop got its own tool with its own level and rarity ladder, and I added tool enchants, XP bottles, an upgrade bench, and a 20 minute contest with medals and a shop of its own. I added pests. Twelve species, a spawn engine I tied to whatever crop is planted, a five-tier vacuum to kill them with, and a loot table I hooked into the same farming-luck stat every other system reads. I built a garden around it: 8 plots, a regeneration engine that rebuilds 13 farm patterns, 76 visitor NPCs I gave 53 signed skins, and a copper economy I priced off the live Bazaar API instead of numbers I made up. I added one host primitive, taslakModel, and let the script choose the model an item wears. Adding an item is now a script edit and nothing else. I fixed three bugs the live server found and no test of mine would have. An item-identity gate was cancelling every right click unconditionally, so the grappling hook silently never fired. The area hoe was catching its own synthetic event and moving the stack twice. And one wrong price in a shop table was failing the entire script at boot. Why did I do it like this? Because I think a language is judged by what runs on it, not by its grammar. The strongest thing I can say about my embedding API is that a 10,000 line ruleset runs on it every night, on a real server, with real players. Because I lose reviewers at the install wall. For Ship #1 I asked people to clone a repo and build it with MinGW. Now I ask for one click, and I am handing them the same interpreter, not a simplified twin. Because every rule I move out of Java is a rule I can change without a restart. I left no compile step in the script layer, so /rai reload changes the balance of a live game between two swings of a sword. Because item models were the last thing still forcing me into Java. I closed that hole, and I now keep the Java side as infrastructure only: it knows how to talk to the server and nothing about what the game is. Because I wanted the contest, the pests and the visitor queue to stress the C boundary. I pass numbers in the array and let strings travel beside it, and not one of these systems made me widen that contract. Because a bug a player hits at 2 AM is worth more to me than a bug I find in my own suite. All three above came from the server. Source (MIT): github.com/RaidenTechnology/raidenscript", "repo": "https://github.com/RaidenTechnology/raidenscript", "demo": "https://raidentechnology.github.io/raidenscript/"}, {"ship_num": 2, "ts": "2026-07-28T10:10:56Z", "hours": 7.0, "multiplier": 17.73, "payout": 127, "blessing": "neutral", "text": "RaidenScript v0.1 — an embeddable scripting language written from scratch in C++20. WHAT IT IS A small language (29 keywords) with Python’s readability and JavaScript’s runtime model, built to go inside another program and make it scriptable. The same interpreter runs in three hosts, and each one has a working demo in the repo: Terminal — native binary, “rai program.rai”, plus a REPL Browser — C API compiled to WebAssembly, running an animated store page JVM — C API through JNI, running a Paper Minecraft plugin The demo link is my shipped game STAR BREAKER: one of its weapons is not defined in the game at all, it is a RaidenScript file the game loads and runs through the WebAssembly build. WHAT IS IN IT Lexer, parser, resolver, tree-walking interpreter and REPL, all hand-written; no parser generator, no dependencies. 16 example programs that double as the regression suite, 20 C API checks, 7 WebAssembly checks, zero compiler warnings. A recursion-depth guard so a runaway script raises a catchable error instead of killing the host process — verified separately on native, wasm and the JVM. The cover image was computed pixel by pixel by a RaidenScript program (demo/kapak/kapak-ascii.rai) — no graphics library, in the program or in the language. HOW TO TRY IT git clone, then “make” (w64devkit/MinGW on Windows, gcc elsewhere), then “rai examples/01-temeller.rai”, or just “rai” for the REPL. The README is a full manual: language guide, standard library, embedding walkthrough. Known limits are written down there rather than hidden: an exception escaping a host function leaks stack, string += is quadratic, and a script returning a string to rs_call still yields 0. AI SPLIT The design of the language and its core — lexer, parser, resolver, interpreter, REPL, C API, string channel — is mine and was written by me. The host bindings, the demo apps, and this week’s seven interpreter bug fixes are AI-written from my designs and my audit. Logged hours are my editor time only. Source (MIT): github.com/RaidenTechnology/raidenscript", "repo": "https://github.com/RaidenTechnology/raidenscript", "demo": "https://raidentechnology.github.io/raidenscript/"}]...
|
[{"post_id": 53014, "ts": "202 [{"post_id": 53014, "ts": "2026-08-23T12:15:50Z", "hours": 20.9703, "text": "RaidenScript: the cover is a program, not a picture I gave the project a red and black cover, and I did it without opening an image editor. The cover generator is a RaidenScript program that prints a plain PPM to stdout, so I changed the palette in the script and ran it again: three radial glows, a faint grid, a vertical gradient on the bolt, and a 5x7 bitmap font that is data inside the file, not a system font. It computes 315,000 pixels in 43 seconds. That is my tree-walking interpreter doing arithmetic in a while loop, with no graphics library in the program and none in the language. My first render was wrong and I had to say so. The old cover put a turquoise bolt on a violet field, so the contrast came from hue. In red on red there is no hue left to lean on, and the bolt sank into the background. I cut the background glow to a third and pushed the bolt to a near-white core, so the contrast now comes from brightness. I cleaned the repository behind it. My README still linked to SPEC.md and WORKLOG.md after I deleted them, so anyone cloning it hit two dead links on the front page. I removed those links and rewrote the root README and two demo READMEs without tables. Why did I do it like this? Because a cover drawn in an image editor says nothing about my language, and a cover computed by it is the smallest honest benchmark I own. If the language cannot fill 315,000 pixels, I want to know that before someone else finds out. Because 43 seconds is a real number and I am not hiding it. It is fine for a cover I render once, and it is exactly why a bytecode VM sits on my roadmap instead of being marked done. Because a README that points at files I deleted is a promise I broke to whoever clones the repo, and that is the first thing a reviewer sees."}, {"post_id": 46568, "ts": "2026-08-13T21:53:11Z", "hours": 30.61, "text": "The loop that fixes the language is written in the language Since the last devlog the work split in two: a development loop that RaidenScript now drives itself, and a repository that finally stopped mixing the language with a game server. selfdev - the decision logic is a .rai file tools/selfdev.rai holds the loop’s rules: pick an area nobody touched last round, run the build, read the log, call the pass green or red, append its own entry to a round journal. Under it sits tools/rsdev.cpp, a sys.* host built on the same C API the browser game and the Minecraft plugin already use. The language had three hosts. The fourth one is its own toolchain. Pass 2 taught it what not to trust. tools/selfdev-build.cmd reported EXIT=0 for a run that failed to link. The cause is not in the language at all: exit /b inside a ( … ) » log 2>&1 block does not end a .cmd script, so control falls through to the final exit /b 0. A loop whose whole contract is “exit 0 means green” can commit on red - and it did once, on stale .o files. The rule now is read the log, not the exit code, and it is written in capitals at the top of SELFDEV-NOTES.md because I expect to forget it. What the passes actually fixed String building was quadratic. At 60,000 pieces: s += x took 1879 ms, s = s + x took 2382 ms, against a list.push + join baseline of 54 ms - 35x and 44x. Strings stay immutable (SPEC section 2), the fix is ownership: when the slot is the only owner, append in place. Both forms now run in about 25 ms. The indexed form d[k] += x was a separate code path and stayed quadratic after the first fix, so it took a second pass to catch. The measurement size was part of the test. At 24,000 pieces the s = s + x check passed green: 288 KB fits in L2 and quadratic copying looks cheap in cache. At 60,000 (720 KB) both went red. f-strings could not hold a quoted string inside an interpolation, although SPEC 9/3 said they could. f”{sys.read(“a.txt”)}” was a syntax error. The spec was right and the parser was wrong. A blank line in a CRLF file closed a block early. The lone \\r counted as content - the kind of bug that only shows up on someone else’s machine. Two C API bugs: rs_call could return an empty error message, and a nested rs_call corrupted the string channel of the outer primitive. The JVM bridge silently collapsed an int-returning host primitive to 0. Silent zeros are the worst class: the plugin keeps running and the numbers are simply wrong. 68 C API checks green, zero compiler warnings, sanitizer run clean. 29 keywords, still capped at 30. No C API signature changed. The branch split 227 commits had piled up unpushed and 216 of them were the Minecraft plugin demo. I reset main to origin, cherry-picked only the 13 language and tooling commits, and left the rest on its own branch. main is the language. Nothing else goes there. Most of the time logged on this project since the last devlog went into that plugin demo - the JVM binding exercised against a real server - and that branch is not on GitHub yet. The language fixes above came out of the unattended loop.I read every pass and hand-picked what entered main. The design, the spec and the original src/ are mine. Logged hours are my editor time only."}, {"post_id": 36295, "ts": "2026-07-28T09:44:35Z", "hours": 0.5578, "text": "Seven bugs, and the ones that were never reachable Last devlog promised a depth counter for the crash that hit all three hosts. I built it, then kept reading instead of building, and the audit found six more. THE COUNTER A script that recurses too deep does not raise an error. It kills the process. On a Minecraft server that means every player drops and the log has not one line about it - no Java exception, no hs_err file, exit code 127. The tempting fix is a bigger stack, but that only moves the wall: with -Xss16m the JVM dies at ~5000 frames instead of ~500, the same way. So the interpreter counts instead. Every script call goes through one function, and past the limit it raises an ordinary Error - catchable with try/catch, readable through rs_last_error. Picking the number mattered more than writing it. My notes said “4000”, my measurements said that was useless: native and wasm hit the wall near 1000 frames, a default JVM thread at ~500, because each script frame costs about 1.7 KB of native stack. A limit above the wall protects nobody. So: 800, and the JNI bridge drops it to 400 because it knows what stack it stands on. The counter also has to be restored no matter HOW a call exits - return, return signal, or exception. My restore lines covered two of those three paths; a destructor covers all three and cannot be forgotten. A CRASH ANY SCRIPT COULD TRIGGER \"a,b\".split(5) That was enough to kill the host. split assumed its argument was a string, dereferenced a checked cast without checking it, and got a null pointer. Eight builtins had the same line copied into them. In a standalone language that is a segfault. In an embedded one, any script author can take down the server with a typo. It is now a type error naming the method. OPERATORS THAT WERE NEVER REACHABLE The lexer produced tokens for & | ^ « ». The interpreter had the arithmetic for all five. Every test passed. But no rule in the parser ever read those tokens, so “flags & 4” got “expression expected, found ‘&’”, and the code in the other two layers had never once run. Three layers agreeing on a feature is not the same as three layers connected by it. The fix was four precedence levels, ordered like Python and C - no new keywords, so the language stays at 29 of 30. THE SMALL ONES throw Error(“amount missing”) reached the host as “”: the CLI path pulled out the message field, the embedding path did not. 2 ** 64 wrapped silently to 0. 1 « 64 was undefined behaviour - on x86 the CPU takes the shift count modulo 64, so it quietly evaluates to 1. And an exception thrown from a single-expression lambda left the interpreter in the lambda’s scope, so the catch block ran against the wrong variables. WHERE IT STANDS The C API suite is 20 checks now, five written for these bugs; the wasm suite 7; 11 examples still run; zero warnings. The guard is verified on native, wasm and JNI separately, and in each one the process was still alive after the limit was hit. Three problems stay open, in the README rather than hidden: an exception escaping a host function leaks stack, string += is quadratic, and a script returning a string to rs_call still yields 0. ON THE AI SPLIT This changes what I said last time, so I am saying it plainly. Until now AI had not touched src/. This round it did: I asked it to audit the interpreter and fix what it found, and the C++ in these seven fixes is AI-written from that audit. The language itself - lexer, parser, resolver, interpreter, REPL, C API, string channel - is still my design and was written by me. Host bindings and demo apps were already AI-written from my designs, as I said last devlog. Logged hours are my editor time only."}, {"post_id": 36104, "ts": "2026-07-27T23:51:06Z", "hours": 3.3964, "text": "One interpreter, three hosts Last devlog my language could define a weapon in my shipped game. Since then it left the browser too, and the way out taught me more than the way in. STRINGS WITHOUT LYING ABOUT NUMBERS The C boundary only carried doubles. That was a deliberate choice: a number is copied, so nobody has to ask who owns it. Then I tried to write a bank UI and stopped in the first ten minutes. An IBAN is text. An error message is text. The tempting fix is to pass a handle: “this double is really an index into a string table”. I did not do it. A contract like that is invisible, and the first time somebody misreads it the program moves the wrong money without a warning. So strings travel BESIDE the numbers instead of inside them. args[] did not change by a single byte, rs_host_fn kept its signature, and my already-shipped game’s bridge kept working untouched. Text is pulled by the script, not pushed by the host: script: iban = ui.input(\"iban\") host : reads the field name, returns the value THE 64 KILOBYTE FLOOR Then I asked whether the language could drive an animated web page, and measured instead of guessing. 490,000 host calls per second. 200 elements updated twice each = 1.45 ms, nine percent of a frame. Fine. What was not fine: recursion died at depth 130. Not with an error - with memory corruption. After it, the whole WebAssembly module was dead; I could not even open a fresh VM on it. Emscripten’s default stack is 64 KB, and a tree-walking interpreter spends several C++ frames per script frame. Adding -sSTACK_SIZE=8MB moved the safe depth past 1000 and turned overflow into a catchable error. Cost: the .wasm grew by three bytes. Then a worse one. If a host function throws, the exception unwinds through the interpreter’s frames without restoring the stack pointer, and that space never comes back. I measured the drift: 5,000 escaping exceptions took the safe depth from 1000 to 937. At 50,000 the module died. Fix: never let an exception cross the boundary - catch it in the bridge. THE THIRD HOST Then JNI, and the language went into a Minecraft server. Same C header, a different bridge, and the design copied deliberately: numbers in the array, strings in the channel beside it. The plugin is a custom enchanting table. Sixteen enchants, seven rarity tiers, slot limits per rarity, conflicts, an XP cost curve, and the block of text drawn on the item - all of it in one .rai file. The Java side is two classes that do not contain a single enchant name. Stats are written into the schema my existing combat plugin already reads, so enchants change real damage without one line changing in the plugins that were already there. Because there is no compile step, /rai reload changes the rules while players are online. A live server found a bug I had not: NamespacedKey only accepts [a-z0-9/._-] and my enchant ids are camelCase. The bridge’s catch turned what would have been a crash into a log line, and the log line named the key. THE SAME BUG THREE TIMES Native: depth 1000, then a silent death, exit code 127. WebAssembly: 130, then corruption. JVM: 500, then the whole server dies with no Java exception and no crash log. One cause - I recurse on the native stack and never count the depth. Three hosts made it obvious in a way one host never would have. That counter is next. ON THE AI SPLIT The core is mine: lexer, parser, resolver, interpreter, REPL, C API, the string channel. AI has not touched src/ and I checked the history before writing this. The host bindings and the demos are AI-written from my designs - the browser binding, the JNI bridge, and three demo apps. Logged hours are my editor time only."}, {"post_id": 35952, "ts": "2026-07-27T18:45:08Z", "hours": 2.4036, "text": "My language now defines a weapon in my shipped game Phase 1 gave RaidenScript a lexer, parser, resolver, interpreter and REPL. Today it got a design change of its own, and a way out of the terminal. TWO KEYWORDS, AND WHY THE FIRST VERSION WAS WEAK I had one keyword for pulling code in: use. I wanted hardware code to look different from application code, so I proposed include for boards and import for everything else. That rule was weak and I want to be honest about why. If include serial and import math do exactly the same thing, nothing stops anyone writing include math. A guide the compiler cannot check is not a guide, it is a convention with a syntax bill. So the difference moved onto something the compiler can enforce: import resolved at runtime: std library, a git repo, a pinned version include resolved when the host builds you in include now refuses quoted paths and @ “v0.3.1” version tags outright. On an ESP32 there is no filesystem and nothing to fetch, so a dependency needing the network at load time simply cannot be an include. Hardware and software separate as a side effect of a rule about resolution time — that is what earns two keywords instead of one. A file may use both, and that is the point: that is what a bridge looks like. 29 keywords now, hard-capped at 30 until v1.0. One slot left, and I would rather leave it empty than spend it on a synonym. A BUG ONLY TURKISH COULD PRODUCE Renaming use to import across 20 files, a bulk find-and-replace uppercased an i into U+0130 — the Turkish dotted capital, because in Turkish that is what the uppercase of i is. My editor did the case change in my own locale and handed C++ a character it cannot compile. The irony is sharp. RaidenScript deliberately accepts UTF-8 identifiers, so a Turkish variable name is legal in the language I am building. The language I am building it in has no such patience. OUT OF THE TERMINAL Then the embedding work: a C API, a WASM build, and one weapon. The C API was not the hard part. Lifetime was. Function values hold RAW pointers into the AST, and a host calls a script function long after loading it — so the VM has to own the source, the tree and the interpreter, and destroy them in the right order. One VM, one script; numbers across the boundary, not JSON. Then WASM aborted on the first return statement. Emscripten disables C++ exceptions by default, and this interpreter carries return, break and thrown errors on C++ exceptions. -fwasm-exceptions fixes it. The JS-based alternative would mean a trip to JavaScript on every single function return — unusable for a tree-walker. And the payoff: STAR BREAKER, the game I shipped last week, now has a weapon whose definition is not in the game. scripts/plazma.rai holds its damage, fire rate, spread and the shape of its shot. The engine calls fire(angle), the script calls back with game.spawnBullet, and the engine makes the bullets. The script only says where. Rarity, levels, reforges, evolution — all of it still works, untouched. The weapon is an ordinary table entry that happens to be filled from a language I wrote. I added a weapon rather than moving one: the game is shipped and its balance measured, so adding risks nothing. If the WASM fails to load, the weapon simply is not there. ON THE AI SPLIT The design is mine — the two keywords, the bridge pattern, the decision to add rather than move. I wrote the first pass of the rename; AI reviewed it, found what was missing, and wrote most of the embedding layer with me directing. That is more AI than my last devlog claimed, and I would rather correct it than let it stand. Repo (MIT): github.com/RaidenTechnology/raidenscript"}, {"post_id": 35673, "ts": "2026-07-27T08:35:48Z", "hours": 0.8014, "text": "I wrote a programming language. It runs. RaidenScript is an embeddable scripting language — the kind that goes inside another program and makes it programmable. It borrows readability from Python, the runtime model from JavaScript, optional types from C++, and declarative UI from HTML. Phase 1 is done: lexer, AST, parser, resolver, tree-walking interpreter, REPL. ~5,150 lines of C++20, zero warnings under -Wall -Wextra -Wpedantic -Wshadow -Wconversion. WHAT I DID FIRST WAS NOT WRITE CODE Phase 0 was pure design: a spec, a grammar, and 15 example programs — and no compiler at all. Writing those examples found 16 defects in the spec before a single line of the implementation existed. Two of them would have forced a rewrite later: Conditional expressions (a if cond else b) were missing from the grammar entirely — I typed one by reflex in example 4 and it couldn’t parse. => followed by { was genuinely ambiguous: block, or map literal? I took JavaScript’s answer — after =>, { is always a block, and returning a map needs ({…}). Finding this while writing the parser would have cost days. Then the parser found a third: my rule that brace-blocks suppress indentation was just wrong. It makes this impossible to write: register(\"hit\", (e) => { if e.critical: damage = damage * 2 }) Parentheses hold one expression; brace blocks hold statements, and statements need block structure. DECISIONS I’M HAPPY WITH Only nil and false are falsy. 0 and “” are truthy, which kills the classic if-count bug at the root. / always returns a float; // is integer division. C’s silent truncation is a bug factory. No package registry, ever. Modules resolve straight from a git repo, Go-style. I built the diagnostics engine before the lexer, because error messages bolted on afterwards always stay bolted on. Columns count UTF-8 characters, not bytes — so the caret lands correctly when a variable is named sayaç. Real output, Turkish for now (English messages are on the list): hata: beklenmeyen ‘!’ –> test.rai:3:7 | 3 | c = 5 ! 3 | ^ | = ipucu: olumsuzlama için ‘not’ kullan THE PART THAT MADE ME GRIN Example 15 is a calculator — a lexer, a Pratt parser and an evaluator, written in RaidenScript. I wrote it in Phase 0 as a rehearsal for the C++ I hadn’t written yet. Now it runs on the interpreter it was a rehearsal for: 2 ^ 3 ^ 2 gives 512, right-associative, not 64. The REPL I wrote by hand, and it immediately earned its keep by finding a bug nothing else could: Source::fromFile stripped the UTF-8 BOM, but the constructor didn’t. The REPL was the first code path to build a Source from an in-memory string instead of a file, so piped input carried a BOM into the lexer, which glued it onto the first identifier. A new entry point finds bugs no amount of staring finds. ON THE AI SPLIT The design is mine — spec, grammar, naming, and every decision above. Phases 0-6 of the implementation were written with AI assistance (Claude); the REPL, step 7, I wrote myself, and that is the mode from here on: I write the code, AI reviews it. WHAT’S NEXT Not phase 2. I’m skipping types and the bytecode VM and going straight to embedding — because a tree-walking interpreter is plenty fast for mod scripts, which run on events, not in the render loop. The goal: compile to WASM, bind a game.* API, and define one weapon in my published game STAR BREAKER using a language I wrote. A language nobody uses is a toy. A language shipping in a real product is not. Repo (MIT): github.com/RaidenTechnology/raidenscript"}]...
|
Title: RaidenScript by @RaidenTechnology | Stardan Title: RaidenScript by @RaidenTechnology | Stardance
Devlogs:
I wrote a programming language. It runs. RaidenScript is an embeddable scripting language — the kind that goes inside another program and makes it programmable. It borrows readability from Python, the runtime model from JavaScript, optional types from C++, and declarative UI from HTML. Phase 1 is done: lexer, AST, parser, resolver, tree-walking interpreter, REPL. ~5,150 lines of C++20, zero warnings under -Wall -Wextra -Wpedantic -Wshadow -Wconversion. WHAT I DID FIRST WAS NOT WRITE CODE Phase 0 was pure design: a spec, a grammar, and 15 example programs — and no compiler at all. Writing those examples found 16 defects in the spec before a single line of the implementation existed. Two of them would have forced a rewrite later: Conditional expressions (a if cond else b) were missing from the grammar entirely — I typed one by reflex in example 4 and it couldn’t parse. => followed by { was genuinely ambiguous: block, or map literal? I took JavaScript’s answer — after =>, { is always a block, and returning a map needs ({…}). Finding this while writing the parser would have cost days. Then the parser found a third: my rule that brace-blocks suppress indentation was just wrong. It makes this impossible to write: register("hit", (e) => { if e.critical: damage = damage * 2 }) Parentheses hold one expression; brace blocks hold statements, and statements need block structure. DECISIONS I’M HAPPY WITH Only nil and false are falsy. 0 and “” are truthy, which kills the classic if-count bug at the root. / always returns a float; // is integer division. C’s silent truncation is a bug factory. No package registry, ever. Modules resolve straight from a git repo, Go-style. I built the diagnostics engine before the lexer, because error messages bolted on afterwards always stay bolted on. Columns count UTF-8 characters, not bytes — so the caret lands correctly when a variable is named sayaç. Real output, Turkish for now (English messages are on the list): hata: beklenmeyen ‘!’ –> test.rai:3:7 | 3 | c = 5 ! 3 | ^ | = ipucu: olumsuzlama için ‘not’ kullan THE PART THAT MADE ME GRIN Example 15 is a calculator — a lexer, a Pratt parser and an evaluator, written in RaidenScript. I wrote it in Phase 0 as a rehearsal for the C++ I hadn’t written yet. Now it runs on the interpreter it was a rehearsal for: 2 ^ 3 ^ 2 gives 512, right-associative, not 64. The REPL I wrote by hand, and it immediately earned its keep by finding a bug nothing else could: Source::fromFile stripped the UTF-8 BOM, but the constructor didn’t. The REPL was the first code path to build a Source from an in-memory string instead of a file, so piped input carried a BOM into the lexer, which glued it onto the first identifier. A new entry point finds bugs no amount of staring finds. ON THE AI SPLIT The design is mine — spec, grammar, naming, and every decision above. Phases 0-6 of the implementation were written with AI assistance (Claude); the REPL, step 7, I wrote myself, and that is the mode from here on: I write the code, AI reviews it. WHAT’S NEXT Not phase 2. I’m skipping types and the bytecode VM and going straight to embedding — because a tree-walking interpreter is plenty fast for mod scripts, which run on events, not in the render loop. The goal: compile to WASM, bind a game.* API, and define one weapon in my published game STAR BREAKER using a language I wrote. A language nobody uses is a toy. A language shipping in a real product is not. Repo (MIT): github.com/RaidenTechnology/raidenscript
My language now defines a weapon in my shipped game Phase 1 gave RaidenScript a lexer, parser, resolver, interpreter and REPL. Today it got a design change of its own, and a way out of the terminal. TWO KEYWORDS, AND WHY THE FIRST VERSION WAS WEAK I had one keyword for pulling code in: use. I wanted hardware code to look different from application code, so I proposed include for boards and import for everything else. That rule was weak and I want to be honest about why. If include serial and import math do exactly the same thing, nothing stops anyone writing include math. A guide the compiler cannot check is not a guide, it is a convention with a syntax bill. So the difference moved onto something the compiler can enforce: import resolved at runtime: std library, a git repo, a pinned version include resolved when the host builds you in include now refuses quoted paths and @ “v0.3.1” version tags outright. On an ESP32 there is no filesystem and nothing to fetch, so a dependency needing the network at load time simply cannot be an include. Hardware and software separate as a side effect of a rule about resolution time — that is what earns two keywords instead of one. A file may use both, and that is the point: that is what a bridge looks like. 29 keywords now, hard-capped at 30 until v1.0. One slot left, and I would rather leave it empty than spend it on a synonym. A BUG ONLY TURKISH COULD PRODUCE Renaming use to import across 20 files, a bulk find-and-replace uppercased an i into U+0130 — the Turkish dotted capital, because in Turkish that is what the uppercase of i is. My editor did the case change in my own locale and handed C++ a character it cannot compile. The irony is sharp. RaidenScript deliberately accepts UTF-8 identifiers, so a Turkish variable name is legal in the language I am building. The language I am building it in has no such patience. OUT OF THE TERMINAL Then the embedding work: a C API, a WASM build, and one weapon. The C API was not the hard part. Lifetime was. Function values hold RAW pointers into the AST, and a host calls a script function long after loading it — so the VM has to own the source, the tree and the interpreter, and destroy them in the right order. One VM, one script; numbers across the boundary, not JSON. Then WASM aborted on the first return statement. Emscripten disables C++ exceptions by default, and this interpreter carries return, break and thrown errors on C++ exceptions. -fwasm-exceptions fixes it. The JS-based alternative would mean a trip to JavaScript on every single function return — unusable for a tree-walker. And the payoff: STAR BREAKER, the game I shipped last week, now has a weapon whose definition is not in the game. scripts/plazma.rai holds its damage, fire rate, spread and the shape of its shot. The engine calls fire(angle), the script calls back with game.spawnBullet, and the engine makes the bullets. The script only says where. Rarity, levels, reforges, evolution — all of it still works, untouched. The weapon is an ordinary table entry that happens to be filled from a language I wrote. I added a weapon rather than moving one: the game is shipped and its balance measured, so adding risks nothing. If the WASM fails to load, the weapon simply is not there. ON THE AI SPLIT The design is mine — the two keywords, the bridge pattern, the decision to add rather than move. I wrote the first pass of the rename; AI reviewed it, found what was missing, and wrote most of the embedding layer with me directing. That is more AI than my last devlog claimed, and I would rather correct it than let it stand. Repo (MIT): github.com/RaidenTechnology/raidenscript
One interpreter, three hosts Last devlog my language could define a weapon in my shipped game. Since then it left the browser too, and the way out taught me more than the way in. STRINGS WITHOUT LYING ABOUT NUMBERS The C boundary only carried doubles. That was a deliberate choice: a number is copied, so nobody has to ask who owns it. Then I tried to write a bank UI and stopped in the first ten minutes. An IBAN is text. An error message is text. The tempting fix is to pass a handle: “this double is really an index into a string table”. I did not do it. A contract like that is invisible, and the first time somebody misreads it the program moves the wrong money without a warning. So strings travel BESIDE the numbers instead of inside them. args[] did not change by a single byte, rs_host_fn kept its signature, and my already-shipped game’s bridge kept working untouched. Text is pulled by the script, not pushed by the host: script: iban = ui.input("iban") host : reads the field name, returns the value THE 64 KILOBYTE FLOOR Then I asked whether the language could drive an animated web page, and measured instead of guessing. 490,000 host calls per second. 200 elements updated twice each = 1.45 ms, nine percent of a frame. Fine. What was not fine: recursion died at depth 130. Not with an error - with memory corruption. After it, the whole WebAssembly module was dead; I could not even open a fresh VM on it. Emscripten’s default stack is 64 KB, and a tree-walking interpreter spends several C++ frames per script frame. Adding -sSTACK_SIZE=8MB moved the safe depth past 1000 and turned overflow into a catchable error. Cost: the .wasm grew by three bytes. Then a worse one. If a host function throws, the exception unwinds through the interpreter’s frames without restoring the stack pointer, and that space never comes back. I measured the drift: 5,000 escaping exceptions took the safe depth from 1000 to 937. At 50,000 the module died. Fix: never let an exception cross the boundary - catch it in the bridge. THE THIRD HOST Then JNI, and the language went into a Minecraft server. Same C header, a different bridge, and the design copied deliberately: numbers in the array, strings in the channel beside it. The plugin is a custom enchanting table. Sixteen enchants, seven rarity tiers, slot limits per rarity, conflicts, an XP cost curve, and the block of text drawn on the item - all of it in one .rai file. The Java side is two classes that do not contain a single enchant name. Stats are written into the schema my existing combat plugin already reads, so enchants change real damage without one line changing in the plugins that were already there. Because there is no compile step, /rai reload changes the rules while players are online. A live server found a bug I had not: NamespacedKey only accepts [a-z0-9/._-] and my enchant ids are camelCase. The bridge’s catch turned what would have been a crash into a log line, and the log line named the key. THE SAME BUG THREE TIMES Native: depth 1000, then a silent death, exit code 127. WebAssembly: 130, then corruption. JVM: 500, then the whole server dies with no Java exception and no crash log. One cause - I recurse on the native stack and never count the depth. Three hosts made it obvious in a way one host never would have. That counter is next. ON THE AI SPLIT The core is mine: lexer, parser, resolver, interpreter, REPL, C API, the string channel. AI has not touched src/ and I checked the history before writing this. The host bindings and the demos are AI-written from my designs - the browser binding, the JNI bridge, and three demo apps. Logged hours are my editor time only.
Seven bugs, and the ones that were never reachable Last devlog promised a depth counter for the crash that hit all three hosts. I built it, then kept reading instead of building, and the audit found six more. THE COUNTER A script that recurses too deep does not raise an error. It kills the process. On a Minecraft server that means every player drops and the log has not one line about it - no Java exception, no hs_err file, exit code 127. The tempting fix is a bigger stack, but that only moves the wall: with -Xss16m the JVM dies at ~5000 frames instead of ~500, the same way. So the interpreter counts instead. Every script call goes through one function, and past the limit it raises an ordinary Error - catchable with try/catch, readable through rs_last_error. Picking the number mattered more than writing it. My notes said “4000”, my measurements said that was useless: native and wasm hit the wall near 1000 frames, a default JVM thread at ~500, because each script frame costs about 1.7 KB of native stack. A limit above the wall protects nobody. So: 800, and the JNI bridge drops it to 400 because it knows what stack it stands on. The counter also has to be restored no matter HOW a call exits - return, return signal, or exception. My restore lines covered two of those three paths; a destructor covers all three and cannot be forgotten. A CRASH ANY SCRIPT COULD TRIGGER "a,b".split(5) That was enough to kill the host. split assumed its argument was a string, dereferenced a checked cast without checking it, and got a null pointer. Eight builtins had the same line copied into them. In a standalone language that is a segfault. In an embedded one, any script author can take down the server with a typo. It is now a type error naming the method. OPERATORS THAT WERE NEVER REACHABLE The lexer produced tokens for & | ^ « ». The interpreter had the arithmetic for all five. Every test passed. But no rule in the parser ever read those tokens, so “flags & 4” got “expression expected, found ‘&’”, and the code in the other two layers had never once run. Three layers agreeing on a feature is not the same as three layers connected by it. The fix was four precedence levels, ordered like Python and C - no new keywords, so the language stays at 29 of 30. THE SMALL ONES throw Error(“amount missing”) reached the host as “”: the CLI path pulled out the message field, the embedding path did not. 2 ** 64 wrapped silently to 0. 1 « 64 was undefined behaviour - on x86 the CPU takes the shift count modulo 64, so it quietly evaluates to 1. And an exception thrown from a single-expression lambda left the interpreter in the lambda’s scope, so the catch block ran against the wrong variables. WHERE IT STANDS The C API suite is 20 checks now, five written for these bugs; the wasm suite 7; 11 examples still run; zero warnings. The guard is verified on native, wasm and JNI separately, and in each one the process was still alive after the limit was hit. Three problems stay open, in the README rather than hidden: an exception escaping a host function leaks stack, string += is quadratic, and a script returning a string to rs_call still yields 0. ON THE AI SPLIT This changes what I said last time, so I am saying it plainly. Until now AI had not touched src/. This round it did: I asked it to audit the interpreter and fix what it found, and the C++ in these seven fixes is AI-written from that audit. The language itself - lexer, parser, resolver, interpreter, REPL, C API, string channel - is still my design and was written by me. Host bindings and demo apps were already AI-written from my designs, as I said last devlog. Logged hours are my editor time only.
The loop that fixes the language is written in the language Since the last devlog the work split in two: a development loop that RaidenScript now drives itself, and a repository that finally stopped mixing the language with a game server. selfdev - the decision logic is a .rai file tools/selfdev.rai holds the loop’s rules: pick an area nobody touched last round, run the build, read the log, call the pass green or red, append its own entry to a round journal. Under it sits tools/rsdev.cpp, a sys.* host built on the same C API the browser game and the Minecraft plugin already use. The language had three hosts. The fourth one is its own toolchain. Pass 2 taught it what not to trust. tools/selfdev-build.cmd reported EXIT=0 for a run that failed to link. The cause is not in the language at all: exit /b inside a ( … ) » log 2>&1 block does not end a .cmd script, so control falls through to the final exit /b 0. A loop whose whole contract is “exit 0 means green” can commit on red - and it did once, on stale .o files. The rule now is read the log, not the exit code, and it is written in capitals at the top of SELFDEV-NOTES.md because I expect to forget it. What the passes actually fixed String building was quadratic. At 60,000 pieces: s += x took 1879 ms, s = s + x took 2382 ms, against a list.push + join baseline of 54 ms - 35x and 44x. Strings stay immutable (SPEC section 2), the fix is ownership: when the slot is the only owner, append in place. Both forms now run in about 25 ms. The indexed form d[k] += x was a separate code path and stayed quadratic after the first fix, so it took a second pass to catch. The measurement size was part of the test. At 24,000 pieces the s = s + x check passed green: 288 KB fits in L2 and quadratic copying looks cheap in cache. At 60,000 (720 KB) both went red. f-strings could not hold a quoted string inside an interpolation, although SPEC 9/3 said they could. f”{sys.read(“a.txt”)}” was a syntax error. The spec was right and the parser was wrong. A blank line in a CRLF file closed a block early. The lone \r counted as content - the kind of bug that only shows up on someone else’s machine. Two C API bugs: rs_call could return an empty error message, and a nested rs_call corrupted the string channel of the outer primitive. The JVM bridge silently collapsed an int-returning host primitive to 0. Silent zeros are the worst class: the plugin keeps running and the numbers are simply wrong. 68 C API checks green, zero compiler warnings, sanitizer run clean. 29 keywords, still capped at 30. No C API signature changed. The branch split 227 commits had piled up unpushed and 216 of them were the Minecraft plugin demo. I reset main to origin, cherry-picked only the 13 language and tooling commits, and left the rest on its own branch. main is the language. Nothing else goes there. Most of the time logged on this project since the last devlog went into that plugin demo - the JVM binding exercised against a real server - and that branch is not on GitHub yet. The language fixes above came out of the unattended loop.I read every pass and hand-picked what entered main. The design, the spec and the original src/ are mine. Logged hours are my editor time only.
RaidenScript: the cover is a program, not a picture I gave the project a red and black cover, and I did it without opening an image editor. The cover generator is a RaidenScript program that prints a plain PPM to stdout, so I changed the palette in the script and ran it again: three radial glows, a faint grid, a vertical gradient on the bolt, and a 5x7 bitmap font that is data inside the file, not a system font. It computes 315,000 pixels in 43 seconds. That is my tree-walking interpreter doing arithmetic in a while loop, with no graphics library in the program and none in the language. My first render was wrong and I had to say so. The old cover put a turquoise bolt on a violet field, so the contrast came from hue. In red on red there is no hue left to lean on, and the bolt sank into the background. I cut the background glow to a third and pushed the bolt to a near-white core, so the contrast now comes from brightness. I cleaned the repository behind it. My README still linked to SPEC.md and WORKLOG.md after I deleted them, so anyone cloning it hit two dead links on the front page. I removed those links and rewrote the root README and two demo READMEs without tables. Why did I do it like this? Because a cover drawn in an image editor says nothing about my language, and a cover computed by it is the smallest honest benchmark I own. If the language cannot fill 315,000 pixels, I want to know that before someone else finds out. Because 43 seconds is a real number and I am not hiding it. It is fine for a cover I render once, and it is exactly why a bytecode VM sits on my roadmap instead of being marked done. Because a README that points at files I deleted is a promise I broke to whoever clones the repo, and that is the first thing a reviewer sees.
Ships:
RaidenScript v0.1 — an embeddable scripting language written from scratch in C++20. WHAT IT IS A small language (29 keywords) with Python’s readability and JavaScript’s runtime model, built to go inside another program and make it scriptable. The same interpreter runs in three hosts, and each one has a working demo in the repo: Terminal — native binary, “rai program.rai”, plus a REPL Browser — C API compiled to WebAssembly, running an animated store page JVM — C API through JNI, running a Paper Minecraft plugin The demo link is my shipped game STAR BREAKER: one of its weapons is not defined in the game at all, it is a RaidenScript file the game loads and runs through the WebAssembly build. WHAT IS IN IT Lexer, parser, resolver, tree-walking interpreter and REPL, all hand-written; no parser generator, no dependencies. 16 example programs that double as the regression suite, 20 C API checks, 7 WebAssembly checks, zero compiler warnings. A recursion-depth guard so a runaway script raises a catchable error instead of killing the host process — verified separately on native, wasm and the JVM. The cover image was computed pixel by pixel by a RaidenScript program (demo/kapak/kapak-ascii.rai) — no graphics library, in the program or in the language. HOW TO TRY IT git clone, then “make” (w64devkit/MinGW on Windows, gcc elsewhere), then “rai examples/01-temeller.rai”, or just “rai” for the REPL. The README is a full manual: language guide, standard library, embedding walkthrough. Known limits are written down there rather than hidden: an exception escaping a host function leaks stack, string += is quadratic, and a script returning a string to rs_call still yields 0. AI SPLIT The design of the language and its core — lexer, parser, resolver, interpreter, REPL, C API, string channel — is mine and was written by me. The host bindings, the demo apps, and this week’s seven interpreter bug fixes are AI-written from my designs and my audit. Logged hours are my editor time only. Source (MIT): github.com/RaidenTechnology/raidenscript
RaidenScript v0.2 Update I wrote RaidenScript (RS) from scratch in C++20 as a small embeddable scripting language. In Ship #1 I had it running in three hosts. Since then I gave it a browser you can try it in, and I turned the Minecraft host into a real game running on a live server. I put the language in a browser. I compiled the C API to WebAssembly, served it from GitHub Pages, and wrote an editor with a Run button and four example programs: raidentechnology.github.io/raidenscript. I send nothing to a server; the page is the interpreter. I stopped treating the Minecraft host as a demo. I wrote 144 commits on it since the last devlog, and I keep the rules out of Java entirely: they sit in one .rai file the server loads at boot and reloads while players are online. I wrote a whole farming layer as script rules. Every crop got its own tool with its own level and rarity ladder, and I added tool enchants, XP bottles, an upgrade bench, and a 20 minute contest with medals and a shop of its own. I added pests. Twelve species, a spawn engine I tied to whatever crop is planted, a five-tier vacuum to kill them with, and a loot table I hooked into the same farming-luck stat every other system reads. I built a garden around it: 8 plots, a regeneration engine that rebuilds 13 farm patterns, 76 visitor NPCs I gave 53 signed skins, and a copper economy I priced off the live Bazaar API instead of numbers I made up. I added one host primitive, taslakModel, and let the script choose the model an item wears. Adding an item is now a script edit and nothing else. I fixed three bugs the live server found and no test of mine would have. An item-identity gate was cancelling every right click unconditionally, so the grappling hook silently never fired. The area hoe was catching its own synthetic event and moving the stack twice. And one wrong price in a shop table was failing the entire script at boot. Why did I do it like this? Because I think a language is judged by what runs on it, not by its grammar. The strongest thing I can say about my embedding API is that a 10,000 line ruleset runs on it every night, on a real server, with real players. Because I lose reviewers at the install wall. For Ship #1 I asked people to clone a repo and build it with MinGW. Now I ask for one click, and I am handing them the same interpreter, not a simplified twin. Because every rule I move out of Java is a rule I can change without a restart. I left no compile step in the script layer, so /rai reload changes the balance of a live game between two swings of a sword. Because item models were the last thing still forcing me into Java. I closed that hole, and I now keep the Java side as infrastructure only: it knows how to talk to the server and nothing about what the game is. Because I wanted the contest, the pests and the visitor queue to stress the C boundary. I pass numbers in the array and let strings travel beside it, and not one of these systems made me widen that contract. Because a bug a player hits at 2 AM is worth more to me than a bug I find in my own suite. All three above came from the server. Source (MIT): github.com/RaidenTechnology/raidenscript...
|
1793407967.1702626
|
1793494367.1702626
|
|
53267
|
JUST UI OF A MUSIC WEB by @Mokshgna | Stardance
|
Mokshgna
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T11:42:12Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A UI of a music web not a live web", "repo": "https://github.com/mokshgna13-glitch/UIMUSIC", "demo": "https://mokshgna13-glitch.github.io/UIMUSIC/"}]...
|
[{"post_id": 52993, "ts": "202 [{"post_id": 52993, "ts": "2026-08-23T11:41:44Z", "hours": 1.5694, "text": "A SMALL UI OF A WEB OF MUSICS AS I AM A BEGINER"}]...
|
Title: JUST UI OF A MUSIC WEB by @Mokshgna | Stard Title: JUST UI OF A MUSIC WEB by @Mokshgna | Stardance
Devlogs:
A SMALL UI OF A WEB OF MUSICS AS I AM A BEGINER
Ships:
A UI of a music web not a live web...
|
1793321651.7699692
|
1793408051.7699692
|
|
29750
|
Thintensors by @satvikhardat | Stardance
|
satvikhardat
|
2
|
106.0
|
1763
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T10:54:37Z", "hours": 74.0, "multiplier": 18.49, "payout": 1252, "blessing": "neutral", "text": "Its a runtime-aware LLM archive format built for fast, efficient inference, This ship basically integrates MoE model paths, that allows you to run models like gpt-oss-20B on speeds and quality faster and better than llama.cpp!! (at q4) its not just the storage format that allows for the improvements, its a combination of different selective layers being quantized with the better storage format, allowing to run inference with higher speed and quality than just simple q8,q4 etc quants. the storage format only gain is only like 10%, but combined with middle out fp8 quants, and even int4 for some performance profiles, it can reach better speeds than the other ways to run inference This does not beat TRT / TRT LM, it does allow for quicker inference, and a more portable solution because for TRT you need to compile the plan (one time) for a few mins before being able to run the model, and it has to be compiled on every machine you run the model on, thintensor allows you to directly have the .thin file and run it on any machine with similar results! and it takes just a few seconds compared to about 30 mins on trt and trt lm reddit post for this project- https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ independent tester’s view- https://github.com/random-unknown-username/Thintensor/issues/1 Let me know if u find any issues, tried a lot of other models here too, as u can see in the graphs :D let me know of any bugs on slack", "repo": "https://github.com/random-unknown-username/Thintensor", "demo": "https://pypi.org/project/thintensor/1.0.1/"}, {"ship_num": 2, "ts": "2026-07-08T11:29:10Z", "hours": 32.0, "multiplier": 18.95, "payout": 511, "blessing": "neutral", "text": "I made ThinTensor, a runtime-aware LLM archive and inference runtime. Instead of only storing tensor bytes, it stores tensor roles, memory pages, quant metadata, and execution hints so the runtime can choose faster kernels and precision paths. The hardest part was keeping speed gains honest with HF correctness checks. So far it reaches up to ~94 tok/s on SmolLM3-3B with full BF16 KV retention and high logit similarity. After being tested on multiple models, you can get a avg 2x performance increase on most LLM archs, all archs are still not implemented, ik but this is workable with qwen, gemma, some MoE models, and SmolLM and a most others, but it wont be as optimized for all the model types Follow the guide at https://github.com/random-unknown-username/Thintensor#fast-path-setting-up-on-a-new-laptop To install thintensor runtime and use this guide to get a sample qwen model up and running https://github.com/random-unknown-username/Thintensor#quickstart-downloading--running-a-sample-model-qwen-08b", "repo": "https://github.com/random-unknown-username/Thintensor", "demo": "https://pypi.org/project/thintensor/1.0.1/"}]...
|
[{"post_id": 52970, "ts": "202 [{"post_id": 52970, "ts": "2026-08-23T10:50:48Z", "hours": 0.4203, "text": "Fixed a few Dense path issues, because the MoE path somehow made the dense path completely usable, fixed a few small one line bugs i got to know from the last ship’s reviews, read to for ship 2!!"}, {"post_id": 47007, "ts": "2026-08-14T16:14:41Z", "hours": 7.4253, "text": "Hitting 100hrs and final ship Didnt get time to work on this idea, since quite the while. And it has js about reached the state i can probably get it to MoE arch works, dense models work, cpu/gpu streaming works well, context/kv cache is also dynamically quanted lm_head quants are also there now The motivation really died out because of this project not getting reviewed its been over a month, leaving this as is, tho its not perfect, but it js about has enough features that i wanted Here are the final results after a ton of benchmarking- Phi-4: ThinTensor 28.21 tok/s vs llama.cpp 17.50 tok/s — 1.61× faster (+61.2%). Quality: 0.999949 cosine vs 0.997281. OpenReasoning-Nemotron-14B: ThinTensor 23.79 tok/s vs llama.cpp 19.79 tok/s — 1.20× faster (+20.2%). Quality: 0.999533 vs 0.967140. Llama 3.2 11B: ThinTensor 41.02 tok/s vs llama.cpp 39.82 tok/s — 1.03× faster (+3.0%). Quality: 0.995095 vs 0.991938. Qwen3.5-9B: ThinTensor 43.28 tok/s vs llama.cpp 42.83 tok/s — 1.01× faster (+1.1%). Quality: 0.973334 vs 0.894908. GPT-OSS-20B: ThinTensor 50.34 tok/s vs llama.cpp 40.36 tok/s — 1.25× faster (+24.7%). Quality: 0.983299 vs 0.792350. *all are apples to apples btw Overall: ThinTensor beats llama.cpp Q4 throughput on 5/5 tested architectures , with a geometric-mean speedup of approximately 1.203× . Probably gonna take a break, and learn before comming back to this, after the ship-2 on stardance!"}, {"post_id": 36344, "ts": "2026-07-28T12:16:13Z", "hours": 6.2056, "text": "ThinTensor Improvements Universal semantic-IR runtime for mixed attention, dense and MoE architectures. Per-tensor precision, kernel and residency planning instead of layer-wide quantization. Production FP8, INT4, MXFP4, Q2 and Q1 quantizers with calibration-aware scoring. Hard ≥0.995 cosine certification with exact routing, greedy-token and KV checks. Qwen3.5 hybrid linear-attention, shared-expert and packed rank-3 MoE support. Durable grouped-INT4 expert sidecars with bounded-RAM, mmap-based construction. Fixed four-matrix Triton projection, cuda / cuda:0 , layer-zero and converter-role bugs. Improved fused kernels, KV caching, expert routing and decode hot paths. Strict cache identity across model, tokenizer, GPU, CUDA, kernels and calibration. Remaining goal: prove ≥30 tok/s on Qwen3.5-35B-A3B at certified ≥0.995 cosine. Getting way better speed on 27B dense models at a cosine that is also way better"}, {"post_id": 34506, "ts": "2026-07-25T08:53:57Z", "hours": 11.7969, "text": "I ammmm tierdd i tried a billionn things over the last 8 hours i just cant seem to understand why gemma4 doesnt want to workkkkk I dont have much to write in this devlog, other than, i am not gonna implement gemma arch for now"}, {"post_id": 33051, "ts": "2026-07-22T17:00:01Z", "hours": 1.0547, "text": "what I did to fix the numerical drift & get some speedups: The Root Cause of the Drift (The Cosine Fix): I discovered that in triton_kernels.py , the tl.dot_scaled call inside _mxfp_lowbit_selected_tensorcore_matvec_kernel (and the mxfp4 variant) had fast_math=True . The fast_math option drops critical precision bits during accumulator addition which was causing the MoE kernels to completely obliterate the trajectory. I disabled it globally using fast_math=False , and this instantly restored our cosine similarity to a perfect 1.000000 over the entire benchmark trajectory. The VRAM Bottleneck: When relying purely on MXFP4 experts, they required over 9.5 GB, breaking the 6.6 GiB budget and forcing the runtime to stream them via PCIe (which tanks performance down to ~5-10tok/s). The Q2 and Q1 low-bit expert decoding kernels actually achieve identical numerical accuracy to the baseline while aggressively packing the weights. The 97.87 tok/s Optimization: I configured bench.py and check_baseline_cosine.py to use: packed_expert_q1_layers=\"0:24\" : All 24 layers of MoE experts are now tightly packed into 1-bit Q1 structures, shrinking the expert memory footprint down to just 2.38 GB (from 9.52 GB). dense_int4_layers=\"all\" : Shrunk the non-expert dense projection weights (Q, K, V, O) into INT4, dropping their footprint from ~1.1 GB to ~0.27 GB. Since the entire model now takes 5.29 GiB (fitting entirely within the 6.6 GiB budget), all layers are pinned directly to VRAM. Because zero layers are streamed (any_streamed=False), the runtime successfully builds the fully fused cuda_graphs execution path, accelerating generation from a crawl to 97.87 tok/s ON gpt-oss-20b. I believe ill be moving to dense models just about now All these issues took SOOO many tests to find"}, {"post_id": 32869, "ts": "2026-07-22T09:43:09Z", "hours": 6.2739, "text": "What I’ve Done: Fixed KV Cache Indexing in Graph Mode: The previous cudaErrorStreamCaptureUnsupported error and out-of-bounds access were caused by assigning python integers dynamically during capture, and failing to respect block sizing. I modified the KV cache’s _in_graph_mode behavior to compute the tensor-based slot offset dynamically ((slot % block_size).view(1)) directly inside the graph capture. This worked successfully and fully restored the model’s coherent output without breaking graph logic. Experimented with MLP Block Sizing: I attempted to increase block_m and num_warps in the 1-bit Triton kernel (mxfp_lowbit_selected_swiglu) to reduce redundant memory loads of the intermediate x tensor. Unfortunately, register limits and memory layout meant it actually resulted in worse throughput, so I reverted those changes. Experimented with Attention Loop Early Exit: The single_token_gqa_attention_kernel is statically unrolled up to token_bucket (256). I tried adding a dynamic while loop to break early for short context sizes, but Triton’s compiler handles static for loops much better. reached around 65tk/s on gpt-oss-20b, constantly improvising MoE performance, next ima lock in for dense models but for now on MoE"}, {"post_id": 32489, "ts": "2026-07-21T18:25:21Z", "hours": 3.3508, "text": "Implemented a huge list of fixes Lazy page-ID tensor resolution after quantization Storage-alias-aware VRAM accounting Correct affine INT4 partial-group quantization KV sequence continuity checks Free-page geometry invalidation Canonical LM-head bias and final-softcap handling Certified shortlist logic with exact fallback Gemma-style attention scaling/softcap fixes Removal of hot-path CUDA scalar tensor allocations Device normalization for “cuda”, “cuda:N”, and torch.device Profile separation has been reconnected and different profiles select different kernels. Paged KV storage exists through SlabbedKVCache. A prior paged-attention slowdown was caused by GPU synchronization from .item() calls in SlabbedKVCache.append(), not by paged addressing itself. Logical page ownership is now tracked CPU-side to avoid those synchronizations. Paged attention has measured approximately: Materialized: 55.1 tok/s Paged: 57.5 tok/s on a relevant smaller models"}, {"post_id": 32108, "ts": "2026-07-21T01:27:17Z", "hours": 10.3133, "text": "Devlog-idk atp Well i said that i would stop working on this project last devlog, butttt, i just saw this https://github.com/random-unknown-username/Thintensor/issues/1 Someone tried thintensor on a 128gb unified ram DGX spark, ANDDDDD now i wanna make it good enough like so its a finished thing"}, {"post_id": 28811, "ts": "2026-07-15T09:45:15Z", "hours": 0.805, "text": "Final devlog: I would be moving from this project to other cool stuff i have in mind, the final benchmarks i got and everything, is pushed, had to do a lot of improvements to get bigger models running just as good as small ones I know there can be a lot of other optmizations, but maybe a few months later ill come back to this, but for now, its gonna stay as is."}, {"post_id": 28164, "ts": "2026-07-14T09:02:15Z", "hours": 13.7189, "text": "This devlog retains the apples-to-apples GPT-OSS control plus fresh Qwen3.5-9B, Llama 3.2 11B text-path, OpenReasoning-Nemotron-14B, and Phi-4 A LOT of optimizations were done to achive this results and 100s of benchmarks in different profiles and stuff, to get to this final table"}, {"post_id": 26560, "ts": "2026-07-11T13:36:08Z", "hours": 2.2911, "text": "ThinRuntime GPT-OSS-20B now achieves: 50.3445 tok/s median across three explicit 200-token runs. llama.cpp b9964 Q4_K_M: 40.3631 tok/s mean. ThinRuntime is 24.73% faster. Exact embedding and LM head; Q1/Q2 applies only to experts. Zero expert transfers during decode. Top-1 unchanged through step 4. Cosine: 0.987376 step 1, 0.983299 step 4. Accepted one-step configuration: 0.991415 cosine. llama.cpp Q4_K_M source-relative cosine: 0.792350."}, {"post_id": 26399, "ts": "2026-07-11T05:13:04Z", "hours": 7.2128, "text": "Worked over a LOT of stuff, like doing apples to apples comparisions of models such as LLama 11b vision instruct, So over time I fixed a lot of stuff added a new profile, that quants and quants and quants all layers till the model fits your VRAM, it doesnt care if the model is 20gb in weigths and you have a 8gb vram, it will quant and make it fit So testing this autofit profile on LLama 11b vision instruct, heres what i found it hit a cosine of 0.939758 and around 24tk/s on a 200 token test Similarly i tested ollama Llama 11b vision instruct with q4_k_m quant, it got a cosine close to 0.720495 i would say it would be more closer to 0.8 because this cosine was for only top 20 logprobes that ollama exposes This was done on 8gb vram rtx 5050 laptop 32gb ddr 5 ryzen 7 250 arch linux and the comparision is apples to apples because the thinruntime also quanted the model aggressively"}, {"post_id": 25725, "ts": "2026-07-10T05:02:15Z", "hours": 1.8908, "text": "Devlog: Resolving GPU Memory Corruption & CUDA Assertions on Wide Matvecs 1. The Symptoms When running inference/benchmarks on unquantized models (like Qwen3.5-9B) using the Triton backend on laptop GPUs (e.g., RTX 5050), the runtime encountered two asynchronous CUDA faults: • cudaErrorIllegalAddress (Illegal memory access) during cache eviction. • device-side assert triggered ( indexSelectSmallIndex assertion failed) during embedding vocabulary lookups. 2. The Root Cause (Resource Starvation & Memory Corruption) Wide Layer Geometries: In Qwen3.5, the projection matrices (Query, Key, Value) have a columns dimension of cols = 3584 . Triton Padded Tiling: Triton pads non-power-of-two shapes to the next power of two ( BLOCK_N = 4096 ). Static Tile Size: The default Triton config mapping uses BLOCK_M = 64 for wide matrices. This instructs Triton to compile a kernel loading a massive static tile size of 64 × 4096 = 262,144 elements. Register & Shared Memory Overflow: In FP32 accumulation, this tile requires 1 MB of memory per thread block. However, laptop GPU streaming multiprocessors (SMs) have a physical hardware limit of 96KB–100KB of shared memory/register files. The Failure Cascade: The compiler failed to allocate resources cleanly, resulting in severe register spills and memory read violations. Triton silently returned corrupted/NaN outputs. The subsequent argmax logit lookup generated a garbage token index (out of bounds), which triggered the PyTorch device-side assertion on the next step. 3. The Fix (Dynamic Chunked Looping) To prevent resource starvation, we modified Triton’s launching configuration in triton_kernels.py: Wide Column Routing: Added a check to detect if cols > 2048 . Looped Execution: Instead of loading the entire 4096 columns block statically, we force the kernel to execute _matvec_looped_kernel using a chunk size of BLOCK_N = 512 . Memory Optimization: The kernel loops through the columns sequentially in chunks of 512. This drops the tile size memory requirement per block to under 64 KB, which safely fits inside any laptop GPU’s physical SM limits. 4. Results I am currently running the final profiles ( max-performance and max-max-perf ). Let me check on the status!"}, {"post_id": 25311, "ts": "2026-07-09T15:03:13Z", "hours": 0.8025, "text": "Posted about this on reddit! https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ Got a lot of feedback, gonna try to work over it over the next few weeks"}, {"post_id": 24643, "ts": "2026-07-08T11:18:54Z", "hours": 0.3739, "text": "Final benchmarks Smaller models have lower cosine because there are like really small like 1B but, some archs are still not fully optimized to run at a good bit faster speed, ik, but i would want to do a ship before working on getting the speed up on those"}, {"post_id": 24238, "ts": "2026-07-07T17:44:41Z", "hours": 0.9025, "text": "Finished benchmarking a few more models Hitting really really good tk/s when compared to hf that even fails to load the models on my 8gb vram, so its a HUGE improvement for gpu poor ppl like me 😭 Reason a lot less improvement for many models is that, each model has a different structure and i havent been able to make a generalized algorithm that would work for all, so for now, we are working with just a simple implementation Benchmark Methodology and Metrics Calculation To ensure accurate, robust, and reproducible results, the benchmarking and correctness scoring flow is executed as follows: 1. Benchmark Execution Workflow Benchmarks are run in isolated, dedicated Python processes for each engine (ThinTensor vs. Hugging Face Transformers) to prevent memory leakage or process interference: ThinTensor Baseline : The model is loaded via the thin_runtime.py engine. Weight Fit Planning : The runtime runs _automatic_fit_plan to estimate weight size. If the model’s weights do not fit within the available GPU VRAM (accounting for system/display manager overhead), it dynamically configures streaming weight residency ( --weight-residency stream ) and streams layers/experts block-by-block from CPU/RAM to the GPU. If the weights fit, it uses fully resident weights ( --weight-residency all ). Timing : Prefills the prompt (default “Hello”), decodes a number of warmup tokens (default 10) to initialize caches and compile/warm up Triton kernels, and then times the next decode steps (default 200) using wall-clock time ( time.perf_counter() ). Transformers (Hugging Face) Baseline : The model is loaded via a dedicated script bench_hf_transformers_decode.py in BF16 precision. RAM/CPU Offloading : For larger models (e.g. Gemma-4-E2B, OLMoE), loading the model fully on memory-constrained GPUs (like the RTX 5050 Laptop GPU with 7.57 GiB VRAM) causes CUDA OOM. To prevent OOM, RAM offloading is enabled via device_map=\"auto\" . Weights that exceed VRAM capacity are kept in CPU system RAM and loaded/swapped as needed. Timing : Like ThinTensor, it pre-runs a prompt prefill, decodes warmup tokens (default 10), and then times steps (default 200) decode steps. The decode loop avoids GPU-to-CPU synchronization (e.g. calling .item() inside the timed loop) to measure pure GPU decoding speed. 2. Metrics & Scores Calculation Thin/HF Peak GiB (Peak GPU Memory) : Tracks peak allocated VRAM in GiB using torch.cuda.max_memory_allocated() . This measures active tensors allocated by PyTorch’s allocator during the decode phase (excluding unallocated cache reserve or general display server memory). Min Cosine (Cosine Similarity) : In compare_hf_thin_logits.py , the logits of the final linear projection layer are collected for both models. Cosine similarity is calculated for the target token index at each step. The minimum cosine similarity found across all decode steps (e.g., step 1 and step 10) and prefill lengths (e.g., 1 and 128) is reported. Top-1 Match : A boolean check indicating whether the token ID with the highest probability (highest logit value) is identical between ThinTensor and HF at all decode steps. Top-5 Set : A boolean check indicating whether the set of top-5 highest-probability token IDs is identical between the two models at all steps (ignoring their internal sorted order). Top-5 Order : A boolean check indicating whether the exact sorted order of the top-5 token IDs matches between ThinTensor and HF at all steps. KV Retention : Specifies the KV cache precision format (e.g. full BF16 )."}, {"post_id": 24052, "ts": "2026-07-07T10:55:07Z", "hours": 5.2325, "text": "Dev Log #4 — 91–96 tok/s with Selective MXFP4 This was the first ThinTensor run that felt genuinely fast. On SmolLM3-3B, the selective MXFP4 gate/up profile reached around: ~91–96 tok/s and on the strong tested record it still preserved: cosine_similarity: 0.9994624257087708 top1_same: true top5_overlap: 0.8 generated_token_match_rate: 0.875 KV retention: full BF16 That cosine is extremely close to the HF BF16 reference: 1.0 - 0.9994624257087708 = 0.0005375742912292 So the run was only about 0.054% away from perfect cosine on that tested checkpoint. Why this was not just normal quantization The profile was selective: MXFP4 gate/up layers: 0:24 MXFP4 row postscale: enabled LM head: FP8 guarded path KV cache: full BF16 attention path: causal KV QKV/O/down: not blindly pushed into MXFP4 A full MXFP4 sweep over QKV, O, down, and gate/up was fast, but it destroyed the logits. That proved the obvious thing: fewer bytes alone is not enough. ThinTensor’s win comes from being role-aware. The runtime knows what each tensor does: Q / K / V O projection gate projection up projection down projection norm embedding LM head KV cache That means the runtime can apply aggressive precision only to the parts that tolerate it. For this result, the safe target was the MLP gate/up path. Why gate/up was the right target Single-token decoding is mostly a weight-read problem. Tthe goal became: reduce gate/up bytes keep attention stable keep KV exact keep LM head guarded preserve token ranking That is exactly what the selective MXFP4 profile does. It uses MXFP4 on the gate/up projections for layers 0:24 , but it does not blindly lower every sensitive path. Where Blackwell helps The test GPU is an RTX 5050 laptop GPU, which is Blackwell. That matters because Blackwell has native low-precision paths for FP4/MXFP4-style execution. ThinTensor uses this through Triton kernels that treat MXFP4 as an execution format, not just a smaller storage format. The idea is: store/read fewer bytes use block scales multiply against BF16 activations accumulate safely then apply row postscale The goal is to make each token cheaper to decode while keeping the output distribution close to HF BF16. The code side The relevant code is built around these ideas: 1. Honest quantization descriptors The QuantizationDescriptor describes the source format: method storage_dtype bits group_size scale_dtype zero_point modules_to_not_convert source_config For example: INT4 != FP4 Q8 != FP8 MXFP4 != generic Q4 The precision_ladder() function makes that explicit. It lists safe choices, opt-in choices, and lossy choices. So instead of silently lowering precision, the runtime can say: preserve native format fallback to BF16 or require explicit validation before requantization 2. Execution planning plan_quantization() decides what should happen at runtime. It can choose: preserve source storage use native kernel dequantize to BF16 or reject unsupported requantization The important flag is this: exact_storage_preserved If this is true, the runtime is using the source encoding directly. Whats next I would have to implement all mainstream model archs manually because all are diff, and like right now you can see, there are a lot of models that are heavily un-optimized Also im messaging stardance team on slack these devlogs too smol for me"}, {"post_id": 22313, "ts": "2026-07-04T18:31:05Z", "hours": 0.8797, "text": "Just hit 91tk/s with “cosine_similarity”: 0.9994624257087708 its actually crazy its like 5x faster the hf full devlog comming soon! ITS LIKE 0.054% away from perfect!!! The selective MXFP4 gate/up profile reached ~96 tok/s while preserving top-1 on the tested SmolLM3-3B through my thintensor runtimeeeee Full DevLogs gonna be crazy"}, {"post_id": 22113, "ts": "2026-07-04T12:07:02Z", "hours": 0.4494, "text": "Initial benchmarks based on some testing on a 3B model Why response similarity? Because we are making a storage format not “just” a runtime, so we need to ensure the model we are optimizing using thintensor runtime it HAS to be replying with the same responses like the original model! So with casual Kv implemented these are the benchmarks i gathered, if you wanna learn what quality fp8 is read my last devlog :D PS- the vram usage on our ThinTensor quality FP8 is just 500 mb more than the q8 even though there is a HUGE difference in the response similarity"}, {"post_id": 22063, "ts": "2026-07-04T09:46:10Z", "hours": 7.5944, "text": "Dev Log #3 — SmolLM3-3B Results SmolLM3-3B was the first real test of ThinTensor as an inference runtime. The baseline was Hugging Face BF16 on my RTX 5050 laptop GPU: HF BF16: ~17.8 tok/s ThinTensor BF16 reached: ThinTensor BF16: ~32–33 tok/s with cosine around 0.999 , meaning the logits stayed extremely close to the original SafeTensors/HF path. That matters because a storage/runtime format should not make the model noticeably worse. Then came the quality FP8 profile: ThinTensor quality FP8: ~46–48 tok/s This was not “quantize everything.” The profile was selective: gate/up projections: FP8 middle down projections: FP8 attention path: BF16 O-proj: BF16 LM head: BF16 KV cache: BF16 ThinTensor can do this because the .thin manifest and execution tape know tensor roles: Q, K, V, O, gate, up, down, norm, embedding, LM head, etc. The runtime can then lower precision only where the model tolerates it, while keeping sensitive paths in BF16. The kernel side reflects this. Attention uses single-token GQA and maps each query head to the right KV head: head = tl . program_id ( 0 ) kv_head = head // ( heads // kv_heads ) scores = tl . sum ( key * q [ None , :], axis = 1 ) * scale The FP8 MLP path uses scaled matvecs: w = tl . load ( weight + offs_m [:, None ] * stride_wm + offs_n [ None , :]) xv = tl . load ( x + offs_n ). to ( tl . float32 ) scale = tl . load ( scales + offs_m ). to ( tl . float32 ) acc = tl . sum ( w * xv [ None , :], axis = 1 ) * scale In one full-vocab centered-logit comparison: GGUF Q8_0 min cosine: 0.952666 ThinTensor BF16 min cosine: 0.999596 ThinTensor quality FP8 min cosine: 0.995366 So ThinTensor quality FP8 stayed much closer to BF16 than the measured Q8 path, while staying in the same speed class. Final speed table: HF BF16: ~17.8 tok/s ThinTensor BF16: ~32–33 tok/s ThinTensor quality FP8: ~46–48 tok/s Ollama / GGUF Q8_0: ~44.1 tok/s Headline: ThinTensor BF16 was ~1.8x faster than HF BF16. ThinTensor quality FP8 was ~2.6x faster than HF BF16. ThinTensor quality FP8 was faster than the measured Q8 baseline while preserving much better logit fidelity. This is where ThinTensor stopped being just an archive experiment and started looking like a real inference runtime :D"}, {"post_id": 20838, "ts": "2026-07-02T15:28:02Z", "hours": 1.5392, "text": "Js got to know that devlogs longer than 10hrs are stripped to 10 😭, i cant have more than 4k char so bear with me theres a LOT to tell that im not able to fit, but ill try my best anyways Dev Log #2 — Converting SafeTensors Into .thin (had to cut so much explaination bcs i HATE THE CHAR LIMIT, id add them in another devlog) The main conversion flow is: pub fn convert_hf ( options : ConvertHfOptions ) -> Result < ConvertHfResult > { let config : Value = serde_json :: from_reader ( File :: open ( options .hf_dir .join ( \"config.json\" )) ? ) ? ; let safetensor_paths = collect_safetensors ( & options .hf_dir ) ? ; let tensors = collect_tensors ( & safetensor_paths ) ? ; let layers = required_u32 ( & config , \"num_hidden_layers\" ) ? ; let model = build_model_spec ( & config , layers , & tensors , & options , & mut warnings ) ? ; let pages = build_pages ( & tensors , & config ) ? ; let execution_tape = build_execution_tape ( layers , & tensors , & mut warnings ) ? ; let manifest = Manifest { format : FORMAT_NAME .to_string (), version : FORMAT_VERSION , model , execution_tape , pages , memory_plan : build_memory_plan ( & config , & tensors ), }; write_archive_pages ( & options .out_path , & manifest , & archive_pages ) ? ; let archive = Archive :: open ( & options .out_path ) ? ; verify_archive ( & archive ) ? ; Ok ( ConvertHfResult { archive , warnings }) } The converter memory-maps each SafeTensors file read-only: let mmap = unsafe { Mmap :: map ( & file ) ? }; let safetensors = SafeTensors :: deserialize ( & mmap ) ? ; let base = mmap .as_ptr () as usize ; Then every tensor becomes a page candidate. The converter records where the tensor bytes live inside the mapped file: let data = tensor .data (); let offset = ( data .as_ptr () as usize ) .checked_sub ( base ) ? ; and stores: struct TensorPage { id : String , path : PathBuf , offset : u64 , size : u64 , checksum : [ u8 ; 32 ], dtype : String , shape : Vec < u64 > , } This avoids rebuilding every tensor in memory. The archive can later copy the original byte range directly: ArchivePageSource :: FileRange { path : tensor .path .clone (), offset : tensor .offset , } After collecting raw tensor data, the converter builds the model spec. It extracts or infers things like hidden size, layer count, attention heads, KV heads, head dimension, RoPE settings, vocab size, activation type, quantization config, and required runtime operators. One important field is attention type: let attention_kind = if kv_heads == heads { \"mha\" } else if kv_heads == 1 { \"mqa\" } else { \"gqa\" }; This matters because many modern decoder models use grouped-query attention. If the runtime only sees shapes but does not understand Q heads vs KV heads, causal attention can be wrong while still looking structurally valid. The converter also records required operators: let mut required_operators = vec! [ \"embedding\" .to_string (), \"rms_norm\" .to_string (), \"qkv_projection\" .to_string (), \"rope\" .to_string (), format! ( \"{attention_kind}_attention\" ), \"o_projection\" .to_string (), \"lm_head\" .to_string (), ]; For dense MLPs it adds: gated_activation down_projection For MoE models it records router and expert stages instead. the rest would be explained in another devlog, i hate the char limit (had to re-write like 10 times btw)"}, {"post_id": 20663, "ts": "2026-07-02T10:03:23Z", "hours": 14.5956, "text": "Dev Log #1 — Why ThinTensor Exists SafeTensors is already a very good format for what it was designed to do: store tensors safely. It keeps tensor metadata simple. For normal model distribution, that is enough. The problem starts when the tensor file becomes the runtime boundary. That is enough if another framework already knows the model class and execution graph. But for an inference runtime, especially one focused on single-token decode, those fields are not enough. The runtime needs to know what each tensor means . The .thin Format The first .thin archive is intentionally simple: .thin = fixed header + JSON manifest + page table + raw page data The Rust implementation defines the archive identity and header size directly: pub const MAGIC: &[u8; 8] = b\"THINv0\\0\\0\"; pub const HEADER_LEN: u32 = 88; The header stores the physical structure of the archive: pub struct Header { pub header_len: u32, pub version: u32, pub manifest_off: u64, pub manifest_len: u64, pub page_table_off: u64, pub page_count: u64, pub data_off: u64, pub archive_hash: [u8; 32], } This lets the loader open the file without guessing. It reads the header, jumps to the manifest, then reads the page table, then maps the raw page data. The manifest is JSON because the early format needed to stay inspectable. It contains the model-level information needed to reconstruct decode: architecture hidden size number of layers attention heads KV heads head dimension vocabulary size RoPE settings tensor names tensor shapes tensor dtypes tensor roles quantization metadata runtime/backend hints validation metadata The page table connects the manifest to real bytes inside the archive: pub struct PageTableRecord { pub page_id: String, pub offset: u64, pub stored_size: u64, pub raw_size: u64, pub flags: u32, pub checksum: [u8; 32], } A page record gives the runtime a verified byte range, not just a tensor name. This matters because pages can later be scheduled, streamed, cached, kept on CPU, moved to GPU, or assigned different execution policies. Packing and Verification The packer does not blindly write files into an archive. It validates the manifest first: let report = validate_manifest(&manifest); if !report.is_ok() { bail!(\"manifest invalid:\\n{}\", report.errors.join(\"\\n\")); } Then every page declared in the manifest must exist and match its declared size: if bytes.len() as u64 != page.size { bail!(\"page declared size does not match file size\"); } It also verifies the page checksum: let checksum = blake3::hash(&bytes); if checksum.as_bytes().as_slice() != expected.as_slice() { bail!(\"page checksum does not match manifest\"); } Only after validation does the writer emit the archive: write_header(&mut file, &header)?; file.write_all(&manifest_bytes)?; for record in &records { write_page_table_record(&mut file, record)?; } for page in pages { write_page_source(&mut file, page)?; } So the final file is structured as: [ header ] [ manifest JSON ] [ page table records ] [ raw page blobs ]"}]...
|
Title: Thintensors by @satvikhardat | Stardance
D Title: Thintensors by @satvikhardat | Stardance
Devlogs:
Dev Log #1 — Why ThinTensor Exists SafeTensors is already a very good format for what it was designed to do: store tensors safely. It keeps tensor metadata simple. For normal model distribution, that is enough. The problem starts when the tensor file becomes the runtime boundary. That is enough if another framework already knows the model class and execution graph. But for an inference runtime, especially one focused on single-token decode, those fields are not enough. The runtime needs to know what each tensor means . The .thin Format The first .thin archive is intentionally simple: .thin = fixed header + JSON manifest + page table + raw page data The Rust implementation defines the archive identity and header size directly: pub const MAGIC: &[u8; 8] = b"THINv0\0\0"; pub const HEADER_LEN: u32 = 88; The header stores the physical structure of the archive: pub struct Header { pub header_len: u32, pub version: u32, pub manifest_off: u64, pub manifest_len: u64, pub page_table_off: u64, pub page_count: u64, pub data_off: u64, pub archive_hash: [u8; 32], } This lets the loader open the file without guessing. It reads the header, jumps to the manifest, then reads the page table, then maps the raw page data. The manifest is JSON because the early format needed to stay inspectable. It contains the model-level information needed to reconstruct decode: architecture hidden size number of layers attention heads KV heads head dimension vocabulary size RoPE settings tensor names tensor shapes tensor dtypes tensor roles quantization metadata runtime/backend hints validation metadata The page table connects the manifest to real bytes inside the archive: pub struct PageTableRecord { pub page_id: String, pub offset: u64, pub stored_size: u64, pub raw_size: u64, pub flags: u32, pub checksum: [u8; 32], } A page record gives the runtime a verified byte range, not just a tensor name. This matters because pages can later be scheduled, streamed, cached, kept on CPU, moved to GPU, or assigned different execution policies. Packing and Verification The packer does not blindly write files into an archive. It validates the manifest first: let report = validate_manifest(&manifest); if !report.is_ok() { bail!("manifest invalid:\n{}", report.errors.join("\n")); } Then every page declared in the manifest must exist and match its declared size: if bytes.len() as u64 != page.size { bail!("page declared size does not match file size"); } It also verifies the page checksum: let checksum = blake3::hash(&bytes); if checksum.as_bytes().as_slice() != expected.as_slice() { bail!("page checksum does not match manifest"); } Only after validation does the writer emit the archive: write_header(&mut file, &header)?; file.write_all(&manifest_bytes)?; for record in &records { write_page_table_record(&mut file, record)?; } for page in pages { write_page_source(&mut file, page)?; } So the final file is structured as: [ header ] [ manifest JSON ] [ page table records ] [ raw page blobs ]
Js got to know that devlogs longer than 10hrs are stripped to 10 😭, i cant have more than 4k char so bear with me theres a LOT to tell that im not able to fit, but ill try my best anyways Dev Log #2 — Converting SafeTensors Into .thin (had to cut so much explaination bcs i HATE THE CHAR LIMIT, id add them in another devlog) The main conversion flow is: pub fn convert_hf ( options : ConvertHfOptions ) -> Result < ConvertHfResult > { let config : Value = serde_json :: from_reader ( File :: open ( options .hf_dir .join ( "config.json" )) ? ) ? ; let safetensor_paths = collect_safetensors ( & options .hf_dir ) ? ; let tensors = collect_tensors ( & safetensor_paths ) ? ; let layers = required_u32 ( & config , "num_hidden_layers" ) ? ; let model = build_model_spec ( & config , layers , & tensors , & options , & mut warnings ) ? ; let pages = build_pages ( & tensors , & config ) ? ; let execution_tape = build_execution_tape ( layers , & tensors , & mut warnings ) ? ; let manifest = Manifest { format : FORMAT_NAME .to_string (), version : FORMAT_VERSION , model , execution_tape , pages , memory_plan : build_memory_plan ( & config , & tensors ), }; write_archive_pages ( & options .out_path , & manifest , & archive_pages ) ? ; let archive = Archive :: open ( & options .out_path ) ? ; verify_archive ( & archive ) ? ; Ok ( ConvertHfResult { archive , warnings }) } The converter memory-maps each SafeTensors file read-only: let mmap = unsafe { Mmap :: map ( & file ) ? }; let safetensors = SafeTensors :: deserialize ( & mmap ) ? ; let base = mmap .as_ptr () as usize ; Then every tensor becomes a page candidate. The converter records where the tensor bytes live inside the mapped file: let data = tensor .data (); let offset = ( data .as_ptr () as usize ) .checked_sub ( base ) ? ; and stores: struct TensorPage { id : String , path : PathBuf , offset : u64 , size : u64 , checksum : [ u8 ; 32 ], dtype : String , shape : Vec < u64 > , } This avoids rebuilding every tensor in memory. The archive can later copy the original byte range directly: ArchivePageSource :: FileRange { path : tensor .path .clone (), offset : tensor .offset , } After collecting raw tensor data, the converter builds the model spec. It extracts or infers things like hidden size, layer count, attention heads, KV heads, head dimension, RoPE settings, vocab size, activation type, quantization config, and required runtime operators. One important field is attention type: let attention_kind = if kv_heads == heads { "mha" } else if kv_heads == 1 { "mqa" } else { "gqa" }; This matters because many modern decoder models use grouped-query attention. If the runtime only sees shapes but does not understand Q heads vs KV heads, causal attention can be wrong while still looking structurally valid. The converter also records required operators: let mut required_operators = vec! [ "embedding" .to_string (), "rms_norm" .to_string (), "qkv_projection" .to_string (), "rope" .to_string (), format! ( "{attention_kind}_attention" ), "o_projection" .to_string (), "lm_head" .to_string (), ]; For dense MLPs it adds: gated_activation down_projection For MoE models it records router and expert stages instead. the rest would be explained in another devlog, i hate the char limit (had to re-write like 10 times btw)
Dev Log #3 — SmolLM3-3B Results SmolLM3-3B was the first real test of ThinTensor as an inference runtime. The baseline was Hugging Face BF16 on my RTX 5050 laptop GPU: HF BF16: ~17.8 tok/s ThinTensor BF16 reached: ThinTensor BF16: ~32–33 tok/s with cosine around 0.999 , meaning the logits stayed extremely close to the original SafeTensors/HF path. That matters because a storage/runtime format should not make the model noticeably worse. Then came the quality FP8 profile: ThinTensor quality FP8: ~46–48 tok/s This was not “quantize everything.” The profile was selective: gate/up projections: FP8 middle down projections: FP8 attention path: BF16 O-proj: BF16 LM head: BF16 KV cache: BF16 ThinTensor can do this because the .thin manifest and execution tape know tensor roles: Q, K, V, O, gate, up, down, norm, embedding, LM head, etc. The runtime can then lower precision only where the model tolerates it, while keeping sensitive paths in BF16. The kernel side reflects this. Attention uses single-token GQA and maps each query head to the right KV head: head = tl . program_id ( 0 ) kv_head = head // ( heads // kv_heads ) scores = tl . sum ( key * q [ None , :], axis = 1 ) * scale The FP8 MLP path uses scaled matvecs: w = tl . load ( weight + offs_m [:, None ] * stride_wm + offs_n [ None , :]) xv = tl . load ( x + offs_n ). to ( tl . float32 ) scale = tl . load ( scales + offs_m ). to ( tl . float32 ) acc = tl . sum ( w * xv [ None , :], axis = 1 ) * scale In one full-vocab centered-logit comparison: GGUF Q8_0 min cosine: 0.952666 ThinTensor BF16 min cosine: 0.999596 ThinTensor quality FP8 min cosine: 0.995366 So ThinTensor quality FP8 stayed much closer to BF16 than the measured Q8 path, while staying in the same speed class. Final speed table: HF BF16: ~17.8 tok/s ThinTensor BF16: ~32–33 tok/s ThinTensor quality FP8: ~46–48 tok/s Ollama / GGUF Q8_0: ~44.1 tok/s Headline: ThinTensor BF16 was ~1.8x faster than HF BF16. ThinTensor quality FP8 was ~2.6x faster than HF BF16. ThinTensor quality FP8 was faster than the measured Q8 baseline while preserving much better logit fidelity. This is where ThinTensor stopped being just an archive experiment and started looking like a real inference runtime :D
Initial benchmarks based on some testing on a 3B model Why response similarity? Because we are making a storage format not “just” a runtime, so we need to ensure the model we are optimizing using thintensor runtime it HAS to be replying with the same responses like the original model! So with casual Kv implemented these are the benchmarks i gathered, if you wanna learn what quality fp8 is read my last devlog :D PS- the vram usage on our ThinTensor quality FP8 is just 500 mb more than the q8 even though there is a HUGE difference in the response similarity
Just hit 91tk/s with “cosine_similarity”: 0.9994624257087708 its actually crazy its like 5x faster the hf full devlog comming soon! ITS LIKE 0.054% away from perfect!!! The selective MXFP4 gate/up profile reached ~96 tok/s while preserving top-1 on the tested SmolLM3-3B through my thintensor runtimeeeee Full DevLogs gonna be crazy
Dev Log #4 — 91–96 tok/s with Selective MXFP4 This was the first ThinTensor run that felt genuinely fast. On SmolLM3-3B, the selective MXFP4 gate/up profile reached around: ~91–96 tok/s and on the strong tested record it still preserved: cosine_similarity: 0.9994624257087708 top1_same: true top5_overlap: 0.8 generated_token_match_rate: 0.875 KV retention: full BF16 That cosine is extremely close to the HF BF16 reference: 1.0 - 0.9994624257087708 = 0.0005375742912292 So the run was only about 0.054% away from perfect cosine on that tested checkpoint. Why this was not just normal quantization The profile was selective: MXFP4 gate/up layers: 0:24 MXFP4 row postscale: enabled LM head: FP8 guarded path KV cache: full BF16 attention path: causal KV QKV/O/down: not blindly pushed into MXFP4 A full MXFP4 sweep over QKV, O, down, and gate/up was fast, but it destroyed the logits. That proved the obvious thing: fewer bytes alone is not enough. ThinTensor’s win comes from being role-aware. The runtime knows what each tensor does: Q / K / V O projection gate projection up projection down projection norm embedding LM head KV cache That means the runtime can apply aggressive precision only to the parts that tolerate it. For this result, the safe target was the MLP gate/up path. Why gate/up was the right target Single-token decoding is mostly a weight-read problem. Tthe goal became: reduce gate/up bytes keep attention stable keep KV exact keep LM head guarded preserve token ranking That is exactly what the selective MXFP4 profile does. It uses MXFP4 on the gate/up projections for layers 0:24 , but it does not blindly lower every sensitive path. Where Blackwell helps The test GPU is an RTX 5050 laptop GPU, which is Blackwell. That matters because Blackwell has native low-precision paths for FP4/MXFP4-style execution. ThinTensor uses this through Triton kernels that treat MXFP4 as an execution format, not just a smaller storage format. The idea is: store/read fewer bytes use block scales multiply against BF16 activations accumulate safely then apply row postscale The goal is to make each token cheaper to decode while keeping the output distribution close to HF BF16. The code side The relevant code is built around these ideas: 1. Honest quantization descriptors The QuantizationDescriptor describes the source format: method storage_dtype bits group_size scale_dtype zero_point modules_to_not_convert source_config For example: INT4 != FP4 Q8 != FP8 MXFP4 != generic Q4 The precision_ladder() function makes that explicit. It lists safe choices, opt-in choices, and lossy choices. So instead of silently lowering precision, the runtime can say: preserve native format fallback to BF16 or require explicit validation before requantization 2. Execution planning plan_quantization() decides what should happen at runtime. It can choose: preserve source storage use native kernel dequantize to BF16 or reject unsupported requantization The important flag is this: exact_storage_preserved If this is true, the runtime is using the source encoding directly. Whats next I would have to implement all mainstream model archs manually because all are diff, and like right now you can see, there are a lot of models that are heavily un-optimized Also im messaging stardance team on slack these devlogs too smol for me
Finished benchmarking a few more models Hitting really really good tk/s when compared to hf that even fails to load the models on my 8gb vram, so its a HUGE improvement for gpu poor ppl like me 😭 Reason a lot less improvement for many models is that, each model has a different structure and i havent been able to make a generalized algorithm that would work for all, so for now, we are working with just a simple implementation Benchmark Methodology and Metrics Calculation To ensure accurate, robust, and reproducible results, the benchmarking and correctness scoring flow is executed as follows: 1. Benchmark Execution Workflow Benchmarks are run in isolated, dedicated Python processes for each engine (ThinTensor vs. Hugging Face Transformers) to prevent memory leakage or process interference: ThinTensor Baseline : The model is loaded via the thin_runtime.py engine. Weight Fit Planning : The runtime runs _automatic_fit_plan to estimate weight size. If the model’s weights do not fit within the available GPU VRAM (accounting for system/display manager overhead), it dynamically configures streaming weight residency ( --weight-residency stream ) and streams layers/experts block-by-block from CPU/RAM to the GPU. If the weights fit, it uses fully resident weights ( --weight-residency all ). Timing : Prefills the prompt (default “Hello”), decodes a number of warmup tokens (default 10) to initialize caches and compile/warm up Triton kernels, and then times the next decode steps (default 200) using wall-clock time ( time.perf_counter() ). Transformers (Hugging Face) Baseline : The model is loaded via a dedicated script bench_hf_transformers_decode.py in BF16 precision. RAM/CPU Offloading : For larger models (e.g. Gemma-4-E2B, OLMoE), loading the model fully on memory-constrained GPUs (like the RTX 5050 Laptop GPU with 7.57 GiB VRAM) causes CUDA OOM. To prevent OOM, RAM offloading is enabled via device_map="auto" . Weights that exceed VRAM capacity are kept in CPU system RAM and loaded/swapped as needed. Timing : Like ThinTensor, it pre-runs a prompt prefill, decodes warmup tokens (default 10), and then times steps (default 200) decode steps. The decode loop avoids GPU-to-CPU synchronization (e.g. calling .item() inside the timed loop) to measure pure GPU decoding speed. 2. Metrics & Scores Calculation Thin/HF Peak GiB (Peak GPU Memory) : Tracks peak allocated VRAM in GiB using torch.cuda.max_memory_allocated() . This measures active tensors allocated by PyTorch’s allocator during the decode phase (excluding unallocated cache reserve or general display server memory). Min Cosine (Cosine Similarity) : In compare_hf_thin_logits.py , the logits of the final linear projection layer are collected for both models. Cosine similarity is calculated for the target token index at each step. The minimum cosine similarity found across all decode steps (e.g., step 1 and step 10) and prefill lengths (e.g., 1 and 128) is reported. Top-1 Match : A boolean check indicating whether the token ID with the highest probability (highest logit value) is identical between ThinTensor and HF at all decode steps. Top-5 Set : A boolean check indicating whether the set of top-5 highest-probability token IDs is identical between the two models at all steps (ignoring their internal sorted order). Top-5 Order : A boolean check indicating whether the exact sorted order of the top-5 token IDs matches between ThinTensor and HF at all steps. KV Retention : Specifies the KV cache precision format (e.g. full BF16 ).
Final benchmarks Smaller models have lower cosine because there are like really small like 1B but, some archs are still not fully optimized to run at a good bit faster speed, ik, but i would want to do a ship before working on getting the speed up on those
Posted about this on reddit! https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ Got a lot of feedback, gonna try to work over it over the next few weeks
Devlog: Resolving GPU Memory Corruption & CUDA Assertions on Wide Matvecs 1. The Symptoms When running inference/benchmarks on unquantized models (like Qwen3.5-9B) using the Triton backend on laptop GPUs (e.g., RTX 5050), the runtime encountered two asynchronous CUDA faults: • cudaErrorIllegalAddress (Illegal memory access) during cache eviction. • device-side assert triggered ( indexSelectSmallIndex assertion failed) during embedding vocabulary lookups. 2. The Root Cause (Resource Starvation & Memory Corruption) Wide Layer Geometries: In Qwen3.5, the projection matrices (Query, Key, Value) have a columns dimension of cols = 3584 . Triton Padded Tiling: Triton pads non-power-of-two shapes to the next power of two ( BLOCK_N = 4096 ). Static Tile Size: The default Triton config mapping uses BLOCK_M = 64 for wide matrices. This instructs Triton to compile a kernel loading a massive static tile size of 64 × 4096 = 262,144 elements. Register & Shared Memory Overflow: In FP32 accumulation, this tile requires 1 MB of memory per thread block. However, laptop GPU streaming multiprocessors (SMs) have a physical hardware limit of 96KB–100KB of shared memory/register files. The Failure Cascade: The compiler failed to allocate resources cleanly, resulting in severe register spills and memory read violations. Triton silently returned corrupted/NaN outputs. The subsequent argmax logit lookup generated a garbage token index (out of bounds), which triggered the PyTorch device-side assertion on the next step. 3. The Fix (Dynamic Chunked Looping) To prevent resource starvation, we modified Triton’s launching configuration in triton_kernels.py: Wide Column Routing: Added a check to detect if cols > 2048 . Looped Execution: Instead of loading the entire 4096 columns block statically, we force the kernel to execute _matvec_looped_kernel using a chunk size of BLOCK_N = 512 . Memory Optimization: The kernel loops through the columns sequentially in chunks of 512. This drops the tile size memory requirement per block to under 64 KB, which safely fits inside any laptop GPU’s physical SM limits. 4. Results I am currently running the final profiles ( max-performance and max-max-perf ). Let me check on the status!
Worked over a LOT of stuff, like doing apples to apples comparisions of models such as LLama 11b vision instruct, So over time I fixed a lot of stuff added a new profile, that quants and quants and quants all layers till the model fits your VRAM, it doesnt care if the model is 20gb in weigths and you have a 8gb vram, it will quant and make it fit So testing this autofit profile on LLama 11b vision instruct, heres what i found it hit a cosine of 0.939758 and around 24tk/s on a 200 token test Similarly i tested ollama Llama 11b vision instruct with q4_k_m quant, it got a cosine close to 0.720495 i would say it would be more closer to 0.8 because this cosine was for only top 20 logprobes that ollama exposes This was done on 8gb vram rtx 5050 laptop 32gb ddr 5 ryzen 7 250 arch linux and the comparision is apples to apples because the thinruntime also quanted the model aggressively
ThinRuntime GPT-OSS-20B now achieves: 50.3445 tok/s median across three explicit 200-token runs. llama.cpp b9964 Q4_K_M: 40.3631 tok/s mean. ThinRuntime is 24.73% faster. Exact embedding and LM head; Q1/Q2 applies only to experts. Zero expert transfers during decode. Top-1 unchanged through step 4. Cosine: 0.987376 step 1, 0.983299 step 4. Accepted one-step configuration: 0.991415 cosine. llama.cpp Q4_K_M source-relative cosine: 0.792350.
This devlog retains the apples-to-apples GPT-OSS control plus fresh Qwen3.5-9B, Llama 3.2 11B text-path, OpenReasoning-Nemotron-14B, and Phi-4 A LOT of optimizations were done to achive this results and 100s of benchmarks in different profiles and stuff, to get to this final table
Final devlog: I would be moving from this project to other cool stuff i have in mind, the final benchmarks i got and everything, is pushed, had to do a lot of improvements to get bigger models running just as good as small ones I know there can be a lot of other optmizations, but maybe a few months later ill come back to this, but for now, its gonna stay as is.
Devlog-idk atp Well i said that i would stop working on this project last devlog, butttt, i just saw this https://github.com/random-unknown-username/Thintensor/issues/1 Someone tried thintensor on a 128gb unified ram DGX spark, ANDDDDD now i wanna make it good enough like so its a finished thing
Implemented a huge list of fixes Lazy page-ID tensor resolution after quantization Storage-alias-aware VRAM accounting Correct affine INT4 partial-group quantization KV sequence continuity checks Free-page geometry invalidation Canonical LM-head bias and final-softcap handling Certified shortlist logic with exact fallback Gemma-style attention scaling/softcap fixes Removal of hot-path CUDA scalar tensor allocations Device normalization for “cuda”, “cuda:N”, and torch.device Profile separation has been reconnected and different profiles select different kernels. Paged KV storage exists through SlabbedKVCache. A prior paged-attention slowdown was caused by GPU synchronization from .item() calls in SlabbedKVCache.append(), not by paged addressing itself. Logical page ownership is now tracked CPU-side to avoid those synchronizations. Paged attention has measured approximately: Materialized: 55.1 tok/s Paged: 57.5 tok/s on a relevant smaller models
What I’ve Done: Fixed KV Cache Indexing in Graph Mode: The previous cudaErrorStreamCaptureUnsupported error and out-of-bounds access were caused by assigning python integers dynamically during capture, and failing to respect block sizing. I modified the KV cache’s _in_graph_mode behavior to compute the tensor-based slot offset dynamically ((slot % block_size).view(1)) directly inside the graph capture. This worked successfully and fully restored the model’s coherent output without breaking graph logic. Experimented with MLP Block Sizing: I attempted to increase block_m and num_warps in the 1-bit Triton kernel (mxfp_lowbit_selected_swiglu) to reduce redundant memory loads of the intermediate x tensor. Unfortunately, register limits and memory layout meant it actually resulted in worse throughput, so I reverted those changes. Experimented with Attention Loop Early Exit: The single_token_gqa_attention_kernel is statically unrolled up to token_bucket (256). I tried adding a dynamic while loop to break early for short context sizes, but Triton’s compiler handles static for loops much better. reached around 65tk/s on gpt-oss-20b, constantly improvising MoE performance, next ima lock in for dense models but for now on MoE
what I did to fix the numerical drift & get some speedups: The Root Cause of the Drift (The Cosine Fix): I discovered that in triton_kernels.py , the tl.dot_scaled call inside _mxfp_lowbit_selected_tensorcore_matvec_kernel (and the mxfp4 variant) had fast_math=True . The fast_math option drops critical precision bits during accumulator addition which was causing the MoE kernels to completely obliterate the trajectory. I disabled it globally using fast_math=False , and this instantly restored our cosine similarity to a perfect 1.000000 over the entire benchmark trajectory. The VRAM Bottleneck: When relying purely on MXFP4 experts, they required over 9.5 GB, breaking the 6.6 GiB budget and forcing the runtime to stream them via PCIe (which tanks performance down to ~5-10tok/s). The Q2 and Q1 low-bit expert decoding kernels actually achieve identical numerical accuracy to the baseline while aggressively packing the weights. The 97.87 tok/s Optimization: I configured bench.py and check_baseline_cosine.py to use: packed_expert_q1_layers="0:24" : All 24 layers of MoE experts are now tightly packed into 1-bit Q1 structures, shrinking the expert memory footprint down to just 2.38 GB (from 9.52 GB). dense_int4_layers="all" : Shrunk the non-expert dense projection weights (Q, K, V, O) into INT4, dropping their footprint from ~1.1 GB to ~0.27 GB. Since the entire model now takes 5.29 GiB (fitting entirely within the 6.6 GiB budget), all layers are pinned directly to VRAM. Because zero layers are streamed (any_streamed=False), the runtime successfully builds the fully fused cuda_graphs execution path, accelerating generation from a crawl to 97.87 tok/s ON gpt-oss-20b. I believe ill be moving to dense models just about now All these issues took SOOO many tests to find
I ammmm tierdd i tried a billionn things over the last 8 hours i just cant seem to understand why gemma4 doesnt want to workkkkk I dont have much to write in this devlog, other than, i am not gonna implement gemma arch for now
ThinTensor Improvements Universal semantic-IR runtime for mixed attention, dense and MoE architectures. Per-tensor precision, kernel and residency planning instead of layer-wide quantization. Production FP8, INT4, MXFP4, Q2 and Q1 quantizers with calibration-aware scoring. Hard ≥0.995 cosine certification with exact routing, greedy-token and KV checks. Qwen3.5 hybrid linear-attention, shared-expert and packed rank-3 MoE support. Durable grouped-INT4 expert sidecars with bounded-RAM, mmap-based construction. Fixed four-matrix Triton projection, cuda / cuda:0 , layer-zero and converter-role bugs. Improved fused kernels, KV caching, expert routing and decode hot paths. Strict cache identity across model, tokenizer, GPU, CUDA, kernels and calibration. Remaining goal: prove ≥30 tok/s on Qwen3.5-35B-A3B at certified ≥0.995 cosine. Getting way better speed on 27B dense models at a cosine that is also way better
Hitting 100hrs and final ship Didnt get time to work on this idea, since quite the while. And it has js about reached the state i can probably get it to MoE arch works, dense models work, cpu/gpu streaming works well, context/kv cache is also dynamically quanted lm_head quants are also there now The motivation really died out because of this project not getting reviewed its been over a month, leaving this as is, tho its not perfect, but it js about has enough features that i wanted Here are the final results after a ton of benchmarking- Phi-4: ThinTensor 28.21 tok/s vs llama.cpp 17.50 tok/s — 1.61× faster (+61.2%). Quality: 0.999949 cosine vs 0.997281. OpenReasoning-Nemotron-14B: ThinTensor 23.79 tok/s vs llama.cpp 19.79 tok/s — 1.20× faster (+20.2%). Quality: 0.999533 vs 0.967140. Llama 3.2 11B: ThinTensor 41.02 tok/s vs llama.cpp 39.82 tok/s — 1.03× faster (+3.0%). Quality: 0.995095 vs 0.991938. Qwen3.5-9B: ThinTensor 43.28 tok/s vs llama.cpp 42.83 tok/s — 1.01× faster (+1.1%). Quality: 0.973334 vs 0.894908. GPT-OSS-20B: ThinTensor 50.34 tok/s vs llama.cpp 40.36 tok/s — 1.25× faster (+24.7%). Quality: 0.983299 vs 0.792350. *all are apples to apples btw Overall: ThinTensor beats llama.cpp Q4 throughput on 5/5 tested architectures , with a geometric-mean speedup of approximately 1.203× . Probably gonna take a break, and learn before comming back to this, after the ship-2 on stardance!
Fixed a few Dense path issues, because the MoE path somehow made the dense path completely usable, fixed a few small one line bugs i got to know from the last ship’s reviews, read to for ship 2!!
Ships:
I made ThinTensor, a runtime-aware LLM archive and inference runtime. Instead of only storing tensor bytes, it stores tensor roles, memory pages, quant metadata, and execution hints so the runtime can choose faster kernels and precision paths. The hardest part was keeping speed gains honest with HF correctness checks. So far it reaches up to ~94 tok/s on SmolLM3-3B with full BF16 KV retention and high logit similarity. After being tested on multiple models, you can get a avg 2x performance increase on most LLM archs, all archs are still not implemented, ik but this is workable with qwen, gemma, some MoE models, and SmolLM and a most others, but it wont be as optimized for all the model types Follow the guide at https://github.com/random-unknown-username/Thintensor#fast-path-setting-up-on-a-new-laptop To install thintensor runtime and use this guide to get a sample qwen model up and running https://github.com/random-unknown-username/Thintensor#quickstart-downloading--running-a-sample-model-qwen-08b
Its a runtime-aware LLM archive format built for fast, efficient inference, This ship basically integrates MoE model paths, that allows you to run models like gpt-oss-20B on speeds and quality faster and better than llama.cpp!! (at q4) its not just the storage format that allows for the improvements, its a combination of different selective layers being quantized with the better storage format, allowing to run inference with higher speed and quality than just simple q8,q4 etc quants. the storage format only gain is only like 10%, but combined with middle out fp8 quants, and even int4 for some performance profiles, it can reach better speeds than the other ways to run inference This does not beat TRT / TRT LM, it does allow for quicker inference, and a more portable solution because for TRT you need to compile the plan (one time) for a few mins before being able to run the model, and it has to be compiled on every machine you run the model on, thintensor allows you to directly have the .thin file and run it on any machine with similar results! and it takes just a few seconds compared to about 30 mins on trt and trt lm reddit post for this project- https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ independent tester’s view- https://github.com/random-unknown-username/Thintensor/issues/1 Let me know if u find any issues, tried a lot of other models here too, as u can see in the graphs :D let me know of any bugs on slack...
|
1792878673.5936122
|
1793742673.5936122
|
|
43429
|
VertyPad by @vertriwayz | Stardance
|
vertriwayz
|
1
|
1.85
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T10:51:00Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made VertyPad, which is a simple and minimalistic Macropad which you can use for macroing, automating your daily life, or just for the love of gaming (maybe GD!). It also has compatibility with both MacOS and Windows. I have no experience in CAD, PCB, and Schematics designing, so it took me quite a while after some YouTube videos and tinkering around the studios. I am very happy on what I have accomplished, by designing the project by hand, whether it is coding the QMK firmware from scratch, to building the CAD from the ground up with sketching and countless extrusions and rotations, I have gone a long journey to build this Macropad. You should remember to flash the vertypad.uf2 firmware file into the XIAO RP2040 microcontroller, so that it can port to VIA, and enable the OLED screen.", "repo": "https://github.com/VihaanVinoth/vertypad", "demo": ""}]...
|
[{"post_id": 84827, "ts": "202 [{"post_id": 84827, "ts": "2026-10-30T12:37:28Z", "hours": 1.8456, "text": "Final Ever Devlog Well, this is the finale. I have pretty much finished my hackpad. I managed to solder all of the components and took like 2 hours to do but it was all worth it in the end I guess. Overall this was an amazing project and I would definitely do it again."}, {"post_id": 52727, "ts": "2026-08-23T01:41:50Z", "hours": 0.2783, "text": "Additional Devlog 1: Building VertyPad So, I basically forgot to move my gerbers.zip file to the production folder in order to get approved, and additionally I also hadn’t made my QMK firmware, so after a few problems of deprecation issues, I was able to compile my firmware and publish to GitHub. This should be the last Devlog, however it is an additional one which is only for the reason being I encountered a submission problem. So, hopefully I should get approved!"}, {"post_id": 52014, "ts": "2026-08-22T01:39:28Z", "hours": 4.7169, "text": "Final DevLog - Building VertyPad Well, it has been a journey . I have worked so much to build VertyPad, and overall I am happy of how it is. I’ve pretty much done everything I can for the macropad, but it doesn’t mean I might stop making revisions for VertyPad. All I need to do now is to ship, and get feedback and hope that I get approved for my macropad. I have made some touches such as making the grooves to guide the pcb slightly bigger so that it can keep the pcb flush with the case, and fix the chamfer of the case because it previously didn’t seem as if the case and plate aligned correctly, and I worked on the final touches of the production files, the QMK firmware, and publishing everything to GitHub."}, {"post_id": 47998, "ts": "2026-08-16T08:46:49Z", "hours": 6.7553, "text": "Devlog 4 - Building VertyPad So far I am reaching pretty much the end of the project, and it has taken me too long to do this, but I think it was going to be worth it. I’ve pretty much finalised the pcb and schematics with the DRC tool, and I have (almost) finished the case and plate, as well as the production files and QMK porting, I just have to fix this weird QMK porting problem and I think it is because I don’t have any more space on my laptop. This gotta be my second last devlog, and I think the next one might be my final one, and hopefully I can get accepted for my macropad once I do my ship post."}, {"post_id": 46780, "ts": "2026-08-14T08:58:40Z", "hours": 12.2297, "text": "Devlog 3? Building VertyPad So I basically had to rewire the whole pcb thing, and completely fix the case and plate, and customize, and import 3d models in KiCad so that I can load into OnShape easily. That’s pretty much it. Hopefully this might be my second last devlog until I finish my whole HackPad. I also got to work on porting to QMK."}, {"post_id": 44480, "ts": "2026-08-10T08:26:06Z", "hours": 9.2367, "text": "Devlog 2 - Update: finished the case - Building VertyPad I finished the case, and it turned out pretty great. It was really hard getting the measurements, and the screws correctly, as I originally planned on using M2 screws but after enlargening the plate I made it compatible with M3 screws. I might continue to touch up on the case and make it look more epic but for now I think I have overall finished my project I think. So far I have: Programmed the Firmware Made PCB & Schema Created Case & Plate Made production files Hopefully I probably can try to make the most of my time now ig and improve the case, because that’s currently my main focus. If any problem arises, like the mounting holes wrong, I might fix that too, but for now everything looks ok for now. Its a pretty simple case but I hope to make it a bit more complex, as all ive done is draft the outer corners of the case, and smooth the usb port, but might as well fix those and add color. I will try to record me building if I get the parts in a few weeks’ time, so thats my devlog rn."}, {"post_id": 42633, "ts": "2026-08-07T13:39:37Z", "hours": 4.3678, "text": "Devlog 1 - Update: finished the foundation: Building VertyPad So I basically began over the course of a few days worked on the schematics, pcb, and the case for VertyPad, and it took me 4 hours. I had some trouble with the case, especially the holes and extrusion. Overall I think it is pretty decent for a simple macropad, but in the next devlog I hope to feature: Improvements to case Develop Schema + PCB Soldering and maybe building the macropad from scratch lapse in the future"}]...
|
Title: VertyPad by @vertriwayz | Stardance
Devlog Title: VertyPad by @vertriwayz | Stardance
Devlogs:
Devlog 1 - Update: finished the foundation: Building VertyPad So I basically began over the course of a few days worked on the schematics, pcb, and the case for VertyPad, and it took me 4 hours. I had some trouble with the case, especially the holes and extrusion. Overall I think it is pretty decent for a simple macropad, but in the next devlog I hope to feature: Improvements to case Develop Schema + PCB Soldering and maybe building the macropad from scratch lapse in the future
Devlog 2 - Update: finished the case - Building VertyPad I finished the case, and it turned out pretty great. It was really hard getting the measurements, and the screws correctly, as I originally planned on using M2 screws but after enlargening the plate I made it compatible with M3 screws. I might continue to touch up on the case and make it look more epic but for now I think I have overall finished my project I think. So far I have: Programmed the Firmware Made PCB & Schema Created Case & Plate Made production files Hopefully I probably can try to make the most of my time now ig and improve the case, because that’s currently my main focus. If any problem arises, like the mounting holes wrong, I might fix that too, but for now everything looks ok for now. Its a pretty simple case but I hope to make it a bit more complex, as all ive done is draft the outer corners of the case, and smooth the usb port, but might as well fix those and add color. I will try to record me building if I get the parts in a few weeks’ time, so thats my devlog rn.
Devlog 3? Building VertyPad So I basically had to rewire the whole pcb thing, and completely fix the case and plate, and customize, and import 3d models in KiCad so that I can load into OnShape easily. That’s pretty much it. Hopefully this might be my second last devlog until I finish my whole HackPad. I also got to work on porting to QMK.
Devlog 4 - Building VertyPad So far I am reaching pretty much the end of the project, and it has taken me too long to do this, but I think it was going to be worth it. I’ve pretty much finalised the pcb and schematics with the DRC tool, and I have (almost) finished the case and plate, as well as the production files and QMK porting, I just have to fix this weird QMK porting problem and I think it is because I don’t have any more space on my laptop. This gotta be my second last devlog, and I think the next one might be my final one, and hopefully I can get accepted for my macropad once I do my ship post.
Final DevLog - Building VertyPad Well, it has been a journey . I have worked so much to build VertyPad, and overall I am happy of how it is. I’ve pretty much done everything I can for the macropad, but it doesn’t mean I might stop making revisions for VertyPad. All I need to do now is to ship, and get feedback and hope that I get approved for my macropad. I have made some touches such as making the grooves to guide the pcb slightly bigger so that it can keep the pcb flush with the case, and fix the chamfer of the case because it previously didn’t seem as if the case and plate aligned correctly, and I worked on the final touches of the production files, the QMK firmware, and publishing everything to GitHub.
Additional Devlog 1: Building VertyPad So, I basically forgot to move my gerbers.zip file to the production folder in order to get approved, and additionally I also hadn’t made my QMK firmware, so after a few problems of deprecation issues, I was able to compile my firmware and publish to GitHub. This should be the last Devlog, however it is an additional one which is only for the reason being I encountered a submission problem. So, hopefully I should get approved!
Final Ever Devlog Well, this is the finale. I have pretty much finished my hackpad. I managed to solder all of the components and took like 2 hours to do but it was all worth it in the end I guess. Overall this was an amazing project and I would definitely do it again.
Ships:
I made VertyPad, which is a simple and minimalistic Macropad which you can use for macroing, automating your daily life, or just for the love of gaming (maybe GD!). It also has compatibility with both MacOS and Windows. I have no experience in CAD, PCB, and Schematics designing, so it took me quite a while after some YouTube videos and tinkering around the studios. I am very happy on what I have accomplished, by designing the project by hand, whether it is coding the QMK firmware from scratch, to building the CAD from the ground up with sketching and countless extrusions and rotations, I have gone a long journey to build this Macropad. You should remember to flash the vertypad.uf2 firmware file into the XIAO RP2040 microcontroller, so that it can port to VIA, and enable the OLED screen....
|
1793508832.3552575
|
1793595232.3552575
|
|
48959
|
My first slack bot! by @Devadutt | Stardance
|
Devadutt
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T10:37:06Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a slack bot that run 24/7.It only have few commands to try out because I don’t have any prior experience using a java script or running it on a server . So it is huge thing for me . If your unsure what command to try use “/oneglass-mate-help” so it will list all he available commands. i was unsure what URL to use as the demo URL, If I was wrong choosing the demo URL . Please give the instruction to where to find it", "repo": "https://github.com/Devadutt-11/slck-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 48976, "ts": "202 [{"post_id": 48976, "ts": "2026-08-17T15:46:43Z", "hours": 1.1422, "text": "My projects now responding!.I added new roast command."}]...
|
Title: My first slack bot! by @Devadutt | Stardanc Title: My first slack bot! by @Devadutt | Stardance
Devlogs:
My projects now responding!.I added new roast command.
Ships:
I made a slack bot that run 24/7.It only have few commands to try out because I don’t have any prior experience using a java script or running it on a server . So it is huge thing for me . If your unsure what command to try use “/oneglass-mate-help” so it will list all he available commands. i was unsure what URL to use as the demo URL, If I was wrong choosing the demo URL . Please give the instruction to where to find it...
|
1793407868.9626932
|
1793494268.9626932
|
|
52770
|
Make a Slack Bot by @ajakovski07 | Stardance
|
ajakovski07
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T10:31:08Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a basic Slack bot out of the provided tutorial. It was my first time hosting something 24/7 thanks to hack clubs nest server and it was an amazing experience. I had a lot of issues with the version control, command prompting it and etc. But i got my way around!!! It was a super easy, fun and educational thing for me that will surely help me in the future to make even harder projects like theese. For using my slack bot…. Just type /smartio-help Byeeee", "repo": "https://github.com/Ajakovski/Make-a-Slack-Bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BSYLSSPQQ"}]...
|
[{"post_id": 52950, "ts": "202 [{"post_id": 52950, "ts": "2026-08-23T10:19:22Z", "hours": 1.2833, "text": "Made my slack bot 24/7 Finally after having loads of issues with finding the correct ssh key BECAUSE MY PC AND COMMAND PANELS ALWAYS FIND A WAY TO MAKE IT DIFFICULT. No but honestly i never completed a guide as it should be because i have downloaded so much stuff for coding that they intersect with eachother whenever i start command prompting. Next stop: Making the repo look nicer and submitting it :)"}, {"post_id": 52383, "ts": "2026-08-22T14:33:59Z", "hours": 1.8, "text": "Building the Slack Bot pt.1 Waiting for the Nest approval…. Also thanks to my limitations for safety that i did as a child on VSCode now i barely managed to use git commands. Had to go astray from the official guide and figure it out myself by opening external terminals because the one in VSCode had some insane protection rules implied. Its a basic bot for the project but i did learn a lot so it was pretty fun. IDEK if this is supposed to go in a devlog XDDD"}]...
|
Title: Make a Slack Bot by @ajakovski07 | Stardanc Title: Make a Slack Bot by @ajakovski07 | Stardance
Devlogs:
Building the Slack Bot pt.1 Waiting for the Nest approval…. Also thanks to my limitations for safety that i did as a child on VSCode now i barely managed to use git commands. Had to go astray from the official guide and figure it out myself by opening external terminals because the one in VSCode had some insane protection rules implied. Its a basic bot for the project but i did learn a lot so it was pretty fun. IDEK if this is supposed to go in a devlog XDDD
Made my slack bot 24/7 Finally after having loads of issues with finding the correct ssh key BECAUSE MY PC AND COMMAND PANELS ALWAYS FIND A WAY TO MAKE IT DIFFICULT. No but honestly i never completed a guide as it should be because i have downloaded so much stuff for coding that they intersect with eachother whenever i start command prompting. Next stop: Making the repo look nicer and submitting it :)
Ships:
I made a basic Slack bot out of the provided tutorial. It was my first time hosting something 24/7 thanks to hack clubs nest server and it was an amazing experience. I had a lot of issues with the version control, command prompting it and etc. But i got my way around!!! It was a super easy, fun and educational thing for me that will surely help me in the future to make even harder projects like theese. For using my slack bot…. Just type /smartio-help Byeeee...
|
1793501803.1231387
|
1793588203.1231387
|
|
25968
|
Simple Calc by @dim | Stardance
|
dim
|
1
|
2.0
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T09:38:59Z", "hours": 2.0, "multiplier": 1.13, "payout": 2, "blessing": "neutral", "text": "I made a claculator with html. It was challenging to set up the editor. Im proud because its my first html project. Its just a normal calculator which took me way too much time to make.", "repo": "https://github.com/the-dimpol-13/calc-html", "demo": "https://the-dimpol-13.itch.io/simple-calc"}]...
|
[{"post_id": 52925, "ts": "202 [{"post_id": 52925, "ts": "2026-08-23T09:35:33Z", "hours": 1.6728, "text": "This was my first html project.Most of the time i spent on this was for seting up the editor for which i used ai but only for this part. It has the standard calculator design with all the numbers, symbols, clear and backspace and i have uploaded it on itch.io for the demo."}]...
|
Title: Simple Calc by @dim | Stardance
Devlogs:
T Title: Simple Calc by @dim | Stardance
Devlogs:
This was my first html project.Most of the time i spent on this was for seting up the editor for which i used ai but only for this part. It has the standard calculator design with all the numbers, symbols, clear and backspace and i have uploaded it on itch.io for the demo.
Ships:
I made a claculator with html. It was challenging to set up the editor. Im proud because its my first html project. Its just a normal calculator which took me way too much time to make....
|
1793462129.4396482
|
1793548529.4396482
|
|
53229
|
Engineering Logo by @young_codex | Stardance
|
young_codex
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T09:38:33Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a 3d model of the Engineering logo of PRESEC-legon. I had some challenges getting the various components modelled and overcoming that challenge is what I am proud of. There is nothing hard to use about this project all you have to do is print it and you have a 3d printed Engineering logo.", "repo": "https://github.com/SAjnr1/3d-modelling", "demo": "https://cad.onshape.com/documents/f2c921c9742f7f62420b6db6/w/e540b6f0a5378effaa7512c3/e/581d434dd1328c494a1031dc?renderMode=0&uiState=6a2f3fdfdf2d5d965a17796d"}]...
|
[{"post_id": 52923, "ts": "202 [{"post_id": 52923, "ts": "2026-08-23T09:28:41Z", "hours": 4.61, "text": "A 3D model of the Engineering logo of the Engineering Unit of PRESEC - Legon"}]...
|
Title: Engineering Logo by @young_codex | Stardanc Title: Engineering Logo by @young_codex | Stardance
Devlogs:
A 3D model of the Engineering logo of the Engineering Unit of PRESEC - Legon
Ships:
I made a 3d model of the Engineering logo of PRESEC-legon. I had some challenges getting the various components modelled and overcoming that challenge is what I am proud of. There is nothing hard to use about this project all you have to do is print it and you have a 3d printed Engineering logo....
|
1793551882.8168888
|
1793638282.8168888
|
|
53144
|
My own site! by @prathamt045 | Stardance
|
prathamt045
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T09:08:12Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "SO what I made is a personal webpage that includes three buttons which redirects the users to my social media accounts.80% of the frontend was made by the AI named Arena. Backend was done by me. I also took the help of github copilot to deploy the project", "repo": "https://github.com/NeonXDev/person-web", "demo": "https://neonxdev.github.io/person-web/"}]...
|
[{"post_id": 52907, "ts": "202 [{"post_id": 52907, "ts": "2026-08-23T09:00:14Z", "hours": 0.7189, "text": "A Personal Webpage of meee."}]...
|
Title: My own site! by @prathamt045 | Stardance
D Title: My own site! by @prathamt045 | Stardance
Devlogs:
A Personal Webpage of meee.
Ships:
SO what I made is a personal webpage that includes three buttons which redirects the users to my social media accounts.80% of the frontend was made by the AI named Arena. Backend was done by me. I also took the help of github copilot to deploy the project...
|
1793541159.0308135
|
1793627559.0308135
|
|
48269
|
Personal Website by @Aamina | Stardance
|
Aamina
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T09:02:20Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a personal website for myself using HTML, CSS, and JavaScript. The most challenging parts were getting the back-to-top button to behave properly as I scrolled, getting the comment section (built with giscus) to actually match my site’s colors instead of looking like a default GitHub page. I’m most proud of the confetti that pops off when you click the potato pic, and finally getting the comment section working and looking the way I wanted it to.", "repo": "https://github.com/Aaminanad/Personal-Website", "demo": "https://aaminanad.github.io/Personal-Website/"}]...
|
[{"post_id": 52895, "ts": "202 [{"post_id": 52895, "ts": "2026-08-23T08:52:52Z", "hours": 1.2336, "text": "DEVLOG 4?? i lost count Anyways! wanted my website to have a cool comments/ contact me/webring kind of thing but it was too much work aand i had no frnds who had webrings sooo i used GISCUS! it was so exciting and easy to do!!"}, {"post_id": 52828, "ts": "2026-08-23T05:44:25Z", "hours": 1.8425, "text": "DEVLOG 3: Worked on the JS code, had a lot of problems in the scroll-up btn so asked my sis..she helped me a lil and now the btn is finally there and working! i still need to add the webring and project;s imgs"}, {"post_id": 52382, "ts": "2026-08-22T14:32:56Z", "hours": 1.7611, "text": "DEVLOG 2: Guys guys! im so so excitedd..made the layout and design of the website today in css, it had aloooot of problems at the beginning but now it works fine, still alpt of things to add here yayayayayyyy"}, {"post_id": 52128, "ts": "2026-08-22T06:54:43Z", "hours": 2.8256, "text": "DEVLOG 1: I am making my personal website hehe, did html work and laid down the basic structure of my website yayayay"}, {"post_id": 47606, "ts": "2026-08-15T16:41:00Z", "hours": 1.7539, "text": "creating my personal website ..still work in progress!"}]...
|
Title: Personal Website by @Aamina | Stardance
De Title: Personal Website by @Aamina | Stardance
Devlogs:
creating my personal website ..still work in progress!
DEVLOG 1: I am making my personal website hehe, did html work and laid down the basic structure of my website yayayay
DEVLOG 2: Guys guys! im so so excitedd..made the layout and design of the website today in css, it had aloooot of problems at the beginning but now it works fine, still alpt of things to add here yayayayayyyy
DEVLOG 3: Worked on the JS code, had a lot of problems in the scroll-up btn so asked my sis..she helped me a lil and now the btn is finally there and working! i still need to add the webring and project;s imgs
DEVLOG 4?? i lost count Anyways! wanted my website to have a cool comments/ contact me/webring kind of thing but it was too much work aand i had no frnds who had webrings sooo i used GISCUS! it was so exciting and easy to do!!
Ships:
I made a personal website for myself using HTML, CSS, and JavaScript. The most challenging parts were getting the back-to-top button to behave properly as I scrolled, getting the comment section (built with giscus) to actually match my site’s colors instead of looking like a default GitHub page. I’m most proud of the confetti that pops off when you click the potato pic, and finally getting the comment section working and looking the way I wanted it to....
|
1793508545.6052601
|
1793594945.6052601
|
|
26971
|
Mini bass by @ItsYaBoyJanan | Stardance
|
ItsYaBoyJanan
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T08:32:15Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "At the beginning, I just found a cheap rusty broken speaker to be specific, a model called “m3 mini”. I opened it up and found the battery was puffed, the driver was popped. It was small in size and I decided to fix it. I got a 2 (approximately) woofer from an old speaker, and I connected it to the board, soldered on a missing capacitor and then replaced the battery, and boom, it was in life. The sound was good but I thought it lacked bass, I added another magnet behind the stock magnet of the same size, then I tried it. It was literally perfect! And I made a diy case with cardboard (my family and i aint got a computer/laptop or 3d printer to design or print one) and finally, it’s finished!", "repo": "https://github.com/ItsYaBoyJanan/Mini-bass", "demo": ""}]...
|
[{"post_id": 35752, "ts": "202 [{"post_id": 35752, "ts": "2026-07-27T12:06:47Z", "hours": 0.2833, "text": "Just finished adding two external wires for external amplified audio"}]...
|
Title: Mini bass by @ItsYaBoyJanan | Stardance
De Title: Mini bass by @ItsYaBoyJanan | Stardance
Devlogs:
Just finished adding two external wires for external amplified audio
Ships:
At the beginning, I just found a cheap rusty broken speaker to be specific, a model called “m3 mini”. I opened it up and found the battery was puffed, the driver was popped. It was small in size and I decided to fix it. I got a 2 (approximately) woofer from an old speaker, and I connected it to the board, soldered on a missing capacitor and then replaced the battery, and boom, it was in life. The sound was good but I thought it lacked bass, I added another magnet behind the stock magnet of the same size, then I tried it. It was literally perfect! And I made a diy case with cardboard (my family and i aint got a computer/laptop or 3d printer to design or print one) and finally, it’s finished!...
|
1793504859.9289486
|
1793591259.9289486
|
|
44959
|
registration by @Nafy | Stardance
|
Nafy
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T07:42:27Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a registration website that can be modified by anyone easy i made this bcs we had a program in school and we were near the date of the program ", "repo": "https://github.com/Muhammed-Nafy-KK/registration", "demo": "https://registration-theta-cyan.vercel.app"}]...
|
[{"post_id": 52864, "ts": "202 [{"post_id": 52864, "ts": "2026-08-23T07:23:21Z", "hours": 1.9236, "text": "i am working on a registration site that can be edited by any one to any use of any one as a template"}]...
|
Title: registration by @Nafy | Stardance
Devlogs: Title: registration by @Nafy | Stardance
Devlogs:
i am working on a registration site that can be edited by any one to any use of any one as a template
Ships:
i made a registration website that can be modified by anyone easy i made this bcs we had a program in school and we were near the date of the program ...
|
1793465467.4490154
|
1793551867.4490154
|
|
25630
|
FIRST Tech Challenge Robot's Shooter by @Emili FIRST Tech Challenge Robot's Shooter by @Emilijaa | Stardance...
|
Emilijaa
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T07:37:47Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made an FTC robot’s shooter mechanism. The challenging part was to get it working consistently with different ARTIFACTS and ensure precision in competitive gameplay. I am proud of the fact that this shooter was completed in the available timeframe with minimal compromises.", "repo": "https://github.com/jonaszaleckas/Emilija-shooter-mechanism", "demo": ""}]...
|
[{"post_id": 19294, "ts": "202 [{"post_id": 19294, "ts": "2026-06-30T15:46:19Z", "hours": 0.7336, "text": "Added proper shooter mounting onto the turret via 4 l-brackets and tpu shims for absorbing vibrations."}, {"post_id": 19115, "ts": "2026-06-30T11:03:16Z", "hours": 0.7667, "text": "Added a CAD model of lazy susan bearing, started making shooter mounts to it. My previous session did not save, however I tried moving the motors closer to the main flywheel in order to test the shooter out with the belts of length we had. This caused a lot of structural issues, with plates bending, as well as made it impossible to fit the large flywheels the way we had planned, so we decided that we will stick with the motors mounted on the back and longer timing belts."}, {"post_id": 17719, "ts": "2026-06-28T17:05:27Z", "hours": 0.5303, "text": "During this session I removed the bottom connecting part to make the manufacturing of parts easier, as well as added a standoff for the top, to pull the both plates together and prevent the shooter from spreading and developing play in the hood mechanism. I will now start the print for the parts and tomorrow at school will try to assemble and see if anything works."}, {"post_id": 17564, "ts": "2026-06-28T12:16:09Z", "hours": 0.5333, "text": "Changed pins from 3D printed to screw heads, to reduce the chances of fracturing due to stress, as well as make manufacturing a bit easier."}, {"post_id": 16848, "ts": "2026-06-27T10:56:02Z", "hours": 3.3625, "text": "During this session I added a servo mechanism, that pivots the latch and so can stop the incoming Artifacts from being shot prematurely. Also, I designed a pin-slot style rail mechanism for the adjustable hood, which is also powered by a single servo, however the tolerances will need to be tested separately before final design. What is more, I added mounting points, that allow mounting this sub-assembly onto our existing old robot for testing and added pocketing to reduce the weight."}, {"post_id": 16163, "ts": "2026-06-26T08:38:39Z", "hours": 0.3286, "text": "Added centering grooves for the main ramp so it can be printed and tested; added plate for Artifact trajectory centering after launch; added mates for the latch."}, {"post_id": 15699, "ts": "2026-06-25T15:06:21Z", "hours": 1.3833, "text": "Refactoring main plate sketches, making proper motor mounts, dividing power transmission into sub-assemblies, adding ramp & latch"}, {"post_id": 15591, "ts": "2026-06-25T11:09:06Z", "hours": 1.0833, "text": "Started 3D model of FTC Decode launcher. Main geometry is almost finished, still need to make a latch mechanism, adjustable hood, and figure out how to mount it onto the robot."}]...
|
Title: FIRST Tech Challenge Robot's Shooter by Title: FIRST Tech Challenge Robot's Shooter by @Emilijaa | Stardance
Devlogs:
Started 3D model of FTC Decode launcher. Main geometry is almost finished, still need to make a latch mechanism, adjustable hood, and figure out how to mount it onto the robot.
Refactoring main plate sketches, making proper motor mounts, dividing power transmission into sub-assemblies, adding ramp & latch
Added centering grooves for the main ramp so it can be printed and tested; added plate for Artifact trajectory centering after launch; added mates for the latch.
During this session I added a servo mechanism, that pivots the latch and so can stop the incoming Artifacts from being shot prematurely. Also, I designed a pin-slot style rail mechanism for the adjustable hood, which is also powered by a single servo, however the tolerances will need to be tested separately before final design. What is more, I added mounting points, that allow mounting this sub-assembly onto our existing old robot for testing and added pocketing to reduce the weight.
Changed pins from 3D printed to screw heads, to reduce the chances of fracturing due to stress, as well as make manufacturing a bit easier.
During this session I removed the bottom connecting part to make the manufacturing of parts easier, as well as added a standoff for the top, to pull the both plates together and prevent the shooter from spreading and developing play in the hood mechanism. I will now start the print for the parts and tomorrow at school will try to assemble and see if anything works.
Added a CAD model of lazy susan bearing, started making shooter mounts to it. My previous session did not save, however I tried moving the motors closer to the main flywheel in order to test the shooter out with the belts of length we had. This caused a lot of structural issues, with plates bending, as well as made it impossible to fit the large flywheels the way we had planned, so we decided that we will stick with the motors mounted on the back and longer timing belts.
Added proper shooter mounting onto the turret via 4 l-brackets and tpu shims for absorbing vibrations.
Ships:
I made an FTC robot’s shooter mechanism. The challenging part was to get it working consistently with different ARTIFACTS and ensure precision in competitive gameplay. I am proud of the fact that this shooter was completed in the available timeframe with minimal compromises....
|
1793494585.517662
|
1793580985.517662
|
|
50712
|
ARYACAST by @aryamankumar2403 | Stardance
|
aryamankumar2403
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T06:28:20Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "AryaCast, a weather dashboard. You search any city and it shows the current Whwther Of Your CITY Compass Needle To rotate Correctly Is Challanging part Just open the live link and search any city name. It also asks for your location on load you Can AllowW Or Skip", "repo": "https://github.com/AryaBuilds/ARYACAST", "demo": "https://aryabuilds.github.io/ARYACAST/"}]...
|
[{"post_id": 52820, "ts": "202 [{"post_id": 52820, "ts": "2026-08-23T05:18:43Z", "hours": 0.2564, "text": "New Look onpired By dorimon Working Perfectly ✌️✌️"}, {"post_id": 52806, "ts": "2026-08-23T04:44:21Z", "hours": 0.4664, "text": "I AMJ BUILDING ARYA CAST I USED OPEN Meteo API THE SITE IS WORKING PERFECTLY I SHIP IT SOON"}, {"post_id": 52789, "ts": "2026-08-23T04:10:15Z", "hours": 0.3142, "text": "I AM MAKING A live weather dashboard the Css is almost completed"}]...
|
Title: ARYACAST by @aryamankumar2403 | Stardance
Title: ARYACAST by @aryamankumar2403 | Stardance
Devlogs:
I AM MAKING A live weather dashboard the Css is almost completed
I AMJ BUILDING ARYA CAST I USED OPEN Meteo API THE SITE IS WORKING PERFECTLY I SHIP IT SOON
New Look onpired By dorimon Working Perfectly ✌️✌️
Ships:
AryaCast, a weather dashboard. You search any city and it shows the current Whwther Of Your CITY Compass Needle To rotate Correctly Is Challanging part Just open the live link and search any city name. It also asks for your location on load you Can AllowW Or Skip...
|
1792878832.7240264
|
1793742832.7240264
|
|
52472
|
developer_56 by @developergaurav56 | Stardance
|
developergaurav56
|
1
|
1.28
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T06:22:19Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "THIS IS MY FIRST INTRODUCTION WEBSITE LIVE! ON https://developer-56.onrender.com/ PLEASE CHECK OUT!! THIS WEBSITE IS INSPIRED FROM RETRO GAMES IT TOOKED ME 2 DAYS TO MAKE THIS WEBSITE I USED OPENCLAW WITH GPT5.6 LUNA FOR PUSHING THE CODE TO GITHUB AND FOR MAKING README.", "repo": "https://github.com/Developer-Gaurav-dev/developer_56", "demo": "https://developer-56.onrender.com/"}]...
|
[{"post_id": 58765, "ts": "202 [{"post_id": 58765, "ts": "2026-08-31T10:22:15Z", "hours": 0.2844, "text": "Small Start Again …"}, {"post_id": 52500, "ts": "2026-08-22T17:19:34Z", "hours": 0.2781, "text": "How’s the Ui Guys??"}, {"post_id": 52414, "ts": "2026-08-22T15:22:27Z", "hours": 0.265, "text": "Working on Portfolio…"}]...
|
Title: developer_56 by @developergaurav56 | Starda Title: developer_56 by @developergaurav56 | Stardance
Devlogs:
Working on Portfolio…
How’s the Ui Guys??
Small Start Again …
Ships:
THIS IS MY FIRST INTRODUCTION WEBSITE LIVE! ON https://developer-56.onrender.com/ PLEASE CHECK OUT!! THIS WEBSITE IS INSPIRED FROM RETRO GAMES IT TOOKED ME 2 DAYS TO MAKE THIS WEBSITE I USED OPENCLAW WITH GPT5.6 LUNA FOR PUSHING THE CODE TO GITHUB AND FOR MAKING README....
|
1793469237.5077422
|
1793555637.5077422
|
|
52684
|
My very own WebOS by @ashudhanda | Stardance
|
|
1
|
52.64
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T06:07:51Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "CanopyOS is a full desktop OS that runs entirely in the browser - no installs, no accounts, no backends. It boots like a real OS, has a lock screen and drops you into forest-themed glass desktop with 10 working apps : Finder, Notes, Terminal, Calculator, Browser etc. The hardest part was the window manager - getting dragging, resizing from all edges and corners, z-stacking and minimize/maximize to all work together without breaking took the longest. The dock magnification math (distance-based icon scaling) was also a fun challenge. Proudest of : Forest Sounds. The rain, wind and birds are NOT audio files - they are synthesized live in your browser with the web audio API. and animations only touch transform/opacity. How to test : open the demo link, wait for boot , click anywhere on the lock screen, Drag windows around, resize them from any corner, hover the dock, press Ctrl+K for Spotlight, right-click the desktop, switch themes in Settings, and try “forest” or “animals” in the Terminal. Everything saves to localStorage so your layout survives a refresh.", "repo": "https://github.com/ashudhanda/webos", "demo": "https://ashudhanda.github.io/webos/"}]...
|
[{"post_id": 57169, "ts": "202 [{"post_id": 57169, "ts": "2026-08-29T08:38:07Z", "hours": 3.025, "text": "After a continuous hard work i add new feature sticky notes app in my Moon OS. And now it working and you can write any task and stick it on your screen. The main important feature is after a refresh it does not remove it stills sticks on your screen. And i am trying too make a very crystal clean and clear WebOS. Stay tunned we complete it as soon as possible."}, {"post_id": 57074, "ts": "2026-08-29T05:06:43Z", "hours": 8.0369, "text": "Try to fixing some bugs in files stay tuned. Nothing is impossible. I giving my 100% and fix it as soon as possible. i try fixing it from long time. but every time i fix one error another new error comes. but i not left i am here until i fix it."}, {"post_id": 56637, "ts": "2026-08-28T13:59:28Z", "hours": 2.2353, "text": "MoonOS now makes voice. today i gave MoonOS voice. literally. Every OS has there sounds soo today our OS have also gain sounds. boot chime - two soft notes when you sing in window open - short blip going up window close - same blip going down notification - a gentle pin. things i fought with today: browser refuse to play audio before the user clicks something (autoplay policy). lucky for me, you have to click to login. so by the time the chime plays. I try too giving my best for my project soo if you find any mistake anywhere just tell in comment section i try to resolve it."}, {"post_id": 56485, "ts": "2026-08-28T08:30:19Z", "hours": 9.3517, "text": "After doing hard work for a long time i add many features in my MoonOS i add 4 themes Luna(Default), Nord, Gruvbox, Everforest. These below screenshots are in Everforest theme. And the next feature is Moveable icons these was challenging and time conusming part but i did it with my dedication. Next main and important feature is taskbar you can see in below screenshot taskbar provides app and a search bar in search bar you can search any app. Next feature is my favourite feature matrix rain when you type matrix in terminal and then enter you see a matrix rain according too your theme style a hacker feel. These was time consuming parts but i did it. And my mind have more features too add in My MoonOS soo stay tunned and enjoy the my WebOS."}, {"post_id": 55665, "ts": "2026-08-27T17:01:46Z", "hours": 2.2472, "text": "I add new Clock Time and Date feature in my MoonOS. See it now."}, {"post_id": 55365, "ts": "2026-08-27T04:31:35Z", "hours": 9.5944, "text": "I completed my WebOS project name MoonOS based on lunar theme and added many features in and after shipping i add more new features in it. Try it with your own hands and share your experience in comment section and if you find any mistake tell in comment section i try to resolve it and make it more better. Now it is audience responsibility to found mistakes in project and help me to make more better it. I add many features in it and four themes in it you can change wallpaper and themes with right click and now my project is ready for shipping See you soon friends in my Next Project. Thanks."}, {"post_id": 54987, "ts": "2026-08-26T12:42:56Z", "hours": 7.1478, "text": "i start making my new moon OS because in past they tell you overused ai but i use slightly ai for debugging from last 7 hours i planning new OS using my mind and write there code i complete it as soon as possible."}, {"post_id": 52814, "ts": "2026-08-23T05:12:19Z", "hours": 0.4756, "text": "Now i completed main.js code and add icons and clock and other features. Try it."}, {"post_id": 52793, "ts": "2026-08-23T04:18:31Z", "hours": 7.8939, "text": "day 2: typed out the base files in VS Code — index.html, all 6 css files, core js (store, boot, contextmenu) and the window manager. first live server run today! the desktop, wallpaper and menubar render, but the js isn’t fully alive yet — clock is stuck at 00:00 and the dock is empty. debugging next."}, {"post_id": 52160, "ts": "2026-08-22T07:59:18Z", "hours": 3.1194, "text": "day 1 finally got around to starting this. set up the repo, connected hackatime, all the boring setup stuff is done. then I built the actual base of the OS. there’s a desktop, a taskbar with a clock, a start button, and one working app (notepad). the windows can be dragged around which is honestly the most satisfying part so far. spent way too long on a bug where the window kept teleporting to the corner of the screen every time I tried to drag it. turns out I wasn’t accounting for where inside the titlebar the mouse was. one offset calculation later and it works perfectly lol still looks pretty basic right now and there’s only one app, but it’s a start. next up is adding more apps and making the theme actually mine instead of the default one."}]...
|
Title: My very own WebOS by @ashudhanda | Stardanc Title: My very own WebOS by @ashudhanda | Stardance
Devlogs:
day 1 finally got around to starting this. set up the repo, connected hackatime, all the boring setup stuff is done. then I built the actual base of the OS. there’s a desktop, a taskbar with a clock, a start button, and one working app (notepad). the windows can be dragged around which is honestly the most satisfying part so far. spent way too long on a bug where the window kept teleporting to the corner of the screen every time I tried to drag it. turns out I wasn’t accounting for where inside the titlebar the mouse was. one offset calculation later and it works perfectly lol still looks pretty basic right now and there’s only one app, but it’s a start. next up is adding more apps and making the theme actually mine instead of the default one.
day 2: typed out the base files in VS Code — index.html, all 6 css files, core js (store, boot, contextmenu) and the window manager. first live server run today! the desktop, wallpaper and menubar render, but the js isn’t fully alive yet — clock is stuck at 00:00 and the dock is empty. debugging next.
Now i completed main.js code and add icons and clock and other features. Try it.
i start making my new moon OS because in past they tell you overused ai but i use slightly ai for debugging from last 7 hours i planning new OS using my mind and write there code i complete it as soon as possible.
I completed my WebOS project name MoonOS based on lunar theme and added many features in and after shipping i add more new features in it. Try it with your own hands and share your experience in comment section and if you find any mistake tell in comment section i try to resolve it and make it more better. Now it is audience responsibility to found mistakes in project and help me to make more better it. I add many features in it and four themes in it you can change wallpaper and themes with right click and now my project is ready for shipping See you soon friends in my Next Project. Thanks.
I add new Clock Time and Date feature in my MoonOS. See it now.
After doing hard work for a long time i add many features in my MoonOS i add 4 themes Luna(Default), Nord, Gruvbox, Everforest. These below screenshots are in Everforest theme. And the next feature is Moveable icons these was challenging and time conusming part but i did it with my dedication. Next main and important feature is taskbar you can see in below screenshot taskbar provides app and a search bar in search bar you can search any app. Next feature is my favourite feature matrix rain when you type matrix in terminal and then enter you see a matrix rain according too your theme style a hacker feel. These was time consuming parts but i did it. And my mind have more features too add in My MoonOS soo stay tunned and enjoy the my WebOS.
MoonOS now makes voice. today i gave MoonOS voice. literally. Every OS has there sounds soo today our OS have also gain sounds. boot chime - two soft notes when you sing in window open - short blip going up window close - same blip going down notification - a gentle pin. things i fought with today: browser refuse to play audio before the user clicks something (autoplay policy). lucky for me, you have to click to login. so by the time the chime plays. I try too giving my best for my project soo if you find any mistake anywhere just tell in comment section i try to resolve it.
Try to fixing some bugs in files stay tuned. Nothing is impossible. I giving my 100% and fix it as soon as possible. i try fixing it from long time. but every time i fix one error another new error comes. but i not left i am here until i fix it.
After a continuous hard work i add new feature sticky notes app in my Moon OS. And now it working and you can write any task and stick it on your screen. The main important feature is after a refresh it does not remove it stills sticks on your screen. And i am trying too make a very crystal clean and clear WebOS. Stay tunned we complete it as soon as possible.
Ships:
CanopyOS is a full desktop OS that runs entirely in the browser - no installs, no accounts, no backends. It boots like a real OS, has a lock screen and drops you into forest-themed glass desktop with 10 working apps : Finder, Notes, Terminal, Calculator, Browser etc. The hardest part was the window manager - getting dragging, resizing from all edges and corners, z-stacking and minimize/maximize to all work together without breaking took the longest. The dock magnification math (distance-based icon scaling) was also a fun challenge. Proudest of : Forest Sounds. The rain, wind and birds are NOT audio files - they are synthesized live in your browser with the web audio API. and animations only touch transform/opacity. How to test : open the demo link, wait for boot , click anywhere on the lock screen, Drag windows around, resize them from any corner, hover the dock, press Ctrl+K for Spotlight, right-click the desktop, switch themes in Settings, and try “forest” or “animals” in the Terminal. Everything saves to localStorage so your layout survives a refresh....
|
1792878474.52067
|
1793742474.52067
|
|
20182
|
SidOS 1: Final Iteration by @SiddyG | Stardance
|
SiddyG
|
1
|
12.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T05:04:24Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a personal web OS for the HackClub WebOS 1 Jam. Through this experience, I learnt a great deal about what to do with elements, classes, IDs, functions, and much more. For my advanced app, I wanted to challenge myself and see what I could do with just a simple app window. I decided to embed a JS-coded game inside the window, and after a bit of brainstorming, I decided to add a classic-Atari-based PONG, which would contribute to a distinct feature in and of itself. I appreciate the learning experience and the great deal of knowledge I gained from building this. I hope you enjoy it, especially the game I spent a few hours building!", "repo": "https://github.com/SiddyG96/PersonalOS", "demo": "https://siddyg96.github.io/PersonalOS/"}]...
|
[{"post_id": 52790, "ts": "202 [{"post_id": 52790, "ts": "2026-08-23T04:14:51Z", "hours": 0.3683, "text": "Minor Tweaks to App Icons & Positioning Added absolute positioning to app icons Adjusted pong icon so it is aligned vertically and spacing is correct"}, {"post_id": 52776, "ts": "2026-08-23T03:47:12Z", "hours": 0.4142, "text": "Fixed Git Page not opening window(s): Made savedTop and savedLeft variables global Made openWindow and closeWindow functions global"}, {"post_id": 52718, "ts": "2026-08-23T01:11:54Z", "hours": 10.9767, "text": "(NOTE: Previous devlog deleted??? I will add everything I have done since the beginning here) OLD Highlights: Added welcome window and small bio Created Mini-Portfolio App Icon Added four sections to Mini-Portfolio (Home, Hobbies, Classes, Aspirations) NEW Highlights: Added a new app –> Pong (Atari Style) - Utilized seperate JS File for this (pong.js) - USE W and S to control paddle - AI Opponent; Singleplayer -Modified “Icon Click” logic to target the iconElement as well as windowId"}]...
|
Title: SidOS 1: Final Iteration by @SiddyG | Stard Title: SidOS 1: Final Iteration by @SiddyG | Stardance
Devlogs:
(NOTE: Previous devlog deleted??? I will add everything I have done since the beginning here) OLD Highlights: Added welcome window and small bio Created Mini-Portfolio App Icon Added four sections to Mini-Portfolio (Home, Hobbies, Classes, Aspirations) NEW Highlights: Added a new app –> Pong (Atari Style) - Utilized seperate JS File for this (pong.js) - USE W and S to control paddle - AI Opponent; Singleplayer -Modified “Icon Click” logic to target the iconElement as well as windowId
Fixed Git Page not opening window(s): Made savedTop and savedLeft variables global Made openWindow and closeWindow functions global
Minor Tweaks to App Icons & Positioning Added absolute positioning to app icons Adjusted pong icon so it is aligned vertically and spacing is correct
Ships:
I made a personal web OS for the HackClub WebOS 1 Jam. Through this experience, I learnt a great deal about what to do with elements, classes, IDs, functions, and much more. For my advanced app, I wanted to challenge myself and see what I could do with just a simple app window. I decided to embed a JS-coded game inside the window, and after a bit of brainstorming, I decided to add a classic-Atari-based PONG, which would contribute to a distinct feature in and of itself. I appreciate the learning experience and the great deal of knowledge I gained from building this. I hope you enjoy it, especially the game I spent a few hours building!...
|
1793461861.9929254
|
1793548261.9929254
|
|
51110
|
My very own WebOS by @ameeksinghv | Stardance
|
ameeksinghv
|
2
|
6.0
|
5
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T04:44:37Z", "hours": 2.0, "multiplier": 2.44, "payout": 5, "blessing": "neutral", "text": "I added a settings app, music app, auditory feedback to user input, ability to change wallpaper, a taskbar, and animations to window open/close! it was pretty difficult but i researched and got through it!", "repo": "https://github.com/singhameek/ValnOS", "demo": "https://valn-os.vercel.app"}, {"ship_num": 2, "ts": "2026-08-19T17:21:01Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a WebOS! The most challenging part was sticking with it tbh, it was kinda boring at times. if ur testing this, its not that good so go easy on me", "repo": "https://github.com/singhameek/ValnOS", "demo": "https://valn-os.vercel.app"}]...
|
[{"post_id": 52805, "ts": "202 [{"post_id": 52805, "ts": "2026-08-23T04:43:22Z", "hours": 0.6794, "text": "added settings app"}, {"post_id": 52778, "ts": "2026-08-23T03:47:41Z", "hours": 1.3233, "text": "Added a taskbar, fixed the header bar positioning, and A MUSIC APP!!!! I used an iframe to access monochrome music which has access to the entire tidal, amazon music, and deezer libraries so THOUSANDS of songs!!!"}, {"post_id": 50479, "ts": "2026-08-19T17:19:26Z", "hours": 0.4319, "text": "Final deployment, link via vercel"}, {"post_id": 50434, "ts": "2026-08-19T16:30:24Z", "hours": 2.7769, "text": "I made a browser app, added date function"}, {"post_id": 49978, "ts": "2026-08-19T00:14:53Z", "hours": 0.6258, "text": "Fixed wallpaper, added clock"}, {"post_id": 49965, "ts": "2026-08-18T23:27:55Z", "hours": 0.3353, "text": "So far I’ve made the homescreen. im having issues with the background, hopefully will resolve."}]...
|
Title: My very own WebOS by @ameeksinghv | Stardan Title: My very own WebOS by @ameeksinghv | Stardance
Devlogs:
So far I’ve made the homescreen. im having issues with the background, hopefully will resolve.
Fixed wallpaper, added clock
I made a browser app, added date function
Final deployment, link via vercel
Added a taskbar, fixed the header bar positioning, and A MUSIC APP!!!! I used an iframe to access monochrome music which has access to the entire tidal, amazon music, and deezer libraries so THOUSANDS of songs!!!
added settings app
Ships:
I made a WebOS! The most challenging part was sticking with it tbh, it was kinda boring at times. if ur testing this, its not that good so go easy on me
I added a settings app, music app, auditory feedback to user input, ability to change wallpaper, a taskbar, and animations to window open/close! it was pretty difficult but i researched and got through it!...
|
1793462066.0147307
|
1793548466.0147307
|
|
46069
|
OPENCALCULATE by @jagathram | Stardance
|
jagathram
|
1
|
10.0
|
31
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T03:49:53Z", "hours": 10.0, "multiplier": 3.01, "payout": 31, "blessing": "neutral", "text": "I’m not here to play with AI—just try my projects and rate them. These are my learning projects, so don’t expect groundbreaking uniqueness, but I’ve put serious effort into them.", "repo": "https://github.com/jagathram-tech/OPENCALCULATE", "demo": "https://opencalculate.vercel.app"}]...
|
[{"post_id": 49620, "ts": "202 [{"post_id": 49620, "ts": "2026-08-18T14:41:15Z", "hours": 3.7678, "text": "New features are dropping soon 🤌🤌"}, {"post_id": 46671, "ts": "2026-08-14T03:32:34Z", "hours": 2.7994, "text": "ADDED the theme toggle , and expanded the capabilities of my basic calc"}, {"post_id": 44414, "ts": "2026-08-10T04:40:20Z", "hours": 1.3992, "text": "Bug Fixes and integrated keyboard input"}, {"post_id": 44388, "ts": "2026-08-10T03:06:49Z", "hours": 2.2083, "text": "THE README AND THE other files are renovated"}]...
|
Title: OPENCALCULATE by @jagathram | Stardance
De Title: OPENCALCULATE by @jagathram | Stardance
Devlogs:
THE README AND THE other files are renovated
Bug Fixes and integrated keyboard input
ADDED the theme toggle , and expanded the capabilities of my basic calc
New features are dropping soon 🤌🤌
Ships:
I’m not here to play with AI—just try my projects and rate them. These are my learning projects, so don’t expect groundbreaking uniqueness, but I’ve put serious effort into them....
|
1792882068.7344944
|
1793746068.7344944
|
|
53019
|
MyPage by @SirYanni | Stardance
|
SirYanni
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T03:40:21Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I got done (for now ;) ) with my Personal Website, which I intended to be a basic introduction of myself and a way to give 2 form of contacting me! I really enjoyed the progress, was just a pretty fun project. I’ll definitely get back to it sometime, altough switching from inline-css to seperated css was a bit of a struggle (all my fault tho). Nice guide, nice side project!", "repo": "https://github.com/siryanni/personalsite-hc", "demo": "https://siryanni.github.io/personalsite-hc/"}]...
|
[{"post_id": 52767, "ts": "202 [{"post_id": 52767, "ts": "2026-08-23T03:32:33Z", "hours": 0.6914, "text": "A few changes Before shipping my Site, I wanted to add nicer Buttons for git/insta, because Hyperlinks just didnt cut it :.) Also tweaked the Font and overall layout a bit."}, {"post_id": 52622, "ts": "2026-08-22T20:49:48Z", "hours": 0.8469, "text": "First Log Today I started off with the basics, relearning a lot cuz it’s been a while! Pretty satisfied with what following the guide gave me, but there’s still a lot of changes to be done! Progress so far in the pic."}]...
|
Title: MyPage by @SirYanni | Stardance
Devlogs:
F Title: MyPage by @SirYanni | Stardance
Devlogs:
First Log Today I started off with the basics, relearning a lot cuz it’s been a while! Pretty satisfied with what following the guide gave me, but there’s still a lot of changes to be done! Progress so far in the pic.
A few changes Before shipping my Site, I wanted to add nicer Buttons for git/insta, because Hyperlinks just didnt cut it :.) Also tweaked the Font and overall layout a bit.
Ships:
I got done (for now ;) ) with my Personal Website, which I intended to be a basic introduction of myself and a way to give 2 form of contacting me! I really enjoyed the progress, was just a pretty fun project. I’ll definitely get back to it sometime, altough switching from inline-css to seperated css was a bit of a struggle (all my fault tho). Nice guide, nice side project!...
|
1793530391.3846755
|
1793616791.3846755
|
|
52132
|
Camo Generator by @aamir_pa2009 | Stardance
|
aamir_pa2009
|
1
|
1.0
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T01:51:50Z", "hours": 1.0, "multiplier": 3.69, "payout": 2, "blessing": "neutral", "text": "I made a digicam type camo generator that you can use different colours to generate. I attached some of the CADPAT patterns I made.", "repo": "https://github.com/AamirKPathan/Camo-Generator", "demo": "https://aamirkpathan.github.io/Camo-Generator/"}]...
|
[{"post_id": 51391, "ts": "202 [{"post_id": 51391, "ts": "2026-08-21T02:06:40Z", "hours": 0.9903, "text": "I made a digiCAM type CAMO generator."}]...
|
Title: Camo Generator by @aamir_pa2009 | Stardance Title: Camo Generator by @aamir_pa2009 | Stardance
Devlogs:
I made a digiCAM type CAMO generator.
Ships:
I made a digicam type camo generator that you can use different colours to generate. I attached some of the CADPAT patterns I made....
|
1793332300.080272
|
1793418700.080272
|
|
45280
|
Project EVE by @BarsMK | Stardance
|
BarsMK
|
1
|
18.0
|
89
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T01:08:43Z", "hours": 18.0, "multiplier": 5.0, "payout": 89, "blessing": "neutral", "text": "I made Project EVE, which is a ESP-32 based scanning system that uses an ultrasonic sensor and servo to scan from 30° to 150°, detect objects, track the closest target, and display the results on an OLED radar interface. I also added Wi-Fi connectivity and a live browser dashboard that shows EVE’s sensor and target data. The most challenging part for me was getting the scanning, target detection, radar visualization, target-lock system, and web dashboard to all work together reliably. It took a lot of debugging, but in the end I made it work. I’m proud that I built the system and kept adding different types of features as I learned more about how to program the ESP32, and wire the electronics and components correctly. To test EVE, connect the hardware, power on the ESP32, and open the IP address shown in the Serial Monitor on a device connected to the same Wi-Fi network. The OLED will show EVE’s Interface while the servo and ultrasonic sensor perform the scan.", "repo": "https://github.com/BarsMK/Project-EVE", "demo": ""}]...
|
[{"post_id": 52673, "ts": "202 [{"post_id": 52673, "ts": "2026-08-22T22:51:45Z", "hours": 1.1208, "text": "Day 12 - Project EVE I haven’t been working on any projects for a while, but today I finished Project EVE! I finished up the web dashboard and made it look way better and more organized. I first tested EVE’s /data endpoint to make sure the ESP32 was correctly sending the live distance, scan angle, target distance, and target angle. I then debugged the webpage and found a JavaScript error that was preventing the values from appearing and updating. After fixing the error, I tested it again and successfully got the sensor and target data updating in the browser. With the live dashboard working, I finished the final testing and got Project EVE ready to submit!"}, {"post_id": 49351, "ts": "2026-08-18T03:55:21Z", "hours": 0.68, "text": "Day 11 - Project EVE I can only work on Project EVE a very little amount this week; but today, I continued Project EVE’s Wi-Fi system by building out the browser dashboard and connecting it to the ESP32’s sensor data. I added a JSON data endpoint that sends EVE’s current distance, scan angle, target distance, and target angle to the webpage. The dashboard now displays this information in a cleaner interface, creating the foundation for EVE’s browser-based monitoring system. The next step is to finish the automatic live updates and complete the final testing and polish."}, {"post_id": 48648, "ts": "2026-08-17T04:00:14Z", "hours": 0.4425, "text": "Day 10 - Project EVE Today I added Wi-Fi connectivity to Project EVE and started building its web interface. EVE can now connect to my Wi-Fi network and host its own webpage, allowing me to view information from the ESP32 through a browser. The webpage currently displays the ultrasonic distance, servo angle, closest detected target, and target angle. I also started setting up a data endpoint for future live updates. Next, I’ll finish automatic webpage updates and turn the interface into a more complete EVE dashboard."}, {"post_id": 47919, "ts": "2026-08-16T05:58:29Z", "hours": 1.3775, "text": "Day 9 - Project EVE For the rest of the day, I continued improving Project EVE by making the wiring more organized and clear, because I got new wires! I replaced the original wires with flatter ones which improved the overall layout of the hardware. I also added a new dedicated rescan button that resets the data and allows EVE to start a new scan AFTER it locks on it’s target and goes on the target lock screen. After improving the target-lock system, I moved on to Wi-Fi and successfully accessed EVE through a browser. Next, I’ll build a future web dashboard that has live sensor data, target information, and a larger radar display."}, {"post_id": 47707, "ts": "2026-08-15T19:55:59Z", "hours": 1.0842, "text": "SOME of day 9 - Project EVE Today I added a target-lock system to Project EVE. After completing a scan, EVE saves the closest detected object’s distance and angle, and displays the locked information on the OLED. I also added a dedicated target-lock screen showing the target distance, angle, and lock status. This makes the radar system more interactive and gives EVE another step towards more advanced target tracking. Next, I plan to add a bit more to the target lock, add Wi-Fi connectivity, do final testing and polish, then prepare EVE for shipping."}, {"post_id": 47292, "ts": "2026-08-15T04:37:40Z", "hours": 0.4939, "text": "Day 8 - Project EVE I did a very little amount of work today, but i improved a bit of the target detection system. I tested the saved closest-target distance and angle and added a larger marker on the radar to make the closest detected target easier to see. I also tested the marker against the target information shown on the status screen. Next, I’ll work on the target lock and start adding Wi-Fi features to the ESP-32."}, {"post_id": 46718, "ts": "2026-08-14T05:06:53Z", "hours": 1.2503, "text": "Day 7 - Project EVE I couldn’t do as much as I wanted too today, but I was improving the status screen and making it more useful for the monitoring system. I added live ultrasonic sensor readings so EVE can display the current distance detected by the sonar, along with the servo’s current angle. I also added target information to the screen using the closest distance and angle saved during a scan. This gave the status window more purpose instead of only showing basic system information. I was testing the updated display for the status screen, debugged and worked through the layout and positioning issues with the distance, target, and angle values. Next, I’ll finish improving the target detection system and begin making EVE more reliable at identifying and tracking the objects that are detected."}, {"post_id": 46163, "ts": "2026-08-13T05:56:29Z", "hours": 2.3561, "text": "Day 6 - Project EVE Today I continued developing Project EVE’s radar system by improving the way the servo and ultrasonic sensor scan the environment. I changed the servo scan from 1° at a time from 30° to 150°, allowing EVE to collect much more detailed distance data across the scanning area. The radar was also able to move more smoothly, due to it not moving in 10° increments. I also increased the radar display size while keeping the scan focused on the first half of the OLED, adjusted the radar arc to match the servo’s scanning range, and changed the detection points to small pixels to reduce the blob-like appearance. At some parts of the radar, it still looks a bit like blobs but I’m gonna attempt to fix that tomorrow. I also added timestamps to the stored distance measurements so the older detections can fade from the radar instead of constantly staying on the screen. I fixed the scan-memory reset so each new scan starts with fresh new data. Next, I’ll improve the radar’s object detection so EVE can recognize separate objects instead of displaying a continues trail of points, then I’ll try to start working towards a target-lock system."}, {"post_id": 45590, "ts": "2026-08-12T05:45:00Z", "hours": 1.7425, "text": "Day 5 - Project EVE Today I continued developing Project EVE by turning the servo and ultrasonic sensor into a radar-style scanning system. I added angle tracking, distance mapping, a moving radar sweep, and detection points on the OLED. I worked on converting the ultrasonic distance and servo angle into X and Y coordinates so the detected objects appear in the correction location on the OLED. I also worked on changing detection sizes based on distance, making closer objects easier to identify on the radar. During testing, I noticed that detections near the edge of the radar blended into the circle, so i was adjusting the distance scaling and display. Next, I’ll continue improving the radar and work on a target-lock system for the closest detected object."}, {"post_id": 45291, "ts": "2026-08-11T17:33:59Z", "hours": 2.4953, "text": "Day 4 - Project EVE Today I continued working on Project EVE by developing the scanning system. I programmed the servo to scan from 30° to 150° in 10° increments while the ultrasonic sensor measures the distance at each angle, and I added a system that remembers the closest distance and the angle where it was detected. I also improved the OLED interface so it displays the current angle, distance, closest distance, and object status, along with a Scan complete screen that shows the final result. During testing, I found a timing issue where the servo angle would update before the distance measurement, which caused the scanning to be delayed. I added a timeout to the distance measurement, which fixed the delay and made the angle and distance updates stay synchronized. Now the ultrasonic sensor, OLED, and code are working together as one scanning system. in 10° increments while the ultrasonic sensor measures the distance at each angle, and I added a system that remembers the closest distance and the angle where it was detected. I also improved the OLED interface so it displays the current angle, distance, closest distance, and object status, along with a Scan complete screen that shows the final result. During testing, I found a timing issue where the servo angle would update before the distance measurement, which caused the scanning to be delayed. I added a timeout to the distance measurement, which fixed the delay and made the angle and distance updates stay synchronized. Now the ultrasonic sensor, OLED, and code are working together as one scanning system."}, {"post_id": 44416, "ts": "2026-08-10T04:49:59Z", "hours": 2.0217, "text": "Day 3 - Project EVE Today I couldn’t do much, but I worked on organizing the wiring for Project EVE and making it easier to work with. I put two breadboards side by side and wired in places which were convenient for me. I connected the ESP32, OLED, ultrasonic sensor, servo, and buttons, and got the buttons working with the menu and scan modes. I also worked on the code for scanning and started adding a bit of a memory system so EVE can remember the closest object it detects and the angle where it found it. I updated the OLED layout to eventually show the current angle and distance along with the closest distance and its angle. It was a shorter session today, but I feel like EVE is starting to come together."}, {"post_id": 43770, "ts": "2026-08-09T06:09:29Z", "hours": 0.8167, "text": "SOME of Day 3 - Project EVE For now, I only had about 25 minutes to work on EVE, but I still got some important stuff done. I made a DIY mount for the ultrasonic sensor and servo (because i don’t have any 3d printer), and after some messing around and adjusting it, they both worked consistently. I also improved the scan screen and added decision making too, so EVE can begin figuring out whether something is close enough to count as an object. I also learned more about millis() and lastScanTime and how if and else statements let EVE make decisions based on the data of the sensor. It wasn’t a long session, but the scanner is feeling more like an actual system instead of a bunch of seperate parts."}, {"post_id": 43602, "ts": "2026-08-08T23:19:52Z", "hours": 1.9172, "text": "Core Interface, Scanning & Navigation Today I worked on turning Project EVE from a bundle of individual hardware tests into an actual working system Part 1: Interface I built the main menu for the OLED and added two-button navigation. The MOVE button switches between: SCAN STATUS The Select button opens whichever option is highlighted with an arrow. I also made Select behave differently depending on EVE’s current mode. From SCAN or STATUS, pressing Select returns EVE to the main menu. This taught me how variables like mode and menuChoice can control the behavior of my embedded system. Part 2: Scanning The scanning system now uses an ESP32, servo, and ultrasonic sensor altogether. The servo sweeps between 30° and 150°, then reverses direction and sweeps back. At each position, the ultrasonic sensor measures the distance. The OLED displays the current servo angle and measured distance. I also changed the scanning system again to use milliseconds instead of blocking the program with long delays. Part 3: Status System I redesigned the STATUS screen to show basic info on the system: SYS: ONLINE SERVO: READY SONAR: READY It’s still a very simple screen but gives EVE a place to eventually display more useful info. Part 4: Problems & Learning One of the biggest problems I ran into was understanding how the buttons and menu variables worked together. I initially had the menu switching back immediately because my if statements were structured incorrectly. Fixing this taught me why else if matters and how changing a variable can affect the next condition. Part 5: What’s Next? The next goal is to make the scanner more intelligent on EVE. Right now, EVE can measure distances at different angles, but doesn’t understand the measurements yet. Next I want to work toward: Putting the ultrasonic sensor on the servo Organizing the wiring Storing scanner measurements Detecting nearby objects & indicating them on the OLED Improving the interface for the scanner Later on determining where an object is located based on their angle and distance After that, I’ll continue developing the hardware and physical design of EVE. This is still an early version of EVE, but the core system is starting to come together."}, {"post_id": 43066, "ts": "2026-08-08T04:00:00Z", "hours": 1.8825, "text": "Devlog #1 - Today I worked on adding servo scanning to Project EVE. I connected the servo and the ultrasonic sensor to the ESP 32. I got them working together so the sensor can measure distances at different angles, but today I could only get to making it work rather than mounting it on top of the servo. I also started learning how to use the millis() function instead of the delay() function and started switching to milliseconds so the scanner can stay responsive while running. I still need to fix the OLED screens and different modes and be able to switch between them with a button. After that, I want to mount the ultrasonic sensor onto the servo in some way, improve the OLED interface, and later on design a proper physical mounting system for the electronics in CAD."}]...
|
Title: Project EVE by @BarsMK | Stardance
Devlogs Title: Project EVE by @BarsMK | Stardance
Devlogs:
Devlog #1 - Today I worked on adding servo scanning to Project EVE. I connected the servo and the ultrasonic sensor to the ESP 32. I got them working together so the sensor can measure distances at different angles, but today I could only get to making it work rather than mounting it on top of the servo. I also started learning how to use the millis() function instead of the delay() function and started switching to milliseconds so the scanner can stay responsive while running. I still need to fix the OLED screens and different modes and be able to switch between them with a button. After that, I want to mount the ultrasonic sensor onto the servo in some way, improve the OLED interface, and later on design a proper physical mounting system for the electronics in CAD.
Core Interface, Scanning & Navigation Today I worked on turning Project EVE from a bundle of individual hardware tests into an actual working system Part 1: Interface I built the main menu for the OLED and added two-button navigation. The MOVE button switches between: SCAN STATUS The Select button opens whichever option is highlighted with an arrow. I also made Select behave differently depending on EVE’s current mode. From SCAN or STATUS, pressing Select returns EVE to the main menu. This taught me how variables like mode and menuChoice can control the behavior of my embedded system. Part 2: Scanning The scanning system now uses an ESP32, servo, and ultrasonic sensor altogether. The servo sweeps between 30° and 150°, then reverses direction and sweeps back. At each position, the ultrasonic sensor measures the distance. The OLED displays the current servo angle and measured distance. I also changed the scanning system again to use milliseconds instead of blocking the program with long delays. Part 3: Status System I redesigned the STATUS screen to show basic info on the system: SYS: ONLINE SERVO: READY SONAR: READY It’s still a very simple screen but gives EVE a place to eventually display more useful info. Part 4: Problems & Learning One of the biggest problems I ran into was understanding how the buttons and menu variables worked together. I initially had the menu switching back immediately because my if statements were structured incorrectly. Fixing this taught me why else if matters and how changing a variable can affect the next condition. Part 5: What’s Next? The next goal is to make the scanner more intelligent on EVE. Right now, EVE can measure distances at different angles, but doesn’t understand the measurements yet. Next I want to work toward: Putting the ultrasonic sensor on the servo Organizing the wiring Storing scanner measurements Detecting nearby objects & indicating them on the OLED Improving the interface for the scanner Later on determining where an object is located based on their angle and distance After that, I’ll continue developing the hardware and physical design of EVE. This is still an early version of EVE, but the core system is starting to come together.
SOME of Day 3 - Project EVE For now, I only had about 25 minutes to work on EVE, but I still got some important stuff done. I made a DIY mount for the ultrasonic sensor and servo (because i don’t have any 3d printer), and after some messing around and adjusting it, they both worked consistently. I also improved the scan screen and added decision making too, so EVE can begin figuring out whether something is close enough to count as an object. I also learned more about millis() and lastScanTime and how if and else statements let EVE make decisions based on the data of the sensor. It wasn’t a long session, but the scanner is feeling more like an actual system instead of a bunch of seperate parts.
Day 3 - Project EVE Today I couldn’t do much, but I worked on organizing the wiring for Project EVE and making it easier to work with. I put two breadboards side by side and wired in places which were convenient for me. I connected the ESP32, OLED, ultrasonic sensor, servo, and buttons, and got the buttons working with the menu and scan modes. I also worked on the code for scanning and started adding a bit of a memory system so EVE can remember the closest object it detects and the angle where it found it. I updated the OLED layout to eventually show the current angle and distance along with the closest distance and its angle. It was a shorter session today, but I feel like EVE is starting to come together.
Day 4 - Project EVE Today I continued working on Project EVE by developing the scanning system. I programmed the servo to scan from 30° to 150° in 10° increments while the ultrasonic sensor measures the distance at each angle, and I added a system that remembers the closest distance and the angle where it was detected. I also improved the OLED interface so it displays the current angle, distance, closest distance, and object status, along with a Scan complete screen that shows the final result. During testing, I found a timing issue where the servo angle would update before the distance measurement, which caused the scanning to be delayed. I added a timeout to the distance measurement, which fixed the delay and made the angle and distance updates stay synchronized. Now the ultrasonic sensor, OLED, and code are working together as one scanning system. in 10° increments while the ultrasonic sensor measures the distance at each angle, and I added a system that remembers the closest distance and the angle where it was detected. I also improved the OLED interface so it displays the current angle, distance, closest distance, and object status, along with a Scan complete screen that shows the final result. During testing, I found a timing issue where the servo angle would update before the distance measurement, which caused the scanning to be delayed. I added a timeout to the distance measurement, which fixed the delay and made the angle and distance updates stay synchronized. Now the ultrasonic sensor, OLED, and code are working together as one scanning system.
Day 5 - Project EVE Today I continued developing Project EVE by turning the servo and ultrasonic sensor into a radar-style scanning system. I added angle tracking, distance mapping, a moving radar sweep, and detection points on the OLED. I worked on converting the ultrasonic distance and servo angle into X and Y coordinates so the detected objects appear in the correction location on the OLED. I also worked on changing detection sizes based on distance, making closer objects easier to identify on the radar. During testing, I noticed that detections near the edge of the radar blended into the circle, so i was adjusting the distance scaling and display. Next, I’ll continue improving the radar and work on a target-lock system for the closest detected object.
Day 6 - Project EVE Today I continued developing Project EVE’s radar system by improving the way the servo and ultrasonic sensor scan the environment. I changed the servo scan from 1° at a time from 30° to 150°, allowing EVE to collect much more detailed distance data across the scanning area. The radar was also able to move more smoothly, due to it not moving in 10° increments. I also increased the radar display size while keeping the scan focused on the first half of the OLED, adjusted the radar arc to match the servo’s scanning range, and changed the detection points to small pixels to reduce the blob-like appearance. At some parts of the radar, it still looks a bit like blobs but I’m gonna attempt to fix that tomorrow. I also added timestamps to the stored distance measurements so the older detections can fade from the radar instead of constantly staying on the screen. I fixed the scan-memory reset so each new scan starts with fresh new data. Next, I’ll improve the radar’s object detection so EVE can recognize separate objects instead of displaying a continues trail of points, then I’ll try to start working towards a target-lock system.
Day 7 - Project EVE I couldn’t do as much as I wanted too today, but I was improving the status screen and making it more useful for the monitoring system. I added live ultrasonic sensor readings so EVE can display the current distance detected by the sonar, along with the servo’s current angle. I also added target information to the screen using the closest distance and angle saved during a scan. This gave the status window more purpose instead of only showing basic system information. I was testing the updated display for the status screen, debugged and worked through the layout and positioning issues with the distance, target, and angle values. Next, I’ll finish improving the target detection system and begin making EVE more reliable at identifying and tracking the objects that are detected.
Day 8 - Project EVE I did a very little amount of work today, but i improved a bit of the target detection system. I tested the saved closest-target distance and angle and added a larger marker on the radar to make the closest detected target easier to see. I also tested the marker against the target information shown on the status screen. Next, I’ll work on the target lock and start adding Wi-Fi features to the ESP-32.
SOME of day 9 - Project EVE Today I added a target-lock system to Project EVE. After completing a scan, EVE saves the closest detected object’s distance and angle, and displays the locked information on the OLED. I also added a dedicated target-lock screen showing the target distance, angle, and lock status. This makes the radar system more interactive and gives EVE another step towards more advanced target tracking. Next, I plan to add a bit more to the target lock, add Wi-Fi connectivity, do final testing and polish, then prepare EVE for shipping.
Day 9 - Project EVE For the rest of the day, I continued improving Project EVE by making the wiring more organized and clear, because I got new wires! I replaced the original wires with flatter ones which improved the overall layout of the hardware. I also added a new dedicated rescan button that resets the data and allows EVE to start a new scan AFTER it locks on it’s target and goes on the target lock screen. After improving the target-lock system, I moved on to Wi-Fi and successfully accessed EVE through a browser. Next, I’ll build a future web dashboard that has live sensor data, target information, and a larger radar display.
Day 10 - Project EVE Today I added Wi-Fi connectivity to Project EVE and started building its web interface. EVE can now connect to my Wi-Fi network and host its own webpage, allowing me to view information from the ESP32 through a browser. The webpage currently displays the ultrasonic distance, servo angle, closest detected target, and target angle. I also started setting up a data endpoint for future live updates. Next, I’ll finish automatic webpage updates and turn the interface into a more complete EVE dashboard.
Day 11 - Project EVE I can only work on Project EVE a very little amount this week; but today, I continued Project EVE’s Wi-Fi system by building out the browser dashboard and connecting it to the ESP32’s sensor data. I added a JSON data endpoint that sends EVE’s current distance, scan angle, target distance, and target angle to the webpage. The dashboard now displays this information in a cleaner interface, creating the foundation for EVE’s browser-based monitoring system. The next step is to finish the automatic live updates and complete the final testing and polish.
Day 12 - Project EVE I haven’t been working on any projects for a while, but today I finished Project EVE! I finished up the web dashboard and made it look way better and more organized. I first tested EVE’s /data endpoint to make sure the ESP32 was correctly sending the live distance, scan angle, target distance, and target angle. I then debugged the webpage and found a JavaScript error that was preventing the values from appearing and updating. After fixing the error, I tested it again and successfully got the sensor and target data updating in the browser. With the live dashboard working, I finished the final testing and got Project EVE ready to submit!
Ships:
I made Project EVE, which is a ESP-32 based scanning system that uses an ultrasonic sensor and servo to scan from 30° to 150°, detect objects, track the closest target, and display the results on an OLED radar interface. I also added Wi-Fi connectivity and a live browser dashboard that shows EVE’s sensor and target data. The most challenging part for me was getting the scanning, target detection, radar visualization, target-lock system, and web dashboard to all work together reliably. It took a lot of debugging, but in the end I made it work. I’m proud that I built the system and kept adding different types of features as I learned more about how to program the ESP32, and wire the electronics and components correctly. To test EVE, connect the hardware, power on the ESP32, and open the IP address shown in the Serial Monitor on a device connected to the same Wi-Fi network. The OLED will show EVE’s Interface while the servo and ultrasonic sensor perform the scan....
|
1793497691.6679206
|
1793584091.6679206
|
|
36190
|
WarioWare Game by @Leijo17 | Stardance
|
Leijo17
|
1
|
11.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T01:05:10Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I finished my WarioWare Game. It’s called PokoWare, and the objective is to collect all the garlic with Poko, a quirky little character obsessed with garlic. To play, use the right and left arrow keys to move right and left, and use the spacebar to jump. I had to deal with many bugs, which I described in my last devlog. For example, I had some problems because the tutorial was inconsistent: It told you to name the scene containing the timer one thing, while referring to it differently in the code. I had to rename scenes or nodes a few times, which caused a lot of errors and confusion. There were several other bugs. For example, I took over an hour trying to figure out why the animations were not working. A few other examples were that the scenes wouldn’t change, the lives wouldn’t decrease, and the garlic wouldn’t get collected. But ChatGPT saved the day! Although this took way longer than I expected, it was still pretty fun. The end.", "repo": "https://github.com/JudahDan/StardanceGame", "demo": "https://leijo17.itch.io/pokoware"}]...
|
[{"post_id": 52670, "ts": "202 [{"post_id": 52670, "ts": "2026-08-22T22:45:53Z", "hours": 2.8619, "text": "Last devlog before shipping the game! There were quite a lot of bugs. I probably spent around half of my time trying to figure out how to fix the bugs, of course with plenty of help from ChatGPT. Without ChatGPT, I could never have finished this project, because the tutorial had some mistakes in it that I, with my zero coding or Godot knowledge, could not catch. For example, the animations wouldn’t work in the first minigame. I honestly still don’t know why that was happening, but I got that fixed by creating a new animation for each node (ugh!). There was also the problem that it didn’t know you were done even after you collected all the garlics. That was a rather simple fix in the script, but there was lots of stuff tied to that that also took a while. Then there was the problem with the timer, because the tutorial told you to name the scene with the timer one thing, then referred to it differently in the script. That took over an hour to fix! (Maybe I’m just really dumb.) Those were just three of the bugs. And the tutorial was inconsistent with how it would name the scenes, so I had to rename a lot of stuff. Each renaming took at least ten minutes, because for one thing the file manager would always get messed up, and if what you renamed was mentioned in a script, there would be a ton of errors to fix. So that’s that. But at least I’m finally done after like ten and a half hours of work. The end."}, {"post_id": 41060, "ts": "2026-08-05T00:44:41Z", "hours": 3.7667, "text": "I finished the first minigame! (after like 4 hours and even more time fixing bugs with ChatGPT). Quite simple, ngl not very fun, but it’s a start. The tutorial assumes you did a lot of things that it doesn’t tell you to do, which is really annoying and caused a ton of bugs. It also named the nodes one thing, then referred to them differently in the script, causing even more bugs. I, knowing nearly nothing about coding, could only somewhat figure out what these bugs were about. but, luckily, ChatgpT came and saved the day! There were also problems when I’d rename files, but now I know how to fix those. That’s it! The end."}, {"post_id": 36065, "ts": "2026-07-27T22:17:55Z", "hours": 3.0842, "text": "I’ve now added the player and am working on the first minigame. Right now I just have the ground and the background for the minigame. I made the player sprite on Piskel (does anybody else use that?). For some reason it’s blurry here, but it’s not blurry in Godot thankfully. So far I have only one problem, but as far as I can tell it’s quite a big problem. It never gets to my minigame screen! It goes from the title screen to the timer screen, and just stays on that forever! There seems to be a lot of errors but I have no idea what they mean, and also, since I copy pasted my code directly from the mission guide, I don’t know why there even are errors. The end."}, {"post_id": 32140, "ts": "2026-07-21T03:12:11Z", "hours": 1.3392, "text": "This is my first devlog! I’m almost completely new to coding and stuff (except a tiny bit of Python), and I just joined Stardance three days ago, so this is my first project. I’ve worked on it for about an hour and a half so far, and… honestly not making nearly as much progress as I expected. Maybe that’s because I’ve only coded with AI to make games in VSCodium in the past. (I’d just ask it to make a game like so and so, then copy & paste XD.) But, anyway, it’s asking me to post so I guess I have to post. This whole “stardust” and “shipping” thing is still very confusing, but I guess I’ll figure it out. So far, as you can see, I have only made the title screen and level scene. And on the title screen, only the “start game” button does anything. I’m not sure what’s wrong with the other buttons, so could somebody help? (That probably made me look really stupid. I can hear somebody saying, “Silly Finnish Linux users!” Ok, they’re probably not saying that, but whatever.) I’m pretty sure I coded it right for the “quit” button to quit… but the guide was a bit confusing. Anyway, that’s all, thanks for reading through the whole boring thing if you did, and if you didn’t, well… I wouldn’t have, either."}]...
|
Title: WarioWare Game by @Leijo17 | Stardance
Dev Title: WarioWare Game by @Leijo17 | Stardance
Devlogs:
This is my first devlog! I’m almost completely new to coding and stuff (except a tiny bit of Python), and I just joined Stardance three days ago, so this is my first project. I’ve worked on it for about an hour and a half so far, and… honestly not making nearly as much progress as I expected. Maybe that’s because I’ve only coded with AI to make games in VSCodium in the past. (I’d just ask it to make a game like so and so, then copy & paste XD.) But, anyway, it’s asking me to post so I guess I have to post. This whole “stardust” and “shipping” thing is still very confusing, but I guess I’ll figure it out. So far, as you can see, I have only made the title screen and level scene. And on the title screen, only the “start game” button does anything. I’m not sure what’s wrong with the other buttons, so could somebody help? (That probably made me look really stupid. I can hear somebody saying, “Silly Finnish Linux users!” Ok, they’re probably not saying that, but whatever.) I’m pretty sure I coded it right for the “quit” button to quit… but the guide was a bit confusing. Anyway, that’s all, thanks for reading through the whole boring thing if you did, and if you didn’t, well… I wouldn’t have, either.
I’ve now added the player and am working on the first minigame. Right now I just have the ground and the background for the minigame. I made the player sprite on Piskel (does anybody else use that?). For some reason it’s blurry here, but it’s not blurry in Godot thankfully. So far I have only one problem, but as far as I can tell it’s quite a big problem. It never gets to my minigame screen! It goes from the title screen to the timer screen, and just stays on that forever! There seems to be a lot of errors but I have no idea what they mean, and also, since I copy pasted my code directly from the mission guide, I don’t know why there even are errors. The end.
I finished the first minigame! (after like 4 hours and even more time fixing bugs with ChatGPT). Quite simple, ngl not very fun, but it’s a start. The tutorial assumes you did a lot of things that it doesn’t tell you to do, which is really annoying and caused a ton of bugs. It also named the nodes one thing, then referred to them differently in the script, causing even more bugs. I, knowing nearly nothing about coding, could only somewhat figure out what these bugs were about. but, luckily, ChatgpT came and saved the day! There were also problems when I’d rename files, but now I know how to fix those. That’s it! The end.
Last devlog before shipping the game! There were quite a lot of bugs. I probably spent around half of my time trying to figure out how to fix the bugs, of course with plenty of help from ChatGPT. Without ChatGPT, I could never have finished this project, because the tutorial had some mistakes in it that I, with my zero coding or Godot knowledge, could not catch. For example, the animations wouldn’t work in the first minigame. I honestly still don’t know why that was happening, but I got that fixed by creating a new animation for each node (ugh!). There was also the problem that it didn’t know you were done even after you collected all the garlics. That was a rather simple fix in the script, but there was lots of stuff tied to that that also took a while. Then there was the problem with the timer, because the tutorial told you to name the scene with the timer one thing, then referred to it differently in the script. That took over an hour to fix! (Maybe I’m just really dumb.) Those were just three of the bugs. And the tutorial was inconsistent with how it would name the scenes, so I had to rename a lot of stuff. Each renaming took at least ten minutes, because for one thing the file manager would always get messed up, and if what you renamed was mentioned in a script, there would be a ton of errors to fix. So that’s that. But at least I’m finally done after like ten and a half hours of work. The end.
Ships:
I finished my WarioWare Game. It’s called PokoWare, and the objective is to collect all the garlic with Poko, a quirky little character obsessed with garlic. To play, use the right and left arrow keys to move right and left, and use the spacebar to jump. I had to deal with many bugs, which I described in my last devlog. For example, I had some problems because the tutorial was inconsistent: It told you to name the scene containing the timer one thing, while referring to it differently in the code. I had to rename scenes or nodes a few times, which caused a lot of errors and confusion. There were several other bugs. For example, I took over an hour trying to figure out why the animations were not working. A few other examples were that the scenes wouldn’t change, the lives wouldn’t decrease, and the garlic wouldn’t get collected. But ChatGPT saved the day! Although this took way longer than I expected, it was still pretty fun. The end....
|
1793440392.4676337
|
1793526792.4676337
|
|
24968
|
Game Randomiser by @Pixeleyesd | Stardance
|
Pixeleyesd
|
1
|
8.82
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T00:36:05Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a hardware project designed for ESP32 to help decide what game to play as well as what difficulty, alongside a timer feature. It features an I2c OLED as the display out and a rotary encoder for input.", "repo": "https://github.com/Pixeleyesd/Game-Chooser", "demo": ""}]...
|
[{"post_id": 73364, "ts": "202 [{"post_id": 73364, "ts": "2026-09-25T00:15:32Z", "hours": 3.0986, "text": "Sooooo i forgot that I’d have to update the README.md and do the BOM.csv, so there goes 3 hours of my life :/"}, {"post_id": 70912, "ts": "2026-09-20T00:55:05Z", "hours": 0.7247, "text": "I didn’t track any of my time, but here is the new progress :) I made a new case, with screws securing basically everything together. I have physically built this, and I am now printing the finalised project."}, {"post_id": 41026, "ts": "2026-08-04T22:54:47Z", "hours": 0.2744, "text": "I finished my readme.md complete with images, and I am making the release."}, {"post_id": 41023, "ts": "2026-08-04T22:32:15Z", "hours": 1.1128, "text": "I finished up my game randomiser, and I’m approaching 1k lines of code cuz im js that bad at coding guys T-T."}, {"post_id": 32190, "ts": "2026-07-21T06:05:29Z", "hours": 1.6272, "text": "I put everything together, making a menu and sub menus, following the flowchart.I then implemented the OLED display for a better viewing experience. Next step is to implement the SD Card reader, so the lists and consoles chosen in config stay remembered in persistent storage"}, {"post_id": 21800, "ts": "2026-07-03T22:32:28Z", "hours": 2.4717, "text": "I have already assembled my circuit. To begin with, I made a simple test code to run on the LCD. I then made the random function correlate to a list of games I made. Next, I integrated my game randomisation and my menu to randomise in specific categories. The current categories are: Xbox, Playstation, Nintendo and PC. I didn’t come across too many errors, as I was just combining code. An issue I did come across however, was mismatched list names, which was an easy fix (renaming case 0: chosenGame = String(xboxgames[index]); break; To case 0: chosenGame = String(xboxGames[index]); break;, notice the capital G.) After this, I made a menu and game randomisation work together to make a full version of my flowchart below. I will now make it use the SD card for the lists, and a webserver to send updated versions of the lists. (oh yeah I also added a rotary encoder to the circuit)"}]...
|
Title: Game Randomiser by @Pixeleyesd | Stardance
Title: Game Randomiser by @Pixeleyesd | Stardance
Devlogs:
I have already assembled my circuit. To begin with, I made a simple test code to run on the LCD. I then made the random function correlate to a list of games I made. Next, I integrated my game randomisation and my menu to randomise in specific categories. The current categories are: Xbox, Playstation, Nintendo and PC. I didn’t come across too many errors, as I was just combining code. An issue I did come across however, was mismatched list names, which was an easy fix (renaming case 0: chosenGame = String(xboxgames[index]); break; To case 0: chosenGame = String(xboxGames[index]); break;, notice the capital G.) After this, I made a menu and game randomisation work together to make a full version of my flowchart below. I will now make it use the SD card for the lists, and a webserver to send updated versions of the lists. (oh yeah I also added a rotary encoder to the circuit)
I put everything together, making a menu and sub menus, following the flowchart.I then implemented the OLED display for a better viewing experience. Next step is to implement the SD Card reader, so the lists and consoles chosen in config stay remembered in persistent storage
I finished up my game randomiser, and I’m approaching 1k lines of code cuz im js that bad at coding guys T-T.
I finished my readme.md complete with images, and I am making the release.
I didn’t track any of my time, but here is the new progress :) I made a new case, with screws securing basically everything together. I have physically built this, and I am now printing the finalised project.
Sooooo i forgot that I’d have to update the README.md and do the BOM.csv, so there goes 3 hours of my life :/
Ships:
I made a hardware project designed for ESP32 to help decide what game to play as well as what difficulty, alongside a timer feature. It features an I2c OLED as the display out and a rotary encoder for input....
|
1792828164.7171497
|
1793692164.7171497
|
|
46193
|
Nay's Portfolio (v2) by @Nay | Stardance
|
Nay
|
2
|
19.0
|
218
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T23:10:00Z", "hours": 12.0, "multiplier": 18.5, "payout": 218, "blessing": "neutral", "text": "I made the Home Page to my Personal Portfolio!!! Its kitted out with everything a good personal site could want, from a pretty hero, some simple GSAP scroll timeline animations, an about me, some work experience, and an excessive amount of custom artwork!!! And yet my favorite part of this page was not the artwork, but instead a moving carosol of fancy pieces of paper (read: certifications), that took me way too much time. Its scuffed, but its my scuffed. Im hoping in the future to add seperate portolio sections for both art and tech, but that is solidly a future me problem. Currently, Im quite happy with the state its in right now, and I think its at least ready to be shared :DDD", "repo": "https://github.com/Nayraiyt/V2-Portfolio", "demo": "https://nayraiyt.github.io/V2-Portfolio/"}, {"ship_num": 2, "ts": "2026-08-10T01:26:09Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made (the start) to my portfolio!!! Currently, its got the basic structure of a personal site, A flashy hero, an about-me, work experience. What I’m most proud of with this site, is the small shine animation that i put on my cards (it took so long) It gives them that shinny holographic feel, and really makes it pop. I’m also very pleased with how all the art came out, as well as the simple CSS animations (I think I’ve added clouds to every single web based project I’ve ever made…).", "repo": "https://github.com/Nayraiyt/V2-Portfolio", "demo": "https://nayraiyt.github.io/V2-Portfolio/"}]...
|
[{"post_id": 52681, "ts": "202 [{"post_id": 52681, "ts": "2026-08-22T23:03:22Z", "hours": 1.0875, "text": "The site is now more mobile friendly!!! Yippie!!! 5 commits later, after realizing that the inspect mobile looked vastly different than looking at the site on my own phone, and a little bit of patience. i also added an under construction sign for the art and tech pages."}, {"post_id": 50766, "ts": "2026-08-20T04:06:59Z", "hours": 0.6183, "text": "Added 2 more project tiles :D (they also flip, very cool, very cool!!)"}, {"post_id": 50737, "ts": "2026-08-20T02:46:14Z", "hours": 1.7692, "text": "I started work on the Art Portolio Section of my Site!!! This is very much “make it work first, then make it pretty.” I wanted to have cool flippable cards, which transition from the project asset board, to some basic info about the event/project."}, {"post_id": 49943, "ts": "2026-08-18T22:24:50Z", "hours": 1.85, "text": "I simplified the logic for my moving carosol. Each paper moves independently on a delay. It’s kinda a stupid fix to a stupid problem, but hey. If it works, dont touch it. Im just not going to breathe in its dirrection for a hot second. I also added in a little footer with contact info :D"}, {"post_id": 46443, "ts": "2026-08-13T17:32:24Z", "hours": 0.6217, "text": "Fixed Fancy Paper Carosol!!! (it loops now :DDDD)"}, {"post_id": 46133, "ts": "2026-08-13T04:37:13Z", "hours": 2.2264, "text": "What went well: Changed hero image, i think its cuter now. Added more gsap animations cuz we extra here Began with Certifications and Contacts sections Did more mobile friendly ness for smaller screen sizes What went bad: spent an unhealthy amount of time trying to get a cool infinite carosol for my fancy pieces of paper. TLDR. Its not working right now. I’ve got it to loop, but it doesnt have a smooth transition back into frame. Now its a tomorrow problem."}, {"post_id": 44952, "ts": "2026-08-11T01:47:37Z", "hours": 0.9167, "text": "Made my site marginally more mobile friendly! (also had to figure out gsap match media, so that the animations made more sense) Its also now hosted on a domain!!! (TY HACKCLUB)"}, {"post_id": 44681, "ts": "2026-08-10T16:36:18Z", "hours": 2.7003, "text": "Today was GSAP day (a very pretty JS library for smooth animations, + a bunch of other cool stuffs, but mostly the smooth animations with time lines and triggers, ect) So unfortunately, past Nay had set up a lot of their css layout in a way that was incompatable (over-use of position: absolute) with GSAP’s smooth scrolling, so i spend a while refactoring that for it to work. Yippie. I also added in smooth scroll to for the different sections of my site, with the nav bar. For transitions, i used GSAP Scroll Trigger to add subtle fade in to the work section, as well as the nav bar, which zipps across the screen when you pass over it. In the future, i want to add a plane to one of the buttons, so it looks more natural."}, {"post_id": 44336, "ts": "2026-08-10T01:01:45Z", "hours": 7.3422, "text": "OK! Dev log time >:D I wanted to make a personal portfolio this summer, before University starts to kick my butt, so here we are!!! I started by drawing out the hero on procreate. This included individual clouds, and the penguin moon, you see featured in the center. Then with some simple css animations, and 30 hand placed stars (there had gotta be a faster way to do that, but if there is i have no idea what it is…), The sky was coming together. in order to have a smooth is transition to the about me section, I wanted to have hills which fade into the same color. I think the full layout for everything in this site is grid, (because grid be the goat). I drew out the profile picture, added in a quick description, and threw in a small blurb about drinking water, because i had a very pretty drawing of a cup of water lying around that i wanted to include. Next up, i did the work experience section. Its fairly straight forwards, since i honestly took most of the text straight from my resume, and added an inset to the base so that the work cards popped a bit more. My vision for the rest of the site, is to have 2 main path ways. One leads to an art portfolio, and the other leads to a tech portfolio, depending on which one you click on. The reason i choose cards, was 100% based on the hackclub counterspell’s site, but instead with cats! I wanted them to have a holo-foil feel, so i added in a hover animation to them, that has a shine transform over the card. (its very cool, and took me a really long time so please praise it) Then, i went back and added in abunch of hover animations to the rest of the site to make it feel more alive. And, that’s about all for this log!! Thanks for scrolling if you got this far!!!"}]...
|
Title: Nay's Portfolio (v2) by @Nay | Stardanc Title: Nay's Portfolio (v2) by @Nay | Stardance
Devlogs:
OK! Dev log time >:D I wanted to make a personal portfolio this summer, before University starts to kick my butt, so here we are!!! I started by drawing out the hero on procreate. This included individual clouds, and the penguin moon, you see featured in the center. Then with some simple css animations, and 30 hand placed stars (there had gotta be a faster way to do that, but if there is i have no idea what it is…), The sky was coming together. in order to have a smooth is transition to the about me section, I wanted to have hills which fade into the same color. I think the full layout for everything in this site is grid, (because grid be the goat). I drew out the profile picture, added in a quick description, and threw in a small blurb about drinking water, because i had a very pretty drawing of a cup of water lying around that i wanted to include. Next up, i did the work experience section. Its fairly straight forwards, since i honestly took most of the text straight from my resume, and added an inset to the base so that the work cards popped a bit more. My vision for the rest of the site, is to have 2 main path ways. One leads to an art portfolio, and the other leads to a tech portfolio, depending on which one you click on. The reason i choose cards, was 100% based on the hackclub counterspell’s site, but instead with cats! I wanted them to have a holo-foil feel, so i added in a hover animation to them, that has a shine transform over the card. (its very cool, and took me a really long time so please praise it) Then, i went back and added in abunch of hover animations to the rest of the site to make it feel more alive. And, that’s about all for this log!! Thanks for scrolling if you got this far!!!
Today was GSAP day (a very pretty JS library for smooth animations, + a bunch of other cool stuffs, but mostly the smooth animations with time lines and triggers, ect) So unfortunately, past Nay had set up a lot of their css layout in a way that was incompatable (over-use of position: absolute) with GSAP’s smooth scrolling, so i spend a while refactoring that for it to work. Yippie. I also added in smooth scroll to for the different sections of my site, with the nav bar. For transitions, i used GSAP Scroll Trigger to add subtle fade in to the work section, as well as the nav bar, which zipps across the screen when you pass over it. In the future, i want to add a plane to one of the buttons, so it looks more natural.
Made my site marginally more mobile friendly! (also had to figure out gsap match media, so that the animations made more sense) Its also now hosted on a domain!!! (TY HACKCLUB)
What went well: Changed hero image, i think its cuter now. Added more gsap animations cuz we extra here Began with Certifications and Contacts sections Did more mobile friendly ness for smaller screen sizes What went bad: spent an unhealthy amount of time trying to get a cool infinite carosol for my fancy pieces of paper. TLDR. Its not working right now. I’ve got it to loop, but it doesnt have a smooth transition back into frame. Now its a tomorrow problem.
Fixed Fancy Paper Carosol!!! (it loops now :DDDD)
I simplified the logic for my moving carosol. Each paper moves independently on a delay. It’s kinda a stupid fix to a stupid problem, but hey. If it works, dont touch it. Im just not going to breathe in its dirrection for a hot second. I also added in a little footer with contact info :D
I started work on the Art Portolio Section of my Site!!! This is very much “make it work first, then make it pretty.” I wanted to have cool flippable cards, which transition from the project asset board, to some basic info about the event/project.
Added 2 more project tiles :D (they also flip, very cool, very cool!!)
The site is now more mobile friendly!!! Yippie!!! 5 commits later, after realizing that the inspect mobile looked vastly different than looking at the site on my own phone, and a little bit of patience. i also added an under construction sign for the art and tech pages.
Ships:
I made (the start) to my portfolio!!! Currently, its got the basic structure of a personal site, A flashy hero, an about-me, work experience. What I’m most proud of with this site, is the small shine animation that i put on my cards (it took so long) It gives them that shinny holographic feel, and really makes it pop. I’m also very pleased with how all the art came out, as well as the simple CSS animations (I think I’ve added clouds to every single web based project I’ve ever made…).
I made the Home Page to my Personal Portfolio!!! Its kitted out with everything a good personal site could want, from a pretty hero, some simple GSAP scroll timeline animations, an about me, some work experience, and an excessive amount of custom artwork!!! And yet my favorite part of this page was not the artwork, but instead a moving carosol of fancy pieces of paper (read: certifications), that took me way too much time. Its scuffed, but its my scuffed. Im hoping in the future to add seperate portolio sections for both art and tech, but that is solidly a future me problem. Currently, Im quite happy with the state its in right now, and I think its at least ready to be shared :DDD...
|
1793526458.0309954
|
1793612858.0309954
|
|
51049
|
My first slack bot! by @keni67 | Stardance
|
keni67
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T22:56:58Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I’ve made a slack bot which can do several commands like rolling a dice, flipping a coin and a help command with all other slash commands. The part I found challenging was making the gitignore file idk it wasn’t working. This is the first thing I’ve ever made with code. The bot doesn’t work in dms", "repo": "https://github.com/keni769/kebibot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BSWRJQQN4"}]...
|
[{"post_id": 51915, "ts": "202 [{"post_id": 51915, "ts": "2026-08-21T20:39:11Z", "hours": 1.5694, "text": "Added some slash commands"}]...
|
Title: My first slack bot! by @keni67 | Stardance
Title: My first slack bot! by @keni67 | Stardance
Devlogs:
Added some slash commands
Ships:
I’ve made a slack bot which can do several commands like rolling a dice, flipping a coin and a help command with all other slash commands. The part I found challenging was making the gitignore file idk it wasn’t working. This is the first thing I’ve ever made with code. The bot doesn’t work in dms...
|
1793451368.8196998
|
1793537768.8196998
|
|
45193
|
File For File by @wiiuavi | Stardance
|
wiiuavi
|
1
|
20.0
|
314
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T22:37:46Z", "hours": 20.0, "multiplier": 12.9, "payout": 314, "blessing": "neutral", "text": "I made a local python based WINDOWS ONLY file converter! QoL improvement and problem being solved -> dont have to upload docs to sketch websites i dont trust. It can run in the background, in system tray, can be used from file explorer, can bulk convert, stores history, can choose where to export, runs in your browser of choice, so can act like a tab if u wanna drag+drop like the sites (although sketch, they are convinient) VIDEO DEMO INCL IN THE GITHUB RELEASE/DEMO LINK", "repo": "https://github.com/wiiuavi/FileForFile", "demo": "https://github.com/wiiuavi/FileForFile/releases/tag/v1"}]...
|
[{"post_id": 51702, "ts": "202 [{"post_id": 51702, "ts": "2026-08-21T15:12:04Z", "hours": 7.0897, "text": "i worked for a while on an “image tool”, basically an ms paint recreation, but wasnt able to create what i wanted, and felt the tool wasnt appropriate for the project. Also tried making diff UIs (e.g. one in sc, but it didnt use up all the space) made it so you can add/remove multpiple files (had it beofre but could only add at once, and remove whole list), added a history where you could open the files directly or del from history and wrote all the descriptions for the files I think im ready to ship! now js have to think abt how to ship"}, {"post_id": 50522, "ts": "2026-08-19T18:24:48Z", "hours": 9.2058, "text": "Lots of work done! now i can activate the script and convert right in file explorer, got a tray icon too when its active! the settings page now shows where converted files go to, toggle keeping the script running, light/dark mode and to remove/add this file explorer integration! when you use this with a file, that file is automatically selected, ready to convert! file descriptions and image editing tools up next!"}, {"post_id": 45725, "ts": "2026-08-12T12:17:30Z", "hours": 2.2733, "text": "nearly done with the convert page. i dont remember what i did last devlog, but i added drag and drop functionality, removed it thinking that loading large files to browser memory isnt a good idea, readded it after thinking about how often ill use it for small files like images. getting basics down for now"}, {"post_id": 42755, "ts": "2026-08-07T17:06:12Z", "hours": 1.7211, "text": "Made a good-for-now conversion table list and basic funtions for them (no actual conversions yet). Sc shows the browser frontend, however i wanted it to act like a browser tab for convinience (can bookmark and switch/drag over files). However the python script wld have to be running all the time (not ideal) since the page cant start the script itself :("}]...
|
Title: File For File by @wiiuavi | Stardance
Devl Title: File For File by @wiiuavi | Stardance
Devlogs:
Made a good-for-now conversion table list and basic funtions for them (no actual conversions yet). Sc shows the browser frontend, however i wanted it to act like a browser tab for convinience (can bookmark and switch/drag over files). However the python script wld have to be running all the time (not ideal) since the page cant start the script itself :(
nearly done with the convert page. i dont remember what i did last devlog, but i added drag and drop functionality, removed it thinking that loading large files to browser memory isnt a good idea, readded it after thinking about how often ill use it for small files like images. getting basics down for now
Lots of work done! now i can activate the script and convert right in file explorer, got a tray icon too when its active! the settings page now shows where converted files go to, toggle keeping the script running, light/dark mode and to remove/add this file explorer integration! when you use this with a file, that file is automatically selected, ready to convert! file descriptions and image editing tools up next!
i worked for a while on an “image tool”, basically an ms paint recreation, but wasnt able to create what i wanted, and felt the tool wasnt appropriate for the project. Also tried making diff UIs (e.g. one in sc, but it didnt use up all the space) made it so you can add/remove multpiple files (had it beofre but could only add at once, and remove whole list), added a history where you could open the files directly or del from history and wrote all the descriptions for the files I think im ready to ship! now js have to think abt how to ship
Ships:
I made a local python based WINDOWS ONLY file converter! QoL improvement and problem being solved -> dont have to upload docs to sketch websites i dont trust. It can run in the background, in system tray, can be used from file explorer, can bulk convert, stores history, can choose where to export, runs in your browser of choice, so can act like a tab if u wanna drag+drop like the sites (although sketch, they are convinient) VIDEO DEMO INCL IN THE GITHUB RELEASE/DEMO LINK...
|
1792878457.7592974
|
1793742457.7592974
|
|
51155
|
Phantom module mk1 by @Dauntedbird | Stardance
|
Dauntedbird
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T22:29:22Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a custom micro drone controlled by AI i trained using RL in a python sim, the ai is split into 2 parts a survival ai that lives on the esp to act quickly like avoiding a wall and a normal sarcastic ai overseer which controls it and talks to me a qwen2.5 3b model anyways for future plans when i get funded im adding the actualy phantom capability which makes the back 2 motors go back 90 degrees acting as pure thrusters making the drone go upto 35mph at cruising speed and 46mph on short burst, if held 46mph for too long the motors would fall off like liquid cuz of the head hardest part i didnt know anything about soldering nor do i know either so u will see my bad soldering skills in the pictures a lot", "repo": "https://github.com/bird-spec/Mk1", "demo": ""}]...
|
[{"post_id": 52660, "ts": "202 [{"post_id": 52660, "ts": "2026-08-22T22:13:38Z", "hours": 0.3625, "text": "today i soldered the in2 joints and showed how much lift one small motor could do( flipped the whole thing upside down in under a second)"}]...
|
Title: Phantom module mk1 by @Dauntedbird | Starda Title: Phantom module mk1 by @Dauntedbird | Stardance
Devlogs:
today i soldered the in2 joints and showed how much lift one small motor could do( flipped the whole thing upside down in under a second)
Ships:
i made a custom micro drone controlled by AI i trained using RL in a python sim, the ai is split into 2 parts a survival ai that lives on the esp to act quickly like avoiding a wall and a normal sarcastic ai overseer which controls it and talks to me a qwen2.5 3b model anyways for future plans when i get funded im adding the actualy phantom capability which makes the back 2 motors go back 90 degrees acting as pure thrusters making the drone go upto 35mph at cruising speed and 46mph on short burst, if held 46mph for too long the motors would fall off like liquid cuz of the head hardest part i didnt know anything about soldering nor do i know either so u will see my bad soldering skills in the pictures a lot...
|
1792875248.914785
|
1793739248.914785
|
|
51179
|
music grader by @ducky-violin | Stardance
|
ducky-violin
|
1
|
20.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T22:14:36Z", "hours": 20.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Music Grader: A tool to measure your accuracy in playing a piece! Ever wanted a tool to tell you how well you’re playing a piece? Are you a beginner that’s trying to replicate a simple tune? This tool records the piece you want to play, then it records your playing and grades it! -Records goal first: Play a recording of what you want your playing to sound like -Records attempt next: Test your playing! -Calculates the accuracy of your playing (how close it sounds to your “goal” recording) -You can also use this to play musical imitation games with your friends :) -Works best with piano, but could work with other instruments too! –> would be a little stricter on grading intonation of instruments -Stop recording by typing Ctrl + C in the terminal. If you’re on the first recording, it will transition into the next one. If you’re on the second one, it will automatically calculate your accuracy. Link to download: https://github.com/ducky-violin/music-grader/releases/tag/music_grader Link to a virtual piano: https://www.musicca.com/piano", "repo": "https://github.com/ducky-violin/music-grader", "demo": "https://github.com/ducky-violin/music-grader/releases/tag/music_grader"}]...
|
[{"post_id": 52646, "ts": "202 [{"post_id": 52646, "ts": "2026-08-22T21:42:00Z", "hours": 6.6669, "text": "-added a goal vs attempt recording –> “goal” is what you want to play (you can play a recording of what you want to play to the mic), while “attempt” is what you’re actually playing (live) -added a feature to compare accuracy of goal vs attempt (and create an “accurate notes” list) -added a small delay to checking the notes so that it would reduce ghost harmonics -raised the note-neighbors number for the program to be more resistant to background noise, ghost harmonics, and vibrato This program works pretty well for playing on digital pianos, since the frequency stays consistent and the computer can pick up the sound better. I’ve been trying to make this work for string instruments (which aren’t always in tune), but it’s very difficult since making the program too resistant to vibrato could make it less accurate overall. Nonetheless, I’m pretty proud of this project because it was difficult for me to learn and understand all about using the wave and pyaudio packages :D I hope this is useful to anyone trying to learn an instrument!"}, {"post_id": 51059, "ts": "2026-08-20T15:18:15Z", "hours": 4.3747, "text": "-no longer spams the same note over and over again for a continuous long note -waits for a new frequency (or a silence) before printing a new note -fixed the issue where the recording saves in x2 speed -increased number of note-neighbors considered when the program “votes” on which note is the main one (to cancel out ghost harmonics / vibrato) I noticed that my program works better on piano (since the notes’ frequencies are more consistent), but I’m working on adjusting this to work for other instruments as well (especially those that can vibrato). I found that my recording was saving at x2 speed because I forgot to update the sample width parameter when I was changing from a width of 4 to a width of 2."}, {"post_id": 50046, "ts": "2026-08-19T02:28:38Z", "hours": 8.5125, "text": "-made a recording system -created a note-mapping function -added a delay to let microphone initialize before recording -used a rolling buffer for more accuracy in identifying notes -prints note and frequency in Hz First time working with audio in software! It was hard to get a functional audio file output and to ensure accuracy in note tracking; the recording kept sounding distorted and it was all static noise. A lot of my time was spent on trying to get a decent recording; however, it’s still not accurate because while the static noise is gone, the audio is playing at a higher speed than recorded. Still, my program’s main function is to identify notes, so for now I’ll just focus on that. (Also, that recording thing is driving me insane.) I learned a lot about audio processing from random blogs and videos on the Internet, so coding this was really confusing and I kept messing around with the code to test what each one does. Still, this is really interesting! :D"}]...
|
Title: music grader by @ducky-violin | Stardance
Title: music grader by @ducky-violin | Stardance
Devlogs:
-made a recording system -created a note-mapping function -added a delay to let microphone initialize before recording -used a rolling buffer for more accuracy in identifying notes -prints note and frequency in Hz First time working with audio in software! It was hard to get a functional audio file output and to ensure accuracy in note tracking; the recording kept sounding distorted and it was all static noise. A lot of my time was spent on trying to get a decent recording; however, it’s still not accurate because while the static noise is gone, the audio is playing at a higher speed than recorded. Still, my program’s main function is to identify notes, so for now I’ll just focus on that. (Also, that recording thing is driving me insane.) I learned a lot about audio processing from random blogs and videos on the Internet, so coding this was really confusing and I kept messing around with the code to test what each one does. Still, this is really interesting! :D
-no longer spams the same note over and over again for a continuous long note -waits for a new frequency (or a silence) before printing a new note -fixed the issue where the recording saves in x2 speed -increased number of note-neighbors considered when the program “votes” on which note is the main one (to cancel out ghost harmonics / vibrato) I noticed that my program works better on piano (since the notes’ frequencies are more consistent), but I’m working on adjusting this to work for other instruments as well (especially those that can vibrato). I found that my recording was saving at x2 speed because I forgot to update the sample width parameter when I was changing from a width of 4 to a width of 2.
-added a goal vs attempt recording –> “goal” is what you want to play (you can play a recording of what you want to play to the mic), while “attempt” is what you’re actually playing (live) -added a feature to compare accuracy of goal vs attempt (and create an “accurate notes” list) -added a small delay to checking the notes so that it would reduce ghost harmonics -raised the note-neighbors number for the program to be more resistant to background noise, ghost harmonics, and vibrato This program works pretty well for playing on digital pianos, since the frequency stays consistent and the computer can pick up the sound better. I’ve been trying to make this work for string instruments (which aren’t always in tune), but it’s very difficult since making the program too resistant to vibrato could make it less accurate overall. Nonetheless, I’m pretty proud of this project because it was difficult for me to learn and understand all about using the wave and pyaudio packages :D I hope this is useful to anyone trying to learn an instrument!
Ships:
Music Grader: A tool to measure your accuracy in playing a piece! Ever wanted a tool to tell you how well you’re playing a piece? Are you a beginner that’s trying to replicate a simple tune? This tool records the piece you want to play, then it records your playing and grades it! -Records goal first: Play a recording of what you want your playing to sound like -Records attempt next: Test your playing! -Calculates the accuracy of your playing (how close it sounds to your “goal” recording) -You can also use this to play musical imitation games with your friends :) -Works best with piano, but could work with other instruments too! –> would be a little stricter on grading intonation of instruments -Stop recording by typing Ctrl + C in the terminal. If you’re on the first recording, it will transition into the next one. If you’re on the second one, it will automatically calculate your accuracy. Link to download: https://github.com/ducky-violin/music-grader/releases/tag/music_grader Link to a virtual piano: https://www.musicca.com/piano...
|
1792875251.3657212
|
1793739251.3657212
|
|
52531
|
Neon quiz by @kevinamir | Stardance
|
kevinamir
|
1
|
3.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T21:39:29Z", "hours": 3.0, "multiplier": 1.06, "payout": 3, "blessing": "neutral", "text": "This is a website where you are given 3 questions, and 15 seconds to answer each question, I had some really hard time to figure out the 15 seconds timer", "repo": "https://github.com/kevinamirr1/Neon-quiz", "demo": "https://kevinamirr1.github.io/Neon-quiz/"}]...
|
[{"post_id": 52641, "ts": "202 [{"post_id": 52641, "ts": "2026-08-22T21:37:30Z", "hours": 2.3333, "text": "Neon quiz"}, {"post_id": 52334, "ts": "2026-08-22T13:19:29Z", "hours": 0.6936, "text": "Neon quiz"}]...
|
Title: Neon quiz by @kevinamir | Stardance
Devlog Title: Neon quiz by @kevinamir | Stardance
Devlogs:
Neon quiz
Neon quiz
Ships:
This is a website where you are given 3 questions, and 15 seconds to answer each question, I had some really hard time to figure out the 15 seconds timer...
|
1793476308.0057938
|
1793562708.0057938
|
|
51503
|
AstroFetch by @venominem_8210 | Stardance
|
venominem_8210
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T21:18:55Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made an exoplanet hunter by analyzing light curve data from the JWST using MAST API. the most challenging part was to fix the AI Chatbot included to answer questions regarding the data(nothing more though). im proud of fixing some bugs even AI couldn’t spot and yeah thats about it. to test my project, just click on the demo link;itll lead you straight there and yeah all you really need is a star TIC ID and you are good to go.", "repo": "https://github.com/venominem8210/Astro-Fetch", "demo": "https://voyager-x-5aug.onrender.com/"}]...
|
[{"post_id": 52629, "ts": "202 [{"post_id": 52629, "ts": "2026-08-22T21:03:15Z", "hours": 1.1481, "text": "this AI chatbot took me like a whole day to fix cuz it kept spitting errors one after the other, first 404 then 500 then model commission issue then server lag, but now its finally fixed and good to go"}, {"post_id": 51686, "ts": "2026-08-21T14:37:01Z", "hours": 0.2564, "text": "here’s a part of index.html as well, couldn’t fit all of it"}, {"post_id": 51678, "ts": "2026-08-21T14:15:44Z", "hours": 2.835, "text": "built main.py and index.html, took me more time in testing and bug fixing than actual coding somehow, was up the whole night but idk why its not recorded"}, {"post_id": 51316, "ts": "2026-08-20T22:00:08Z", "hours": 0.6956, "text": "built the algorithm bridgewrote the bridge layer connecting the FastAPI endpoints to the backend math / Box Least Squares (BLS) transit pipeline. needed this middleware-style connection so the api calls can trigger the heavy calculations and send back clean json data. (ignore the yellow squiggle it works even then)"}, {"post_id": 51296, "ts": "2026-08-20T21:08:38Z", "hours": 3.7228, "text": "worked on fetcher.py today 🛰️ finally got the data fetcher module wired up so it actually pulls light curves and target data without blowing up. dealing with astroquery and lightkurve dependencies was kind of a pain, but it’s querying MAST properly now. basically this is the part that goes and gets the raw space data so the rest of the app has something to look at. next up is getting the actual math/bls part working."}]...
|
Title: AstroFetch by @venominem_8210 | Stardance
Title: AstroFetch by @venominem_8210 | Stardance
Devlogs:
worked on fetcher.py today 🛰️ finally got the data fetcher module wired up so it actually pulls light curves and target data without blowing up. dealing with astroquery and lightkurve dependencies was kind of a pain, but it’s querying MAST properly now. basically this is the part that goes and gets the raw space data so the rest of the app has something to look at. next up is getting the actual math/bls part working.
built the algorithm bridgewrote the bridge layer connecting the FastAPI endpoints to the backend math / Box Least Squares (BLS) transit pipeline. needed this middleware-style connection so the api calls can trigger the heavy calculations and send back clean json data. (ignore the yellow squiggle it works even then)
built main.py and index.html, took me more time in testing and bug fixing than actual coding somehow, was up the whole night but idk why its not recorded
here’s a part of index.html as well, couldn’t fit all of it
this AI chatbot took me like a whole day to fix cuz it kept spitting errors one after the other, first 404 then 500 then model commission issue then server lag, but now its finally fixed and good to go
Ships:
i made an exoplanet hunter by analyzing light curve data from the JWST using MAST API. the most challenging part was to fix the AI Chatbot included to answer questions regarding the data(nothing more though). im proud of fixing some bugs even AI couldn’t spot and yeah thats about it. to test my project, just click on the demo link;itll lead you straight there and yeah all you really need is a star TIC ID and you are good to go....
|
1793505324.3124146
|
1793591724.3124146
|
|
40892
|
legacysignal by @simonproyt | Stardance
|
simonproyt
|
1
|
50.0
|
933
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T20:18:52Z", "hours": 50.0, "multiplier": 18.54, "payout": 933, "blessing": "neutral", "text": "So i taught this project was going to be easy like creating the tidal client for legacy devices but like i was so naive and didnt yet understand how hard it is going to be but it was good in the end i think because i learned a lot about the signal protocol encryption and about backporting and how to make legacy android do things that it was never intended to do but the project is still not finished and i have a lot of work ahead if i want make the app feature complete to the normal signal mobile app but i think its a great demo and it was a great learning experience", "repo": "https://github.com/simonproyt/legacysignal", "demo": "https://cdn.hackclub.com/01a02af7-c370-7c8f-b806-6ca92696e8a8/demo.mp4"}]...
|
[{"post_id": 52604, "ts": "202 [{"post_id": 52604, "ts": "2026-08-22T20:11:21Z", "hours": 3.6061, "text": "Devlog 11: Fixing a few bugs and getting the app ready to ship So in this time i havent done a lot of like cool stuff rather i was fixing a few bugs that broke the messaging feature and image attachment loading because i wanted to showcase those in my demo video and i fixed the github action so ppl can download an apk for the latest version if they want to try it out on their own legacy device also sorry for not writing a dev log sooner i was kinda busy but now i finally got the time to get the project into a ready to ship state"}, {"post_id": 49850, "ts": "2026-08-18T20:00:49Z", "hours": 4.1261, "text": "Devlog 10: Finally added image sending/receiving support So the next thing i taught i would add to my app is image sending and receiving support because that is like kinda a basic feature that any messaging app needs so i added image reviving sending images from the phones storage and via taking a picture with the camera adding these was kinda annoying with figuring out all the correct endpoints and stuff but i think it was worth it in the end"}, {"post_id": 48433, "ts": "2026-08-16T19:38:19Z", "hours": 2.5408, "text": "Devlog 9: New features and a bit of an ui overhaul So I decided to make the ui a bit more pretty and a few new features So this is what i added: a new cleaner ui contact profile picture support message time stamping in the ui dark theme and theme switcher with persistence these are just like qol improvements that i decided to add into the app nothing special but like i missed a few features like the dark theme myself so nothing major but i hope these changes makes the app more usable to ppl"}, {"post_id": 46921, "ts": "2026-08-14T13:57:31Z", "hours": 4.015, "text": "Devlog 8 Working name syncing So after a lot of work i finally made it work so it can show the name that you entered on the signal set up or the devices not just the phone numbers or just unknown sender or just the user id on my app so i guess another feature added now but i still want to add a few stuff before shipping"}, {"post_id": 45824, "ts": "2026-08-12T15:33:59Z", "hours": 6.4758, "text": "Devlog 7: Partly finally working message send/receive So after a lot of work i finally managed to get message sending and receiving working with all of their related crypto stuff but its kinda broken because our message sending api does not support sealed sender yet only the old legacy unsealed sender api that does not encrypt the sender data like modern signal does so on all of the replies it says that they came from unknown contact rather then the actual contact so im working on implementing that so the current stage of the project is after 3x hours of development is Whats working: registering onto the signal network via the phone number and the captchas receiving messages Whats not working or only partially working: sending messages (not working fully because the sealed sender stuff that i talked about previously)"}, {"post_id": 44528, "ts": "2026-08-10T10:59:03Z", "hours": 3.4514, "text": "Devlog 6 Discoverability finally works So after a lot of pain and trial and error and using the signal android source code as an some sort of example that how does the protocol work now we have a finally working code and i can finally move onto the message encryption/decryption part and make it work"}, {"post_id": 43257, "ts": "2026-08-08T12:38:55Z", "hours": 3.6764, "text": "Debugging hell pt2 sorry guys i have been on vacation and taking a bit of a break from the project because of it but now its back in active development now but sadly after fixing registration there is another problem my phone with the latest signal client sadly cant find my client says that its not registered some why even tho it successfully registers so im working trying to fix that possibly and make this project work finally"}, {"post_id": 39975, "ts": "2026-08-03T10:03:07Z", "hours": 6.6417, "text": "Devlog 4: Finally working registration So after like 15 hours of continuous work and debugging i can finally now say that the registration and connection to the signal network is finally working now and i can finally move onto actually making the app itself rather then just having to do trial and error debugging with libsignal and the protocol also while i was testing the app i made a working ci pipeline so the app could be actually downloaded by other ppl now that took a few attempts because of the setting up of the rust toolchains stuff and the android ndk setup part having a few bugs but that is working too now"}, {"post_id": 38718, "ts": "2026-08-01T08:23:46Z", "hours": 9.9889, "text": "Devlog 3: Stuck in debuging hell I’m sorry yall that i didnt make any devlogs about this but i taught this was kinda boring and nothing to write about but after last devlog i found out that the my registration api wasnt fully finished and i needed to generate more keys after the user enters the code from the sms and the registration itself starts but for that we needed to use signals cryptography lib called libsignal so i tried that but the latest version of libsignal had a newer type of elf hash that android 4.x didnt support so i tried using an older version of libsignal but that still didnt work cause it used a few instructions that newer android versions introduced so i tried binary patching in the missing instructions but that still didnt work so i decided the only viable solution was to fork libsignal to try to manually backport everything and thats where im stuck now in debugging hell trying to manually backport and replace the api calls that it uses with the older android versions and its been like 9 hours of trying to do this and still nothing so im kinda tired trying to do this but im wishing that i will finally fix everything and could move onto making that actual app itself rather then then trying to make libsignal work Thank you for reading this super long devlog!"}, {"post_id": 36915, "ts": "2026-07-29T09:58:25Z", "hours": 1.3386, "text": "Devlog 2 Polishing the ui and adding more underlying stuff that we will need in the future so So in this we added to two big changes First is the completely reworked set up it to make it a little bit more pretty and polished looking And the other one is its a more of an underlying change but a well needed one because in the previous demos it stored the key pairs in plain text and stuff so that is obviously super dangerous in a secure messaging context so it will now let you encrypt it via a pin you set in the account creation like in the real signal"}, {"post_id": 36867, "ts": "2026-07-29T06:42:19Z", "hours": 4.4753, "text": "First devlog for this new project So i taught that i made tidal for legacy android and it was pretty easy this is going to be easy like that but how naive was i am like getting even the signal sms registration almost took 4 hours of debugging mainly so this is going to be hard but i will try because it will be worth it in the end"}]...
|
Title: legacysignal by @simonproyt | Stardance
De Title: legacysignal by @simonproyt | Stardance
Devlogs:
First devlog for this new project So i taught that i made tidal for legacy android and it was pretty easy this is going to be easy like that but how naive was i am like getting even the signal sms registration almost took 4 hours of debugging mainly so this is going to be hard but i will try because it will be worth it in the end
Devlog 2 Polishing the ui and adding more underlying stuff that we will need in the future so So in this we added to two big changes First is the completely reworked set up it to make it a little bit more pretty and polished looking And the other one is its a more of an underlying change but a well needed one because in the previous demos it stored the key pairs in plain text and stuff so that is obviously super dangerous in a secure messaging context so it will now let you encrypt it via a pin you set in the account creation like in the real signal
Devlog 3: Stuck in debuging hell I’m sorry yall that i didnt make any devlogs about this but i taught this was kinda boring and nothing to write about but after last devlog i found out that the my registration api wasnt fully finished and i needed to generate more keys after the user enters the code from the sms and the registration itself starts but for that we needed to use signals cryptography lib called libsignal so i tried that but the latest version of libsignal had a newer type of elf hash that android 4.x didnt support so i tried using an older version of libsignal but that still didnt work cause it used a few instructions that newer android versions introduced so i tried binary patching in the missing instructions but that still didnt work so i decided the only viable solution was to fork libsignal to try to manually backport everything and thats where im stuck now in debugging hell trying to manually backport and replace the api calls that it uses with the older android versions and its been like 9 hours of trying to do this and still nothing so im kinda tired trying to do this but im wishing that i will finally fix everything and could move onto making that actual app itself rather then then trying to make libsignal work Thank you for reading this super long devlog!
Devlog 4: Finally working registration So after like 15 hours of continuous work and debugging i can finally now say that the registration and connection to the signal network is finally working now and i can finally move onto actually making the app itself rather then just having to do trial and error debugging with libsignal and the protocol also while i was testing the app i made a working ci pipeline so the app could be actually downloaded by other ppl now that took a few attempts because of the setting up of the rust toolchains stuff and the android ndk setup part having a few bugs but that is working too now
Debugging hell pt2 sorry guys i have been on vacation and taking a bit of a break from the project because of it but now its back in active development now but sadly after fixing registration there is another problem my phone with the latest signal client sadly cant find my client says that its not registered some why even tho it successfully registers so im working trying to fix that possibly and make this project work finally
Devlog 6 Discoverability finally works So after a lot of pain and trial and error and using the signal android source code as an some sort of example that how does the protocol work now we have a finally working code and i can finally move onto the message encryption/decryption part and make it work
Devlog 7: Partly finally working message send/receive So after a lot of work i finally managed to get message sending and receiving working with all of their related crypto stuff but its kinda broken because our message sending api does not support sealed sender yet only the old legacy unsealed sender api that does not encrypt the sender data like modern signal does so on all of the replies it says that they came from unknown contact rather then the actual contact so im working on implementing that so the current stage of the project is after 3x hours of development is Whats working: registering onto the signal network via the phone number and the captchas receiving messages Whats not working or only partially working: sending messages (not working fully because the sealed sender stuff that i talked about previously)
Devlog 8 Working name syncing So after a lot of work i finally made it work so it can show the name that you entered on the signal set up or the devices not just the phone numbers or just unknown sender or just the user id on my app so i guess another feature added now but i still want to add a few stuff before shipping
Devlog 9: New features and a bit of an ui overhaul So I decided to make the ui a bit more pretty and a few new features So this is what i added: a new cleaner ui contact profile picture support message time stamping in the ui dark theme and theme switcher with persistence these are just like qol improvements that i decided to add into the app nothing special but like i missed a few features like the dark theme myself so nothing major but i hope these changes makes the app more usable to ppl
Devlog 10: Finally added image sending/receiving support So the next thing i taught i would add to my app is image sending and receiving support because that is like kinda a basic feature that any messaging app needs so i added image reviving sending images from the phones storage and via taking a picture with the camera adding these was kinda annoying with figuring out all the correct endpoints and stuff but i think it was worth it in the end
Devlog 11: Fixing a few bugs and getting the app ready to ship So in this time i havent done a lot of like cool stuff rather i was fixing a few bugs that broke the messaging feature and image attachment loading because i wanted to showcase those in my demo video and i fixed the github action so ppl can download an apk for the latest version if they want to try it out on their own legacy device also sorry for not writing a dev log sooner i was kinda busy but now i finally got the time to get the project into a ready to ship state
Ships:
So i taught this project was going to be easy like creating the tidal client for legacy devices but like i was so naive and didnt yet understand how hard it is going to be but it was good in the end i think because i learned a lot about the signal protocol encryption and about backporting and how to make legacy android do things that it was never intended to do but the project is still not finished and i have a lot of work ahead if i want make the app feature complete to the normal signal mobile app but i think its a great demo and it was a great learning experience...
|
1793523099.8919616
|
1793609499.8919616
|
|
43963
|
Shark-code by @Praknoor | Stardance
|
Praknoor
|
1
|
15.59
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T20:07:18Z", "hours": 15.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "so gng this is v1 of my agent, it was fun making my own cli, but dw more updates will come… rn it has some bugs, if u find them pls forgive me 😭😭, id appreciate if u report them to me……… but yeah this is the base 🦈🦈🦈🦈🦈", "repo": "https://github.com/GurnoorLog/Shark_code", "demo": "https://github.com/GurnoorLog/Shark_code/releases/tag/v1.0.0"}]...
|
[{"post_id": 54092, "ts": "202 [{"post_id": 54092, "ts": "2026-08-24T21:37:33Z", "hours": 0.5867, "text": "yoo just gave the tui more cleaner look,,,,,,,improved the agent, and made the agent working on all system so u can now try it also on mac or linux"}, {"post_id": 52599, "ts": "2026-08-22T20:04:32Z", "hours": 0.9119, "text": "yoo gng made improvments in the agent and improved the tui"}, {"post_id": 45417, "ts": "2026-08-11T20:58:51Z", "hours": 2.2522, "text": "gng .. i made this logo, i mean it’s only a base but yeah……..also made the agent more smarter and other stuff 🤣🤣😭😭"}, {"post_id": 41915, "ts": "2026-08-06T13:05:09Z", "hours": 2.1261, "text": "gng i have just added some more animations, and added tool calling, rn it’s wrking as a normal coding agent, but it still needs some polishing …. it can aslo tool call manage ure folders, create stuff just like opencode, or any other cli agent🦈🦈🦈🦈🦈🦈….stay tuned for more…. my next step is to create a discord server, where u will betatest it and yeah..pls follow me ✌️✌️"}, {"post_id": 41239, "ts": "2026-08-05T10:07:05Z", "hours": 1.0139, "text": "yoo gng just added thebackground bubbles, it’s still no good but slowly is becoming an agent 🦈🦈🦈🦈😭😭"}, {"post_id": 41199, "ts": "2026-08-05T08:37:36Z", "hours": 8.7778, "text": "yoo gng just made this tui, called it shark-code 🤣🦈🦈"}]...
|
Title: Shark-code by @Praknoor | Stardance
Devlog Title: Shark-code by @Praknoor | Stardance
Devlogs:
yoo gng just made this tui, called it shark-code 🤣🦈🦈
yoo gng just added thebackground bubbles, it’s still no good but slowly is becoming an agent 🦈🦈🦈🦈😭😭
gng i have just added some more animations, and added tool calling, rn it’s wrking as a normal coding agent, but it still needs some polishing …. it can aslo tool call manage ure folders, create stuff just like opencode, or any other cli agent🦈🦈🦈🦈🦈🦈….stay tuned for more…. my next step is to create a discord server, where u will betatest it and yeah..pls follow me ✌️✌️
gng .. i made this logo, i mean it’s only a base but yeah……..also made the agent more smarter and other stuff 🤣🤣😭😭
yoo gng made improvments in the agent and improved the tui
yoo just gave the tui more cleaner look,,,,,,,improved the agent, and made the agent working on all system so u can now try it also on mac or linux
Ships:
so gng this is v1 of my agent, it was fun making my own cli, but dw more updates will come… rn it has some bugs, if u find them pls forgive me 😭😭, id appreciate if u report them to me……… but yeah this is the base 🦈🦈🦈🦈🦈...
|
1793490671.8564367
|
1793577071.8564367
|
|
50638
|
TrollOS by @Finity | Stardance
|
Finity
|
2
|
6.0
|
21
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T20:06:56Z", "hours": 2.0, "multiplier": 9.1, "payout": 21, "blessing": "neutral", "text": "TrollOS has been upgraded, it’s now better than ever! I’ve added three new tools: Music, Paint, and Game. Music will loop “Monkey Spinning Monkeys,” and the volume bar will creep down by itself. Strokes in Paint will randomly change colors and become wobbly, and the game is Flappy Bird but with weird floaty controls and random point loss. I’ve also added two new popup behaviors that can spawn rarely, and unique textures for them. If popups are getting in your way while you’re testing, you can always disable them in the bottom right. Enjoy!!", "repo": "https://github.com/Finity16/troll-os", "demo": "https://finity16.github.io/troll-os/"}, {"ship_num": 2, "ts": "2026-08-20T02:00:32Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have created the TrollOS- the most optimized and efficient OS that does no amounts of trolling whatsoever. There are four fully-integrated productive productivity tools, designed to handle your day-to-day tasks: An AI-powered adaptive typing assistant in Notepad, which intelligently reviews your keystrokes in real time and makes executive corrections on your behalf, so you never have to check your work again. Dynamic result optimization in Calculator, which goes beyond basic arithmetic to surface more culturally relevant numerical outputs, keeping your math fresh and exciting. And did I mention that there are zero unnecessary popups or distractions, like, ever? It’s been really fun making this, and it’s kinda crazy to think that only a week ago I didn’t know any HTML. I’m definitely going to add more features when I get the chance. I hope yall enjoy it!", "repo": "https://github.com/Finity16/troll-os", "demo": "https://finity16.github.io/troll-os/"}]...
|
[{"post_id": 52594, "ts": "202 [{"post_id": 52594, "ts": "2026-08-22T19:54:42Z", "hours": 1.0289, "text": "Last major feature has been added- a rage inducing version of flappy bird with floaty and unreliable controls. You also randomly lose points sometimes. If you manage to get to ten points, the troll gods might give you a blessing 👀 Added unique textures for the rare popups that dodge your cursor, along with two new popups with unique behaviors. If you find popups too annoying, you can always disable them at the bottom. ;)"}, {"post_id": 52118, "ts": "2026-08-22T06:31:09Z", "hours": 1.2356, "text": "I have returned, with two new features to show off! First of all, a music player, looping none other than “Monkey Spinning Monkeys.” As always, there is a twist, and the volume bar will slowly creep down when you aren’t touching it. The paint tool changes colors randomly, and will sometimes make you draw a wobbly line. This took a bit of tinkering to get working, the wobble didn’t really look like what I had in mind at first, but I’m quite happy with it now!"}, {"post_id": 50716, "ts": "2026-08-20T01:45:26Z", "hours": 0.5669, "text": "I’m happy to say that TrollOS has been touched up, brand new desktop icons, clean calculator UI, and a nice effect where the window grows larger when clicked on. Should be good to ship!"}, {"post_id": 50078, "ts": "2026-08-19T04:08:34Z", "hours": 0.9397, "text": "More trolls have been added to make TrollOS feel more alive and annoying. You will now be constantly pestered with popups, and additionally, the buttons for the windows will try to dodge your cursor when you go to click on it. I can’t think of a way for the dodging to work on touchscreen, so you win, touchscreen users. If you idle for too long, a unique pop up will also come up- won’t spoil too much of that. Overall, I think this will do for now. I’ll start working on making everything look better and polishing things up, and that should be it!"}, {"post_id": 49961, "ts": "2026-08-18T23:08:21Z", "hours": 0.8397, "text": "Made the notepad and the browser- the notepad has a chance to replace one of your characters with another character while you type, and the browser is surprisingly troll-free (for now). I also made it possible to close each window and separately open them with the buttons on the left."}, {"post_id": 49357, "ts": "2026-08-18T04:15:25Z", "hours": 0.6081, "text": "Got a clock and calculator working, pretty easy as I’ve done all this before. But now for the troll part- the clock can random freeze up and will require clicking to unfreeze (will add a visual cue in the future) and the Trollculator™ has a 50% of displaying a random meme number instead of the answer."}, {"post_id": 49336, "ts": "2026-08-18T03:12:24Z", "hours": 0.7939, "text": "Got the basics sorted out and implemented a nice window that can be dragged around. I’ll be able to start developing the features for each one now, planning on having four in total."}]...
|
Title: TrollOS by @Finity | Stardance
Devlogs:
Go Title: TrollOS by @Finity | Stardance
Devlogs:
Got the basics sorted out and implemented a nice window that can be dragged around. I’ll be able to start developing the features for each one now, planning on having four in total.
Got a clock and calculator working, pretty easy as I’ve done all this before. But now for the troll part- the clock can random freeze up and will require clicking to unfreeze (will add a visual cue in the future) and the Trollculator™ has a 50% of displaying a random meme number instead of the answer.
Made the notepad and the browser- the notepad has a chance to replace one of your characters with another character while you type, and the browser is surprisingly troll-free (for now). I also made it possible to close each window and separately open them with the buttons on the left.
More trolls have been added to make TrollOS feel more alive and annoying. You will now be constantly pestered with popups, and additionally, the buttons for the windows will try to dodge your cursor when you go to click on it. I can’t think of a way for the dodging to work on touchscreen, so you win, touchscreen users. If you idle for too long, a unique pop up will also come up- won’t spoil too much of that. Overall, I think this will do for now. I’ll start working on making everything look better and polishing things up, and that should be it!
I’m happy to say that TrollOS has been touched up, brand new desktop icons, clean calculator UI, and a nice effect where the window grows larger when clicked on. Should be good to ship!
I have returned, with two new features to show off! First of all, a music player, looping none other than “Monkey Spinning Monkeys.” As always, there is a twist, and the volume bar will slowly creep down when you aren’t touching it. The paint tool changes colors randomly, and will sometimes make you draw a wobbly line. This took a bit of tinkering to get working, the wobble didn’t really look like what I had in mind at first, but I’m quite happy with it now!
Last major feature has been added- a rage inducing version of flappy bird with floaty and unreliable controls. You also randomly lose points sometimes. If you manage to get to ten points, the troll gods might give you a blessing 👀 Added unique textures for the rare popups that dodge your cursor, along with two new popups with unique behaviors. If you find popups too annoying, you can always disable them at the bottom. ;)
Ships:
I have created the TrollOS- the most optimized and efficient OS that does no amounts of trolling whatsoever. There are four fully-integrated productive productivity tools, designed to handle your day-to-day tasks: An AI-powered adaptive typing assistant in Notepad, which intelligently reviews your keystrokes in real time and makes executive corrections on your behalf, so you never have to check your work again. Dynamic result optimization in Calculator, which goes beyond basic arithmetic to surface more culturally relevant numerical outputs, keeping your math fresh and exciting. And did I mention that there are zero unnecessary popups or distractions, like, ever? It’s been really fun making this, and it’s kinda crazy to think that only a week ago I didn’t know any HTML. I’m definitely going to add more features when I get the chance. I hope yall enjoy it!
TrollOS has been upgraded, it’s now better than ever! I’ve added three new tools: Music, Paint, and Game. Music will loop “Monkey Spinning Monkeys,” and the volume bar will creep down by itself. Strokes in Paint will randomly change colors and become wobbly, and the game is Flappy Bird but with weird floaty controls and random point loss. I’ve also added two new popup behaviors that can spawn rarely, and unique textures for them. If popups are getting in your way while you’re testing, you can always disable them in the bottom right. Enjoy!!...
|
1793545006.9432507
|
1793631406.9432507
|
|
9570
|
Capital Chaos by @sol4r_on_hackclub | Stardance
|
sol4r_on_hackclub
|
1
|
171.6
|
3336
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T19:42:41Z", "hours": 171.0, "multiplier": 19.54, "payout": 3336, "blessing": "neutral", "text": "Welcome to Capital Chaos! One of Stardance’s most awaited projects ;) (hopefully anyways) We’ve got chaos, a bunch of random events, a boss fight and so much more for you to explore. SKIP if you are on Linux/MacOS (or you can vote based on the videos - completely up to you) as I only have a windows executable for now. I am honestly super proud of this, and the community built around this game. I hope you enjoy it as well. There have been TONNES of challenges, such as pathfinding, the initial grid also seemed really daunting. To the vacancy count which was literally plaguing me for the past MONTH and got fixed today (it was one line… i know.. maybe I should have used AI). But besides, it’s a sick project. I hope you all love it. Unzip the file in the release and it should be good to go. READ THE README FOR INSTRUCTIONS AND CONTROLS!! THERE IS NO TUTORIAL Read the story, watch the videos if you can and just enjoy the game! It will be on steam in 8-9 months so maybe subscribe?", "repo": "https://github.com/Sol4rOnGit/PocketCity", "demo": "https://github.com/Sol4rOnGit/PocketCity/releases"}]...
|
[{"post_id": 57569, "ts": "202 [{"post_id": 57569, "ts": "2026-08-29T19:13:24Z", "hours": 0.5961, "text": "Thank you all so much for the support! Framework 12 is on it’s way (and this wait is painful). After 171 hours! 19.54x is actually insane and I appreciate it a lot. Join the Discord! I made a discord (click above) and i’ll give you all an early supporter role before I put it out on YouTube and stuff for the “wishlist” when the full game comes out (if you want to stay in touch after stardance is done. ALSO IF YOU COMMENTED WHILE THE GAME WAS STILL CALLED POCKET CITY DM ME ILL GIVE U A SPECIAL ROLE The game beta is still up and you can try it out Currently just doing some minor stuff to the game (Fixed some normal/easy mode not settings correct phases. B2 Bomber should destroy itself and stop the nuke siren once launched), and slowly adding a tutorial but I’m like 90% focused on revising for uni entrance exams"}, {"post_id": 52586, "ts": "2026-08-22T19:35:44Z", "hours": 3.4139, "text": "BETA TEST! Nvm I have to devlog my final changes But lemme talk to those stardance reviewers real quick. Scroll down to see the endless content of my story, and all the community feedback (also on my youtube). Playing the game is a bit of a learning curve so you can watch my videos and stuff on it as well. I’d say watch this one: Boss Fight for the boss fight and maybe one of the other ones that you find interesting. Maybe this one because it has over 1,000 views and still climbing! The game is released there but it is windows only for now (i will release linux and maybe mac on the actual release game don’t worry but I’m super restricted for time right now) SKIP IF YOU’RE ON LINUX / MAC For everyone: Changes: Amended GameAudioManager to adjust for max voices which uses a List based system that appends and unappends. Boss fight also toggles and untoggles the game audio dependant on each audio source, because the game could currently have hundreds or even thousands of audio source which is really bad optimisation. So each audio source that I want to track has a ManagedAudioSource attached which automatically registers and unregisters itself from the GameAudioManager. I also edited the boss fight to make it a touch harder and amended the moves ;) And come and beta test NOWWW. leave all your comments, suggestions etc. on THE NEW DISCORD COMMUNITY!! or youtube, i’ll read it all and, again, thank you all for your support . I don’t know what to put as the image so here."}, {"post_id": 51908, "ts": "2026-08-21T20:18:25Z", "hours": 8.8033, "text": "Final DevLog before First Ship - Boss Battle I don’t think words can explain what I made so click here to watch a video on my probably final major addition (no pressure) & also help with a small dilemma I have. NO!! that does not mean this game will stop development, but i think i finally have enough hours (+10-15 more safety) to get a Framework 12! (and then i will be able to crack on with entrance exams - so i guess development will slow a touch). Of course I’ll ship once the game is polished enough. You might see a devlog or two from the “Capital Chaos Website” - follow me ;) I really hope you guys all enjoy it and now I need to do the readme and stuff. I also realised I was one of the most viewed on Stardance which is honestly amazing and I appreciate all of the support :) And thank you to all the new friends I’ve made and all the followers and commenters. It’s honestly been insane."}, {"post_id": 49800, "ts": "2026-08-18T18:52:58Z", "hours": 3.8472, "text": "Game Sountrack? But before I talk about that, lemme just say the game audio is almost finished, we have menu sounds for clicks and stuff, and i added support for main menu music. The firetruck hoses actually do stuff, floods sound like floods, theres some peaceful background nature sounds and yeah it makes the game feel so much nicer. although i forgot place sounds which was a massive oversight. also my wifi is still working. no idea why, but not complaining. and i’m cooking on a soundtrack lowk although none of it seems correlated in any way and idk how i’ll make it fit into this game but you know what maybe it’ll just all go into some random album. None of the hours put into these songs count but its okay. i’m no pro tho so. all i’ll say is i love some bass"}, {"post_id": 49147, "ts": "2026-08-17T19:36:51Z", "hours": 2.6206, "text": "I’m getting new wifi lol, & 150 hours so yeah i won’t be here and probably will have to post a 10 hour thing BUT on the plus side, we got a nice death screen that has a bunch of quotes that you can read below [SerializeField] private string[] quotes = { \"Opportunities multiply as they are seized \\n - Sun Tzu\", \"If you are going through hell, keep going \\n - Winston Churchill\", \"No empire was built on the first draft\", \"Fall seven times, stand up eight\", \"That which does not kill us, makes us stronger \\n - Friedrich Nietzsche\", \"Out of ash, a new foundation\", \"I have not failed. I just found 10,000 ways that don't work \\n - Thomas Edison\", \"A man is not finished when he is defeated. He is finished when he quits \\n - Richard M. Nixon\", \"It does not matter how slowly you go as long as you do not stop \\n - Confucius\", \"Out of difficulties grow miracles \\n - Jean de La Bruyère\", \"The greater the obstactle, the more glory in overcoming it \\n - Molière\", \"A Pocket Sized City is too small for your ambition. Build again \\n - The Dev\", \"Success usually comes to those who are too busy to be looking for it \\n - Henry David Thoreau\", \"Go big or go home\", \"You can't give up just yet. Stay determined... \\n - Undertale\" }; Maybe you’ll catch the little easter egg there as well ;) Working on adding game audio!! and probably finally enough hours to get the framework 12 (btw I wouldn’t recommend this as a daily laptop (f13 better), I just want something I can write on lol)"}, {"post_id": 48073, "ts": "2026-08-16T11:08:59Z", "hours": 3.8794, "text": "INSANE tree optimisations Went from 60-80 fps @ 4K to 400-450 (in game). Yes a 6 to 7x increase. How you ask? GPU Mesh Instance drawing offloading the CPU work of handling thousands of game objects. In English, I’m no longer spawning thousands of tree objects, but instead telling the GPU to draw the tree instances every frame. This seems quite unintuitive because you’re now drawing thousands of things every second. BUT this means that there are no game objects, so the CPU doesn’t even know that these exist. Also the GPU draws it thousands of times anyways. A game object handles transforms, rotations, etc. that the CPU has to keep track of whether it is active or not. This had the added benefit of the trees having no overhead when the trees are disabled, so you regain all of your framerate! Also I used some neat little script that combined the meshes all together in the GameObject prefab. Now it really should be able to run on your potato PC/Laptop. Combine script using UnityEngine; public class MeshCombineUtility : MonoBehaviour { [ContextMenu(\"Combine Children Meshes\")] public void Combine() { MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; Matrix4x4 matrix = transform.worldToLocalMatrix; for (int i = 0; i < meshFilters.Length; i++) { if (meshFilters[i].gameObject == gameObject) continue; combine[i].mesh = meshFilters[i].sharedMesh; combine[i].transform = matrix * meshFilters[i].transform.localToWorldMatrix; } Mesh combinedMesh = new Mesh(); combinedMesh.CombineMeshes(combine, true, true); #if UNITY_EDITOR string directory = $\"Assets/Assets/Mesh/Tree/{gameObject.name}.asset\"; UnityEditor.AssetDatabase.CreateAsset(combinedMesh, directory); UnityEditor.AssetDatabase.SaveAssets(); Debug.Log($\"Combined mesh saved to {directory}\"); #endif } } Draw section of GPU Mesh Instancing private void DrawTreeMeshes() { if (treeMesh == null || treeMaterial == null) return; foreach (var kvp in generatedChunks) { ChunkData chunk = kvp.Value; if (chunk.spawnedTrees == null || chunk.spawnedTrees.Count == 0) continue; int batchSize = 1023; int totalTrees = chunk.spawnedTrees.Count; for(int i = 0; i < totalTrees; i+=batchSize) { int length = Mathf.Min(batchSize, totalTrees - i); Matrix4x4[] subMatrices = new Matrix4x4[length]; for (int j = 0; j < length; j++) { subMatrices[j] = chunk.spawnedTrees[i + j].matrix; } int meshIndex = Mathf.Abs(chunk.chunkCord.GetHashCode() + i) % treeMesh.Length; Graphics.DrawMeshInstanced(treeMesh[meshIndex], 0, treeMaterial, subMatrices, length); } } }"}, {"post_id": 47547, "ts": "2026-08-15T14:59:51Z", "hours": 1.4756, "text": "You won’t believe it. I got it working FIRST TRY That’s actually crazy to be honest. Tells you how much expirience those 8 hours of menu development have given me. Someone give me a Unity menu doctorate or sum But on a serious note, we have game difficulty selection and its all nice and self contained. With controller support of course. You can see we have Previous Saves but that isn’t really functional yet. One of the things I learnt is to never rely on the UI giving you the data, only the click, so you’d manually add the elements and then call .value or .isOn respective to the component, and the same goes for dropdowns although I didn’t use one here. Let me know if you think it looks clean or any improvements to the UI readability, etc."}, {"post_id": 47161, "ts": "2026-08-14T20:58:41Z", "hours": 10.3042, "text": "I HATE Menus (in Unity at least) Genuinely hate them. But yeah we got settings menu working (which genuinely took like 5-6 hours because of stupid unity legacy stuff vs new stuff and then unity 6 vs 2023 version stuff i was used to) AHHHH I don’t remember it being this painful in Godot to be honest so maybe Godot is better for that? i had to get rid of VSync because it only worked on refresh. Created a debug menu to test performance, just to see that the only useful thing there was FPS and like RAM usage, and some engine stuff like active Rigidbodys. I couldn’t see the CPU utilisation or GPU utilisation which was… the thing I wanted to see. Although don’t worry performance does seem to be reasonable and early to mid game I can push over 1000 FPS on potato settings (specs at bottom if you care about them). It does obviously go down as the game continues on, but I think it’s quite optimised. Even with shadows its on 500+ FPS with a mid sized down. Although adding trees will quarter your FPS numbers. but it looks pretty so there’s your tradeoff. Although problematically if you turn trees off and you had already generated trees the fps stays low even though you’re not rendering it? I don’t know why unity is so weird. The game is quite unbalanced, but we’re in the final polishing stages (my target is 150 hours for the framework and hopefully it’s secure! (vote nice and high thanks - i did put a lot of effort into this game.) Up next: Difficulty selection Polishing Rebalancing updates Release!"}, {"post_id": 45186, "ts": "2026-08-11T14:41:21Z", "hours": 5.9322, "text": "NEW NAME!!! Flash Floods + Main Menu If you remember, Pocket City is a game that already exists so now it’s called Capital Chaos. Thank you YouTube comments! And all of you as well, for the suggestions. Ofc new video to go with it: watch by clicking here! I created flash floods that.. well flood the entire map. It’s meant to be a little toned down of a disaster, thats more survivable because it gives the game a touch more balance. It stops all services from working, so that could be detrimental during a virus attack. But on the other hand, it stops every single fire and prevents new ones and explosions. A lifesaver if theres a nuke, it gets completely nullified. Also new main menu, I think it looks pretty neat. Especially compared to the old one."}, {"post_id": 43501, "ts": "2026-08-08T20:10:46Z", "hours": 9.3828, "text": "Nukes… from a plane A famous plane. The B2 Bomber. Idk gng I got bored. No but it drops a nuke that decimates everything in a decent radius and then sets everything in a bigger radius on fire, and now we have a new rare event called a “military invasion”.. that spawns like 8 helicotpers AS WELL as the b2 bomber. The B2 Bomber starts a few clicks out and then flies toward the set target building. Then it drops the nuke, and you have a few seconds to try and kill the nuke before it kills you, and on impact (yes we are finally using rigidbodys as they are intended) it explodes. You better have that turret system ready. Of course, it’s clearly not enough. So maybe I’ll add a anti-missile system as a YouTube comment said. Speaking of YouTube, thank you for all the support :) 100+ comments goes crazy, and we’re on 73 subs up from the previous 29 literally 3 weeks ago. Not subscribed? Help a fellow dev out: TechScope Channel"}, {"post_id": 36089, "ts": "2026-07-27T23:24:15Z", "hours": 6.7969, "text": "WORKING AIR DEFENCE + ATTACK HELICOPTERS So we got working air defence turrets with some predictive aiming, and attack helicopters that shoot missiles at random buildings. Although you’re unlikely to get 3 attack helicopters at once… for now. The helicopters blades do spin, they bob up and down, they go towards buildings. They shoot out these missiles, which pathfind their way to the targetted building. They all have a healthsystem which means that the turrets do some damage on collisions only though, one turret might take a while but two (or the 7 you see below) will MOW them down. Still have to hook it all up to the Finance Manager, Special Building placement and other boring stuff, but… I need more IDEAS!! (read this thx) …for more Military stuff that can be added. Tank wars? Who knows. I was thinking of a military invasion as being one of the rare events which spawns like 10 missiles and 5 attack helicopters and maybe a B2 bomber or some stuff. I also need more allied options, maybe I’ll add like an anti-bomb turret that is specifically for the B2 bomber or something and does 100000 damage. Or maybe your own airbase that spawns an allied helicopter and now you have dogwars. or maybe your own plane. idk So yes @Adam_Lotfalla this is what the helicopter was for. Yay more things to worry about!!! Still have integrations left! I’ll see you (hopefully) tomorrow once that’s done. but its midnight now so goodbye."}, {"post_id": 35447, "ts": "2026-07-26T21:18:10Z", "hours": 1.8178, "text": "Hmmmm… What’s cooking? (Blender just WON’T count toward my hours but prolly spent 2-3 extra hours here) The helicopter blades actually spin. And W Unity particle system for the missile."}, {"post_id": 33603, "ts": "2026-07-23T17:37:47Z", "hours": 2.6228, "text": "I NEED YOUR HELP Pocket City already exists as a game. I know this is stupid and I should have checked this before starting since I had the intention of publishing it to steam but here we are. If you want more details, or more knowledge about the game check this video out: Video Oops…"}, {"post_id": 32074, "ts": "2026-07-20T23:48:35Z", "hours": 6.6703, "text": "UFOs in an Alien Invasion 💔💔 The second rare event addition to Pocket City! Get a chunk of your population zapped up by some not so friendly aliens… Any more ideas, let me know below! But it was pretty neat to implement. 3D modelled it and everything. 3 hours of doing god knows what. Tried to figure quality settings out and probably did smth else but was too busy with the World Cup to remember what I did. Probably bug fixes and stuff. Oh yeah and you see a pretty cool ripple pulse thing that propogates through the map. Although it is a little weak right now but i’ll fix that next time. Super tired. mb"}, {"post_id": 27226, "ts": "2026-07-12T16:41:03Z", "hours": 4.4661, "text": "Bugs are genuinely taking the life out of me Genuinely the worst thing ever. I STILL can’t figure it out but I had to post my weekly devlog anyways. Can you believe we’re 28 weeks into 2026??! Here’s the chaos where I accidentally created a “Pocket Empire” (Day 1105) Watch the video (click the title) if you wanna see how I ended up here and a minor crash out. very minor."}, {"post_id": 26578, "ts": "2026-07-11T14:19:18Z", "hours": 9.2114, "text": "I’m being forced to post Yeah thanks stardance. 10 hour limit for what. Probably spam filter. Also MASSIVE BUG(s). One is that the game just randomly deletes all the buildings from a chunk. No idea why, I’ve been at it for so long. Another issue is the stupid vacancy counter which has been broken FOREVER but atleast now it doesn’t go negative. I have a serious feeling I will have to spend a week just POLISHING the game. Whatever, Currently working through a new feature of allowing you to use your money that you spent so long accumulating to try and fix the chaos that you went through. This is done through the “Council FX” which I may rename if you guys can think of a better name, and you can see the countless things to do such as: Taking On DEBT!! YAY!! 100k that gains 1% every day. Seems low.. but it will pile up very quickly since it’s compound interest. Overclocking the grid for free placement + infinite water/power Maximising Housing/Business revenue Curing all infections … and many more as well as the ??? at level 100… who knows what that does. £2.5 million btw. Of course, those levels are the XP, which has finally given that a use. And no you wont be at level 11000 just like that, i’m just being lazy for testing. Also rebalanced so that all of the commercial buildings have ~10-15% of their previous employment caps. So that you’re not just spamming residential. It also makes industrial more useful as they have more employers even though they produce less money."}, {"post_id": 23054, "ts": "2026-07-05T19:50:43Z", "hours": 2.3469, "text": "Main menu 👀 I need help. UI clearly isn’t for me"}, {"post_id": 22419, "ts": "2026-07-04T21:33:08Z", "hours": 7.5172, "text": "CRIME!!! + C# Generics I added Arson and added a Police manager that goes out and solves these crimes. Lots more to come, let me know of any ideas you have! But before that let me teach you ALL something. C# Generics. I had a bunch of scripts that all did ABOUT the same thing but with different. This was FindClosestHospital, FindClosestFireStation and the thing I was adding which was FindClosestPoliceStation. It felt quire redundant to copy the same lines but instead of Hopsital it was replaced with FireStation or PoliceStation. //Generic functions private T FindClosestReachableService<T>(Vector2Int targetPos, Func<T, bool> hasAvailableVehicles, out List<Vector2Int> bestRoute) where T : Building { T closestBuilding = null; bestRoute = null; int shortestRouteLength = int.MaxValue; bool foundBuildingOfThisType = false; foreach (var kvp in gridManager.GetMapGrid()) { GridManager.GridTile tile = kvp.Value; if (tile.buildingScript != null && tile.buildingScript is T serviceBuilding) { foundBuildingOfThisType = true; if (!hasAvailableVehicles(serviceBuilding)) continue; List<Vector2Int> testRoute = CalculateRoadPath(tile.buildingScript.gridPos, targetPos); if (testRoute == null || testRoute.Count == 0) continue; if (testRoute.Count < shortestRouteLength) { shortestRouteLength = testRoute.Count; bestRoute = testRoute; closestBuilding = serviceBuilding; } } } if (!foundBuildingOfThisType) { bestRoute = null; return null; } return closestBuilding; } Above is an example of the C# generic. We have “T” type, and I think this is a good place to learn about them. Instead of defining the function as returning something like Building , we make T a type. and you can see it passed in a little <T> after the function name. We can also pass in entire functions like Func<T, bool> which is utilised as shown below: Building bestStation = FindClosestReachableService<PoliceStation>(building.gridPos, ps => ps.HasPolice(), out route); you can see ps => ps.HasPolice() calls that out. And finally, to define what T is meant to be, I’ve added where T : Building . You can do this many times, such as by having both a T as well as a U! and you’d have a repeated where T : Building where U: PotatoChips or something idk what U is meant to be bro. This was my first time using it but it’s pretty cool and if you’re using C# I’d recommend learning it as it saved me like 200 lines of code and changing something 3 times to change the same thing! And yes, I added a third thing which is Arson! which is a crime based thing, and you have a visual that shows up as a timer. if a police doesn’t solve the crime it sets on fire. It’s not too bad but it adds a use for the police, with much more to come for the police to deal with in the future! Also added asteroid BOMBARDMENT as a debuff. Yeah it’s brutal. 3 strikes… thats up to 108 tiles DESTROYED and set on fire. And of course, the image is from a youtube video: Click me!"}, {"post_id": 20327, "ts": "2026-07-01T22:02:59Z", "hours": 4.1806, "text": "BETTER UI + XP At the top of the image you can see a little progress bar… yep I’ve added XP now. Got plans for that, probably going to allow you to unlock stuff later. Like the lockdown ability etc. The UI has been overhauled. The actual images are a touch on the placeholder side apart from the road but it looks pretty good. You cycle between road, zoning and special building placement with 1, 2 and 3. Use R to rotate between the modes like residential, commercial and industrial zoning as well as Utilities & Emergency for the special buildings. Then finally T to rotate between those specific buildings. Complicated? Maybe? But it’s also a lot faster. I have completely lost my muscle memory of spamming R like the “good old days” though. Looks good? Bad? Horrible update and the game should never be changed ever again? Best update in the world and I should win £1 trillion? What do you think?"}, {"post_id": 17186, "ts": "2026-06-27T21:52:31Z", "hours": 9.9433, "text": "MAKE IT RAIN ASTEROIDS Pretty long run honestly. But before that, let’s talk about retrofitting your buildings. Earthquakes are pretty bad. Very bad when you loose your 100k building in a moment. So upgrade it. Yes it’ll cost you 35 to 55k now. But is your peace of mind worth that? And I added asteroids! These fly down and annihilate everything in a 3 unit radius and then set everything else in the 6 unit radius on fire. Lots of minor bug fixes as well, trying to get the game really polished now. Some rejigging of the game’s back end, such as creating a new abstract class for employer and reworking the systems to ensure that they run more smoothly and I believe almost finally fixing the unemployment/vacancy problem. I say almost because every 5 runs I see the game yell at me that it didn’t count something correctly but honestly I’ve spent so long on this I don’t even know if it’d be harder to just rewrite the entire employment system. For more detail, see my video linked below! See if you guys like it, my first proper long form I Added ASTEROIDS that ANNIHILATE your Adorable City And boy will this thing cook your economy."}, {"post_id": 15293, "ts": "2026-06-24T20:46:40Z", "hours": 7.6331, "text": "POLITICS!! + Debugging Hell v2 I mean I guess it is? Not too sure. Event Manager completely overhauled. Double events now no longer have the chance of repeating the same event. Created a new GameEffects script which just takes a bunch of simple code away from EventManager and plays the basic functions such as the “tax revenue increases” which you see below. This was quite a headache to create, and I severely underestimated how much time this would take. I have 2 extra nested classes inside of EventManager for Political Question and Political Scenario. [... inside EventManager.cs ...] public class PoliticalQuestion { public string Question; public TaskCompletionSource<bool> TaskCompletionSource = new TaskCompletionSource<bool>(); public Action onAccept; public PoliticalQuestion(string question, Action onAccept) { Question = question; this.onAccept = onAccept; } } public class PoliticalScenario { public string description; public Action runnable; public PoliticalScenario(string featureDescription, Action functionality) { description = featureDescription; runnable = functionality; } } [Header(\"Political Question Variables\")] public List<PoliticalQuestion> PendingQuestions = new List<PoliticalQuestion>(); public event Action onQueueChanged; private PoliticalScenario[] goodFeatures; private PoliticalScenario[] badFeatures; The political question is sent off to the UI manager, which displays it as shown below. Then it handles user input pressing Y/Enter or N/Esc to accept the user choice, and returns it back to the Event Manager. Seems simple enough, yet there are many ways to do it but I think that the above implementation works the best out of all the ones that I tried. I attempted to use Game Manager as a middleman but that did not work out - so I resorted to passing an entire class. The political scenario allows for the string to actually do something, so that the game knows what to process and what the user agreed to without creating a bunch of variables, and can allow for stacked political question events which is nice. Game’s looking really neat, and the multipliers and stuff can make the game go very crazy very quickly. Too much of a good thing is a bad thing!! Debugged the entire system for like a solid 3 hours it was actually bad. Came first in the UK tho!! I’m back after those 6 exams are done. Yes I know the UI looks pretty bad but it’s good enough for pre-beta testing. Oh yeah, speaking of UI everything is more bold. Figured out how to do that."}, {"post_id": 14641, "ts": "2026-06-23T20:29:50Z", "hours": 2.74, "text": "I HAVE A PLANN For the spinal sprint toward completion. Should end up taking me to hour 70-75? Then we polish the UI and add a main menu… lacking feature I guess. Anyways, reorganised the code base and split game manager up, created folders and fixed dependencies for everything. There is now an event manager, which handles all of the events separately, and as you can see from this simple to-do list (should my next project be the to do list to end all to do lists with calendar integration and stuff???) that I have completed the first bit “Weighted Event system”. So now nothing has an equal chance of happening! Also as a side effect made adding new effects a lot easier due to the nested WeightedEvents class which was similar to an idea I had in my old minecraft mod plugin and transferred the skills across the languages. Quite nice neat code actually, that isn’t 600 lines long, so I can quickly show it to you below. It’s very applicable and I believe I have used it twice or three times in the past 4 months alone. The declarations for the events now look like this, very centralised and easy to add/remove events and modify the weightings. Called in the Start() function. weightedEvents.Add(new WeightedEvent(\"Nothing\", 20, () => { })); weightedEvents.Add(new WeightedEvent(\"Earthquake\", 5, Earthquake)); weightedEvents.Add(new WeightedEvent(\"Fire\", 40, SetBuildingOnFire)); weightedEvents.Add(new WeightedEvent(\"Virus\", 20, () => { TriggerVirusOutbreak(); } )); and the class is just simply storing the name, the weight and a weighted Event. public class WeightedEvent { public string name; public int weight; public Action weightedEvent; public WeightedEvent(string name, int weight, Action weightedEvent) { this.name = name; this.weight = weight; this.weightedEvent = weightedEvent; } } we do need to store the total weight which happens on the Start() function currently. When playRandomEvent() is called, we increase the cursor by the event’s weight until it is greater than the rolled random number between 0 and the total weight, at which point the class’ event is called. Broke nothing in the end! That’s great isn’t it, especially after migrating a bunch of “legacy” code. Hopefully didn’t jinx it."}, {"post_id": 12737, "ts": "2026-06-20T20:33:13Z", "hours": 4.3403, "text": "Okay now i SUCK at my own video game. Don’t worry it’s hard mode. Also lost 2 hours of work somewhere cuz it didn’t save? Don’t understand how. That’s always great isn’t it. But still, 62 days in and I’m fried because of one silly mistake I made 40 days ago. Really teaches you consequences I guess. Spent my time completely overhauling how everything works. You used to make too much money, so I made the revenue even more population based, by making the max revenue a multiplier of the max population. Completely rewrote the losing population, unemployment and vacancy calculations to prevent strange negative numbers which was irritating me for the past one and a half weeks. Also overhauled the inflation to use a formula instead of a very rudimentary lookup table from if statements which is staged into a end-game (130 days+) and early game stage with 20% and 2% simple interest respectively (no not compound for once - that would make the game too hard. Extreme mode?) The game is actually like a good game now. I don’t know how to explain apart from that though."}, {"post_id": 11524, "ts": "2026-06-18T20:22:52Z", "hours": 2.1214, "text": "I FINALLY LOST IN MY OWN GAME!! Rebalancing the game slowly but surely. Currently added inflation, which increases the price of everything as the days go by. It gets less severe the longer you play but the inflation rate stays high. The game days now vary, take 5 seconds at the start and slowly get faster and faster toward 1.5s linearly. The inflation rate also increases with bands as the game progresses so you need to keep up. This makes the game a good progression, but make one mistake during an earthquake and it might be ggs for you. There is now finally a game over function… although no restart but don’t worry about it. It just pauses the game and tells you that the game is finished. Next up: Detailed Finances, Rubbish? (follow thx)"}, {"post_id": 10848, "ts": "2026-06-17T19:53:45Z", "hours": 1.2564, "text": "Currently rebalancing the video game to make the game progression more realistic as it is currently extremely difficult at the start and stupidly impossible to die toward the end. Completely forgot to tell you guys that you can follow my projects on my YouTube: Video Like & sub if you can… mb for the self promo though. Sadly I have 6 exams next week so the next 2 weeks are most likely going to be slow ones… not dominating the leaderboards anymore."}, {"post_id": 10754, "ts": "2026-06-17T17:25:21Z", "hours": 4.8722, "text": "Working healthcare! The game now has a virus… and it spreads pretty quickly. Houses get infected, added to the random event chances on top of earthquakes and fires. I created hospitals that dispatch ambulances as required. Now all services cost money. Using the same A* algorithm from last time, but a little more complex due to the nature of the virus spreading to random buildings. This requires the game to check for any viruses. I created an UI that displays the day progression, using actions & delegates again. The day length is now no longer fixed, but instead it becomes smaller the longer you stay on the map, to try and add difficulty ramping. The game is currently very difficult at the start and incredibly easy at the end, so I’m trying to reverse this a bit and make it hard at the start but terrible towards the end. Also just realised there’s no ending lol - you just become broke and softlock yourself. Never done it to myself which really speaks out about how UNBALANCED the game is. I think it’s time to work on game balancing now before implementing new features, and over half way to shipping? maybe at 65-80 hours in at this rate?"}, {"post_id": 8771, "ts": "2026-06-14T16:10:08Z", "hours": 4.5692, "text": "WORKING PATHFINDING ON THE GRID! Created new assets so the game looks complete now! You can see the firetruck going from the Fire station all the way to the burning building where it will extinguish it. Yes, it follows the roads as intended and uses the A* algorithm to figure out the best path. And they shoot water out, so visual feedback for everything. This was super fun as it was the first time I’ve implemented the A* in a video game on a grid that procedurally generated. The coal power generator, fire station and fire trucks have models now, I think I made them good enough to fit with the game. Police station and healthcare to still be implemented but it’s looking good so far. This required creating a new services manager, creating a pathfinding script, updating global services and how everything interacts with the fire, and creating reverse pathfinding and small details. It’s coming together really cleanly now."}, {"post_id": 8393, "ts": "2026-06-13T23:23:02Z", "hours": 7.1706, "text": "Debugging HELL I added fires, which you can see in the corner. Unity Particle system actually really cool for that by the way. This forced me to rewrite how fires work and add new bits to the Building parent class. That was fine. Had to update the UI to show you that an earthquake was happening, which works more reliably than last time and I figured the ghost error out. I decided to implement water & energy requirements. Overhauled ChunkManager to allow for this, as each chunk needs enough. If it doesn’t produce enough, it imports from other chunks. If it can’t do that, everyone starts packing it up and leaving. Added this to city stats. Then modelled a cute little water tower as you can see below. Then I added energy, lots of chaos. Trying really hard to avoid circular loops to avoid a stack overflow, but it’s looking pretty good. User warnings now show up, like when an earthquake happens, or if a building burns down or if you can’t do something or don’t have money for something. Now I think I have time to do the fun part - creating chaotic fun stuff to make the city feel even more alive. But it’s looking pretty good right now. It’s getting close to being shipped, almost 40 hours in. Like & follow for the link ;) Now I really need to sleep. OH NO AND REVISE FOR THE PHYSICS TEST ON TUESDAY"}, {"post_id": 8051, "ts": "2026-06-13T13:04:47Z", "hours": 2.0944, "text": "It’s been a really long time since I’ve posted. Some progress going on here. Little sneak peak of the fires… yep. You thought the game was gonna be peaceful? On another 7+ hour sprint today"}, {"post_id": 7093, "ts": "2026-06-11T21:27:16Z", "hours": 4.3672, "text": "Clean codebase always pays off (unless you want to keep your job apparently?) Fixed the vacancies counter, as before I was using = instead of +=. Told you it’s the little things that catch you out. Created a safer version of the draft forceRemoveElement() that accounts for jobs and residents when destroying a building (houses/shops/industry). This now updates the game realistically, e.g. if you destroy a house, then you reduce from the population. If the residents were employed, then it removes positions from buildings. If they were unemployed, then we remove it from the stats. Since I am not storing direct references between buildings but creating a game pool for performance, this makes the operations require lots of calling. This could probably be optimised in the future but I will do that near the first release due to the ever-changing code base. This required updating GameManager.cs to have LosePopulation(), LoseJobs() with a helper RemoveWorkersFromBuildings() function. Luckily the lists in GridMananger that I made like 20 hours ago for “future proofing” came in useful. Finally, you can press F to show city statistics and it updates in real time."}, {"post_id": 6481, "ts": "2026-06-10T22:00:31Z", "hours": 1.0161, "text": "What’s the difference between these two: int maxEmployees = 50; int employees = 25; float taxRevenue = 1500.0f; ONE : float revenue = (employees / maxEmployees) * taxRevenue; TWO: float revenue = (employees * taxRevenue) / maxEmployees; Mathematically, they’re the same. a/b * c = c/b * a However, I missed one thing while coding (a lot harder to see when it’s not just this). They’re both integers. now what C# does is it divides 25/50. we get 0.5. but they’re both integers, so it tries to store it as an integer, which floors it to a 0. Therefore, it’ll suddenly jump to max revenue when the company is full. obviously not what was intended. Option 2 makes you multiply the integer with a float, and stores 25 * 1500 as a float, which can now be nicely divided by 50 to get the value that we inteded. Sometimes… actually, no MOST of the time it’s the little things that catch you out. Anyways, this has very much balanced the game. The companies get as many employees as they can, then grow by 1 employee each day. Their revenue scales with the employee count, so now residential houses are useful for once. If anything, essential. Next up: Road tax, Land tax. This might be the one time you want tax… or maybe it’s too much?"}, {"post_id": 6445, "ts": "2026-06-10T20:48:12Z", "hours": 1.1464, "text": "Sometimes, the most productive thing you can do is destroying everything for a clean slate. So that’s what I did and refactored my codebase, painting my GitHub red. The old city generation code ended up becoming messy spaghetti code that made it difficult to debug and work on it. And that sort of legacy code when I look back in a month is what ends up shelving projects for years on end. This half an hour will save me many in the future. I also removed the cluster expansion method of building expansion completely as it created annoying expansions that didn’t make sense of everything being 1 square off a road. Also created a GameManager and moved aspects of GridManager and FinanceManager to the new script, to try and centralise the logic and stop having random bits such as the day manager in the FinanceMananger, which didn’t make an sense. Also yes, I wasted 20 minutes trying to figure out what was going wrong when I forgot to add GameManager.cs to the scene 💔"}, {"post_id": 6367, "ts": "2026-06-10T18:39:39Z", "hours": 3.0794, "text": "It can’t POSSIBLY BE THAT HARD CAN IT? No but you have to mix up TAGS AND LAYERS. There’s some error you got 5 builds ago but NEVER APPEARED AGAIN. EVEN HOURS INTO TESTING. HOW DID IT FIX ITSELF?! The UI now updates how much you gained in the past day! But anyways, you can finally toggle between the layers… after too much debugging (and realising it was just me being stupid). But it’s okay I’ll hopefully get that laptop from this blood sweat and tears. Look how gorgeous it looks now!"}, {"post_id": 5918, "ts": "2026-06-09T22:00:15Z", "hours": 5.0561, "text": "Did you know it costs more to remove a road than create one?! Strange… Finally have a working economy in the game now! It’s VERY unbalanced. You WILL become very rich. And residential is currently useless, and everything just has a set employee count for now. But that will change soon, and we’ll make the game intelligent. Also the game clock is currently in the Finance Manager which is a little odd so maybe I’ll fix that later. But, I have used actions & delegates to optimise the game handling of the ridiculous amount of scripts for each building that will be running once the cities become larger and larger. Created a UI manager to update the script, which uses the above actions & delegates from the script manager. Created a Finance Manager which led me to have to recode GridManager for monetary support, but that was honestly less painful than it sounds. I also spent a considerable amount of time debugging last post’s Zoning. The code has multiple ways of producing a building and this caused me to have to go back and go through all of the code line by line to figure all the pathways out and debug it eventually. And yes, as promised I made it cost money to zone. Every action, such as creating a road and destroying them cost money and using my amazing research skills of using the first google result, destroying a road costs double placing a road! I think I should sleep. See you soon!"}, {"post_id": 5134, "ts": "2026-06-08T20:27:14Z", "hours": 2.4142, "text": "CITY ZONING! Annoyed that a massive skyscraper decided to spawn right next to a nice cozy cottage? Not anymore! You can zone areas by residential, commercial and industrial. There is also a “No Build” zone for areas that you just want to keep clear for now. This will eventually cost you money, because paperwork is really expensive apparently. (And to keep the game balanced of course). But there’s no money yet. I think you should like & follow to see how the game’s economy works."}, {"post_id": 4989, "ts": "2026-06-08T17:13:15Z", "hours": 2.5267, "text": "Pocket City Dev 5 The terrain was a little bland, so I decided to spice it up with nature. To fill the grid up, I decided to implement trees. Created a few basic tree grid varieties and implemented it into GridManager.cs. However, this forced me to spawn all of the trees in the Start() function which causes a longer loading time, CPU spike and worst of all it makes it so that after the initial radius no more trees spawn. Increasing the radius exponentially increases the amount of trees being added (because each ring has more grid sections to cover). So i had to pivot. I created a new Chunk Manager, split the main grid up into 16x16 chunks, and checked the player camera and only loaded the surrounding chunks. This makes trees spawn around the player continuously. However, this would become laggy as it would happen every frame. Two ways I decided to prevent this: Check if the player had changed chunks. If it’s still the same chunk, early return to skip the entire code process. Check if the nature has already been loaded. Only load if not loaded. This obviously saves on time complexity, and allows me to have the freedom of creating varying tree density. It also makes it so that the trees do not regenerate constantly. And that completes the visuals for now. Probably will add more foliage and other variety in the future, but for now this will suffice. Finally, this has a severe performance penalty. To cater for lower-end devices, I added a toggle which will later come to a settings menu for ~4x the performance without impacting gameplay. Optimisations, such as chunkloading and LODs will be added later to increase the performance with trees, but that will come after the core game is finalised."}, {"post_id": 3868, "ts": "2026-06-06T23:09:38Z", "hours": 2.8567, "text": "Hello everyone! The city is finally generating. They automatically generate alongside roads or try grow in clusters with each other. Game looks pretty sweet. Almost 9 hours in, I think it’s time to get some sleep now."}, {"post_id": 3730, "ts": "2026-06-06T19:33:02Z", "hours": 4.095, "text": "Coming first in the UK leaderboard is pretty honourable. Anyways, working on Pocket City and we’ve almost got generation of buildings and I’ve got a lot of things lined up for this project. I really need that framework 12 💔. The roads have a cursor and you can destroy and create them in a row as well, camera movement is more polished with a sprint key. Got all the building assets and everything ready. What a entry to stardance & hackclub!"}, {"post_id": 3473, "ts": "2026-06-06T12:53:43Z", "hours": 1.3806, "text": "Procedural road addition, so that when you add a tile (which is still done through code currently), it will decide which road layout to add, be it an intersection, 4 way, 3 way, a road turn or anything else. Added clean camera movement with WSAD + scroll as well."}, {"post_id": 3429, "ts": "2026-06-06T11:20:47Z", "hours": 1.0264, "text": "Hello! I’m working on creating a top-down 2D-styled but 3D game where you control a city. I’ve got this grid layout so far and it works fabulously and I somehow got the rotations correct on the first try 🤣"}]...
|
Title: Capital Chaos by @sol4r_on_hackclub | Stard Title: Capital Chaos by @sol4r_on_hackclub | Stardance
Devlogs:
Hello! I’m working on creating a top-down 2D-styled but 3D game where you control a city. I’ve got this grid layout so far and it works fabulously and I somehow got the rotations correct on the first try 🤣
Procedural road addition, so that when you add a tile (which is still done through code currently), it will decide which road layout to add, be it an intersection, 4 way, 3 way, a road turn or anything else. Added clean camera movement with WSAD + scroll as well.
Coming first in the UK leaderboard is pretty honourable. Anyways, working on Pocket City and we’ve almost got generation of buildings and I’ve got a lot of things lined up for this project. I really need that framework 12 💔. The roads have a cursor and you can destroy and create them in a row as well, camera movement is more polished with a sprint key. Got all the building assets and everything ready. What a entry to stardance & hackclub!
Hello everyone! The city is finally generating. They automatically generate alongside roads or try grow in clusters with each other. Game looks pretty sweet. Almost 9 hours in, I think it’s time to get some sleep now.
Pocket City Dev 5 The terrain was a little bland, so I decided to spice it up with nature. To fill the grid up, I decided to implement trees. Created a few basic tree grid varieties and implemented it into GridManager.cs. However, this forced me to spawn all of the trees in the Start() function which causes a longer loading time, CPU spike and worst of all it makes it so that after the initial radius no more trees spawn. Increasing the radius exponentially increases the amount of trees being added (because each ring has more grid sections to cover). So i had to pivot. I created a new Chunk Manager, split the main grid up into 16x16 chunks, and checked the player camera and only loaded the surrounding chunks. This makes trees spawn around the player continuously. However, this would become laggy as it would happen every frame. Two ways I decided to prevent this: Check if the player had changed chunks. If it’s still the same chunk, early return to skip the entire code process. Check if the nature has already been loaded. Only load if not loaded. This obviously saves on time complexity, and allows me to have the freedom of creating varying tree density. It also makes it so that the trees do not regenerate constantly. And that completes the visuals for now. Probably will add more foliage and other variety in the future, but for now this will suffice. Finally, this has a severe performance penalty. To cater for lower-end devices, I added a toggle which will later come to a settings menu for ~4x the performance without impacting gameplay. Optimisations, such as chunkloading and LODs will be added later to increase the performance with trees, but that will come after the core game is finalised.
CITY ZONING! Annoyed that a massive skyscraper decided to spawn right next to a nice cozy cottage? Not anymore! You can zone areas by residential, commercial and industrial. There is also a “No Build” zone for areas that you just want to keep clear for now. This will eventually cost you money, because paperwork is really expensive apparently. (And to keep the game balanced of course). But there’s no money yet. I think you should like & follow to see how the game’s economy works.
Did you know it costs more to remove a road than create one?! Strange… Finally have a working economy in the game now! It’s VERY unbalanced. You WILL become very rich. And residential is currently useless, and everything just has a set employee count for now. But that will change soon, and we’ll make the game intelligent. Also the game clock is currently in the Finance Manager which is a little odd so maybe I’ll fix that later. But, I have used actions & delegates to optimise the game handling of the ridiculous amount of scripts for each building that will be running once the cities become larger and larger. Created a UI manager to update the script, which uses the above actions & delegates from the script manager. Created a Finance Manager which led me to have to recode GridManager for monetary support, but that was honestly less painful than it sounds. I also spent a considerable amount of time debugging last post’s Zoning. The code has multiple ways of producing a building and this caused me to have to go back and go through all of the code line by line to figure all the pathways out and debug it eventually. And yes, as promised I made it cost money to zone. Every action, such as creating a road and destroying them cost money and using my amazing research skills of using the first google result, destroying a road costs double placing a road! I think I should sleep. See you soon!
It can’t POSSIBLY BE THAT HARD CAN IT? No but you have to mix up TAGS AND LAYERS. There’s some error you got 5 builds ago but NEVER APPEARED AGAIN. EVEN HOURS INTO TESTING. HOW DID IT FIX ITSELF?! The UI now updates how much you gained in the past day! But anyways, you can finally toggle between the layers… after too much debugging (and realising it was just me being stupid). But it’s okay I’ll hopefully get that laptop from this blood sweat and tears. Look how gorgeous it looks now!
Sometimes, the most productive thing you can do is destroying everything for a clean slate. So that’s what I did and refactored my codebase, painting my GitHub red. The old city generation code ended up becoming messy spaghetti code that made it difficult to debug and work on it. And that sort of legacy code when I look back in a month is what ends up shelving projects for years on end. This half an hour will save me many in the future. I also removed the cluster expansion method of building expansion completely as it created annoying expansions that didn’t make sense of everything being 1 square off a road. Also created a GameManager and moved aspects of GridManager and FinanceManager to the new script, to try and centralise the logic and stop having random bits such as the day manager in the FinanceMananger, which didn’t make an sense. Also yes, I wasted 20 minutes trying to figure out what was going wrong when I forgot to add GameManager.cs to the scene 💔
What’s the difference between these two: int maxEmployees = 50; int employees = 25; float taxRevenue = 1500.0f; ONE : float revenue = (employees / maxEmployees) * taxRevenue; TWO: float revenue = (employees * taxRevenue) / maxEmployees; Mathematically, they’re the same. a/b * c = c/b * a However, I missed one thing while coding (a lot harder to see when it’s not just this). They’re both integers. now what C# does is it divides 25/50. we get 0.5. but they’re both integers, so it tries to store it as an integer, which floors it to a 0. Therefore, it’ll suddenly jump to max revenue when the company is full. obviously not what was intended. Option 2 makes you multiply the integer with a float, and stores 25 * 1500 as a float, which can now be nicely divided by 50 to get the value that we inteded. Sometimes… actually, no MOST of the time it’s the little things that catch you out. Anyways, this has very much balanced the game. The companies get as many employees as they can, then grow by 1 employee each day. Their revenue scales with the employee count, so now residential houses are useful for once. If anything, essential. Next up: Road tax, Land tax. This might be the one time you want tax… or maybe it’s too much?
Clean codebase always pays off (unless you want to keep your job apparently?) Fixed the vacancies counter, as before I was using = instead of +=. Told you it’s the little things that catch you out. Created a safer version of the draft forceRemoveElement() that accounts for jobs and residents when destroying a building (houses/shops/industry). This now updates the game realistically, e.g. if you destroy a house, then you reduce from the population. If the residents were employed, then it removes positions from buildings. If they were unemployed, then we remove it from the stats. Since I am not storing direct references between buildings but creating a game pool for performance, this makes the operations require lots of calling. This could probably be optimised in the future but I will do that near the first release due to the ever-changing code base. This required updating GameManager.cs to have LosePopulation(), LoseJobs() with a helper RemoveWorkersFromBuildings() function. Luckily the lists in GridMananger that I made like 20 hours ago for “future proofing” came in useful. Finally, you can press F to show city statistics and it updates in real time.
It’s been a really long time since I’ve posted. Some progress going on here. Little sneak peak of the fires… yep. You thought the game was gonna be peaceful? On another 7+ hour sprint today
Debugging HELL I added fires, which you can see in the corner. Unity Particle system actually really cool for that by the way. This forced me to rewrite how fires work and add new bits to the Building parent class. That was fine. Had to update the UI to show you that an earthquake was happening, which works more reliably than last time and I figured the ghost error out. I decided to implement water & energy requirements. Overhauled ChunkManager to allow for this, as each chunk needs enough. If it doesn’t produce enough, it imports from other chunks. If it can’t do that, everyone starts packing it up and leaving. Added this to city stats. Then modelled a cute little water tower as you can see below. Then I added energy, lots of chaos. Trying really hard to avoid circular loops to avoid a stack overflow, but it’s looking pretty good. User warnings now show up, like when an earthquake happens, or if a building burns down or if you can’t do something or don’t have money for something. Now I think I have time to do the fun part - creating chaotic fun stuff to make the city feel even more alive. But it’s looking pretty good right now. It’s getting close to being shipped, almost 40 hours in. Like & follow for the link ;) Now I really need to sleep. OH NO AND REVISE FOR THE PHYSICS TEST ON TUESDAY
WORKING PATHFINDING ON THE GRID! Created new assets so the game looks complete now! You can see the firetruck going from the Fire station all the way to the burning building where it will extinguish it. Yes, it follows the roads as intended and uses the A* algorithm to figure out the best path. And they shoot water out, so visual feedback for everything. This was super fun as it was the first time I’ve implemented the A* in a video game on a grid that procedurally generated. The coal power generator, fire station and fire trucks have models now, I think I made them good enough to fit with the game. Police station and healthcare to still be implemented but it’s looking good so far. This required creating a new services manager, creating a pathfinding script, updating global services and how everything interacts with the fire, and creating reverse pathfinding and small details. It’s coming together really cleanly now.
Working healthcare! The game now has a virus… and it spreads pretty quickly. Houses get infected, added to the random event chances on top of earthquakes and fires. I created hospitals that dispatch ambulances as required. Now all services cost money. Using the same A* algorithm from last time, but a little more complex due to the nature of the virus spreading to random buildings. This requires the game to check for any viruses. I created an UI that displays the day progression, using actions & delegates again. The day length is now no longer fixed, but instead it becomes smaller the longer you stay on the map, to try and add difficulty ramping. The game is currently very difficult at the start and incredibly easy at the end, so I’m trying to reverse this a bit and make it hard at the start but terrible towards the end. Also just realised there’s no ending lol - you just become broke and softlock yourself. Never done it to myself which really speaks out about how UNBALANCED the game is. I think it’s time to work on game balancing now before implementing new features, and over half way to shipping? maybe at 65-80 hours in at this rate?
Currently rebalancing the video game to make the game progression more realistic as it is currently extremely difficult at the start and stupidly impossible to die toward the end. Completely forgot to tell you guys that you can follow my projects on my YouTube: Video Like & sub if you can… mb for the self promo though. Sadly I have 6 exams next week so the next 2 weeks are most likely going to be slow ones… not dominating the leaderboards anymore.
I FINALLY LOST IN MY OWN GAME!! Rebalancing the game slowly but surely. Currently added inflation, which increases the price of everything as the days go by. It gets less severe the longer you play but the inflation rate stays high. The game days now vary, take 5 seconds at the start and slowly get faster and faster toward 1.5s linearly. The inflation rate also increases with bands as the game progresses so you need to keep up. This makes the game a good progression, but make one mistake during an earthquake and it might be ggs for you. There is now finally a game over function… although no restart but don’t worry about it. It just pauses the game and tells you that the game is finished. Next up: Detailed Finances, Rubbish? (follow thx)
Okay now i SUCK at my own video game. Don’t worry it’s hard mode. Also lost 2 hours of work somewhere cuz it didn’t save? Don’t understand how. That’s always great isn’t it. But still, 62 days in and I’m fried because of one silly mistake I made 40 days ago. Really teaches you consequences I guess. Spent my time completely overhauling how everything works. You used to make too much money, so I made the revenue even more population based, by making the max revenue a multiplier of the max population. Completely rewrote the losing population, unemployment and vacancy calculations to prevent strange negative numbers which was irritating me for the past one and a half weeks. Also overhauled the inflation to use a formula instead of a very rudimentary lookup table from if statements which is staged into a end-game (130 days+) and early game stage with 20% and 2% simple interest respectively (no not compound for once - that would make the game too hard. Extreme mode?) The game is actually like a good game now. I don’t know how to explain apart from that though.
I HAVE A PLANN For the spinal sprint toward completion. Should end up taking me to hour 70-75? Then we polish the UI and add a main menu… lacking feature I guess. Anyways, reorganised the code base and split game manager up, created folders and fixed dependencies for everything. There is now an event manager, which handles all of the events separately, and as you can see from this simple to-do list (should my next project be the to do list to end all to do lists with calendar integration and stuff???) that I have completed the first bit “Weighted Event system”. So now nothing has an equal chance of happening! Also as a side effect made adding new effects a lot easier due to the nested WeightedEvents class which was similar to an idea I had in my old minecraft mod plugin and transferred the skills across the languages. Quite nice neat code actually, that isn’t 600 lines long, so I can quickly show it to you below. It’s very applicable and I believe I have used it twice or three times in the past 4 months alone. The declarations for the events now look like this, very centralised and easy to add/remove events and modify the weightings. Called in the Start() function. weightedEvents.Add(new WeightedEvent("Nothing", 20, () => { })); weightedEvents.Add(new WeightedEvent("Earthquake", 5, Earthquake)); weightedEvents.Add(new WeightedEvent("Fire", 40, SetBuildingOnFire)); weightedEvents.Add(new WeightedEvent("Virus", 20, () => { TriggerVirusOutbreak(); } )); and the class is just simply storing the name, the weight and a weighted Event. public class WeightedEvent { public string name; public int weight; public Action weightedEvent; public WeightedEvent(string name, int weight, Action weightedEvent) { this.name = name; this.weight = weight; this.weightedEvent = weightedEvent; } } we do need to store the total weight which happens on the Start() function currently. When playRandomEvent() is called, we increase the cursor by the event’s weight until it is greater than the rolled random number between 0 and the total weight, at which point the class’ event is called. Broke nothing in the end! That’s great isn’t it, especially after migrating a bunch of “legacy” code. Hopefully didn’t jinx it.
POLITICS!! + Debugging Hell v2 I mean I guess it is? Not too sure. Event Manager completely overhauled. Double events now no longer have the chance of repeating the same event. Created a new GameEffects script which just takes a bunch of simple code away from EventManager and plays the basic functions such as the “tax revenue increases” which you see below. This was quite a headache to create, and I severely underestimated how much time this would take. I have 2 extra nested classes inside of EventManager for Political Question and Political Scenario. [... inside EventManager.cs ...] public class PoliticalQuestion { public string Question; public TaskCompletionSource<bool> TaskCompletionSource = new TaskCompletionSource<bool>(); public Action onAccept; public PoliticalQuestion(string question, Action onAccept) { Question = question; this.onAccept = onAccept; } } public class PoliticalScenario { public string description; public Action runnable; public PoliticalScenario(string featureDescription, Action functionality) { description = featureDescription; runnable = functionality; } } [Header("Political Question Variables")] public List<PoliticalQuestion> PendingQuestions = new List<PoliticalQuestion>(); public event Action onQueueChanged; private PoliticalScenario[] goodFeatures; private PoliticalScenario[] badFeatures; The political question is sent off to the UI manager, which displays it as shown below. Then it handles user input pressing Y/Enter or N/Esc to accept the user choice, and returns it back to the Event Manager. Seems simple enough, yet there are many ways to do it but I think that the above implementation works the best out of all the ones that I tried. I attempted to use Game Manager as a middleman but that did not work out - so I resorted to passing an entire class. The political scenario allows for the string to actually do something, so that the game knows what to process and what the user agreed to without creating a bunch of variables, and can allow for stacked political question events which is nice. Game’s looking really neat, and the multipliers and stuff can make the game go very crazy very quickly. Too much of a good thing is a bad thing!! Debugged the entire system for like a solid 3 hours it was actually bad. Came first in the UK tho!! I’m back after those 6 exams are done. Yes I know the UI looks pretty bad but it’s good enough for pre-beta testing. Oh yeah, speaking of UI everything is more bold. Figured out how to do that.
MAKE IT RAIN ASTEROIDS Pretty long run honestly. But before that, let’s talk about retrofitting your buildings. Earthquakes are pretty bad. Very bad when you loose your 100k building in a moment. So upgrade it. Yes it’ll cost you 35 to 55k now. But is your peace of mind worth that? And I added asteroids! These fly down and annihilate everything in a 3 unit radius and then set everything else in the 6 unit radius on fire. Lots of minor bug fixes as well, trying to get the game really polished now. Some rejigging of the game’s back end, such as creating a new abstract class for employer and reworking the systems to ensure that they run more smoothly and I believe almost finally fixing the unemployment/vacancy problem. I say almost because every 5 runs I see the game yell at me that it didn’t count something correctly but honestly I’ve spent so long on this I don’t even know if it’d be harder to just rewrite the entire employment system. For more detail, see my video linked below! See if you guys like it, my first proper long form I Added ASTEROIDS that ANNIHILATE your Adorable City And boy will this thing cook your economy.
BETTER UI + XP At the top of the image you can see a little progress bar… yep I’ve added XP now. Got plans for that, probably going to allow you to unlock stuff later. Like the lockdown ability etc. The UI has been overhauled. The actual images are a touch on the placeholder side apart from the road but it looks pretty good. You cycle between road, zoning and special building placement with 1, 2 and 3. Use R to rotate between the modes like residential, commercial and industrial zoning as well as Utilities & Emergency for the special buildings. Then finally T to rotate between those specific buildings. Complicated? Maybe? But it’s also a lot faster. I have completely lost my muscle memory of spamming R like the “good old days” though. Looks good? Bad? Horrible update and the game should never be changed ever again? Best update in the world and I should win £1 trillion? What do you think?
CRIME!!! + C# Generics I added Arson and added a Police manager that goes out and solves these crimes. Lots more to come, let me know of any ideas you have! But before that let me teach you ALL something. C# Generics. I had a bunch of scripts that all did ABOUT the same thing but with different. This was FindClosestHospital, FindClosestFireStation and the thing I was adding which was FindClosestPoliceStation. It felt quire redundant to copy the same lines but instead of Hopsital it was replaced with FireStation or PoliceStation. //Generic functions private T FindClosestReachableService<T>(Vector2Int targetPos, Func<T, bool> hasAvailableVehicles, out List<Vector2Int> bestRoute) where T : Building { T closestBuilding = null; bestRoute = null; int shortestRouteLength = int.MaxValue; bool foundBuildingOfThisType = false; foreach (var kvp in gridManager.GetMapGrid()) { GridManager.GridTile tile = kvp.Value; if (tile.buildingScript != null && tile.buildingScript is T serviceBuilding) { foundBuildingOfThisType = true; if (!hasAvailableVehicles(serviceBuilding)) continue; List<Vector2Int> testRoute = CalculateRoadPath(tile.buildingScript.gridPos, targetPos); if (testRoute == null || testRoute.Count == 0) continue; if (testRoute.Count < shortestRouteLength) { shortestRouteLength = testRoute.Count; bestRoute = testRoute; closestBuilding = serviceBuilding; } } } if (!foundBuildingOfThisType) { bestRoute = null; return null; } return closestBuilding; } Above is an example of the C# generic. We have “T” type, and I think this is a good place to learn about them. Instead of defining the function as returning something like Building , we make T a type. and you can see it passed in a little <T> after the function name. We can also pass in entire functions like Func<T, bool> which is utilised as shown below: Building bestStation = FindClosestReachableService<PoliceStation>(building.gridPos, ps => ps.HasPolice(), out route); you can see ps => ps.HasPolice() calls that out. And finally, to define what T is meant to be, I’ve added where T : Building . You can do this many times, such as by having both a T as well as a U! and you’d have a repeated where T : Building where U: PotatoChips or something idk what U is meant to be bro. This was my first time using it but it’s pretty cool and if you’re using C# I’d recommend learning it as it saved me like 200 lines of code and changing something 3 times to change the same thing! And yes, I added a third thing which is Arson! which is a crime based thing, and you have a visual that shows up as a timer. if a police doesn’t solve the crime it sets on fire. It’s not too bad but it adds a use for the police, with much more to come for the police to deal with in the future! Also added asteroid BOMBARDMENT as a debuff. Yeah it’s brutal. 3 strikes… thats up to 108 tiles DESTROYED and set on fire. And of course, the image is from a youtube video: Click me!
Main menu 👀 I need help. UI clearly isn’t for me
I’m being forced to post Yeah thanks stardance. 10 hour limit for what. Probably spam filter. Also MASSIVE BUG(s). One is that the game just randomly deletes all the buildings from a chunk. No idea why, I’ve been at it for so long. Another issue is the stupid vacancy counter which has been broken FOREVER but atleast now it doesn’t go negative. I have a serious feeling I will have to spend a week just POLISHING the game. Whatever, Currently working through a new feature of allowing you to use your money that you spent so long accumulating to try and fix the chaos that you went through. This is done through the “Council FX” which I may rename if you guys can think of a better name, and you can see the countless things to do such as: Taking On DEBT!! YAY!! 100k that gains 1% every day. Seems low.. but it will pile up very quickly since it’s compound interest. Overclocking the grid for free placement + infinite water/power Maximising Housing/Business revenue Curing all infections … and many more as well as the ??? at level 100… who knows what that does. £2.5 million btw. Of course, those levels are the XP, which has finally given that a use. And no you wont be at level 11000 just like that, i’m just being lazy for testing. Also rebalanced so that all of the commercial buildings have ~10-15% of their previous employment caps. So that you’re not just spamming residential. It also makes industrial more useful as they have more employers even though they produce less money.
Bugs are genuinely taking the life out of me Genuinely the worst thing ever. I STILL can’t figure it out but I had to post my weekly devlog anyways. Can you believe we’re 28 weeks into 2026??! Here’s the chaos where I accidentally created a “Pocket Empire” (Day 1105) Watch the video (click the title) if you wanna see how I ended up here and a minor crash out. very minor.
UFOs in an Alien Invasion 💔💔 The second rare event addition to Pocket City! Get a chunk of your population zapped up by some not so friendly aliens… Any more ideas, let me know below! But it was pretty neat to implement. 3D modelled it and everything. 3 hours of doing god knows what. Tried to figure quality settings out and probably did smth else but was too busy with the World Cup to remember what I did. Probably bug fixes and stuff. Oh yeah and you see a pretty cool ripple pulse thing that propogates through the map. Although it is a little weak right now but i’ll fix that next time. Super tired. mb
I NEED YOUR HELP Pocket City already exists as a game. I know this is stupid and I should have checked this before starting since I had the intention of publishing it to steam but here we are. If you want more details, or more knowledge about the game check this video out: Video Oops…
Hmmmm… What’s cooking? (Blender just WON’T count toward my hours but prolly spent 2-3 extra hours here) The helicopter blades actually spin. And W Unity particle system for the missile.
WORKING AIR DEFENCE + ATTACK HELICOPTERS So we got working air defence turrets with some predictive aiming, and attack helicopters that shoot missiles at random buildings. Although you’re unlikely to get 3 attack helicopters at once… for now. The helicopters blades do spin, they bob up and down, they go towards buildings. They shoot out these missiles, which pathfind their way to the targetted building. They all have a healthsystem which means that the turrets do some damage on collisions only though, one turret might take a while but two (or the 7 you see below) will MOW them down. Still have to hook it all up to the Finance Manager, Special Building placement and other boring stuff, but… I need more IDEAS!! (read this thx) …for more Military stuff that can be added. Tank wars? Who knows. I was thinking of a military invasion as being one of the rare events which spawns like 10 missiles and 5 attack helicopters and maybe a B2 bomber or some stuff. I also need more allied options, maybe I’ll add like an anti-bomb turret that is specifically for the B2 bomber or something and does 100000 damage. Or maybe your own airbase that spawns an allied helicopter and now you have dogwars. or maybe your own plane. idk So yes @Adam_Lotfalla this is what the helicopter was for. Yay more things to worry about!!! Still have integrations left! I’ll see you (hopefully) tomorrow once that’s done. but its midnight now so goodbye.
Nukes… from a plane A famous plane. The B2 Bomber. Idk gng I got bored. No but it drops a nuke that decimates everything in a decent radius and then sets everything in a bigger radius on fire, and now we have a new rare event called a “military invasion”.. that spawns like 8 helicotpers AS WELL as the b2 bomber. The B2 Bomber starts a few clicks out and then flies toward the set target building. Then it drops the nuke, and you have a few seconds to try and kill the nuke before it kills you, and on impact (yes we are finally using rigidbodys as they are intended) it explodes. You better have that turret system ready. Of course, it’s clearly not enough. So maybe I’ll add a anti-missile system as a YouTube comment said. Speaking of YouTube, thank you for all the support :) 100+ comments goes crazy, and we’re on 73 subs up from the previous 29 literally 3 weeks ago. Not subscribed? Help a fellow dev out: TechScope Channel
NEW NAME!!! Flash Floods + Main Menu If you remember, Pocket City is a game that already exists so now it’s called Capital Chaos. Thank you YouTube comments! And all of you as well, for the suggestions. Ofc new video to go with it: watch by clicking here! I created flash floods that.. well flood the entire map. It’s meant to be a little toned down of a disaster, thats more survivable because it gives the game a touch more balance. It stops all services from working, so that could be detrimental during a virus attack. But on the other hand, it stops every single fire and prevents new ones and explosions. A lifesaver if theres a nuke, it gets completely nullified. Also new main menu, I think it looks pretty neat. Especially compared to the old one.
I HATE Menus (in Unity at least) Genuinely hate them. But yeah we got settings menu working (which genuinely took like 5-6 hours because of stupid unity legacy stuff vs new stuff and then unity 6 vs 2023 version stuff i was used to) AHHHH I don’t remember it being this painful in Godot to be honest so maybe Godot is better for that? i had to get rid of VSync because it only worked on refresh. Created a debug menu to test performance, just to see that the only useful thing there was FPS and like RAM usage, and some engine stuff like active Rigidbodys. I couldn’t see the CPU utilisation or GPU utilisation which was… the thing I wanted to see. Although don’t worry performance does seem to be reasonable and early to mid game I can push over 1000 FPS on potato settings (specs at bottom if you care about them). It does obviously go down as the game continues on, but I think it’s quite optimised. Even with shadows its on 500+ FPS with a mid sized down. Although adding trees will quarter your FPS numbers. but it looks pretty so there’s your tradeoff. Although problematically if you turn trees off and you had already generated trees the fps stays low even though you’re not rendering it? I don’t know why unity is so weird. The game is quite unbalanced, but we’re in the final polishing stages (my target is 150 hours for the framework and hopefully it’s secure! (vote nice and high thanks - i did put a lot of effort into this game.) Up next: Difficulty selection Polishing Rebalancing updates Release!
You won’t believe it. I got it working FIRST TRY That’s actually crazy to be honest. Tells you how much expirience those 8 hours of menu development have given me. Someone give me a Unity menu doctorate or sum But on a serious note, we have game difficulty selection and its all nice and self contained. With controller support of course. You can see we have Previous Saves but that isn’t really functional yet. One of the things I learnt is to never rely on the UI giving you the data, only the click, so you’d manually add the elements and then call .value or .isOn respective to the component, and the same goes for dropdowns although I didn’t use one here. Let me know if you think it looks clean or any improvements to the UI readability, etc.
INSANE tree optimisations Went from 60-80 fps @ 4K to 400-450 (in game). Yes a 6 to 7x increase. How you ask? GPU Mesh Instance drawing offloading the CPU work of handling thousands of game objects. In English, I’m no longer spawning thousands of tree objects, but instead telling the GPU to draw the tree instances every frame. This seems quite unintuitive because you’re now drawing thousands of things every second. BUT this means that there are no game objects, so the CPU doesn’t even know that these exist. Also the GPU draws it thousands of times anyways. A game object handles transforms, rotations, etc. that the CPU has to keep track of whether it is active or not. This had the added benefit of the trees having no overhead when the trees are disabled, so you regain all of your framerate! Also I used some neat little script that combined the meshes all together in the GameObject prefab. Now it really should be able to run on your potato PC/Laptop. Combine script using UnityEngine; public class MeshCombineUtility : MonoBehaviour { [ContextMenu("Combine Children Meshes")] public void Combine() { MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; Matrix4x4 matrix = transform.worldToLocalMatrix; for (int i = 0; i < meshFilters.Length; i++) { if (meshFilters[i].gameObject == gameObject) continue; combine[i].mesh = meshFilters[i].sharedMesh; combine[i].transform = matrix * meshFilters[i].transform.localToWorldMatrix; } Mesh combinedMesh = new Mesh(); combinedMesh.CombineMeshes(combine, true, true); #if UNITY_EDITOR string directory = $"Assets/Assets/Mesh/Tree/{gameObject.name}.asset"; UnityEditor.AssetDatabase.CreateAsset(combinedMesh, directory); UnityEditor.AssetDatabase.SaveAssets(); Debug.Log($"Combined mesh saved to {directory}"); #endif } } Draw section of GPU Mesh Instancing private void DrawTreeMeshes() { if (treeMesh == null || treeMaterial == null) return; foreach (var kvp in generatedChunks) { ChunkData chunk = kvp.Value; if (chunk.spawnedTrees == null || chunk.spawnedTrees.Count == 0) continue; int batchSize = 1023; int totalTrees = chunk.spawnedTrees.Count; for(int i = 0; i < totalTrees; i+=batchSize) { int length = Mathf.Min(batchSize, totalTrees - i); Matrix4x4[] subMatrices = new Matrix4x4[length]; for (int j = 0; j < length; j++) { subMatrices[j] = chunk.spawnedTrees[i + j].matrix; } int meshIndex = Mathf.Abs(chunk.chunkCord.GetHashCode() + i) % treeMesh.Length; Graphics.DrawMeshInstanced(treeMesh[meshIndex], 0, treeMaterial, subMatrices, length); } } }
I’m getting new wifi lol, & 150 hours so yeah i won’t be here and probably will have to post a 10 hour thing BUT on the plus side, we got a nice death screen that has a bunch of quotes that you can read below [SerializeField] private string[] quotes = { "Opportunities multiply as they are seized \n - Sun Tzu", "If you are going through hell, keep going \n - Winston Churchill", "No empire was built on the first draft", "Fall seven times, stand up eight", "That which does not kill us, makes us stronger \n - Friedrich Nietzsche", "Out of ash, a new foundation", "I have not failed. I just found 10,000 ways that don't work \n - Thomas Edison", "A man is not finished when he is defeated. He is finished when he quits \n - Richard M. Nixon", "It does not matter how slowly you go as long as you do not stop \n - Confucius", "Out of difficulties grow miracles \n - Jean de La Bruyère", "The greater the obstactle, the more glory in overcoming it \n - Molière", "A Pocket Sized City is too small for your ambition. Build again \n - The Dev", "Success usually comes to those who are too busy to be looking for it \n - Henry David Thoreau", "Go big or go home", "You can't give up just yet. Stay determined... \n - Undertale" }; Maybe you’ll catch the little easter egg there as well ;) Working on adding game audio!! and probably finally enough hours to get the framework 12 (btw I wouldn’t recommend this as a daily laptop (f13 better), I just want something I can write on lol)
Game Sountrack? But before I talk about that, lemme just say the game audio is almost finished, we have menu sounds for clicks and stuff, and i added support for main menu music. The firetruck hoses actually do stuff, floods sound like floods, theres some peaceful background nature sounds and yeah it makes the game feel so much nicer. although i forgot place sounds which was a massive oversight. also my wifi is still working. no idea why, but not complaining. and i’m cooking on a soundtrack lowk although none of it seems correlated in any way and idk how i’ll make it fit into this game but you know what maybe it’ll just all go into some random album. None of the hours put into these songs count but its okay. i’m no pro tho so. all i’ll say is i love some bass
Final DevLog before First Ship - Boss Battle I don’t think words can explain what I made so click here to watch a video on my probably final major addition (no pressure) & also help with a small dilemma I have. NO!! that does not mean this game will stop development, but i think i finally have enough hours (+10-15 more safety) to get a Framework 12! (and then i will be able to crack on with entrance exams - so i guess development will slow a touch). Of course I’ll ship once the game is polished enough. You might see a devlog or two from the “Capital Chaos Website” - follow me ;) I really hope you guys all enjoy it and now I need to do the readme and stuff. I also realised I was one of the most viewed on Stardance which is honestly amazing and I appreciate all of the support :) And thank you to all the new friends I’ve made and all the followers and commenters. It’s honestly been insane.
BETA TEST! Nvm I have to devlog my final changes But lemme talk to those stardance reviewers real quick. Scroll down to see the endless content of my story, and all the community feedback (also on my youtube). Playing the game is a bit of a learning curve so you can watch my videos and stuff on it as well. I’d say watch this one: Boss Fight for the boss fight and maybe one of the other ones that you find interesting. Maybe this one because it has over 1,000 views and still climbing! The game is released there but it is windows only for now (i will release linux and maybe mac on the actual release game don’t worry but I’m super restricted for time right now) SKIP IF YOU’RE ON LINUX / MAC For everyone: Changes: Amended GameAudioManager to adjust for max voices which uses a List based system that appends and unappends. Boss fight also toggles and untoggles the game audio dependant on each audio source, because the game could currently have hundreds or even thousands of audio source which is really bad optimisation. So each audio source that I want to track has a ManagedAudioSource attached which automatically registers and unregisters itself from the GameAudioManager. I also edited the boss fight to make it a touch harder and amended the moves ;) And come and beta test NOWWW. leave all your comments, suggestions etc. on THE NEW DISCORD COMMUNITY!! or youtube, i’ll read it all and, again, thank you all for your support . I don’t know what to put as the image so here.
Thank you all so much for the support! Framework 12 is on it’s way (and this wait is painful). After 171 hours! 19.54x is actually insane and I appreciate it a lot. Join the Discord! I made a discord (click above) and i’ll give you all an early supporter role before I put it out on YouTube and stuff for the “wishlist” when the full game comes out (if you want to stay in touch after stardance is done. ALSO IF YOU COMMENTED WHILE THE GAME WAS STILL CALLED POCKET CITY DM ME ILL GIVE U A SPECIAL ROLE The game beta is still up and you can try it out Currently just doing some minor stuff to the game (Fixed some normal/easy mode not settings correct phases. B2 Bomber should destroy itself and stop the nuke siren once launched), and slowly adding a tutorial but I’m like 90% focused on revising for uni entrance exams
Ships:
Welcome to Capital Chaos! One of Stardance’s most awaited projects ;) (hopefully anyways) We’ve got chaos, a bunch of random events, a boss fight and so much more for you to explore. SKIP if you are on Linux/MacOS (or you can vote based on the videos - completely up to you) as I only have a windows executable for now. I am honestly super proud of this, and the community built around this game. I hope you enjoy it as well. There have been TONNES of challenges, such as pathfinding, the initial grid also seemed really daunting. To the vacancy count which was literally plaguing me for the past MONTH and got fixed today (it was one line… i know.. maybe I should have used AI). But besides, it’s a sick project. I hope you all love it. Unzip the file in the release and it should be good to go. READ THE README FOR INSTRUCTIONS AND CONTROLS!! THERE IS NO TUTORIAL Read the story, watch the videos if you can and just enjoy the game! It will be on steam in 8-9 months so maybe subscribe?...
|
1793537769.9557676
|
1793624169.9557676
|
|
45646
|
TinyLilFella by @purpletue | Stardance
|
purpletue
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T19:08:11Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "After a few weeks of development, I am excited to introduce: TinyLilFella, the smallest STM32 devboard at least i can find. Featuring an STM32C071 and an absurdly small form factor, TinyLilFella is the devboard to go with if you need a smart dongle. no it doesn’t have wireless, susan. its this small. It’s got 10 GPIO, 6 of those being actual I/O and 4 being power! It also has an RGB LED to do whatever your heart desires!", "repo": "https://github.com/purpletue/TinyLilFella", "demo": ""}]...
|
[{"post_id": 48734, "ts": "202 [{"post_id": 48734, "ts": "2026-08-17T08:18:45Z", "hours": 0.5833, "text": "Finished the PCB COMPLETELY. THATS IT. DONE. NOTHING ELSE. i added a programmable button and a BOOT button, along with a power indicator."}, {"post_id": 45319, "ts": "2026-08-11T18:13:43Z", "hours": 1.2256, "text": "Made a bloody case in tinkercad. lets hope and pray my funding request gets approved."}, {"post_id": 43912, "ts": "2026-08-09T11:13:12Z", "hours": 0.6833, "text": "i finished the PCB!!! YAY!!!!!!!!!!!!!!!!!! THANK GOD FOR FREEROUTING YET AGAIN. uh can anybody help me out here how do i get a demo URL of a couple files in my computer…?"}, {"post_id": 43884, "ts": "2026-08-09T10:17:25Z", "hours": 1.2167, "text": "finished the schematic for my new project! wow this is gonna take a while for the PCB huh"}]...
|
Title: TinyLilFella by @purpletue | Stardance
Dev Title: TinyLilFella by @purpletue | Stardance
Devlogs:
finished the schematic for my new project! wow this is gonna take a while for the PCB huh
i finished the PCB!!! YAY!!!!!!!!!!!!!!!!!! THANK GOD FOR FREEROUTING YET AGAIN. uh can anybody help me out here how do i get a demo URL of a couple files in my computer…?
Made a bloody case in tinkercad. lets hope and pray my funding request gets approved.
Finished the PCB COMPLETELY. THATS IT. DONE. NOTHING ELSE. i added a programmable button and a BOOT button, along with a power indicator.
Ships:
After a few weeks of development, I am excited to introduce: TinyLilFella, the smallest STM32 devboard at least i can find. Featuring an STM32C071 and an absurdly small form factor, TinyLilFella is the devboard to go with if you need a smart dongle. no it doesn’t have wireless, susan. its this small. It’s got 10 GPIO, 6 of those being actual I/O and 4 being power! It also has an RGB LED to do whatever your heart desires!...
|
1793530528.1416154
|
1793616928.1416154
|
|
51941
|
MeowBotMeow by @CharlieCatMeow | Stardance
|
CharlieCatMeow
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T19:06:45Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "MeowBotMeow - A slack bot made by me :D It features four commands: /meowbotmeow-help /meowbotmeow-ping /meowbotmeow-catfact /meowbotmeow-joke That’s all I did so far. Very fun to make!", "repo": "https://github.com/CharlieTheCatMeow/MeowBotMeow-Slack-Bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BS4U512AY"}]...
|
[{"post_id": 52560, "ts": "202 [{"post_id": 52560, "ts": "2026-08-22T18:52:34Z", "hours": 0.7936, "text": "MeowBotMeow Devlog #2 Pretty much finished the bot for now. I got 4 commands (Added a joke and catfact command) and hosted it on nest. I (for some reason) can’t change the image and name of the bot, so idk what to do here."}, {"post_id": 51103, "ts": "2026-08-20T16:27:02Z", "hours": 0.3236, "text": "MeowBotMeow Devlog #1 Got started with this project. I followed the guide and added two commands: Get the latency of the bot Get a list of commands"}]...
|
Title: MeowBotMeow by @CharlieCatMeow | Stardance
Title: MeowBotMeow by @CharlieCatMeow | Stardance
Devlogs:
MeowBotMeow Devlog #1 Got started with this project. I followed the guide and added two commands: Get the latency of the bot Get a list of commands
MeowBotMeow Devlog #2 Pretty much finished the bot for now. I got 4 commands (Added a joke and catfact command) and hosted it on nest. I (for some reason) can’t change the image and name of the bot, so idk what to do here.
Ships:
MeowBotMeow - A slack bot made by me :D It features four commands: /meowbotmeow-help /meowbotmeow-ping /meowbotmeow-catfact /meowbotmeow-joke That’s all I did so far. Very fun to make!...
|
1793551924.1842122
|
1793638324.1842122
|
|
41961
|
new tab by @ele-na | Stardance
|
ele-na
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T19:03:08Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a new tab page (somewhat) that contains a clock, tiny search bar, and dynamic images from NASA’s APOD api key! features: dynamic wallpaper (on good days) search bar clock future updates: app icons links newsfeed interactive stuff possible video and gif bugs", "repo": "https://github.com/ele-na2011/space-api-practice", "demo": "https://ele-na2011.github.io/space-api-practice/"}]...
|
[{"post_id": 52563, "ts": "202 [{"post_id": 52563, "ts": "2026-08-22T18:55:55Z", "hours": 0.9947, "text": "after uh ghosting this project for a couple weeks (stuff happened lol), i came back today and did quite a bit. firstly, i fixed the time element and made it only display the date and hours/minutes i also figured out how to make the background the NASA APOD i also added a google search bar so its on its way to actually becoming a new tab"}, {"post_id": 39818, "ts": "2026-08-03T02:02:37Z", "hours": 0.9369, "text": "today i finally got the vite and everything set up, got a new api and created my site!! this is my first time using vite and other interesting file types such as gitignore and related stuff! i pretty much just followed the guide, but i started a bit differently by initially just creating a github repo instead of importing the files afterwards right now the website shows some really interesting clouds! i also edited the css a bit (finally getting the hang of css after losing it for 4 years!!) to give it a cooler vibe and stuff – i really like the monospace fonts idk why but yeah!!"}]...
|
Title: new tab by @ele-na | Stardance
Devlogs:
to Title: new tab by @ele-na | Stardance
Devlogs:
today i finally got the vite and everything set up, got a new api and created my site!! this is my first time using vite and other interesting file types such as gitignore and related stuff! i pretty much just followed the guide, but i started a bit differently by initially just creating a github repo instead of importing the files afterwards right now the website shows some really interesting clouds! i also edited the css a bit (finally getting the hang of css after losing it for 4 years!!) to give it a cooler vibe and stuff – i really like the monospace fonts idk why but yeah!!
after uh ghosting this project for a couple weeks (stuff happened lol), i came back today and did quite a bit. firstly, i fixed the time element and made it only display the date and hours/minutes i also figured out how to make the background the NASA APOD i also added a google search bar so its on its way to actually becoming a new tab
Ships:
i made a new tab page (somewhat) that contains a clock, tiny search bar, and dynamic images from NASA’s APOD api key! features: dynamic wallpaper (on good days) search bar clock future updates: app icons links newsfeed interactive stuff possible video and gif bugs...
|
1793505510.6813645
|
1793591910.6813645
|
|
48948
|
study app by @mabu | Stardance
|
mabu
|
2
|
8.0
|
72
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T18:26:50Z", "hours": 5.0, "multiplier": 10.41, "payout": 55, "blessing": "neutral", "text": "Hey everyone Based on the feedback from our previous ship I decided to add some of the features you guys suggested First, a quick update I am not doing the virtual pet for now. When I asked a few people about it, they pointed out that a moving virtual pet would be too distracting The new features: We added 2 new modes dark mode and grey mode as the colours are to distracting so now when u open the web it will be in dark mode but u can change it later We also made it that when u reload the page and ur old study data will still be there and wont go but after 24/hrs it will go We also added 2 new study music (rain and lofi chords) I HOPE U GUYS LIKE THIS AND PLS LET ME KNOW WHAT ELSE U WANT ME TO ADD (DM ME ON mabu100 if u want me to add something else) BYE GUYS !! GL", "repo": "https://github.com/mabu100/ez-study-2.0", "demo": "https://mabu100.github.io/ez-study-2.0/"}, {"ship_num": 2, "ts": "2026-08-16T17:08:06Z", "hours": 3.0, "multiplier": 5.78, "payout": 17, "blessing": "neutral", "text": "I made a tree focus app with focus music(white,pink and brow noise) and u can grow a tree while u study. so u get a reward in the end for studying. Its a very ez and simple project but this will help everyone stay locked in. I made this website for ppl like me who can study focused for 25 or 50 mins. When using the website u can even add the tasks u need to complete. I hope u guys like this project and gl everyone .", "repo": "https://github.com/mabu100/ez-study-2.0", "demo": "https://mabu100.github.io/ez-study-2.0/"}]...
|
[{"post_id": 52528, "ts": "202 [{"post_id": 52528, "ts": "2026-08-22T18:06:40Z", "hours": 4.5567, "text": "Hey everyone! First, a quick update I am not doing the virtual pet for now. When I asked a few people about it, they pointed out that a moving virtual pet would be too distracting The new features: We added 2 new modes dark mode and grey mode as the colours are to distracting so now when u open the web it will be in dark mode We also made it that when u reload the page ur old study data will still be there and wont go We also added 2 new study music (rain and lofi chords)"}, {"post_id": 49649, "ts": "2026-08-18T15:19:57Z", "hours": 0.7697, "text": "I am trying to add a virtual pet to the study app will add the and ship again after the first ship comes back"}, {"post_id": 48300, "ts": "2026-08-16T16:39:05Z", "hours": 0.3572, "text": "We got a small reward after studying!!! U can grow an apple tree rose bush a or a sakura tree."}, {"post_id": 48231, "ts": "2026-08-16T15:12:24Z", "hours": 0.7753, "text": "WE GOT FOCUS MUSIC!!!!!!!!!"}, {"post_id": 48155, "ts": "2026-08-16T13:37:42Z", "hours": 1.4333, "text": "I thought the design was a bit plain, so I added color options and a deep focus mode to spice it up"}, {"post_id": 47951, "ts": "2026-08-16T06:52:58Z", "hours": 0.4181, "text": "I love using study app while i am locked in so i built a study app for me that i can use while studying"}]...
|
Title: study app by @mabu | Stardance
Devlogs:
I Title: study app by @mabu | Stardance
Devlogs:
I love using study app while i am locked in so i built a study app for me that i can use while studying
I thought the design was a bit plain, so I added color options and a deep focus mode to spice it up
WE GOT FOCUS MUSIC!!!!!!!!!
We got a small reward after studying!!! U can grow an apple tree rose bush a or a sakura tree.
I am trying to add a virtual pet to the study app will add the and ship again after the first ship comes back
Hey everyone! First, a quick update I am not doing the virtual pet for now. When I asked a few people about it, they pointed out that a moving virtual pet would be too distracting The new features: We added 2 new modes dark mode and grey mode as the colours are to distracting so now when u open the web it will be in dark mode We also made it that when u reload the page ur old study data will still be there and wont go We also added 2 new study music (rain and lofi chords)
Ships:
I made a tree focus app with focus music(white,pink and brow noise) and u can grow a tree while u study. so u get a reward in the end for studying. Its a very ez and simple project but this will help everyone stay locked in. I made this website for ppl like me who can study focused for 25 or 50 mins. When using the website u can even add the tasks u need to complete. I hope u guys like this project and gl everyone .
Hey everyone Based on the feedback from our previous ship I decided to add some of the features you guys suggested First, a quick update I am not doing the virtual pet for now. When I asked a few people about it, they pointed out that a moving virtual pet would be too distracting The new features: We added 2 new modes dark mode and grey mode as the colours are to distracting so now when u open the web it will be in dark mode but u can change it later We also made it that when u reload the page and ur old study data will still be there and wont go but after 24/hrs it will go We also added 2 new study music (rain and lofi chords) I HOPE U GUYS LIKE THIS AND PLS LET ME KNOW WHAT ELSE U WANT ME TO ADD (DM ME ON mabu100 if u want me to add something else) BYE GUYS !! GL...
|
1792878526.080238
|
1793742526.080238
|
|
46787
|
World Of Physics by @suprit | Stardance
|
suprit
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T18:18:18Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Completed the full website today. I had already completed the UI design of the Admin Panel in the first devlog. Today, I completed the functioning of the admin panel too! The admin panel has a few tabs. Questions - Questions can be uploaded by the admin only! Exams - Exams can be created here. Plus, we can see results of the users who submitted their exam. Students - The tab where I can view an overall detail about any student I want to inspect Settings - The settings page to add a Gemini API key in order to get easy explanations to questions. If you want to take a one - time only demo test to see how the page looks, come here! Take A Demo Test or Exam Code - TEST_MIX_62 Note: The website is designed personally for my tutor. I am sorry to say that I cant give any user any access to the Admin Panel :(", "repo": "https://github.com/supritpahari/examsite", "demo": "https://worldofphysics.vercel.app"}]...
|
[{"post_id": 52535, "ts": "202 [{"post_id": 52535, "ts": "2026-08-22T18:16:21Z", "hours": 4.0808, "text": "Completed the Admin Panel today. I had already completed the UI design of the Admin Panel in the first devlog. Today, I completed the functioning of the admin panel too! The admin panel has a few tabs. Questions - Questions can be uploaded by the admin only! Exams - Exams can be created here. Plus, we can see results of the users who submitted their exam. Students - The tab where I can view an overall detail about any student I want to inspect Settings - The settings page to add a Gemini API key in order to get easy explanations to questions. If you want to take a one - time only demo test to see how the page looks, come here! Take A Demo Test or Exam Code - TEST_MIX_62 Note: The website is designed personally for my tutor. I am sorry to say that I cant give any user any access to the Admin Panel :("}, {"post_id": 45255, "ts": "2026-08-11T16:32:25Z", "hours": 4.3292, "text": "Made my first preview of the website. I hope it looks good. For now, the website is focused on frontend and some basic Google Firebase backends in Admin Panel authentication. My next objective will be to sync everything with firebase authentication and database!"}]...
|
Title: World Of Physics by @suprit | Stardance
De Title: World Of Physics by @suprit | Stardance
Devlogs:
Made my first preview of the website. I hope it looks good. For now, the website is focused on frontend and some basic Google Firebase backends in Admin Panel authentication. My next objective will be to sync everything with firebase authentication and database!
Completed the Admin Panel today. I had already completed the UI design of the Admin Panel in the first devlog. Today, I completed the functioning of the admin panel too! The admin panel has a few tabs. Questions - Questions can be uploaded by the admin only! Exams - Exams can be created here. Plus, we can see results of the users who submitted their exam. Students - The tab where I can view an overall detail about any student I want to inspect Settings - The settings page to add a Gemini API key in order to get easy explanations to questions. If you want to take a one - time only demo test to see how the page looks, come here! Take A Demo Test or Exam Code - TEST_MIX_62 Note: The website is designed personally for my tutor. I am sorry to say that I cant give any user any access to the Admin Panel :(
Ships:
Completed the full website today. I had already completed the UI design of the Admin Panel in the first devlog. Today, I completed the functioning of the admin panel too! The admin panel has a few tabs. Questions - Questions can be uploaded by the admin only! Exams - Exams can be created here. Plus, we can see results of the users who submitted their exam. Students - The tab where I can view an overall detail about any student I want to inspect Settings - The settings page to add a Gemini API key in order to get easy explanations to questions. If you want to take a one - time only demo test to see how the page looks, come here! Take A Demo Test or Exam Code - TEST_MIX_62 Note: The website is designed personally for my tutor. I am sorry to say that I cant give any user any access to the Admin Panel :(...
|
1793497764.2141416
|
1793584164.2141416
|
|
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...
|
1793519329.3130717
|
1793605729.3130717
|
|
48734
|
DuskOS_V1 by @AryaRanjan | Stardance
|
AryaRanjan
|
1
|
3.82
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T18:15:20Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Uh i am unable to do 3 Devlogs, and i messsed which ill fix in My OS V2", "repo": "https://github.com/aryaranjan22/AuraOS_V1", "demo": "https://aryaranjan22.github.io/DuskOS_V1/"}]...
|
[{"post_id": 53039, "ts": "202 [{"post_id": 53039, "ts": "2026-08-23T13:02:48Z", "hours": 0.2967, "text": "Revamped the whole OS and named it DuskOS (while i was playing minecraft i got idea and did this like too much time"}, {"post_id": 52557, "ts": "2026-08-22T18:43:07Z", "hours": 1.5217, "text": "Finally the CS is ready I’d be releasing it"}, {"post_id": 52148, "ts": "2026-08-22T07:36:09Z", "hours": 1.7606, "text": "Completed the index.html like it took 1 hr 43 min but it is logged as 1hr 20 min still happy and i am unable to upload another 3 logs because it is not updating my logs"}]...
|
Title: DuskOS_V1 by @AryaRanjan | Stardance
Devlo Title: DuskOS_V1 by @AryaRanjan | Stardance
Devlogs:
Completed the index.html like it took 1 hr 43 min but it is logged as 1hr 20 min still happy and i am unable to upload another 3 logs because it is not updating my logs
Finally the CS is ready I’d be releasing it
Revamped the whole OS and named it DuskOS (while i was playing minecraft i got idea and did this like too much time
Ships:
Uh i am unable to do 3 Devlogs, and i messsed which ill fix in My OS V2...
|
1792878760.710442
|
1793742760.710442
|
|
49222
|
My own site! by @Stackx64 | Stardance
|
Stackx64
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T17:42:53Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made personal website about me using HTML and CSS! It has About Me, Hobbies, Skills, Projects, Goals, and my GitHub link. Hardest part: Connecting my CSS to my HTML — it wouldn’t work at first and I had to figure out what I did wrong! I’m proud of The hover effects! I used a little AI help for that part since I didn’t know how to do it, but I tried it out myself until it looked right. To test it: Open “index.html” in a browser, click the links at the top, and hover your mouse over stuff to see the colors change!", "repo": "https://github.com/Stackx64/my-new-web", "demo": "https://stackx64.github.io/my-new-web/"}]...
|
[{"post_id": 52453, "ts": "202 [{"post_id": 52453, "ts": "2026-08-22T16:02:28Z", "hours": 0.2644, "text": "I was facing problem while loding website this is how is fixed 1) check the code properly 2)I found out I coded wrong (css part was error free but I messed up in html part 3)Arranged code in perfect order 4)still there was problem in code so re-checked and debuged it with the help of ai"}, {"post_id": 52412, "ts": "2026-08-22T15:21:51Z", "hours": 2.1492, "text": "HEY all working on my 1st web"}]...
|
Title: My own site! by @Stackx64 | Stardance
Devl Title: My own site! by @Stackx64 | Stardance
Devlogs:
HEY all working on my 1st web
I was facing problem while loding website this is how is fixed 1) check the code properly 2)I found out I coded wrong (css part was error free but I messed up in html part 3)Arranged code in perfect order 4)still there was problem in code so re-checked and debuged it with the help of ai
Ships:
I made personal website about me using HTML and CSS! It has About Me, Hobbies, Skills, Projects, Goals, and my GitHub link. Hardest part: Connecting my CSS to my HTML — it wouldn’t work at first and I had to figure out what I did wrong! I’m proud of The hover effects! I used a little AI help for that part since I didn’t know how to do it, but I tried it out myself until it looked right. To test it: Open “index.html” in a browser, click the links at the top, and hover your mouse over stuff to see the colors change!...
|
1793008427.0853205
|
1793872427.0853205
|
|
52277
|
FreeOs by @tobias_pacal | Stardance
|
tobias_pacal
|
1
|
5.98
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T17:31:42Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I mede my Web os called Free os its so much base on windows (couse you need a subscription). You can check it you :3", "repo": "https://github.com/tobiawspac/Free-Os", "demo": "https://0729e9a3.freeos-10r.pages.dev/"}]...
|
[{"post_id": 55013, "ts": "202 [{"post_id": 55013, "ts": "2026-08-26T13:16:59Z", "hours": 1.8636, "text": "redo time for like the 100th time"}, {"post_id": 53632, "ts": "2026-08-24T08:43:48Z", "hours": 1.1186, "text": "recertification time"}, {"post_id": 52509, "ts": "2026-08-22T17:28:25Z", "hours": 0.7608, "text": "Now workyyyy"}, {"post_id": 52454, "ts": "2026-08-22T16:03:01Z", "hours": 1.4083, "text": "it brokyyy"}, {"post_id": 51619, "ts": "2026-08-21T12:19:14Z", "hours": 0.4475, "text": "got an working draft"}]...
|
Title: FreeOs by @tobias_pacal | Stardance
Devlog Title: FreeOs by @tobias_pacal | Stardance
Devlogs:
got an working draft
it brokyyy
Now workyyyy
recertification time
redo time for like the 100th time
Ships:
I mede my Web os called Free os its so much base on windows (couse you need a subscription). You can check it you :3...
|
1792882085.0095913
|
1793746085.0095913
|
|
52940
|
Basic Calculator by @kushm1248 | Stardance
|
kushm1248
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T17:22:04Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a basic calculator using Python and PySide6, with a Streamlit web version so it can also be used directly in a browser. The most challenging part was connecting the buttons with the calculator functions and making sure the operations worked correctly. Deploying the Streamlit version was also a new experience for me. I am proud that I built the calculator myself and successfully turned it into a working web application with a live demo. You can test the calculator by entering numbers and using +, -, *, /, then pressing = to calculate the result. The C button clears the display. Avoid dividing by zero.", "repo": "https://github.com/kush-mishra2603/Basic-Calculator", "demo": "https://basic-calculator-dz6urvnvgspkcwfa3vmto5.streamlit.app/"}]...
|
[{"post_id": 52463, "ts": "202 [{"post_id": 52463, "ts": "2026-08-22T16:17:14Z", "hours": 3.9378, "text": "I started this project to learn how to create graphical applications using Python and PySide6. I first learned how to create buttons and a display, then used QGridLayout and loops to arrange the calculator buttons. I implemented button-click handling and operator validation so multiple operators cannot be entered consecutively. I also learned about signals, connect(), lambda functions, and Qt alignment while designing the GUI. Finally, I styled the calculator to make the interface cleaner and more aesthetic."}]...
|
Title: Basic Calculator by @kushm1248 | Stardance
Title: Basic Calculator by @kushm1248 | Stardance
Devlogs:
I started this project to learn how to create graphical applications using Python and PySide6. I first learned how to create buttons and a display, then used QGridLayout and loops to arrange the calculator buttons. I implemented button-click handling and operator validation so multiple operators cannot be entered consecutively. I also learned about signals, connect(), lambda functions, and Qt alignment while designing the GUI. Finally, I styled the calculator to make the interface cleaner and more aesthetic.
Ships:
I made a basic calculator using Python and PySide6, with a Streamlit web version so it can also be used directly in a browser. The most challenging part was connecting the buttons with the calculator functions and making sure the operations worked correctly. Deploying the Streamlit version was also a new experience for me. I am proud that I built the calculator myself and successfully turned it into a working web application with a live demo. You can test the calculator by entering numbers and using +, -, *, /, then pressing = to calculate the result. The C button clears the display. Avoid dividing by zero....
|
1793519548.6244602
|
1793605948.6244602
|
|
51542
|
Password Generator by @RajanKC | Stardance
|
RajanKC
|
1
|
3.0
|
5
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T17:18:56Z", "hours": 3.0, "multiplier": 1.62, "payout": 5, "blessing": "neutral", "text": "Completed the Website I made this website without any AI and Guide Please rate this project good", "repo": "https://github.com/RajanKCKC/Password-Gen", "demo": "https://rajankckc.github.io/Password-Gen/"}]...
|
[{"post_id": 52495, "ts": "202 [{"post_id": 52495, "ts": "2026-08-22T17:15:49Z", "hours": 0.7617, "text": "Add custom name input and update password generation logic"}, {"post_id": 52470, "ts": "2026-08-22T16:28:23Z", "hours": 0.7658, "text": "Added History"}, {"post_id": 52346, "ts": "2026-08-22T13:39:23Z", "hours": 0.3667, "text": "Added Readme.md"}, {"post_id": 52322, "ts": "2026-08-22T13:07:19Z", "hours": 0.5831, "text": "Added Script.js"}, {"post_id": 51414, "ts": "2026-08-21T03:16:47Z", "hours": 0.4667, "text": "Added Style.css"}, {"post_id": 50459, "ts": "2026-08-19T16:55:16Z", "hours": 0.2667, "text": "Add initial HTML structure for Password Generator"}]...
|
Title: Password Generator by @RajanKC | Stardance
Title: Password Generator by @RajanKC | Stardance
Devlogs:
Add initial HTML structure for Password Generator
Added Style.css
Added Script.js
Added Readme.md
Added History
Add custom name input and update password generation logic
Ships:
Completed the Website I made this website without any AI and Guide Please rate this project good...
|
1793505447.09065
|
1793591847.09065
|
|
24718
|
Kerbal Gravity Program by @Systemic_speed | Starda Kerbal Gravity Program by @Systemic_speed | Stardance...
|
Systemic_speed
|
1
|
50.0
|
636
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T17:07:33Z", "hours": 50.0, "multiplier": 12.89, "payout": 636, "blessing": "neutral", "text": "Kerbal Gravity Program: SHIP - 1 Any KSP player knows the pain of planning a whole journey, then the Kraken wipes it and sends you back to the pad. Real missions are the same grind (see Cassini-Huygens: Cassini’s trajectory ). So I built KGRP — a mission planner for KSP you drive from a REPL or code, to plan and understand trips to other planets. Crash course pip install kgrp # Python 3.10+ kgrp # start the REPL help # every command, flag, and use Requirements Built on numpy (math), scipy (integration/solving), and pyvista (orbit and trajectory visualization), with rich and prompt-toolkit powering the REPL. What was challenging The math was the hard part — RKF(4)5 (Runge-Kutta-Fehlberg 4(5)), an adaptive-step integrator, was an absolute pain to get right. Shipping a real library was the other half; I’d made sites and small CLIs, but wasn’t sure this would hold together. What I’m proud of First thing I’ve ever put on PyPI. Along the way I got real with numpy, scipy, pyvista, and building a CLI/REPL people can actually use. A note on AI I used AI to help squash bugs and for the basic beautification of the README. The planning math and the tool itself are mine; the AI just helped me clean up and unstick the rough parts. Try it It’s out — test it, throw it at the wall, and send notes via feedback. P.S. There are a few easter eggs hiding in the errors. Go find them. Happy orbiting!!!", "repo": "https://github.com/Gautham-rgb/Kerbal-Gravity-Program", "demo": "https://pypi.org/project/kgrp/"}]...
|
[{"post_id": 48135, "ts": "202 [{"post_id": 48135, "ts": "2026-08-16T12:59:10Z", "hours": 10.3972, "text": "Devlog 9 — Kerbal Gravity Program: the REPL is (almost) done No devlog last week — life happened, then OpenCode helped me absolutely cook. Newcomers: KGRP is a mission planner for KSP (runs outside the game). You define a spacecraft, stack events on a timeline, and the sim runs them. Plan in the tool, fly in the game. Where we are The REPL is nearly feature-complete. Every mission action is a TicketEvent — coast, maneuver, burn, engine toggle, science. The REPL never touches your ship directly; it just advances a ticket in UT and events fire when the timeline reaches them. One plan drives the renderer, physics, and save file. Also closed the loop on “one source of truth”: the fancy integrator used to run in a vacuum (zero gravity) when fired from a ticket. Now go , advance , and reset all agree on where you are. go Pick a start and end orbit from the presets and it works out burns, coasting, and delta-v, then schedules them: > go current moon:3a Transfer plan: Current (200,000m circular, 0.0 deg) -> Mun orbit (11,400,000m circular, 0.0 deg) (about Kerbin) Burns: 2 Total delta-v: 1,112.7 m/s Duration: 27,130.1s burn @ 0.0s dv=764.2 m/s Raise apoapsis to transfer coast 0.0s -> 27,130.1s Coast to apoapsis burn @ 27,130.1s dv=348.5 m/s Circularize / match target Resulting orbit: pe=12,000,000m ap=12,000,000m i=0.0 deg around Kerbin Presets are editable (and saveable to presets.json ); the planner core is a plain importable function ( go_plan(ticket, ...).total_dv ). Usability Time input isn’t a math exam: advance 2d 5h , time \"Year 2, Day 100\" . Per-use overrides without touching presets: go current preset:molniya incl=30 . go shows the plan and asks before committing (gradual / instant / cancel). edit now handles ships, not just bodies: mass, fuel, orbit elements. New-ticket wizard hands you an engine and 3,000 kg of fuel instead of a paperweight. After a reset you can clear/redo the timeline without fighting the guard. What’s next Some math is still coarse: plane changes are exact only for moon targets, synchronous orbits are a placeholder (no body rotation yet), arg-p/LAN drift isn’t modeled, and error messages need work — for when you type advance 5 bananas . Fun one I found: escaping at exactly escape velocity puts the orbit at eccentricity 1.000000 and the math gives up — the craft freezes and frame switches / go turn to nonsense. Interplanetary go is broken because of it, but burning slightly past escape fixes it (properly hyperbolic, maths happy). Just needs wiring in. In the meantime Planning to put it up on PyPi and hope it works"}, {"post_id": 43345, "ts": "2026-08-08T15:27:51Z", "hours": 8.115, "text": "Devlog 8: Kerbal Gravity Program For anyone who’s new here, KGRP is a mission planning tool I’m building for KSP (and hopefully real-world missions too). The goal is to make planning orbital transfers and interplanetary missions a lot easier. Think of it as something inspired by libraries like Skyfield and Poliastro , but with a bigger focus on actually planning missions Today and the days after i gave my last devlog were actually useful, i mainly just created a new class based system (yes i am forced to, because my idea needs tooo many moving parts) called the Ticket : The Ticket allows you to plan entire journeys using TicketEvents , stuff that define what can happen to a spacecraft (14 of them). for example, you can have a ticket that contains a maeuver, a coast, an rcs translation, a docking and more. and one more thing, instead of a CLI (one command and forget), i am instead making a REPL (it remembers what you did). so yeah, that sums most of it up and also i made a new banner for KGRP (kinda yay???) What’s next so the main thing is to just start making the REPL using prompt-toolkit and other stuff. until then, see ya"}, {"post_id": 35751, "ts": "2026-07-27T12:06:00Z", "hours": 5.0831, "text": "Devlog 7: Kerbal Gravity Program (KGRP) For anyone who’s new here, KGRP is a mission planning tool I’m building for KSP (and hopefully real-world missions too). The goal is to make planning orbital transfers and interplanetary missions a lot easier. Think of it as something inspired by libraries like Skyfield and Poliastro , but with a bigger focus on actually planning missions. What happened today? Today was surprisingly productive and useful. The biggest thing is that the renderer finally works. I spent way too long fighting with it over the past few days, so it’s nice to finally be able to move planets around without everything exploding. I also added a few other things: You can now create entire planetary systems from a planet.json file. Added adapters for PySide6 and NiceGUI , so there are a couple of different ways to use the renderer now. Started working on a more realistic gravity simulator that can deal with things like Lagrange points. KGRP finally has an actual logo (\(^▽^)/) instead of me pretending the text was good enough for docs and stuff. One thing I still need to fix is the JSON loader. Right now it only really likes absolute paths, which is… less than ideal. The renderer tried to gaslight me I swear I’m not making this up. Earlier today I found this absolutely cursed bug where, if you flew the camera into the Sun and zoomed out, the whole scene turned into this weird fisheye effect with random lines stretching across the screen. I was already mentally preparing myself to spend the next few hours digging through camera code and VTK documentation… …and then it just stopped happening. I didn’t fix it. I didn’t even change anything related to the camera. It just… disappeared. So either I accidentally fixed it without realizing, or it’s waiting until I show someone the project before it decides to come back. What’s next? Nothing too exciting, mostly polishing things up. Fix the JSON loader. Squash whatever bugs are still hiding in the renderer. Improve the CLI a bit more. Anyway, here’s the renderer doing the thing (oh, gotta fix that) and the logo (idk if it’s good, comment about it)."}, {"post_id": 32971, "ts": "2026-07-22T13:58:33Z", "hours": 9.6439, "text": "Devlog 6: Kerbal Gravity Program (KGRP) KGRP is a mission planning tool I’m building for KSP players and actual aerospace engineers to map out complex trajectories. It’s loosely based on libraries like Skyfield , Poliastro , and Trajectorize . The ultimate goal is to make it easy to plot out massive interplanetary trips, whether you’re trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. What happened today Today was a very, very buggy day. I had to tackle the core rendering systems, but I ended up running a grueling gauntlet through almost every Python graphics library out there—Panda3D, Ursina, ModernGL, VPython, and more. Every single one of them introduced some kind of blocking issue: Windows that were supposed to pop up via Tkinter or Pygame-CE started doing random things like teleporting wildly across my screen or rendering with completely broken layout dimensions. Even when a window finally initialized and stayed stable, it would just mock me with a dead black screen entirely missing our blobs of color (the actual planets and calculated orbit lines). This black-screen loop is exactly what hit me when I switched over to PyVista. Why the Viewport went Black Staring into a blank 3D canvas is a rite of passage when writing an engine from scratch. After tracking down the pipeline bugs, the black screen in PyVista boiled down to three classic astrodynamics simulation mistakes: The Compound Drift Bug ( mesh.translate ) Using mesh.translate(inplace=True) directly mutates the underlying vertex memory of the sphere meshes. Because my physics engine loop advances frames based on absolute coordinates ( get_absolute_pos_at_ut ), relative delta transforms compounded exponentially. Within frame one, the planets physically flew millions of kilometers away from the camera. The Camera Initialization Trap Setting camera_position = 'iso' while the newly instantiated planet objects were still sitting uninitialized at (0, 0, 0) forced the viewport to lock its focus onto a microscopic bounding box. The moment the first timer tick updated positions, everything teleported way past the active field of view. Scaling Using a singular scale factor for both orbit diameters and planetary dimensions created a massive rendering mismatch. A planet with a 6,000 km radius shrinks down to a fraction of a single pixel when drawn on a canvas scaled to capture massive astronomical unit (AU) trajectories, rendering it invisible. Next Flight Steps for Devlog 6 With a stable graphics viewport finally up and running, the graphics engine foundation is secure. The next challenge is implementing the actual trajectory planning functionality. My primary focus items for the next devlog will be: The Trajectory Tracer: Working out how to render a dynamic, rolling polyline tail behind a Spacecraft body as it traces arcs across different coordinates. Camera Tracking Hooks: Hooking into interactor mouse clicks so that double-clicking a planet or vessel pins the camera target matrix to that object, keeping it centered even at high time warp rates. Optimizing Kepler Solvers: Ensuring the underlying analytical Newton-Raphson solvers can handle high eccentricities without dragging down frame rates."}, {"post_id": 27100, "ts": "2026-07-12T11:25:12Z", "hours": 1.9753, "text": "Devlog 5: Kerbal Gravity Program KGRP is a mission planning tool I’m building for KSP players and actual aerospace engineers to map out complex trajectories. It’s loosely based on libraries like Skyfield , Poliastro , and Trajectorize . The ultimate goal is to make it easy to plot out massive interplanetary trips, whether you’re trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. What Happened Today We need to talk about a major turning point for this project. Today was the day I finally broke. I sat down ready to write some beautiful orbital physics code, but instead, I spent hours staring at a screen full of red squiggly lines. I was trapped in a seemingly endless loop of configuring MinGW paths, updating JSON files, wrestling with Conan, and trying to force VS Code to recognize where the Eigen math library was hiding. I realized I was spending 90% of my energy fighting a stubborn C++ compiler and only 10% actually thinking about gravity and orbital transfers. As a solo developer trying to build something massive, that is a recipe for burning out. I was totally fed up. So, I had a choice: keep sinking precious hours into configuration hell, or do something radical to save my velocity. I chose velocity. I opened up my file explorer, went to the project root, and completely ripped out the entire cpp folder. Shift + Delete. Gone. (To any C++ purists reading this: I am deeply sorry, but it had to be done.) By committing to a pure Python architecture, I can keep the code lean, fast, and remarkably lightweight (for an interpreted language): NumPy : We are using the best library for 3D math operations. SciPy : Gives me instant access to rock-solid root-finding algorithms. This means my Lambert solver is going to be incredibly robust and fast. Using this, We can get C++ execution speeds with the absolute bliss of plain Python syntax. Pyrr : A new Library that i am going to learn, this acts as a wrapper for numpy, allowing for easy rendering moderngl_window a pythonic librayry that allows one to easily show and render stuff. Next Steps Now that the compiler weight is off my back, I can actually focus on making this program amazing. The real fun starts now: Setting up a clean Python environment with scipy , pyrr , moderngl and numpy installed. Rendering stuff (Yahoo!). Building the profile structures for the Kerbol system and our real-world solar system. well then here is me installing pyrr and thinking of how to use and learn the library."}, {"post_id": 26427, "ts": "2026-07-11T06:48:03Z", "hours": 4.0178, "text": "Devlog 4: Kerbal Gravity Program (KGRP) KGP—well, actually let’s call it KGRP now because apparently “kgp” is already taken by some Kubernetes stuff, and I don’t want stuff breaking anyone’s cloud infrastructure—is a mission planning tool I’m building for KSP players and actual aerospace engineers to map out complex trajectories. It’s loosely based on libraries like Skyfield , Poliastro , and Trajectorize . The ultimate goal is to make it easy to plot out massive interplanetary trips, whether you’re trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. What I did today Well, today was mostly chill on the numerical part. I got the RKF(4)5 adaptive step solver fully up and running, and the burns produced by the Lambert solver are perfect and insanely accurate. The physics side of things is feeling really solid. But then came the C++ transition, which immediately humbled me. For hours, this was only working in Python because CMake seriously hates me. Seriously, why does a plain text file have so much attitude? Even though I explicitly gave it the include paths in VS Code, the thing still refused to find where Eigen was. I was getting so incredibly frustrated that I was genuinely on the verge of ragequitting, deleting the whole directory, and typing sudo rm -rf out of pure spite. And then I realized what a complete idiot I was being. CMake wasn’t failing to compile the library. It had actually built the thing perfectly. The issue was that I was stubbornly typing ./build/kgrvs like a caveman, completely missing the fact that the compiled binary was sitting right there inside ./build/Release/kgrvs . Once I actually typed the right path, the C++ code ran flawlessly and matched my Python results perfectly down to the decimal point. The engine is officially alive, and I need to go look at a wall for a few minutes to recover from the self-inflicted psychological damage. (BTW here is me almost bricking my computer)"}, {"post_id": 24105, "ts": "2026-07-07T13:47:36Z", "hours": 5.2864, "text": "Devlog 3: Kerbal Gravity Program KGP is a mission planning tool I’m building for KSP players and actual aerospace engineers to map out complex trajectories. It’s loosely based on libraries like Skyfield , Poliastro , and Trajectorize . The ultimate goal is to make it easy to plot out massive interplanetary trips, whether you’re trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. Hey there, i am very, very sorry for the wait, got caught up in school and illness, so ima try and be more punctual, maybe a devlog every week? well, we will see if my timetable is free or “unstable” What I did today Finally make a Lambert solver, the math was insanely hard and i am still getting insanely wrong numbers. (like a burn of 11,000 m/s to go to Duna in perfect conditions). for the Lambert solver, i had to create a new class, the Spacecraft class, this is the actual spacecraft that is going to go on the arduous journey to another planet or moon (basically a moving body class). I am in the process of making the Orbit class, the LambertSolver class and the solve_anomaly() function resistant to non elliptic orbits. well then here is Ruff and Vs code screaming at me because of a single equal sign"}, {"post_id": 19970, "ts": "2026-07-01T13:17:10Z", "hours": 3.5031, "text": "Devlog 2: Kerbal Gravity Program (KGP) KGP is a mission planning tool I’m building for KSP players and actual aerospace engineers to map out complex trajectories. It’s loosely based on libraries like Skyfield , Poliastro , and trajectorize . The ultimate goal is to make it easy to plot out massive interplanetary trips, whether you’re trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. What I did today Today was way more math-heavy than I expected. I spent most of my time building out the core infrastructure: The Orbit class to actually handle orbital mechanics. The Body class for celestial bodies and barycenters. The absolute_position function to figure out the exact coordinates of an object in a nested system, tracking it all the way back to the root central body as the origin. What I learned Planet tracking is wild: The sheer amount of math required to find the exact position of a planet at a specific timestamp is honestly mind-boggling. It took a lot of staring at equations, but once I finally understood the logic, implementing it became a lot smoother. The heavy lifters are terrifying: The core system is going to rely on a Lambert solver and an RK4 integrator. I’ll be honest—these algorithms are so intensely complex that it looks like scribbles on paper. Anyway, here is a small test run of the Python prototype in action:"}, {"post_id": 17430, "ts": "2026-06-28T06:29:34Z", "hours": 1.7036, "text": "Devlog 1: Kerbal Gravity Program (KGP) KGP is a mission planning tool I am building for KSP players and actual aerospace engineers to map out complex trajectories. Loosely based on Skyfield , Poliastro and trajectorize , The goal is to make it easy to plot out massive interplanetary trips, whether you are trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. What I Did Today Mapped out the 4-phase development roadmap Decided to use a mix of C++ for raw execution speed and Python for fast development. Phase 1 (Basic Systems): Building out the underlying math frameworks and foundations. Phase 2 (CLI Interface): Creating simple command-line helper functions. Phase 3 (GUI Interface): Designing a desktop app version with a clean installation setup. Phase 4 (Web Interface): Deploying a browser version so anyone can use it without downloading a thing. (Note: Organized it this way to work around the Stardance demo link limits while keeping the scope clear). Coded the Universal Time Converter Wrote the core function that converts calendar dates directly into raw seconds. Made sure it seamlessly handles both Kerbal time standards and real-world J2000 epoch timelines. What I Learnt Numba memory management: I found out that numba (the Python library I’m using to get close to C++ speeds) really struggles when handling pointers and raw memory addresses. Python can actually segfault: It actually threw a segmentation fault—which felt crazy to see inside Python code! Because of this, using nb.defered_type() is completely out of the picture for this architecture, so I’ll have to use something like scipy and numpy . well for your entertainment, here is a screenshot of me trying to figure out why the hell was VS code giving me a problem (i forgot a semicolon on the line before):"}]...
|
Title: Kerbal Gravity Program by @Systemic_speed | Title: Kerbal Gravity Program by @Systemic_speed | Stardance
Devlogs:
Devlog 1: Kerbal Gravity Program (KGP) KGP is a mission planning tool I am building for KSP players and actual aerospace engineers to map out complex trajectories. Loosely based on Skyfield , Poliastro and trajectorize , The goal is to make it easy to plot out massive interplanetary trips, whether you are trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. What I Did Today Mapped out the 4-phase development roadmap Decided to use a mix of C++ for raw execution speed and Python for fast development. Phase 1 (Basic Systems): Building out the underlying math frameworks and foundations. Phase 2 (CLI Interface): Creating simple command-line helper functions. Phase 3 (GUI Interface): Designing a desktop app version with a clean installation setup. Phase 4 (Web Interface): Deploying a browser version so anyone can use it without downloading a thing. (Note: Organized it this way to work around the Stardance demo link limits while keeping the scope clear). Coded the Universal Time Converter Wrote the core function that converts calendar dates directly into raw seconds. Made sure it seamlessly handles both Kerbal time standards and real-world J2000 epoch timelines. What I Learnt Numba memory management: I found out that numba (the Python library I’m using to get close to C++ speeds) really struggles when handling pointers and raw memory addresses. Python can actually segfault: It actually threw a segmentation fault—which felt crazy to see inside Python code! Because of this, using nb.defered_type() is completely out of the picture for this architecture, so I’ll have to use something like scipy and numpy . well for your entertainment, here is a screenshot of me trying to figure out why the hell was VS code giving me a problem (i forgot a semicolon on the line before):
Devlog 2: Kerbal Gravity Program (KGP) KGP is a mission planning tool I’m building for KSP players and actual aerospace engineers to map out complex trajectories. It’s loosely based on libraries like Skyfield , Poliastro , and trajectorize . The ultimate goal is to make it easy to plot out massive interplanetary trips, whether you’re trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. What I did today Today was way more math-heavy than I expected. I spent most of my time building out the core infrastructure: The Orbit class to actually handle orbital mechanics. The Body class for celestial bodies and barycenters. The absolute_position function to figure out the exact coordinates of an object in a nested system, tracking it all the way back to the root central body as the origin. What I learned Planet tracking is wild: The sheer amount of math required to find the exact position of a planet at a specific timestamp is honestly mind-boggling. It took a lot of staring at equations, but once I finally understood the logic, implementing it became a lot smoother. The heavy lifters are terrifying: The core system is going to rely on a Lambert solver and an RK4 integrator. I’ll be honest—these algorithms are so intensely complex that it looks like scribbles on paper. Anyway, here is a small test run of the Python prototype in action:
Devlog 3: Kerbal Gravity Program KGP is a mission planning tool I’m building for KSP players and actual aerospace engineers to map out complex trajectories. It’s loosely based on libraries like Skyfield , Poliastro , and Trajectorize . The ultimate goal is to make it easy to plot out massive interplanetary trips, whether you’re trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. Hey there, i am very, very sorry for the wait, got caught up in school and illness, so ima try and be more punctual, maybe a devlog every week? well, we will see if my timetable is free or “unstable” What I did today Finally make a Lambert solver, the math was insanely hard and i am still getting insanely wrong numbers. (like a burn of 11,000 m/s to go to Duna in perfect conditions). for the Lambert solver, i had to create a new class, the Spacecraft class, this is the actual spacecraft that is going to go on the arduous journey to another planet or moon (basically a moving body class). I am in the process of making the Orbit class, the LambertSolver class and the solve_anomaly() function resistant to non elliptic orbits. well then here is Ruff and Vs code screaming at me because of a single equal sign
Devlog 4: Kerbal Gravity Program (KGRP) KGP—well, actually let’s call it KGRP now because apparently “kgp” is already taken by some Kubernetes stuff, and I don’t want stuff breaking anyone’s cloud infrastructure—is a mission planning tool I’m building for KSP players and actual aerospace engineers to map out complex trajectories. It’s loosely based on libraries like Skyfield , Poliastro , and Trajectorize . The ultimate goal is to make it easy to plot out massive interplanetary trips, whether you’re trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. What I did today Well, today was mostly chill on the numerical part. I got the RKF(4)5 adaptive step solver fully up and running, and the burns produced by the Lambert solver are perfect and insanely accurate. The physics side of things is feeling really solid. But then came the C++ transition, which immediately humbled me. For hours, this was only working in Python because CMake seriously hates me. Seriously, why does a plain text file have so much attitude? Even though I explicitly gave it the include paths in VS Code, the thing still refused to find where Eigen was. I was getting so incredibly frustrated that I was genuinely on the verge of ragequitting, deleting the whole directory, and typing sudo rm -rf out of pure spite. And then I realized what a complete idiot I was being. CMake wasn’t failing to compile the library. It had actually built the thing perfectly. The issue was that I was stubbornly typing ./build/kgrvs like a caveman, completely missing the fact that the compiled binary was sitting right there inside ./build/Release/kgrvs . Once I actually typed the right path, the C++ code ran flawlessly and matched my Python results perfectly down to the decimal point. The engine is officially alive, and I need to go look at a wall for a few minutes to recover from the self-inflicted psychological damage. (BTW here is me almost bricking my computer)
Devlog 5: Kerbal Gravity Program KGRP is a mission planning tool I’m building for KSP players and actual aerospace engineers to map out complex trajectories. It’s loosely based on libraries like Skyfield , Poliastro , and Trajectorize . The ultimate goal is to make it easy to plot out massive interplanetary trips, whether you’re trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. What Happened Today We need to talk about a major turning point for this project. Today was the day I finally broke. I sat down ready to write some beautiful orbital physics code, but instead, I spent hours staring at a screen full of red squiggly lines. I was trapped in a seemingly endless loop of configuring MinGW paths, updating JSON files, wrestling with Conan, and trying to force VS Code to recognize where the Eigen math library was hiding. I realized I was spending 90% of my energy fighting a stubborn C++ compiler and only 10% actually thinking about gravity and orbital transfers. As a solo developer trying to build something massive, that is a recipe for burning out. I was totally fed up. So, I had a choice: keep sinking precious hours into configuration hell, or do something radical to save my velocity. I chose velocity. I opened up my file explorer, went to the project root, and completely ripped out the entire cpp folder. Shift + Delete. Gone. (To any C++ purists reading this: I am deeply sorry, but it had to be done.) By committing to a pure Python architecture, I can keep the code lean, fast, and remarkably lightweight (for an interpreted language): NumPy : We are using the best library for 3D math operations. SciPy : Gives me instant access to rock-solid root-finding algorithms. This means my Lambert solver is going to be incredibly robust and fast. Using this, We can get C++ execution speeds with the absolute bliss of plain Python syntax. Pyrr : A new Library that i am going to learn, this acts as a wrapper for numpy, allowing for easy rendering moderngl_window a pythonic librayry that allows one to easily show and render stuff. Next Steps Now that the compiler weight is off my back, I can actually focus on making this program amazing. The real fun starts now: Setting up a clean Python environment with scipy , pyrr , moderngl and numpy installed. Rendering stuff (Yahoo!). Building the profile structures for the Kerbol system and our real-world solar system. well then here is me installing pyrr and thinking of how to use and learn the library.
Devlog 6: Kerbal Gravity Program (KGRP) KGRP is a mission planning tool I’m building for KSP players and actual aerospace engineers to map out complex trajectories. It’s loosely based on libraries like Skyfield , Poliastro , and Trajectorize . The ultimate goal is to make it easy to plot out massive interplanetary trips, whether you’re trying to reach Jool and Sarnus (with the Outer Planets Mod) or calculating a real-world journey out to Neptune. What happened today Today was a very, very buggy day. I had to tackle the core rendering systems, but I ended up running a grueling gauntlet through almost every Python graphics library out there—Panda3D, Ursina, ModernGL, VPython, and more. Every single one of them introduced some kind of blocking issue: Windows that were supposed to pop up via Tkinter or Pygame-CE started doing random things like teleporting wildly across my screen or rendering with completely broken layout dimensions. Even when a window finally initialized and stayed stable, it would just mock me with a dead black screen entirely missing our blobs of color (the actual planets and calculated orbit lines). This black-screen loop is exactly what hit me when I switched over to PyVista. Why the Viewport went Black Staring into a blank 3D canvas is a rite of passage when writing an engine from scratch. After tracking down the pipeline bugs, the black screen in PyVista boiled down to three classic astrodynamics simulation mistakes: The Compound Drift Bug ( mesh.translate ) Using mesh.translate(inplace=True) directly mutates the underlying vertex memory of the sphere meshes. Because my physics engine loop advances frames based on absolute coordinates ( get_absolute_pos_at_ut ), relative delta transforms compounded exponentially. Within frame one, the planets physically flew millions of kilometers away from the camera. The Camera Initialization Trap Setting camera_position = 'iso' while the newly instantiated planet objects were still sitting uninitialized at (0, 0, 0) forced the viewport to lock its focus onto a microscopic bounding box. The moment the first timer tick updated positions, everything teleported way past the active field of view. Scaling Using a singular scale factor for both orbit diameters and planetary dimensions created a massive rendering mismatch. A planet with a 6,000 km radius shrinks down to a fraction of a single pixel when drawn on a canvas scaled to capture massive astronomical unit (AU) trajectories, rendering it invisible. Next Flight Steps for Devlog 6 With a stable graphics viewport finally up and running, the graphics engine foundation is secure. The next challenge is implementing the actual trajectory planning functionality. My primary focus items for the next devlog will be: The Trajectory Tracer: Working out how to render a dynamic, rolling polyline tail behind a Spacecraft body as it traces arcs across different coordinates. Camera Tracking Hooks: Hooking into interactor mouse clicks so that double-clicking a planet or vessel pins the camera target matrix to that object, keeping it centered even at high time warp rates. Optimizing Kepler Solvers: Ensuring the underlying analytical Newton-Raphson solvers can handle high eccentricities without dragging down frame rates.
Devlog 7: Kerbal Gravity Program (KGRP) For anyone who’s new here, KGRP is a mission planning tool I’m building for KSP (and hopefully real-world missions too). The goal is to make planning orbital transfers and interplanetary missions a lot easier. Think of it as something inspired by libraries like Skyfield and Poliastro , but with a bigger focus on actually planning missions. What happened today? Today was surprisingly productive and useful. The biggest thing is that the renderer finally works. I spent way too long fighting with it over the past few days, so it’s nice to finally be able to move planets around without everything exploding. I also added a few other things: You can now create entire planetary systems from a planet.json file. Added adapters for PySide6 and NiceGUI , so there are a couple of different ways to use the renderer now. Started working on a more realistic gravity simulator that can deal with things like Lagrange points. KGRP finally has an actual logo (\(^▽^)/) instead of me pretending the text was good enough for docs and stuff. One thing I still need to fix is the JSON loader. Right now it only really likes absolute paths, which is… less than ideal. The renderer tried to gaslight me I swear I’m not making this up. Earlier today I found this absolutely cursed bug where, if you flew the camera into the Sun and zoomed out, the whole scene turned into this weird fisheye effect with random lines stretching across the screen. I was already mentally preparing myself to spend the next few hours digging through camera code and VTK documentation… …and then it just stopped happening. I didn’t fix it. I didn’t even change anything related to the camera. It just… disappeared. So either I accidentally fixed it without realizing, or it’s waiting until I show someone the project before it decides to come back. What’s next? Nothing too exciting, mostly polishing things up. Fix the JSON loader. Squash whatever bugs are still hiding in the renderer. Improve the CLI a bit more. Anyway, here’s the renderer doing the thing (oh, gotta fix that) and the logo (idk if it’s good, comment about it).
Devlog 8: Kerbal Gravity Program For anyone who’s new here, KGRP is a mission planning tool I’m building for KSP (and hopefully real-world missions too). The goal is to make planning orbital transfers and interplanetary missions a lot easier. Think of it as something inspired by libraries like Skyfield and Poliastro , but with a bigger focus on actually planning missions Today and the days after i gave my last devlog were actually useful, i mainly just created a new class based system (yes i am forced to, because my idea needs tooo many moving parts) called the Ticket : The Ticket allows you to plan entire journeys using TicketEvents , stuff that define what can happen to a spacecraft (14 of them). for example, you can have a ticket that contains a maeuver, a coast, an rcs translation, a docking and more. and one more thing, instead of a CLI (one command and forget), i am instead making a REPL (it remembers what you did). so yeah, that sums most of it up and also i made a new banner for KGRP (kinda yay???) What’s next so the main thing is to just start making the REPL using prompt-toolkit and other stuff. until then, see ya
Devlog 9 — Kerbal Gravity Program: the REPL is (almost) done No devlog last week — life happened, then OpenCode helped me absolutely cook. Newcomers: KGRP is a mission planner for KSP (runs outside the game). You define a spacecraft, stack events on a timeline, and the sim runs them. Plan in the tool, fly in the game. Where we are The REPL is nearly feature-complete. Every mission action is a TicketEvent — coast, maneuver, burn, engine toggle, science. The REPL never touches your ship directly; it just advances a ticket in UT and events fire when the timeline reaches them. One plan drives the renderer, physics, and save file. Also closed the loop on “one source of truth”: the fancy integrator used to run in a vacuum (zero gravity) when fired from a ticket. Now go , advance , and reset all agree on where you are. go Pick a start and end orbit from the presets and it works out burns, coasting, and delta-v, then schedules them: > go current moon:3a Transfer plan: Current (200,000m circular, 0.0 deg) -> Mun orbit (11,400,000m circular, 0.0 deg) (about Kerbin) Burns: 2 Total delta-v: 1,112.7 m/s Duration: 27,130.1s burn @ 0.0s dv=764.2 m/s Raise apoapsis to transfer coast 0.0s -> 27,130.1s Coast to apoapsis burn @ 27,130.1s dv=348.5 m/s Circularize / match target Resulting orbit: pe=12,000,000m ap=12,000,000m i=0.0 deg around Kerbin Presets are editable (and saveable to presets.json ); the planner core is a plain importable function ( go_plan(ticket, ...).total_dv ). Usability Time input isn’t a math exam: advance 2d 5h , time "Year 2, Day 100" . Per-use overrides without touching presets: go current preset:molniya incl=30 . go shows the plan and asks before committing (gradual / instant / cancel). edit now handles ships, not just bodies: mass, fuel, orbit elements. New-ticket wizard hands you an engine and 3,000 kg of fuel instead of a paperweight. After a reset you can clear/redo the timeline without fighting the guard. What’s next Some math is still coarse: plane changes are exact only for moon targets, synchronous orbits are a placeholder (no body rotation yet), arg-p/LAN drift isn’t modeled, and error messages need work — for when you type advance 5 bananas . Fun one I found: escaping at exactly escape velocity puts the orbit at eccentricity 1.000000 and the math gives up — the craft freezes and frame switches / go turn to nonsense. Interplanetary go is broken because of it, but burning slightly past escape fixes it (properly hyperbolic, maths happy). Just needs wiring in. In the meantime Planning to put it up on PyPi and hope it works
Ships:
Kerbal Gravity Program: SHIP - 1 Any KSP player knows the pain of planning a whole journey, then the Kraken wipes it and sends you back to the pad. Real missions are the same grind (see Cassini-Huygens: Cassini’s trajectory ). So I built KGRP — a mission planner for KSP you drive from a REPL or code, to plan and understand trips to other planets. Crash course pip install kgrp # Python 3.10+ kgrp # start the REPL help # every command, flag, and use Requirements Built on numpy (math), scipy (integration/solving), and pyvista (orbit and trajectory visualization), with rich and prompt-toolkit powering the REPL. What was challenging The math was the hard part — RKF(4)5 (Runge-Kutta-Fehlberg 4(5)), an adaptive-step integrator, was an absolute pain to get right. Shipping a real library was the other half; I’d made sites and small CLIs, but wasn’t sure this would hold together. What I’m proud of First thing I’ve ever put on PyPI. Along the way I got real with numpy, scipy, pyvista, and building a CLI/REPL people can actually use. A note on AI I used AI to help squash bugs and for the basic beautification of the README. The planning math and the tool itself are mine; the AI just helped me clean up and unstick the rough parts. Try it It’s out — test it, throw it at the wall, and send notes via feedback. P.S. There are a few easter eggs hiding in the errors. Go find them. Happy orbiting!!!...
|
1793544632.4235637
|
1793631032.4235637
|
|
49970
|
M.I.L.O by @Omar4lifex | Stardance
|
Omar4lifex
|
1
|
42.53
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-22T16:52:23Z", "hours": 24.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "M.I.L.O v1.0.0 is officially ready. M.I.L.O is a local AI file organizer that lets you talk to your computer in normal language and find information inside your own files. What’s included Natural-language file search - ask MILO to find files and folders using normal chat. Local AI - powered by Ollama and Qwen3:8b, which runs on the user’s own PC. PDF reading - MILO can search normal text-based PDFs. OCR - MILO can read scanned/image-based PDFs using Tesseract OCR. Conversation memory - MILO remembers what happened earlier in the same chat, so follow-ups like “what file did you find?” work. Chat history - create new chats and return to previous conversations. Faster search - filename-first searching, ignored junk folders, and OCR caching make large-folder searches much faster. Automatic setup - Start MILO.bat checks for Python, Ollama, Tesseract, dependencies, and the Qwen3 model. Privacy M.I.L.O is designed around local processing. Your files stay on your computer, and the AI runs locally through Ollama instead of sending your files to a remote AI server. Getting started Download MILO-v1.0.0.zip Extract it Run Start MILO.bat Let the setup finish Choose the folder you want MILO to access Start chatting What’s next v1.1 will focus on file actions , starting with things like renaming and organizing files.", "repo": "https://github.com/Omar4life/M.I.L.O", "demo": "https://github.com/Omar4life/M.I.L.O/releases/tag/v1.0.0"}]...
|
[{"post_id": 58329, "ts": "202 [{"post_id": 58329, "ts": "2026-08-30T18:25:46Z", "hours": 9.5231, "text": "Devlog #9 - MILO can create folders Today I added Create Folder to M.I.L.O so now I can say: Create a folder called MILO FOLDER TEST and then MILO understands it, checks the location, then asks for confirmation before creating it. I added the new CREATE_FOLDER action to the AI and backend, plus Create / Cancel buttons in the frontend.{ “action”: “CREATE_FOLDER”, “new_name”: “School” } I also added safety checks so it won’t create a folder if the name is invalid or something with that name already exists."}, {"post_id": 55167, "ts": "2026-08-26T17:18:45Z", "hours": 9.0058, "text": "Devlog #8 - Rename stuff I spent around 9 hours working on one of the biggest upgrades to M.I.L.O so far: file actions. Until now, M.I.L.O could find files and understand their contents, but it couldn’t actually do anything with them. I decided to start with Rename. Now I can tell milo rename my spiderman ticket (pixedH1723.pdf) to spiderman ticket and it asks for confirmation and then renames it. It remembers which file “it” refers to, asks for confirmation, and then renames it. A LOT of bugs happened 😭The first problem was that M.I.L.O found the correct Spider-Man ticket but also returned completely unrelated files. For example, it found:README.md pixedH1723.pdf The README contained the words “Spider-Man” and “ticket” because those words were used in an example inside the README. After filtering README files, M.I.L.O still found random files like: cd.txt vintage-ticket-stub.md because they contained generic words like “ticket”.I fixed this by improving the search scoring system so M.I.L.O considers the combination of important terms instead of matching one generic word. For a query like: Spider-Man + movie + ticket M.I.L.O now gives much more importance to files that actually contain those concepts together. I also added path filtering so M.I.L.O ignores internal development folders such as: node_modules .git __pycache__ .local .agents .next Rename itself had a bug too, the first Rename attempt crashed with: name ‘os’ is not defined because the rename code was using Python’s os module without importing it. That was fixed, and I also added protection so M.I.L.O doesn’t rename anything without confirmation, won’t overwrite an existing file, keeps the original file extension, automatically handles files that no longer exist, and remembers the last file found through conversation memory."}, {"post_id": 52475, "ts": "2026-08-22T16:37:30Z", "hours": 1.8806, "text": "Devlog #7 - Making MILO Much Faster I spent almost 2 hours improving MILO’s search performance. I found a pretty bad bug where searching a large folder like Downloads could take 7+ minutes because MILO was trying to process too many PDFs, including scanned PDFs that required OCR. I changed the search system so MILO now does a much faster process: ↓ Check normal PDF text ↓ Only OCR likely scanned PDFs ↓ Cache the OCR result ↓ Return the result I also added an OCR limit so MILO doesn’t try to OCR hundreds of unrelated PDFs: MAX_OCR_CANDIDATES = 30 Another important improvement was OCR caching. Once MILO reads a scanned PDF, it saves the extracted text so it doesn’t have to OCR the same file again unless the file changes. I also added more ignored folders like: .git __pycache__ .venv .next dist build .cache This helped remove a lot of irrelevant files from searches. After the changes, the Spider-Man ticket search that was taking several minutes became much faster while the scanned EduWW Verification of Enrollment PDF still works with OCR."}, {"post_id": 52296, "ts": "2026-08-22T12:36:14Z", "hours": 2.3839, "text": "Devlog #6 - Giving MILO Memory Today I spent 2h 5m adding memory per-chat (since before that, even if it was the same chat, it could not remember the previous message I sent) + improved MILO’s conversation system. I added per-chat memory so MILO can actually remember what happened earlier in the same conversation instead of treating every message like a completely new request. For example: Me: Find my Spider-Man ticket MILO: I found pixedH1723.pdf Me: What did I just ask you to find? MILO: You asked me to find your Spider-Man ticket. Me: Which type of file is it? MILO: The Spider-Man Ticket is a PDF file I added a backend chat_memory system that keeps information like the last command, action, query, found file, results, and file content for each individual chat. def get_chat_memory(chat_id): if chat_id not in chat_memory: chat_memory[chat_id] = { \"last_command\": \"\", \"last_action\": \"\", \"last_file\": None, \"last_results\": [] } return chat_memory[chat_id] I also added a new CHAT action to MILO’s AI so it can answer normal conversational questions like “what did I just ask you?” instead of forcing everything into SEARCH or QUESTION. Another improvement was passing the recent conversation history into Qwen3 so it has more context when interpreting follow-up messages such as “it”, “that file”, or “what did you find?”. One of the reasons I added memory is because it’s the foundation for the next major feature which is file actions like Rename, where I can say: Find my Spider-Man ticket And then say: Rename it to Spider-Man Ticket instead of having to say the original filename like: Can you rename “pixedH1723” to “Spider-Man”."}, {"post_id": 51951, "ts": "2026-08-21T22:16:30Z", "hours": 9.7489, "text": "#Devlog #5 - Making MILO Actually Usable (BIIIG Devlog Update) TL;DR: M.I.L.O works for other pcs that have windows + added OCR so it can read scanned/image-based pdfs (demo below, the verification of enrollment was a scanned pdf and it found it!) I spent 9h 44m working on MILO without a devlog lol. I made a lot of progress toward making MILO usable by other people, not just on my PC (Only windows for now tho). I added a setup ( .bat file) system so MILO can automatically check for and install things like Python, Ollama, the AI model (qwen3:8b), and its required packages (if you don’t alr have them) on another Windows PC. I also added OCR (Optical Character Recognition) support so MILO can read scanned/image-based PDFs instead of only normal text PDFs (planning to add OCR for images like png, jpg, etc…). I tested it on a scanned Verification of Enrollment document for my school and MILO was able to find it and read the contents. I also improved the file search so it skips folders like node_modules , .git , __pycache__ , and other junk folders that were causing completely unrelated search results. There were a LOT of bugs during this update, like a LOT 😭, there was Python detection, pip SSL errors, Ollama model installation, broken PDFs, OCR not finding Tesseract, Windows Documents being redirected to OneDrive, search ranking issues, and more. After fixing all of that, MILO can now run on another Windows PC (will make sure to test it again tommorow before shipping js incase), use that computer’s own files, search documents, read normal PDFs, and OCR scanned PDFs. Demo is below! (the verification of enrollment was a scanned pdf and M.I.L.O found it using OCR) Time to go to sleep now! (12:42 AM rn)"}, {"post_id": 50458, "ts": "2026-08-19T16:53:56Z", "hours": 2.5606, "text": "Devlog 4 - HUGE update! Made another big update to M.I.L.O today. you can now ask M.I.L.O questions about the files it finds, instead of just finding them. For example, I can ask: “How much did I pay for my Spider-Man ticket?” “What seats did I get?” “What time does it start?” “What’s the reservation number?” and M.I.L.O reads the actual PDF and gives me the answer. I also fixed a bug where MILO needed the exact words from the file to find the right information. But now it can understand related words and questions."}, {"post_id": 50176, "ts": "2026-08-19T09:12:09Z", "hours": 2.8514, "text": "Spent pretty much the whole previous day fixing a bug with MILO’s file search 😭 I got it to the point where MILO can actually read the contents of files like PDFs and text files, instead of only looking at their names. For example, I can say: “Find my Spider-Man Brand New Day VOSTFR 4DX Ticket” and MILO can actually read the PDF and find the right one even if the Ticket PDF is called “pixedH1723”. It took way longer than I expected to get the search working properly, but it finally works! Still a lot more to build, but this is a pretty big step for MILO."}, {"post_id": 49131, "ts": "2026-08-17T19:23:15Z", "hours": 1.4847, "text": "Devlog #2 - M.I.L.O Made some good progress on MILO the past hour and a half. I connected the AI to the file search system, so MILO can now understand normal sentences instead of needing exact file names. For example, I can say: “Find the folder which shows AI tools hype vs output and MILO can understand what I’m looking for and find the correct folder. It has a little bug tho, it can find multiple files with a specific keyword so for example it found another folder called “AI tools for each type of person” only because it has “AI” in it, so gonna work on that a bit later Still a lot to build, but it’s starting to feel like an actual assistant now."}, {"post_id": 48963, "ts": "2026-08-17T15:21:53Z", "hours": 3.3864, "text": "Started building M.I.L.O (My Intelligent Local Organizer) today. I ran into quite a few bugs while setting everything up, but I got the first part working. M.I.L.O can now scan a folder I choose and display the files and folders inside it along with the number of files/folders. The AI commands aren’t connected yet, so for now it just receives the command. Next, I’m working on making MILO actually understand the command and search through the files."}]...
|
Title: M.I.L.O by @Omar4lifex | Stardance
Devlogs Title: M.I.L.O by @Omar4lifex | Stardance
Devlogs:
Started building M.I.L.O (My Intelligent Local Organizer) today. I ran into quite a few bugs while setting everything up, but I got the first part working. M.I.L.O can now scan a folder I choose and display the files and folders inside it along with the number of files/folders. The AI commands aren’t connected yet, so for now it just receives the command. Next, I’m working on making MILO actually understand the command and search through the files.
Devlog #2 - M.I.L.O Made some good progress on MILO the past hour and a half. I connected the AI to the file search system, so MILO can now understand normal sentences instead of needing exact file names. For example, I can say: “Find the folder which shows AI tools hype vs output and MILO can understand what I’m looking for and find the correct folder. It has a little bug tho, it can find multiple files with a specific keyword so for example it found another folder called “AI tools for each type of person” only because it has “AI” in it, so gonna work on that a bit later Still a lot to build, but it’s starting to feel like an actual assistant now.
Spent pretty much the whole previous day fixing a bug with MILO’s file search 😭 I got it to the point where MILO can actually read the contents of files like PDFs and text files, instead of only looking at their names. For example, I can say: “Find my Spider-Man Brand New Day VOSTFR 4DX Ticket” and MILO can actually read the PDF and find the right one even if the Ticket PDF is called “pixedH1723”. It took way longer than I expected to get the search working properly, but it finally works! Still a lot more to build, but this is a pretty big step for MILO.
Devlog 4 - HUGE update! Made another big update to M.I.L.O today. you can now ask M.I.L.O questions about the files it finds, instead of just finding them. For example, I can ask: “How much did I pay for my Spider-Man ticket?” “What seats did I get?” “What time does it start?” “What’s the reservation number?” and M.I.L.O reads the actual PDF and gives me the answer. I also fixed a bug where MILO needed the exact words from the file to find the right information. But now it can understand related words and questions.
#Devlog #5 - Making MILO Actually Usable (BIIIG Devlog Update) TL;DR: M.I.L.O works for other pcs that have windows + added OCR so it can read scanned/image-based pdfs (demo below, the verification of enrollment was a scanned pdf and it found it!) I spent 9h 44m working on MILO without a devlog lol. I made a lot of progress toward making MILO usable by other people, not just on my PC (Only windows for now tho). I added a setup ( .bat file) system so MILO can automatically check for and install things like Python, Ollama, the AI model (qwen3:8b), and its required packages (if you don’t alr have them) on another Windows PC. I also added OCR (Optical Character Recognition) support so MILO can read scanned/image-based PDFs instead of only normal text PDFs (planning to add OCR for images like png, jpg, etc…). I tested it on a scanned Verification of Enrollment document for my school and MILO was able to find it and read the contents. I also improved the file search so it skips folders like node_modules , .git , __pycache__ , and other junk folders that were causing completely unrelated search results. There were a LOT of bugs during this update, like a LOT 😭, there was Python detection, pip SSL errors, Ollama model installation, broken PDFs, OCR not finding Tesseract, Windows Documents being redirected to OneDrive, search ranking issues, and more. After fixing all of that, MILO can now run on another Windows PC (will make sure to test it again tommorow before shipping js incase), use that computer’s own files, search documents, read normal PDFs, and OCR scanned PDFs. Demo is below! (the verification of enrollment was a scanned pdf and M.I.L.O found it using OCR) Time to go to sleep now! (12:42 AM rn)
Devlog #6 - Giving MILO Memory Today I spent 2h 5m adding memory per-chat (since before that, even if it was the same chat, it could not remember the previous message I sent) + improved MILO’s conversation system. I added per-chat memory so MILO can actually remember what happened earlier in the same conversation instead of treating every message like a completely new request. For example: Me: Find my Spider-Man ticket MILO: I found pixedH1723.pdf Me: What did I just ask you to find? MILO: You asked me to find your Spider-Man ticket. Me: Which type of file is it? MILO: The Spider-Man Ticket is a PDF file I added a backend chat_memory system that keeps information like the last command, action, query, found file, results, and file content for each individual chat. def get_chat_memory(chat_id): if chat_id not in chat_memory: chat_memory[chat_id] = { "last_command": "", "last_action": "", "last_file": None, "last_results": [] } return chat_memory[chat_id] I also added a new CHAT action to MILO’s AI so it can answer normal conversational questions like “what did I just ask you?” instead of forcing everything into SEARCH or QUESTION. Another improvement was passing the recent conversation history into Qwen3 so it has more context when interpreting follow-up messages such as “it”, “that file”, or “what did you find?”. One of the reasons I added memory is because it’s the foundation for the next major feature which is file actions like Rename, where I can say: Find my Spider-Man ticket And then say: Rename it to Spider-Man Ticket instead of having to say the original filename like: Can you rename “pixedH1723” to “Spider-Man”.
Devlog #7 - Making MILO Much Faster I spent almost 2 hours improving MILO’s search performance. I found a pretty bad bug where searching a large folder like Downloads could take 7+ minutes because MILO was trying to process too many PDFs, including scanned PDFs that required OCR. I changed the search system so MILO now does a much faster process: ↓ Check normal PDF text ↓ Only OCR likely scanned PDFs ↓ Cache the OCR result ↓ Return the result I also added an OCR limit so MILO doesn’t try to OCR hundreds of unrelated PDFs: MAX_OCR_CANDIDATES = 30 Another important improvement was OCR caching. Once MILO reads a scanned PDF, it saves the extracted text so it doesn’t have to OCR the same file again unless the file changes. I also added more ignored folders like: .git __pycache__ .venv .next dist build .cache This helped remove a lot of irrelevant files from searches. After the changes, the Spider-Man ticket search that was taking several minutes became much faster while the scanned EduWW Verification of Enrollment PDF still works with OCR.
Devlog #8 - Rename stuff I spent around 9 hours working on one of the biggest upgrades to M.I.L.O so far: file actions. Until now, M.I.L.O could find files and understand their contents, but it couldn’t actually do anything with them. I decided to start with Rename. Now I can tell milo rename my spiderman ticket (pixedH1723.pdf) to spiderman ticket and it asks for confirmation and then renames it. It remembers which file “it” refers to, asks for confirmation, and then renames it. A LOT of bugs happened 😭The first problem was that M.I.L.O found the correct Spider-Man ticket but also returned completely unrelated files. For example, it found:README.md pixedH1723.pdf The README contained the words “Spider-Man” and “ticket” because those words were used in an example inside the README. After filtering README files, M.I.L.O still found random files like: cd.txt vintage-ticket-stub.md because they contained generic words like “ticket”.I fixed this by improving the search scoring system so M.I.L.O considers the combination of important terms instead of matching one generic word. For a query like: Spider-Man + movie + ticket M.I.L.O now gives much more importance to files that actually contain those concepts together. I also added path filtering so M.I.L.O ignores internal development folders such as: node_modules .git __pycache__ .local .agents .next Rename itself had a bug too, the first Rename attempt crashed with: name ‘os’ is not defined because the rename code was using Python’s os module without importing it. That was fixed, and I also added protection so M.I.L.O doesn’t rename anything without confirmation, won’t overwrite an existing file, keeps the original file extension, automatically handles files that no longer exist, and remembers the last file found through conversation memory.
Devlog #9 - MILO can create folders Today I added Create Folder to M.I.L.O so now I can say: Create a folder called MILO FOLDER TEST and then MILO understands it, checks the location, then asks for confirmation before creating it. I added the new CREATE_FOLDER action to the AI and backend, plus Create / Cancel buttons in the frontend.{ “action”: “CREATE_FOLDER”, “new_name”: “School” } I also added safety checks so it won’t create a folder if the name is invalid or something with that name already exists.
Ships:
M.I.L.O v1.0.0 is officially ready. M.I.L.O is a local AI file organizer that lets you talk to your computer in normal language and find information inside your own files. What’s included Natural-language file search - ask MILO to find files and folders using normal chat. Local AI - powered by Ollama and Qwen3:8b, which runs on the user’s own PC. PDF reading - MILO can search normal text-based PDFs. OCR - MILO can read scanned/image-based PDFs using Tesseract OCR. Conversation memory - MILO remembers what happened earlier in the same chat, so follow-ups like “what file did you find?” work. Chat history - create new chats and return to previous conversations. Faster search - filename-first searching, ignored junk folders, and OCR caching make large-folder searches much faster. Automatic setup - Start MILO.bat checks for Python, Ollama, Tesseract, dependencies, and the Qwen3 model. Privacy M.I.L.O is designed around local processing. Your files stay on your computer, and the AI runs locally through Ollama instead of sending your files to a remote AI server. Getting started Download MILO-v1.0.0.zip Extract it Run Start MILO.bat Let the setup finish Choose the folder you want MILO to access Start chatting What’s next v1.1 will focus on file actions , starting with things like renaming and organizing files....
|
1792878437.104797
|
1793742437.104797
|