|
26918
|
Fossim by @nekename | Stardance
|
nekename
|
1
|
52.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-23T18:13:47Z", "hours": 52.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello! Fossim and Stardance were really fun for me as I finally got around to building something new, instead of spending a lot of time maintaining old projects for their users. If you read through the devlogs or code, you’ll see that building a whole new interface on GitHub’s APIs isn’t easy, because they don’t expose a fraction of the features they use on their own site. For example, instead of being able to receive events (e.g. someone else sent a message) in the client directly, I had to architect an entire multiplexed event forwarding/broadcast mechanism in a backend server. Or, since there’s no way to check how many messages the user hasn’t read when the app starts, I had to implement a database in the backend with counters that increment on new messages so that clients can compare their local values when they start. So, to answer ‘what I’m proud of’, it’s going to be working around the architectural API challenges rather than building a desktop app with a sweet UI, since I already knew I could do the latter. Fossim is a collaboration platform for open-source projects, but what makes it different from a platform like Discord, Matrix, Slack or Zulip is that it’s built on the software forge that projects are already using for source control. By using GitHub Discussions as the content index for your project’s community (note: Fossim is designed with support for different forges in mind, and the project would be very happy to accept contributions to add support for other platforms) with the Fossim application as an interface familiar to users of the platforms listed above, the discussions taking place in your community become indexable by search engines, you avoid splitting your community across multiple platforms and avoid requiring users to create new accounts, content like issues and pull requests can be referenced using convenient shorthand syntax, and you use a platform designed for the needs of open source, for example automatically displaying a project’s funding links on its Fossim community overview. Additionally, you avoid the common hassle of migrating users to a new platform, since Fossim is built fully on top of GitHub Discussions, which can be accessed directly from GitHub’s interface. Using Fossim, however, grants you access to all the communities you’re a member of in one place, easy to navigate between with a unified interface, system-level notifications for new messages including granular, per-community controls, and an interface more tailored to a chat platform than a curated discussion forum. Want to set up a Fossim community? Head over to the backend documentation at https://github.com/nekename/fossim-backend to learn how to set up an event source for your community.", "repo": "https://github.com/nekename/fossim-application", "demo": "https://github.com/nekename/fossim-application#installation"}]...
|
[{"post_id": 33621, "ts": "202 [{"post_id": 33621, "ts": "2026-07-23T18:02:50Z", "hours": 1.4597, "text": "got back home, wrote a README with overview, installation, support and contributing info, created a metainfo file in case I ever bother to publish this to Flathub and so it looks nice in Linux software stores, fixed a bug with missed event deliveries when reconnecting to the backend, wrote a github actions workflow for publishing on release and added a banner sending you to the FAQ after onboarding"}, {"post_id": 28783, "ts": "2026-07-15T08:56:42Z", "hours": 1.7419, "text": "I’m away right now so not making lightning speed progress like before, but I made the application integrate much better when installed, such as enforcing a maximum of one running instance, fixing the app’s display name, and improving the icon shown on macOS. then, I wrote an FAQ ( https://github.com/nekename/fossim-application/wiki/FAQ ) for the application to clarify missing features, answer hosting questions and address privacy concerns"}, {"post_id": 24970, "ts": "2026-07-08T21:14:24Z", "hours": 1.7503, "text": "Dockerfile written, github publish action written, backend container published 🎉 https://github.com/nekename/fossim-backend/pkgs/container/fossim-backend edit: oh yeah also update checker in the app and anonymous statistics collection"}, {"post_id": 24684, "ts": "2026-07-08T13:09:14Z", "hours": 1.1011, "text": "it’s all finishing touches in the client now! added support for minimising the app to the system tray when closed as well as a settings menu to control the behaviour pretty much just need to add some networked services like an update checker and statistics collection, write a readme and faq, and add a docker build for the backend"}, {"post_id": 24639, "ts": "2026-07-08T11:17:55Z", "hours": 0.6622, "text": "alright, as hinted before, Fossim now sends system notifications! (and of course i made sure it doesn’t send notifs when the channel is focussed and you’re actively chatting) (weird icon and name will be fixed when the app is properly installed (i hope))"}, {"post_id": 24612, "ts": "2026-07-08T10:13:47Z", "hours": 1.8769, "text": "comments referencing github items are now real links to make coordinating PRs and issues way easier (as well as linking to other discussions, although they don’t open in fossim) I also added a notif level setting which will be useful now as I’m about to implement system notifications, and you might not want a system notification for every thread in every community this is amidst some other UI/UX improvements like better error messages, automatic reconnection etc"}, {"post_id": 24215, "ts": "2026-07-07T17:06:33Z", "hours": 2.4011, "text": "with all the architectural stuff done, I’m working on all the cosmetic finishing touches community list now also shows the total unread notifs of all the community’s channels community config allows specifying name, icon and banner so that you can customise your community I even added a button to sponsor the community’s owner if the repository has funding links attached!"}, {"post_id": 23693, "ts": "2026-07-06T20:03:37Z", "hours": 3.2303, "text": "so, I’m back a little while later, and the app now shows unread message counters, not only incrementing while the app is open but also synchronising with the backend so that you can see how many messages have come in even when the app was closed. this required me to set up a database in the backend for tracking sequential message counters for each channel that the client can then subtract from its own records, I learnt some database stuff and also some stuff about making bulk HTTP requests, since I didn’t want to make a request per channel"}, {"post_id": 23405, "ts": "2026-07-06T10:46:48Z", "hours": 3.7539, "text": "alright, here we go! it was a lot of work (nearly 4h as you can see), but the Fossim client can now receive and handle every type of live update that the backend can receive from the GitHub webhook. this means that when others send, edit or delete messages, or a new channel or thread is created or an existing one edited, deleted, locked or unlocked, the client receives the update in real time. now it feels more like an instant messenger :) what’s left: showing notifications for unread messages, including finding some way to remember last read message and fetch how many new messages once the client restarts"}, {"post_id": 22945, "ts": "2026-07-05T16:34:22Z", "hours": 1.9489, "text": "worked my way through GitHub docs and figured out how to implement a webhook delivery handler, including verifying the secret, then implemented connecting to websocket channels for each community which get forwarded all the relevant webhook messages all that’ll be left now is to incorporate these updates into the frontend which shouldn’t be too hard"}, {"post_id": 22738, "ts": "2026-07-05T10:00:44Z", "hours": 0.7953, "text": "I added replying to messages that don’t already have a reply thread last night and I’ve just added reacting and unreacting, which completes all the basic message functions 🎉"}, {"post_id": 22459, "ts": "2026-07-04T22:36:37Z", "hours": 0.5753, "text": "you can now edit messages basically i’m speedrunning all the basic actions so that i can work on notifications which will be a huge task"}, {"post_id": 22397, "ts": "2026-07-04T21:14:37Z", "hours": 1.4183, "text": "you can now delete comments and replies, including proper handling of GitHub’s very weird logic flow for deleting comments that have replies - they get replaced with ghost comments until all of their replies are deleted - just an empty body without so much as an explanation (two windows here to demonstrate the modal and also the fact that the button appears on comment hover)"}, {"post_id": 22182, "ts": "2026-07-04T14:45:20Z", "hours": 1.4878, "text": "wow! you can now send messages from a delightfully previewable text box in other news, I improved the experience switching between communities, added highlighting for the active channel, fixed a performance problem and fixed a hang when loading an empty channel"}, {"post_id": 22091, "ts": "2026-07-04T10:54:50Z", "hours": 1.3803, "text": "you can now view full reply threads to every top-level message, including pagination (it loads 100 messages at a time)"}, {"post_id": 21773, "ts": "2026-07-03T21:32:40Z", "hours": 0.3969, "text": "code block highlighting, bug fix"}, {"post_id": 21708, "ts": "2026-07-03T20:04:27Z", "hours": 5.2114, "text": "5 hours later, and basically all of the requirements of the main-continuity message view have been implemented, including images, lists, links, alerts, reactions and placeholder buttons for opening reply threads! it even automatically loads more messages as you scroll upwards, but i dont have any long enough channels to demonstrate that (loads 100 messages at a time since that costs the minimum per request in terms of github rate limits) all that’s left now is taking actions (sending messages, reacting etc), and then getting realtime notifications from the backend"}, {"post_id": 21145, "ts": "2026-07-02T23:02:54Z", "hours": 3.2053, "text": "I’m having so much fun :) I’ve implemented the entire channel and thread list complete with thread pagination, dynamic icons based on locked/answered/answerable status, and a button to leave the community I also implemented a really satisfying shift, blur and shadow effect when switching between communities (edit: the issue in the video where the ‘select a community to start collaborating’ message wasn’t shown after leaving the community got fixed immediately after recording)"}, {"post_id": 20904, "ts": "2026-07-02T17:03:15Z", "hours": 1.7164, "text": "I learnt GraphQL and made my peace with it, then implemented listing channels and threads!"}, {"post_id": 19521, "ts": "2026-06-30T20:57:39Z", "hours": 0.5183, "text": "why is there no REST API for Discussions 😭 I’m going to have to learn GraphQL"}, {"post_id": 19465, "ts": "2026-06-30T19:56:15Z", "hours": 2.3078, "text": "auto-expanding sidebar drawer for communities you’re in, including a button and popup flow for joining new communities :) caching from previous step was useful here next step is listing channels and threads"}, {"post_id": 19100, "ts": "2026-06-30T10:13:40Z", "hours": 1.9489, "text": "added double-click to copy and added a loading ring animation to the device flow auth view added a note to the host confirmation view saying that the app only has limited access to act on your behalf and that in the local app, the access token never needs to be sent to the server cleaned up the database schema and implemented persisting added communities and obtained access tokens implemented caching host and client ID requests since those will be frequent in upcoming stuff"}, {"post_id": 18705, "ts": "2026-06-29T21:50:53Z", "hours": 1.4975, "text": "github device flow auth 👀 why oh why does device flow auth not work in browsers? I had to do either figure out how to make octokit.js use tauri-plugin-http, do the entire processs from the Rust side, or use the normal oauth web flow went with do it all from Rust because option 1 and 3 needed rust deps anyway (http plugin for 1, deep link/web server for 3), and option 1 needed figuring out and option 3 leaks the access token to the server unnecessarily"}, {"post_id": 18376, "ts": "2026-06-29T14:41:30Z", "hours": 3.1828, "text": "I implemented the necessary utils for making requests to the backend, and used fetching the client ID to test that (screenshot). I backtracked on the implementation and removed tauri-plugin-http as well as removing tauri-plugin-svelte from earlier so that the frontend is entirely self-contained and can be ported to just be a website for those who want that. on the backend, removing tauri-plugin-http required me to mess around with CORS settings for a while until the browser accepted its responses"}, {"post_id": 17656, "ts": "2026-06-28T15:18:15Z", "hours": 1.2564, "text": "I implemented fetching a community’s configured backend host from its repository when you click ‘Join’, then I created a skeleton OAuth explanation and confirmation modal view!"}, {"post_id": 17605, "ts": "2026-06-28T14:00:21Z", "hours": 1.6003, "text": "I set up tauri-plugin-svelte for data persistence, then I repurposed the i18n.ts localisation code from one of my other projects so that Fossim has translation support from the very beginning lastly, I created a skeleton onboarding view where you can input the first community you want to join or join Fossim’s own community as an example"}, {"post_id": 17199, "ts": "2026-06-27T22:11:10Z", "hours": 1.2208, "text": "spent forever trying to debug prettier-plugin-tailwindcss which is not how i wanted to spend my evening turns out it was just a bug and not a misconfiguration ( https://github.com/tailwindlabs/prettier-plugin-tailwindcss/issues/464 ) this started while i was getting the onboarding working in the application and noticed my classes weren’t being sorted edit: looks like i uncovered a bug in Deno as well!! installing the insiders channel of prettier-plugin-tailwindcss using Deno resulted in the latest commit being added to package.json but a commit from 2023 actually being installed. had to remove the ^ from the version specifier"}, {"post_id": 17112, "ts": "2026-06-27T19:43:42Z", "hours": 2.5369, "text": "architecture has been planned out backend and client projects have been fully scaffolded necessary setup steps and permissions for the GitHub App have been determined and documented relevant GitHub APIs and processes have been researched most of my time was spent planning and researching today, that’s why only 2.5 hours coding"}]...
|
Title: Fossim by @nekename | Stardance
Devlogs:
a Title: Fossim by @nekename | Stardance
Devlogs:
architecture has been planned out backend and client projects have been fully scaffolded necessary setup steps and permissions for the GitHub App have been determined and documented relevant GitHub APIs and processes have been researched most of my time was spent planning and researching today, that’s why only 2.5 hours coding
spent forever trying to debug prettier-plugin-tailwindcss which is not how i wanted to spend my evening turns out it was just a bug and not a misconfiguration ( https://github.com/tailwindlabs/prettier-plugin-tailwindcss/issues/464 ) this started while i was getting the onboarding working in the application and noticed my classes weren’t being sorted edit: looks like i uncovered a bug in Deno as well!! installing the insiders channel of prettier-plugin-tailwindcss using Deno resulted in the latest commit being added to package.json but a commit from 2023 actually being installed. had to remove the ^ from the version specifier
I set up tauri-plugin-svelte for data persistence, then I repurposed the i18n.ts localisation code from one of my other projects so that Fossim has translation support from the very beginning lastly, I created a skeleton onboarding view where you can input the first community you want to join or join Fossim’s own community as an example
I implemented fetching a community’s configured backend host from its repository when you click ‘Join’, then I created a skeleton OAuth explanation and confirmation modal view!
I implemented the necessary utils for making requests to the backend, and used fetching the client ID to test that (screenshot). I backtracked on the implementation and removed tauri-plugin-http as well as removing tauri-plugin-svelte from earlier so that the frontend is entirely self-contained and can be ported to just be a website for those who want that. on the backend, removing tauri-plugin-http required me to mess around with CORS settings for a while until the browser accepted its responses
github device flow auth 👀 why oh why does device flow auth not work in browsers? I had to do either figure out how to make octokit.js use tauri-plugin-http, do the entire processs from the Rust side, or use the normal oauth web flow went with do it all from Rust because option 1 and 3 needed rust deps anyway (http plugin for 1, deep link/web server for 3), and option 1 needed figuring out and option 3 leaks the access token to the server unnecessarily
added double-click to copy and added a loading ring animation to the device flow auth view added a note to the host confirmation view saying that the app only has limited access to act on your behalf and that in the local app, the access token never needs to be sent to the server cleaned up the database schema and implemented persisting added communities and obtained access tokens implemented caching host and client ID requests since those will be frequent in upcoming stuff
auto-expanding sidebar drawer for communities you’re in, including a button and popup flow for joining new communities :) caching from previous step was useful here next step is listing channels and threads
why is there no REST API for Discussions 😭 I’m going to have to learn GraphQL
I learnt GraphQL and made my peace with it, then implemented listing channels and threads!
I’m having so much fun :) I’ve implemented the entire channel and thread list complete with thread pagination, dynamic icons based on locked/answered/answerable status, and a button to leave the community I also implemented a really satisfying shift, blur and shadow effect when switching between communities (edit: the issue in the video where the ‘select a community to start collaborating’ message wasn’t shown after leaving the community got fixed immediately after recording)
5 hours later, and basically all of the requirements of the main-continuity message view have been implemented, including images, lists, links, alerts, reactions and placeholder buttons for opening reply threads! it even automatically loads more messages as you scroll upwards, but i dont have any long enough channels to demonstrate that (loads 100 messages at a time since that costs the minimum per request in terms of github rate limits) all that’s left now is taking actions (sending messages, reacting etc), and then getting realtime notifications from the backend
code block highlighting, bug fix
you can now view full reply threads to every top-level message, including pagination (it loads 100 messages at a time)
wow! you can now send messages from a delightfully previewable text box in other news, I improved the experience switching between communities, added highlighting for the active channel, fixed a performance problem and fixed a hang when loading an empty channel
you can now delete comments and replies, including proper handling of GitHub’s very weird logic flow for deleting comments that have replies - they get replaced with ghost comments until all of their replies are deleted - just an empty body without so much as an explanation (two windows here to demonstrate the modal and also the fact that the button appears on comment hover)
you can now edit messages basically i’m speedrunning all the basic actions so that i can work on notifications which will be a huge task
I added replying to messages that don’t already have a reply thread last night and I’ve just added reacting and unreacting, which completes all the basic message functions 🎉
worked my way through GitHub docs and figured out how to implement a webhook delivery handler, including verifying the secret, then implemented connecting to websocket channels for each community which get forwarded all the relevant webhook messages all that’ll be left now is to incorporate these updates into the frontend which shouldn’t be too hard
alright, here we go! it was a lot of work (nearly 4h as you can see), but the Fossim client can now receive and handle every type of live update that the backend can receive from the GitHub webhook. this means that when others send, edit or delete messages, or a new channel or thread is created or an existing one edited, deleted, locked or unlocked, the client receives the update in real time. now it feels more like an instant messenger :) what’s left: showing notifications for unread messages, including finding some way to remember last read message and fetch how many new messages once the client restarts
so, I’m back a little while later, and the app now shows unread message counters, not only incrementing while the app is open but also synchronising with the backend so that you can see how many messages have come in even when the app was closed. this required me to set up a database in the backend for tracking sequential message counters for each channel that the client can then subtract from its own records, I learnt some database stuff and also some stuff about making bulk HTTP requests, since I didn’t want to make a request per channel
with all the architectural stuff done, I’m working on all the cosmetic finishing touches community list now also shows the total unread notifs of all the community’s channels community config allows specifying name, icon and banner so that you can customise your community I even added a button to sponsor the community’s owner if the repository has funding links attached!
comments referencing github items are now real links to make coordinating PRs and issues way easier (as well as linking to other discussions, although they don’t open in fossim) I also added a notif level setting which will be useful now as I’m about to implement system notifications, and you might not want a system notification for every thread in every community this is amidst some other UI/UX improvements like better error messages, automatic reconnection etc
alright, as hinted before, Fossim now sends system notifications! (and of course i made sure it doesn’t send notifs when the channel is focussed and you’re actively chatting) (weird icon and name will be fixed when the app is properly installed (i hope))
it’s all finishing touches in the client now! added support for minimising the app to the system tray when closed as well as a settings menu to control the behaviour pretty much just need to add some networked services like an update checker and statistics collection, write a readme and faq, and add a docker build for the backend
Dockerfile written, github publish action written, backend container published 🎉 https://github.com/nekename/fossim-backend/pkgs/container/fossim-backend edit: oh yeah also update checker in the app and anonymous statistics collection
I’m away right now so not making lightning speed progress like before, but I made the application integrate much better when installed, such as enforcing a maximum of one running instance, fixing the app’s display name, and improving the icon shown on macOS. then, I wrote an FAQ ( https://github.com/nekename/fossim-application/wiki/FAQ ) for the application to clarify missing features, answer hosting questions and address privacy concerns
got back home, wrote a README with overview, installation, support and contributing info, created a metainfo file in case I ever bother to publish this to Flathub and so it looks nice in Linux software stores, fixed a bug with missed event deliveries when reconnecting to the backend, wrote a github actions workflow for publishing on release and added a banner sending you to the FAQ after onboarding
Ships:
Hello! Fossim and Stardance were really fun for me as I finally got around to building something new, instead of spending a lot of time maintaining old projects for their users. If you read through the devlogs or code, you’ll see that building a whole new interface on GitHub’s APIs isn’t easy, because they don’t expose a fraction of the features they use on their own site. For example, instead of being able to receive events (e.g. someone else sent a message) in the client directly, I had to architect an entire multiplexed event forwarding/broadcast mechanism in a backend server. Or, since there’s no way to check how many messages the user hasn’t read when the app starts, I had to implement a database in the backend with counters that increment on new messages so that clients can compare their local values when they start. So, to answer ‘what I’m proud of’, it’s going to be working around the architectural API challenges rather than building a desktop app with a sweet UI, since I already knew I could do the latter. Fossim is a collaboration platform for open-source projects, but what makes it different from a platform like Discord, Matrix, Slack or Zulip is that it’s built on the software forge that projects are already using for source control. By using GitHub Discussions as the content index for your project’s community (note: Fossim is designed with support for different forges in mind, and the project would be very happy to accept contributions to add support for other platforms) with the Fossim application as an interface familiar to users of the platforms listed above, the discussions taking place in your community become indexable by search engines, you avoid splitting your community across multiple platforms and avoid requiring users to create new accounts, content like issues and pull requests can be referenced using convenient shorthand syntax, and you use a platform designed for the needs of open source, for example automatically displaying a project’s funding links on its Fossim community overview. Additionally, you avoid the common hassle of migrating users to a new platform, since Fossim is built fully on top of GitHub Discussions, which can be accessed directly from GitHub’s interface. Using Fossim, however, grants you access to all the communities you’re a member of in one place, easy to navigate between with a unified interface, system-level notifications for new messages including granular, per-community controls, and an interface more tailored to a chat platform than a curated discussion forum. Want to set up a Fossim community? Head over to the backend documentation at https://github.com/nekename/fossim-backend to learn how to set up an event source for your community....
|
1793602467.3532338
|
1793688867.3532338
|
|
13589
|
TielOS by @orivio | Stardance
|
orivio
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-24T06:48:33Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What is TielOS? TielOS is a barebones personalOS that I made in a few hours (over the course of a few months.. haha… [burnout aint fun folks!]). It has three apps, an about me, a blog, and PEEP. The about me is just as the name says - it contains some basic info about my interests and hobbies. The blog is a place where I plan on posting life updates every now and then so that my friends can keep track of my endeavors! And PEEP… oh PEEP. PEEP TELL PEOPLE ABOUT HOBBY. BIRD HOBBY. I LOV BIRD :> Challenges Intertwining JavaScript’s logic with what was at the time a rather unpleasant user interface was a nightmare. Alongside the fact that I was relearning HTML and CSS along the way, working the logic into the equation was crazy difficult! But after a bit of brain-racking and trial and error, I figured it out! I also planned to do a lot more with this project before my first ship, such as add a calculator and maybe a few other apps. But some things started happening (life, really), I lost track of time, and before ya knew it I kind of didn’t really have much time to work on TielOS. Don’t worry though, it will one day make a GREAT comeback! Things I’m proud of The smooth animations and dragging gave me a huge sense of accomplishment once I got them figured out. I really had no idea how something like that could be done on a website before, but once I turned those gears in my head, and that logic clicked, it just felt amazing! Things YOU, yes YOU should know This project, though it has been initially shipped, is basically just a demo. I plan on adding more to it and potentially doing a full redesign if time allows. So what you see here isn’t final!!!11!!!!1", "repo": "https://github.com/orivio/tielos", "demo": "https://orivio.github.io/tielos/index.html"}]...
|
[{"post_id": 33903, "ts": "202 [{"post_id": 33903, "ts": "2026-07-24T06:18:11Z", "hours": 1.29, "text": "Final Planned Devlog Unfortunately, due to time constraints, I had to cut my expectations with this project a little short. My original goal was to make at least a functional calculator, but since family events are stacking up, i think it’d be better if i directed my time towards my other project, SUPERORBITAL instead. for now, this app, “peep” will be the last. ill probably add more species to it later on!"}, {"post_id": 10049, "ts": "2026-06-16T16:55:24Z", "hours": 2.0314, "text": "i added draggable windows, time tracking, window animations, and open/close buttons! i also started working on another app (blog)"}, {"post_id": 9302, "ts": "2026-06-15T16:53:13Z", "hours": 1.1522, "text": "now things are starting to spruce up! the enter button actually leads you to a home screen now, and the colors and backgrounds are getting more satisfactory. planning to add time and window movement next."}, {"post_id": 5262, "ts": "2026-06-08T23:44:05Z", "hours": 0.6822, "text": "man there’s no way i just spent like 30 minutes trying to get this stupid text alignment to work 😭"}]...
|
Title: TielOS by @orivio | Stardance
Devlogs:
man Title: TielOS by @orivio | Stardance
Devlogs:
man there’s no way i just spent like 30 minutes trying to get this stupid text alignment to work 😭
now things are starting to spruce up! the enter button actually leads you to a home screen now, and the colors and backgrounds are getting more satisfactory. planning to add time and window movement next.
i added draggable windows, time tracking, window animations, and open/close buttons! i also started working on another app (blog)
Final Planned Devlog Unfortunately, due to time constraints, I had to cut my expectations with this project a little short. My original goal was to make at least a functional calculator, but since family events are stacking up, i think it’d be better if i directed my time towards my other project, SUPERORBITAL instead. for now, this app, “peep” will be the last. ill probably add more species to it later on!
Ships:
What is TielOS? TielOS is a barebones personalOS that I made in a few hours (over the course of a few months.. haha… [burnout aint fun folks!]). It has three apps, an about me, a blog, and PEEP. The about me is just as the name says - it contains some basic info about my interests and hobbies. The blog is a place where I plan on posting life updates every now and then so that my friends can keep track of my endeavors! And PEEP… oh PEEP. PEEP TELL PEOPLE ABOUT HOBBY. BIRD HOBBY. I LOV BIRD :> Challenges Intertwining JavaScript’s logic with what was at the time a rather unpleasant user interface was a nightmare. Alongside the fact that I was relearning HTML and CSS along the way, working the logic into the equation was crazy difficult! But after a bit of brain-racking and trial and error, I figured it out! I also planned to do a lot more with this project before my first ship, such as add a calculator and maybe a few other apps. But some things started happening (life, really), I lost track of time, and before ya knew it I kind of didn’t really have much time to work on TielOS. Don’t worry though, it will one day make a GREAT comeback! Things I’m proud of The smooth animations and dragging gave me a huge sense of accomplishment once I got them figured out. I really had no idea how something like that could be done on a website before, but once I turned those gears in my head, and that logic clicked, it just felt amazing! Things YOU, yes YOU should know This project, though it has been initially shipped, is basically just a demo. I plan on adding more to it and potentially doing a full redesign if time allows. So what you see here isn’t final!!!11!!!!1...
|
1793602468.8853197
|
1793688868.8853197
|
|
4475
|
Exit Not Found by @dpath02 | Stardance
|
dpath02
|
1
|
10.36
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-28T07:08:56Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is the first real game I’ve ever made (not counting scratch or the Unity flappy bird tutorial). While in it’s current state it barely qualifies as a game considering it’s my second time using Unity it’s already an ok start. Plus I’m planning on working on this well past Stardance and already have some better models on the way. P.S. I don’t know if shipping is a permanent thing where you can’t edit after. If so… keep an eye on itch io?", "repo": "https://github.com/dpath02-sketch/My-Unity-Horror-Game", "demo": "https://dpath02.itch.io/exit-not-found"}]...
|
[{"post_id": 70331, "ts": "202 [{"post_id": 70331, "ts": "2026-09-18T23:36:42Z", "hours": 0.5544, "text": "Exit not Found devlog 4 Again, been a while since I last posted. I’m not good with sticking to things for long periods of time… anyway to get back into things I tried something simple to refresh my fleeting C# syntax memory by adding an FOV slider as well. The next big thing I want to work on is full on game saves. Even with the new data manager there’s still a few things I need to think about like how to convert the 3 rooms into just numbers and text without loosing info or making loading the game a pain. Not sure if anyone still reads these but if you do, thanks !(^U^)! edit: video was bugged for some reason. Here’s a screenshot of 70FOV you can compare to the previous images"}, {"post_id": 57709, "ts": "2026-08-29T23:14:02Z", "hours": 5.8042, "text": "Exit Not Found devlog 3.5 Sorry for not posting a devlog in a long time. Unfortunately your gonna have to wait a while more cause if this post works it confirms my suspicions that it’s the trash internet speed that won’t let me upload and I can’t have images :(. As far as I’m concerned Stardance is ending soon and I’m not gonna have a finished game by then so if you really wanna keep up to date I guess I’ll switch to itch. Also got working configs that persist after closing the game yay :)."}, {"post_id": 17443, "ts": "2026-06-28T06:58:43Z", "hours": 0.815, "text": "Exit Not Found third devlog I added the ability to unlock your mouse and go back to the menu without dying! Ground breaking stuff… I also added some “music” that plays in the background (I’m not very good at writing music + Soundtrap’s exports have a bit of extra time at the end for some reason. maybe instrument sustain). I was also considering having the game be available on web but the web build was kinda buggy for some reason and itch io didn’t like me having 2 zip files so you still have to download to play. I’m not actually sure how much time there’s left for Stardance so if this is my last devlog here, fear not! I’m not giving up on this game and will at least get the game as polished as I can, if not adding more actual gameplay to it in the long run."}, {"post_id": 10567, "ts": "2026-06-17T11:28:30Z", "hours": 2.5197, "text": "Exit Not Found second devlog I decided to focus a bit on getting the game to be… a game. Using a quick Youtube tutorial I got a main menu up and while I did add a bunch of buttons so far the only ones that work are new game and quit. The sphere of doom now triggers a vignette effect and knocks you over before sending you to the menu again. Getting that to work was a very big pain as I am promptly reminded that I’m still learning how both C# and Unity work and have just been throwing stuff to the wall and seeing what sticks. The main issue was accessing data and functions across several different scripts and types of objects. I can guarantee if I work on this in a couple months time I’m going to regret every stupid code design choice I made (my horrid code is above unless I forgot where the images go). Also fun fact sound design is pain not gonna go into too much depth since I gave up pretty quickly realising free internet tools only get you so far."}, {"post_id": 7814, "ts": "2026-06-13T01:21:39Z", "hours": 0.8811, "text": "Exit Not Found first devlog This is the first 3D game I’ve worked on and it’s basically just a Roblox: Doors clone where you walk around in an infinite cycle of rooms. So far there’s a basic main menu, world gen, and an enemy that deletes the lights and outputs “dead” in the console if you get too close :). Getting the lights to break took a bit longer than I hoped cause I didn’t realise it the lights need a rigid body component for the collider to work."}]...
|
Title: Exit Not Found by @dpath02 | Stardance
Dev Title: Exit Not Found by @dpath02 | Stardance
Devlogs:
Exit Not Found first devlog This is the first 3D game I’ve worked on and it’s basically just a Roblox: Doors clone where you walk around in an infinite cycle of rooms. So far there’s a basic main menu, world gen, and an enemy that deletes the lights and outputs “dead” in the console if you get too close :). Getting the lights to break took a bit longer than I hoped cause I didn’t realise it the lights need a rigid body component for the collider to work.
Exit Not Found second devlog I decided to focus a bit on getting the game to be… a game. Using a quick Youtube tutorial I got a main menu up and while I did add a bunch of buttons so far the only ones that work are new game and quit. The sphere of doom now triggers a vignette effect and knocks you over before sending you to the menu again. Getting that to work was a very big pain as I am promptly reminded that I’m still learning how both C# and Unity work and have just been throwing stuff to the wall and seeing what sticks. The main issue was accessing data and functions across several different scripts and types of objects. I can guarantee if I work on this in a couple months time I’m going to regret every stupid code design choice I made (my horrid code is above unless I forgot where the images go). Also fun fact sound design is pain not gonna go into too much depth since I gave up pretty quickly realising free internet tools only get you so far.
Exit Not Found third devlog I added the ability to unlock your mouse and go back to the menu without dying! Ground breaking stuff… I also added some “music” that plays in the background (I’m not very good at writing music + Soundtrap’s exports have a bit of extra time at the end for some reason. maybe instrument sustain). I was also considering having the game be available on web but the web build was kinda buggy for some reason and itch io didn’t like me having 2 zip files so you still have to download to play. I’m not actually sure how much time there’s left for Stardance so if this is my last devlog here, fear not! I’m not giving up on this game and will at least get the game as polished as I can, if not adding more actual gameplay to it in the long run.
Exit Not Found devlog 3.5 Sorry for not posting a devlog in a long time. Unfortunately your gonna have to wait a while more cause if this post works it confirms my suspicions that it’s the trash internet speed that won’t let me upload and I can’t have images :(. As far as I’m concerned Stardance is ending soon and I’m not gonna have a finished game by then so if you really wanna keep up to date I guess I’ll switch to itch. Also got working configs that persist after closing the game yay :).
Exit not Found devlog 4 Again, been a while since I last posted. I’m not good with sticking to things for long periods of time… anyway to get back into things I tried something simple to refresh my fleeting C# syntax memory by adding an FOV slider as well. The next big thing I want to work on is full on game saves. Even with the new data manager there’s still a few things I need to think about like how to convert the 3 rooms into just numbers and text without loosing info or making loading the game a pain. Not sure if anyone still reads these but if you do, thanks !(^U^)! edit: video was bugged for some reason. Here’s a screenshot of 70FOV you can compare to the previous images
Ships:
This is the first real game I’ve ever made (not counting scratch or the Unity flappy bird tutorial). While in it’s current state it barely qualifies as a game considering it’s my second time using Unity it’s already an ok start. Plus I’m planning on working on this well past Stardance and already have some better models on the way. P.S. I don’t know if shipping is a permanent thing where you can’t edit after. If so… keep an eye on itch io?...
|
1793602470.0709593
|
1793688870.0709593
|
|
57099
|
My personal site by @OneShot | Stardance
|
OneShot
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-01T19:57:56Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Yea im shipping my personal website i hope you have a grate time exploring it :0", "repo": "https://github.com/Zlati839/Personal-Website", "demo": "https://zlati839.github.io/Personal-Website/"}]...
|
[{"post_id": 59823, "ts": "202 [{"post_id": 59823, "ts": "2026-09-01T19:56:13Z", "hours": 5.3939, "text": "Im glad to say ive made my own personal website , also you can interact with the little decor placed around :D"}]...
|
Title: My personal site by @OneShot | Stardance
D Title: My personal site by @OneShot | Stardance
Devlogs:
Im glad to say ive made my own personal website , also you can interact with the little decor placed around :D
Ships:
Yea im shipping my personal website i hope you have a grate time exploring it :0...
|
1793602471.2621856
|
1793688871.2621856
|
|
38139
|
Prism - Infinite Workspace Tool by @kakak_ | Stard Prism - Infinite Workspace Tool by @kakak_ | Stardance...
|
kakak_
|
2
|
25.0
|
463
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-15T15:58:44Z", "hours": 11.0, "multiplier": 18.94, "payout": 260, "blessing": "neutral", "text": "Hi!! By the way, if the project doesn’t work on your end, please just don’t rate it… Anyways, this is Prism! An infinite workspace tool designed to focus your thoughts in a digestible format. I’ve added a lot since the last ship, like accounts, a tutorial, and I’m working on a new dashboard and landing page. I would really appreciate it if you could give me constructive feedback, because it really helps me gauge which features are high-priority and which aren’t. The link is https://prism-beta-beige.vercel.app/ and please enjoy!", "repo": "https://github.com/kakak158/infinite-workspace", "demo": "https://prism-beta-beige.vercel.app/"}, {"ship_num": 2, "ts": "2026-07-29T14:58:47Z", "hours": 14.0, "multiplier": 14.8, "payout": 203, "blessing": "neutral", "text": "Infinite Workspace is an interactive, infinite canvas built for organizing ideas, planning projects, tracking tasks, and even relaxing. Drag, drop, connect, and structure your thoughts freely with custom card nodes. Note Card: Write and format notes with titles and rich text support (⌘B, ⌘I,⌘U). Use them to express ideas or add context to surrounding cards. Task Card: Track goals and check off items with a polished, progress-focused UI and fluid task animations. Parent Card: Act as root/folder nodes to group topics and fields together. Features real-time stat stacking from child cards. Image Card: Display visual content directly on the canvas to complement your notes and project layouts. Connect nodes freely across the infinite canvas. Parent-Child Logic: Connect a green connector to a red connector on a Parent Card to establish child dependencies and hierarchy. Aggregated Stats: Parent cards automatically stack and display stats from connected child nodes. Drag-and-Drop Sidebar: Easily spawn new card nodes directly onto the canvas. Auto-Save: Your workspace state persists automatically in your browser’s localStorage. Smooth Animations: Powered by Motion and GSAP for responsive UI interactions, card creation, task buttons, and loading screens. Built With: Frontend: React, TailwindCSS, ReactFlow Persistence: Browser localStorage Hosting: Netlify", "repo": "https://github.com/kakak158/infinite-workspace", "demo": "https://prism-beta-beige.vercel.app/"}]...
|
[{"post_id": 47587, "ts": "202 [{"post_id": 47587, "ts": "2026-08-15T15:51:45Z", "hours": 3.3319, "text": "Devlog #8 Sorry for the massive gap in devlogs recently! I’ve been flying all across the world, from the UK to Canada to New York (and soon, Texas)! But… I really didn’t do much in these 3hrs that’s worth talking about… Just a bunch of bug fixes with Supabase (mostly a weird glitch where if you logged in and out and in again on your computer, Supabase would delete all your data from the database), some more work on the new dashboard (and all the Supabase troubles that come with it), and a REBRANDING!!! This web-app is now called “Prism” , an infinite workspace platform that can help you refocus your ideas and make them visible and easy to understand. I’ve also switched hosting platform, from Netlify to Vercel (they kept trying make me pay for AI credits, and when I said no they blocked the website ). I’m really excited about this project, and I hope you can see my love and joy poured into it through the web-app and my devlogs! If this is the first devlog you’ve seen, I highly encourage you to try out the app at https://prism-beta-beige.vercel.app/ Thanks, and see you next time!"}, {"post_id": 40383, "ts": "2026-08-03T21:05:21Z", "hours": 8.1108, "text": "Devlog #7 I did it!!!!! I added: Supabase AND Clerk!! New font Tutorial New routes?! Watch the video to fully appreciate all this"}, {"post_id": 36997, "ts": "2026-07-29T13:29:11Z", "hours": 3.9544, "text": "Devlog #6 Hi! I haven’t made a devlog in a while, but i’ve been up to a lot! Let’s get started! I completely redesigned the parent card from the ground up, because I wasn’t happy with the way it looked. I added: Cool stats! and hierarchy… (by the way I made it so you can style the note card now in any way you like using ⌘B, ⌘I and ⌘U) Because of the nature of having every node be able to connect to every node, there is no natural hierarchy. So how can a parent “folder” card exist if there is no hierarchy? Introducing… the red connector on the parent card! If you connect a green connector to a red one on a different parent card, you make the one with the red connector the child and the green the parent! This allows for: Stacking of stats on the cards Better organisation! There’s also an image card now! You’ll see it in the video. I also did some bug fixing, and changed the icons in the sidebar to match the cards. I’ve been thinking hard about what’s next for this project, and I think I’m very happy with it. That being said, it does run on localStorage, which: Is tiny (~5MB) Only saves to your computer. I want this app to be something you can pull out on someone else’s laptop, or on your phone, and localStorage simply can’t do that. Which is why I’m going to be working very hard over the next few days to switch this project over to Supabase. This is going to be a massive overhaul in Infinite Workspace’s backend, especially since I have never used Supabase before (I’m more of a Firebase kind of guy). This means that these devlogs are going to start to get smaller and sparser (as I have to learn Supabase). I’ll try to show the code I’m working with, but UI changes will be practically non-existent from here on out (unless I feel really passionate about something.)"}, {"post_id": 34836, "ts": "2026-07-25T21:06:06Z", "hours": 3.0689, "text": "Devlog #5 I found out today that you can style your yap sessions devlogs, so i’m going to be doing that now! I added: Saving : your workspace now saves to localStorage automatically Parent node : A root node that you can use to group topics and fields together in your workspace Probably more bug fixes that I forgot to include…"}, {"post_id": 34102, "ts": "2026-07-24T16:05:42Z", "hours": 2.9383, "text": "Devlog #4 I’ve made good progress! There is now: A Sidebar The task card to finished now too General bug fixes Ages spent going back to comment all my code! The sidebar is a new way to add nodes, now a drag-and-drop system! See it in action on the video (it might look like i’m not dragging on the screen recording, but I am)! I made the task card look beautiful, polished and finished too! It looks great I think.I’m gonna put my project goals on there so you can see how it looks!"}, {"post_id": 33139, "ts": "2026-07-22T19:39:39Z", "hours": 2.0122, "text": "Devlog #3: I added a new task card! This took a while… It’s not finished, but it’s close! I’ve also been doing some bug hunting to make this project more perfect. I also added cool new animations, using libraries like Motion and GSAP, including a loading screen, and quality-of-life animations, like: the task button the animation for creating a new task or note"}, {"post_id": 33006, "ts": "2026-07-22T15:28:40Z", "hours": 1.1022, "text": "Devlog #2:Basically the entire devlog is in the video, so read the cards in there, but is short: I’ve gotten the canvas working + the note nodes, and I think i’m ready to start making more node types (e.g tasks, links, imgs, etc)."}, {"post_id": 32723, "ts": "2026-07-22T01:44:23Z", "hours": 0.735, "text": "Just made a drawing of my plan. I think it’s gonna look great."}]...
|
Title: Prism - Infinite Workspace Tool by @kakak_ Title: Prism - Infinite Workspace Tool by @kakak_ | Stardance
Devlogs:
Just made a drawing of my plan. I think it’s gonna look great.
Devlog #2:Basically the entire devlog is in the video, so read the cards in there, but is short: I’ve gotten the canvas working + the note nodes, and I think i’m ready to start making more node types (e.g tasks, links, imgs, etc).
Devlog #3: I added a new task card! This took a while… It’s not finished, but it’s close! I’ve also been doing some bug hunting to make this project more perfect. I also added cool new animations, using libraries like Motion and GSAP, including a loading screen, and quality-of-life animations, like: the task button the animation for creating a new task or note
Devlog #4 I’ve made good progress! There is now: A Sidebar The task card to finished now too General bug fixes Ages spent going back to comment all my code! The sidebar is a new way to add nodes, now a drag-and-drop system! See it in action on the video (it might look like i’m not dragging on the screen recording, but I am)! I made the task card look beautiful, polished and finished too! It looks great I think.I’m gonna put my project goals on there so you can see how it looks!
Devlog #5 I found out today that you can style your yap sessions devlogs, so i’m going to be doing that now! I added: Saving : your workspace now saves to localStorage automatically Parent node : A root node that you can use to group topics and fields together in your workspace Probably more bug fixes that I forgot to include…
Devlog #6 Hi! I haven’t made a devlog in a while, but i’ve been up to a lot! Let’s get started! I completely redesigned the parent card from the ground up, because I wasn’t happy with the way it looked. I added: Cool stats! and hierarchy… (by the way I made it so you can style the note card now in any way you like using ⌘B, ⌘I and ⌘U) Because of the nature of having every node be able to connect to every node, there is no natural hierarchy. So how can a parent “folder” card exist if there is no hierarchy? Introducing… the red connector on the parent card! If you connect a green connector to a red one on a different parent card, you make the one with the red connector the child and the green the parent! This allows for: Stacking of stats on the cards Better organisation! There’s also an image card now! You’ll see it in the video. I also did some bug fixing, and changed the icons in the sidebar to match the cards. I’ve been thinking hard about what’s next for this project, and I think I’m very happy with it. That being said, it does run on localStorage, which: Is tiny (~5MB) Only saves to your computer. I want this app to be something you can pull out on someone else’s laptop, or on your phone, and localStorage simply can’t do that. Which is why I’m going to be working very hard over the next few days to switch this project over to Supabase. This is going to be a massive overhaul in Infinite Workspace’s backend, especially since I have never used Supabase before (I’m more of a Firebase kind of guy). This means that these devlogs are going to start to get smaller and sparser (as I have to learn Supabase). I’ll try to show the code I’m working with, but UI changes will be practically non-existent from here on out (unless I feel really passionate about something.)
Devlog #7 I did it!!!!! I added: Supabase AND Clerk!! New font Tutorial New routes?! Watch the video to fully appreciate all this
Devlog #8 Sorry for the massive gap in devlogs recently! I’ve been flying all across the world, from the UK to Canada to New York (and soon, Texas)! But… I really didn’t do much in these 3hrs that’s worth talking about… Just a bunch of bug fixes with Supabase (mostly a weird glitch where if you logged in and out and in again on your computer, Supabase would delete all your data from the database), some more work on the new dashboard (and all the Supabase troubles that come with it), and a REBRANDING!!! This web-app is now called “Prism” , an infinite workspace platform that can help you refocus your ideas and make them visible and easy to understand. I’ve also switched hosting platform, from Netlify to Vercel (they kept trying make me pay for AI credits, and when I said no they blocked the website ). I’m really excited about this project, and I hope you can see my love and joy poured into it through the web-app and my devlogs! If this is the first devlog you’ve seen, I highly encourage you to try out the app at https://prism-beta-beige.vercel.app/ Thanks, and see you next time!
Ships:
Infinite Workspace is an interactive, infinite canvas built for organizing ideas, planning projects, tracking tasks, and even relaxing. Drag, drop, connect, and structure your thoughts freely with custom card nodes. Note Card: Write and format notes with titles and rich text support (⌘B, ⌘I,⌘U). Use them to express ideas or add context to surrounding cards. Task Card: Track goals and check off items with a polished, progress-focused UI and fluid task animations. Parent Card: Act as root/folder nodes to group topics and fields together. Features real-time stat stacking from child cards. Image Card: Display visual content directly on the canvas to complement your notes and project layouts. Connect nodes freely across the infinite canvas. Parent-Child Logic: Connect a green connector to a red connector on a Parent Card to establish child dependencies and hierarchy. Aggregated Stats: Parent cards automatically stack and display stats from connected child nodes. Drag-and-Drop Sidebar: Easily spawn new card nodes directly onto the canvas. Auto-Save: Your workspace state persists automatically in your browser’s localStorage. Smooth Animations: Powered by Motion and GSAP for responsive UI interactions, card creation, task buttons, and loading screens. Built With: Frontend: React, TailwindCSS, ReactFlow Persistence: Browser localStorage Hosting: Netlify
Hi!! By the way, if the project doesn’t work on your end, please just don’t rate it… Anyways, this is Prism! An infinite workspace tool designed to focus your thoughts in a digestible format. I’ve added a lot since the last ship, like accounts, a tutorial, and I’m working on a new dashboard and landing page. I would really appreciate it if you could give me constructive feedback, because it really helps me gauge which features are high-priority and which aren’t. The link is https://prism-beta-beige.vercel.app/ and please enjoy!...
|
1793602473.8238015
|
1793688873.8238015
|
|
39633
|
Skew.io by @Ron | Stardance
|
Ron
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-25T14:28:54Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "An original .io multiplayer game — you etch live circuit traces on a shared board, pulses travel at exactly 1 cell per beat, and you race other players to route pulses into demand nodes before they do. No lobbies, no tutorial, playing within 10 seconds. Server-authoritative lockstep netcode, fully deterministic sim shared between client and server, ~17KB client bundle. Every mechanic is secretly a real engineering problem; clock skew, load balancing, routing congestion, learned by playing, not by being told.", "repo": "https://github.com/ne-Tyr0/Skew.io", "demo": "https://skew-io.onrender.com"}]...
|
[{"post_id": 34602, "ts": "202 [{"post_id": 34602, "ts": "2026-07-25T13:49:04Z", "hours": 1.4875, "text": "Built an .io game where you etch live circuit traces on a shared board and race pulses to score nodes. One rule drives everything: 1 cell = 1 beat. Distance is literally time. No lobbies. No tutorial. Drag your first line in 10 seconds. Server-authoritative, fully deterministic sim, ~17KB client. First devlog (21m logged but had a few more hours into it before I logged)"}]...
|
Title: Skew.io by @Ron | Stardance
Devlogs:
Built Title: Skew.io by @Ron | Stardance
Devlogs:
Built an .io game where you etch live circuit traces on a shared board and race pulses to score nodes. One rule drives everything: 1 cell = 1 beat. Distance is literally time. No lobbies. No tutorial. Drag your first line in 10 seconds. Server-authoritative, fully deterministic sim, ~17KB client. First devlog (21m logged but had a few more hours into it before I logged)
Ships:
An original .io multiplayer game — you etch live circuit traces on a shared board, pulses travel at exactly 1 cell per beat, and you race other players to route pulses into demand nodes before they do. No lobbies, no tutorial, playing within 10 seconds. Server-authoritative lockstep netcode, fully deterministic sim shared between client and server, ~17KB client bundle. Every mechanic is secretly a real engineering problem; clock skew, load balancing, routing congestion, learned by playing, not by being told....
|
1793602475.6393685
|
1793688875.6393685
|
|
38794
|
My own site! by @ishudutta487 | Stardance
|
ishudutta487
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-27T12:30:11Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "made a simple website as far good i could make within 2 hours, instructions were the main challenge for me", "repo": "https://github.com/ishudutta487-png/my-website", "demo": "https://ishudutta487-png.github.io/my-website/"}]...
|
[{"post_id": 35766, "ts": "202 [{"post_id": 35766, "ts": "2026-07-27T12:27:53Z", "hours": 2.2672, "text": "a simple website by me"}]...
|
Title: My own site! by @ishudutta487 | Stardance
Title: My own site! by @ishudutta487 | Stardance
Devlogs:
a simple website by me
Ships:
made a simple website as far good i could make within 2 hours, instructions were the main challenge for me...
|
1793602476.7682867
|
1793688876.7682867
|
|
40358
|
My own site! by @body-35 | Stardance
|
body-35
|
1
|
0.3
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-27T08:28:27Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Wanderly , a modern travel website using HTML, CSS, and JavaScript . It features a responsive layout, destination cards, travel experiences, a gallery, testimonials, a contact form, a newsletter section, and interactive animations such as smooth scrolling, animated statistics, a sticky navigation bar, and dark mode. The most challenging part was designing a clean layout while keeping the website responsive across different screen sizes. Organising the HTML structure and writing the CSS for all the sections also took a lot of work. I’m most proud of creating a polished user interface that feels like a real travel website rather than a simple school project. I also enjoyed adding JavaScript interactions that make the site more engaging. To test the project, simply open the deployed website in your browser. You can navigate through the different sections, interact with the forms, try the dark mode button, scroll through the page to see the animations, and explore the responsive layout on different screen sizes. AI usage: I used ChatGPT as a coding assistant to help generate ideas, structure parts of the HTML/CSS/JavaScript, and explain concepts while I assembled, edited, and integrated the project myself.", "repo": "https://github.com/Body-530/My-Webyy-", "demo": "https://body-530.github.io/My-Webyy-/"}]...
|
[{"post_id": 46439, "ts": "202 [{"post_id": 46439, "ts": "2026-08-13T17:29:26Z", "hours": 0.3036, "text": "I built a website that have some info abt me it has html and some css for styling “ https://body-530.github.io/My-Webyy-/ ”"}, {"post_id": 35838, "ts": "2026-07-27T15:10:12Z", "hours": 0.0, "text": "hey guys I changed the website completely as it was dealing with a lot of problems so yeah u can try the new one for who loves music like me creat ur own!!"}, {"post_id": 35663, "ts": "2026-07-27T08:19:24Z", "hours": 0.0, "text": "ohhh guys the first website so yah I need a little bit support and I am so happy to be among such an amazing adolescens"}]...
|
Title: My own site! by @body-35 | Stardance
Devlo Title: My own site! by @body-35 | Stardance
Devlogs:
ohhh guys the first website so yah I need a little bit support and I am so happy to be among such an amazing adolescens
hey guys I changed the website completely as it was dealing with a lot of problems so yeah u can try the new one for who loves music like me creat ur own!!
I built a website that have some info abt me it has html and some css for styling “ https://body-530.github.io/My-Webyy-/ ”
Ships:
I built Wanderly , a modern travel website using HTML, CSS, and JavaScript . It features a responsive layout, destination cards, travel experiences, a gallery, testimonials, a contact form, a newsletter section, and interactive animations such as smooth scrolling, animated statistics, a sticky navigation bar, and dark mode. The most challenging part was designing a clean layout while keeping the website responsive across different screen sizes. Organising the HTML structure and writing the CSS for all the sections also took a lot of work. I’m most proud of creating a polished user interface that feels like a real travel website rather than a simple school project. I also enjoyed adding JavaScript interactions that make the site more engaging. To test the project, simply open the deployed website in your browser. You can navigate through the different sections, interact with the forms, try the dark mode button, scroll through the page to see the animations, and explore the responsive layout on different screen sizes. AI usage: I used ChatGPT as a coding assistant to help generate ideas, structure parts of the HTML/CSS/JavaScript, and explain concepts while I assembled, edited, and integrated the project myself....
|
1793602478.9285796
|
1793688878.9285796
|
|
33948
|
My own site! by @himanshu-singh7 | Stardance
|
himanshu-singh7
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-31T11:14:01Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i maked an website for my personal projects i dont have used ai but only google search", "repo": "https://github.com/rahul-gound/my-website", "demo": "https://rahul-gound.github.io/my-website/"}]...
|
[{"post_id": 27055, "ts": "202 [{"post_id": 27055, "ts": "2026-07-12T07:55:02Z", "hours": 1.0842, "text": "this is my first website of my personal and i know ui is bad plz suggest how to improve ui"}]...
|
Title: My own site! by @himanshu-singh7 | Stardanc Title: My own site! by @himanshu-singh7 | Stardance
Devlogs:
this is my first website of my personal and i know ui is bad plz suggest how to improve ui
Ships:
i maked an website for my personal projects i dont have used ai but only google search...
|
1793602481.0480316
|
1793688881.0480316
|
|
36504
|
music by @alexxx | Stardance
|
alexxx
|
1
|
1.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-17T18:33:57Z", "hours": 1.0, "multiplier": 2.89, "payout": 3, "blessing": "neutral", "text": "a music website with my fav music", "repo": "https://github.com/TheRealAlexxx/music-website", "demo": "https://music-thingy.vercel.app"}]...
|
[{"post_id": 30199, "ts": "202 [{"post_id": 30199, "ts": "2026-07-17T16:17:35Z", "hours": 0.5386, "text": "moved from just plain html into actually styling it with css. learnt about colours, fonts, spacing, borders, and links. also made the songs clickable so they go to youtube. i also made the background a spotify green!"}, {"post_id": 30187, "ts": "2026-07-17T15:42:04Z", "hours": 0.3508, "text": "made my first (other than little tests) html website!! its a little page about music with my favourite artists, genres and songs. currently looks very basic because it’s just html, but next im gonna learn css and make it actually look nice :D im following the w3schools tutorial for this"}]...
|
Title: music by @alexxx | Stardance
Devlogs:
made Title: music by @alexxx | Stardance
Devlogs:
made my first (other than little tests) html website!! its a little page about music with my favourite artists, genres and songs. currently looks very basic because it’s just html, but next im gonna learn css and make it actually look nice :D im following the w3schools tutorial for this
moved from just plain html into actually styling it with css. learnt about colours, fonts, spacing, borders, and links. also made the songs clickable so they go to youtube. i also made the background a spotify green!
Ships:
a music website with my fav music...
|
1793602482.188305
|
1793688882.188305
|
|
29373
|
Solarium by @vrplays | Stardance
|
vrplays
|
1
|
26.9
|
131
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-10T22:08:23Z", "hours": 13.0, "multiplier": 9.86, "payout": 131, "blessing": "neutral", "text": "Solarium is an operating system built from scratch. This means it isn’t built off ANYTHING. Not Linux, not anything like that, just code. Currently, it’s in an early phase, but as time goes on, more content will be added. Please give this a good rating! I spent a long time getting this to work without bugs. Currently, Solarium features several terminal commands that you can use. It mainly serves to show what the OS is capable of right now. There’s also a couple visual features, like a boot logo and multiple fonts! Please realize that despite the lack of content, I still spent so much time working on this project! As of shipping this, 13 hours of time! There will be more ships in the future, but in the meantime, this is what I have as of right now. Enjoy!", "repo": "https://github.com/VR2011/Solarium/", "demo": "https://github.com/VR2011/Solarium/releases"}]...
|
[{"post_id": 37978, "ts": "202 [{"post_id": 37978, "ts": "2026-07-31T01:55:34Z", "hours": 9.27, "text": "Not an update, but just a devlog. You guys might’ve wondered where I’ve been. I’ve been pretty busy over the past few weeks, having travelled to other states multiple times recently. I wasn’t able to get time to work on the OS, but whenever I do, I spent most of the time getting it to work on my Mac. I’ve spent way too long on this, and I hope it’s over soon. I’ll likely publish an update once I get this fixed. But for now, know that I am still working on this! (However I’ll be gone again in a few weeks once again…) I’m either gonna finish up some terminal features, or move on to a GUI. I’m gonna plan to stay away from hardware support for a bit. In the meantime, enjoy what I have so far! (If you notice, you’ll see that this is the same image as my banner. For some reason my ship got declined because of a new rule(?) where the banner must be the project and not a logo…)"}, {"post_id": 27736, "ts": "2026-07-13T15:42:26Z", "hours": 4.6336, "text": "Version 2.0 I’m back. Seems that my project still hasn’t been shipped yet, but that’s alright. Solarium has gotten a lot of bug fixes, and the fonts now look more polished. I also changed the video display so the output looks much better now! In addition to minor changes, Solarium now works on real hardware! You can help contribute to the OS Support list by going to the repo, and opening a PR with your changes. You can also just ping me in Slack or leave a comment here with the same details, and I can add it. I also added a screenshot showing the OS working on my Chromebook!"}, {"post_id": 26121, "ts": "2026-07-10T18:38:50Z", "hours": 5.4814, "text": "Devlog 1.2 Much longer than the devlogs I’ve sent here. I added a lot more stuff compared to the previous devlog, which was more bugfixes than actual content. There’s now a boot logo that appears for a few seconds before going back to the terminal! In addition, there’s now fonts! You can use the help command for more info. Alongside the actual OS, I’m going to start trying to implement support for actual hardware. It only works on VMs, so real hardware is going to be interesting."}, {"post_id": 24176, "ts": "2026-07-07T16:05:17Z", "hours": 3.9842, "text": "Devlog 1.1 Not gonna lie, this sucked. I spent a long time getting arrow keys to work. Luckily, I was finally able to figure it out. I also changed some stuff backend, but a few things on the front end. Also added this cool thing; the first instance of color! Isn’t that cool? Anyway, I’ll work on new stuff later, maybe some more commands."}, {"post_id": 20397, "ts": "2026-07-01T23:58:11Z", "hours": 3.8125, "text": "Devlog 1.0 Well, this is going to be something. Solarium is an operating system. From scratch. It is not Linux, it is not based off anything else. Right now, it’s just a terminal that has a few commands, and well, that’s pretty much it. What do you expect from a first version? What do you think of this?"}]...
|
Title: Solarium by @vrplays | Stardance
Devlogs:
Title: Solarium by @vrplays | Stardance
Devlogs:
Devlog 1.0 Well, this is going to be something. Solarium is an operating system. From scratch. It is not Linux, it is not based off anything else. Right now, it’s just a terminal that has a few commands, and well, that’s pretty much it. What do you expect from a first version? What do you think of this?
Devlog 1.1 Not gonna lie, this sucked. I spent a long time getting arrow keys to work. Luckily, I was finally able to figure it out. I also changed some stuff backend, but a few things on the front end. Also added this cool thing; the first instance of color! Isn’t that cool? Anyway, I’ll work on new stuff later, maybe some more commands.
Devlog 1.2 Much longer than the devlogs I’ve sent here. I added a lot more stuff compared to the previous devlog, which was more bugfixes than actual content. There’s now a boot logo that appears for a few seconds before going back to the terminal! In addition, there’s now fonts! You can use the help command for more info. Alongside the actual OS, I’m going to start trying to implement support for actual hardware. It only works on VMs, so real hardware is going to be interesting.
Version 2.0 I’m back. Seems that my project still hasn’t been shipped yet, but that’s alright. Solarium has gotten a lot of bug fixes, and the fonts now look more polished. I also changed the video display so the output looks much better now! In addition to minor changes, Solarium now works on real hardware! You can help contribute to the OS Support list by going to the repo, and opening a PR with your changes. You can also just ping me in Slack or leave a comment here with the same details, and I can add it. I also added a screenshot showing the OS working on my Chromebook!
Not an update, but just a devlog. You guys might’ve wondered where I’ve been. I’ve been pretty busy over the past few weeks, having travelled to other states multiple times recently. I wasn’t able to get time to work on the OS, but whenever I do, I spent most of the time getting it to work on my Mac. I’ve spent way too long on this, and I hope it’s over soon. I’ll likely publish an update once I get this fixed. But for now, know that I am still working on this! (However I’ll be gone again in a few weeks once again…) I’m either gonna finish up some terminal features, or move on to a GUI. I’m gonna plan to stay away from hardware support for a bit. In the meantime, enjoy what I have so far! (If you notice, you’ll see that this is the same image as my banner. For some reason my ship got declined because of a new rule(?) where the banner must be the project and not a logo…)
Ships:
Solarium is an operating system built from scratch. This means it isn’t built off ANYTHING. Not Linux, not anything like that, just code. Currently, it’s in an early phase, but as time goes on, more content will be added. Please give this a good rating! I spent a long time getting this to work without bugs. Currently, Solarium features several terminal commands that you can use. It mainly serves to show what the OS is capable of right now. There’s also a couple visual features, like a boot logo and multiple fonts! Please realize that despite the lack of content, I still spent so much time working on this project! As of shipping this, 13 hours of time! There will be more ships in the future, but in the meantime, this is what I have as of right now. Enjoy!...
|
1793602485.078751
|
1793688885.078751
|
|
25750
|
WinBind by @Advay-CMD | Stardance
|
Advay-CMD
|
1
|
40.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-31T18:47:40Z", "hours": 40.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Binds your personalisation to windows for you to bind to windows! Lets you customize windows, make it more candyeye’d and productive. No barriers, exactly how you want windows to be. It uses ONLY Win32 API’s in high performance low-level-coding. It lets you do various functions with Windows, in one simple .conf . It lets you add shortcuts, virtual desktop management, window managment, change various windows 11 settings that are not possible with the Settings or Control Panel.", "repo": "https://github.com/Advay-CMD/WinBind/", "demo": "https://github.com/Advay-CMD/WinBind/releases/tag/v1.0.0"}]...
|
[{"post_id": 38350, "ts": "202 [{"post_id": 38350, "ts": "2026-07-31T18:09:15Z", "hours": 2.1461, "text": "Devlog #7 -> WinBind Final touches are done. Final video clip is done. Final files for release is done. Everything is done and dusted until sparkly clean. It took me time, but here we are. The project is finally ready for production. It already has been useful to me, I use it everyday, and I would like you to do so! WinBind now can be called - The Ultimate Productivity and Customizablity for Win11. I am verry excited, honest. It is my first project, ever on this hackclub! I would love to see people rate it like ~x20 multiplier… or so… Thanks, and try the project out at: https://github.com/Advay-CMD/WinBind/"}, {"post_id": 34165, "ts": "2026-07-24T17:58:06Z", "hours": 4.3417, "text": "Devlog #6 -> WinBind Honestly nothing has happened. Except few polishing, and making the base program called common features Common features can do a looot of things, including enabling animations and also changing the wallpaper and cursor. Fine, not for normal use honest. Only if you are doing LoadConf[]. And yes, background music! How can i forget it? The whole project currently only needs linking and polishing. Thats it. I think 40h, and i am done with this project.(more gif and img)"}, {"post_id": 30558, "ts": "2026-07-18T07:17:11Z", "hours": 8.7881, "text": "Devlog #5 - WinBind I am VERY dilapidated and crumbesome. I hate WINDOWS!! Why does it NOT provide mere basic API’s!! Oh, change global accent? Go to stack overflow, keep viewing for hours not counted as stardust and find NOTHING . Anyway, I have introduced MANY features, mostly rectified the once that where NOT working Now I can also do Startup = [ \"app.exe\" ] Basically add apps like this… and run them when app starts. That’s it. But parsing the thing with a parser(I had to make it) took me time 😭 . It took me more time when I was making keybinds, but Okay. But I had a lot of trouble with this: LoadConf[] Took all my hardcoding to NULL, I had to rewrite a LOT of elements, create some kind of centralisation. OK. Anyway, It WASN’T easy, as you can see I got a Warning to Devlog NOW. Fine, you can see my time ~8h. MAX is 10h. Whatevers. Site is updated. Please check if you want to :) https://advay-cmd.github.io/WinBind [Still in construction, documentation.html is made.] Bi! Meet you soon with a working project(which will take ~thriple of the time done… lets see.)!, DON’T forget to follow me."}, {"post_id": 26772, "ts": "2026-07-11T19:21:03Z", "hours": 4.3978, "text": "Devlog 4 - WinBind Oh my god. I am actually getting bewildered by windows. What a weird OS. Windows is SO bad, it doesn’t expose half the things I need, and very soon I am going to be needing injection pocking up on apps(YES, the same one malwares use! But I am helpless) I am also going to use ‘’‘uxtheme.dll’’’ and others, going to hook, inject custom alg. Might work. Or I might not do at all. Cause Windows is getting on my nerves. The lowlevel coding burns you! Honestly But right now I feel like 😭 Windows!!!!! WHY CAN’T YOU EXPOSE EVERYTHING? Anyway, if I have to draw custom borders, I have 2 plans: Use LayeredWindows(Which CAN’T be used if transparency is on) Inject(Don’t scream Malware at me) Its been a tough time, I really do hope to get x24 multiplier, honestly. Sometimes people should take in account of PAIN and time lost in reading millions of microsoft documentation which is not counted the the time logged 😭 . I just want to know: Am I cooking 🧑🍳 or I am cooked (Also fellas, YES, GITHUB CODE IS NOW UPDATED! GO CHECK, AND COMPILE!) Site is Published, YET not complete: https://advay-cmd.github.io/WinBind/ You can tell me improvements for the website too. For DOCS, go to github, go to WinBind/Docs/md, not all of the md’s are there so you gotta wait. Anyway that’s it. I am really tired so i might not be able to write it like you want me to. (Ninja special: StealFocus is AVAILIBLE! Watch video to see) Anyway, thanks for reviewing. I would like to know yet, am I cooking or getting cooked ."}, {"post_id": 24806, "ts": "2026-07-08T16:39:41Z", "hours": 5.2583, "text": "Devlog #3 -> WinBind HONESTLY At this point, my BRAIN is FRIED! IT IS BOILING! MAN! HOW HARD IT IS TO MAKE A PROJECT? IT IS TOUGH! DOESN’T ANYONE HAVE EXAMS? Honestly, I JUST WANT TO QUIT MY LIFE 😭 Ok, you are not here for my emotional scene. Your here for my devlog. Honestly, I have forgot my name, how much I am working on the computer, probably forgot life; this work is exausting and tiering… I thought I loved coding. Slowly the PAIN is catching up, with me realising WHY adults hate coding. Ok, enough of my distribution on PAIN, lets go to WHAT I DID. I achived to colour(color) to blue, that can be customized. The mod is yet not merged to the official one. This won’t work for Win10, as I use official DwmSetWindowAttribute() function that works ONLY AND ONLY on Windows 11. I HAVE AT LEAST 10 PAGES OF WIN32 DOC OPEN IN MY BROWSER!! 😭 The documentation says it simply: HRESULT DwmSetWindowAttribute( [in] HWND hwnd, [in] DWORD dwAttribute, [in] LPCVOID pvAttribute, [in] DWORD cbAttribute ); Simple enough right? Guess what? WRONG! Error Handling Memory management Conf reader Documentation Faliure Breakpoints and so on. It is still kindda unstable - it crashes when a privlaged window is open, also, it DOESN’T loop, till now. Follow pls, enjoy the beauty(or whatever you want to call. You can say unstable) of my app, till ALL of it’s source code is RELEASED at ONCE. (Meaning, its still not updated. 😕 )(Someone should give stardust for mental un-sanity)"}, {"post_id": 22310, "ts": "2026-07-04T18:24:15Z", "hours": 7.1344, "text": "Devlog #2 -> WinBind I had been focusing too much on c++… I needed rest and I had to remind myself, no software was complete without Documentation. I started creating the website. Though I have created the site on my own(a little elements copied from previous website), it is still in development. Translucentcy has now been divided into .h and .cpp(YET to merge), but good news is that MANY found bugs( ahem , they crashed my PC with BSOD) are ELIMINATED. It works like a charm now. Honestly, for me these two are very important. I work with WinBind everyday, and now I have too becomed customed to it. It is really good application, seriously helpful for me to. Git code has NOT been updated. Don’t bother checking the old code and compling. I will post the newest one sometime else…. This has been the MOST draining week ever. My dream is to get 1,688-1,815 stardust… and so far, this is soo hard a target! Anyway… I will try my best. Follow for making my torture worth it(I am working at midnight and then sleeping because of this!)."}, {"post_id": 19243, "ts": "2026-06-30T14:38:15Z", "hours": 8.175, "text": "Hello there! Welcome to the world of WinBind I have created an app called WinBind . WinBind: Windows binds to your Personalisation Right now I have made the KeyBinder: KeyBinder allows you almost ULTIMATE customizability over what shortcut does, how does it behave and everything else. Right now only 2 features - Move_Switch and Move are implemented. More features will bring - Other shortcuts to do same task (CTRL+ SHIFT + V doing CTRL + V), and execute various commands and apps, by just a shortcut. Also I may add the keyboard remapping function, but its a doubt, windows already has in settings. Anyway, with time, I would implement, window decorations, custom animations and more! I coded this in C++, as I wanted the app to be extremely responsive, and do a delay time for processing to 0.04ms(untested, just an estimate). I also thought, low-level language will be the best at doing this delecate things… and a UI at this early stage is not required. It is really optimized and uses only a whopping MAX of 1.8MB of the memory(RAM)(tested)(Lowest: 0.2MB), running silently while you do your work effortlessly (I spent a LOT of time fixing my little[huge] mistake of overoptimizing). It is hard for me to make overall this project, like the bolders I have faced and got angry at… It took me time to first design the struct of conf, inspired by Hyprland and .lua scripts… It took me a lot of time on pen and paper, before I present this .conf to you. It might look simple, but as things add, if not carefully planned, things will fall from a slide dangerously steep. My second headache was coding the whole thing. I was getting so hallucinated by pointer and win32 api’s, I had no choice but to give this task to AI(though I HAD TO DO AFTER IT GENERATED BOILERPLATE). It was scary to imagine if i would make a mistake and then my computer will crash, probably blaring SegFault. My third headache was the .exe. It was getting blocked by defender, ‘cause it thought my code is a trojan horse malware. After hurdling that, I got WDAC blocking my app. The only workaround was to change filenames,,, Later, I will see signing the .exe. These three were nightmares, and belive me, 3h were easily spent on this with the additional 3h to make the program. Pheww… But I fear that there is harder things to come in my way. I would be very happy if I achieve window decorations/skins. (Stardock, OpenSource WinBind is gonna compete with you, and if I succeed, you WILL lose. OpenSource > Paid Products that StarDock makes). 2: I have also coded the translucentcy function, but that is still in progress to merge with the actual project. Stay Tuned! [Uses 0.1-NIL memory] Technical Stack: CPP code(obviously) Batch Files Till now, I am trying to make this app with no admin privlages required, and will try to keep up(Its not a pleasant sight to the developer when creating a app that doesn’t have admin permissions. I had to write ALL undocumented GUIDS and try them one by one on each computer… Maybe sooner or later I would need admin privlages). Thank you for giving your time to this app, and will see you soon again(Also, watch the video 😊)!"}]...
|
Title: WinBind by @Advay-CMD | Stardance
Devlogs: Title: WinBind by @Advay-CMD | Stardance
Devlogs:
Hello there! Welcome to the world of WinBind I have created an app called WinBind . WinBind: Windows binds to your Personalisation Right now I have made the KeyBinder: KeyBinder allows you almost ULTIMATE customizability over what shortcut does, how does it behave and everything else. Right now only 2 features - Move_Switch and Move are implemented. More features will bring - Other shortcuts to do same task (CTRL+ SHIFT + V doing CTRL + V), and execute various commands and apps, by just a shortcut. Also I may add the keyboard remapping function, but its a doubt, windows already has in settings. Anyway, with time, I would implement, window decorations, custom animations and more! I coded this in C++, as I wanted the app to be extremely responsive, and do a delay time for processing to 0.04ms(untested, just an estimate). I also thought, low-level language will be the best at doing this delecate things… and a UI at this early stage is not required. It is really optimized and uses only a whopping MAX of 1.8MB of the memory(RAM)(tested)(Lowest: 0.2MB), running silently while you do your work effortlessly (I spent a LOT of time fixing my little[huge] mistake of overoptimizing). It is hard for me to make overall this project, like the bolders I have faced and got angry at… It took me time to first design the struct of conf, inspired by Hyprland and .lua scripts… It took me a lot of time on pen and paper, before I present this .conf to you. It might look simple, but as things add, if not carefully planned, things will fall from a slide dangerously steep. My second headache was coding the whole thing. I was getting so hallucinated by pointer and win32 api’s, I had no choice but to give this task to AI(though I HAD TO DO AFTER IT GENERATED BOILERPLATE). It was scary to imagine if i would make a mistake and then my computer will crash, probably blaring SegFault. My third headache was the .exe. It was getting blocked by defender, ‘cause it thought my code is a trojan horse malware. After hurdling that, I got WDAC blocking my app. The only workaround was to change filenames,,, Later, I will see signing the .exe. These three were nightmares, and belive me, 3h were easily spent on this with the additional 3h to make the program. Pheww… But I fear that there is harder things to come in my way. I would be very happy if I achieve window decorations/skins. (Stardock, OpenSource WinBind is gonna compete with you, and if I succeed, you WILL lose. OpenSource > Paid Products that StarDock makes). 2: I have also coded the translucentcy function, but that is still in progress to merge with the actual project. Stay Tuned! [Uses 0.1-NIL memory] Technical Stack: CPP code(obviously) Batch Files Till now, I am trying to make this app with no admin privlages required, and will try to keep up(Its not a pleasant sight to the developer when creating a app that doesn’t have admin permissions. I had to write ALL undocumented GUIDS and try them one by one on each computer… Maybe sooner or later I would need admin privlages). Thank you for giving your time to this app, and will see you soon again(Also, watch the video 😊)!
Devlog #2 -> WinBind I had been focusing too much on c++… I needed rest and I had to remind myself, no software was complete without Documentation. I started creating the website. Though I have created the site on my own(a little elements copied from previous website), it is still in development. Translucentcy has now been divided into .h and .cpp(YET to merge), but good news is that MANY found bugs( ahem , they crashed my PC with BSOD) are ELIMINATED. It works like a charm now. Honestly, for me these two are very important. I work with WinBind everyday, and now I have too becomed customed to it. It is really good application, seriously helpful for me to. Git code has NOT been updated. Don’t bother checking the old code and compling. I will post the newest one sometime else…. This has been the MOST draining week ever. My dream is to get 1,688-1,815 stardust… and so far, this is soo hard a target! Anyway… I will try my best. Follow for making my torture worth it(I am working at midnight and then sleeping because of this!).
Devlog #3 -> WinBind HONESTLY At this point, my BRAIN is FRIED! IT IS BOILING! MAN! HOW HARD IT IS TO MAKE A PROJECT? IT IS TOUGH! DOESN’T ANYONE HAVE EXAMS? Honestly, I JUST WANT TO QUIT MY LIFE 😭 Ok, you are not here for my emotional scene. Your here for my devlog. Honestly, I have forgot my name, how much I am working on the computer, probably forgot life; this work is exausting and tiering… I thought I loved coding. Slowly the PAIN is catching up, with me realising WHY adults hate coding. Ok, enough of my distribution on PAIN, lets go to WHAT I DID. I achived to colour(color) to blue, that can be customized. The mod is yet not merged to the official one. This won’t work for Win10, as I use official DwmSetWindowAttribute() function that works ONLY AND ONLY on Windows 11. I HAVE AT LEAST 10 PAGES OF WIN32 DOC OPEN IN MY BROWSER!! 😭 The documentation says it simply: HRESULT DwmSetWindowAttribute( [in] HWND hwnd, [in] DWORD dwAttribute, [in] LPCVOID pvAttribute, [in] DWORD cbAttribute ); Simple enough right? Guess what? WRONG! Error Handling Memory management Conf reader Documentation Faliure Breakpoints and so on. It is still kindda unstable - it crashes when a privlaged window is open, also, it DOESN’T loop, till now. Follow pls, enjoy the beauty(or whatever you want to call. You can say unstable) of my app, till ALL of it’s source code is RELEASED at ONCE. (Meaning, its still not updated. 😕 )(Someone should give stardust for mental un-sanity)
Devlog 4 - WinBind Oh my god. I am actually getting bewildered by windows. What a weird OS. Windows is SO bad, it doesn’t expose half the things I need, and very soon I am going to be needing injection pocking up on apps(YES, the same one malwares use! But I am helpless) I am also going to use ‘’‘uxtheme.dll’’’ and others, going to hook, inject custom alg. Might work. Or I might not do at all. Cause Windows is getting on my nerves. The lowlevel coding burns you! Honestly But right now I feel like 😭 Windows!!!!! WHY CAN’T YOU EXPOSE EVERYTHING? Anyway, if I have to draw custom borders, I have 2 plans: Use LayeredWindows(Which CAN’T be used if transparency is on) Inject(Don’t scream Malware at me) Its been a tough time, I really do hope to get x24 multiplier, honestly. Sometimes people should take in account of PAIN and time lost in reading millions of microsoft documentation which is not counted the the time logged 😭 . I just want to know: Am I cooking 🧑🍳 or I am cooked (Also fellas, YES, GITHUB CODE IS NOW UPDATED! GO CHECK, AND COMPILE!) Site is Published, YET not complete: https://advay-cmd.github.io/WinBind/ You can tell me improvements for the website too. For DOCS, go to github, go to WinBind/Docs/md, not all of the md’s are there so you gotta wait. Anyway that’s it. I am really tired so i might not be able to write it like you want me to. (Ninja special: StealFocus is AVAILIBLE! Watch video to see) Anyway, thanks for reviewing. I would like to know yet, am I cooking or getting cooked .
Devlog #5 - WinBind I am VERY dilapidated and crumbesome. I hate WINDOWS!! Why does it NOT provide mere basic API’s!! Oh, change global accent? Go to stack overflow, keep viewing for hours not counted as stardust and find NOTHING . Anyway, I have introduced MANY features, mostly rectified the once that where NOT working Now I can also do Startup = [ "app.exe" ] Basically add apps like this… and run them when app starts. That’s it. But parsing the thing with a parser(I had to make it) took me time 😭 . It took me more time when I was making keybinds, but Okay. But I had a lot of trouble with this: LoadConf[] Took all my hardcoding to NULL, I had to rewrite a LOT of elements, create some kind of centralisation. OK. Anyway, It WASN’T easy, as you can see I got a Warning to Devlog NOW. Fine, you can see my time ~8h. MAX is 10h. Whatevers. Site is updated. Please check if you want to :) https://advay-cmd.github.io/WinBind [Still in construction, documentation.html is made.] Bi! Meet you soon with a working project(which will take ~thriple of the time done… lets see.)!, DON’T forget to follow me.
Devlog #6 -> WinBind Honestly nothing has happened. Except few polishing, and making the base program called common features Common features can do a looot of things, including enabling animations and also changing the wallpaper and cursor. Fine, not for normal use honest. Only if you are doing LoadConf[]. And yes, background music! How can i forget it? The whole project currently only needs linking and polishing. Thats it. I think 40h, and i am done with this project.(more gif and img)
Devlog #7 -> WinBind Final touches are done. Final video clip is done. Final files for release is done. Everything is done and dusted until sparkly clean. It took me time, but here we are. The project is finally ready for production. It already has been useful to me, I use it everyday, and I would like you to do so! WinBind now can be called - The Ultimate Productivity and Customizablity for Win11. I am verry excited, honest. It is my first project, ever on this hackclub! I would love to see people rate it like ~x20 multiplier… or so… Thanks, and try the project out at: https://github.com/Advay-CMD/WinBind/
Ships:
Binds your personalisation to windows for you to bind to windows! Lets you customize windows, make it more candyeye’d and productive. No barriers, exactly how you want windows to be. It uses ONLY Win32 API’s in high performance low-level-coding. It lets you do various functions with Windows, in one simple .conf . It lets you add shortcuts, virtual desktop management, window managment, change various windows 11 settings that are not possible with the Settings or Control Panel....
|
1793602486.9479573
|
1793688886.9479573
|
|
30211
|
unisnap by @qb | Stardance
|
qb
|
1
|
15.1
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-03T15:00:26Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "this is unisnap - a lightweight macOS toolbar utility for window management. I made it because it was bothersome to keep rearranging my windows to maximise my productivity, and traditional methods like raycast commands are too slow. So, I’ve merged all the features I want into one, and condensed it into a tiny footprint that fits in the top toolbar. This was basically my first time building a macOS anything in Xcode, so that was certainly challenging. A lot of the times the coordinates weren’t matching; the alignment was offset; and it didn’t quite work how I wanted it. But after many attempts, I’ve finished it, and I’m quite proud of that. In the end, the result was rather polished and I liked it a lot, so I guess that’s great!", "repo": "https://github.com/qubixal/unisnap", "demo": "https://github.com/qubixal/unisnap/releases/tag/v0.2"}]...
|
[{"post_id": 22679, "ts": "202 [{"post_id": 22679, "ts": "2026-07-05T07:21:29Z", "hours": 3.8189, "text": "i swear this is the last devlog even tho i shipped already… v0.2 release Bug Fixes: issues #1 #2 on github #1: wallpaper capture only works for sometimes (due to beta feature) wallpaper capture is currently a beta; it uses NSWorkspace.shared.desktopImageURL(for:) to get the URL for the wallpaper, then prompts access to your folder where the wallpaper is actually stored even with sandbox disabled. This only works for static wallpapers . Apple built-in dynamic / slideshow / video wallpapers will NOT work.the API has also been depreciated since macOS 14. (This also looks incredibly suspicious when it’s just retrieving an image). Fix 1: use CGWindowListCreateImage to take a screenshot of the wallpaper/desktop and then theme from that, but that requires screen capture permissions + couldn’t get it working Fix 2: feature removed in favour of using desktop system accent + light/dark theme. #2: window layouts switch sometimes. fix: profile editor puts row 0 at bottom (based on +/- grid system). but absoluteFrame (LayoutProfile.swift:25) applies row 0 to the top of the screen. switched indexing to be correct way. Theming is now determined by system set accent colour + light/dark theme to avoid requiring any additional permissions. some redundancies removed. New dmg installation background."}, {"post_id": 21868, "ts": "2026-07-04T01:10:08Z", "hours": 0.2764, "text": "Finished up unisnap and the proper README docs (formatting issues previously). You should now be able to follow through on that README and install it for yourself with no problem! A few things worth mentioning that I didn’t get into in my previous devlogs: unisnap just utilises the AXUIElement API, reads the window position/size/title and writes them to match the set layout. it is also that coordinate math that caused most of the pain for me. unisnap was designed to be ultra-compact, taking up the least possible footprint while maximising your productivity. That’s why I decided to put it in your toolbar, so that you can access it anytime without occupying a large window to configure all the settings/profiles etc. The drag-to-create custom profile editor is where the 3727+4 (custom+default) possible layouts number comes from. It is max 1-4 columns × max 1-3 rows, and accounting for every combination + merged cell you get 3731. Wallpaper theming is a beta. It’s not really that big of a deal either as this project has limited UI. Known limitations/bugs include: no multi-monitor support unsigned app (so macOS will quarantine it); there’s a one-line terminal fix in the README. It is available as proper .dmg release (or you can download v0.1 zip version)."}, {"post_id": 21514, "ts": "2026-07-03T14:55:57Z", "hours": 10.8861, "text": "unisnap - a lightweight macOS toolbar utility for window management. now available on github for v0.1 (macOS only…) here -> https://github.com/qubixal/unisnap I wanted to solve a long time problem I had. In Windows 11, there was a set option where dragging the window above the screen could reorganise them into halves/quarters of the screen. This is doable with raycast, but it takes long (manually config each window). So, I made: unisnap! No need to manually config desktop layout! No more manual reconfig required when you suddenly want another app in a different place! Basically fully customisable everything! No AI slop integration / cloud / account / selling your data, 100% open source! There are: 3731 possible custom layouts for you to try! hope this helped anyone? or just me lol"}]...
|
Title: unisnap by @qb | Stardance
Devlogs:
unisna Title: unisnap by @qb | Stardance
Devlogs:
unisnap - a lightweight macOS toolbar utility for window management. now available on github for v0.1 (macOS only…) here -> https://github.com/qubixal/unisnap I wanted to solve a long time problem I had. In Windows 11, there was a set option where dragging the window above the screen could reorganise them into halves/quarters of the screen. This is doable with raycast, but it takes long (manually config each window). So, I made: unisnap! No need to manually config desktop layout! No more manual reconfig required when you suddenly want another app in a different place! Basically fully customisable everything! No AI slop integration / cloud / account / selling your data, 100% open source! There are: 3731 possible custom layouts for you to try! hope this helped anyone? or just me lol
Finished up unisnap and the proper README docs (formatting issues previously). You should now be able to follow through on that README and install it for yourself with no problem! A few things worth mentioning that I didn’t get into in my previous devlogs: unisnap just utilises the AXUIElement API, reads the window position/size/title and writes them to match the set layout. it is also that coordinate math that caused most of the pain for me. unisnap was designed to be ultra-compact, taking up the least possible footprint while maximising your productivity. That’s why I decided to put it in your toolbar, so that you can access it anytime without occupying a large window to configure all the settings/profiles etc. The drag-to-create custom profile editor is where the 3727+4 (custom+default) possible layouts number comes from. It is max 1-4 columns × max 1-3 rows, and accounting for every combination + merged cell you get 3731. Wallpaper theming is a beta. It’s not really that big of a deal either as this project has limited UI. Known limitations/bugs include: no multi-monitor support unsigned app (so macOS will quarantine it); there’s a one-line terminal fix in the README. It is available as proper .dmg release (or you can download v0.1 zip version).
i swear this is the last devlog even tho i shipped already… v0.2 release Bug Fixes: issues #1 #2 on github #1: wallpaper capture only works for sometimes (due to beta feature) wallpaper capture is currently a beta; it uses NSWorkspace.shared.desktopImageURL(for:) to get the URL for the wallpaper, then prompts access to your folder where the wallpaper is actually stored even with sandbox disabled. This only works for static wallpapers . Apple built-in dynamic / slideshow / video wallpapers will NOT work.the API has also been depreciated since macOS 14. (This also looks incredibly suspicious when it’s just retrieving an image). Fix 1: use CGWindowListCreateImage to take a screenshot of the wallpaper/desktop and then theme from that, but that requires screen capture permissions + couldn’t get it working Fix 2: feature removed in favour of using desktop system accent + light/dark theme. #2: window layouts switch sometimes. fix: profile editor puts row 0 at bottom (based on +/- grid system). but absoluteFrame (LayoutProfile.swift:25) applies row 0 to the top of the screen. switched indexing to be correct way. Theming is now determined by system set accent colour + light/dark theme to avoid requiring any additional permissions. some redundancies removed. New dmg installation background.
Ships:
this is unisnap - a lightweight macOS toolbar utility for window management. I made it because it was bothersome to keep rearranging my windows to maximise my productivity, and traditional methods like raycast commands are too slow. So, I’ve merged all the features I want into one, and condensed it into a tiny footprint that fits in the top toolbar. This was basically my first time building a macOS anything in Xcode, so that was certainly challenging. A lot of the times the coordinates weren’t matching; the alignment was offset; and it didn’t quite work how I wanted it. But after many attempts, I’ve finished it, and I’m quite proud of that. In the end, the result was rather polished and I liked it a lot, so I guess that’s great!...
|
1793602492.0330942
|
1793688892.0330942
|
|
10142
|
leefy's personal site by @leefymoon | Stardanc leefy's personal site by @leefymoon | Stardance...
|
leefymoon
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-27T13:51:11Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i continued the making of my personal site! a few challenging things were finding features to add, how to design pages, and what to write blogs on! but through three years of having this site i’ve enjoyed making it. :]", "repo": "https://git.leefymoons-room.net/leefy/leefymoons-room", "demo": "https://leefymoons-room.net"}]...
|
[{"post_id": 35797, "ts": "202 [{"post_id": 35797, "ts": "2026-07-27T13:46:28Z", "hours": 1.1017, "text": "made a readme! go check it out if you so please ^^"}, {"post_id": 3813, "ts": "2026-06-06T21:20:12Z", "hours": 0.4611, "text": "made a new blog post! (after two months lol) https://leefymoons-room.net/blog.html#7"}]...
|
Title: leefy's personal site by @leefymoon | S Title: leefy's personal site by @leefymoon | Stardance
Devlogs:
made a new blog post! (after two months lol) https://leefymoons-room.net/blog.html#7
made a readme! go check it out if you so please ^^
Ships:
i continued the making of my personal site! a few challenging things were finding features to add, how to design pages, and what to write blogs on! but through three years of having this site i’ve enjoyed making it. :]...
|
1793602495.3629391
|
1793688895.3629391
|
|
24683
|
Bad Apple!! but it runs on your screen by @aloyak Bad Apple!! but it runs on your screen by @aloyak | Stardance...
|
aloyak
|
1
|
14.0
|
236
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-30T18:12:29Z", "hours": 14.0, "multiplier": 16.39, "payout": 236, "blessing": "neutral", "text": "I made a postprocessing layer that runs on top of your screen in real time. I’ve used it to create my own version of the Bad Apple videoclip, but this tool is a lot more powerful!! It gives you access to fast video decoding, a screen buffer and the huge potential of GLSL shaders to allow you to create any effect you want while still keeping the input layer active! Built on pure C and its currently only available on Linux (only supports X11 backend as thats what is used to manually create the screen buffer, maybe ill add wayland in the future) Hope you like it!!", "repo": "https://github.com/aloyak/badapple", "demo": "https://github.com/aloyak/badapple/releases/tag/0.5"}]...
|
[{"post_id": 37645, "ts": "202 [{"post_id": 37645, "ts": "2026-07-30T15:11:19Z", "hours": 2.1592, "text": "BAD APPLE!! (NOW PUBLISHED) the video is published on youtube!!!!! Check it out: https://youtu.be/a1_1RXaRt74 . Please go like it so it get viral! What was done? I’ve improved the performance by only collecting each window information’s only when they are marked as changed, this improved performance so much that i was able to run some games while using it Added a simple command line argument parser for quick settings and path changes Ive also added some cool C math optimizations like approximating a division by 255 with a cool bit shift trick! (i felt like a genius programmer) What needs to be improved There’s a couple things that still run in the CPU that could be pretty much moved to the GPU if they cause a bottle neck, maybe in the future?? Need to make sure that new/closed or resized windows are accounted and properly updated, this is the next step, ive tried already but this adds a lot of lag and i didnt like how it was looking, but maybe now ill try again! PD: PLEASE go watch the final version: https://youtu.be/a1_1RXaRt74 Btw, im probably gonna be shipping shortly, maybe after next devlog?"}, {"post_id": 36952, "ts": "2026-07-29T11:26:31Z", "hours": 3.3367, "text": "BAD APPLE!! This is the first decent version! I still need to fix a couple things but finally using your computer with this on wont give you an epileptic attack. Note that what you see in the video is very simple, this program i made is a lot more powerful (this is not only for bad apple videos but a general postprocessing realtime layer on your screen!!) New stuff! Completely moved the project from GLFW to SDL3! Fixed the feeding loop bug: refactored the capturer so instead of taking a screenshot every frame it now loops with X11’s backend through all the windows and reconstructs the screen buffer manually (this took a lot of docs reading time), the result is really good but has limitations that i will list below Appart from the effect you see, ive also coded 2 other shaders that also use this video Published the github repo and added both a license and a readme file Current limitations This only works on Linux with X11 backend, if you use wayland, windows or mac this should not work at all, adding support to new platforms would be interesting, but before i need to fix the next issue The current system that reads all windows and stitches them together to form a screen buffer doesnt take into consideration new or closed windows and doesnt update their position or resizing… this will probably be the next thing to do but ill have to check how the performances doing. Of course i will be making a video for youtube to showcase this, this was the main goal of the project either way lmao"}, {"post_id": 36606, "ts": "2026-07-28T20:29:11Z", "hours": 3.6217, "text": "BAD APPLE!! the demo video contains flashing colors!! Huge progress!!!!! i made this work finally! well not quite yet but ive finally have something to show you Theres still some issues you can clearly see but i do know why this is happening Why it currently looks broken? In order to get the screen buffer i need to use X11 (currently, maybe ill port it to use other different APIs) which means that this is pretty much like taking a screenshot every frame but very fast because its the GPU. The problem is that we are re-feeding the previous output to the new one, so it breaks the original colors over time What have i done X11 based system to retrieve the screen’s image and pass it to the shader as another texture! Performance was improved a bit although it generally doesnt really matter (maybe it will when using videos over 1080p, havent tried tho) Fixed A SINGLE memory leak, woops Next steps! Port the project to SDL3, i always start my projects with GLFW and always forget how much i dislike GLFW, it has so many tools and features missing that SDL has, so ill probably port it to it, it shouldnt be very hard"}, {"post_id": 36312, "ts": "2026-07-28T10:55:26Z", "hours": 2.6367, "text": "BAD APPLE!! I’ve been adding the basic OpenGL implementations for a very simple texture and shader “classes” (theres no such thing as a class in C of course). This works kind of like a refresher course for me as I already though I was proficent enough with opengl, maybe once i ship this i might try to re do this but using vulkan instead. What have i added? The shader class, which reads the glsl source files (not pre-compiled) and compiles them in real time, not very fancy right now A texture class that updates in real time to what frame was given by the video section, correctly set to linear color correction and uses rgb24 Now i will add a super simple quad implementation where the shader will render to, on top of the screen buffer What i still need to figure out I dont think that OpenGL can get the screen buffer with the pixel colors of whats behind the screen, even when the glfw window is entirely transparent, I’ll do some more research to see what to do I’ve thought that this program might actually be a lot more useful that what im currently making it look. In the end you can quickly change the glsl shader to have completely different results and also upload any kind of video you want… PD: the window you see in the video is green just so you can see it at all, but in the final version it will be completely transparent"}, {"post_id": 36050, "ts": "2026-07-27T21:48:03Z", "hours": 2.6347, "text": "Bad Apple!! Hey!!! I’m making this quick project that i though would be fun to try and have a bit of a rest from my main project, and i think it started nicely! What is this project? I’m making one of those fun version for the original Bad Apple! music videoclip that got viral long ago (original: https://www.youtube.com/watch?v=FtutLA63Cp8 ). I want it to be very original, at least I dont think it has been done already… I cant really tell you what the video is about yet, but I can tell you that im building it with pure C and openGL… What have i done so far? Project setup: create a basic cmake project that uses glad and glfw to create a special window and render basic stuff on top of it Added a video reader that gets each frame of the video at the correct time based on the time elapsed I started this project making it run in CUDA, but I had a better idea. Then i decided to go with the graphics programming route: i thought about using vulkan but its way too hard to setup for such a small project, even worse considering im using C, not C++. I will have to learn vulkan at some point tho note: the video is the base for the whole program"}]...
|
Title: Bad Apple!! but it runs on your screen by @ Title: Bad Apple!! but it runs on your screen by @aloyak | Stardance
Devlogs:
Bad Apple!! Hey!!! I’m making this quick project that i though would be fun to try and have a bit of a rest from my main project, and i think it started nicely! What is this project? I’m making one of those fun version for the original Bad Apple! music videoclip that got viral long ago (original: https://www.youtube.com/watch?v=FtutLA63Cp8 ). I want it to be very original, at least I dont think it has been done already… I cant really tell you what the video is about yet, but I can tell you that im building it with pure C and openGL… What have i done so far? Project setup: create a basic cmake project that uses glad and glfw to create a special window and render basic stuff on top of it Added a video reader that gets each frame of the video at the correct time based on the time elapsed I started this project making it run in CUDA, but I had a better idea. Then i decided to go with the graphics programming route: i thought about using vulkan but its way too hard to setup for such a small project, even worse considering im using C, not C++. I will have to learn vulkan at some point tho note: the video is the base for the whole program
BAD APPLE!! I’ve been adding the basic OpenGL implementations for a very simple texture and shader “classes” (theres no such thing as a class in C of course). This works kind of like a refresher course for me as I already though I was proficent enough with opengl, maybe once i ship this i might try to re do this but using vulkan instead. What have i added? The shader class, which reads the glsl source files (not pre-compiled) and compiles them in real time, not very fancy right now A texture class that updates in real time to what frame was given by the video section, correctly set to linear color correction and uses rgb24 Now i will add a super simple quad implementation where the shader will render to, on top of the screen buffer What i still need to figure out I dont think that OpenGL can get the screen buffer with the pixel colors of whats behind the screen, even when the glfw window is entirely transparent, I’ll do some more research to see what to do I’ve thought that this program might actually be a lot more useful that what im currently making it look. In the end you can quickly change the glsl shader to have completely different results and also upload any kind of video you want… PD: the window you see in the video is green just so you can see it at all, but in the final version it will be completely transparent
BAD APPLE!! the demo video contains flashing colors!! Huge progress!!!!! i made this work finally! well not quite yet but ive finally have something to show you Theres still some issues you can clearly see but i do know why this is happening Why it currently looks broken? In order to get the screen buffer i need to use X11 (currently, maybe ill port it to use other different APIs) which means that this is pretty much like taking a screenshot every frame but very fast because its the GPU. The problem is that we are re-feeding the previous output to the new one, so it breaks the original colors over time What have i done X11 based system to retrieve the screen’s image and pass it to the shader as another texture! Performance was improved a bit although it generally doesnt really matter (maybe it will when using videos over 1080p, havent tried tho) Fixed A SINGLE memory leak, woops Next steps! Port the project to SDL3, i always start my projects with GLFW and always forget how much i dislike GLFW, it has so many tools and features missing that SDL has, so ill probably port it to it, it shouldnt be very hard
BAD APPLE!! This is the first decent version! I still need to fix a couple things but finally using your computer with this on wont give you an epileptic attack. Note that what you see in the video is very simple, this program i made is a lot more powerful (this is not only for bad apple videos but a general postprocessing realtime layer on your screen!!) New stuff! Completely moved the project from GLFW to SDL3! Fixed the feeding loop bug: refactored the capturer so instead of taking a screenshot every frame it now loops with X11’s backend through all the windows and reconstructs the screen buffer manually (this took a lot of docs reading time), the result is really good but has limitations that i will list below Appart from the effect you see, ive also coded 2 other shaders that also use this video Published the github repo and added both a license and a readme file Current limitations This only works on Linux with X11 backend, if you use wayland, windows or mac this should not work at all, adding support to new platforms would be interesting, but before i need to fix the next issue The current system that reads all windows and stitches them together to form a screen buffer doesnt take into consideration new or closed windows and doesnt update their position or resizing… this will probably be the next thing to do but ill have to check how the performances doing. Of course i will be making a video for youtube to showcase this, this was the main goal of the project either way lmao
BAD APPLE!! (NOW PUBLISHED) the video is published on youtube!!!!! Check it out: https://youtu.be/a1_1RXaRt74 . Please go like it so it get viral! What was done? I’ve improved the performance by only collecting each window information’s only when they are marked as changed, this improved performance so much that i was able to run some games while using it Added a simple command line argument parser for quick settings and path changes Ive also added some cool C math optimizations like approximating a division by 255 with a cool bit shift trick! (i felt like a genius programmer) What needs to be improved There’s a couple things that still run in the CPU that could be pretty much moved to the GPU if they cause a bottle neck, maybe in the future?? Need to make sure that new/closed or resized windows are accounted and properly updated, this is the next step, ive tried already but this adds a lot of lag and i didnt like how it was looking, but maybe now ill try again! PD: PLEASE go watch the final version: https://youtu.be/a1_1RXaRt74 Btw, im probably gonna be shipping shortly, maybe after next devlog?
Ships:
I made a postprocessing layer that runs on top of your screen in real time. I’ve used it to create my own version of the Bad Apple videoclip, but this tool is a lot more powerful!! It gives you access to fast video decoding, a screen buffer and the huge potential of GLSL shaders to allow you to create any effect you want while still keeping the input layer active! Built on pure C and its currently only available on Linux (only supports X11 backend as thats what is used to manually create the screen buffer, maybe ill add wayland in the future) Hope you like it!!...
|
1793602497.317246
|
1793688897.317246
|
|
28221
|
terra-orbit by @AhmedKhaledAhmed | Stardance
|
AhmedKhaledAhmed
|
1
|
20.0
|
293
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-19T18:05:32Z", "hours": 20.0, "multiplier": 14.57, "payout": 293, "blessing": "neutral", "text": "TerraOrbit is an open-source AI space harness that brings NASA’s data to your terminal and browser. Think of it as Claude Code, but for space.", "repo": "https://github.com/theawakener0/terra-orbit", "demo": "https://www.npmjs.com/package/terra-orbit"}]...
|
[{"post_id": 31356, "ts": "202 [{"post_id": 31356, "ts": "2026-07-19T17:57:28Z", "hours": 4.9686, "text": "The Last DevLog"}, {"post_id": 26475, "ts": "2026-07-11T09:18:10Z", "hours": 4.7906, "text": "I have built the webUI, and TUI using vercel ai sdk components, also add error handling in webUI. I will keep refining the AI loop, and add more error handling"}, {"post_id": 23318, "ts": "2026-07-06T06:11:34Z", "hours": 6.8219, "text": "Hi, I am currently building the subagents for the TerraOrbit harness, also built the main Terra agent, and built all the tools for the harness."}, {"post_id": 19559, "ts": "2026-06-30T21:43:53Z", "hours": 2.1964, "text": "I built a wrapper around NASA APIs and integrated with the TUI built via OpenTUI. Now, I need to build the AI harness, connect the wrapper with it , and improve the TUI."}, {"post_id": 18440, "ts": "2026-06-29T16:24:16Z", "hours": 1.3161, "text": "Trying OpenTUI"}]...
|
Title: terra-orbit by @AhmedKhaledAhmed | Stardanc Title: terra-orbit by @AhmedKhaledAhmed | Stardance
Devlogs:
Trying OpenTUI
I built a wrapper around NASA APIs and integrated with the TUI built via OpenTUI. Now, I need to build the AI harness, connect the wrapper with it , and improve the TUI.
Hi, I am currently building the subagents for the TerraOrbit harness, also built the main Terra agent, and built all the tools for the harness.
I have built the webUI, and TUI using vercel ai sdk components, also add error handling in webUI. I will keep refining the AI loop, and add more error handling
The Last DevLog
Ships:
TerraOrbit is an open-source AI space harness that brings NASA’s data to your terminal and browser. Think of it as Claude Code, but for space....
|
1793602498.4869425
|
1793688898.4869425
|
|
51962
|
My awesome macropad! by @Caymanjones | Stardance
|
Caymanjones
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Caymanjones | Star Title: My awesome macropad! by @Caymanjones | Stardance...
|
1793602501.3292584
|
1794466501.3292584
|
|
11501
|
My first slack bot! by @MyNose | Stardance
|
MyNose
|
1
|
1.0
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T21:13:17Z", "hours": 1.0, "multiplier": 1.04, "payout": 2, "blessing": "neutral", "text": "I just made my first slack bot! This bot has three different commands which each allowed me to explore different ways of using the slack/bolt package The first command is /mk-quote [category] which responds with a random quote for a given category. This command utilizes different quotes APIs and chooses the API based on the category given. This route allowed me to explore working with Axios and sending the data as a response. The second command is /mk-animal-photo which returns an image of a random animal (cat, duck, or dog). This route also takes advantage of different APIs (with Axios), but the main thing is that it is able to send an image as an output. Through this command, I learned how to use the blocks argument for the respond method, allowing me to send images as outputs. Finally, I created the /mk-latest-announcement command which simply reads the latest message from the announcements channel and returns that as the output. This may seem simple at first, but I ran into multiple issues with scopes with this command, allowing me to better understand the level of the scopes and what scopes are used with reading the public channel v.s direct DMs. I am very proud of having built my first ever slack bot and creating these pretty cool commands with it. I am excited to see if this can inspire others in any way to explore more creative and fun ways to use the slack/bolt package :) All details about using the bot are listed in the github README.", "repo": "https://github.com/mkmkaksl/StarDance-SlackBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0B90T7NJ5Q"}]...
|
[{"post_id": 4512, "ts": "2026 [{"post_id": 4512, "ts": "2026-06-07T21:01:47Z", "hours": 1.4889, "text": "Just finished my first slack bot! I added three different commands into the bot, which allowed me to explore a few different capabilities of the slack bolt api. /mk-quote [category]: allows you to get random quote for a category. This allowed me to try out different quotes apis and work with axios /mk-animal-photo: allows you to get random photo/gif of a random animal (dog, duck, cat). This allowed me to learn about blocks as an argument for respond, allowing me to send images in a chat /mk-latest-announcement: reads the latest announcement in the announcements channel and reports it to you. This allowed me to learn about chat reading capabilities and more about the importance of scopes"}]...
|
Title: My first slack bot! by @MyNose | Stardance
Title: My first slack bot! by @MyNose | Stardance
Devlogs:
Just finished my first slack bot! I added three different commands into the bot, which allowed me to explore a few different capabilities of the slack bolt api. /mk-quote [category]: allows you to get random quote for a category. This allowed me to try out different quotes apis and work with axios /mk-animal-photo: allows you to get random photo/gif of a random animal (dog, duck, cat). This allowed me to learn about blocks as an argument for respond, allowing me to send images in a chat /mk-latest-announcement: reads the latest announcement in the announcements channel and reports it to you. This allowed me to learn about chat reading capabilities and more about the importance of scopes
Ships:
I just made my first slack bot! This bot has three different commands which each allowed me to explore different ways of using the slack/bolt package The first command is /mk-quote [category] which responds with a random quote for a given category. This command utilizes different quotes APIs and chooses the API based on the category given. This route allowed me to explore working with Axios and sending the data as a response. The second command is /mk-animal-photo which returns an image of a random animal (cat, duck, or dog). This route also takes advantage of different APIs (with Axios), but the main thing is that it is able to send an image as an output. Through this command, I learned how to use the blocks argument for the respond method, allowing me to send images as outputs. Finally, I created the /mk-latest-announcement command which simply reads the latest message from the announcements channel and returns that as the output. This may seem simple at first, but I ran into multiple issues with scopes with this command, allowing me to better understand the level of the scopes and what scopes are used with reading the public channel v.s direct DMs. I am very proud of having built my first ever slack bot and creating these pretty cool commands with it. I am excited to see if this can inspire others in any way to explore more creative and fun ways to use the slack/bolt package :) All details about using the bot are listed in the github README....
|
1793602502.7751915
|
1793688902.7751915
|
|
41809
|
My own site! by @nova_ | Stardance
|
nova_
|
1
|
2.31
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-30T15:16:01Z", "hours": 2.0, "multiplier": 1.16, "payout": 0, "blessing": "neutral", "text": "I made my own portfolio website! It was challenging to figure out how to create the icons for my links at the bottom (and find the right font for everything).", "repo": "https://github.com/Avi823/novawebsite", "demo": "https://avi823.github.io/novawebsite/"}]...
|
[{"post_id": 37706, "ts": "202 [{"post_id": 37706, "ts": "2026-07-30T16:44:04Z", "hours": 0.3125, "text": "Added some embeds, more text, and links to my profiles! (also changed the font cuz my friend didnt like it 😭 )"}, {"post_id": 37440, "ts": "2026-07-30T05:48:08Z", "hours": 1.945, "text": "so uh my old project got deleted so those are my old hours alr thank you"}]...
|
Title: My own site! by @nova_ | Stardance
Devlogs Title: My own site! by @nova_ | Stardance
Devlogs:
so uh my old project got deleted so those are my old hours alr thank you
Added some embeds, more text, and links to my profiles! (also changed the font cuz my friend didnt like it 😭 )
Ships:
I made my own portfolio website! It was challenging to figure out how to create the icons for my links at the bottom (and find the right font for everything)....
|
1793602503.9120233
|
1793688903.9120233
|
|
13470
|
OpenCalc by @cory_pearl | Stardance
|
cory_pearl
|
1
|
4.33
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-04T15:30:21Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a graphing calculator with an ESP32. The firmware is done and I just finished a desaign of the hardware after many months and am ready to order! It is a little out of my budget so I am trying to apply for this grant. This is my first ever PCB so I am very eager to order. I hope you like what you see and support me!", "repo": "https://github.com/CoryPearl/opencalc", "demo": "https://corypearl.github.io/opencalc/blog.html"}]...
|
[{"post_id": 41143, "ts": "202 [{"post_id": 41143, "ts": "2026-08-05T05:11:41Z", "hours": 0.3308, "text": "I updated some firmware to work with a newly designed, more power efficent button matrix."}, {"post_id": 40787, "ts": "2026-08-04T15:24:31Z", "hours": 4.1258, "text": "I’ve worked on the PCB"}]...
|
Title: OpenCalc by @cory_pearl | Stardance
Devlog Title: OpenCalc by @cory_pearl | Stardance
Devlogs:
I’ve worked on the PCB
I updated some firmware to work with a newly designed, more power efficent button matrix.
Ships:
I made a graphing calculator with an ESP32. The firmware is done and I just finished a desaign of the hardware after many months and am ready to order! It is a little out of my budget so I am trying to apply for this grant. This is my first ever PCB so I am very eager to order. I hope you like what you see and support me!...
|
1793602505.0502377
|
1793688905.0502377
|
|
28229
|
Website by @skyFonix | Stardance
|
skyFonix
|
2
|
44.11
|
471
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-11T18:07:52Z", "hours": 31.0, "multiplier": 15.38, "payout": 471, "blessing": "neutral", "text": "Lots of changes were made Everything that was static before, is now rendered dynamically from a database! Added a dashboard where I can add projects, upload assets, upload images and edit all of the about information. For the gallery I added a tagging system that can be updated from the dashboard. The site also implements exif data storage, so I anyone can view the camera, lens and settings used to make the photo. There is also a description section for notes. The gallery is render in a style similar to unsplash, the site is divided into columns, which are dinamically added and destroyed, based on the viewport width. Each image displayed keeps it’s original aspect ratio.", "repo": "https://github.com/FonixPython/main-site", "demo": "https://skyfonix.cigoria.eu/"}, {"ship_num": 2, "ts": "2026-08-03T15:32:38Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my own personal website!", "repo": "https://github.com/FonixPython/main-site", "demo": "https://skyfonix.cigoria.eu/"}]...
|
[{"post_id": 78791, "ts": "202 [{"post_id": 78791, "ts": "2026-10-11T16:40:32Z", "hours": 8.1092, "text": "Dashboard redesign! I got fed up with the old design as it was quite uncomfortable to use tbh, everything was layed out vertically, so it felt pretty cramped, so I changed it to a sidebar design! I also replaced most of the inline editing stuff, so creating and editing projects now happen in modals. Uploading and tagging photographs also moved to a modal with real time suggestions too!"}, {"post_id": 45297, "ts": "2026-08-11T17:40:23Z", "hours": 1.0622, "text": "Even though I said I’ll just deploy, I added mass uploads, deployed, and then started filling the site with content! The next major ship is right around the corner!"}, {"post_id": 45164, "ts": "2026-08-11T14:07:42Z", "hours": 2.7383, "text": "Image viewer, yay! I just need to get this whole thing to prod now."}, {"post_id": 44795, "ts": "2026-08-10T20:10:28Z", "hours": 3.7419, "text": "New devlog Things I added: Added the gallery page to the website’s public part with an image display section similar to the one on unsplash.(Mine’s a bit worse, but it’s mine) I also implemented tag based filtering! Also added a friendlier navigation panel for mobile users! Next up: A way to view the image in big in full resolution, I already designed it in figma , so now I just need to implement it! Code base and assets cleanup. Deployment and ship! :)"}, {"post_id": 44055, "ts": "2026-08-09T15:59:50Z", "hours": 2.2181, "text": "Added not too good looking, but functional controls for the dashboard for the gallery feature. I think I’ll redesign the whole page someday, but that won’t be today."}, {"post_id": 43905, "ts": "2026-08-09T10:56:27Z", "hours": 2.3664, "text": "Added the backend side of things for the gallery!"}, {"post_id": 41819, "ts": "2026-08-06T08:32:35Z", "hours": 2.0781, "text": "Added uploads to the site, so I don’t have to rely on external services for assets"}, {"post_id": 41333, "ts": "2026-08-05T14:14:17Z", "hours": 6.415, "text": "Backend updates: Authentication works now Adding projects to the backend and displaying them also works perfectly Added ability to edit the website title, about text, socials, and email"}, {"post_id": 40960, "ts": "2026-08-04T20:27:13Z", "hours": 10.2986, "text": "Making this devlog cause I have to I feel useless :( I wasted so much time on this project today it’s not even funny. 8 hours or so currently, and not even half done with a single very simple feature, I’m usually much much more efficient, I almost gave up on the whole thing a good couple of times, anyways here is a screenshot from the dashboard in it’s current state. I promise the next devlog will actually be a worthy one!"}, {"post_id": 39948, "ts": "2026-08-03T08:54:57Z", "hours": 1.3614, "text": "Finished with the about section, also added a footer!"}, {"post_id": 39685, "ts": "2026-08-02T20:26:20Z", "hours": 3.2778, "text": "Decided on writing my personal, mostly static website in React, because I’ve never used it so I wanted to get a little practice with it! I’m currently making an about section and then I’ll submit it since it qualifies for the personal site, mission, once I submit it I’ll begin working on actual features like an image gallery for my photography and a blogging system, also plan to migrate the project from being static to having their own place in a database which I can edit from a dashboard and stuff. What I’m done with so far: Topbar with navigation Hero section with an animated welcome message Projects section with some projects already placed into it"}]...
|
Title: Website by @skyFonix | Stardance
Devlogs:
Title: Website by @skyFonix | Stardance
Devlogs:
Decided on writing my personal, mostly static website in React, because I’ve never used it so I wanted to get a little practice with it! I’m currently making an about section and then I’ll submit it since it qualifies for the personal site, mission, once I submit it I’ll begin working on actual features like an image gallery for my photography and a blogging system, also plan to migrate the project from being static to having their own place in a database which I can edit from a dashboard and stuff. What I’m done with so far: Topbar with navigation Hero section with an animated welcome message Projects section with some projects already placed into it
Finished with the about section, also added a footer!
Making this devlog cause I have to I feel useless :( I wasted so much time on this project today it’s not even funny. 8 hours or so currently, and not even half done with a single very simple feature, I’m usually much much more efficient, I almost gave up on the whole thing a good couple of times, anyways here is a screenshot from the dashboard in it’s current state. I promise the next devlog will actually be a worthy one!
Backend updates: Authentication works now Adding projects to the backend and displaying them also works perfectly Added ability to edit the website title, about text, socials, and email
Added uploads to the site, so I don’t have to rely on external services for assets
Added the backend side of things for the gallery!
Added not too good looking, but functional controls for the dashboard for the gallery feature. I think I’ll redesign the whole page someday, but that won’t be today.
New devlog Things I added: Added the gallery page to the website’s public part with an image display section similar to the one on unsplash.(Mine’s a bit worse, but it’s mine) I also implemented tag based filtering! Also added a friendlier navigation panel for mobile users! Next up: A way to view the image in big in full resolution, I already designed it in figma , so now I just need to implement it! Code base and assets cleanup. Deployment and ship! :)
Image viewer, yay! I just need to get this whole thing to prod now.
Even though I said I’ll just deploy, I added mass uploads, deployed, and then started filling the site with content! The next major ship is right around the corner!
Dashboard redesign! I got fed up with the old design as it was quite uncomfortable to use tbh, everything was layed out vertically, so it felt pretty cramped, so I changed it to a sidebar design! I also replaced most of the inline editing stuff, so creating and editing projects now happen in modals. Uploading and tagging photographs also moved to a modal with real time suggestions too!
Ships:
I made my own personal website!
Lots of changes were made Everything that was static before, is now rendered dynamically from a database! Added a dashboard where I can add projects, upload assets, upload images and edit all of the about information. For the gallery I added a tagging system that can be updated from the dashboard. The site also implements exif data storage, so I anyone can view the camera, lens and settings used to make the photo. There is also a description section for notes. The gallery is render in a style similar to unsplash, the site is divided into columns, which are dinamically added and destroyed, based on the viewport width. Each image displayed keeps it’s original aspect ratio....
|
1793602507.6569777
|
1793688907.6569777
|
|
38499
|
FieldSim by @sircheetodust | Stardance
|
sircheetodust
|
1
|
53.13
|
959
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-08T00:10:33Z", "hours": 48.0, "multiplier": 16.79, "payout": 959, "blessing": "neutral", "text": "This is FieldSimulator(or for short FieldSim) It is a recreation of the FRC 2026 Rebuilt game in unity, heavily inspired by MoSimulator and xRC Simulator. It is fully open source and is made modular so people can make custom robots. The most difficult part about making this was probably getting the robot to intake and shoot well. This is my first time ever attempting a unity project this large so this was difficult. The robot would pop and sometimes just explode, so I abandoned a physics based hopper system and made a simple static hopper system where the ball would just be moved to a set position with collision disabled. Then when shooting, the balls collision would be reenabled and the ball would be shot from the robot. Here is the trailer for the game: https://www.youtube.com/watch?v=iRqO79tCtu4 Here is the download page for the game, if you are not familiar with the FRC rebuilt season, I would take a look at the docs. https://thecheetoman.github.io/FieldSim/", "repo": "https://github.com/thecheetoman/FieldSim", "demo": "https://thecheetoman.github.io/FieldSim/"}]...
|
[{"post_id": 60548, "ts": "202 [{"post_id": 60548, "ts": "2026-09-02T23:20:06Z", "hours": 2.4025, "text": "2658 Σ-Motion 85% completed! I had robotics yesterday, so I decided to work on this again. Everything such as the intake, ball system, turret, and drivetrain are set up. Audio remains as the final thing to be tweaked as it does sound like a very high pitched lawn mower ."}, {"post_id": 58367, "ts": "2026-08-30T19:28:29Z", "hours": 2.7294, "text": "Swerve and my own teams robot? Yep you read that right. I wrote a very bad swerve script that works. I also acquired the least broken cad of my FRC teams robot. I optimized from about 60 mil vertices to about 4.8 million(ty decimate modifier). Ill try my best to finish this robot, and add swerve to other robots(9126 and 9450)"}, {"post_id": 42980, "ts": "2026-08-08T00:00:20Z", "hours": 0.6333, "text": "Worked on trailer for shipping Heres a random part of the trailer"}, {"post_id": 42916, "ts": "2026-08-07T21:38:23Z", "hours": 1.3656, "text": "Fieldsim 1.0.0 is ready! The first version of this project is nearly ready. The download page is up to date and the modding documentation has been completed. Project will not be shipped yet as I will make a trailer. I did not compile for all OSs"}, {"post_id": 42798, "ts": "2026-08-07T18:17:05Z", "hours": 2.2897, "text": "#Website update! I made some modifications to the design on the home page to make it easier to see the text in the center. I wrote nearly half of the documentatoin for adding robots!"}, {"post_id": 42321, "ts": "2026-08-07T00:06:03Z", "hours": 1.3683, "text": "FieldSim documentation and guide website underway! I made a simple static html website inside a subfolder of the repo. Setting up github actions took about 30 minutes . Turns out github servers are slower than they used to be. I also made a simple documentation page and put in some basic info about this project. I kinda stole a lot of styling from a previous project."}, {"post_id": 42205, "ts": "2026-08-06T20:22:24Z", "hours": 0.5511, "text": "Final update to the game, onto the website! I finally finished the base for FieldSimulator. I am now going to work on a website with documentation for modding and a well made download page!"}, {"post_id": 42155, "ts": "2026-08-06T19:19:03Z", "hours": 0.5422, "text": "Minor update to Silver Hawks robot I added sound effects to it and a basic indexer sound effect system. I also fixed a major bug where sometimes fuel scored in the hub just disappears(i genuinely dont know how this even happened in the first place) The new indexer SFX system plays as long as the robot is enabled, and it gets a bit louder when you shoot. Added this to make silver hawks robot feel more alive."}, {"post_id": 42130, "ts": "2026-08-06T18:37:15Z", "hours": 3.1192, "text": "Main menu with settings credits and game launching! I finally undertook the process of making the menu. Unity makes it really easy to make UI but getting graphics settings to work took a while. When I first implemented changing graphics settings, the outcome is the complete opposite. If you choose the Horrendous preset, you get maxed out settings and vice versa. I fixed this by reordering options. I also added fullscreen as a toggle and a resolutions dropdown. I also modified the gamemanager and the menu to allow for loading a robot from the main menu. It works by saving your robot index to a playerprefs, and gamemanager loads that corresponding robot. The scripts for camera management and robot enabling and disabling are all modular, so everything works smoothly!"}, {"post_id": 41590, "ts": "2026-08-05T21:42:59Z", "hours": 2.8306, "text": "New robot! I added the SilverHawks, 9126. Adding this robot was kind of difficult. For starters, the CAD was too high fidelity, with every single screw and bolt set up. I had to remove all of them and I had to make my own bumpers for this.(which had flipped normals ). I also had to adjust the way turret and hood aiming worked. These were previously locked to only modify the z axis of the gameobjects. I had to write methods to choose a new axis. I also had to write a system for sliding hoppers. I am going to work on a menu, then make a website for this game. The website will have a simple robot tutorial."}, {"post_id": 41370, "ts": "2026-08-05T15:21:35Z", "hours": 1.0736, "text": "Illegal scoring penalties implemented I added a system in the gamemanager to detect if the player isnt in their alliance side. If they score while they aren’t, a heavy penalty is added to reds score."}, {"post_id": 41028, "ts": "2026-08-04T23:05:25Z", "hours": 2.6914, "text": "Turret robot nearly done! 9450 is almost done with its implementation into Fieldsim. I added a working automatic aligning turret and hood. This didn’t work initially, some values had to be fine tuned to ensure turret accuracy. The robot can shoot at the hub, and pass both left and right. This turned out pretty good and I hope to keep going Please put FRC team suggestions in comments(better if cad is released)"}, {"post_id": 40782, "ts": "2026-08-04T15:14:36Z", "hours": 1.8464, "text": "Another robot? yea! I decided to work on adding 9450. Their robot would be pretty easy to frankenstein on to a tank drive, which I did in blender. Currently it does absolutely nothing, so stay tuned!"}, {"post_id": 40385, "ts": "2026-08-03T21:06:15Z", "hours": 3.7106, "text": "Major Rebuilt progress! Devlog vid since it was too large: https://youtu.be/8LqqLZqSy14 I am almost done getting Rebuilt fully implemented! This took a lot longer than expected. I wrote scripts to handle scoring, hub lights, and heavily modified the gamemanager. i am so bad at driving 😭"}, {"post_id": 39689, "ts": "2026-08-02T20:32:39Z", "hours": 2.6922, "text": "“welcome to rebuilt, presented by haas” I finally finished implementing the real comp field! It is complete with fuel in the depot, and neutral zone(I haven’t decided what to do about the outpost yet). I set up the robot and all collision. All I need to do is program the actual robot game and UI, and this would be a good, somewhat functional game!"}, {"post_id": 39191, "ts": "2026-08-01T23:58:17Z", "hours": 1.0622, "text": "FMS implementation under way! I worked on modifying most of my scripts to work with the gamemanager. This allows robot enabling and disabling, which makes the game more realistic! I also made a script which actually makes the RSL(robot status light) strobe when the robot is deactivated, and stay on when the robot is activated! I am going to import normal rebuilt playing field soon so I can make the robot game work!"}, {"post_id": 39115, "ts": "2026-08-01T20:29:18Z", "hours": 1.3039, "text": "More audio and shooting improvements Quick update, I am gonna take it easy this weekend with working on this. I added sound effects for the drivetrain and when fuel hits the hub. I also added a QoL improvement. When you start shooting, the robot stops moving, making it easier to shoot and stay in place for accuracy."}, {"post_id": 38543, "ts": "2026-08-01T00:28:40Z", "hours": 2.6458, "text": "Audio, Camera follow, and new bumper! I added a dynamic audio system to the spinning shaft system. It plays audio from an audio source and adjusts its pitch based on the shaft’s rpm. In addition to this, I added events that can trigger functions in other scripts when the shaft reaches max speed and spools down. I also wrote a 3rd person camera follower, it uses tags on the player to make it easy to implement in other robots! I also remodeled the front bumper of the robot in blender. The original one looked kinda bad since the bevels were not matching with the rest of the bumpers.(screenshots included!)"}, {"post_id": 38359, "ts": "2026-07-31T18:16:16Z", "hours": 3.1653, "text": "Somewhat working kitbot! In the past 3 hrs of development, I wrote a not physics based intaking and hopper system. I also wrote a very simple shooting method. Intake The previous intake system I made(not devlogged), relied on a bunch of physics. The end result was pretty realistic, but buggy. When fuel was intaked, it would try to occupy the outtake zone of the robot, if there was already fuel there, the robot would “pop” and explode. This new system completly disables fuel physics and teleports fuel to preset positions. It isn’t as realistic, but its less buggy, and leads to less framerate drops! Shooting I added a basic shooter. It takes fuel from the 0th slot in the hopper, shoots it, and then cycles the fuel in the hopper. The shooting is pretty unrealistic compared to the real kitbot. It shoots too high and too far. With a bit of tuning though, this should be fixed. i still need to add collision to the field elements, i keep forgetting 😭"}, {"post_id": 37932, "ts": "2026-07-30T23:14:41Z", "hours": 0.6072, "text": "Quick materials update All of the materials from onshape look kinda dull(look at the field for reference). I updated the materials, might need to adjust bumper material since it is too strong."}, {"post_id": 37867, "ts": "2026-07-30T20:50:12Z", "hours": 2.7006, "text": "Drivable kitbot, Animated intake shafts, and Fuel! This devlog is gonna be a long one. I finished the tank drivetrain along with animated wheels. I also began to add spinning-ness to the intake. I also made the fuel. The drivetrain I finished writing the movement script and set up all of the wheels. I also spent some time tuning physics values to attempt to recreate a somewhat realistic tank drive. Animated spinny thingys I created an easy to implement script, which allows you to bind a key to shaft, and make it spin however fast you want it to! Fuel Added fuel some things still need collision, so dont mind me driving through the hub"}, {"post_id": 37688, "ts": "2026-07-30T16:11:25Z", "hours": 0.7639, "text": "ever seen a tank drive do wheelies? neither have i! Tank drive is working out way better, I didn’t even ask AI for help with this!"}, {"post_id": 37635, "ts": "2026-07-30T14:50:52Z", "hours": 2.1769, "text": "Quick announcement Swerve is beginning to be a problem. I am not that experience with unity so swerve ends up flying around most of the time. For this project, I think I might drop swerve entirely, and just make tank drive and throw the kitbot in. Sorry to have to announce this =("}, {"post_id": 37350, "ts": "2026-07-30T00:21:10Z", "hours": 1.3839, "text": "Dev log 2 of Fieldsim redo What did i do? I wrote a basic swerve controller, it allows you to drive the robot around and it even has field oriented driving! I also imported the test field that you might have seen at competitions for robot testing. Side notes: The old mesh for the robot was kinda(extremely) unoptimized. So i replaced it with cubes. Check the screenshot for wireframe view."}, {"post_id": 37252, "ts": "2026-07-29T20:23:28Z", "hours": 0.3333, "text": "i forgor to set up hackatime…. I forgot to set up hackatime, its been like an hr of getting this drivetrain parented properly. Now I can move on to writing a basic movement script. Then i can go through other FRC team’s swerve code and steal logic for wheel rotation. I also need to get a “gyro” working. welp, see ya next time!"}, {"post_id": 37192, "ts": "2026-07-29T18:39:35Z", "hours": 1.4667, "text": "Restarting field sim =( I feel kinda conflicted, with using mosimbuilder for this project. Im kinda stealing their work, so im going to write this from scratch now!"}, {"post_id": 35476, "ts": "2026-07-26T22:47:40Z", "hours": 1.5761, "text": "i made this lil guy, his name is greg"}, {"post_id": 34170, "ts": "2026-07-24T18:11:27Z", "hours": 1.2439, "text": "3128 added! Only took like 3 redos =D Has working intake, shooter, auto align. Not sure how climb worked, so I did not implement .t(didnt really see narwhals using it that much either)"}, {"post_id": 34104, "ts": "2026-07-24T16:11:59Z", "hours": 1.0, "text": "Dev Log #2 Today I tried doing a web build, which did not turn out great. You could not see anything, so I fixed that by adjusting MSAA settings. I am starting my first CAD robot. 3128(im doing the sd districts alliance) intake lookin a bit goofy. Still needs a lot of work before it the robot is finished. After this I plan to add 2102 Comment FRC team suggestions to see your robot added(cad would be rlly tuff)"}, {"post_id": 33642, "ts": "2026-07-23T18:33:43Z", "hours": 1.4303, "text": "Dev Log #1 Today i spent my time optimizing MoSimBuilder. Went from 9 fps -> 30 fps(my laptop kinda bad) I also added my team’s robot. Comment your team number if you want your robot added…"}]...
|
Title: FieldSim by @sircheetodust | Stardance
Dev Title: FieldSim by @sircheetodust | Stardance
Devlogs:
Dev Log #1 Today i spent my time optimizing MoSimBuilder. Went from 9 fps -> 30 fps(my laptop kinda bad) I also added my team’s robot. Comment your team number if you want your robot added…
Dev Log #2 Today I tried doing a web build, which did not turn out great. You could not see anything, so I fixed that by adjusting MSAA settings. I am starting my first CAD robot. 3128(im doing the sd districts alliance) intake lookin a bit goofy. Still needs a lot of work before it the robot is finished. After this I plan to add 2102 Comment FRC team suggestions to see your robot added(cad would be rlly tuff)
3128 added! Only took like 3 redos =D Has working intake, shooter, auto align. Not sure how climb worked, so I did not implement .t(didnt really see narwhals using it that much either)
i made this lil guy, his name is greg
Restarting field sim =( I feel kinda conflicted, with using mosimbuilder for this project. Im kinda stealing their work, so im going to write this from scratch now!
i forgor to set up hackatime…. I forgot to set up hackatime, its been like an hr of getting this drivetrain parented properly. Now I can move on to writing a basic movement script. Then i can go through other FRC team’s swerve code and steal logic for wheel rotation. I also need to get a “gyro” working. welp, see ya next time!
Dev log 2 of Fieldsim redo What did i do? I wrote a basic swerve controller, it allows you to drive the robot around and it even has field oriented driving! I also imported the test field that you might have seen at competitions for robot testing. Side notes: The old mesh for the robot was kinda(extremely) unoptimized. So i replaced it with cubes. Check the screenshot for wireframe view.
Quick announcement Swerve is beginning to be a problem. I am not that experience with unity so swerve ends up flying around most of the time. For this project, I think I might drop swerve entirely, and just make tank drive and throw the kitbot in. Sorry to have to announce this =(
ever seen a tank drive do wheelies? neither have i! Tank drive is working out way better, I didn’t even ask AI for help with this!
Drivable kitbot, Animated intake shafts, and Fuel! This devlog is gonna be a long one. I finished the tank drivetrain along with animated wheels. I also began to add spinning-ness to the intake. I also made the fuel. The drivetrain I finished writing the movement script and set up all of the wheels. I also spent some time tuning physics values to attempt to recreate a somewhat realistic tank drive. Animated spinny thingys I created an easy to implement script, which allows you to bind a key to shaft, and make it spin however fast you want it to! Fuel Added fuel some things still need collision, so dont mind me driving through the hub
Quick materials update All of the materials from onshape look kinda dull(look at the field for reference). I updated the materials, might need to adjust bumper material since it is too strong.
Somewhat working kitbot! In the past 3 hrs of development, I wrote a not physics based intaking and hopper system. I also wrote a very simple shooting method. Intake The previous intake system I made(not devlogged), relied on a bunch of physics. The end result was pretty realistic, but buggy. When fuel was intaked, it would try to occupy the outtake zone of the robot, if there was already fuel there, the robot would “pop” and explode. This new system completly disables fuel physics and teleports fuel to preset positions. It isn’t as realistic, but its less buggy, and leads to less framerate drops! Shooting I added a basic shooter. It takes fuel from the 0th slot in the hopper, shoots it, and then cycles the fuel in the hopper. The shooting is pretty unrealistic compared to the real kitbot. It shoots too high and too far. With a bit of tuning though, this should be fixed. i still need to add collision to the field elements, i keep forgetting 😭
Audio, Camera follow, and new bumper! I added a dynamic audio system to the spinning shaft system. It plays audio from an audio source and adjusts its pitch based on the shaft’s rpm. In addition to this, I added events that can trigger functions in other scripts when the shaft reaches max speed and spools down. I also wrote a 3rd person camera follower, it uses tags on the player to make it easy to implement in other robots! I also remodeled the front bumper of the robot in blender. The original one looked kinda bad since the bevels were not matching with the rest of the bumpers.(screenshots included!)
More audio and shooting improvements Quick update, I am gonna take it easy this weekend with working on this. I added sound effects for the drivetrain and when fuel hits the hub. I also added a QoL improvement. When you start shooting, the robot stops moving, making it easier to shoot and stay in place for accuracy.
FMS implementation under way! I worked on modifying most of my scripts to work with the gamemanager. This allows robot enabling and disabling, which makes the game more realistic! I also made a script which actually makes the RSL(robot status light) strobe when the robot is deactivated, and stay on when the robot is activated! I am going to import normal rebuilt playing field soon so I can make the robot game work!
“welcome to rebuilt, presented by haas” I finally finished implementing the real comp field! It is complete with fuel in the depot, and neutral zone(I haven’t decided what to do about the outpost yet). I set up the robot and all collision. All I need to do is program the actual robot game and UI, and this would be a good, somewhat functional game!
Major Rebuilt progress! Devlog vid since it was too large: https://youtu.be/8LqqLZqSy14 I am almost done getting Rebuilt fully implemented! This took a lot longer than expected. I wrote scripts to handle scoring, hub lights, and heavily modified the gamemanager. i am so bad at driving 😭
Another robot? yea! I decided to work on adding 9450. Their robot would be pretty easy to frankenstein on to a tank drive, which I did in blender. Currently it does absolutely nothing, so stay tuned!
Turret robot nearly done! 9450 is almost done with its implementation into Fieldsim. I added a working automatic aligning turret and hood. This didn’t work initially, some values had to be fine tuned to ensure turret accuracy. The robot can shoot at the hub, and pass both left and right. This turned out pretty good and I hope to keep going Please put FRC team suggestions in comments(better if cad is released)
Illegal scoring penalties implemented I added a system in the gamemanager to detect if the player isnt in their alliance side. If they score while they aren’t, a heavy penalty is added to reds score.
New robot! I added the SilverHawks, 9126. Adding this robot was kind of difficult. For starters, the CAD was too high fidelity, with every single screw and bolt set up. I had to remove all of them and I had to make my own bumpers for this.(which had flipped normals ). I also had to adjust the way turret and hood aiming worked. These were previously locked to only modify the z axis of the gameobjects. I had to write methods to choose a new axis. I also had to write a system for sliding hoppers. I am going to work on a menu, then make a website for this game. The website will have a simple robot tutorial.
Main menu with settings credits and game launching! I finally undertook the process of making the menu. Unity makes it really easy to make UI but getting graphics settings to work took a while. When I first implemented changing graphics settings, the outcome is the complete opposite. If you choose the Horrendous preset, you get maxed out settings and vice versa. I fixed this by reordering options. I also added fullscreen as a toggle and a resolutions dropdown. I also modified the gamemanager and the menu to allow for loading a robot from the main menu. It works by saving your robot index to a playerprefs, and gamemanager loads that corresponding robot. The scripts for camera management and robot enabling and disabling are all modular, so everything works smoothly!
Minor update to Silver Hawks robot I added sound effects to it and a basic indexer sound effect system. I also fixed a major bug where sometimes fuel scored in the hub just disappears(i genuinely dont know how this even happened in the first place) The new indexer SFX system plays as long as the robot is enabled, and it gets a bit louder when you shoot. Added this to make silver hawks robot feel more alive.
Final update to the game, onto the website! I finally finished the base for FieldSimulator. I am now going to work on a website with documentation for modding and a well made download page!
FieldSim documentation and guide website underway! I made a simple static html website inside a subfolder of the repo. Setting up github actions took about 30 minutes . Turns out github servers are slower than they used to be. I also made a simple documentation page and put in some basic info about this project. I kinda stole a lot of styling from a previous project.
#Website update! I made some modifications to the design on the home page to make it easier to see the text in the center. I wrote nearly half of the documentatoin for adding robots!
Fieldsim 1.0.0 is ready! The first version of this project is nearly ready. The download page is up to date and the modding documentation has been completed. Project will not be shipped yet as I will make a trailer. I did not compile for all OSs
Worked on trailer for shipping Heres a random part of the trailer
Swerve and my own teams robot? Yep you read that right. I wrote a very bad swerve script that works. I also acquired the least broken cad of my FRC teams robot. I optimized from about 60 mil vertices to about 4.8 million(ty decimate modifier). Ill try my best to finish this robot, and add swerve to other robots(9126 and 9450)
2658 Σ-Motion 85% completed! I had robotics yesterday, so I decided to work on this again. Everything such as the intake, ball system, turret, and drivetrain are set up. Audio remains as the final thing to be tweaked as it does sound like a very high pitched lawn mower .
Ships:
This is FieldSimulator(or for short FieldSim) It is a recreation of the FRC 2026 Rebuilt game in unity, heavily inspired by MoSimulator and xRC Simulator. It is fully open source and is made modular so people can make custom robots. The most difficult part about making this was probably getting the robot to intake and shoot well. This is my first time ever attempting a unity project this large so this was difficult. The robot would pop and sometimes just explode, so I abandoned a physics based hopper system and made a simple static hopper system where the ball would just be moved to a set position with collision disabled. Then when shooting, the balls collision would be reenabled and the ball would be shot from the robot. Here is the trailer for the game: https://www.youtube.com/watch?v=iRqO79tCtu4 Here is the download page for the game, if you are not familiar with the FRC rebuilt season, I would take a look at the docs. https://thecheetoman.github.io/FieldSim/...
|
1793602509.10429
|
1793688909.10429
|
|
41842
|
TumorTwin by @adhamyg | Stardance
|
adhamyg
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-30T18:44:46Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "PHASE I I built TTwin (Tumor Twin), a novel mathematical framework for representing cancer as an evolving system instead of a static prediction problem. Rather than predicting whether a patient will relapse, TTwin models the tumor as a dynamic distribution of cellular phenotypes that continuously changes under treatment. The biggest challenge was designing an entirely new mathematical representation that could realistically simulate tumor evolution, therapy interactions, and patient adaptation while remaining computationally tractable. I’m most proud that the framework introduces several original concepts—including measure-based tumor states, composable therapy operators, adaptive data assimilation, and counterfactual treatment simulation—that were designed from first principles rather than extending an existing AI model. Phase I focuses on establishing and validating this theoretical foundation on controlled synthetic experiments, providing the basis for later validation on real patient data.", "repo": "https://github.com/Adham-ElGabry/TTWIN", "demo": "https://ttwin-final.vercel.app/"}]...
|
[{"post_id": 37790, "ts": "202 [{"post_id": 37790, "ts": "2026-07-30T18:40:32Z", "hours": 9.6964, "text": "Just got done with phase 1! TTwin is a next-generation adaptive cancer digital twin that continuously simulates how an individual patient’s tumor evolves under different therapies, updating itself with new clinical evidence to optimize future treatment rather than merely predicting risk."}]...
|
Title: TumorTwin by @adhamyg | Stardance
Devlogs: Title: TumorTwin by @adhamyg | Stardance
Devlogs:
Just got done with phase 1! TTwin is a next-generation adaptive cancer digital twin that continuously simulates how an individual patient’s tumor evolves under different therapies, updating itself with new clinical evidence to optimize future treatment rather than merely predicting risk.
Ships:
PHASE I I built TTwin (Tumor Twin), a novel mathematical framework for representing cancer as an evolving system instead of a static prediction problem. Rather than predicting whether a patient will relapse, TTwin models the tumor as a dynamic distribution of cellular phenotypes that continuously changes under treatment. The biggest challenge was designing an entirely new mathematical representation that could realistically simulate tumor evolution, therapy interactions, and patient adaptation while remaining computationally tractable. I’m most proud that the framework introduces several original concepts—including measure-based tumor states, composable therapy operators, adaptive data assimilation, and counterfactual treatment simulation—that were designed from first principles rather than extending an existing AI model. Phase I focuses on establishing and validating this theoretical foundation on controlled synthetic experiments, providing the basis for later validation on real patient data....
|
1793602510.4394379
|
1793688910.4394379
|
|
29380
|
My own site! by @sreerangshijoy3 | Stardance
|
sreerangshijoy3
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-02T06:37:14Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have created a personal digital portfolio, commonly referred to as a “digital garden.” It is a responsive, single-page website built with HTML5 and Tailwind CSS, designed to showcase your profile, tech stack, and contact information.", "repo": "https://github.com/sreerangshijoy3-cloud/Personal-portfolio", "demo": "https://personalsite-iota-mauve.vercel.app/"}]...
|
[{"post_id": 39285, "ts": "202 [{"post_id": 39285, "ts": "2026-08-02T04:53:34Z", "hours": 0.2231, "text": "I am working on my personal portfolio"}]...
|
Title: My own site! by @sreerangshijoy3 | Stardanc Title: My own site! by @sreerangshijoy3 | Stardance
Devlogs:
I am working on my personal portfolio
Ships:
I have created a personal digital portfolio, commonly referred to as a “digital garden.” It is a responsive, single-page website built with HTML5 and Tailwind CSS, designed to showcase your profile, tech stack, and contact information....
|
1793602513.0259323
|
1793688913.0259323
|
|
37764
|
FRC 2024 Bot (For Demo) by @Ash-ioL | Stardance
|
Ash-ioL
|
1
|
23.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-12T18:20:08Z", "hours": 23.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This project is my contributions to my frc team’s code. For people who are not familiar with frc, it’s a robotics program and the coding here is a lot about systems integration and less about low level functionalities. Since this is a shared project, I cannot make this as a expected stardance project. And since frc projects aren’t really simple to package adn run, I have included a demo video of the simulation instead, where i demonstrate the robot staying inside the bounds, admin control disabling features, and a custom path generation utility. My biggest challenges were just navigating through the way yagsl (swerve library) works and sometimes i had to work around it even. I’m proud mainly of the things I was able to learn and familiarize myself with like custom path generation and stuff.", "repo": "https://github.com/980-Programming-Team/jpl-day-2026", "demo": "https://www.youtube.com/watch?v=DxJYWbZnAdQ"}]...
|
[{"post_id": 45591, "ts": "202 [{"post_id": 45591, "ts": "2026-08-12T05:47:31Z", "hours": 8.8761, "text": "Shipping! With this robot’s demo purpose out of the way and a bunch of working features developed in it, I think it’s a good closing point for this project, for now. Changes / features added: Collision disabling Robot voltage and other useful loggin Added a boundaries system to kepe the robot in a rectangle boundary Added a precise 2 point angle command to make the robot alignment easy to reset the boundary Boundary override Kid mode to disable admin buttons Challenges: Pigeon problems with the real robot. I checked everything on my side with yagsl and stuff, and I cna read values from the imu. Its just that yagsl isnt able to get it somehow so ive created like some tests to see if i can manually put in the value. But it would’ve been nice if it worked in a straightforward way. Honestly to be super real, shipping this is gonna be a bit hard. since this isnt like a simple project you can try in your browser, and this isnt entirely my creation, I’m gonna try my best to only share what ive implemented. I’ll try to make a good demo video without boring yall out or confusing yall. Signing off, Ash-ioL"}, {"post_id": 36552, "ts": "2026-07-28T19:00:20Z", "hours": 10.2564, "text": "ALMOST READY FOR DEMO First, I want to apoligize for how many hours I’m logging with this single devlog. I just wanted to get to a good stopping point so that I can share my full completed journey for each feature. (Unfortunately, this last problem took me nearly 4 hours to fix). I can hopefully make up for this by making this devlog long, detailed, and thorough. Completed: Added a lot of configs such as robot mass, width, module locations, gear ratios, etc. I overrode the yagsl deadband and applied my own Adjusted and fiddled with tiny things here and there Added code that can switch your alliance during auto in code. Zeroed the encoders (took a while) and funny story, we tried putting in the value from phoenix tuner x thinking it was radians but it was degrees, so we used a radians to degrees conversion, but that just messed everythign up, when after like hours we found out that it was in rotations (0 to 1) and not radians. Fixed some controller axis inversion that happened in a specific alliance Tried to get the project to build by figuring out what the right dpendencies are Put in debugging code to try and fix the problem with reading pigeon values Followfunctioncommand and bounds system I didn’t record time for this but I also helped prepare a backup roborio, did testing in sim and in the real robot, zeroed encoders, measured weight, and did other stuff with the real robot. I also made a controller guide which wasnt recorded. FollowFunctionCommand (not tested yet however) What this basically does is it takes a Function<double, double> and it converts the x value to time based on a ratio, and it take the output as the y value, and generates a custom autonomous trajectory that traces the function. The reason I decided to do this is for a learning experience in autonomous paths, pathplanner, and the pipelien and all that. Some struggles I had are that I started off with the completely wrong approach, treating it like a lazy command that goes to eahc spot as the time comes. But then I made it so that it instantly generates the path and it just runs the path, which is just a lot smoother and better. Boundary System Our demo space is a square area so I added a safety feature that keeps teh robot inside the space even if someone tries to drive it out. I also added overrides that someone on our demo team can use if it becomes finicky. Since we added vision, I had to code a setup command (which was honestly the hardest part of doing this). I made it so that you pick two setpoints to make the robot face straight (which is more accurate than mannually aiming straight), then to go ot a spot on the boundary which the odometry resets to. I also added telemtry so the driver can see where the robot thinks its at and work with that. The biggest issues I faced with this is because of some rules with how you use the SwerveInputStream type by yagsl. I removed the deadband thinking you didn’t need it since I had my own manual one, but it was required to make the robot face a certain heading. This problem took me a stupid amount of time to solve. I had to do human binary search through all my commits to see what couldve changed and what went wrong and allat. TODO The highest priority is to get the real robot working and the pigeon values read. I won’t be recording hours for that though since its a hassle. Without the pigeon (imu), half my other features are useless. Set up the driverstation in our main laptop Finish and test the grapher finally remove the custom joystick overhead since well be using windows Add kid mode so peopel who want to try driving don’t accidentally mess with our setup buttons Maybe some other stuff I forgot to include. Anyways thanks for reading my devlog, as long and boring as it is. Signing off, Ash-ioL"}, {"post_id": 33360, "ts": "2026-07-23T06:36:59Z", "hours": 2.2881, "text": "I am sleepy so short devlog Quick summary: Added AdvantageKit Made sure the swerve 2d simulation works Changed default settings in custom joystick Measured some things in the robot and filled in configs Added current and speed limit Fixed the deadband Fixed som broken config values (not sure if this counts) but I also spent some time figuring out whats wrong with the can loop in the hardware (not counted in the 2h) Plans: Test everything on the real robot Maybe add a fancy auto Maybe add a normal controller for people to try out, and an override controller Idk more ideas forming Signing off, Ash-ioL"}, {"post_id": 31961, "ts": "2026-07-20T19:43:54Z", "hours": 1.4981, "text": "Devlog 1: First “Build Successful” At the point where I spent 90 minutes on this, we hit a nice milestone where we saw a beautiful build successful. However after this point I spend a couple more hours on this which I wasn’t able to record unfortunately. To make sure the changes aligns with the time spent, I will not be considering the changes from the lost hours in this devlog. First attempt: The first attempt involved reviving the 2024 code as is, but we found that this was getting us nowhere as we faced gradle issues, vendordep issues, and we wre just having a hard time to get it to work. Solution: I decided to start a new project all together and redo the yagsl ocnfigurations, and use the old code as a reference. Completed: Build Successful Yagsl Configured Vendordeps issues gone Future goals Get simulation working collect robot properties maybe prepare a nice auto limit speed and make kid friendly Signing off, Ash-ioL"}]...
|
Title: FRC 2024 Bot (For Demo) by @Ash-ioL | Stard Title: FRC 2024 Bot (For Demo) by @Ash-ioL | Stardance
Devlogs:
Devlog 1: First “Build Successful” At the point where I spent 90 minutes on this, we hit a nice milestone where we saw a beautiful build successful. However after this point I spend a couple more hours on this which I wasn’t able to record unfortunately. To make sure the changes aligns with the time spent, I will not be considering the changes from the lost hours in this devlog. First attempt: The first attempt involved reviving the 2024 code as is, but we found that this was getting us nowhere as we faced gradle issues, vendordep issues, and we wre just having a hard time to get it to work. Solution: I decided to start a new project all together and redo the yagsl ocnfigurations, and use the old code as a reference. Completed: Build Successful Yagsl Configured Vendordeps issues gone Future goals Get simulation working collect robot properties maybe prepare a nice auto limit speed and make kid friendly Signing off, Ash-ioL
I am sleepy so short devlog Quick summary: Added AdvantageKit Made sure the swerve 2d simulation works Changed default settings in custom joystick Measured some things in the robot and filled in configs Added current and speed limit Fixed the deadband Fixed som broken config values (not sure if this counts) but I also spent some time figuring out whats wrong with the can loop in the hardware (not counted in the 2h) Plans: Test everything on the real robot Maybe add a fancy auto Maybe add a normal controller for people to try out, and an override controller Idk more ideas forming Signing off, Ash-ioL
ALMOST READY FOR DEMO First, I want to apoligize for how many hours I’m logging with this single devlog. I just wanted to get to a good stopping point so that I can share my full completed journey for each feature. (Unfortunately, this last problem took me nearly 4 hours to fix). I can hopefully make up for this by making this devlog long, detailed, and thorough. Completed: Added a lot of configs such as robot mass, width, module locations, gear ratios, etc. I overrode the yagsl deadband and applied my own Adjusted and fiddled with tiny things here and there Added code that can switch your alliance during auto in code. Zeroed the encoders (took a while) and funny story, we tried putting in the value from phoenix tuner x thinking it was radians but it was degrees, so we used a radians to degrees conversion, but that just messed everythign up, when after like hours we found out that it was in rotations (0 to 1) and not radians. Fixed some controller axis inversion that happened in a specific alliance Tried to get the project to build by figuring out what the right dpendencies are Put in debugging code to try and fix the problem with reading pigeon values Followfunctioncommand and bounds system I didn’t record time for this but I also helped prepare a backup roborio, did testing in sim and in the real robot, zeroed encoders, measured weight, and did other stuff with the real robot. I also made a controller guide which wasnt recorded. FollowFunctionCommand (not tested yet however) What this basically does is it takes a Function<double, double> and it converts the x value to time based on a ratio, and it take the output as the y value, and generates a custom autonomous trajectory that traces the function. The reason I decided to do this is for a learning experience in autonomous paths, pathplanner, and the pipelien and all that. Some struggles I had are that I started off with the completely wrong approach, treating it like a lazy command that goes to eahc spot as the time comes. But then I made it so that it instantly generates the path and it just runs the path, which is just a lot smoother and better. Boundary System Our demo space is a square area so I added a safety feature that keeps teh robot inside the space even if someone tries to drive it out. I also added overrides that someone on our demo team can use if it becomes finicky. Since we added vision, I had to code a setup command (which was honestly the hardest part of doing this). I made it so that you pick two setpoints to make the robot face straight (which is more accurate than mannually aiming straight), then to go ot a spot on the boundary which the odometry resets to. I also added telemtry so the driver can see where the robot thinks its at and work with that. The biggest issues I faced with this is because of some rules with how you use the SwerveInputStream type by yagsl. I removed the deadband thinking you didn’t need it since I had my own manual one, but it was required to make the robot face a certain heading. This problem took me a stupid amount of time to solve. I had to do human binary search through all my commits to see what couldve changed and what went wrong and allat. TODO The highest priority is to get the real robot working and the pigeon values read. I won’t be recording hours for that though since its a hassle. Without the pigeon (imu), half my other features are useless. Set up the driverstation in our main laptop Finish and test the grapher finally remove the custom joystick overhead since well be using windows Add kid mode so peopel who want to try driving don’t accidentally mess with our setup buttons Maybe some other stuff I forgot to include. Anyways thanks for reading my devlog, as long and boring as it is. Signing off, Ash-ioL
Shipping! With this robot’s demo purpose out of the way and a bunch of working features developed in it, I think it’s a good closing point for this project, for now. Changes / features added: Collision disabling Robot voltage and other useful loggin Added a boundaries system to kepe the robot in a rectangle boundary Added a precise 2 point angle command to make the robot alignment easy to reset the boundary Boundary override Kid mode to disable admin buttons Challenges: Pigeon problems with the real robot. I checked everything on my side with yagsl and stuff, and I cna read values from the imu. Its just that yagsl isnt able to get it somehow so ive created like some tests to see if i can manually put in the value. But it would’ve been nice if it worked in a straightforward way. Honestly to be super real, shipping this is gonna be a bit hard. since this isnt like a simple project you can try in your browser, and this isnt entirely my creation, I’m gonna try my best to only share what ive implemented. I’ll try to make a good demo video without boring yall out or confusing yall. Signing off, Ash-ioL
Ships:
This project is my contributions to my frc team’s code. For people who are not familiar with frc, it’s a robotics program and the coding here is a lot about systems integration and less about low level functionalities. Since this is a shared project, I cannot make this as a expected stardance project. And since frc projects aren’t really simple to package adn run, I have included a demo video of the simulation instead, where i demonstrate the robot staying inside the bounds, admin control disabling features, and a custom path generation utility. My biggest challenges were just navigating through the way yagsl (swerve library) works and sometimes i had to work around it even. I’m proud mainly of the things I was able to learn and familiarize myself with like custom path generation and stuff....
|
1793602514.663443
|
1793688914.663443
|
|
5252
|
Pandakeeb by @panda | Stardance
|
panda
|
1
|
3.0
|
15
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-02T12:23:45Z", "hours": 3.0, "multiplier": 5.0, "payout": 15, "blessing": "neutral", "text": "I finished all the design files for my split keyboard design - from Schematic to PCB to Case. The Keyboard is a classic wireless split Corne Keyboard with a Battery that lasts literal ages - it uses a ergonomic 3x6 key layout with 3 thumb switches per side - thats 21 switches per side, and 42 in total. it also has a physical power switch, a charging circuit, and a 0.91” OLED integrated ! This is my first ship, there will be another when im done with the actual physical build.", "repo": "https://github.com/mail2adnanyazik-bit/Pandakeeb", "demo": ""}]...
|
[{"post_id": 39447, "ts": "202 [{"post_id": 39447, "ts": "2026-08-02T12:18:39Z", "hours": 16.9939, "text": "I dont fully understand why, but some of the time i coded on other projects is showing up here - i only did around 5 hours of work, but 16 hours are showing up. Eh, idk. Anyway, im continuing now - i put together an aliexpress cart, and will order soon !"}, {"post_id": 27095, "ts": "2026-07-12T11:01:15Z", "hours": 2.2603, "text": "EVERYTHING GOT WIPED CAUSE I FORGOT TO SAAAVEEE i spent like waaay too much time learning how ZMK works for my Split Keyboard project, then submitted it, and guess what - i forgot to save (since i recently switched to nvim) AND MY LAPTOP POWERED OFFF. Anyway now i gotta write the code AGAIN T-T the green dot of nvim doom that tells you you haven’t saved changes :"}, {"post_id": 26541, "ts": "2026-07-11T12:42:08Z", "hours": 18.1669, "text": "Actually done this time. Too many mistakes lol check it out at https://github.com/mail2adnanyazik-bit/Splitboard"}, {"post_id": 20229, "ts": "2026-07-01T19:34:46Z", "hours": 1.1436, "text": "Completely Done ! I got my grant :D"}, {"post_id": 18618, "ts": "2026-06-29T20:22:12Z", "hours": 0.8547, "text": "Done with the Project ! All that is left is to tidy everything up in a repo, and im done !"}, {"post_id": 18524, "ts": "2026-06-29T18:22:01Z", "hours": 1.1667, "text": "Done with right side ! I was able to modify the design for the left side enough to make it fit the right side, unfortunately KiCad was being a real beach, and wouldnt let me flip the components on the 3d model properly, so i dont have a 3d model of the PCB on the right side D:"}, {"post_id": 18411, "ts": "2026-06-29T15:33:40Z", "hours": 2.8728, "text": "Case Bottom, and right side assembly Im done with the SplitBoard Case Bottom ! I started by using the PCB as a reference model, then made the outline bigger, symmetrical, added holes, made the inside hollow, and then started to polish : I rounded the edges, added a hole for the USB port thats rounded off (see below), then adjusted the case top to fit the bottom, and added chamfering and polish for the less tall components, while making it match the case body. I also just finished making an approximation of how it will look in the end : Unfortunately, this is only the Assembly and 3D Model for half the Keyboard (the right) - next i will be working on the same thing for the left side"}, {"post_id": 17006, "ts": "2026-06-27T16:20:49Z", "hours": 3.6911, "text": "3D Modeling - Case Top After a long time of being lazy and working on the schematic for my other current project AquaPuck ( Psstt … U should check it out ! Its also on Stardance … ) im back ! I started working on the 3D modeled Case for my SplitBoard ! I had a bit of experience from the PandaPad (My hackpad stardance project) for this part, only difference is, the Hackpad was 6 keys and 2 other Parts - compared to that this thing is MIND BLOWING ! So what i did today was first plan - Just like for the PandaPad, i decided to use just 2 parts : The Case Bottom (A kind of hollow shell with space for the PCB) The Case Top (Basically a flat top for the Case Bottom with holes where the switches and screen or other components can poke through) For now i decided to start with the Case Top, as the Bottom would be a lot complexer than the Top. Im realzing now that could be a mistake. Anyway, to make the Top, this is what i started with - the 3D model for my PCB : I started counting the components that would poke through - these were : The Keyswitches The Power Switch The OLED Screen The screws So i started drawing cutouts for all of them : This is just the first sketch with cutouts, as i will have to make the entire thing bigger later (this is currently only as big as the PCB - Since this attaches to the Case itself it will need to be as big as the case - and the case walls will also have thickness, get it ?) After extruding (just for show !) :"}, {"post_id": 11567, "ts": "2026-06-18T21:05:05Z", "hours": 1.8511, "text": "I started working on 3D Modeling ! Since i wanted a final assembled version of the Splitboard with all components for visualization of the final Project, and just to have some help modeling the Case , i decided to add 3D models of all my components to the PCB directly in KiCad - and damn were these CAD models bloodsuckingly hard to find little things. They eluded me for literal hours while i was searching every damn corner of the web for these things, and when i found them they wer too vague to be used. Only through persistence did i manage to find the correct or at least as good as models as i could find - and now i have a complete model of my PCB, as long as a good guideline for the case, and how it will end up in the final ship. Here is the PCB in KiCad’s built in 3D renderer :"}, {"post_id": 11328, "ts": "2026-06-18T15:11:25Z", "hours": 1.6031, "text": "I finished the PCB ! I changed the Edge.Cuts from just a rectangle to this - it fits the keyboard more, and looks a bit better ! I finished wiring, and it was a CHALLENGE ! It took around 1 and a half hours, and it was a monster - this is only the second PCB im making, and my goal was to not use any vias, because i had’nt needed any for my Hackpad. Unfortunately, i severely underestimated the difficulty jump from a mere 6 key switch matrix with rotary encoder and OLED to this whole ass keyboard. So unfortunately my PCB is littered with via’s, which isnt bad per se, but is still bad practice. I had to sometimes use 6 or more via’s for ONE wire. Anyway, im finally done, and will move on to the case next !"}, {"post_id": 10776, "ts": "2026-06-17T18:04:56Z", "hours": 1.8667, "text": "I arranged all my switches and other components on the PCB meticulously, and drew the Edge.Cuts - its rectangular for now, but i might change that - Im not sure NEXT UP : I have to route the PCB (wire spider nest coming up !)"}, {"post_id": 10196, "ts": "2026-06-16T20:13:07Z", "hours": 4.9786, "text": "Finished the whole Schematic for my Wireless Split keyboard - with ALL components. it was challenging to find the correct symbols and footprints, as for example the microcontroller symbol used physical pins instead of digital pins like normal - i needed to map the physical pins to the corresponding digital pins. Also the battery doesnt actually have a symbol - same with the OLED. I had to use alternatives like using test points or pin headers and assigning different footprints. Next up : The PCB (its gonna be hell)"}, {"post_id": 9238, "ts": "2026-06-15T14:46:43Z", "hours": 2.9831, "text": "I researched on which components are best for a split keyboard, and made Decisions on how the final design will look : What i’ve decided : The Keyboard will be completely wireless It will be split in two symmetrical halves (split keyboard, duh) It will use a Supermini nrf52840 microcontroller for both halves It will follow the standard Corne layout instead of a bigger one - Corne layout means 3x6 switch matrix with 3 thumb keys per half, which means it will have 42 total keys It will use a 110 mAh battery instead of 600, as otherwise it would’nt fit under the microcontroller, and the case could’nt be as low-profile as i want It will have 2 OLED’s - most probably one for layers (im a kb warrior) and one for battery level/connectivity I decided against backlighting as it causes HUGE battery drain, and my microcontroller is cheap, but the tradeoff is a bigger battery consumption im havent decided if i will use the official Cherry mx switches which are expensive (dollar per key) or cheap ones (0.30cts a key) I will use 1 reversible PCB instead of a breakoff pcb that u split down the middle with mousebites Next steps : I will have to first find footprints and symbols for all the components - all i found till now is the symbol and footprint for microcontroller Then i will make my Schematic with all components, then arrange and wire the PCB Then i will depending on my final PCB, I will make a case according to how i want it to feel and how low/high profile it should be, how thick, mounting method, etc."}]...
|
Title: Pandakeeb by @panda | Stardance
Devlogs:
I Title: Pandakeeb by @panda | Stardance
Devlogs:
I researched on which components are best for a split keyboard, and made Decisions on how the final design will look : What i’ve decided : The Keyboard will be completely wireless It will be split in two symmetrical halves (split keyboard, duh) It will use a Supermini nrf52840 microcontroller for both halves It will follow the standard Corne layout instead of a bigger one - Corne layout means 3x6 switch matrix with 3 thumb keys per half, which means it will have 42 total keys It will use a 110 mAh battery instead of 600, as otherwise it would’nt fit under the microcontroller, and the case could’nt be as low-profile as i want It will have 2 OLED’s - most probably one for layers (im a kb warrior) and one for battery level/connectivity I decided against backlighting as it causes HUGE battery drain, and my microcontroller is cheap, but the tradeoff is a bigger battery consumption im havent decided if i will use the official Cherry mx switches which are expensive (dollar per key) or cheap ones (0.30cts a key) I will use 1 reversible PCB instead of a breakoff pcb that u split down the middle with mousebites Next steps : I will have to first find footprints and symbols for all the components - all i found till now is the symbol and footprint for microcontroller Then i will make my Schematic with all components, then arrange and wire the PCB Then i will depending on my final PCB, I will make a case according to how i want it to feel and how low/high profile it should be, how thick, mounting method, etc.
Finished the whole Schematic for my Wireless Split keyboard - with ALL components. it was challenging to find the correct symbols and footprints, as for example the microcontroller symbol used physical pins instead of digital pins like normal - i needed to map the physical pins to the corresponding digital pins. Also the battery doesnt actually have a symbol - same with the OLED. I had to use alternatives like using test points or pin headers and assigning different footprints. Next up : The PCB (its gonna be hell)
I arranged all my switches and other components on the PCB meticulously, and drew the Edge.Cuts - its rectangular for now, but i might change that - Im not sure NEXT UP : I have to route the PCB (wire spider nest coming up !)
I finished the PCB ! I changed the Edge.Cuts from just a rectangle to this - it fits the keyboard more, and looks a bit better ! I finished wiring, and it was a CHALLENGE ! It took around 1 and a half hours, and it was a monster - this is only the second PCB im making, and my goal was to not use any vias, because i had’nt needed any for my Hackpad. Unfortunately, i severely underestimated the difficulty jump from a mere 6 key switch matrix with rotary encoder and OLED to this whole ass keyboard. So unfortunately my PCB is littered with via’s, which isnt bad per se, but is still bad practice. I had to sometimes use 6 or more via’s for ONE wire. Anyway, im finally done, and will move on to the case next !
I started working on 3D Modeling ! Since i wanted a final assembled version of the Splitboard with all components for visualization of the final Project, and just to have some help modeling the Case , i decided to add 3D models of all my components to the PCB directly in KiCad - and damn were these CAD models bloodsuckingly hard to find little things. They eluded me for literal hours while i was searching every damn corner of the web for these things, and when i found them they wer too vague to be used. Only through persistence did i manage to find the correct or at least as good as models as i could find - and now i have a complete model of my PCB, as long as a good guideline for the case, and how it will end up in the final ship. Here is the PCB in KiCad’s built in 3D renderer :
3D Modeling - Case Top After a long time of being lazy and working on the schematic for my other current project AquaPuck ( Psstt … U should check it out ! Its also on Stardance … ) im back ! I started working on the 3D modeled Case for my SplitBoard ! I had a bit of experience from the PandaPad (My hackpad stardance project) for this part, only difference is, the Hackpad was 6 keys and 2 other Parts - compared to that this thing is MIND BLOWING ! So what i did today was first plan - Just like for the PandaPad, i decided to use just 2 parts : The Case Bottom (A kind of hollow shell with space for the PCB) The Case Top (Basically a flat top for the Case Bottom with holes where the switches and screen or other components can poke through) For now i decided to start with the Case Top, as the Bottom would be a lot complexer than the Top. Im realzing now that could be a mistake. Anyway, to make the Top, this is what i started with - the 3D model for my PCB : I started counting the components that would poke through - these were : The Keyswitches The Power Switch The OLED Screen The screws So i started drawing cutouts for all of them : This is just the first sketch with cutouts, as i will have to make the entire thing bigger later (this is currently only as big as the PCB - Since this attaches to the Case itself it will need to be as big as the case - and the case walls will also have thickness, get it ?) After extruding (just for show !) :
Case Bottom, and right side assembly Im done with the SplitBoard Case Bottom ! I started by using the PCB as a reference model, then made the outline bigger, symmetrical, added holes, made the inside hollow, and then started to polish : I rounded the edges, added a hole for the USB port thats rounded off (see below), then adjusted the case top to fit the bottom, and added chamfering and polish for the less tall components, while making it match the case body. I also just finished making an approximation of how it will look in the end : Unfortunately, this is only the Assembly and 3D Model for half the Keyboard (the right) - next i will be working on the same thing for the left side
Done with right side ! I was able to modify the design for the left side enough to make it fit the right side, unfortunately KiCad was being a real beach, and wouldnt let me flip the components on the 3d model properly, so i dont have a 3d model of the PCB on the right side D:
Done with the Project ! All that is left is to tidy everything up in a repo, and im done !
Completely Done ! I got my grant :D
Actually done this time. Too many mistakes lol check it out at https://github.com/mail2adnanyazik-bit/Splitboard
EVERYTHING GOT WIPED CAUSE I FORGOT TO SAAAVEEE i spent like waaay too much time learning how ZMK works for my Split Keyboard project, then submitted it, and guess what - i forgot to save (since i recently switched to nvim) AND MY LAPTOP POWERED OFFF. Anyway now i gotta write the code AGAIN T-T the green dot of nvim doom that tells you you haven’t saved changes :
I dont fully understand why, but some of the time i coded on other projects is showing up here - i only did around 5 hours of work, but 16 hours are showing up. Eh, idk. Anyway, im continuing now - i put together an aliexpress cart, and will order soon !
Ships:
I finished all the design files for my split keyboard design - from Schematic to PCB to Case. The Keyboard is a classic wireless split Corne Keyboard with a Battery that lasts literal ages - it uses a ergonomic 3x6 key layout with 3 thumb switches per side - thats 21 switches per side, and 42 in total. it also has a physical power switch, a charging circuit, and a 0.91” OLED integrated ! This is my first ship, there will be another when im done with the actual physical build....
|
1793602516.836114
|
1793688916.836114
|
|
41846
|
My very own WebOS by @kripeshchapagain | Stardance
|
kripeshchapagain
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-01T05:08:10Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hello everyone! I made my portfolio for stardance challenge but only a fraction of it has been completed. I used ChatGPT and Claude to help me with CSS mostly.", "repo": "https://github.com/snowyhimalayas/.vscode", "demo": "https://snowyhimalayas.github.io/.vscode/"}]...
|
[{"post_id": 38656, "ts": "202 [{"post_id": 38656, "ts": "2026-08-01T05:00:21Z", "hours": 1.0786, "text": "Hello everyone! This is my first project which is portfolio related. I’m a beginner at this."}]...
|
Title: My very own WebOS by @kripeshchapagain | St Title: My very own WebOS by @kripeshchapagain | Stardance
Devlogs:
Hello everyone! This is my first project which is portfolio related. I’m a beginner at this.
Ships:
Hello everyone! I made my portfolio for stardance challenge but only a fraction of it has been completed. I used ChatGPT and Claude to help me with CSS mostly....
|
1793602519.4493318
|
1793688919.4493318
|
|
15018
|
Graphing Calulator by @Murple | Stardance
|
Murple
|
1
|
18.0
|
241
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T17:04:10Z", "hours": 18.0, "multiplier": 17.21, "payout": 241, "blessing": "neutral", "text": "I made a math hub with different tools such as a 2D and 3D grapher, a vector field plotter, and a symbolic calculator. The project started off as just a way to revise my math and make it real by being able to visualize it, but it quickly grew into a comprehensive toolset for exploring both single and multivariable calculus.The 2D graphing section allows users to plot multiple functions at once while calculating specific metrics like arc length and the average value of a function between two bounds. Moving into higher dimensions, the 3D plotter visualizes complex multivariable surfaces, handles partial derivatives, and evaluates the Hessian matrix to locate and classify critical points into local maxima, minima, or saddle points. For exact algebraic computations, the symbolic calculator operates as a computer algebra system capable of resolving standard derivatives, limits, antiderivatives, and complex iterated double or triple integrals. Finally, the vector field visualizer displays dynamic quiver plots and features analytical tools to evaluate curl, divergence, and line integrals for work and flux based on custom parametric inputs in terms of t", "repo": "https://github.com/JustMurple/Graphing-Calc", "demo": "https://graphing-calc-wnveuhsecezfexqp3annxz.streamlit.app/"}]...
|
[{"post_id": 9305, "ts": "2026 [{"post_id": 9305, "ts": "2026-06-15T16:57:22Z", "hours": 13.9633, "text": "A lot has happen after my first devlog! I’ve decided to split up my work in different sections. The first one, the graphing calculator, is the one I was working on in the first devlog. Since then I’ve added the possibility of plotting multiple functions and the computation of arclength and averege between two x values a and b. The second section I made was the 3D plotter, similarly to the 2D one it comes with the “multiple functions at once” feature. In the analysis tools it has the computation of partial derivatives and critical points. The third section is a symbolic calculator with whom you can evaluate iterated integrals, limits, derivatives, expressions and antiderivatives. Last but not list the forth section is the 2D vector field visualizer, it takes the field’s components as inputs and plots them using plotly’s create quiver tool. The section also comes with a curl and divergence evaluator as well as a work and flux integral calculator that requires the user to input x’s and y’s parametrization in the variable t. As a personal note I wanted to add the fact that I really enjoyed making this, it’s my first full scale CS project and it was a nice way to revise what I studied in calculus."}, {"post_id": 6158, "ts": "2026-06-10T11:08:28Z", "hours": 4.0356, "text": "I’m currently working on a graphing calculator that includes tools such as finding the derivative of the functions and solving for the rationals zeros. My main goal is to have a place where I could visualize the things commonly taught in calculus 1-3 to better understand them and to get a grasp onto python and the it’s use in STEM fields."}]...
|
Title: Graphing Calulator by @Murple | Stardance
Title: Graphing Calulator by @Murple | Stardance
Devlogs:
I’m currently working on a graphing calculator that includes tools such as finding the derivative of the functions and solving for the rationals zeros. My main goal is to have a place where I could visualize the things commonly taught in calculus 1-3 to better understand them and to get a grasp onto python and the it’s use in STEM fields.
A lot has happen after my first devlog! I’ve decided to split up my work in different sections. The first one, the graphing calculator, is the one I was working on in the first devlog. Since then I’ve added the possibility of plotting multiple functions and the computation of arclength and averege between two x values a and b. The second section I made was the 3D plotter, similarly to the 2D one it comes with the “multiple functions at once” feature. In the analysis tools it has the computation of partial derivatives and critical points. The third section is a symbolic calculator with whom you can evaluate iterated integrals, limits, derivatives, expressions and antiderivatives. Last but not list the forth section is the 2D vector field visualizer, it takes the field’s components as inputs and plots them using plotly’s create quiver tool. The section also comes with a curl and divergence evaluator as well as a work and flux integral calculator that requires the user to input x’s and y’s parametrization in the variable t. As a personal note I wanted to add the fact that I really enjoyed making this, it’s my first full scale CS project and it was a nice way to revise what I studied in calculus.
Ships:
I made a math hub with different tools such as a 2D and 3D grapher, a vector field plotter, and a symbolic calculator. The project started off as just a way to revise my math and make it real by being able to visualize it, but it quickly grew into a comprehensive toolset for exploring both single and multivariable calculus.The 2D graphing section allows users to plot multiple functions at once while calculating specific metrics like arc length and the average value of a function between two bounds. Moving into higher dimensions, the 3D plotter visualizes complex multivariable surfaces, handles partial derivatives, and evaluates the Hessian matrix to locate and classify critical points into local maxima, minima, or saddle points. For exact algebraic computations, the symbolic calculator operates as a computer algebra system capable of resolving standard derivatives, limits, antiderivatives, and complex iterated double or triple integrals. Finally, the vector field visualizer displays dynamic quiver plots and features analytical tools to evaluate curl, divergence, and line integrals for work and flux based on custom parametric inputs in terms of t...
|
1793602520.5727706
|
1793688920.5727706
|
|
19075
|
lizard runner by @ReaSevicke-jones | Stardance
|
ReaSevicke-jones
|
1
|
15.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-11T11:16:43Z", "hours": 15.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hey guys I have made a game called lizard runner where the objective is to survive and not die to the predators. There is also a multiplayer gamemode where you can play against other players, however this one may be a little hard to test due to another player would need to be online, with multiplayer we have two servers one based in the us and one in Singapore. One main challage i faced in getting this beta ready for you guys to test was my two servers as one i have running on aws and the other on a node js hosting platform called render, this is intended like this so that the global server on aws has more resources and can sustain a larger number of players. Anyways thanks for reading all that i hope you enjoy it", "repo": "https://github.com/axolotldevstudio/lizardrunner/", "demo": "https://lizardrunnerdev.pages.dev"}]...
|
[{"post_id": 45089, "ts": "202 [{"post_id": 45089, "ts": "2026-08-11T11:11:34Z", "hours": 5.0058, "text": "Beta is now out (with working multiplayer and single player, we currently have two servers for multiplayer a Singapore one and one based in the us."}, {"post_id": 32809, "ts": "2026-07-22T06:19:40Z", "hours": 5.5592, "text": "i currently have begun development on multiplayer which currently is working but may not be when you go to test it and there are also two leaderboards now and a lot of items in the store."}, {"post_id": 12469, "ts": "2026-06-20T11:12:36Z", "hours": 4.0328, "text": "i have been adding more menus and a store and basically changed the game to 2d"}, {"post_id": 9521, "ts": "2026-06-15T21:54:23Z", "hours": 0.8764, "text": "currently working on improving the graphics and movement ( so the tuatara actually looks like a tuatara ) this old version was quickly changed to a 2d game as you can see in the net devlog"}]...
|
Title: lizard runner by @ReaSevicke-jones | Starda Title: lizard runner by @ReaSevicke-jones | Stardance
Devlogs:
currently working on improving the graphics and movement ( so the tuatara actually looks like a tuatara ) this old version was quickly changed to a 2d game as you can see in the net devlog
i have been adding more menus and a store and basically changed the game to 2d
i currently have begun development on multiplayer which currently is working but may not be when you go to test it and there are also two leaderboards now and a lot of items in the store.
Beta is now out (with working multiplayer and single player, we currently have two servers for multiplayer a Singapore one and one based in the us.
Ships:
Hey guys I have made a game called lizard runner where the objective is to survive and not die to the predators. There is also a multiplayer gamemode where you can play against other players, however this one may be a little hard to test due to another player would need to be online, with multiplayer we have two servers one based in the us and one in Singapore. One main challage i faced in getting this beta ready for you guys to test was my two servers as one i have running on aws and the other on a node js hosting platform called render, this is intended like this so that the global server on aws has more resources and can sustain a larger number of players. Anyways thanks for reading all that i hope you enjoy it...
|
1793602522.8162405
|
1793688922.8162405
|
|
36390
|
WarioWare Game by @aashvik | Stardance
|
aashvik
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T01:33:34Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I spent this project making a bunch of fast desi-themed minigames and putting them all together into one game. The hardest part was getting the timers, lives, scene changes, and minigames to all work together without random bugs. I learned a lot about Godot and GDScript, and I got much better at actually building and finishing a game (most of my projects end up unfinished)", "repo": "https://github.com/koditra/indoware", "demo": "https://jayflixy.itch.io/indoware"}]...
|
[{"post_id": 47827, "ts": "202 [{"post_id": 47827, "ts": "2026-08-16T01:30:48Z", "hours": 1.3503, "text": "Final Devlog This is the last devlog for IndoWare. Today I: Fixed bugs Changed some assets Made the complete screen Made the lose/end screen Fixed the transitions between screens and minigames IndoWare is finished and playable now. Play it here: https://jayflixy.itch.io/indoware"}, {"post_id": 30771, "ts": "2026-07-18T17:15:03Z", "hours": 1.9636, "text": "Devlog 2 – Building the Platformer Today I continued working on my WarioWare-inspired game by finishing the level management system and starting the first platformer minigame. I first completed the level scene by programming the level timer, level counter, and lives system. Since my game is Indian-themed, I replaced the original garlic lives from the tutorial with chai icons. The timer now counts down, updates the UI every frame, tracks the current level, and transitions between minigames automatically. I also created a reusable timer scene specifically for the minigames. This separate timer can be instanced into any level and provides a countdown that can be started from other scripts, making it easy to reuse across multiple minigames. After that, I started building the first platformer minigame. I created a Player scene using a CharacterBody2D with a Sprite2D , collision shapes, and an Area2D . After attaching the movement script, I adjusted the jump strength to make the controls feel more responsive. The player can now move left and right, jump, and interact with physics correctly. Next, I created the first minigame scene and built the ground using a StaticBody2D with a ColorRect and CollisionShape2D . This acts as the main floor for the level and provides proper collision for the player. To make the scene feel more dynamic, I added a background and configured a Parallax2D node to create a scrolling effect. By adjusting the repeat size and auto-scroll settings, the background now moves continuously, giving the level more depth. At this point, the game’s foundation is coming together. The level management system, reusable timer, player movement, platform physics, ground, and scrolling background are all working. Next, I’ll build the platforms and add the collectible chai cups that players will need to gather to complete the minigame."}, {"post_id": 30277, "ts": "2026-07-17T18:29:51Z", "hours": 1.7792, "text": "Devlog 1 Main Menu Done Started working on the game today and got the main menu finished. I decided to call the game भारत Blitz. Godot’s default font didn’t support “भारत”, so instead of fighting with fonts I just made the title into an image. It ended up looking better anyway. Right now the menu has: A custom title/logoStart buttonSettings buttonQuit buttonBackground artNext I’m going to start working on the main game loop that randomly picks the microgames and handles scoring/timers.Not a huge update, but it’s a good start and now I actually have something playable instead of just an empty project."}]...
|
Title: WarioWare Game by @aashvik | Stardance
Dev Title: WarioWare Game by @aashvik | Stardance
Devlogs:
Devlog 1 Main Menu Done Started working on the game today and got the main menu finished. I decided to call the game भारत Blitz. Godot’s default font didn’t support “भारत”, so instead of fighting with fonts I just made the title into an image. It ended up looking better anyway. Right now the menu has: A custom title/logoStart buttonSettings buttonQuit buttonBackground artNext I’m going to start working on the main game loop that randomly picks the microgames and handles scoring/timers.Not a huge update, but it’s a good start and now I actually have something playable instead of just an empty project.
Devlog 2 – Building the Platformer Today I continued working on my WarioWare-inspired game by finishing the level management system and starting the first platformer minigame. I first completed the level scene by programming the level timer, level counter, and lives system. Since my game is Indian-themed, I replaced the original garlic lives from the tutorial with chai icons. The timer now counts down, updates the UI every frame, tracks the current level, and transitions between minigames automatically. I also created a reusable timer scene specifically for the minigames. This separate timer can be instanced into any level and provides a countdown that can be started from other scripts, making it easy to reuse across multiple minigames. After that, I started building the first platformer minigame. I created a Player scene using a CharacterBody2D with a Sprite2D , collision shapes, and an Area2D . After attaching the movement script, I adjusted the jump strength to make the controls feel more responsive. The player can now move left and right, jump, and interact with physics correctly. Next, I created the first minigame scene and built the ground using a StaticBody2D with a ColorRect and CollisionShape2D . This acts as the main floor for the level and provides proper collision for the player. To make the scene feel more dynamic, I added a background and configured a Parallax2D node to create a scrolling effect. By adjusting the repeat size and auto-scroll settings, the background now moves continuously, giving the level more depth. At this point, the game’s foundation is coming together. The level management system, reusable timer, player movement, platform physics, ground, and scrolling background are all working. Next, I’ll build the platforms and add the collectible chai cups that players will need to gather to complete the minigame.
Final Devlog This is the last devlog for IndoWare. Today I: Fixed bugs Changed some assets Made the complete screen Made the lose/end screen Fixed the transitions between screens and minigames IndoWare is finished and playable now. Play it here: https://jayflixy.itch.io/indoware
Ships:
I spent this project making a bunch of fast desi-themed minigames and putting them all together into one game. The hardest part was getting the timers, lives, scene changes, and minigames to all work together without random bugs. I learned a lot about Godot and GDScript, and I got much better at actually building and finishing a game (most of my projects end up unfinished)...
|
1793602524.577186
|
1793688924.577186
|
|
33595
|
Dartmouth BASIC Interpreter by @Sabrina | Stardanc Dartmouth BASIC Interpreter by @Sabrina | Stardance...
|
Sabrina
|
1
|
22.0
|
425
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T02:47:08Z", "hours": 22.0, "multiplier": 19.04, "payout": 425, "blessing": "neutral", "text": "I made a BASIC interpreter + old school recreation of the teletype to interface with it on the main server! The most challenging part of making the interpreter was a pratt parser for doing math operatoins, but after a while i just gave up and used eval to do it for me The most challenging part of the backend+frontend is getting the api.py to spawn in terminal.py s and talk with them You SHOULD go look at the specified pages in the manual to know how to use the teletype, maybe a bit on what commands there are and to write a sample program, then also if you get errors look at the 2nd manual", "repo": "https://github.com/BoomBoomMushroom/Dartmouth-BASIC", "demo": "https://dartmouth-basic.netlify.app/"}]...
|
[{"post_id": 43680, "ts": "202 [{"post_id": 43680, "ts": "2026-08-09T02:38:34Z", "hours": 0.2592, "text": "misc code updates to make it work on the nest server as well as home computer server"}, {"post_id": 43664, "ts": "2026-08-09T01:55:55Z", "hours": 5.0728, "text": "DONE!!! Finally! (hopefully) I’ve done a bunch of bug hunting and working on the frontend in the past 5 hrs of work,,, so here is the breakdown Frontend website I created the frontend for the BASIC interpreter in the “style” of the Dartmouth by adding a CRT effect in CSS I also made an input thingie from scratch to take keyboard inputs and put them on the screen, all capital letters, and (ctrl+)backspace, spaces, and enter works! The frontend also connected to the backend API.py via a websocket Actual interpreter code I basically just added a case for divide by zero, which results in +infinity (which is ~5.78960e76) Backend I took the basis of the communicate.py and turned it into a class and gave one to each client that connected to the websocket server, created using websocket_server Thats about it I think, i just need to put the server on nest and then change the api url to the prod url and upload the website on netlify"}, {"post_id": 42826, "ts": "2026-08-07T19:11:10Z", "hours": 2.9139, "text": "Over the course of yesterday night and this afternoon I created a python file that spawns terminal.py as a subprocess and it will communicate with it. This is the first step in creating a websocket, connecting to it, and having an abstracted interface with terminal.py w/o needing to port the interpreter to javascript. I can connect to a websocket server and use the terminal.py from my browser client"}, {"post_id": 29154, "ts": "2026-07-15T21:07:14Z", "hours": 1.8392, "text": "Terminal Done! I have added a recreation of the original terminal interface, where you type HELLO answer questions like your student number, problem number, and then you can write the program in the terminal, run it, save it, etc! Readme I also created the readme"}, {"post_id": 26979, "ts": "2026-07-12T03:25:29Z", "hours": 3.4192, "text": "Basically finished I added a bunch of the orignal error messages from a 1964 manual, and now it is feature complete (minus DIM and DEF ) Next What i’d like to do next is create the terminal interface as described in this manual, on pages 16-18. It would be cool to say HELLO and then type in a user id, program id, write the program and save it, and even run it. I think it would feel very fitting!"}, {"post_id": 26820, "ts": "2026-07-11T20:37:52Z", "hours": 0.6761, "text": "I implemented the skipping FOR loops if they are invalid. ex for i = 0 to 10 step -1 I also created a few test programs and ran then to see if they worked (they did) Here is my pythagarian triangle finder: 10 FOR A = 1 TO 50 STEP 1 20 FOR B = 1 TO 50 STEP 1 30 LET C2 = A*A + B*B 40 LET C = SQR(C2) 50 IF INT(C)=C THEN 70 60 GOTO 80 70 GOSUB 500 80 NEXT B 90 NEXT A 100 STOP 500 PRINT \"PYTHAGARIAN TRIANGLE FOUND\";A;B;C 510 RETURN 1000 STOP I’m highkey a lazy bum and dont want to implement DEF and DIM for my own sanity’s sake, and making better debug screens? goodness no! I’ll be making an interface to type in basic programs now"}, {"post_id": 26795, "ts": "2026-07-11T19:48:45Z", "hours": 3.2275, "text": "It is like 90% complete, and like works REALLY well Lexer I updated this a little bit. I changed how the functions are called so instead of doing execute the interpreter calls __str__ on it and it will return the python function to do that operation inside of eval. As well I updated the parsing so you can put as many spaces or as little between operations as you want and it will still read just fine. like before you could only do ( A * 3 ) / 5 but now things like (A*3)/ 5 work just fine! I also made strings get read in entirely Also print statements now can use semicolons to seperate parts of a message on 1 line. like you can do 10 PRINT \"A = \"; A; \" B = \";B and it will print out “A = {A} B = {B}” with {A} and {B} being replaced with their actual runtime values! Interpreter I added some error catching and the global DATA array so the DATA statement can put its data in there It now catches when you try to NEXT from a for loop that doesnt exist also it catches when you try to RETURN from a subroutine when you never called a subroutine, as well as making sure that setting the program counter, via things like IF/THEN and GOTO are an actual line defined in the program Up Next I want to finish making sure all the functions and statements work as intended, as well as implementing DEF and DIM I also REALLY want to get more details error reports, by also giving the line number where an error occurred, possible typo/solutions, etc"}, {"post_id": 26408, "ts": "2026-07-11T05:50:52Z", "hours": 2.7144, "text": "Interpreter is basically done, I’ve only got to implement data def dim and read instructions. I’m highkey fearing making def since my current syntax parsing is fucking abysmal and this will only make it worse. I’ve also got to work on reading strings in for print statement and highkey most of my syntax reading in ngl But it does work for some programs like this Fibonacci sequence generator I made 10 LET A = 0 20 LET B = 1 30 LET C = A + B 40 IF C > 144 THEN 100 50 PRINT C 60 LET A = B 70 LET B = C 80 GOTO 30 100 STOP"}, {"post_id": 26355, "ts": "2026-07-11T03:03:15Z", "hours": 2.2114, "text": "Lexer I’ve got the lexer basically done, maybe a few tweaks a bit later but for the most part i can take in each line of Dartmouth Original BASIC and turn it into a list of lines and symbols to then parse Interpreter Currently it keeps track of all the variables and the program counter and runs through each line of BASIC executing it. Atm it looks fine, I just need to create and add the execute function to all of the BASIC statements like STOP, PRINT, IF, and LET Pratt Parser Currently I am working on the a pratt parser to determine the value of math operations for PRINT and LET and possible other stuff"}]...
|
Title: Dartmouth BASIC Interpreter by @Sabrina | S Title: Dartmouth BASIC Interpreter by @Sabrina | Stardance
Devlogs:
Lexer I’ve got the lexer basically done, maybe a few tweaks a bit later but for the most part i can take in each line of Dartmouth Original BASIC and turn it into a list of lines and symbols to then parse Interpreter Currently it keeps track of all the variables and the program counter and runs through each line of BASIC executing it. Atm it looks fine, I just need to create and add the execute function to all of the BASIC statements like STOP, PRINT, IF, and LET Pratt Parser Currently I am working on the a pratt parser to determine the value of math operations for PRINT and LET and possible other stuff
Interpreter is basically done, I’ve only got to implement data def dim and read instructions. I’m highkey fearing making def since my current syntax parsing is fucking abysmal and this will only make it worse. I’ve also got to work on reading strings in for print statement and highkey most of my syntax reading in ngl But it does work for some programs like this Fibonacci sequence generator I made 10 LET A = 0 20 LET B = 1 30 LET C = A + B 40 IF C > 144 THEN 100 50 PRINT C 60 LET A = B 70 LET B = C 80 GOTO 30 100 STOP
It is like 90% complete, and like works REALLY well Lexer I updated this a little bit. I changed how the functions are called so instead of doing execute the interpreter calls __str__ on it and it will return the python function to do that operation inside of eval. As well I updated the parsing so you can put as many spaces or as little between operations as you want and it will still read just fine. like before you could only do ( A * 3 ) / 5 but now things like (A*3)/ 5 work just fine! I also made strings get read in entirely Also print statements now can use semicolons to seperate parts of a message on 1 line. like you can do 10 PRINT "A = "; A; " B = ";B and it will print out “A = {A} B = {B}” with {A} and {B} being replaced with their actual runtime values! Interpreter I added some error catching and the global DATA array so the DATA statement can put its data in there It now catches when you try to NEXT from a for loop that doesnt exist also it catches when you try to RETURN from a subroutine when you never called a subroutine, as well as making sure that setting the program counter, via things like IF/THEN and GOTO are an actual line defined in the program Up Next I want to finish making sure all the functions and statements work as intended, as well as implementing DEF and DIM I also REALLY want to get more details error reports, by also giving the line number where an error occurred, possible typo/solutions, etc
I implemented the skipping FOR loops if they are invalid. ex for i = 0 to 10 step -1 I also created a few test programs and ran then to see if they worked (they did) Here is my pythagarian triangle finder: 10 FOR A = 1 TO 50 STEP 1 20 FOR B = 1 TO 50 STEP 1 30 LET C2 = A*A + B*B 40 LET C = SQR(C2) 50 IF INT(C)=C THEN 70 60 GOTO 80 70 GOSUB 500 80 NEXT B 90 NEXT A 100 STOP 500 PRINT "PYTHAGARIAN TRIANGLE FOUND";A;B;C 510 RETURN 1000 STOP I’m highkey a lazy bum and dont want to implement DEF and DIM for my own sanity’s sake, and making better debug screens? goodness no! I’ll be making an interface to type in basic programs now
Basically finished I added a bunch of the orignal error messages from a 1964 manual, and now it is feature complete (minus DIM and DEF ) Next What i’d like to do next is create the terminal interface as described in this manual, on pages 16-18. It would be cool to say HELLO and then type in a user id, program id, write the program and save it, and even run it. I think it would feel very fitting!
Terminal Done! I have added a recreation of the original terminal interface, where you type HELLO answer questions like your student number, problem number, and then you can write the program in the terminal, run it, save it, etc! Readme I also created the readme
Over the course of yesterday night and this afternoon I created a python file that spawns terminal.py as a subprocess and it will communicate with it. This is the first step in creating a websocket, connecting to it, and having an abstracted interface with terminal.py w/o needing to port the interpreter to javascript. I can connect to a websocket server and use the terminal.py from my browser client
DONE!!! Finally! (hopefully) I’ve done a bunch of bug hunting and working on the frontend in the past 5 hrs of work,,, so here is the breakdown Frontend website I created the frontend for the BASIC interpreter in the “style” of the Dartmouth by adding a CRT effect in CSS I also made an input thingie from scratch to take keyboard inputs and put them on the screen, all capital letters, and (ctrl+)backspace, spaces, and enter works! The frontend also connected to the backend API.py via a websocket Actual interpreter code I basically just added a case for divide by zero, which results in +infinity (which is ~5.78960e76) Backend I took the basis of the communicate.py and turned it into a class and gave one to each client that connected to the websocket server, created using websocket_server Thats about it I think, i just need to put the server on nest and then change the api url to the prod url and upload the website on netlify
misc code updates to make it work on the nest server as well as home computer server
Ships:
I made a BASIC interpreter + old school recreation of the teletype to interface with it on the main server! The most challenging part of making the interpreter was a pratt parser for doing math operatoins, but after a while i just gave up and used eval to do it for me The most challenging part of the backend+frontend is getting the api.py to spawn in terminal.py s and talk with them You SHOULD go look at the specified pages in the manual to know how to use the teletype, maybe a bit on what commands there are and to write a sample program, then also if you get errors look at the 2nd manual...
|
1793602525.7316854
|
1793688925.7316854
|
|
30157
|
Own web page: Alimentae by @Domenica | Stardance
|
Domenica
|
2
|
9.0
|
13
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-30T01:51:18Z", "hours": 3.0, "multiplier": 4.19, "payout": 13, "blessing": "neutral", "text": "ALIMENTAE I built an interactive and responsive demo website for Alimentae, my food rescue initiative alongside my friends. The platform is divided into two files with multiple sections within both. On the one hand there’s the index.html which covers the general introduction to Alimentae, gives facts and stats, quotes and most importantly, a call to action section to invite the reader to take part. On the other hand, I developed the somos.html which focuses on introducing the team as it contains more detailed info about Alimentae’s creators. Finally, the last addition to the website ahs been the accion.html, which focuses on the merch of Alimentae (featuring hoddies, t-shirts and tote bags). As with any project, there were challenges to overcome. I believe that the hardest challenge I had to overcome was managing to make the site easy to view regardless of the device being used. Secondly, making the navigation smooth and finally, establishing a clear visual hierarchy while maintaining the brand identity so it remained legible and appealing. With practice, it has become easier to overcome this challenges. I’m really proud of creating a website which has a clear branding aesthetic and manages to give an interactive experience for anyone using it. Moreover, I believe I succesfully represented my project’s core ideas. Finally, when opening the website you won’t need to do anything other than click the link. Hope you like it!", "repo": "https://github.com/Domenica-Santayana/alimentae.pe/", "demo": "https://alimentae.netlify.app/"}, {"ship_num": 2, "ts": "2026-08-06T17:42:02Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "ALIMENTAE I built an interactive and responsive demo website for Alimentae, my food rescue initiative alongside my friends. The platform is divided into two files with multiple sections within both. On the one hand there’s the index.html which covers the general introduction to Alimentae, gives facts and stats, quotes and most importantly, a call to action section to invite the reader to take part. On the other hand, I developed the somos.html which focuses on introducing the team as it contains more detailed info about Alimentae’s creators. As with any project, there were challenges to overcome. I believe that the hardest challenge I had to overcome was managing to make the site easy to view regardless of the device being used. Secondly, making the navigation smooth and finally, establishing a clear visual hierarchy while maintaining the brand identity so it remained legible and appealing. I’m really proud of creating a website which has a clear branding aesthetic and manages to give an interactive experience for anyone using it. Moreover, I believe I succesfully represented my project’s core ideas. Finally, when opening the website you won’t need to do anything other than click the link. Hope you like it!", "repo": "https://github.com/Domenica-Santayana/alimentae.pe/", "demo": "https://alimentae.netlify.app/"}]...
|
[{"post_id": 75419, "ts": "202 [{"post_id": 75419, "ts": "2026-09-30T01:33:41Z", "hours": 1.38, "text": "Hello there! So, I’ve managed to accomplish the final page of Alimentae. I did it quite fast considering I copied part of the code of the index and the somos.html. When I was working on it, at first I put all the products and all its ways of looking at them, but I didn’t like it. That’s when I thought, hey, what if I search for Gucci’s way of doing so. That’s what inspired me on doing the thing with the arrows in the section of gallery. As well, I kinda copied the same design of the cta of the index, but I managed to discover how to put it some movement. Check out the new changes. Hope you like it!"}, {"post_id": 75091, "ts": "2026-09-29T04:11:01Z", "hours": 1.1436, "text": "Hello there! So I kinda decide to change some things. Well, you know I was working on the action.html. Well, let’s say I keep working on it but with a new goal: merch. I’ve manage to make mockups of the products and start coding. See you!"}, {"post_id": 63254, "ts": "2026-09-06T23:45:36Z", "hours": 0.4986, "text": "Hello there! So, I was thinking, what if I add something else to Alimentae’s site. I mean, there are 3 colours, blue for the index, white for the somos.html, but what about yellow? Inspired by that idea and my belief that I can make Alimentae much better, I decided to create the accion.html file. See you!"}, {"post_id": 42075, "ts": "2026-08-06T17:10:31Z", "hours": 2.4147, "text": "Hello there! Great News! I’ve just finished the demo website for Alimentae. I made some changes in the headers, added information to the somos page, bigger brand logos and so on. Try it now! Hope you like it!"}, {"post_id": 40476, "ts": "2026-08-04T01:10:34Z", "hours": 0.3856, "text": "Hello there! In the last devlog, I commented that I managed to get on with the Somos page, yet when I was in the Index page, I found it “odd” that by clicking on “somos” it took you directly to the new html when there’s also a description in the index page as well. Soooo, I decided to make some changes. Now, clicking on “Somos” redirects you to the section in the index page, and in that same section, you’lll find a “Read more” that takes you to the somos.html file. Check it out!"}, {"post_id": 39030, "ts": "2026-08-01T18:15:54Z", "hours": 1.0808, "text": "Hello there! So, I’ve been working on the Somos site. As you can see, I managed to link it with the Index site, I added some buttons in the nav bar to redirect to each part of the Somos page: Inicio goes back to the index, Historia goes to the nuestra historia section, Sé parte del cambio redirects back to the Index html to the section of calling to action. Hope you like it!"}, {"post_id": 38365, "ts": "2026-07-31T18:26:42Z", "hours": 1.2278, "text": "Hello there! I’ve been working on the “Somos” site and I managed to set up the main structure. So, my biggest accomplishments on this time working were my finished header (logo + nav bar) plus the introductory “hero section” with the main message and action buttons. I also built a sidebar card in order to summarize Alimentae’s current activities. Moreover, I was able to work on the CSS general variables for colors and typography for the following sections. Now, I’m looking foward to making a section more connected to the team behind Alimentae."}, {"post_id": 34353, "ts": "2026-07-24T23:37:33Z", "hours": 0.9706, "text": "Right now I’m working on a new separate HTML file for the section “Somos” of my website. This new page will allow for a more in depth presentation of Alimentae’s identity, including our mission, vision, values, and story, without overcrowding the index page."}]...
|
Title: Own web page: Alimentae by @Domenica | Star Title: Own web page: Alimentae by @Domenica | Stardance
Devlogs:
Right now I’m working on a new separate HTML file for the section “Somos” of my website. This new page will allow for a more in depth presentation of Alimentae’s identity, including our mission, vision, values, and story, without overcrowding the index page.
Hello there! I’ve been working on the “Somos” site and I managed to set up the main structure. So, my biggest accomplishments on this time working were my finished header (logo + nav bar) plus the introductory “hero section” with the main message and action buttons. I also built a sidebar card in order to summarize Alimentae’s current activities. Moreover, I was able to work on the CSS general variables for colors and typography for the following sections. Now, I’m looking foward to making a section more connected to the team behind Alimentae.
Hello there! So, I’ve been working on the Somos site. As you can see, I managed to link it with the Index site, I added some buttons in the nav bar to redirect to each part of the Somos page: Inicio goes back to the index, Historia goes to the nuestra historia section, Sé parte del cambio redirects back to the Index html to the section of calling to action. Hope you like it!
Hello there! In the last devlog, I commented that I managed to get on with the Somos page, yet when I was in the Index page, I found it “odd” that by clicking on “somos” it took you directly to the new html when there’s also a description in the index page as well. Soooo, I decided to make some changes. Now, clicking on “Somos” redirects you to the section in the index page, and in that same section, you’lll find a “Read more” that takes you to the somos.html file. Check it out!
Hello there! Great News! I’ve just finished the demo website for Alimentae. I made some changes in the headers, added information to the somos page, bigger brand logos and so on. Try it now! Hope you like it!
Hello there! So, I was thinking, what if I add something else to Alimentae’s site. I mean, there are 3 colours, blue for the index, white for the somos.html, but what about yellow? Inspired by that idea and my belief that I can make Alimentae much better, I decided to create the accion.html file. See you!
Hello there! So I kinda decide to change some things. Well, you know I was working on the action.html. Well, let’s say I keep working on it but with a new goal: merch. I’ve manage to make mockups of the products and start coding. See you!
Hello there! So, I’ve managed to accomplish the final page of Alimentae. I did it quite fast considering I copied part of the code of the index and the somos.html. When I was working on it, at first I put all the products and all its ways of looking at them, but I didn’t like it. That’s when I thought, hey, what if I search for Gucci’s way of doing so. That’s what inspired me on doing the thing with the arrows in the section of gallery. As well, I kinda copied the same design of the cta of the index, but I managed to discover how to put it some movement. Check out the new changes. Hope you like it!
Ships:
ALIMENTAE I built an interactive and responsive demo website for Alimentae, my food rescue initiative alongside my friends. The platform is divided into two files with multiple sections within both. On the one hand there’s the index.html which covers the general introduction to Alimentae, gives facts and stats, quotes and most importantly, a call to action section to invite the reader to take part. On the other hand, I developed the somos.html which focuses on introducing the team as it contains more detailed info about Alimentae’s creators. As with any project, there were challenges to overcome. I believe that the hardest challenge I had to overcome was managing to make the site easy to view regardless of the device being used. Secondly, making the navigation smooth and finally, establishing a clear visual hierarchy while maintaining the brand identity so it remained legible and appealing. I’m really proud of creating a website which has a clear branding aesthetic and manages to give an interactive experience for anyone using it. Moreover, I believe I succesfully represented my project’s core ideas. Finally, when opening the website you won’t need to do anything other than click the link. Hope you like it!
ALIMENTAE I built an interactive and responsive demo website for Alimentae, my food rescue initiative alongside my friends. The platform is divided into two files with multiple sections within both. On the one hand there’s the index.html which covers the general introduction to Alimentae, gives facts and stats, quotes and most importantly, a call to action section to invite the reader to take part. On the other hand, I developed the somos.html which focuses on introducing the team as it contains more detailed info about Alimentae’s creators. Finally, the last addition to the website ahs been the accion.html, which focuses on the merch of Alimentae (featuring hoddies, t-shirts and tote bags). As with any project, there were challenges to overcome. I believe that the hardest challenge I had to overcome was managing to make the site easy to view regardless of the device being used. Secondly, making the navigation smooth and finally, establishing a clear visual hierarchy while maintaining the brand identity so it remained legible and appealing. With practice, it has become easier to overcome this challenges. I’m really proud of creating a website which has a clear branding aesthetic and manages to give an interactive experience for anyone using it. Moreover, I believe I succesfully represented my project’s core ideas. Finally, when opening the website you won’t need to do anything other than click the link. Hope you like it!...
|
1793602528.9236455
|
1793688928.9236455
|
|
27631
|
RedactOS by @No_Code | Stardance
|
No_Code
|
1
|
11.6
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T18:07:43Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This pretty obviously an operating system for your browser, but what does it do? It’s made to feel like a real system with the basic functions you need to get some (light ) stuff done. It includes: a notes APP a web browser a calculator a timer Have fun with it and feel free to leave a like if you enjoy it. See you in WebOS2", "repo": "https://github.com/nocode-96/RedactOS", "demo": "https://os.hexcat.at"}]...
|
[{"post_id": 46296, "ts": "202 [{"post_id": 46296, "ts": "2026-08-13T12:59:37Z", "hours": 4.6022, "text": "Update on first ship of the WebOS: Thanks to one of the people at Stardance ( seriously thank you) who told me to redesign the style of the OS I rewrote most of the CSS code and added some QoL features. I think it looks way better already, but I’m not quiet satisfied with the windows yet."}, {"post_id": 44120, "ts": "2026-08-09T17:59:14Z", "hours": 1.37, "text": "Final Devlog for stage 1(WEBOS1): This last sprints purpose was to have everything working. The biggest fixes include the calculator, z-index layering and positioning of the windows when initial opened. I also restyled the top bar again . Fun fact: example.com is website made only to be an example."}, {"post_id": 42593, "ts": "2026-08-07T12:38:09Z", "hours": 1.4239, "text": "Today I made huge progress: I set an background image which i think looks way cooler than the gradient before. I also finally made better Dock icons, but by far the biggest change is probably the web-browser I made with an iframe. A small mention should also probably get the Internet connection status which I implemented in the top bar, I saw that while scrolling on Instagram and I think it’s a nice touch. I also want to add that I reworked the top bar system in general to be more flexible."}, {"post_id": 42238, "ts": "2026-08-06T21:07:23Z", "hours": 2.4164, "text": "Today I fixed minor bugs and made a notes app, timer and an not so working calculator. I will also have to make some better dock icons."}, {"post_id": 18210, "ts": "2026-06-29T08:42:10Z", "hours": 2.0697, "text": "I was able to have the first window work and also made a cool mac style bar. I was also able to make these cool svg Icons using a guide from w3school and a little help from gemini to actually make the look good."}]...
|
Title: RedactOS by @No_Code | Stardance
Devlogs:
Title: RedactOS by @No_Code | Stardance
Devlogs:
I was able to have the first window work and also made a cool mac style bar. I was also able to make these cool svg Icons using a guide from w3school and a little help from gemini to actually make the look good.
Today I fixed minor bugs and made a notes app, timer and an not so working calculator. I will also have to make some better dock icons.
Today I made huge progress: I set an background image which i think looks way cooler than the gradient before. I also finally made better Dock icons, but by far the biggest change is probably the web-browser I made with an iframe. A small mention should also probably get the Internet connection status which I implemented in the top bar, I saw that while scrolling on Instagram and I think it’s a nice touch. I also want to add that I reworked the top bar system in general to be more flexible.
Final Devlog for stage 1(WEBOS1): This last sprints purpose was to have everything working. The biggest fixes include the calculator, z-index layering and positioning of the windows when initial opened. I also restyled the top bar again . Fun fact: example.com is website made only to be an example.
Update on first ship of the WebOS: Thanks to one of the people at Stardance ( seriously thank you) who told me to redesign the style of the OS I rewrote most of the CSS code and added some QoL features. I think it looks way better already, but I’m not quiet satisfied with the windows yet.
Ships:
This pretty obviously an operating system for your browser, but what does it do? It’s made to feel like a real system with the basic functions you need to get some (light ) stuff done. It includes: a notes APP a web browser a calculator a timer Have fun with it and feel free to leave a like if you enjoy it. See you in WebOS2...
|
1793602530.1376622
|
1793688930.1376622
|
|
43106
|
RadsiOS by @radsi | Stardance
|
radsi
|
1
|
6.33
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-04T20:24:39Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A made a minimalist webOS, stylized with emojis, that has a snake minigame :). I had a lot of problems making it responsive and with text colors, but I think I did a pretty webOS.", "repo": "https://github.com/radsi/RadsiOS", "demo": "https://radsi.github.io/RadsiOS/"}]...
|
[{"post_id": 51863, "ts": "202 [{"post_id": 51863, "ts": "2026-08-21T18:52:04Z", "hours": 0.7494, "text": "I removed the “explorer” app and instead made the home button list all the available apps and files."}, {"post_id": 49572, "ts": "2026-08-18T13:39:50Z", "hours": 1.5778, "text": "I redesigned the webOS layout using hand-drawn assets :)"}, {"post_id": 40958, "ts": "2026-08-04T20:22:56Z", "hours": 1.0239, "text": "I made a snake game and a wallpaper app, some text color corrections and deployed it on github pages 👍"}, {"post_id": 40872, "ts": "2026-08-04T17:50:18Z", "hours": 1.3831, "text": "I’ve worked on the taskbar, fixed the window order (z), and Notepad’s file system, among other things. Notepad gave me the most trouble; the same file was being created multiple times, and it wasn’t displaying correctly… but that’s fixed now."}, {"post_id": 39572, "ts": "2026-08-02T17:03:51Z", "hours": 1.2781, "text": "I’m making a html/tailwind/js webOS, stylized with emojis. I dont really know what to add but probably some minigames."}]...
|
Title: RadsiOS by @radsi | Stardance
Devlogs:
I’m Title: RadsiOS by @radsi | Stardance
Devlogs:
I’m making a html/tailwind/js webOS, stylized with emojis. I dont really know what to add but probably some minigames.
I’ve worked on the taskbar, fixed the window order (z), and Notepad’s file system, among other things. Notepad gave me the most trouble; the same file was being created multiple times, and it wasn’t displaying correctly… but that’s fixed now.
I made a snake game and a wallpaper app, some text color corrections and deployed it on github pages 👍
I redesigned the webOS layout using hand-drawn assets :)
I removed the “explorer” app and instead made the home button list all the available apps and files.
Ships:
A made a minimalist webOS, stylized with emojis, that has a snake minigame :). I had a lot of problems making it responsive and with text colors, but I think I did a pretty webOS....
|
1793602531.3156445
|
1793688931.3156445
|
|
43130
|
My own site! by @safayet | Stardance
|
safayet
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-06T18:45:32Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built my personal portfolio website — a single-page site with hero/intro, about-me, services (Web/App Dev, UI/UX, Graphics Design), an animated skills section, and a working contact form, using vanilla HTML/CSS/JS with Matter.js for an interactive mouse-reactive particle background and Lenis for smooth scrolling. The trickiest part was tuning the Matter.js particle background so it reacted smoothly to the cursor without lagging, and syncing scroll-triggered animations (like the sketch-pad draw-in effect) with Lenis’s smooth scroll. I’m most proud of the particle background — it makes the site feel alive instead of static, all done with vanilla JS and lightweight libraries instead of a heavy framework. To test it, just open index.html, move your mouse around the hero section to see the particles react, scroll down to see the Services sketch animation and Skills progress circles trigger, and try the contact form at the bottom (it actually submits via Web3Forms).", "repo": "https://github.com/Safayet200/portfolio", "demo": "https://safayet200.github.io/portfolio/"}]...
|
[{"post_id": 39610, "ts": "202 [{"post_id": 39610, "ts": "2026-08-02T18:23:04Z", "hours": 0.2572, "text": "I think the animation is cool huh?"}]...
|
Title: My own site! by @safayet | Stardance
Devlo Title: My own site! by @safayet | Stardance
Devlogs:
I think the animation is cool huh?
Ships:
I built my personal portfolio website — a single-page site with hero/intro, about-me, services (Web/App Dev, UI/UX, Graphics Design), an animated skills section, and a working contact form, using vanilla HTML/CSS/JS with Matter.js for an interactive mouse-reactive particle background and Lenis for smooth scrolling. The trickiest part was tuning the Matter.js particle background so it reacted smoothly to the cursor without lagging, and syncing scroll-triggered animations (like the sketch-pad draw-in effect) with Lenis’s smooth scroll. I’m most proud of the particle background — it makes the site feel alive instead of static, all done with vanilla JS and lightweight libraries instead of a heavy framework. To test it, just open index.html, move your mouse around the hero section to see the particles react, scroll down to see the Services sketch animation and Skills progress circles trigger, and try the contact form at the bottom (it actually submits via Web3Forms)....
|
1793602532.5003357
|
1793688932.5003357
|
|
44352
|
Personal Site by @AwesomeFreshDay | Stardance
|
AwesomeFreshDay
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-05T21:42:38Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My Personal Site Welcome to my personal site I created that uses html and CSS. It is a basic website that I wanted to create for fun and to get a sense of the process. There is an about me, photos, projects that I made, and contact information. There is a navigation bar that leads you to these sections: About, Projects, and Contact.", "repo": "https://github.com/AdamT2529/personal-site", "demo": "https://awesomefreshday.github.io/personal-site/"}]...
|
[{"post_id": 41588, "ts": "202 [{"post_id": 41588, "ts": "2026-08-05T21:41:31Z", "hours": 0.575, "text": "Finished creating personal site with three sections/navigation bar an about me, projects, and contact information with photos and text."}]...
|
Title: Personal Site by @AwesomeFreshDay | Stardan Title: Personal Site by @AwesomeFreshDay | Stardance
Devlogs:
Finished creating personal site with three sections/navigation bar an about me, projects, and contact information with photos and text.
Ships:
My Personal Site Welcome to my personal site I created that uses html and CSS. It is a basic website that I wanted to create for fun and to get a sense of the process. There is an about me, photos, projects that I made, and contact information. There is a navigation bar that leads you to these sections: About, Projects, and Contact....
|
1793602533.625497
|
1793688933.625497
|
|
44378
|
My personal site! by @sarahzoghly | Stardance
|
sarahzoghly
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-07T01:49:06Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "That was my first web project and I didn’t think I could do something like that but alhamdulillah I did better than I thought I would. I may still add some other stuff to the website like a chatbot or an Arabic translation because I liked its idea and I think i may use it to log my progress later.", "repo": "https://github.com/sarahzoghly/personal-website", "demo": "https://sarahzoghly.github.io/personal-website/"}]...
|
[{"post_id": 42352, "ts": "202 [{"post_id": 42352, "ts": "2026-08-07T01:06:46Z", "hours": 2.4358, "text": "I think I am done. That was fun, I will ship it"}, {"post_id": 42017, "ts": "2026-08-06T15:45:59Z", "hours": 0.3383, "text": "Made menu work, still have to add real content"}, {"post_id": 41986, "ts": "2026-08-06T15:04:06Z", "hours": 0.9489, "text": "I think it looks better that way, I will still change the bg later. Still figuring out how to make the menu work."}, {"post_id": 41639, "ts": "2026-08-05T23:55:09Z", "hours": 0.6578, "text": "Prepared the layout. It should look smth like the Image at the end"}, {"post_id": 41627, "ts": "2026-08-05T22:59:14Z", "hours": 0.9219, "text": "Made a header. Took too long but I am learning CSS and html as I am going so I already knew it would."}]...
|
Title: My personal site! by @sarahzoghly | Stardan Title: My personal site! by @sarahzoghly | Stardance
Devlogs:
Made a header. Took too long but I am learning CSS and html as I am going so I already knew it would.
Prepared the layout. It should look smth like the Image at the end
I think it looks better that way, I will still change the bg later. Still figuring out how to make the menu work.
Made menu work, still have to add real content
I think I am done. That was fun, I will ship it
Ships:
That was my first web project and I didn’t think I could do something like that but alhamdulillah I did better than I thought I would. I may still add some other stuff to the website like a chatbot or an Arabic translation because I liked its idea and I think i may use it to log my progress later....
|
1793602534.7584083
|
1793688934.7584083
|
|
45648
|
My Website by @RajanKC | Stardance
|
RajanKC
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T06:56:04Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Made My WebSite", "repo": "https://github.com/RajanKCKC/my-web", "demo": "https://rajankckc.github.io/my-web/"}]...
|
[{"post_id": 43435, "ts": "202 [{"post_id": 43435, "ts": "2026-08-08T17:50:57Z", "hours": 1.1669, "text": "Made my Website"}]...
|
Title: My Website by @RajanKC | Stardance
Devlogs Title: My Website by @RajanKC | Stardance
Devlogs:
Made my Website
Ships:
Made My WebSite...
|
1793602535.9350274
|
1793688935.9350274
|
|
25173
|
Steno by @Gabs | Stardance
|
Gabs
|
2
|
84.0
|
1315
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-28T15:54:21Z", "hours": 22.0, "multiplier": 18.35, "payout": 282, "blessing": "neutral", "text": "This ship brings the second phase of Steno’s development – Pre-Maturity!!! The past few releases where all about small improvements and fixes across the codebase to ensure we keep making the experience better. The next phase is maturity, where we will release the stable version of this project. That’s all now!!", "repo": "https://github.com/stenopress/steno", "demo": "https://steno.gxbs.dev"}, {"ship_num": 2, "ts": "2026-08-13T16:31:17Z", "hours": 62.0, "multiplier": 19.13, "payout": 1033, "blessing": "neutral", "text": "I decided to ship now even if it’s not the stable release because it’s the first time Steno is actually used by some sites, even a few that aren’t mine!! These are: https://gxbs.dev https://steno.gxbs.dev https://aplos.gxbs.dev https://bromb.in https://apx.vanillaos.org (all of these websites have their source code public) The project is ready to be used!!", "repo": "https://github.com/stenopress/steno", "demo": "https://steno.gxbs.dev"}]...
|
[{"post_id": 83770, "ts": "202 [{"post_id": 83770, "ts": "2026-10-28T15:51:42Z", "hours": 1.8897, "text": "Time for a new small release! 0.15 brings just small fixes to the onboarding setup, which include supports existing local themes, and preserves an existing deno.json or deno.jsonc instead of replacing it. Such small release prove the project is reaching maturity. Furthermore, a lot of thinking has been done of the project future as Deno is stopping support soon. Well see what we do next!"}, {"post_id": 78840, "ts": "2026-10-11T18:55:08Z", "hours": 3.4686, "text": "Time for Steno 0.14 – Smarter Rebuilds This is a relatively small release, especially compared to 0.13, as the only major changes being: Builds track page dependencies, and steno dev rebuilds only affected pages. Errors include clearer context and recovery guidance. Added incremental-build tests and benchmarks, and removed redundant tests. The whole point of it is to have somewhat “smarter” rebuilds, as mentioned in the title; refreshing dependences only when necessary. Other then that, I have also refreshed Steno’s update to ensure we show all the plugins available. Anyway, that’s all for this version’s devlog, one step closer to RC!!! See ya!"}, {"post_id": 71851, "ts": "2026-09-21T17:30:19Z", "hours": 17.0211, "text": "I’ve decided to release the first version of Steno in over a month. Meet Steno 0.3! This version focuses on the stability of the foundations of Steno. More importantly, the biggest change is the change of modularity inside Steno. I decided to separate the core and tau into two different packages, so we lay the foundation for a future new project that is similar to Steno. At the same time, I have made many different changes across the base, which can include making themes more composable and adding stronger release checks around the packages people actually install. All these changes and many, many more small fixes ensure the stability and maturation of this project. PS: forgot i had to devlog 7 hours ago 😢"}, {"post_id": 46406, "ts": "2026-08-13T16:14:28Z", "hours": 15.1536, "text": "v0.11.0 & 0.12.0 are here!! Since we got 2 releases in this devlog; im not going to include a list like i usually do, I’ll just talk about the highlights. So first of all both of these releases are focused on stabilization; no shiny new features, but on small improvements that improve the quality, and of course bug fixes. We had tau 0.9 where we brought comments, {#let} bindings, {:else} branches for {#each} , component children, whitespace control, and async function/filter calls, we had hashed CSS/JS, dev server improvements FINALLY ** froze and documented the public api fully**, added plugins/themes scaffolding, abd so so so much more of such stuff all across the codebase. Oh and I also made more plugins eheheh and made a post oh hackernews, scary stuff Anyway i should’ve made this devlog about 5 logged hours ago, but it is what it is"}, {"post_id": 40172, "ts": "2026-08-03T16:03:45Z", "hours": 12.3356, "text": "0.10.0 is here! Steno 0.10 improves the development workflow, hardens build reliability, and prepares the public API for the upcoming release candidate Highlights Atomic, deterministic builds with safer recovery Permalinks and secure output-path resolution New production preview command Accessible CLI output, clearer diagnostics, and NO_COLOR Theme selection during project initialization Generated-project and official plugin compatibility tests Transparent benchmarks with enforced performance budgets Refreshed Marketing Minimal design Site is out!! https://steno.gxbs.dev Its still in it’s early stage but, its somewhat out!"}, {"post_id": 33533, "ts": "2026-07-23T15:55:18Z", "hours": 8.2764, "text": "0.9.0 is here!!!!!!!!! Full theme configuration schemas with validation and defaults Per-page configuration overrides through frontmatter Environment-aware development and production configuration Extended head management for scripts, metadata, and Open Graph tags New Marketing Minimal theme Redesigned Docs Minimal with a consistent theme design language Expanded Tau security, unit tests, and real-site integration coverage Bump marked from 18.0.6 to 18.0.7"}, {"post_id": 30585, "ts": "2026-07-18T09:05:01Z", "hours": 10.4642, "text": "v0.7.0 is here! Image Optimisation Plugin (resize, webp, lazy-load) Sitemap + RSS/Atom Generation Plugin Data files (_data/ dir for JSON, YAML, TOML) Draft pages ( draft: true ) Global Vars in config Update default port number to 5735 Add system to change port in case it’s used Redesign the minimalist themes (attached screenshot) Rewrote docs And also this devlog contains bit of the unreleased v0.8.0: .env file support redirects implement support for {@include} directives in templates add schema validation for collection items in templates introduce ‘doctor’ command for project health checks Anyway! That’s all from this times 10 hour review checkmark, see you next time!"}, {"post_id": 27084, "ts": "2026-07-12T10:11:25Z", "hours": 6.9939, "text": "Beta is here!! v0.6.0 bring these new changes: implement incremental builds with caching for unchanged pages implement plugin security configuration to control plugin loading add support for official plugins in onboarding process enhance build performance with concurrent file reading and caching add benchmark scripts and performance budget checks create minimal theme package with basic layout and configuration implement zero-config project resolution and navigation building one step closer to stable :)"}, {"post_id": 18302, "ts": "2026-06-29T12:34:13Z", "hours": 1.8994, "text": "Just released v0.2.0! These are the changes: Lifecycle hooks AST + HTML transform pipeline Plugin system via config.yml (JSR packages) Theme-level plugins Theme config schema with soft defaults Initialize package! Try with deno -Ar jsr@steno/init"}, {"post_id": 16295, "ts": "2026-06-26T14:41:22Z", "hours": 6.8269, "text": "Steno v0.1.0 - Alpha! Worked on many parts of the project, including but not limited to: introducing themes and scribe! new CLI adding test units adding docs a init command All now live on JSR! https://jsr.io/@steno/steno"}]...
|
Title: Steno by @Gabs | Stardance
Devlogs:
Steno Title: Steno by @Gabs | Stardance
Devlogs:
Steno v0.1.0 - Alpha! Worked on many parts of the project, including but not limited to: introducing themes and scribe! new CLI adding test units adding docs a init command All now live on JSR! https://jsr.io/@steno/steno
Just released v0.2.0! These are the changes: Lifecycle hooks AST + HTML transform pipeline Plugin system via config.yml (JSR packages) Theme-level plugins Theme config schema with soft defaults Initialize package! Try with deno -Ar jsr@steno/init
Beta is here!! v0.6.0 bring these new changes: implement incremental builds with caching for unchanged pages implement plugin security configuration to control plugin loading add support for official plugins in onboarding process enhance build performance with concurrent file reading and caching add benchmark scripts and performance budget checks create minimal theme package with basic layout and configuration implement zero-config project resolution and navigation building one step closer to stable :)
v0.7.0 is here! Image Optimisation Plugin (resize, webp, lazy-load) Sitemap + RSS/Atom Generation Plugin Data files (_data/ dir for JSON, YAML, TOML) Draft pages ( draft: true ) Global Vars in config Update default port number to 5735 Add system to change port in case it’s used Redesign the minimalist themes (attached screenshot) Rewrote docs And also this devlog contains bit of the unreleased v0.8.0: .env file support redirects implement support for {@include} directives in templates add schema validation for collection items in templates introduce ‘doctor’ command for project health checks Anyway! That’s all from this times 10 hour review checkmark, see you next time!
0.9.0 is here!!!!!!!!! Full theme configuration schemas with validation and defaults Per-page configuration overrides through frontmatter Environment-aware development and production configuration Extended head management for scripts, metadata, and Open Graph tags New Marketing Minimal theme Redesigned Docs Minimal with a consistent theme design language Expanded Tau security, unit tests, and real-site integration coverage Bump marked from 18.0.6 to 18.0.7
0.10.0 is here! Steno 0.10 improves the development workflow, hardens build reliability, and prepares the public API for the upcoming release candidate Highlights Atomic, deterministic builds with safer recovery Permalinks and secure output-path resolution New production preview command Accessible CLI output, clearer diagnostics, and NO_COLOR Theme selection during project initialization Generated-project and official plugin compatibility tests Transparent benchmarks with enforced performance budgets Refreshed Marketing Minimal design Site is out!! https://steno.gxbs.dev Its still in it’s early stage but, its somewhat out!
v0.11.0 & 0.12.0 are here!! Since we got 2 releases in this devlog; im not going to include a list like i usually do, I’ll just talk about the highlights. So first of all both of these releases are focused on stabilization; no shiny new features, but on small improvements that improve the quality, and of course bug fixes. We had tau 0.9 where we brought comments, {#let} bindings, {:else} branches for {#each} , component children, whitespace control, and async function/filter calls, we had hashed CSS/JS, dev server improvements FINALLY ** froze and documented the public api fully**, added plugins/themes scaffolding, abd so so so much more of such stuff all across the codebase. Oh and I also made more plugins eheheh and made a post oh hackernews, scary stuff Anyway i should’ve made this devlog about 5 logged hours ago, but it is what it is
I’ve decided to release the first version of Steno in over a month. Meet Steno 0.3! This version focuses on the stability of the foundations of Steno. More importantly, the biggest change is the change of modularity inside Steno. I decided to separate the core and tau into two different packages, so we lay the foundation for a future new project that is similar to Steno. At the same time, I have made many different changes across the base, which can include making themes more composable and adding stronger release checks around the packages people actually install. All these changes and many, many more small fixes ensure the stability and maturation of this project. PS: forgot i had to devlog 7 hours ago 😢
Time for Steno 0.14 – Smarter Rebuilds This is a relatively small release, especially compared to 0.13, as the only major changes being: Builds track page dependencies, and steno dev rebuilds only affected pages. Errors include clearer context and recovery guidance. Added incremental-build tests and benchmarks, and removed redundant tests. The whole point of it is to have somewhat “smarter” rebuilds, as mentioned in the title; refreshing dependences only when necessary. Other then that, I have also refreshed Steno’s update to ensure we show all the plugins available. Anyway, that’s all for this version’s devlog, one step closer to RC!!! See ya!
Time for a new small release! 0.15 brings just small fixes to the onboarding setup, which include supports existing local themes, and preserves an existing deno.json or deno.jsonc instead of replacing it. Such small release prove the project is reaching maturity. Furthermore, a lot of thinking has been done of the project future as Deno is stopping support soon. Well see what we do next!
Ships:
I decided to ship now even if it’s not the stable release because it’s the first time Steno is actually used by some sites, even a few that aren’t mine!! These are: https://gxbs.dev https://steno.gxbs.dev https://aplos.gxbs.dev https://bromb.in https://apx.vanillaos.org (all of these websites have their source code public) The project is ready to be used!!
This ship brings the second phase of Steno’s development – Pre-Maturity!!! The past few releases where all about small improvements and fixes across the codebase to ensure we keep making the experience better. The next phase is maturity, where we will release the stable version of this project. That’s all now!!...
|
1793602537.0757663
|
1793688937.0757663
|
|
41271
|
Fleer by @johan | Stardance
|
johan
|
1
|
76.21
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-30T21:52:34Z", "hours": 64.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "School is coming back soon, Stardance may be ending tomorrow, and I’m currently at 15% of what I want to do. I got an entire planning on Linear on what to do now. Fleer is a toxic-love project for me because of the numbers of issues I encountered, but I still want it to be done so bad. And yeah, I know testing is kinda hard now, I can’t publish an hosted testing instance so you will need to host it yourself (just one 30 MB Docker image to compile on any system and any architecture).", "repo": "https://github.com/johan-perso/fleer-relay", "demo": "https://github.com/johan-perso/fleer-cli#installation"}]...
|
[{"post_id": 81085, "ts": "202 [{"post_id": 81085, "ts": "2026-10-19T20:04:48Z", "hours": 4.6358, "text": "Fleer is a decentralized platform, meaning anyone can host one or multiple relay servers. This devlog brings this concept even more to the Fleer CLI. Three lists of relay servers are hosted (on the GitHub repo, on my main website, and obviously on the Fleer landing page itself). These lists contain the URL for the currently only hosted relay. You can also add your own custom lists. In the future, the officials lists will include many more relays, from me or from anyone that contributes to the ecosystem, and the CLI is already prepared for that! I’m on a hotspot with like not even 1 Mbps so the video is just here for illustrative purposes 💀"}, {"post_id": 72709, "ts": "2026-09-23T15:38:39Z", "hours": 7.5769, "text": "After a few weeks without being able to do proper coding sessions (only got time to do it while being at school), I can finally release a new feature for Fleer! Integrity checking: after sending files, the receiver can ask the sender for a list of SHA-256 hashes. All communications are using encrypted messages to reduce the amount of things a malicious relay server can do. Integrity checking allows the receiver to be sure that files are identical from the sent one, and that the relay didn’t skipped chunks/files. I also added proper (and definitive) instructions for selfhosting a relay server by using Docker Compose (with prebuilt images via GitHub Actions), by building the image yourself with a Dockerfile, or to run from source. Reduce chunkSize when sending files if network conditions were really really bad before starting to send chunks."}, {"post_id": 58469, "ts": "2026-08-30T21:45:51Z", "hours": 7.2975, "text": "Not sure if Stardance will get extended until something like the end of September, so here am I (didn’t got many times to update the app and encountered many problems). A new command fleer relay followed by any Fleer Relay URL will output details about it. Receiver device name was sent in clear to the relay, it is now exchanged using encrypted messages. The transfer will be deleted if too many restarts happen (because messages size exceeds the limit for example). A structure containing all files, folders and path is included to give the receiver some visuals indications. If it’s too large, the structure will be dropped entirely. The amount of received/sent bytes will be displayed in Kbps instead of Mbps if it’s slow asf. Many bugs fixes and optimizations. The relay can now pauses transfers if it’s processing too many transfers at once. The indicated transfer size will include an estimated encryption overhead (the algorithm used can add some bytes to files). Transfers that shares MANY messages can use a feature from the relay that give clients ability to select the amount of cached bytes for messages and chunks. Inactives shares are deleted from the memory of the relay. The build version and latest commit pulled is returned to clients from the relay. Rate limits now apply to WebSocket messages."}, {"post_id": 53427, "ts": "2026-08-23T23:35:26Z", "hours": 3.7667, "text": "Didn’t wrote many lines of code on this project the last few days, was busy with personnal things so I’m listing what I pushed this week: User can decide what to do if a file already exist in the current directory (replace it, rename the new one, or skip this file). A new command fdd allows to start a download even faster, by checking the first parameter ( fdd <share_link> ) or any URL in the clipboard. fleer send command can generate a QR Code image, and display it for supported terminals (such as the incredible Ghostty). Download speed is displayed live in Mbps. Some fixes concerning security and downloading in specific conditions."}, {"post_id": 49259, "ts": "2026-08-17T23:04:04Z", "hours": 4.8894, "text": "A few minors QoL changes: The CLI is automatically closed when download is finished, synced for both sender and receiver through an encrypted message that acts as a signal to tell both party they have done their job. Share Link is automatically copied into the clipboard of the sender, even if he’s remotely connected via SSH to another server. The directory in which files are saved is displayed at the end of execution (default to current folder). Improved performances when downloading. Some more verifications with the relay server used. Protect against Path Traversal vulnerability."}, {"post_id": 46633, "ts": "2026-08-14T01:00:19Z", "hours": 8.6061, "text": "Okay, changelog required even though I wasn’t planning on publishing it right now. Apart from some additions such as: --debug-socket flag that logs every actions happening between the client and a relay server Encryption protocol indicator (which is used by clients to know what algorithm and settings to use) is NOT known by the server anymore, as it is transferred in the share link itself Proper exit (and closure of spinner animations) when using Ctrl+C A few optimizations for responsive logs Downloading files is ALMOST done, I’m currently having many issues with slow file upload, and many attempts at optimizing it (that litteraly give me the idea of just quitting this project) and I’m making this changelog now because I think we might not finish this part of the CLI before at least 2 days. In the meantime, I daydreamed about many things I want to introduce into the project that will hopefully make a difference with others apps, even if I don’t have the same speed as them."}, {"post_id": 45231, "ts": "2026-08-11T15:54:32Z", "hours": 1.0211, "text": "Made a command to explain how Fleer relays, encryption and decryption work - always with a nice focus on terminal design, with colors, responsive and auto resize"}, {"post_id": 44327, "ts": "2026-08-10T00:30:37Z", "hours": 7.3697, "text": "We can send files using the CLI! I have some optimizations to make because sending small files is just as slow as sending large files, causing super low speed upload 💀 We also display the URL, command, and keys (used by the server) to connect as a receiver and start downloading files. The protocol is kinda complex and I’m planning to write a documentation on how to use it for any matter (like automations or 3rd party clients), and a terminal generally being for nerds (especially when a desktop GUI app is planned) make this the best place to showcase how the relay system really work, so I implemented a flag --debug-performances that log every actions into a file, also useful to debug performances (if you didn’t guessed…). The sender sends files to the relay, one by one, chunk by chunk to the relay, which will pipe them to the receiver afterwards. Chunks are fully encrypted on both clients and server cannot access their content whatsoever. To ensure even better security, I also display a warning with confirmation before continuing if the server is using HTTP instead of HTTPS. There is many things happening that isn’t easy to see, and many little details (like some responsive resizing for low sized terminals) that many people may never encounteer, and I’m proud of how those devlogs are only like 7h long?? Anyway, here’s a video of where I currently am, and thanks for reading all of that garbage nonsense written by a french guy that isn’t quite good at telling things in foreign languages."}, {"post_id": 42308, "ts": "2026-08-06T23:19:36Z", "hours": 6.6911, "text": "Spent a few hours starting the CLI! For now it can only search for files and directory to send, while excluding socket and symlinks, and asking user if he want to excludes some others directory (like node_modules, cache or trashed files on macOS/Linux). Interface use colors, spinners and terminal screen width detection to avoid overflowing texts on another lines, providing a nice display when displaying large quantity of text, even if it’s only on screen for a few milliseconds. The files searching is really fast thank to Bun and some optimizations I did, here is a demo."}, {"post_id": 41111, "ts": "2026-08-05T03:10:10Z", "hours": 6.4781, "text": "Receiver can now receive chunks of data even if he wasn’t connected when the sender started sending them. Also, some communications are added between the receiver and the sender, such as a warning when the other one disconnect, or any other form of encrypted message. Senders were informed when they reached the max cached data limit, but are also now informed when this limit can be ignored (when the receiver download those cached data to free some space). And the thing you can see in the demo video: it is now possible to, as the receiver, restart an entire transfer if you connect to the download, disconnect, and reconnect again (because cached data are cleaned by the backend, which mean the sender has to send them again). I know “sender” and “receiver” are repeated 300x but idk how to explain this in a better way 😭🙏 (+ i’m french idk we’re all bad in this language tbh)"}, {"post_id": 38550, "ts": "2026-08-01T00:54:39Z", "hours": 6.45, "text": "After starting to get some progress on a test CLI (with both sending and receiving sides), we can now encrypt/send, and decrypt/download chunks on storage. I will make a few changes on how files saving will be handled because for now the receiver only get chunks data, and don’t know how to reassemble them. If you want, one of my git commit got this long ahh description: - Many more checks - Receiver can set their name (sender get notified) - Chunks are sent to receiver - receiver can acknowledge when they receive one, and chunks sending is paused if they have at least three chunks not ack. - An encryption protocol indicator is exchanged (not encrypted) to let clients know what encryption parameters to use - Chunks that are in the memory of the server has a maximum, afterwards we stop accepting more - Auto removal of all in-memory data of acknowledged chunks"}, {"post_id": 36745, "ts": "2026-07-29T00:19:25Z", "hours": 11.2589, "text": "Just started this new project! I’ve already wrote a loooong list of things I want to do (and how I want them to be done), will not post it here to avoid spoiling so wait a few changelog to know how the service will work! For now, I’ve only implemented a basic API that allows to create a share, returning a shareId that allows to request details about it ; I also started the implementation of a socket that will allow someone to download a file while it’s being uploaded. The backend will be done in Dart to allow the build of a light executable file, allowing an easier self-hosting while consuming less ressources. This language also enable me the possibility of including the server directly inside a Flutter made client, but I’m not sure I will use this possibility, I guess we will see!"}]...
|
Title: Fleer by @johan | Stardance
Devlogs:
Just Title: Fleer by @johan | Stardance
Devlogs:
Just started this new project! I’ve already wrote a loooong list of things I want to do (and how I want them to be done), will not post it here to avoid spoiling so wait a few changelog to know how the service will work! For now, I’ve only implemented a basic API that allows to create a share, returning a shareId that allows to request details about it ; I also started the implementation of a socket that will allow someone to download a file while it’s being uploaded. The backend will be done in Dart to allow the build of a light executable file, allowing an easier self-hosting while consuming less ressources. This language also enable me the possibility of including the server directly inside a Flutter made client, but I’m not sure I will use this possibility, I guess we will see!
After starting to get some progress on a test CLI (with both sending and receiving sides), we can now encrypt/send, and decrypt/download chunks on storage. I will make a few changes on how files saving will be handled because for now the receiver only get chunks data, and don’t know how to reassemble them. If you want, one of my git commit got this long ahh description: - Many more checks - Receiver can set their name (sender get notified) - Chunks are sent to receiver - receiver can acknowledge when they receive one, and chunks sending is paused if they have at least three chunks not ack. - An encryption protocol indicator is exchanged (not encrypted) to let clients know what encryption parameters to use - Chunks that are in the memory of the server has a maximum, afterwards we stop accepting more - Auto removal of all in-memory data of acknowledged chunks
Receiver can now receive chunks of data even if he wasn’t connected when the sender started sending them. Also, some communications are added between the receiver and the sender, such as a warning when the other one disconnect, or any other form of encrypted message. Senders were informed when they reached the max cached data limit, but are also now informed when this limit can be ignored (when the receiver download those cached data to free some space). And the thing you can see in the demo video: it is now possible to, as the receiver, restart an entire transfer if you connect to the download, disconnect, and reconnect again (because cached data are cleaned by the backend, which mean the sender has to send them again). I know “sender” and “receiver” are repeated 300x but idk how to explain this in a better way 😭🙏 (+ i’m french idk we’re all bad in this language tbh)
Spent a few hours starting the CLI! For now it can only search for files and directory to send, while excluding socket and symlinks, and asking user if he want to excludes some others directory (like node_modules, cache or trashed files on macOS/Linux). Interface use colors, spinners and terminal screen width detection to avoid overflowing texts on another lines, providing a nice display when displaying large quantity of text, even if it’s only on screen for a few milliseconds. The files searching is really fast thank to Bun and some optimizations I did, here is a demo.
We can send files using the CLI! I have some optimizations to make because sending small files is just as slow as sending large files, causing super low speed upload 💀 We also display the URL, command, and keys (used by the server) to connect as a receiver and start downloading files. The protocol is kinda complex and I’m planning to write a documentation on how to use it for any matter (like automations or 3rd party clients), and a terminal generally being for nerds (especially when a desktop GUI app is planned) make this the best place to showcase how the relay system really work, so I implemented a flag --debug-performances that log every actions into a file, also useful to debug performances (if you didn’t guessed…). The sender sends files to the relay, one by one, chunk by chunk to the relay, which will pipe them to the receiver afterwards. Chunks are fully encrypted on both clients and server cannot access their content whatsoever. To ensure even better security, I also display a warning with confirmation before continuing if the server is using HTTP instead of HTTPS. There is many things happening that isn’t easy to see, and many little details (like some responsive resizing for low sized terminals) that many people may never encounteer, and I’m proud of how those devlogs are only like 7h long?? Anyway, here’s a video of where I currently am, and thanks for reading all of that garbage nonsense written by a french guy that isn’t quite good at telling things in foreign languages.
Made a command to explain how Fleer relays, encryption and decryption work - always with a nice focus on terminal design, with colors, responsive and auto resize
Okay, changelog required even though I wasn’t planning on publishing it right now. Apart from some additions such as: --debug-socket flag that logs every actions happening between the client and a relay server Encryption protocol indicator (which is used by clients to know what algorithm and settings to use) is NOT known by the server anymore, as it is transferred in the share link itself Proper exit (and closure of spinner animations) when using Ctrl+C A few optimizations for responsive logs Downloading files is ALMOST done, I’m currently having many issues with slow file upload, and many attempts at optimizing it (that litteraly give me the idea of just quitting this project) and I’m making this changelog now because I think we might not finish this part of the CLI before at least 2 days. In the meantime, I daydreamed about many things I want to introduce into the project that will hopefully make a difference with others apps, even if I don’t have the same speed as them.
A few minors QoL changes: The CLI is automatically closed when download is finished, synced for both sender and receiver through an encrypted message that acts as a signal to tell both party they have done their job. Share Link is automatically copied into the clipboard of the sender, even if he’s remotely connected via SSH to another server. The directory in which files are saved is displayed at the end of execution (default to current folder). Improved performances when downloading. Some more verifications with the relay server used. Protect against Path Traversal vulnerability.
Didn’t wrote many lines of code on this project the last few days, was busy with personnal things so I’m listing what I pushed this week: User can decide what to do if a file already exist in the current directory (replace it, rename the new one, or skip this file). A new command fdd allows to start a download even faster, by checking the first parameter ( fdd <share_link> ) or any URL in the clipboard. fleer send command can generate a QR Code image, and display it for supported terminals (such as the incredible Ghostty). Download speed is displayed live in Mbps. Some fixes concerning security and downloading in specific conditions.
Not sure if Stardance will get extended until something like the end of September, so here am I (didn’t got many times to update the app and encountered many problems). A new command fleer relay followed by any Fleer Relay URL will output details about it. Receiver device name was sent in clear to the relay, it is now exchanged using encrypted messages. The transfer will be deleted if too many restarts happen (because messages size exceeds the limit for example). A structure containing all files, folders and path is included to give the receiver some visuals indications. If it’s too large, the structure will be dropped entirely. The amount of received/sent bytes will be displayed in Kbps instead of Mbps if it’s slow asf. Many bugs fixes and optimizations. The relay can now pauses transfers if it’s processing too many transfers at once. The indicated transfer size will include an estimated encryption overhead (the algorithm used can add some bytes to files). Transfers that shares MANY messages can use a feature from the relay that give clients ability to select the amount of cached bytes for messages and chunks. Inactives shares are deleted from the memory of the relay. The build version and latest commit pulled is returned to clients from the relay. Rate limits now apply to WebSocket messages.
After a few weeks without being able to do proper coding sessions (only got time to do it while being at school), I can finally release a new feature for Fleer! Integrity checking: after sending files, the receiver can ask the sender for a list of SHA-256 hashes. All communications are using encrypted messages to reduce the amount of things a malicious relay server can do. Integrity checking allows the receiver to be sure that files are identical from the sent one, and that the relay didn’t skipped chunks/files. I also added proper (and definitive) instructions for selfhosting a relay server by using Docker Compose (with prebuilt images via GitHub Actions), by building the image yourself with a Dockerfile, or to run from source. Reduce chunkSize when sending files if network conditions were really really bad before starting to send chunks.
Fleer is a decentralized platform, meaning anyone can host one or multiple relay servers. This devlog brings this concept even more to the Fleer CLI. Three lists of relay servers are hosted (on the GitHub repo, on my main website, and obviously on the Fleer landing page itself). These lists contain the URL for the currently only hosted relay. You can also add your own custom lists. In the future, the officials lists will include many more relays, from me or from anyone that contributes to the ecosystem, and the CLI is already prepared for that! I’m on a hotspot with like not even 1 Mbps so the video is just here for illustrative purposes 💀
Ships:
School is coming back soon, Stardance may be ending tomorrow, and I’m currently at 15% of what I want to do. I got an entire planning on Linear on what to do now. Fleer is a toxic-love project for me because of the numbers of issues I encountered, but I still want it to be done so bad. And yeah, I know testing is kinda hard now, I can’t publish an hosted testing instance so you will need to host it yourself (just one 30 MB Docker image to compile on any system and any architecture)....
|
1793602538.2544243
|
1793688938.2544243
|
|
43412
|
Java Utils by @ryan_ | Stardance
|
ryan_
|
1
|
80.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-15T11:20:22Z", "hours": 80.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built java-utils, a collection of high-performance Java utilities and APIs designed for Java 21+. It provides optimised and robust core features, featuring a high-performance event dispatching system, a multi layered and priority based service loading framework, thread safe object registries, and more. Features: High performance polymorphic event dispatching system (event bus) supporting priority-based routing and cancellation logic. It utilises SPI loaded compile time generated invoker factories for reflection free dispatch when compiled with the annotation processor, alongside high performance fallbacks via LambdaMetafactory and MethodHandle . A multilayered and priority service loading framework. Provided ServiceLayer s are passed to ServiceBootstrap to create ServiceRegistry , which allows users to find and locate implementations by providing the registry with a contract class, where the layers will locate the implementations. Thread safe freezable object Registry<T> with a mutate and freeze lifecycle, allowing safe registration during bootstrap before turning strictly read only on freeze. Config helpers to aid config serialisation with Kaleido Config (e.g. implement ISerializableEnum<T> on an enum to make it serialisable, ElementOrList type to either take a single element or a list) Reflection wrapper designed to try comply with the Java Language Specification (JLS)", "repo": "", "demo": ""}]...
|
[{"post_id": 47386, "ts": "202 [{"post_id": 47386, "ts": "2026-08-15T09:25:47Z", "hours": 5.1492, "text": "Event Bus: Make MainBus#get static instead of instance method to allow users to utilise the provided MainBus Service API: Fix ClassLoaderServiceLoader not working in module environments by declaring Module#addUses Add MutableServiceLayer for manual service layers and create factory method for configuring them Registry: Add static factory methods to create MutableMappedIdRegistry and MutableKeylessRegistry instances Other: Add demo subproject (CC0 license) showcasing features and how to use eventbus, registry and service api Update build workflow to publish demo artifact Add release github workflow to automatically publish artifacts when a release is created Promote config helpers, registry and service api from WIP to experimental Update README with event bus demo image"}, {"post_id": 47004, "ts": "2026-08-14T16:09:05Z", "hours": 8.4878, "text": "Event bus: Disallowed @Weak on static event handlers for reflection discovered methods. Static handlers do not have a listener to bound to and thus have no reason to be declared as weak listeners; this additionally improves parity with the annotation processor. Service API: Added factory methods to create ServiceLayer instances across different ClassLoader s and ModuleLayer s. Registry system: The registry system was redesigned essentially from the ground up. MutableRegistry has been detached from Registry , and extending interfaces such as MutableMappedRegistry provide additional features (e.g. key -> value mappings) Key -> value mappings are now supported via MappedRegistry and its implementors and ID mappings have been added via the IdRegistry interface. Current implementations like SimpleMutableKeylessRegistry and SimpleMutableMappedIdRegistry provide O(1) operations for lookup and registration whilst still supporting concurrent operations via BoundedSnapshotMap and BoundedSnapshotList as each registration is immutable. Other: Updated build workflow Added USAGE documentation to README showing how to add the library as a dependency in Gradle."}, {"post_id": 46095, "ts": "2026-08-13T01:54:52Z", "hours": 10.0317, "text": "Remove read lock on event dispatch by providing an activeTable Supplier to pass events to if this DispatchTable is closed, allowing #dispatch to race with #close safely. Decouple creation of DispatchTable from Flattener Add option to disable recursion guard in EventBusBuilder Further optimize event dispatch for guarded event buses by removing ThreadLocal#remove call. This remains safe as it is a lightweight 1 length int[] array. Fix ClassValueDispatchTable not dispatching events Improve internal RecursionGuard usability by accepting a Runnable instead of manual #increment and #resetTo(int) calls. Updated unit tests where appropriate to account for refactors Added JMH benchmarks for guarded and unguarded recursion event buses Updated README with benchmark results."}, {"post_id": 44383, "ts": "2026-08-10T03:00:29Z", "hours": 9.3928, "text": "Added support for compile time generated @Weak instance and static event processors. Full refactor of the annotation processor to cleanup the code structure and improve safety via compile time validation. New abstract MethodDescriptor implemented by alongside some implementations like ElementMethodDescriptor (annotation processor variant), ReflectionMethodDescriptor (runtime reflection variant) and MethodKeyDescriptor (cached reflection variant), used to compare methods cleanly. Individual method registration has not yet been implemented. MethodDescriptor will be utilised to locate individual handlers."}, {"post_id": 43302, "ts": "2026-08-08T14:19:28Z", "hours": 11.6325, "text": "Introduced compile-time generated event listeners via an Annotation Processor (AP automatically generates SPI implementations) to reduce runtime reflection which will fallback to reflection path ( LambdaMetafactory + MethodHandle fallback) on failure. Currently only built for instance event listeners: static listeners and direct method registrations will be implemented in the future. The annotation processor looks for classes annotated with @CompiledEventHandlers and generates a SubscriberInvokerFactory which holds an EventSubscriberInvoker for each method. Refactored the reflection subscriber path ( EventSubscriberCompiler and EventHandlerCompiler ) to follow SOLID better and improve extensibility Update unit tests to work with the updated code"}, {"post_id": 41860, "ts": "2026-08-06T10:32:43Z", "hours": 3.4558, "text": "Fixed issues with configuration caching Repackage and add javadoc to config helpers Improved usability by improving javadoc. Renamed Linkable to SubscribtionAware to better fit the name. Finalized EventBusBuilder by adding a register to global registry flag, replacing event consumers with dedicated functional interfaces, updating ErrorHandler to have throwUnchecked helper and replacing the old deprecated EventBus with the new one Repackage and rename module to com.github.rcubedev.utils"}, {"post_id": 40744, "ts": "2026-08-04T13:55:54Z", "hours": 1.1664, "text": "Updated the README by adding a project description, listing components and listing requirements."}, {"post_id": 40086, "ts": "2026-08-03T13:57:01Z", "hours": 30.5581, "text": "Deprecated the old EventBus god object, in favour for the new EventBus implementation which now better following SOLID, improving debugging and DX. It utilises composition, where all features are separated into different classes for testability. Migrated from a flat array dispatch table to a class value dispatch table for O(1) handler lookups after caching vs O(n) before."}]...
|
Title: Java Utils by @ryan_ | Stardance
Devlogs:
Title: Java Utils by @ryan_ | Stardance
Devlogs:
Deprecated the old EventBus god object, in favour for the new EventBus implementation which now better following SOLID, improving debugging and DX. It utilises composition, where all features are separated into different classes for testability. Migrated from a flat array dispatch table to a class value dispatch table for O(1) handler lookups after caching vs O(n) before.
Updated the README by adding a project description, listing components and listing requirements.
Fixed issues with configuration caching Repackage and add javadoc to config helpers Improved usability by improving javadoc. Renamed Linkable to SubscribtionAware to better fit the name. Finalized EventBusBuilder by adding a register to global registry flag, replacing event consumers with dedicated functional interfaces, updating ErrorHandler to have throwUnchecked helper and replacing the old deprecated EventBus with the new one Repackage and rename module to com.github.rcubedev.utils
Introduced compile-time generated event listeners via an Annotation Processor (AP automatically generates SPI implementations) to reduce runtime reflection which will fallback to reflection path ( LambdaMetafactory + MethodHandle fallback) on failure. Currently only built for instance event listeners: static listeners and direct method registrations will be implemented in the future. The annotation processor looks for classes annotated with @CompiledEventHandlers and generates a SubscriberInvokerFactory which holds an EventSubscriberInvoker for each method. Refactored the reflection subscriber path ( EventSubscriberCompiler and EventHandlerCompiler ) to follow SOLID better and improve extensibility Update unit tests to work with the updated code
Added support for compile time generated @Weak instance and static event processors. Full refactor of the annotation processor to cleanup the code structure and improve safety via compile time validation. New abstract MethodDescriptor implemented by alongside some implementations like ElementMethodDescriptor (annotation processor variant), ReflectionMethodDescriptor (runtime reflection variant) and MethodKeyDescriptor (cached reflection variant), used to compare methods cleanly. Individual method registration has not yet been implemented. MethodDescriptor will be utilised to locate individual handlers.
Remove read lock on event dispatch by providing an activeTable Supplier to pass events to if this DispatchTable is closed, allowing #dispatch to race with #close safely. Decouple creation of DispatchTable from Flattener Add option to disable recursion guard in EventBusBuilder Further optimize event dispatch for guarded event buses by removing ThreadLocal#remove call. This remains safe as it is a lightweight 1 length int[] array. Fix ClassValueDispatchTable not dispatching events Improve internal RecursionGuard usability by accepting a Runnable instead of manual #increment and #resetTo(int) calls. Updated unit tests where appropriate to account for refactors Added JMH benchmarks for guarded and unguarded recursion event buses Updated README with benchmark results.
Event bus: Disallowed @Weak on static event handlers for reflection discovered methods. Static handlers do not have a listener to bound to and thus have no reason to be declared as weak listeners; this additionally improves parity with the annotation processor. Service API: Added factory methods to create ServiceLayer instances across different ClassLoader s and ModuleLayer s. Registry system: The registry system was redesigned essentially from the ground up. MutableRegistry has been detached from Registry , and extending interfaces such as MutableMappedRegistry provide additional features (e.g. key -> value mappings) Key -> value mappings are now supported via MappedRegistry and its implementors and ID mappings have been added via the IdRegistry interface. Current implementations like SimpleMutableKeylessRegistry and SimpleMutableMappedIdRegistry provide O(1) operations for lookup and registration whilst still supporting concurrent operations via BoundedSnapshotMap and BoundedSnapshotList as each registration is immutable. Other: Updated build workflow Added USAGE documentation to README showing how to add the library as a dependency in Gradle.
Event Bus: Make MainBus#get static instead of instance method to allow users to utilise the provided MainBus Service API: Fix ClassLoaderServiceLoader not working in module environments by declaring Module#addUses Add MutableServiceLayer for manual service layers and create factory method for configuring them Registry: Add static factory methods to create MutableMappedIdRegistry and MutableKeylessRegistry instances Other: Add demo subproject (CC0 license) showcasing features and how to use eventbus, registry and service api Update build workflow to publish demo artifact Add release github workflow to automatically publish artifacts when a release is created Promote config helpers, registry and service api from WIP to experimental Update README with event bus demo image
Ships:
I built java-utils, a collection of high-performance Java utilities and APIs designed for Java 21+. It provides optimised and robust core features, featuring a high-performance event dispatching system, a multi layered and priority based service loading framework, thread safe object registries, and more. Features: High performance polymorphic event dispatching system (event bus) supporting priority-based routing and cancellation logic. It utilises SPI loaded compile time generated invoker factories for reflection free dispatch when compiled with the annotation processor, alongside high performance fallbacks via LambdaMetafactory and MethodHandle . A multilayered and priority service loading framework. Provided ServiceLayer s are passed to ServiceBootstrap to create ServiceRegistry , which allows users to find and locate implementations by providing the registry with a contract class, where the layers will locate the implementations. Thread safe freezable object Registry<T> with a mutate and freeze lifecycle, allowing safe registration during bootstrap before turning strictly read only on freeze. Config helpers to aid config serialisation with Kaleido Config (e.g. implement ISerializableEnum<T> on an enum to make it serialisable, ElementOrList type to either take a single element or a list) Reflection wrapper designed to try comply with the Java Language Specification (JLS)...
|
1793602539.4557188
|
1793688939.4557188
|
|
38857
|
Monitorify by @Leon36 | Stardance
|
Leon36
|
1
|
16.0
|
54
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-14T11:06:52Z", "hours": 12.0, "multiplier": 4.66, "payout": 54, "blessing": "neutral", "text": "Skip this Project if you’re not on a linux I made this Project called Monitorify, to monitor your Server (but you can also use it on your desktop Linux) . It uses a optional backround worker to collect metrics at every time. It’s features: CPU ussage Memory ussage Procsess list Disk ussage Network ussage You can configure your intervall, history timeline, and widget in the menu by pressing “m”.", "repo": "https://github.com/leonst036/Monitorify", "demo": "https://pypi.org/project/monitorify/"}]...
|
[{"post_id": 61558, "ts": "202 [{"post_id": 61558, "ts": "2026-09-04T15:11:02Z", "hours": 3.9972, "text": "Summary: Added Remote connection I added a feature to connect to your server remotly. For ts I’m using paramiko to simply create an ssh connection to the target server, installing monitorify on it and streaming the tui back."}, {"post_id": 46832, "ts": "2026-08-14T11:03:21Z", "hours": 0.4836, "text": "Summary: Published project on PyPI"}, {"post_id": 46816, "ts": "2026-08-14T10:25:41Z", "hours": 2.9506, "text": "Summary: Added Disk Ussage Widget and added a backround worker I made this new widget where you can see the I/O and storage ussage. The backround worker is ready, the only thing I have to do now is to make a installer for it."}, {"post_id": 42204, "ts": "2026-08-06T20:20:24Z", "hours": 5.4494, "text": "Summary: I added a new widget and made some Bug fixes It was very hard making this processes widget, because there so many processes on a system. If I render every process in the List at once and this on every refresh, it wouldn’t run smoothly. So I render only about 100 at once. I had the same issue with reading the PID list, I solved this using a Cache updating every 2.5 seconds, in an extra Thread. I also added a Menu to select wich widgets you want so see. And adjusting the Intervall of updates."}, {"post_id": 40648, "ts": "2026-08-04T10:20:53Z", "hours": 0.7114, "text": "I improved the widget layout and colors. I used btop as inspiration for the doted lines."}, {"post_id": 38454, "ts": "2026-07-31T20:40:54Z", "hours": 1.9336, "text": "Simple Widget to monitor your system Right now it looks very simple, but it works! I’ll add more settings like adjusting the intervall It’s made in python with the framework textual"}]...
|
Title: Monitorify by @Leon36 | Stardance
Devlogs: Title: Monitorify by @Leon36 | Stardance
Devlogs:
Simple Widget to monitor your system Right now it looks very simple, but it works! I’ll add more settings like adjusting the intervall It’s made in python with the framework textual
I improved the widget layout and colors. I used btop as inspiration for the doted lines.
Summary: I added a new widget and made some Bug fixes It was very hard making this processes widget, because there so many processes on a system. If I render every process in the List at once and this on every refresh, it wouldn’t run smoothly. So I render only about 100 at once. I had the same issue with reading the PID list, I solved this using a Cache updating every 2.5 seconds, in an extra Thread. I also added a Menu to select wich widgets you want so see. And adjusting the Intervall of updates.
Summary: Added Disk Ussage Widget and added a backround worker I made this new widget where you can see the I/O and storage ussage. The backround worker is ready, the only thing I have to do now is to make a installer for it.
Summary: Published project on PyPI
Summary: Added Remote connection I added a feature to connect to your server remotly. For ts I’m using paramiko to simply create an ssh connection to the target server, installing monitorify on it and streaming the tui back.
Ships:
Skip this Project if you’re not on a linux I made this Project called Monitorify, to monitor your Server (but you can also use it on your desktop Linux) . It uses a optional backround worker to collect metrics at every time. It’s features: CPU ussage Memory ussage Procsess list Disk ussage Network ussage You can configure your intervall, history timeline, and widget in the menu by pressing “m”....
|
1793602540.6452057
|
1793688940.6452057
|
|
45928
|
WebOS1 by @SarthakVishwakarma | Stardance
|
SarthakVishwakarma
|
2
|
2.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-21T15:24:06Z", "hours": 0.0, "multiplier": 2.97, "payout": 1, "blessing": "neutral", "text": "I just updated and add some wallpaper system in webOS1", "repo": "https://github.com/sarthakvishwakarma44-prog/WebOS1", "demo": "https://sarthakvishwakarma44-prog.github.io/WebOS1/"}, {"ship_num": 2, "ts": "2026-08-11T15:12:02Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I make a new my own WebOS. This is first project on stardance challenge by hack club. When i am writing a coding, there had been many mistakes that i make, but using AI I solved this problem and started writing script again. “By trying this project other will learn that they was also able to make their own OS and how will the OS works(basic functions). THANKYOU.", "repo": "https://github.com/sarthakvishwakarma44-prog/WebOS1", "demo": "https://sarthakvishwakarma44-prog.github.io/WebOS1/"}]...
|
[{"post_id": 51712, "ts": "202 [{"post_id": 51712, "ts": "2026-08-21T15:22:03Z", "hours": 0.3, "text": "New Update!"}, {"post_id": 45202, "ts": "2026-08-11T15:01:51Z", "hours": 0.4333, "text": "My WebOS is ready to use!"}, {"post_id": 45018, "ts": "2026-08-11T04:56:01Z", "hours": 0.4244, "text": "Working on CSS and java script for my own Web OS."}, {"post_id": 44997, "ts": "2026-08-11T04:04:07Z", "hours": 0.3464, "text": "Working on my own WebOS html code."}, {"post_id": 44702, "ts": "2026-08-10T17:19:25Z", "hours": 0.4997, "text": "Working on my own WebOS."}]...
|
Title: WebOS1 by @SarthakVishwakarma | Stardance
Title: WebOS1 by @SarthakVishwakarma | Stardance
Devlogs:
Working on my own WebOS.
Working on my own WebOS html code.
Working on CSS and java script for my own Web OS.
My WebOS is ready to use!
New Update!
Ships:
I make a new my own WebOS. This is first project on stardance challenge by hack club. When i am writing a coding, there had been many mistakes that i make, but using AI I solved this problem and started writing script again. “By trying this project other will learn that they was also able to make their own OS and how will the OS works(basic functions). THANKYOU.
I just updated and add some wallpaper system in webOS1...
|
1793602541.8247318
|
1793688941.8247318
|
|
42170
|
Jarvis by @Lalith | Stardance
|
Lalith
|
1
|
7.76
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T10:47:37Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Jarvis, an AI Slack bot for the Hack Club workspace that you can @-mention or DM — it chats back with some personality, remembers the conversation, reacts with emoji, and even has real skills like web search, fetching links you share, checking weather in any city, pulling today’s top Hacker News stories, and setting reminders that post right into the thread, plus a few slash commands like /jarvis-ping and /jarvis-joke. The hardest part was getting the AI working: OpenAI had no credits so I migrated the whole thing to Gemini, which meant figuring out a new key format and an OpenAI-compatible endpoint, and discovering the cheapest model isn’t even available to new accounts — plus wiring the agent’s async tool-calling into Slack’s streaming replies while keeping everything testable, which is why there are 48 unit tests with fake clients, a type-checked codebase, clean lint, and a green CI. I’m proud that it’s genuinely polished rather than a demo — every command is jarvis-prefixed so it never collides with the other bots, it has a proper systemd setup for running 24/7 on Nest, and the whole repo is tidy enough that anyone could run it themselves. To test it: invite @Jarvis to any channel in the Hack Club Slack (or DM it) and ask for weather, top stories, a reminder in a few minutes, or paste a link and ask what’s on it — code’s at github.com/Hustlenix/jarvis if you want to see the internals.", "repo": "https://github.com/Hustlenix/jarvis", "demo": "https://hackclub.slack.com/archives/C0P5NE354/p1790510878067549"}]...
|
[{"post_id": 79073, "ts": "202 [{"post_id": 79073, "ts": "2026-10-12T15:59:03Z", "hours": 2.9342, "text": "I have finished my Slack Bot mission which is named Jarvis, and it can now be acessed in: https://slack.com/app_redirect?app=A0BNWE36ME2&team=T0266FRGM It is live 24/7 for free!"}, {"post_id": 74445, "ts": "2026-09-27T12:01:36Z", "hours": 1.8214, "text": "Fixed Jarvis after my first review — moved the AI to Hack Club AI, found and fixed a hidden tool-schema bug, and got all 105 tests passing.I also repaired the broken GitHub Actions deployment workflow and rewrote the README based on what I actually built and learned.Only the final 24/7 Nest deployment + real #bot-spam demo is left before I resubmit."}, {"post_id": 43895, "ts": "2026-08-09T10:45:40Z", "hours": 0.8431, "text": "Finally, IG that this project is ready to ship as it is working just fine. But, the problem is that Nest is still pending so i can’t get it to 24/7, and IDK why but the app isnt working so the slash commands are still broken on Slack"}, {"post_id": 43748, "ts": "2026-08-09T05:13:11Z", "hours": 1.8794, "text": "Learning before building really helped me do it ASAP. To make this, what I did was — spend my first 20 minutes understanding how Slack bots actually work before writing a single line of code or building it. The pieces turned out to be simpler than I feared: a Slack app created at api.slack.com, Socket Mode (the bot connects over WebSockets, so it needs no public URL or server), and two tokens — a bot token (xoxb-…) and an app-level token (xapp-…). Once that clicked, everything else was just wiring. I built it in Node.js with Slack’s official Bolt framework. One command, node index.js, and Jarvis connects to the Hack Club workspace. Then I gave it a personality and some skills: Talk to it — mention @Jarvis or DM it and it replies with AI: concise, friendly, lightly witty It remembers — conversation history per thread, so it can actually follow along It reacts — every message gets a themed emoji reaction 4 slash commands — /jarvis-help, /jarvis-ping, /jarvis-catfact, /jarvis-joke An App Home tab — commands list, online status, and feedback buttons The build wasn’t smooth the whole way, and the failures taught me more than the wins: My OpenAI key had zero credits — first AI reply was a sad 429 You have no credits. I switched to Gemini with a free Google AI Studio key, pointed the SDK at Google’s OpenAI-compatible endpoint, and used gemini-3.1-flash-lite, the cheapest model available to new accounts. Command collisions — every Slack bot shares the workspace’s slash-command namespace, so I prefixed everything with jarvis- to keep them unique. “The app did not respond” — my commands were registered in code but not in the app’s config on Slack’s side. Updating the manifest at api.slack.com and reinstalling the app fixed it. Classic config-vs-code mismatch. Repo hygiene — I renamed the entry file to index.js, deleted template leftovers, and squashed the git history into one clean “Initial commit”. Staying alive 24/7: I cloned the repo onto Hack Club Nest, wrote a systemd service (restarts on crash and on reboot), and enabled it. Jarvis now stays online even with my laptop closed — plus an optional GitHub Action redeploys it on every push. Quality check: 28 passing tests, lint and typecheck clean. Jarvis is live in #bot-spam right now. Say hi — or try /jarvis-joke and watch it bomb on purpose."}, {"post_id": 43372, "ts": "2026-08-08T15:59:56Z", "hours": 0.0, "text": "Spent the last hour last hour learning about slack bot and now i am training and building it in real life. I googled slack bot and a random guy said that hell tech me it and now I am here"}]...
|
Title: Jarvis by @Lalith | Stardance
Devlogs:
Spe Title: Jarvis by @Lalith | Stardance
Devlogs:
Spent the last hour last hour learning about slack bot and now i am training and building it in real life. I googled slack bot and a random guy said that hell tech me it and now I am here
Learning before building really helped me do it ASAP. To make this, what I did was — spend my first 20 minutes understanding how Slack bots actually work before writing a single line of code or building it. The pieces turned out to be simpler than I feared: a Slack app created at api.slack.com, Socket Mode (the bot connects over WebSockets, so it needs no public URL or server), and two tokens — a bot token (xoxb-…) and an app-level token (xapp-…). Once that clicked, everything else was just wiring. I built it in Node.js with Slack’s official Bolt framework. One command, node index.js, and Jarvis connects to the Hack Club workspace. Then I gave it a personality and some skills: Talk to it — mention @Jarvis or DM it and it replies with AI: concise, friendly, lightly witty It remembers — conversation history per thread, so it can actually follow along It reacts — every message gets a themed emoji reaction 4 slash commands — /jarvis-help, /jarvis-ping, /jarvis-catfact, /jarvis-joke An App Home tab — commands list, online status, and feedback buttons The build wasn’t smooth the whole way, and the failures taught me more than the wins: My OpenAI key had zero credits — first AI reply was a sad 429 You have no credits. I switched to Gemini with a free Google AI Studio key, pointed the SDK at Google’s OpenAI-compatible endpoint, and used gemini-3.1-flash-lite, the cheapest model available to new accounts. Command collisions — every Slack bot shares the workspace’s slash-command namespace, so I prefixed everything with jarvis- to keep them unique. “The app did not respond” — my commands were registered in code but not in the app’s config on Slack’s side. Updating the manifest at api.slack.com and reinstalling the app fixed it. Classic config-vs-code mismatch. Repo hygiene — I renamed the entry file to index.js, deleted template leftovers, and squashed the git history into one clean “Initial commit”. Staying alive 24/7: I cloned the repo onto Hack Club Nest, wrote a systemd service (restarts on crash and on reboot), and enabled it. Jarvis now stays online even with my laptop closed — plus an optional GitHub Action redeploys it on every push. Quality check: 28 passing tests, lint and typecheck clean. Jarvis is live in #bot-spam right now. Say hi — or try /jarvis-joke and watch it bomb on purpose.
Finally, IG that this project is ready to ship as it is working just fine. But, the problem is that Nest is still pending so i can’t get it to 24/7, and IDK why but the app isnt working so the slash commands are still broken on Slack
Fixed Jarvis after my first review — moved the AI to Hack Club AI, found and fixed a hidden tool-schema bug, and got all 105 tests passing.I also repaired the broken GitHub Actions deployment workflow and rewrote the README based on what I actually built and learned.Only the final 24/7 Nest deployment + real #bot-spam demo is left before I resubmit.
I have finished my Slack Bot mission which is named Jarvis, and it can now be acessed in: https://slack.com/app_redirect?app=A0BNWE36ME2&team=T0266FRGM It is live 24/7 for free!
Ships:
I built Jarvis, an AI Slack bot for the Hack Club workspace that you can @-mention or DM — it chats back with some personality, remembers the conversation, reacts with emoji, and even has real skills like web search, fetching links you share, checking weather in any city, pulling today’s top Hacker News stories, and setting reminders that post right into the thread, plus a few slash commands like /jarvis-ping and /jarvis-joke. The hardest part was getting the AI working: OpenAI had no credits so I migrated the whole thing to Gemini, which meant figuring out a new key format and an OpenAI-compatible endpoint, and discovering the cheapest model isn’t even available to new accounts — plus wiring the agent’s async tool-calling into Slack’s streaming replies while keeping everything testable, which is why there are 48 unit tests with fake clients, a type-checked codebase, clean lint, and a green CI. I’m proud that it’s genuinely polished rather than a demo — every command is jarvis-prefixed so it never collides with the other bots, it has a proper systemd setup for running 24/7 on Nest, and the whole repo is tidy enough that anyone could run it themselves. To test it: invite @Jarvis to any channel in the Hack Club Slack (or DM it) and ask for weather, top stories, a reminder in a few minutes, or paste a link and ask what’s on it — code’s at github.com/Hustlenix/jarvis if you want to see the internals....
|
1793602542.9965277
|
1793688942.9965277
|
|
1252
|
My first slack bot! by @aayushim | Stardance
|
aayushim
|
1
|
1.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-01T20:23:52Z", "hours": 0.0, "multiplier": 1.06, "payout": 1, "blessing": "neutral", "text": "I made a slack bot that works in slack which can respond to commands. This was my first project so i had to set everything up along the way which took some extra time. Although there were some problems it was fun and it may not be very advanced but I can’t wait to make more. This isn’t linked to nest so the command must be running in terminal in order for it to work in slack. Will update that part in future.", "repo": "https://github.com/aayushimahindrakar/iwantstuff", "demo": "https://aayushimahindrakar.github.io/Slackbot/"}]...
|
[{"post_id": 12075, "ts": "202 [{"post_id": 12075, "ts": "2026-06-19T18:24:19Z", "hours": 0.2714, "text": "Fixed so it works in Hack Club slack."}, {"post_id": 11488, "ts": "2026-06-18T19:24:19Z", "hours": 0.7269, "text": "Slack Bot pt3 -I added 2 new commands: A about command (like help but says hi) and a nasa picture of the day command which also gives some info about it from the nasa site. -Fixed it so it is hosted on nest and can run 24/7 which i had trouble doing before. -To test use this link: https://join.slack.com/t/3d-iga5409/shared_invite/zt-3zmfq50ea-c1F9sixNJ2CUGV~afsIMLA"}, {"post_id": 408, "ts": "2026-06-01T20:14:29Z", "hours": 0.3428, "text": "Slack Bot pt2"}, {"post_id": 336, "ts": "2026-06-01T17:13:22Z", "hours": 0.0, "text": "Slack Bot!"}]...
|
Title: My first slack bot! by @aayushim | Stardanc Title: My first slack bot! by @aayushim | Stardance
Devlogs:
Slack Bot!
Slack Bot pt2
Slack Bot pt3 -I added 2 new commands: A about command (like help but says hi) and a nasa picture of the day command which also gives some info about it from the nasa site. -Fixed it so it is hosted on nest and can run 24/7 which i had trouble doing before. -To test use this link: https://join.slack.com/t/3d-iga5409/shared_invite/zt-3zmfq50ea-c1F9sixNJ2CUGV~afsIMLA
Fixed so it works in Hack Club slack.
Ships:
I made a slack bot that works in slack which can respond to commands. This was my first project so i had to set everything up along the way which took some extra time. Although there were some problems it was fun and it may not be very advanced but I can’t wait to make more. This isn’t linked to nest so the command must be running in terminal in order for it to work in slack. Will update that part in future....
|
1793602544.1842399
|
1793688944.1842399
|
|
48601
|
IronWare by @rasmus_stenlund | Stardance
|
rasmus_stenlund
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-17T22:00:33Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "IronWare This is a WarioWare style game themed around Iron Man getting back through the wormhole to New York City in Avengers. Complete 3 different minigames to finally return through the wormhole or lose all five lives and be stuck in space forever (or try again). All assets used in the game were made by me but were inspired by Marvel and Disney. This project has helped me go from not knowing anything at all about game development to actually having made a full game. There were of course some roadblocks such as typos in my code or not knowing how to do what I wanted at all, such as how to make a fullscreen toggle.", "repo": "https://github.com/RasmusStenlund/IronWare", "demo": "https://rasmus-s.itch.io/ironware"}]...
|
[{"post_id": 49224, "ts": "202 [{"post_id": 49224, "ts": "2026-08-17T21:37:16Z", "hours": 0.3528, "text": "I added a simple settings menu with a fullscreen toggle and finally uploaded my game on itch.io. I had to research how to make the game fullscreen and I found a reddit thread that just cleanly showed it."}, {"post_id": 49188, "ts": "2026-08-17T20:33:15Z", "hours": 1.6803, "text": "I added the third and final minigame and a win/loss screen. I had a lot of trouble making the final minigame since I first didn’t use global position and then won on red, which I couldn’t understand, but it was only on the right side. It turns out I had uses the scale property to shrink win area instead of size, so i had to apply the scale to my size value so that it would work. I think having Iron Man and the wormhole gives a better explanation for the goal of the game and what the win screen means. I think the final thing I will do is add a fullscreen checkbox in the settings menu and then I think I am done."}, {"post_id": 48868, "ts": "2026-08-17T13:03:31Z", "hours": 1.1108, "text": "I added the second minigame, a game where you need to click all arc reactors before the time runs out, and I also made the player sprite flip depending on direction in minigame 1 and added the iron man sprite to main menu. The remaining things I will add are settings, maybe another minigame, a win screen and a lose screen."}, {"post_id": 48794, "ts": "2026-08-17T10:24:26Z", "hours": 1.3808, "text": "I added the first minigame, a platformer minigame where you try to collect all arc reactors before the time runs out. I also drew an Iron Man sprite for the player to control. One thing I got stuck on was that the game wouldn’t move to the first minigame scene. This was because I had typed “.tcsn” instead of “.tscn” in my code. The next thing I will do is flip the sprite based on the players direction and add my next minigame"}, {"post_id": 48395, "ts": "2026-08-16T18:36:38Z", "hours": 1.265, "text": "I added a title screen and a working timer screen for the game and themed them by following the WarioWare mission guide. I also drew an image of Iron Mans arc reactor as the lives icon, since this is an iron man themed game. I think the idea of the game is being Iron Man and trying to go through the wormhole back to NYC, like in the first Avengers Movie."}]...
|
Title: IronWare by @rasmus_stenlund | Stardance
D Title: IronWare by @rasmus_stenlund | Stardance
Devlogs:
I added a title screen and a working timer screen for the game and themed them by following the WarioWare mission guide. I also drew an image of Iron Mans arc reactor as the lives icon, since this is an iron man themed game. I think the idea of the game is being Iron Man and trying to go through the wormhole back to NYC, like in the first Avengers Movie.
I added the first minigame, a platformer minigame where you try to collect all arc reactors before the time runs out. I also drew an Iron Man sprite for the player to control. One thing I got stuck on was that the game wouldn’t move to the first minigame scene. This was because I had typed “.tcsn” instead of “.tscn” in my code. The next thing I will do is flip the sprite based on the players direction and add my next minigame
I added the second minigame, a game where you need to click all arc reactors before the time runs out, and I also made the player sprite flip depending on direction in minigame 1 and added the iron man sprite to main menu. The remaining things I will add are settings, maybe another minigame, a win screen and a lose screen.
I added the third and final minigame and a win/loss screen. I had a lot of trouble making the final minigame since I first didn’t use global position and then won on red, which I couldn’t understand, but it was only on the right side. It turns out I had uses the scale property to shrink win area instead of size, so i had to apply the scale to my size value so that it would work. I think having Iron Man and the wormhole gives a better explanation for the goal of the game and what the win screen means. I think the final thing I will do is add a fullscreen checkbox in the settings menu and then I think I am done.
I added a simple settings menu with a fullscreen toggle and finally uploaded my game on itch.io. I had to research how to make the game fullscreen and I found a reddit thread that just cleanly showed it.
Ships:
IronWare This is a WarioWare style game themed around Iron Man getting back through the wormhole to New York City in Avengers. Complete 3 different minigames to finally return through the wormhole or lose all five lives and be stuck in space forever (or try again). All assets used in the game were made by me but were inspired by Marvel and Disney. This project has helped me go from not knowing anything at all about game development to actually having made a full game. There were of course some roadblocks such as typos in my code or not knowing how to do what I wanted at all, such as how to make a fullscreen toggle....
|
1793602545.3757777
|
1793688945.3757777
|
|
490
|
Slots Tycoon 2 by @arpanshah102 | Stardance
|
arpanshah102
|
2
|
31.0
|
412
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-18T21:55:37Z", "hours": 29.0, "multiplier": 15.94, "payout": 378, "blessing": "neutral", "text": "I made a slot machine game but with a bit more too it. It has a normal slot machine, yes, but it also has a crypto clicker and planet trading section further in the game. Currently, the planet trading isn’t fully finished but the basic functionality is. I won’t be working on this game any longer though. Since creating this, I learned react and now this code looks and is terrible to operate on. This is the last update sadly. To test everything out, you can type in “enableDevTools()” into the console and get access to the dev pannel.", "repo": "https://github.com/Arpan-Shah-102/slots-tycoon-2", "demo": "https://arpan-shah-102.github.io/slots-tycoon-2/"}, {"ship_num": 2, "ts": "2026-05-31T17:26:36Z", "hours": 2.0, "multiplier": 14.53, "payout": 34, "blessing": "neutral", "text": "I made a revamp of one of my oldest projects. It has an improved UI, upgrades, shop, themes, achievements, etc. To have an easier time testing my project, use this code in the console: “enableDevTools()”", "repo": "https://github.com/Arpan-Shah-102/slots-tycoon-2", "demo": "https://arpan-shah-102.github.io/slots-tycoon-2/"}]...
|
[{"post_id": 49191, "ts": "202 [{"post_id": 49191, "ts": "2026-08-17T20:40:39Z", "hours": 2.7411, "text": "I am half way done with working on planet modifications. I have sadly lost almost all motivation to work on this though because the code has began spaghettifying and I don’t think I can get back to that after I have tasted React."}, {"post_id": 39167, "ts": "2026-08-01T22:25:10Z", "hours": 5.8369, "text": "I have finished working on the basic trading aspect of the world section. I will now work on the modifications section."}, {"post_id": 28699, "ts": "2026-07-15T03:28:32Z", "hours": 3.4939, "text": "I have started working on The World update"}, {"post_id": 11721, "ts": "2026-06-19T02:49:40Z", "hours": 15.4992, "text": "I finished working on the crypto update."}, {"post_id": 7562, "ts": "2026-06-12T17:20:59Z", "hours": 1.6553, "text": "I started working on my crypto update."}, {"post_id": 85, "ts": "2026-05-31T17:18:28Z", "hours": 2.3158, "text": "I was working on finishing the admin panel, achievement system, and fixing minor bugs like problems with the sound system."}]...
|
Title: Slots Tycoon 2 by @arpanshah102 | Stardance Title: Slots Tycoon 2 by @arpanshah102 | Stardance
Devlogs:
I was working on finishing the admin panel, achievement system, and fixing minor bugs like problems with the sound system.
I started working on my crypto update.
I finished working on the crypto update.
I have started working on The World update
I have finished working on the basic trading aspect of the world section. I will now work on the modifications section.
I am half way done with working on planet modifications. I have sadly lost almost all motivation to work on this though because the code has began spaghettifying and I don’t think I can get back to that after I have tasted React.
Ships:
I made a revamp of one of my oldest projects. It has an improved UI, upgrades, shop, themes, achievements, etc. To have an easier time testing my project, use this code in the console: “enableDevTools()”
I made a slot machine game but with a bit more too it. It has a normal slot machine, yes, but it also has a crypto clicker and planet trading section further in the game. Currently, the planet trading isn’t fully finished but the basic functionality is. I won’t be working on this game any longer though. Since creating this, I learned react and now this code looks and is terrible to operate on. This is the last update sadly. To test everything out, you can type in “enableDevTools()” into the console and get access to the dev pannel....
|
1793602546.5414948
|
1793688946.5414948
|
|
70755
|
BetterW4 by @JohannesNeighbourhood | Stardance
|
JohannesNeighbourhood
|
1
|
13.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T10:50:41Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Checking school information on a phone should be simple. BetterW4 turns UWC Red Cross Nordic’s school website into a personalised native app, making it easier to find your schedule and access everyday school resources. Three major quality-of-life improvements: One combined timetable: Academic classes and extracurricular activities appear together, with subject colours and a Today overview. Students can see their day without switching between separate schedules. Offline access: Previously loaded information is cached locally, so students can check their timetable and other saved school information without reliable internet. Lessons at a glance: Home-screen and lock-screen widgets, plus an optional Live Activity, show the current or next lesson with a countdown. Students can quickly check their schedule without opening the app. BetterW4 also brings assessments, grades, mail, campus information, and school resources into native screens. Automatic sign-in handles expired sessions, reducing repeated trips through the login process. I spent 13 hours and 17 minutes building and preparing the iOS app for release, published it on the App Store, and distributed it to approximately 84 students who use iOS. Jonathan Bangert ( @jonbng ) made the Android counterpart. My contribution is the iOS app and its App Store release.", "repo": "https://github.com/jonbng/betterw4", "demo": "https://apps.apple.com/us/app/betterw4/id6803520141"}]...
|
[{"post_id": 81433, "ts": "202 [{"post_id": 81433, "ts": "2026-10-21T08:33:12Z", "hours": 13.2872, "text": "Made the app, uploaded it to the app store and distributed it to the 84 students who use IOS!"}]...
|
Title: BetterW4 by @JohannesNeighbourhood | Starda Title: BetterW4 by @JohannesNeighbourhood | Stardance
Devlogs:
Made the app, uploaded it to the app store and distributed it to the 84 students who use IOS!
Ships:
Checking school information on a phone should be simple. BetterW4 turns UWC Red Cross Nordic’s school website into a personalised native app, making it easier to find your schedule and access everyday school resources. Three major quality-of-life improvements: One combined timetable: Academic classes and extracurricular activities appear together, with subject colours and a Today overview. Students can see their day without switching between separate schedules. Offline access: Previously loaded information is cached locally, so students can check their timetable and other saved school information without reliable internet. Lessons at a glance: Home-screen and lock-screen widgets, plus an optional Live Activity, show the current or next lesson with a countdown. Students can quickly check their schedule without opening the app. BetterW4 also brings assessments, grades, mail, campus information, and school resources into native screens. Automatic sign-in handles expired sessions, reducing repeated trips through the login process. I spent 13 hours and 17 minutes building and preparing the iOS app for release, published it on the App Store, and distributed it to approximately 84 students who use iOS. Jonathan Bangert ( @jonbng ) made the Android counterpart. My contribution is the iOS app and its App Store release....
|
1793602547.7489889
|
1793688947.7489889
|
|
25644
|
rlbuddy by @kmdw | Stardance
|
kmdw
|
3
|
185.95
|
2643
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-28T00:20:30Z", "hours": 40.0, "multiplier": 18.76, "payout": 740, "blessing": "neutral", "text": "I made rlbuddy, a rocket league companion app! This is the third ship so far. The big features this time are the asset swapper and Linux support, but I think that the feature I’m most proud of this time is the asset swapper! It inserts the appearance of one item into the file of another, meaning by swapping out assets for others you can make your car look however you like! (Client-side only, of course). I learned a lot about byte-level manipulation and working with raw data streams and encryption/decryption in Rust, and I can read hex (relatively) well now! It’s also great because I think this combined with the doorstop experiment from a while ago gives me a nice base to try some reverse-engineering challenges in the future. I also worked a lot on performance this time, such as tuning loop times/ui fps caps and minimizing ram usage (I achieved around an 80% reduction here!) There are a crap ton more features added than that (totaling almost 100 commits), but I’m pretty sure you’re not supposed to have massive feature-dumps on the ship text. So the full list is on the latest github release! In the image, you can see I have a white fennec. In reality, I don’t actually have a tw trim, and the equipped decal isn’t compatible with the fennec either. But, using the power of asset swapping, I can get a beautiful all-white car. Neat!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}, {"ship_num": 2, "ts": "2026-09-07T20:33:21Z", "hours": 27.0, "multiplier": 16.74, "payout": 457, "blessing": "neutral", "text": "rlbutddy is a feature-rich companion for Rocket League, and v1.2 is out. There’s been some big architectural changes meaning it’s faster and bug-free-er, as well as big new features! New!!! Avatars! Now you can see people’s profile pictures even when you’re not on their platform. Custom map loader! You can import maps from a ZIP or download them straight from Bakkesplugins! Gamepad overlay! Show your controls while playing, to show off your bindings or get some help with your speedflips. I think I’ve definitely improved at Rust since the last release. Just in terms of the amount of mistakes I make, I feel like it’s way more smooth sailing than before. For example, I was able to (mostly) write not-so-buggy code and “run the borrow checker in my head” without needing to cargo check a million times, and clippy tends to have a lot less suggestions for me. Pretty great!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}, {"ship_num": 3, "ts": "2026-08-25T22:08:36Z", "hours": 109.0, "multiplier": 17.59, "payout": 1446, "blessing": "neutral", "text": "rlbuddy is a feature-filled companion for Rocket League! It shows the skill of everyone in your lobby and has tons of toggleable widgets and features to make your life a lot easier, from Discord integration to music control. This is my first non-tiny Rust project, and I think it was really great! I’ve learned a lot such as proper state management and the ins and outs of Rust’s syntax. You can give it a try by heading to the Github releases section. If you play Rocket League, I hope you use it!", "repo": "https://github.com/Kalilamodow/rlbuddy", "demo": "https://github.com/Kalilamodow/rlbuddy/releases/latest/"}]...
|
[{"post_id": 80191, "ts": "202 [{"post_id": 80191, "ts": "2026-10-16T17:13:05Z", "hours": 3.4819, "text": "more small improvements. i gave the session stats widget an actual service as well which speeds things up a lot since its not recalculating statistics every single frame. the swapper also uses the backup file if one is available and it no longer accepts duplicate custom maps"}, {"post_id": 77292, "ts": "2026-10-06T13:38:54Z", "hours": 0.4772, "text": "A few fixes here and there. Some refactors, caching externally loaded playlists in savedata, and fixing a deadlock when clearing the items cache. And for some reason the decal option was missing from the items list picker."}, {"post_id": 75881, "ts": "2026-10-01T13:48:20Z", "hours": 5.9928, "text": "I made a standalone web-based swapper for the people who don’t want to download an entire app. A lot of people had broken packages after the last update but didn’t want to install a dedicated program just for a few swaps. So, I used the asset swapper backend of rlbuddy to make this thingamabob which runs entirely in the browser! First, I had to find out how to actually share rlbuddy’s asset swapper with other projects. Turns out Cargo has a cool thing called workspaces where you can have multiple crates in the same repo! So I moved the dedicated UPK/AES etc. stuff into a new crate and added it as a dependency in regular rlbuddy. Then, I whipped up a small wasm-compatible eframe app with the template, and included the new crate as a dependency. I made a big state machine of the steps meaning it’s impossible to have an invalid state, which is really nice. The only problem was that Rust’s ownership system isn’t smart enough to deal with it, so the code is a bit repetitive in places but it’s definitely worth it. The WASM restrictions were super annoying, mainly do to with filesystem access and requiring async. I ended up using the egui-async crate and spilling Binds all over the place within the state machine. I couldn’t even figure out how to get the actual swap procedure to run in a different thread. I also spent like 30 minutes debugging why in the world asset swapping was just broken. Even when I verified the same binary data were going in to the Upk object in the webapp and rlbuddy, for some reason the output upk was just different. Turns out I used chosen_replacement.name instead of chosen_replacement.package.name() . Isn’t that great? Anyways, it works fine now and I’m planning on posting it on r/RocketLeagueMods and possible r/RocketLeague."}, {"post_id": 74679, "ts": "2026-09-27T23:46:54Z", "hours": 3.0297, "text": "Not much in terms of super-cool stuff this time. Highlights are: make sure dynamic playlist loading uses the latest cache file (and also fix its loading on normal people’s rocket league installs) loading the cache file on another thread so it doesnt freeze the whole app for a second on the first lazy lock access searching for items in the item swapper moved the error handling of the map loader to anyhow So no ultra-exciting things to talk about. anyhow is really cool though, it really simplifies error handling everywhere in the app, and I’m a big fan of its bail! macro. I’m also using Cow a lot more. Moo!"}, {"post_id": 73444, "ts": "2026-09-25T03:22:46Z", "hours": 4.635, "text": "I got licensee version 34 (encrypted payloads too) to swap finally! Okay, so this was awesome. Rocket League’s been having a bunch of updates lately, which breaks the packages of people trying to get free stuff. So, in a Reddit thread, I ended up dishing out a bunch of swapped asset files for people in this situation. There’s a new boost which everybody wanted really bad since it was really rare (but they decided to make it unlockable at rocket pass lv99 so it doesn’t even matter anymore), and it was UNSWAPPABLE for three reasons: it was encrypted specially i hadnt encountered specially encrypted packages meaning their handling was wrong aes keys werent out for it yet (or so I thought) I’ll start with 3. I had written a tool which looks in the games cache for AES keys, and dumped them, and it worked great. What I didn’t expect is the filename to change between versions. So, I was super confused since yesterday since the AES key for the boost was just… missing. Thankfully, the geniuses at the RLMM discord got it and helped me figure out that the file I was reading from was just outdated. Great! Anyways, not too big of a deal, just a big delay. Now it’s time for the real challenge: figuring out how the hell to handle this type of package. First, I did some research. The twelve bytes of padding in files with licensee version >=33 before the summary are actually a nonce/aes iv, not just padding. Then, the header is encrypted with AES-CTR with the twelve first bytes of the iv just being the nonce. And the compressed chunks are encrypted too here: each one is also AES-CTRed with their own nonces in FCompressedChunkInfo. Thing is, I don’t have an implementation to really go off anymore, meaning there’s a lot more trial and error. For the original implementation, there were one or two existing asset swappers (though they were vibecoded meaning more of a puzzle to figure out what they’re even doing), but this time I was mostly relying on emii’s fork of UEViewer. Anyways, after spending a while figuring out what exactly I had to masquerade (payload, key, swap nonces) I finally got it to work!"}, {"post_id": 72491, "ts": "2026-09-23T02:26:44Z", "hours": 1.8381, "text": "rlbuddy now loads additional playlists straight from the game’s cached webconfig, instead of hardcoding them all! This means that the list of playlists will basically never go out of date. There are actually quite a few services which rely on game files (eg. auto stats api setup, custom maps, asset swapper). So, the first thing I did was to refactor it so make all of these load from the same global value. Then, for playlists, I made it read from a specific file in the game’s http cache directory which contains a bunch of configuration. Then, it parses it into a JSON object, grabs all the values with Class PlaylistSettings_TA, and then extracts the title and playlist id! There are still a bunch of built-in Playlists, since those have internal things like going from a casual playlist type to its respective competitive one or having the hard-coded list of singleplayer playlists. But, all the other ones, like ltms are dynamically loaded. Yay!"}, {"post_id": 72027, "ts": "2026-09-22T00:56:20Z", "hours": 3.9097, "text": "I made a ton of improvements to the asset swapper! And fixed a bug with the music player which is cool technically, so I’ll start with that. The player uses the GSMTC api, which is async, but egui doesn’t really like async. So, I made it so that every time you wanted to run some command on the current session, it would start up a new thread. This was less than ideal for a few reasons: terrible performance race conditions could happen just… in Windows itself The main problem was 2: for example, if you skipped a replay too fast, the Play command from the end of the replay might actually reach Windows before the Pause command from the replay start, leaving your music paused. So instead, it starts one dedicated worker thread which has a channel which receives a Box<dyn FnOnce(Session)> , and executes at most one command every 50ms (only one command per loop, fixed loop time of 50ms). It’s really interesting because you actually end up sending a closure through a channel, which feels funny but when you really think about it it’s just ownership semantics. But, that’s working great now! On to swapper improvements! First, I moved most of the swapper module to anyhow handling (it’s heaven!), and I also modernized the upk api a bit since it was basically dragged directly from the proof-of-concept repo, meaning it was not really application-ready. Also, it previously looked at the game’s webcache to decode the AES keys for header decryption, but now it uses the wonderful Toga-Files repository along with a really nice caching layer for it to load items and their associated API keys. Having access to the actual item data is also way better since you don’t have to manually type in a package name which is kinda weird for any normal person. Now, you can select it from a dropdown instead! I love UX."}, {"post_id": 71420, "ts": "2026-09-20T19:51:05Z", "hours": 4.5228, "text": "rlbuddy now has item swapping! Basically, making one item appear like another to use items you don’t actually own. These hours were spent on a few different things. Firstly, I optimized the thing a bunch! There were a few places that were pretty slow since the original repo was mainly for testing. For example instead of decrypting the entire header and rechecking it to find the right key, it only loads the first 4 blocks and attempts to decrypt the first FString. If it fails, that means the AES key isn’t valid. Also, I improved the error handling with anyhow. It actually makes it so much easier to deal with things and was pretty useful when debugging the move over to the actual app. Now I’m just going to work on polishing the panel UI a bit more, since it’s still kind of ugly."}, {"post_id": 70888, "ts": "2026-09-19T23:20:36Z", "hours": 2.1058, "text": "Apparently there are a bunch of different AES keys rocket league uses, not just one. You can get a list of them from the psynet config url, and then do some weird crc stuff to change them from “content keys” to aes keys. I discovered the rocket league mapmaking discord today and I’m blown away by the amount of information on there, and also apparently my whole thing about the unknown bytes when licensee version > 32 was straight up wrong, which is funny. Anyways it works for all items now, which is great. I’m gonna work on actually putting it in rlbuddy now, hopefully that goes well"}, {"post_id": 69896, "ts": "2026-09-18T01:01:05Z", "hours": 0.9667, "text": "IT WORKS WHEN THE HEADER EXPANDS NOW YAYAYYAYAYAYYAYAYYAYAYAY I’m gonna be honest, the problem might just have been that my testing package was corrupted. I was debugging my deserialization logic, which I thought might have some parsing issue near the header extraction, and noticed that once the encrypted region deserializer’s Cursor reached the end of the region, it was actually FARTHER than the package summary’s total_header_size - by 6 bytes! That’s pretty bad, and I don’t know how something like that even happened. Anyways, I repaired the game and brought over the shiny new upk and… it worked. I’m pretty sure that I only accidentally did this while tidying up my workspace a few hours ago, but if this has genuinely been the thing holding me back for the past few days - I also finally made the poc code public, at https://github.com/kalilamodow/rl-upk-testing/"}, {"post_id": 69850, "ts": "2026-09-17T22:15:40Z", "hours": 1.67, "text": "IT SWAPPED IT SWAPPED IT SWAPPED AHAHAHHAHAHAHHAHAHAHAHHA FINALLY Okay now I gotta make it work for other pairs of boosts. If WHEN that works, I’ll actually put it in rlbuddy. I removed all the code relating to changing offsets to try to give myself a minimal workspace to tinker in, with as little side effects as possible. So, all the current code does is 1. open them 2. replace the name table entries and package guid. Surprisingly simple. Once I make it a bit more generic, I can extend it to support more swaps. If I’m really unable to get it to work for more combinations, I’ll probably end up just publishing the poc repo and not adding swapping to rlbuddy at all. This is a great motivation boost, though. I was honestly dreading coming home to work on it today because I was done with failing over and over, and considering giving up."}, {"post_id": 68661, "ts": "2026-09-15T14:25:29Z", "hours": 2.6667, "text": "I got a name swap! It doesn’t work properly, but I’m glad the game didn’t crash. These hours have been by far the most frustrating because the only way to test is against the real game since it’s really picky, but the game takes like 30 seconds to start, and if it crashes, it gives a cryptic error log, and if it freezes, it doesn’t give any log at all. I spent most of the time messing with moving different offset values forward and backwards, and ended up reverting to a simpler version with no overwriting when the header size changes just to test things. So far, I’ve mostly gleaned that name renaming is possible, but only up to a point. If the name grows too much, the game crashes, and if the name shrinks too much, the game freezes. Additionally, for some reason, total_header_size changes by the padded header size instead of the encrypted header size, which I still don’t understand. It’s seriously weird. I serialize each name properly, and yet the game reads it wrong. This game really does need a new codebase. When UE6 comes out, either the game’s gonna be so good it doesn’t need mods, or it’ll be relatively easily moddable. Or neither, which is the most probable based on Epic Games’ track record. Anyways, enjoy the beautiful screenshot."}, {"post_id": 68281, "ts": "2026-09-14T20:49:26Z", "hours": 3.1181, "text": "I figured out what comes after export tables! And it took way too long, since I DISCOVERED IT MYSELF! At least, as far as I know. I couldn’t find any information online about this portion of the header, so it was basically luck that I noticed a pattern. Before, I was just copying everything after the export table and pasting them back in afterwards, but as you can guess, that stopped working if I adjusted anything within the encrypted region. Compressed chunk info is a known part, and I figured out the AES padding pretty easily, so most of the time was spent trying to figure out what in the world those 24 bytes were. The first four bytes in the compressed chunk info are how many chunks they are. Here, in the Bubbles boost package, there are two (little endian), with 24 bytes of ???. And in Flamethrower, there are three, with 36 bytes of ???. I noticed that the ??? was always n chunks * 12 bytes (actually, it’s lucky that I didn’t test any which ended up having 0, otherwise I probably wouldn’t have figured it out). Since this probably had something to do with chunks, I made a guess that each chunk had some extra data stored in this array, 12 bytes of info per chunk. Using HxD’s highlight-bytes-and-get-the-decimal-value feature, I noticed a pattern where the first 8 bytes looked like an i64 offset and the last 4 looked like an i32 size, which the compressed chunk infos were also like for their matching counterparts. So, I deserialized it as [i64; i32] * n chunks and was able to read it better. These additional chunk infos seem to kinda sorta match up to uncompressed header offsets, but I don’t really understand what they are (and they’re marked as such in the code, lol). So, with that working (and some fiddling with broken serialization of TArrays which I’m surprised I didn’t catch earlier), I now understood the ENTIRE package header! Hooray! Let’s look at another example. body_grain_SF, the Fennec, has 4 chunks. Guess how many bytes of ??? it has. That’s right, zero! For some reason, a few packages just don’t have those things. After going through a bunch of them, I found that if licensee version was 32, there was no ???. But if it was 33, there WAS ???. I basically just added an if statement and it was fixed. I’m going to try to work on figuring out the padding in between the package summary and the start of the name table, but if I can’t, I suppose I’ll finally get to actually doing package swapping. Later!"}, {"post_id": 67059, "ts": "2026-09-13T03:19:34Z", "hours": 2.9378, "text": "I JUST DESERIALIZED AND RESERIALIZED A UPK. OMAIGOD IM SO HAPPY. my brain is so tired. Alright so the payload still doesn’t get transferred but that’s pretty simple, it’s just Vec::extend. What a challenge! Deserialization actually ended up being the easy part, which is opposite of what I expected from starting the project. It went (relatively) fast since there are a few existing implementations which I could kinda just “borrow” structure parsing from. But, mine is unique in that it almost completely reserializes the package itself. I might’ve been able to “borrow” reserialization, but the impl I’ve been looking at is STRAIGHT ai slop and it’s more annoying to read that than to just do it myself. It was useful though, so I have to respect it. The first problem: basically, the first byte of an FString determines how many parts it has, NOT how many bytes it has. Which wasn’t a problem for parsing, since I had some word-based helpers which worked so I didn’t think much about it. But, when reserializing, I made two mistakes: 1. forgot to add the null terminator (which shouldn’t even be necessary) and 2. I accidentally put the wrong offset. I have no clue why there’s a null terminator for FStrings. The format is [n chars][the char bytes], meaning it should already be known how long the string is. Pretty stupid, but whatever. Anyways, when reserializing you’re supposed to include the null terminator in the string length marker. So, my logic was that I should offset it by two since unicode characters are two bytes. Bleh! I should’ve only incremented by one, since it’s in terms of utf16 chars rather than bytes. Yay, that worked! I don’t know how to summarize the next problem, so I’ll explain the reasoning. The package header is file summary + tables + something else (we’ll get to that later). Anyways, there’s some mysterious padding in between the summary and tables. Parsing, it’s easy to skip over because the summary includes the tables start offset ( name_offset , the name table is the first one). But when reserializing, you gotta keep those offsets intact. Well, I’m not totally sure if you actually have to keep them, but just for the sake of simplicity I tried to (which ended up adding more complexity, which I’ll see if I can remove now). So, I serialize/push the summary to the big Vec. Then, I make a new Vec and serialize the name table at (name_offset - summary_size), since the new Vec has to be encrypted and then appended to the big Vec. I do the same thing for imports/exports (placing the table at import/export _table_offset - summary_size ). Oh no! Since name_table_offset isn’t equal to summary_size, there’s some padding in between, which is expected. HOWEVER! The previous logic would skip over it in the table Vec creation, meaning the table Vec would have some 0-padding at the start. This padding needs to be in the SUMMARY part instead, and the name_offset should basically be the ZERO of the tables Vec! I doubt I would’ve been able to solve this part without the beautiful tool HxD . It’s really easy to use and is always helpful when I’m figgling around with binary. So, it does some more math, calculates the spacing, adds it to the big vec, and removes it from the tables Vec. Then, it re-encrypts the tables Vec and pushes it onto the big Vec! Okay, now that’s done. NOPE! There’s a mysterious structure for some reason at the end of the real table part? Yep, it’s that something else I said we’ll get to. I actually still have no idea what it is. From some research, I gathered it must be the dependencies table, but it’s really poorly documented. So, I ended up just cutting the bytes out from after the export table to the end of the tables part, and “pasting” it back before re-encryption. I do hope this devlog was readable. Now I’ll get to including the actual package payload and hopefully simplifying reserialization offsets. See you soon!"}, {"post_id": 66867, "ts": "2026-09-12T20:09:08Z", "hours": 2.0211, "text": "I’ve been putting this off for a while, but I’ve finally decided I’m going to add asset swapping. There’re a few existing implementations, so I’m reading those as well as some pdfs about the upk format. So basically credit to this document and this implementation . All it can do for now is parse the file summary. The implementation wasn’t too bad since I had Google as well as the C# implementation I just talked about. I basically have trait Deserializable : Sized { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > ; } Then implement that for the various parts (eg. FGuid , a generic TArray ). Then, I use byteorder to read out numbers into each struct. For example, #[derive(Debug)] struct FCompressedChunkInfo { uncompressed_offset : i64 , uncompressed_size : i32 , compressed_offset : i64 , compressed_size : i32 , } impl Deserializable for FCompressedChunkInfo { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > { Ok ( Self { uncompressed_offset : reader .read_i64 :: < LittleEndian > () ? , uncompressed_size : reader .read_i32 :: < LittleEndian > () ? , compressed_offset : reader .read_i64 :: < LittleEndian > () ? , compressed_size : reader .read_i32 :: < LittleEndian > () ? , }) } } I originally prototyped it in Python and then moved to Rust once I got tired of python’s byte shenanigans."}, {"post_id": 66219, "ts": "2026-09-11T22:03:11Z", "hours": 2.5883, "text": "I did lots of performance improvements and also IT WORKS ON LINUX NOW!!! Let’s talk about performance first. Anyways, it has been using around 4% and 220MB of ram, which isn’t really what you’d expect from an overlay! So, I used things like DHAT to profile the memory, and noticed that fonts were doing some shenanigans. So I removed egui_system_fonts and loaded directly from C:\\Windows\\Fonts\\segoeui.ttf and RAM usage dropped to 30mb. That was what the previous devlog was about. I then changed the default logic update rate from 10ms (100/s) to 65ms (15/s approx). This reduced idle cpu usage to under 0.2%. But, doing anything with the UI would spike it to 4%, which is still pretty bad. So, I used a method I found in an egui issue thread where I’d count the frametime since the last render, then sleep until the target frametime was finished. For example, if the frame rendered in 2ms but I want 16ms frametime, it would sleep for 14ms. That way, I could limit how often the UI rendered! This made it stay under around 1% CPU forever! Okay, Linux time! Rust is mostly cross-platform, so support was mostly dealing with dumbass design decisions. Since Music relies on GSMTC, I had to feature-gate the entire thing (as well as the windows/windows-future crates) behind cfg(windows) :( I also had to fix Linux font loading (since like I said earlier, it’s hardcoded to segoe ui). So I install fontdb on Linux and search for some popular fonts from there to load instead. Finally, I fixed up the storage paths since it could only load from AppData. I also made it use AppData\\Local vs. AppData\\Roaming instead of putting everything in Roaming. I first got it working through WSL! ! It took some messing with my GPU drivers but I got it to render. Now was the real challenge: getting it to build on an ACTUAL Linux machine. I had an old, basically broken Surface Pro 3 that I had put Debian+GNOME on for shits and giggles a few months ago. The perfect target! The main problem was getting Rocket League to even launch. I set up Legendary (goated launcher btw, check it out ) and tried to run it. I installed Wine, got Wine Mono, and it failed with a weird cryptic error about the CreateWindow function. The obvious solution to a graphical error: disable EAC. Yay, it launched! Then to get it to build. First I had to fix some filepaths since Linux is case-sensitive (nerds) while I don’t care about case on Windows. Then, rust-lld gave some weird error about simd or something which I didn’t care about. I just ran cargo clean and rebuilt it and it worked fine. Then to run, and it actually worked first try! It’s cool because I went into it expecting to debug a million socket errors, but it actuallly connected and ran. Awesome sauce! Now Linux users can use rlbuddy. More minions to contr- I mean cool users! Cya in the next one! ;) If you check out the rl perf overlay in the screenshot, you’ll be able to guess why this is the laptop I decided to put Linux on."}, {"post_id": 65417, "ts": "2026-09-10T15:25:20Z", "hours": 0.8867, "text": "I’ve been debugging high memory for the past month or so. It was egui_system_fonts. Why would fonts take 170mb of ram????????????????????????????????? help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! I hate external dependencies!!!!!!!!!!!!!!!!!!!!11 I owe my life to DHAT now. go star https://github.com/nnethercote/dhat-rs"}, {"post_id": 65067, "ts": "2026-09-09T22:28:11Z", "hours": 1.5, "text": "More gamepad overlay buttons!!! Yay!!! In not-so-awesomely-exciting news, I also added a table of contents to the readme (as well as a generator for it). The script’s in Python (I’m sorry for not using Rust) meaning the repository is now 0.5% Python. Takeover incoming? I overcomplicated the script a lot, but it’s really easy to read. There are three whole comments, aka 6% of lines in the whole file! It’s not technically interesting in the slightest. I was thinking of building a tree-like structure before outputting the string, but realized I can just use the header level (h1 vs h2 vs h3 etc) as the amount of spaces / 2. I also refactored it not to use magic PanelId s for the default panel list. I kinda rushed that part when I made it, I’ll be honest. But now each Panel can implement fn open_by_default(&self) -> bool (returns false by default) and if it does it keeps it open when savedata doesn’t exist yet. I don’t get how an entire hour n 27 minutes was spent on like 7 not-even-that-big commits. At least it was a good use of my math class. We reviewed limits for some reason (which everyone should already know for one because they took the prereqs?), and the teacher managed to extend her lecture for the ENTIRE class time. rlbuddy development saving the day, I guess (just like it will in your rocket league games btw, so you should download it)"}, {"post_id": 64822, "ts": "2026-09-09T14:32:38Z", "hours": 1.4469, "text": "I’ve mostly been working on smaller features, improvements, and bugfixes. A cool one I did is fixing weird glitchy movement with the gamepad overlay window! Basically, the window needs to persist its position across disabling it/enabling it. And egui is immediate mode. So, every time it rendered the viewport, it would both set and get its position. So, moving it would update the current position, but because of the weird interop between setting the position in a ViewportBuilder and getting it from the viewport info, it would glitch back and forth, especially when my laptop is lagging. I fixed it by only calling the ViewportBuilder ‘s “ with_position ” method when the overlay had just been enabled ( !was_enabled && currently_enabled ). That way, it only sets it once externally, and lets it move freely while it’s open. Then, while it’s moving, it continues to update the saved position. And upon closing and then reopening it, it sets it again (but only once!) Relatively simple fix but it’s kind of funny. I mainly noticed it when I added a feature that would auto-unmaximize the overlay when the user maximizes it, and it would go crazy and fly around the screen. Very fun! I also fixed a pretty old bug where it would incorrectly detect the local player. Basically, the stats api doesn’t actually tell you who the local player is. So, we have to guess based on who the camera is targeting right now. Usually, it’s on the local player, but during goal replays or spectating a bot when joining a casual game, it would be improperly set at the start and then stay like that. So, I made sure that it always updated as long as the match is 1. in progress 2. not in a replay. It also fixes a thing with inconsistent match toasts, since the toasts only fire if the scoring player is the local player (and if it thinks the wrong player is the local player, everything’s messed up). I’m planning on revamping hotkeys next, to allow you to bind to any controller button and even do custom quickchats in-game. Later!"}, {"post_id": 63368, "ts": "2026-09-07T04:36:35Z", "hours": 1.4131, "text": "Time formatting doesn’t suck anymore! I made the implementation way better so I could make it support stuff even past weeks, like months and years. The new implementation added around 60 lines, but it’s for a good cause. The previous implementation used a match statement with duplicated logic that only supported seconds, minutes, and hours, using a pluralize function and inline if-statements everywhere. If it were sent to any rational code-reviewer, they would likely have a heart attack. Now it’s a bit more complex but less complicated. You have TimeUnit s which format the unit themselves and TimePart s which format a value + a unit. Then, just use some math to build a Vec and format it into a string. Boom! Beautiful, well-formed time formatting. To soak in the new beauty, I added days n weeks. I just had to add 14 lines! The previous one would have probably needed a bunch of stupid magic numbers and weird chains everywhere to accomplish the same thing. Okay, I’m done using your time on reading a way-too-long write-up about fixing a crappy implementation that shouldn’t have been there in the first place. I’m gonna ship right after posting this. If you get it, make sure to give it 10 stars in everything 😉. Haha, jk. Well, not really. Cya later."}, {"post_id": 62559, "ts": "2026-09-06T00:29:40Z", "hours": 1.8697, "text": "Had to remove the tracker.gg widget :( unfortunately they don’t allow scraping and what I had wasn’t allowed anyways. Things that used to open the player info widget now just open tracker in a browser."}, {"post_id": 60965, "ts": "2026-09-03T17:23:52Z", "hours": 2.9253, "text": "I finished the big refactor! I pushed around 25 commits to GitHub at once. I’m really gonna enjoy adding the next feature, basking in how much easier it is ;) Apparently, I never made a service for session stats, so it currently can’t persist its one setting. Actually, writing this I realized that the setting isn’t actually used, so I can delete it. That’s great. After finally kicking out all the annoying legacy panel code, I remembered that I never re-implemented the positioning or its related persistence code for the new panel system. The persistence system was reworked too, something that I don’t think really got included in the previous devlog. Each service can implement save , and there are generic helper methods in a common module for saving/loading serde structs to a file in the app data directory. The actual app now uses this method as well instead of doing all the pathing logic itself, so the persistence module is pretty small and could honestly be moved into app.rs. For new positioning, I store a list of open panels. Weirdly enough, it’s actually a lot easier than adding a position/is_open field to every AppPanel. So, I run the name through a Hasher to make a u64 which is easier to clone/copy and stuff and made a newtype around a PanelId. That way I could reuse the code from the previous paneling system to swap/manage open PanelIds, then just use find on the AppPanel vec to find the corresponding widget. Also, I never mentioned it but I’ve been trying RustRover for the past few devlogs. It’s a lot more stable than Zed, but I sorta miss its snappiness and minimalism. If I end up finding an annoying bug in RustRover, I’ll probably switch back. However, it’s been quite a few days and I don’t think I’ve found a single one. JetBrains is truly awesome at tooling. See ya next time. Probably will do my next ship soon :)"}, {"post_id": 60552, "ts": "2026-09-02T23:31:23Z", "hours": 3.3072, "text": "I’m MASSIVELY refactoring rlbuddy! This, I think is the second (and hopefully the final) major refactor to the codebase. So, basically the current architecture is split into services and widgets. Each service has an update method, which does its stuff (draining subscribers, processing commands, etc). Since egui is immediate mode, this architecture works unlike callbacks/event-based which I actually tried to implement but couldn’t. Every widget is just implements egui::Widget, that holds some state handles (Rc) and command senders (Sender), usually just one for its respective service. Services are alive for the lifetime of the app, while widgets are the openable panels you see. Widgets display the data from service state, and talk back to it by mutating shared state or sending commands. I think music control has been the best for me to wrap my head around to decide about changes, so I’ll explain it with that. Music control had a controller, a service, and a widget file. The controller was a thread pool manager (if you can call the questionable implementation that) around Windows’ GSMTC API to give a single-thread api for it (since the app is basically single-threaded). Then, the service is always alive, syncing a state struct between the controller and its own state handle. Finally, the widget is optionally there as a panel, with next/previous/pause buttons which send commands and the ui which reads service state to display. It also has a mutable service state reference for settings (the “pause during anthems” button). The god object RlbuddyApp struct stores all of this stuff. So it has a music_control_service, music_control_widget, stats_api_service, all of those fields, which kinda sucked. On top of that, I had to maintain an enum of every panel, which was enumerated for the “open panel” popup and to render each one if it’s open. you might think “hey… isn’t that a self referential struct? how does music_control_widget store a reference to music_control_service?” Well, music_control_widget internally only has fields for the music_control_service’s state handles which are Rc/Arcs. So it only needs a reference to the service for it’s Widget::new function lifetime, all is well. Although it doesn’t look horrible, it was HELL to do anything. For example, refactoring the gilrs service out of hotkey and adding the gamepad overlay probably involved just as much fiddling around with Rcs in RlbuddyApp as adding the actual feature. So, I decided to move to a new architecture: services + features! And, after thinking about it for around 8 hours (i slept), I decided on something a bit different. Services + panels! Yeah, basically the same as services + widgets, but I was gonna implement it GOOD this time, and make design decisions that wouldn’t bite me in the ass later on. I wrote my first traits - Service, which requires update and optionally save , and Panel , which requires name() -> &'static str and ui (same as egui::Widget: :ui). Then, I’d change how components are registered: instead of keeping every service and widget as a field in RlBuddyApp, I’d make a Vec<Box<dyn Service/Panel» for each, and loop through it. I spent about an hour trying to get Panels to automatically implement ui by requiring egui::Widget as a supertrait, which doesn’t work since widgets are stateful (need &self). So, I tried to require &mut Self to implement egui::Widget, but apparently something to do with type erasure doesn’t let that work with dynamic dispatch which was needed for the Vec<Box> thing. I’ve moved a few features to the new architecture, but I’m still in the process of finishing up. Additionally, it has to work side-by-side with existing crappy monster-Panel-enum architecture, which sucks to maintain. Okay, once again, I had to strip down a ton of detail (and my terrible wording but wtv) cause I hit like 5000 characters b4 realizing. See ya! May the Stardance gods increase devlog limits :)"}, {"post_id": 59926, "ts": "2026-09-01T23:19:29Z", "hours": 2.5164, "text": "rlbuddy has a gamepad overlay now so that you can show off your awesome bindings! Don’t even bother figuring out mine. It’s kinda starting to become hellish to add new widgets/services, but I’m almost done for the next ship so I doubt I’ll refactor just yet [edit: im doing a super refactor now hehe]. I made the overlay with the raw egui::Painter rather than actual controls (since it would be pretty hard to make a controller out of Buttons or something). I also prefer to avoid embedding static assets, otherwise I might have made an actual one in MS Paint or something. I also can’t seem to find a good egui version. I’ve been on 0.34 almost the whole time, which works well but doesn’t support transparency in extra viewports. But, 0.35/0.36 broke external viewports. So, until then, we get an opaque gamepad overlay :( but the main app is still transparent, so it’s not horrible. Rolled an 8 and a 9 on the Stardance rng today! I’m so proud of myself."}, {"post_id": 59228, "ts": "2026-08-31T21:59:04Z", "hours": 0.4561, "text": "I moved the mmr server to alpine linux! Before, it was regular raspberry pi os lite on the Pi. But, it was behaving strangely, randomly rebooting and things, so I decided to try installing Alpine. The lightweight distro has been on my radar for a while now, but this was my first time ever actually trying it. I imaged it normally with the raspberry pi imager, and put it on the pi, did setup-alpine, and all was well. But, I put in the wrong wifi password at first, which broke everything else. I tried changing the wifi config and doing something with wpa_supplicant (thanks google ai overview), but nothing fixed it so I ended up doing a fresh install. This time, I put in the right password and everything went great. I set up ssh, node, pm2, etc. and moved the server files onto the pi through sftp. Then, I got it running over my local network and set up authentication. So, it was time to set up the Cloudflare tunnel again. I followed this neat guide , changing values as needed (for example, my pi is aarch64, but the guide was x64, so I spent a while figuring out why the pi kept giving elf errors). It took a really long time to set up the openrc startup script because 1. cloudflare rotates the setup token relatively frequently and 2. I accidentally put 2 –token arguments. And since I was using vi, I didn’t even notice and kept trying to figure out why cloudflared crashed on startup. But I eventually found out and removed the duplicate and it worked! Then I finished setting up pm2 and put the pi in its home next to the router, and mmr.kmdw.dev is back up exposing your lobby’s skills. See you in the next one! Yes I know part of the token is in the image but it’s used already so it doesn’t matter"}, {"post_id": 56962, "ts": "2026-08-29T00:27:50Z", "hours": 9.075, "text": "rlbuddy can load custom maps now! Either you can download them and then import from a zip, or you can download them from bakkesplugins straight from the app! Importing it from a file is relatively easy. I checked the code for Lethamyr’s custom map loader to see what exactly it did, and for Lethamyr maps it: extracted the zip into a temp dir read info.json, .udk, and preview.jpg copied those into its own saved map directory I knew Rust, being a low-level language would let me not have to extract the zip fully first. Additionally, Bakkesplugins maps don’t contain info.json or preview.jpg, they only contain a udk file, so I had to make sure it would work with that. So, the import code I wrote basically: enumerates files in the zip extracts info.json (if found) into a struct copies *.upk into the target directory copies *.jpg into the target directory/preview.jpg if it exists It worked great. I made a really cool looking widget with stupid manual layouting behind it for map selection. First, it would add the preview image (or a black background if none). Then, it would get the screen rect of the image, and draw a semitransparent black background onto it (for contrast). Finally, it drew the actual contents in that screen rect. So, I got pretty-looking tiles with preview image backgrounds! I also added a progress bar for import status. I benchmarked each main part of the import process and found that decompressing/extracting the upk file took around 2 seconds, for which the ui thread would be totally frozen (big nono)! So, I moved the work onto another thread, and also made it decompress/load in 100 total chunks, updating a progress bar each time. I then moved on to the map downloader. Bakkesplugins doesn’t have an API, so it relies on scraping the website. I didn’t actually use any external crates for gathering information, though. I wrote a parser which takes a list of rules, each with a start and end search string, and looks for each of them in sequence till it fails to find a rule. I tried to make it completely zero-copy, but something it needed was to turn an [Option; N] into a Option<[T; N]> if every element was Some , but the only way I could figure out how to do that was with an iterator. It’s still really fast though. So, it parses search results, including map titles and urls straight out of the html string without needing an HTML parser or regex library. Once it was able to load results from the search page, I went to sleep and came back today. Now I had to get it to actually download the ZIP files and preview images, and import them straight into the app. It first has to download/parse the plugin info page since the ZIP url isn’t available in the search results. Then, it requests the ZIP. I had some trouble with this, since I wanted to show a progress bar for the download status. I first tried a function from this gist , but it didn’t work. So, I made my own which used the same chunking strategy as the import status loader. Turns out, ureq blocks requests once they hit 10MB by default, which was probably why the gist version didn’t work. But, mine was faster anyways, so I kept it. It’s even cooler since I made it myself. Then, I wired up a couple more commands to let it import straight from archive bytes instead of from a file path, and it finally loaded! Once that worked, I made it pass along the map title, author, and description as well. Then, I extended it to parse out the thumbnail image url and download that, then pass that along to the importer as well. Anyways, that was super fun. I would add a lot more detail, but Stardance limits devlogs to 4000 characters and I’m approaching scarily close to that. I’m planning on just polishing the downloader interface a bit more, and then I’ll do some bugfixes for the next release. See ya!"}, {"post_id": 55430, "ts": "2026-08-27T08:04:57Z", "hours": 3.0236, "text": "rlbuddy now can show people’s avatars cross-platform! It uses a web api I put on Cloudflare Workers which uses platform-specific requests to get avatar urls (see the previous devlog), which the app just fetches and renders. The http part was pretty easy, since I already have wrappers for cached HTTP apis, so I just had to define types for that and hook it up. But, once it was time to display, I ran into a weird problem where egui said there was no image loader installed for jpegs! Even using all_loaders + default didn’t work. Turns out, I have to actually include image as a separate crate and enable all the filetype features I want in there. Once I got it to load, it was time to mess with styling again. egui is really annoying with images, so I spent a while trying to get them to size right first. The default avatar used while they’re loading or for Epic/Switch players is from Fandom, like the rank icons. However, even though the icon is 90x90 pixels, the webp is 128x128 pixels, it just has a bunch of transparent padding. So, I initially messed with egui to do some weird ui allocation and calculation to get it to render right. But, turns out I didn’t have to do all of that. All I had to do was allocate a 28x28 space (the target size), scale that up by the 128/90 ratio, then paint the image onto the new size. Worked great. Then, I got to fight with grid layouts again. For some reason, wrapping the avatar and player details in a horizontal totally exploded all the layouting. So, I ended up making avatar and details separate columns. But, since the “player” header text is a bit larger than the icon width, there was too much padding between the avatar and the player details. So, I did more messing around with egui manual layouting, and ended up allocating a 24x(body text height + 2) space for the header, which would give it the default spacing. Then, I’d copy the Rect, shift the left bound over by 12 pixels, then paint the header onto there. That way, the header is left aligned with the avatar and the avatar + details look like they’re in the same column, even though it’s actually a bunch of stupid manual layout magic behind the scenes."}, {"post_id": 55160, "ts": "2026-08-26T17:10:01Z", "hours": 2.6972, "text": "Made an avatars api for Steam, PSN, and Xbox (Epic doesn’t support profile pictures and I have no clue what goes on in Nintendo-land, even Tracker doesn’t show theirs). It’s on Cloudflare Workers instead of my pi since it’s basically just api integration. I totally overcomplicated finding out how to get Steam profile pictures. Like, it’s insane how easy it actually is. A few weeks ago, I got an old version of Steam Rocket League and decompiled it, trying to look for where it fetched avatars from. After some experimentation and debugging, I learned that when Psyonix builds Rocket League, they give it something that implements OnlineSubsystem for whatever the target platform is. So, Steam gets the Steamworks OnlineSubsystem, Epic gets the EOSOnlineSubsystem, and so forth. And the game doesn’t need to know implementation details, just that it implements OnlineSubsystem, I think the term for that is dynamic dispatch in programming languages. Anyways, once I learned that Rocket League doesn’t do any avatar handling itself, I looked at the Steamworks SDK. Basically, it routes the avatar request through the open Steam client. So after some experimentation, I got it to fetch profile pictures with C++ and the Spacewars test game. But, that obviously wouldn’t work on a server, since the Steam client can’t really run on a Worker. So, I tried to use the Steam Web API. I got an API key, but when I tried, it said I was forbidden. According to the documentation, the GetPlayerSummaries endpoint was at partner.steam-api.com, which was only for publishers. About a week later, so yesterday, I had the genius idea to use api.steampowered.com (the public API domain) instead of partner.steam-api.com. Just swapping them out. And it worked. So, I now had a way to get Steam avatar urls. Xbox and PSN were actually really easy. Xbox has an undocumented API at https://peoplehub-public.xboxlive.com/people/gt(GAMERTAG) which returns json containing the avatar uri, and I used the psn-api package with a new PlayStation account to get PSN profile pictures. Then, I just put all of them in a Worker. So, rlbuddy will be able to show avatars soon enough!"}, {"post_id": 54013, "ts": "2026-08-24T19:11:04Z", "hours": 4.6756, "text": "Recently I was going through game archives and came across the BepInEx tool, which is basically a code injection framework for Unity games. I was really curious as to how it actually launched when the game launched, and found that they use a tool called Unity Doorstop, which adds winhttp.dll to the game’s binary directory. So, when the game tries to use things from winhttp, it goes to the new winhttp.dll instead of the system32 winhttp.dll. From there, the custom dll just forwards all the function calls. However, the custom dll is modified so that on its first interaction, it launches whatever Doorstop is configured to launch, and the mods can be loaded. That’s at least as far as I understood, but it made sense, and I thought, “what if I could launch rlbuddy automatically like this?” So, first, I tried to test it with a custom executable and library. I created a basic executable and DLL in C, and got the executable to load and run some code from the DLL. Then, I created another DLL, and got it to “impersonate” the original DLL. So, I’d rename the first dll to something like “mylibrary_original.dll”, rename the faker dll to “mylibrary.dll”, and the original executable would call the original, but it goes through the faker instead. And it worked! I had successfully created an actual doorstop-like faker. Now it was time to actually try this on Rocket League. So, I did a dumpbin /import on RocketLeague.exe, and found a few good targets - IPHLPAPI.dll, a system dll for networking stuff, and xinput1_3.dll, one shipped with the game for talking to controllers. RocketLeague.exe only imported two functions from each of them, meaning my fake interface wouldn’t have to be too big. So, first I tried to spoof IPHLPAPI.dll. The code was pretty simple, just a couple of global objects to hold the function. So, when the game loaded the DLL, it loaded the fake DLL. Then, when it tried to call some function in the DLL, such as GetAdaptersAddresses, the fake DLL would be the actual receiver, it would log something to a file, and then it would call the REAL GetAdaptersAddresses by dynamically loading the system IPHLPAPI.dll and return it. And… it worked! I opened Rocket League and the log file was created and had the log “GetAdaptersAddresses called!” Then, I launched it with anticheat enabled, and EAC immediately shut it down. I guess that was to be expected, but it was pretty annoying. So, I decided to try one more time, this time with xinput1_3.dll. This was more interesting because it was lazy loaded, and functions were imported by ordinals (2 = XInputGetState, 3 = XInputSetState), so I thought something might be different. So, I modified the original faker to be xinput1_3, replacing the function names and definitions. Since Rocket League imported them by ordinal instead of just the function name, I had to create a .def file as well, and define the ordinals there. Then, I did the same surgery on the binary folder, and after a few small mistake fixes, it worked! But, I still hadn’t tried with EAC enabled. So I launched it with anticheat, and it gave me a different error this time - that it couldn’t determine xinput1_3.dll’s file version. That was a different error! I opened the original xinput1_3.dll’s file properties, and it had copyright, file version, product version, and a couple other random things that were missing in my faker DLL. So I made a .rc file and compiled it together with the faker DLL. Then, most of the properties matched up. So, I tried it, and it seemingly worked! And then EAC said that it couldn’t verify the file again. In the end, I didn’t manage to get it working. I should’ve expected EAC to block me from the beginning, but it was pretty fun, and if I ever want to do something similar with a game without anti-cheat, I can do that now! rlbuddy is pretty closed to being released though, I just want to polish a few things and make sure the docs are fleshed out."}, {"post_id": 51407, "ts": "2026-08-21T02:54:11Z", "hours": 1.5947, "text": "rlbuddy doesn’t use the default eframe persistence feature for savedata anymore, which is pretty cool. There were a few reasons for this: It was kind of unnecessary, since eframe uses ron and it was storing a bunch of extra widget data which didn’t really fit with the app model anyway It took up extra dependencies (removing the feature shaved off like 10) There’s a bug where if the app crashed, it would erase all savedata, which, as you can imagine, was quite annoying especially since I actually use the app along with developing it, meaning if the app crashed in development it would delete all my actual match data. It’s easier to externally modify, so if in development I want to mess with some values it’s a lot easier. Anyways, actually getting the data directory was pretty interesting. I’ve basically decided to only support Windows, since the music player relies on Windows APIs anyways and I don’t think the Stats API even works on Linux. Initially, I checked out the source code for the dirs and directories crates, which led me to the dirs-sys crate (which actually isn’t even on crates.io). It used unsafe raw Win32 SHGetKnownFolderPath with the Roaming folder guid. However, since I was already using the windows-rs crate, I tried to find the WinRT equivalent. I ended up enabling the Storage_Search feature to use the API which would let me get it. Of course, this also didn’t work, because of something to do with how Windows apps are supposed to be registered. So, I ended up just grabbing the APPDATA environment variable and using that, then joining rlbuddy\\data.json to it. It’s pretty underwhelming, but it more than gets the job done. Now, whenever the app panics, I won’t lose all of my settings anymore! Pretty nice. Anyways, that’s what mainly got accomplished. I also tried to set up a GitHub Action to build it and make a release, but I kept hitting errors so I gave up and decided to upload a release next time I get the urge to actually update the GitHub repository. There’s also a few fixes, like the window title which has actually had a typo since refactors from around a month ago, and adding a missing ! which broke toasts when in training. Overall, only an hour or so was tracked, but a heck of a lot got done. See you all next time!"}, {"post_id": 49990, "ts": "2026-08-19T00:44:44Z", "hours": 1.4564, "text": "I added a small toast notification that activates when you score in training, like bakkesmod used to add it to text chat. It also activates when you hit the crossbar so you can feel even more remorseful that your beautiful musty didn’t go in :) I actually got the program to segfault while making it. egui’s external viewport api is kinda funky… there are two modes, immediate and deferred, and immediate is supposed to be easier to use. However, when I tried to use immediate mode, it panicked saying that the egui backend was implemented incorrectly. So I switched to deferred, and it gave me the segfault. There were 3 things I had to do: I stored all active toasts in a Vec, and render them in the external viewport every frame. When one should disappear, it uses Vec::retain to remove old ones. However, this doesn’t do any cleanup, meaning the viewport would go bonkers and crash the application. So, I had to close the viewport first. Calling ui.ctx() from the viewport made a segfault, probably my fault but I couldn’t figure out how to resolve it so I ended up just sending Viewport::Close from the main loop. Even if I sent Viewport::Close from the main loop, it still gave the weird error. So, I resolved it by adding a small delay from after it should close, which is when it sends the Viewport::Close command, and when it’s actually removed from the Vec of toasts. Well, I did all that, and it was working, but there was a really weird bug where it would lag the whole system while opening/closing. So, I switched from immediate to deferred viewport mode, and it stopped happening! I hit my first powerful airdribble musty with it on, it was around 105kph, and a total fluke. I wish I had gotten it on recording."}, {"post_id": 49200, "ts": "2026-08-17T21:06:45Z", "hours": 9.2278, "text": "I replaced the Spotify integration with a generic one that uses the Windows GSMTC api, meaning it’s way snappier, since it’s not making network requests every time it wants new data! The only reason it needs data is to fetch playback info, and it’s easy to do that since the windows crate gives a bunch of event listeners, meaning I also don’t need to poll anymore. Unfortunately, the integration from browsers etc. is kind of buggy so thumbnail loading is relatively inconsistent, but by adding some caching and timeouts it works flawlessly :) I also redid the UI since the old one was frankly quite ugly. Since the playback listener doesn’t update that frequently for progressbar changes, I also made it fake progress when music is playing and the ui updates, that way even if the latest data is stale, it still looks like the progress bar is moving. I’m now working on better session stats, I’ll probably end up replacing the all-time stat tracker with more in-depth session-only ones"}, {"post_id": 46652, "ts": "2026-08-14T02:03:01Z", "hours": 4.1664, "text": "rlbuddy finally has an MMR graph! I’m planning on adding more stat displays soon, like W/L, goals for/against, saves, etc. but this is a really big milestone since it’s a feature that a lot of players actually use (I basically only play casual so it’s not really for me 😅). Anyways, this also required me to rearchitect how matches are stored, and now there are two representations: a session match, which contains lots of information about it like detailed player skill information, and a stripped match, which is minimal and stores very little because it actually gets saved to disk! So, match history also gets saved now! This also opens up the doorway to a Deja-Vu-like thing which tells you if you’ve played with someone before and when! It uses the egui_plot library to show the graph. Funnily enough, basically every default option for a displayed plot was the opposite for this, and so the plot builder ended up using almost every method. Also, once again, hackatime is wrong because Zed likes to uninstall extensions randomly :("}, {"post_id": 42417, "ts": "2026-08-07T03:32:05Z", "hours": 2.1161, "text": "The Stats API finally provides the actual playlist id, so rlbuddy isn’t limited to guessing between 1v1/2v2/3v3/4v4 anymore! This brings in some cool extra features like displaying the rank each player is in for the given playlist as well as even better Discord presence! I looked through BakkesMod as well as some psynet endpoints to grab the list of playlist ids to associate with each actual playlist. There isn’t really an image to go with this, so here’s the monster enum of playlists :)"}, {"post_id": 40468, "ts": "2026-08-04T00:47:59Z", "hours": 2.2011, "text": "I rewrote the API admin page with Svelte! Before, it was a quick-and-dirty raw html/css/js solution, but now it should be a lot less annoying to work on. I improved authorization a lot, now instead of adding the pw query parameter for every request you put in a password once and it actually uses the Authorization header. Unfortunately, the browser EventSource doesn’t support headers except for in cookies, meaning I had to use the custom eventsource library for bootstrapping since the bootstrap API uses SSE. There’s basically a whole Vite project in src/webadmin, with its own tsconfig.json and everything. Because of the way it’s set up, development needs Vite running in build watch mode which builds to where the main app serves it out of. It makes deployment a lot easier, though. I didn’t really add any actual features to it, except for a log filter. However, it should be way easier to add more features in the future, like a api tester!"}, {"post_id": 38450, "ts": "2026-07-31T20:22:49Z", "hours": 6.755, "text": "rlbuddy has player lookup now, so you can check for smurfs without needing to boot up a heavy browser while playing. Unfortunately, this has to get its information from TRN because it’s the only source of this information, the rocket league apis don’t provide it. There’s some cool refactors behind the scenes, though. I generalized almost all HTTP requests into its own struct, so it removed like 200 lines of boilerplate code into a single generic module. It automatically handles caching, using new threads, ignoring if there’s already an inflight request, loading states, and automatic serde_json deserialization. The Epic id, uncensorer, ranks, and new TRN apis all use it now! Also, the button to open in TRN from the player list opens the player info dialog instead (though if you need to, you can open in TRN from there)."}, {"post_id": 34762, "ts": "2026-07-25T19:02:58Z", "hours": 1.9536, "text": "Note: I’ve actually had way more hours than it says, but I reinstalled windows and forgot to set up hackatime again so all that’s gone :( mmr-api-v2 finally has an admin page, so I don’t have to ssh into my pi just to check some debug information anymore! It is kind of developer-oriented but I think it looks and works well enough for what it is for. In the actual rlbuddy app, there are some cool new features! Facilitated by lots of refactors, of course (turns out, the matches service was bigger than the actual rocket league service, so I finally separated them). Spotify integration now has a previous button as well as a skip-to-song-in-current-playlist button. Match history was a feature that I’ve kind of ignored, so I gave it a much needed touch-up so its easier to view and browse. A pretty cool thing is that that’s been added a rocket-league-playerid-to-epic-games-id translation endpoint. This means that you can see Switch players’ TRN profiles through their linked Epic account, since TRN doesn’t let you check based on Switch name alone. Finally, there are some small quality of life improvements, like less deadlocks, better anthem pausing, and the open panel list persisting."}, {"post_id": 30390, "ts": "2026-07-17T21:27:26Z", "hours": 3.8292, "text": "Turns out, for spotify integration, I can’t actually let other people use my spotify development mode app. It’s limited to 5 users which I have to invite by email. And to get a quota extension, I need 250,000 existing monthy active users, which I’m slightly short of (by about 249,999). So, I changed the login flow so that each user has to make their own Spotify app, and log in using the client ID from there. I didn’t change the current PKCE flow since that didn’t really need to be changed, but setup unfortunately takes a little more work now. Also, it has transparency now."}, {"post_id": 28659, "ts": "2026-07-15T01:29:51Z", "hours": 13.4597, "text": "It’s been a week since the last devlog, and lots has changed! 1. new architecture! The code was getting pretty messy since I had kept adding new features without really doing major refactors. So, I finally took it upon myself to actually organize everything and come up with a proper architecture. Each feature has its own module, containing services and widgets. Services have all the state, for example the Spotify service stores the current song and settings and the Rocket League module exposes a Matches service for the current match and past matches, which the match and past match widgets actually show. Services all have update functions which get called every 10ms. There are two ways for services to talk to the rest of the app: events and state. State is straightforward, it’s usually just an Rc with a custom generic struct I made to manage whether the widget can read/write to it. Events are enums which the update method returns, and can get passed to other update methods. For example, the Stats API service doesn’t have its own widget, it only connects to the stats api and returns match events which other features can use, like Spotify using replay start/end events to play/pause music. 2. new ui! The dashboard part isn’t as ugly as it was before, and has actual cards for every panel instead of just having horizontal lines in between. Even though it sounds pretty small, it’s actually huge for the prettiness of the app! Along with this, the behaviour of managing panels also changed. There’s an actual close button, and instead of having one button per panel at the bottom, there’s a small picker to open/close them. Also, you can also move them up and down now 3. Automatic stats api setup This is a pretty small feature. It lets you select the path to the rocket league executable, detects whether it’s already enabled, and turns it on if it’s disabled. It does this by just replacing a line in the stats api configuration. 4. mmr api v2 doesnt explode There were a few bugs which would make the API disconnect randomly, but they’ve been ironed out. This also made it so the app doesn’t have to deal with failure behaviour and can just keep asking until the API responds."}, {"post_id": 23975, "ts": "2026-07-07T06:51:05Z", "hours": 8.1119, "text": "rlbuddy now has a little bit of Spotify support! Although it looks like a just few elements and a button, theres a lot going on behind the scenes. I’m not embedding an entire webview to run the web playback SDK this time, so it just uses the Web API to keep resource usage nice and low. Since it’s a native app, it has to jump through some hurdles to authorize, using the PKCE extension version since the client secret can’t be stored securely. It uses the webbrowser crate to open the Spotify auth page, and starts a tiny little oneshot HTTP server on a raw TCPListener. The redirect is set to the HTTP server, and then as soon as it receives the request, it sends a simple HTML page and continues. From there, it receives the authorization code and can continue as normal :) Other than that, it’s just normal REST api interaction. I did learn a ton about thread safety (I hit so many deadlocks), because unlike the stats api, for example, which just sits in a different thread and hurls events over a channel, it actually has to work with the user. It’s also able to pause during goal replays, and that was pretty annoying to structure. Eventually, I decided to just use a channel where the stats api could send replay start/end events through the match widget. Looking back on it, the solution was extremely simple 😅 I am planning to add a bit more, like shuffle/repeat controls as well as a previous track button, but this feature turned out pretty nicely!"}, {"post_id": 22551, "ts": "2026-07-05T02:19:55Z", "hours": 3.7678, "text": "rlbuddy can now show Rich Presence in Discord, so now all your friends can see you destroying your opponents ;)"}, {"post_id": 21165, "ts": "2026-07-02T23:37:22Z", "hours": 12.7792, "text": "rlbuddy has had major ui overhauls to shift it more towards an actual overlay rather than just an app that displays ranks. there are new features like a settings menu as well as major architectural overhauls, with more coming soon!"}, {"post_id": 16053, "ts": "2026-06-26T02:45:17Z", "hours": 2.3483, "text": "Got it working as an actual overlay!! Right now it just displays ranks, though"}, {"post_id": 15855, "ts": "2026-06-25T19:39:34Z", "hours": 30.4556, "text": "I got a stable MMR/ranks api working!! https://github.com/Kalilamodow/mmr-api-v2 Basically, it’s an http server that opens a websocket to the actual rocket league game api in the background and spoofs a real client connection. The socket only stays active for 5 seconds at a time though so I don’t kill psyonix’s servers. That way, rlbuddy can get ranks without getting blocked by tracker network! I originally tried to do it on Cloudflare, but the workers outbound websocket didn’t work since you can’t send custom headers with them. I ended up having to use my old raspberry pi and set up a homeserver behind Cloudflare tunnels, and I’m actually planning on moving the rest of my stuff that used to be on a VPS onto the pi."}]...
|
Title: rlbuddy by @kmdw | Stardance
Devlogs:
I go Title: rlbuddy by @kmdw | Stardance
Devlogs:
I got a stable MMR/ranks api working!! https://github.com/Kalilamodow/mmr-api-v2 Basically, it’s an http server that opens a websocket to the actual rocket league game api in the background and spoofs a real client connection. The socket only stays active for 5 seconds at a time though so I don’t kill psyonix’s servers. That way, rlbuddy can get ranks without getting blocked by tracker network! I originally tried to do it on Cloudflare, but the workers outbound websocket didn’t work since you can’t send custom headers with them. I ended up having to use my old raspberry pi and set up a homeserver behind Cloudflare tunnels, and I’m actually planning on moving the rest of my stuff that used to be on a VPS onto the pi.
Got it working as an actual overlay!! Right now it just displays ranks, though
rlbuddy has had major ui overhauls to shift it more towards an actual overlay rather than just an app that displays ranks. there are new features like a settings menu as well as major architectural overhauls, with more coming soon!
rlbuddy can now show Rich Presence in Discord, so now all your friends can see you destroying your opponents ;)
rlbuddy now has a little bit of Spotify support! Although it looks like a just few elements and a button, theres a lot going on behind the scenes. I’m not embedding an entire webview to run the web playback SDK this time, so it just uses the Web API to keep resource usage nice and low. Since it’s a native app, it has to jump through some hurdles to authorize, using the PKCE extension version since the client secret can’t be stored securely. It uses the webbrowser crate to open the Spotify auth page, and starts a tiny little oneshot HTTP server on a raw TCPListener. The redirect is set to the HTTP server, and then as soon as it receives the request, it sends a simple HTML page and continues. From there, it receives the authorization code and can continue as normal :) Other than that, it’s just normal REST api interaction. I did learn a ton about thread safety (I hit so many deadlocks), because unlike the stats api, for example, which just sits in a different thread and hurls events over a channel, it actually has to work with the user. It’s also able to pause during goal replays, and that was pretty annoying to structure. Eventually, I decided to just use a channel where the stats api could send replay start/end events through the match widget. Looking back on it, the solution was extremely simple 😅 I am planning to add a bit more, like shuffle/repeat controls as well as a previous track button, but this feature turned out pretty nicely!
It’s been a week since the last devlog, and lots has changed! 1. new architecture! The code was getting pretty messy since I had kept adding new features without really doing major refactors. So, I finally took it upon myself to actually organize everything and come up with a proper architecture. Each feature has its own module, containing services and widgets. Services have all the state, for example the Spotify service stores the current song and settings and the Rocket League module exposes a Matches service for the current match and past matches, which the match and past match widgets actually show. Services all have update functions which get called every 10ms. There are two ways for services to talk to the rest of the app: events and state. State is straightforward, it’s usually just an Rc with a custom generic struct I made to manage whether the widget can read/write to it. Events are enums which the update method returns, and can get passed to other update methods. For example, the Stats API service doesn’t have its own widget, it only connects to the stats api and returns match events which other features can use, like Spotify using replay start/end events to play/pause music. 2. new ui! The dashboard part isn’t as ugly as it was before, and has actual cards for every panel instead of just having horizontal lines in between. Even though it sounds pretty small, it’s actually huge for the prettiness of the app! Along with this, the behaviour of managing panels also changed. There’s an actual close button, and instead of having one button per panel at the bottom, there’s a small picker to open/close them. Also, you can also move them up and down now 3. Automatic stats api setup This is a pretty small feature. It lets you select the path to the rocket league executable, detects whether it’s already enabled, and turns it on if it’s disabled. It does this by just replacing a line in the stats api configuration. 4. mmr api v2 doesnt explode There were a few bugs which would make the API disconnect randomly, but they’ve been ironed out. This also made it so the app doesn’t have to deal with failure behaviour and can just keep asking until the API responds.
Turns out, for spotify integration, I can’t actually let other people use my spotify development mode app. It’s limited to 5 users which I have to invite by email. And to get a quota extension, I need 250,000 existing monthy active users, which I’m slightly short of (by about 249,999). So, I changed the login flow so that each user has to make their own Spotify app, and log in using the client ID from there. I didn’t change the current PKCE flow since that didn’t really need to be changed, but setup unfortunately takes a little more work now. Also, it has transparency now.
Note: I’ve actually had way more hours than it says, but I reinstalled windows and forgot to set up hackatime again so all that’s gone :( mmr-api-v2 finally has an admin page, so I don’t have to ssh into my pi just to check some debug information anymore! It is kind of developer-oriented but I think it looks and works well enough for what it is for. In the actual rlbuddy app, there are some cool new features! Facilitated by lots of refactors, of course (turns out, the matches service was bigger than the actual rocket league service, so I finally separated them). Spotify integration now has a previous button as well as a skip-to-song-in-current-playlist button. Match history was a feature that I’ve kind of ignored, so I gave it a much needed touch-up so its easier to view and browse. A pretty cool thing is that that’s been added a rocket-league-playerid-to-epic-games-id translation endpoint. This means that you can see Switch players’ TRN profiles through their linked Epic account, since TRN doesn’t let you check based on Switch name alone. Finally, there are some small quality of life improvements, like less deadlocks, better anthem pausing, and the open panel list persisting.
rlbuddy has player lookup now, so you can check for smurfs without needing to boot up a heavy browser while playing. Unfortunately, this has to get its information from TRN because it’s the only source of this information, the rocket league apis don’t provide it. There’s some cool refactors behind the scenes, though. I generalized almost all HTTP requests into its own struct, so it removed like 200 lines of boilerplate code into a single generic module. It automatically handles caching, using new threads, ignoring if there’s already an inflight request, loading states, and automatic serde_json deserialization. The Epic id, uncensorer, ranks, and new TRN apis all use it now! Also, the button to open in TRN from the player list opens the player info dialog instead (though if you need to, you can open in TRN from there).
I rewrote the API admin page with Svelte! Before, it was a quick-and-dirty raw html/css/js solution, but now it should be a lot less annoying to work on. I improved authorization a lot, now instead of adding the pw query parameter for every request you put in a password once and it actually uses the Authorization header. Unfortunately, the browser EventSource doesn’t support headers except for in cookies, meaning I had to use the custom eventsource library for bootstrapping since the bootstrap API uses SSE. There’s basically a whole Vite project in src/webadmin, with its own tsconfig.json and everything. Because of the way it’s set up, development needs Vite running in build watch mode which builds to where the main app serves it out of. It makes deployment a lot easier, though. I didn’t really add any actual features to it, except for a log filter. However, it should be way easier to add more features in the future, like a api tester!
The Stats API finally provides the actual playlist id, so rlbuddy isn’t limited to guessing between 1v1/2v2/3v3/4v4 anymore! This brings in some cool extra features like displaying the rank each player is in for the given playlist as well as even better Discord presence! I looked through BakkesMod as well as some psynet endpoints to grab the list of playlist ids to associate with each actual playlist. There isn’t really an image to go with this, so here’s the monster enum of playlists :)
rlbuddy finally has an MMR graph! I’m planning on adding more stat displays soon, like W/L, goals for/against, saves, etc. but this is a really big milestone since it’s a feature that a lot of players actually use (I basically only play casual so it’s not really for me 😅). Anyways, this also required me to rearchitect how matches are stored, and now there are two representations: a session match, which contains lots of information about it like detailed player skill information, and a stripped match, which is minimal and stores very little because it actually gets saved to disk! So, match history also gets saved now! This also opens up the doorway to a Deja-Vu-like thing which tells you if you’ve played with someone before and when! It uses the egui_plot library to show the graph. Funnily enough, basically every default option for a displayed plot was the opposite for this, and so the plot builder ended up using almost every method. Also, once again, hackatime is wrong because Zed likes to uninstall extensions randomly :(
I replaced the Spotify integration with a generic one that uses the Windows GSMTC api, meaning it’s way snappier, since it’s not making network requests every time it wants new data! The only reason it needs data is to fetch playback info, and it’s easy to do that since the windows crate gives a bunch of event listeners, meaning I also don’t need to poll anymore. Unfortunately, the integration from browsers etc. is kind of buggy so thumbnail loading is relatively inconsistent, but by adding some caching and timeouts it works flawlessly :) I also redid the UI since the old one was frankly quite ugly. Since the playback listener doesn’t update that frequently for progressbar changes, I also made it fake progress when music is playing and the ui updates, that way even if the latest data is stale, it still looks like the progress bar is moving. I’m now working on better session stats, I’ll probably end up replacing the all-time stat tracker with more in-depth session-only ones
I added a small toast notification that activates when you score in training, like bakkesmod used to add it to text chat. It also activates when you hit the crossbar so you can feel even more remorseful that your beautiful musty didn’t go in :) I actually got the program to segfault while making it. egui’s external viewport api is kinda funky… there are two modes, immediate and deferred, and immediate is supposed to be easier to use. However, when I tried to use immediate mode, it panicked saying that the egui backend was implemented incorrectly. So I switched to deferred, and it gave me the segfault. There were 3 things I had to do: I stored all active toasts in a Vec, and render them in the external viewport every frame. When one should disappear, it uses Vec::retain to remove old ones. However, this doesn’t do any cleanup, meaning the viewport would go bonkers and crash the application. So, I had to close the viewport first. Calling ui.ctx() from the viewport made a segfault, probably my fault but I couldn’t figure out how to resolve it so I ended up just sending Viewport::Close from the main loop. Even if I sent Viewport::Close from the main loop, it still gave the weird error. So, I resolved it by adding a small delay from after it should close, which is when it sends the Viewport::Close command, and when it’s actually removed from the Vec of toasts. Well, I did all that, and it was working, but there was a really weird bug where it would lag the whole system while opening/closing. So, I switched from immediate to deferred viewport mode, and it stopped happening! I hit my first powerful airdribble musty with it on, it was around 105kph, and a total fluke. I wish I had gotten it on recording.
rlbuddy doesn’t use the default eframe persistence feature for savedata anymore, which is pretty cool. There were a few reasons for this: It was kind of unnecessary, since eframe uses ron and it was storing a bunch of extra widget data which didn’t really fit with the app model anyway It took up extra dependencies (removing the feature shaved off like 10) There’s a bug where if the app crashed, it would erase all savedata, which, as you can imagine, was quite annoying especially since I actually use the app along with developing it, meaning if the app crashed in development it would delete all my actual match data. It’s easier to externally modify, so if in development I want to mess with some values it’s a lot easier. Anyways, actually getting the data directory was pretty interesting. I’ve basically decided to only support Windows, since the music player relies on Windows APIs anyways and I don’t think the Stats API even works on Linux. Initially, I checked out the source code for the dirs and directories crates, which led me to the dirs-sys crate (which actually isn’t even on crates.io). It used unsafe raw Win32 SHGetKnownFolderPath with the Roaming folder guid. However, since I was already using the windows-rs crate, I tried to find the WinRT equivalent. I ended up enabling the Storage_Search feature to use the API which would let me get it. Of course, this also didn’t work, because of something to do with how Windows apps are supposed to be registered. So, I ended up just grabbing the APPDATA environment variable and using that, then joining rlbuddy\data.json to it. It’s pretty underwhelming, but it more than gets the job done. Now, whenever the app panics, I won’t lose all of my settings anymore! Pretty nice. Anyways, that’s what mainly got accomplished. I also tried to set up a GitHub Action to build it and make a release, but I kept hitting errors so I gave up and decided to upload a release next time I get the urge to actually update the GitHub repository. There’s also a few fixes, like the window title which has actually had a typo since refactors from around a month ago, and adding a missing ! which broke toasts when in training. Overall, only an hour or so was tracked, but a heck of a lot got done. See you all next time!
Recently I was going through game archives and came across the BepInEx tool, which is basically a code injection framework for Unity games. I was really curious as to how it actually launched when the game launched, and found that they use a tool called Unity Doorstop, which adds winhttp.dll to the game’s binary directory. So, when the game tries to use things from winhttp, it goes to the new winhttp.dll instead of the system32 winhttp.dll. From there, the custom dll just forwards all the function calls. However, the custom dll is modified so that on its first interaction, it launches whatever Doorstop is configured to launch, and the mods can be loaded. That’s at least as far as I understood, but it made sense, and I thought, “what if I could launch rlbuddy automatically like this?” So, first, I tried to test it with a custom executable and library. I created a basic executable and DLL in C, and got the executable to load and run some code from the DLL. Then, I created another DLL, and got it to “impersonate” the original DLL. So, I’d rename the first dll to something like “mylibrary_original.dll”, rename the faker dll to “mylibrary.dll”, and the original executable would call the original, but it goes through the faker instead. And it worked! I had successfully created an actual doorstop-like faker. Now it was time to actually try this on Rocket League. So, I did a dumpbin /import on RocketLeague.exe, and found a few good targets - IPHLPAPI.dll, a system dll for networking stuff, and xinput1_3.dll, one shipped with the game for talking to controllers. RocketLeague.exe only imported two functions from each of them, meaning my fake interface wouldn’t have to be too big. So, first I tried to spoof IPHLPAPI.dll. The code was pretty simple, just a couple of global objects to hold the function. So, when the game loaded the DLL, it loaded the fake DLL. Then, when it tried to call some function in the DLL, such as GetAdaptersAddresses, the fake DLL would be the actual receiver, it would log something to a file, and then it would call the REAL GetAdaptersAddresses by dynamically loading the system IPHLPAPI.dll and return it. And… it worked! I opened Rocket League and the log file was created and had the log “GetAdaptersAddresses called!” Then, I launched it with anticheat enabled, and EAC immediately shut it down. I guess that was to be expected, but it was pretty annoying. So, I decided to try one more time, this time with xinput1_3.dll. This was more interesting because it was lazy loaded, and functions were imported by ordinals (2 = XInputGetState, 3 = XInputSetState), so I thought something might be different. So, I modified the original faker to be xinput1_3, replacing the function names and definitions. Since Rocket League imported them by ordinal instead of just the function name, I had to create a .def file as well, and define the ordinals there. Then, I did the same surgery on the binary folder, and after a few small mistake fixes, it worked! But, I still hadn’t tried with EAC enabled. So I launched it with anticheat, and it gave me a different error this time - that it couldn’t determine xinput1_3.dll’s file version. That was a different error! I opened the original xinput1_3.dll’s file properties, and it had copyright, file version, product version, and a couple other random things that were missing in my faker DLL. So I made a .rc file and compiled it together with the faker DLL. Then, most of the properties matched up. So, I tried it, and it seemingly worked! And then EAC said that it couldn’t verify the file again. In the end, I didn’t manage to get it working. I should’ve expected EAC to block me from the beginning, but it was pretty fun, and if I ever want to do something similar with a game without anti-cheat, I can do that now! rlbuddy is pretty closed to being released though, I just want to polish a few things and make sure the docs are fleshed out.
Made an avatars api for Steam, PSN, and Xbox (Epic doesn’t support profile pictures and I have no clue what goes on in Nintendo-land, even Tracker doesn’t show theirs). It’s on Cloudflare Workers instead of my pi since it’s basically just api integration. I totally overcomplicated finding out how to get Steam profile pictures. Like, it’s insane how easy it actually is. A few weeks ago, I got an old version of Steam Rocket League and decompiled it, trying to look for where it fetched avatars from. After some experimentation and debugging, I learned that when Psyonix builds Rocket League, they give it something that implements OnlineSubsystem for whatever the target platform is. So, Steam gets the Steamworks OnlineSubsystem, Epic gets the EOSOnlineSubsystem, and so forth. And the game doesn’t need to know implementation details, just that it implements OnlineSubsystem, I think the term for that is dynamic dispatch in programming languages. Anyways, once I learned that Rocket League doesn’t do any avatar handling itself, I looked at the Steamworks SDK. Basically, it routes the avatar request through the open Steam client. So after some experimentation, I got it to fetch profile pictures with C++ and the Spacewars test game. But, that obviously wouldn’t work on a server, since the Steam client can’t really run on a Worker. So, I tried to use the Steam Web API. I got an API key, but when I tried, it said I was forbidden. According to the documentation, the GetPlayerSummaries endpoint was at partner.steam-api.com, which was only for publishers. About a week later, so yesterday, I had the genius idea to use api.steampowered.com (the public API domain) instead of partner.steam-api.com. Just swapping them out. And it worked. So, I now had a way to get Steam avatar urls. Xbox and PSN were actually really easy. Xbox has an undocumented API at https://peoplehub-public.xboxlive.com/people/gt(GAMERTAG) which returns json containing the avatar uri, and I used the psn-api package with a new PlayStation account to get PSN profile pictures. Then, I just put all of them in a Worker. So, rlbuddy will be able to show avatars soon enough!
rlbuddy now can show people’s avatars cross-platform! It uses a web api I put on Cloudflare Workers which uses platform-specific requests to get avatar urls (see the previous devlog), which the app just fetches and renders. The http part was pretty easy, since I already have wrappers for cached HTTP apis, so I just had to define types for that and hook it up. But, once it was time to display, I ran into a weird problem where egui said there was no image loader installed for jpegs! Even using all_loaders + default didn’t work. Turns out, I have to actually include image as a separate crate and enable all the filetype features I want in there. Once I got it to load, it was time to mess with styling again. egui is really annoying with images, so I spent a while trying to get them to size right first. The default avatar used while they’re loading or for Epic/Switch players is from Fandom, like the rank icons. However, even though the icon is 90x90 pixels, the webp is 128x128 pixels, it just has a bunch of transparent padding. So, I initially messed with egui to do some weird ui allocation and calculation to get it to render right. But, turns out I didn’t have to do all of that. All I had to do was allocate a 28x28 space (the target size), scale that up by the 128/90 ratio, then paint the image onto the new size. Worked great. Then, I got to fight with grid layouts again. For some reason, wrapping the avatar and player details in a horizontal totally exploded all the layouting. So, I ended up making avatar and details separate columns. But, since the “player” header text is a bit larger than the icon width, there was too much padding between the avatar and the player details. So, I did more messing around with egui manual layouting, and ended up allocating a 24x(body text height + 2) space for the header, which would give it the default spacing. Then, I’d copy the Rect, shift the left bound over by 12 pixels, then paint the header onto there. That way, the header is left aligned with the avatar and the avatar + details look like they’re in the same column, even though it’s actually a bunch of stupid manual layout magic behind the scenes.
rlbuddy can load custom maps now! Either you can download them and then import from a zip, or you can download them from bakkesplugins straight from the app! Importing it from a file is relatively easy. I checked the code for Lethamyr’s custom map loader to see what exactly it did, and for Lethamyr maps it: extracted the zip into a temp dir read info.json, .udk, and preview.jpg copied those into its own saved map directory I knew Rust, being a low-level language would let me not have to extract the zip fully first. Additionally, Bakkesplugins maps don’t contain info.json or preview.jpg, they only contain a udk file, so I had to make sure it would work with that. So, the import code I wrote basically: enumerates files in the zip extracts info.json (if found) into a struct copies *.upk into the target directory copies *.jpg into the target directory/preview.jpg if it exists It worked great. I made a really cool looking widget with stupid manual layouting behind it for map selection. First, it would add the preview image (or a black background if none). Then, it would get the screen rect of the image, and draw a semitransparent black background onto it (for contrast). Finally, it drew the actual contents in that screen rect. So, I got pretty-looking tiles with preview image backgrounds! I also added a progress bar for import status. I benchmarked each main part of the import process and found that decompressing/extracting the upk file took around 2 seconds, for which the ui thread would be totally frozen (big nono)! So, I moved the work onto another thread, and also made it decompress/load in 100 total chunks, updating a progress bar each time. I then moved on to the map downloader. Bakkesplugins doesn’t have an API, so it relies on scraping the website. I didn’t actually use any external crates for gathering information, though. I wrote a parser which takes a list of rules, each with a start and end search string, and looks for each of them in sequence till it fails to find a rule. I tried to make it completely zero-copy, but something it needed was to turn an [Option; N] into a Option<[T; N]> if every element was Some , but the only way I could figure out how to do that was with an iterator. It’s still really fast though. So, it parses search results, including map titles and urls straight out of the html string without needing an HTML parser or regex library. Once it was able to load results from the search page, I went to sleep and came back today. Now I had to get it to actually download the ZIP files and preview images, and import them straight into the app. It first has to download/parse the plugin info page since the ZIP url isn’t available in the search results. Then, it requests the ZIP. I had some trouble with this, since I wanted to show a progress bar for the download status. I first tried a function from this gist , but it didn’t work. So, I made my own which used the same chunking strategy as the import status loader. Turns out, ureq blocks requests once they hit 10MB by default, which was probably why the gist version didn’t work. But, mine was faster anyways, so I kept it. It’s even cooler since I made it myself. Then, I wired up a couple more commands to let it import straight from archive bytes instead of from a file path, and it finally loaded! Once that worked, I made it pass along the map title, author, and description as well. Then, I extended it to parse out the thumbnail image url and download that, then pass that along to the importer as well. Anyways, that was super fun. I would add a lot more detail, but Stardance limits devlogs to 4000 characters and I’m approaching scarily close to that. I’m planning on just polishing the downloader interface a bit more, and then I’ll do some bugfixes for the next release. See ya!
I moved the mmr server to alpine linux! Before, it was regular raspberry pi os lite on the Pi. But, it was behaving strangely, randomly rebooting and things, so I decided to try installing Alpine. The lightweight distro has been on my radar for a while now, but this was my first time ever actually trying it. I imaged it normally with the raspberry pi imager, and put it on the pi, did setup-alpine, and all was well. But, I put in the wrong wifi password at first, which broke everything else. I tried changing the wifi config and doing something with wpa_supplicant (thanks google ai overview), but nothing fixed it so I ended up doing a fresh install. This time, I put in the right password and everything went great. I set up ssh, node, pm2, etc. and moved the server files onto the pi through sftp. Then, I got it running over my local network and set up authentication. So, it was time to set up the Cloudflare tunnel again. I followed this neat guide , changing values as needed (for example, my pi is aarch64, but the guide was x64, so I spent a while figuring out why the pi kept giving elf errors). It took a really long time to set up the openrc startup script because 1. cloudflare rotates the setup token relatively frequently and 2. I accidentally put 2 –token arguments. And since I was using vi, I didn’t even notice and kept trying to figure out why cloudflared crashed on startup. But I eventually found out and removed the duplicate and it worked! Then I finished setting up pm2 and put the pi in its home next to the router, and mmr.kmdw.dev is back up exposing your lobby’s skills. See you in the next one! Yes I know part of the token is in the image but it’s used already so it doesn’t matter
rlbuddy has a gamepad overlay now so that you can show off your awesome bindings! Don’t even bother figuring out mine. It’s kinda starting to become hellish to add new widgets/services, but I’m almost done for the next ship so I doubt I’ll refactor just yet [edit: im doing a super refactor now hehe]. I made the overlay with the raw egui::Painter rather than actual controls (since it would be pretty hard to make a controller out of Buttons or something). I also prefer to avoid embedding static assets, otherwise I might have made an actual one in MS Paint or something. I also can’t seem to find a good egui version. I’ve been on 0.34 almost the whole time, which works well but doesn’t support transparency in extra viewports. But, 0.35/0.36 broke external viewports. So, until then, we get an opaque gamepad overlay :( but the main app is still transparent, so it’s not horrible. Rolled an 8 and a 9 on the Stardance rng today! I’m so proud of myself.
I’m MASSIVELY refactoring rlbuddy! This, I think is the second (and hopefully the final) major refactor to the codebase. So, basically the current architecture is split into services and widgets. Each service has an update method, which does its stuff (draining subscribers, processing commands, etc). Since egui is immediate mode, this architecture works unlike callbacks/event-based which I actually tried to implement but couldn’t. Every widget is just implements egui::Widget, that holds some state handles (Rc) and command senders (Sender), usually just one for its respective service. Services are alive for the lifetime of the app, while widgets are the openable panels you see. Widgets display the data from service state, and talk back to it by mutating shared state or sending commands. I think music control has been the best for me to wrap my head around to decide about changes, so I’ll explain it with that. Music control had a controller, a service, and a widget file. The controller was a thread pool manager (if you can call the questionable implementation that) around Windows’ GSMTC API to give a single-thread api for it (since the app is basically single-threaded). Then, the service is always alive, syncing a state struct between the controller and its own state handle. Finally, the widget is optionally there as a panel, with next/previous/pause buttons which send commands and the ui which reads service state to display. It also has a mutable service state reference for settings (the “pause during anthems” button). The god object RlbuddyApp struct stores all of this stuff. So it has a music_control_service, music_control_widget, stats_api_service, all of those fields, which kinda sucked. On top of that, I had to maintain an enum of every panel, which was enumerated for the “open panel” popup and to render each one if it’s open. you might think “hey… isn’t that a self referential struct? how does music_control_widget store a reference to music_control_service?” Well, music_control_widget internally only has fields for the music_control_service’s state handles which are Rc/Arcs. So it only needs a reference to the service for it’s Widget::new function lifetime, all is well. Although it doesn’t look horrible, it was HELL to do anything. For example, refactoring the gilrs service out of hotkey and adding the gamepad overlay probably involved just as much fiddling around with Rcs in RlbuddyApp as adding the actual feature. So, I decided to move to a new architecture: services + features! And, after thinking about it for around 8 hours (i slept), I decided on something a bit different. Services + panels! Yeah, basically the same as services + widgets, but I was gonna implement it GOOD this time, and make design decisions that wouldn’t bite me in the ass later on. I wrote my first traits - Service, which requires update and optionally save , and Panel , which requires name() -> &'static str and ui (same as egui::Widget: :ui). Then, I’d change how components are registered: instead of keeping every service and widget as a field in RlBuddyApp, I’d make a Vec<Box<dyn Service/Panel» for each, and loop through it. I spent about an hour trying to get Panels to automatically implement ui by requiring egui::Widget as a supertrait, which doesn’t work since widgets are stateful (need &self). So, I tried to require &mut Self to implement egui::Widget, but apparently something to do with type erasure doesn’t let that work with dynamic dispatch which was needed for the Vec<Box> thing. I’ve moved a few features to the new architecture, but I’m still in the process of finishing up. Additionally, it has to work side-by-side with existing crappy monster-Panel-enum architecture, which sucks to maintain. Okay, once again, I had to strip down a ton of detail (and my terrible wording but wtv) cause I hit like 5000 characters b4 realizing. See ya! May the Stardance gods increase devlog limits :)
I finished the big refactor! I pushed around 25 commits to GitHub at once. I’m really gonna enjoy adding the next feature, basking in how much easier it is ;) Apparently, I never made a service for session stats, so it currently can’t persist its one setting. Actually, writing this I realized that the setting isn’t actually used, so I can delete it. That’s great. After finally kicking out all the annoying legacy panel code, I remembered that I never re-implemented the positioning or its related persistence code for the new panel system. The persistence system was reworked too, something that I don’t think really got included in the previous devlog. Each service can implement save , and there are generic helper methods in a common module for saving/loading serde structs to a file in the app data directory. The actual app now uses this method as well instead of doing all the pathing logic itself, so the persistence module is pretty small and could honestly be moved into app.rs. For new positioning, I store a list of open panels. Weirdly enough, it’s actually a lot easier than adding a position/is_open field to every AppPanel. So, I run the name through a Hasher to make a u64 which is easier to clone/copy and stuff and made a newtype around a PanelId. That way I could reuse the code from the previous paneling system to swap/manage open PanelIds, then just use find on the AppPanel vec to find the corresponding widget. Also, I never mentioned it but I’ve been trying RustRover for the past few devlogs. It’s a lot more stable than Zed, but I sorta miss its snappiness and minimalism. If I end up finding an annoying bug in RustRover, I’ll probably switch back. However, it’s been quite a few days and I don’t think I’ve found a single one. JetBrains is truly awesome at tooling. See ya next time. Probably will do my next ship soon :)
Had to remove the tracker.gg widget :( unfortunately they don’t allow scraping and what I had wasn’t allowed anyways. Things that used to open the player info widget now just open tracker in a browser.
Time formatting doesn’t suck anymore! I made the implementation way better so I could make it support stuff even past weeks, like months and years. The new implementation added around 60 lines, but it’s for a good cause. The previous implementation used a match statement with duplicated logic that only supported seconds, minutes, and hours, using a pluralize function and inline if-statements everywhere. If it were sent to any rational code-reviewer, they would likely have a heart attack. Now it’s a bit more complex but less complicated. You have TimeUnit s which format the unit themselves and TimePart s which format a value + a unit. Then, just use some math to build a Vec and format it into a string. Boom! Beautiful, well-formed time formatting. To soak in the new beauty, I added days n weeks. I just had to add 14 lines! The previous one would have probably needed a bunch of stupid magic numbers and weird chains everywhere to accomplish the same thing. Okay, I’m done using your time on reading a way-too-long write-up about fixing a crappy implementation that shouldn’t have been there in the first place. I’m gonna ship right after posting this. If you get it, make sure to give it 10 stars in everything 😉. Haha, jk. Well, not really. Cya later.
I’ve mostly been working on smaller features, improvements, and bugfixes. A cool one I did is fixing weird glitchy movement with the gamepad overlay window! Basically, the window needs to persist its position across disabling it/enabling it. And egui is immediate mode. So, every time it rendered the viewport, it would both set and get its position. So, moving it would update the current position, but because of the weird interop between setting the position in a ViewportBuilder and getting it from the viewport info, it would glitch back and forth, especially when my laptop is lagging. I fixed it by only calling the ViewportBuilder ‘s “ with_position ” method when the overlay had just been enabled ( !was_enabled && currently_enabled ). That way, it only sets it once externally, and lets it move freely while it’s open. Then, while it’s moving, it continues to update the saved position. And upon closing and then reopening it, it sets it again (but only once!) Relatively simple fix but it’s kind of funny. I mainly noticed it when I added a feature that would auto-unmaximize the overlay when the user maximizes it, and it would go crazy and fly around the screen. Very fun! I also fixed a pretty old bug where it would incorrectly detect the local player. Basically, the stats api doesn’t actually tell you who the local player is. So, we have to guess based on who the camera is targeting right now. Usually, it’s on the local player, but during goal replays or spectating a bot when joining a casual game, it would be improperly set at the start and then stay like that. So, I made sure that it always updated as long as the match is 1. in progress 2. not in a replay. It also fixes a thing with inconsistent match toasts, since the toasts only fire if the scoring player is the local player (and if it thinks the wrong player is the local player, everything’s messed up). I’m planning on revamping hotkeys next, to allow you to bind to any controller button and even do custom quickchats in-game. Later!
More gamepad overlay buttons!!! Yay!!! In not-so-awesomely-exciting news, I also added a table of contents to the readme (as well as a generator for it). The script’s in Python (I’m sorry for not using Rust) meaning the repository is now 0.5% Python. Takeover incoming? I overcomplicated the script a lot, but it’s really easy to read. There are three whole comments, aka 6% of lines in the whole file! It’s not technically interesting in the slightest. I was thinking of building a tree-like structure before outputting the string, but realized I can just use the header level (h1 vs h2 vs h3 etc) as the amount of spaces / 2. I also refactored it not to use magic PanelId s for the default panel list. I kinda rushed that part when I made it, I’ll be honest. But now each Panel can implement fn open_by_default(&self) -> bool (returns false by default) and if it does it keeps it open when savedata doesn’t exist yet. I don’t get how an entire hour n 27 minutes was spent on like 7 not-even-that-big commits. At least it was a good use of my math class. We reviewed limits for some reason (which everyone should already know for one because they took the prereqs?), and the teacher managed to extend her lecture for the ENTIRE class time. rlbuddy development saving the day, I guess (just like it will in your rocket league games btw, so you should download it)
I’ve been debugging high memory for the past month or so. It was egui_system_fonts. Why would fonts take 170mb of ram????????????????????????????????? help!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! I hate external dependencies!!!!!!!!!!!!!!!!!!!!11 I owe my life to DHAT now. go star https://github.com/nnethercote/dhat-rs
I did lots of performance improvements and also IT WORKS ON LINUX NOW!!! Let’s talk about performance first. Anyways, it has been using around 4% and 220MB of ram, which isn’t really what you’d expect from an overlay! So, I used things like DHAT to profile the memory, and noticed that fonts were doing some shenanigans. So I removed egui_system_fonts and loaded directly from C:\Windows\Fonts\segoeui.ttf and RAM usage dropped to 30mb. That was what the previous devlog was about. I then changed the default logic update rate from 10ms (100/s) to 65ms (15/s approx). This reduced idle cpu usage to under 0.2%. But, doing anything with the UI would spike it to 4%, which is still pretty bad. So, I used a method I found in an egui issue thread where I’d count the frametime since the last render, then sleep until the target frametime was finished. For example, if the frame rendered in 2ms but I want 16ms frametime, it would sleep for 14ms. That way, I could limit how often the UI rendered! This made it stay under around 1% CPU forever! Okay, Linux time! Rust is mostly cross-platform, so support was mostly dealing with dumbass design decisions. Since Music relies on GSMTC, I had to feature-gate the entire thing (as well as the windows/windows-future crates) behind cfg(windows) :( I also had to fix Linux font loading (since like I said earlier, it’s hardcoded to segoe ui). So I install fontdb on Linux and search for some popular fonts from there to load instead. Finally, I fixed up the storage paths since it could only load from AppData. I also made it use AppData\Local vs. AppData\Roaming instead of putting everything in Roaming. I first got it working through WSL! ! It took some messing with my GPU drivers but I got it to render. Now was the real challenge: getting it to build on an ACTUAL Linux machine. I had an old, basically broken Surface Pro 3 that I had put Debian+GNOME on for shits and giggles a few months ago. The perfect target! The main problem was getting Rocket League to even launch. I set up Legendary (goated launcher btw, check it out ) and tried to run it. I installed Wine, got Wine Mono, and it failed with a weird cryptic error about the CreateWindow function. The obvious solution to a graphical error: disable EAC. Yay, it launched! Then to get it to build. First I had to fix some filepaths since Linux is case-sensitive (nerds) while I don’t care about case on Windows. Then, rust-lld gave some weird error about simd or something which I didn’t care about. I just ran cargo clean and rebuilt it and it worked fine. Then to run, and it actually worked first try! It’s cool because I went into it expecting to debug a million socket errors, but it actuallly connected and ran. Awesome sauce! Now Linux users can use rlbuddy. More minions to contr- I mean cool users! Cya in the next one! ;) If you check out the rl perf overlay in the screenshot, you’ll be able to guess why this is the laptop I decided to put Linux on.
I’ve been putting this off for a while, but I’ve finally decided I’m going to add asset swapping. There’re a few existing implementations, so I’m reading those as well as some pdfs about the upk format. So basically credit to this document and this implementation . All it can do for now is parse the file summary. The implementation wasn’t too bad since I had Google as well as the C# implementation I just talked about. I basically have trait Deserializable : Sized { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > ; } Then implement that for the various parts (eg. FGuid , a generic TArray ). Then, I use byteorder to read out numbers into each struct. For example, #[derive(Debug)] struct FCompressedChunkInfo { uncompressed_offset : i64 , uncompressed_size : i32 , compressed_offset : i64 , compressed_size : i32 , } impl Deserializable for FCompressedChunkInfo { fn deserialize ( reader : & mut impl Read ) -> AnyResult < Self > { Ok ( Self { uncompressed_offset : reader .read_i64 :: < LittleEndian > () ? , uncompressed_size : reader .read_i32 :: < LittleEndian > () ? , compressed_offset : reader .read_i64 :: < LittleEndian > () ? , compressed_size : reader .read_i32 :: < LittleEndian > () ? , }) } } I originally prototyped it in Python and then moved to Rust once I got tired of python’s byte shenanigans.
I JUST DESERIALIZED AND RESERIALIZED A UPK. OMAIGOD IM SO HAPPY. my brain is so tired. Alright so the payload still doesn’t get transferred but that’s pretty simple, it’s just Vec::extend. What a challenge! Deserialization actually ended up being the easy part, which is opposite of what I expected from starting the project. It went (relatively) fast since there are a few existing implementations which I could kinda just “borrow” structure parsing from. But, mine is unique in that it almost completely reserializes the package itself. I might’ve been able to “borrow” reserialization, but the impl I’ve been looking at is STRAIGHT ai slop and it’s more annoying to read that than to just do it myself. It was useful though, so I have to respect it. The first problem: basically, the first byte of an FString determines how many parts it has, NOT how many bytes it has. Which wasn’t a problem for parsing, since I had some word-based helpers which worked so I didn’t think much about it. But, when reserializing, I made two mistakes: 1. forgot to add the null terminator (which shouldn’t even be necessary) and 2. I accidentally put the wrong offset. I have no clue why there’s a null terminator for FStrings. The format is [n chars][the char bytes], meaning it should already be known how long the string is. Pretty stupid, but whatever. Anyways, when reserializing you’re supposed to include the null terminator in the string length marker. So, my logic was that I should offset it by two since unicode characters are two bytes. Bleh! I should’ve only incremented by one, since it’s in terms of utf16 chars rather than bytes. Yay, that worked! I don’t know how to summarize the next problem, so I’ll explain the reasoning. The package header is file summary + tables + something else (we’ll get to that later). Anyways, there’s some mysterious padding in between the summary and tables. Parsing, it’s easy to skip over because the summary includes the tables start offset ( name_offset , the name table is the first one). But when reserializing, you gotta keep those offsets intact. Well, I’m not totally sure if you actually have to keep them, but just for the sake of simplicity I tried to (which ended up adding more complexity, which I’ll see if I can remove now). So, I serialize/push the summary to the big Vec. Then, I make a new Vec and serialize the name table at (name_offset - summary_size), since the new Vec has to be encrypted and then appended to the big Vec. I do the same thing for imports/exports (placing the table at import/export _table_offset - summary_size ). Oh no! Since name_table_offset isn’t equal to summary_size, there’s some padding in between, which is expected. HOWEVER! The previous logic would skip over it in the table Vec creation, meaning the table Vec would have some 0-padding at the start. This padding needs to be in the SUMMARY part instead, and the name_offset should basically be the ZERO of the tables Vec! I doubt I would’ve been able to solve this part without the beautiful tool HxD . It’s really easy to use and is always helpful when I’m figgling around with binary. So, it does some more math, calculates the spacing, adds it to the big vec, and removes it from the tables Vec. Then, it re-encrypts the tables Vec and pushes it onto the big Vec! Okay, now that’s done. NOPE! There’s a mysterious structure for some reason at the end of the real table part? Yep, it’s that something else I said we’ll get to. I actually still have no idea what it is. From some research, I gathered it must be the dependencies table, but it’s really poorly documented. So, I ended up just cutting the bytes out from after the export table to the end of the tables part, and “pasting” it back before re-encryption. I do hope this devlog was readable. Now I’ll get to including the actual package payload and hopefully simplifying reserialization offsets. See you soon!
I figured out what comes after export tables! And it took way too long, since I DISCOVERED IT MYSELF! At least, as far as I know. I couldn’t find any information online about this portion of the header, so it was basically luck that I noticed a pattern. Before, I was just copying everything after the export table and pasting them back in afterwards, but as you can guess, that stopped working if I adjusted anything within the encrypted region. Compressed chunk info is a known part, and I figured out the AES padding pretty easily, so most of the time was spent trying to figure out what in the world those 24 bytes were. The first four bytes in the compressed chunk info are how many chunks they are. Here, in the Bubbles boost package, there are two (little endian), with 24 bytes of ???. And in Flamethrower, there are three, with 36 bytes of ???. I noticed that the ??? was always n chunks * 12 bytes (actually, it’s lucky that I didn’t test any which ended up having 0, otherwise I probably wouldn’t have figured it out). Since this probably had something to do with chunks, I made a guess that each chunk had some extra data stored in this array, 12 bytes of info per chunk. Using HxD’s highlight-bytes-and-get-the-decimal-value feature, I noticed a pattern where the first 8 bytes looked like an i64 offset and the last 4 looked like an i32 size, which the compressed chunk infos were also like for their matching counterparts. So, I deserialized it as [i64; i32] * n chunks and was able to read it better. These additional chunk infos seem to kinda sorta match up to uncompressed header offsets, but I don’t really understand what they are (and they’re marked as such in the code, lol). So, with that working (and some fiddling with broken serialization of TArrays which I’m surprised I didn’t catch earlier), I now understood the ENTIRE package header! Hooray! Let’s look at another example. body_grain_SF, the Fennec, has 4 chunks. Guess how many bytes of ??? it has. That’s right, zero! For some reason, a few packages just don’t have those things. After going through a bunch of them, I found that if licensee version was 32, there was no ???. But if it was 33, there WAS ???. I basically just added an if statement and it was fixed. I’m going to try to work on figuring out the padding in between the package summary and the start of the name table, but if I can’t, I suppose I’ll finally get to actually doing package swapping. Later!
I got a name swap! It doesn’t work properly, but I’m glad the game didn’t crash. These hours have been by far the most frustrating because the only way to test is against the real game since it’s really picky, but the game takes like 30 seconds to start, and if it crashes, it gives a cryptic error log, and if it freezes, it doesn’t give any log at all. I spent most of the time messing with moving different offset values forward and backwards, and ended up reverting to a simpler version with no overwriting when the header size changes just to test things. So far, I’ve mostly gleaned that name renaming is possible, but only up to a point. If the name grows too much, the game crashes, and if the name shrinks too much, the game freezes. Additionally, for some reason, total_header_size changes by the padded header size instead of the encrypted header size, which I still don’t understand. It’s seriously weird. I serialize each name properly, and yet the game reads it wrong. This game really does need a new codebase. When UE6 comes out, either the game’s gonna be so good it doesn’t need mods, or it’ll be relatively easily moddable. Or neither, which is the most probable based on Epic Games’ track record. Anyways, enjoy the beautiful screenshot.
IT SWAPPED IT SWAPPED IT SWAPPED AHAHAHHAHAHAHHAHAHAHAHHA FINALLY Okay now I gotta make it work for other pairs of boosts. If WHEN that works, I’ll actually put it in rlbuddy. I removed all the code relating to changing offsets to try to give myself a minimal workspace to tinker in, with as little side effects as possible. So, all the current code does is 1. open them 2. replace the name table entries and package guid. Surprisingly simple. Once I make it a bit more generic, I can extend it to support more swaps. If I’m really unable to get it to work for more combinations, I’ll probably end up just publishing the poc repo and not adding swapping to rlbuddy at all. This is a great motivation boost, though. I was honestly dreading coming home to work on it today because I was done with failing over and over, and considering giving up.
IT WORKS WHEN THE HEADER EXPANDS NOW YAYAYYAYAYAYYAYAYYAYAYAY I’m gonna be honest, the problem might just have been that my testing package was corrupted. I was debugging my deserialization logic, which I thought might have some parsing issue near the header extraction, and noticed that once the encrypted region deserializer’s Cursor reached the end of the region, it was actually FARTHER than the package summary’s total_header_size - by 6 bytes! That’s pretty bad, and I don’t know how something like that even happened. Anyways, I repaired the game and brought over the shiny new upk and… it worked. I’m pretty sure that I only accidentally did this while tidying up my workspace a few hours ago, but if this has genuinely been the thing holding me back for the past few days - I also finally made the poc code public, at https://github.com/kalilamodow/rl-upk-testing/
Apparently there are a bunch of different AES keys rocket league uses, not just one. You can get a list of them from the psynet config url, and then do some weird crc stuff to change them from “content keys” to aes keys. I discovered the rocket league mapmaking discord today and I’m blown away by the amount of information on there, and also apparently my whole thing about the unknown bytes when licensee version > 32 was straight up wrong, which is funny. Anyways it works for all items now, which is great. I’m gonna work on actually putting it in rlbuddy now, hopefully that goes well
rlbuddy now has item swapping! Basically, making one item appear like another to use items you don’t actually own. These hours were spent on a few different things. Firstly, I optimized the thing a bunch! There were a few places that were pretty slow since the original repo was mainly for testing. For example instead of decrypting the entire header and rechecking it to find the right key, it only loads the first 4 blocks and attempts to decrypt the first FString. If it fails, that means the AES key isn’t valid. Also, I improved the error handling with anyhow. It actually makes it so much easier to deal with things and was pretty useful when debugging the move over to the actual app. Now I’m just going to work on polishing the panel UI a bit more, since it’s still kind of ugly.
I made a ton of improvements to the asset swapper! And fixed a bug with the music player which is cool technically, so I’ll start with that. The player uses the GSMTC api, which is async, but egui doesn’t really like async. So, I made it so that every time you wanted to run some command on the current session, it would start up a new thread. This was less than ideal for a few reasons: terrible performance race conditions could happen just… in Windows itself The main problem was 2: for example, if you skipped a replay too fast, the Play command from the end of the replay might actually reach Windows before the Pause command from the replay start, leaving your music paused. So instead, it starts one dedicated worker thread which has a channel which receives a Box<dyn FnOnce(Session)> , and executes at most one command every 50ms (only one command per loop, fixed loop time of 50ms). It’s really interesting because you actually end up sending a closure through a channel, which feels funny but when you really think about it it’s just ownership semantics. But, that’s working great now! On to swapper improvements! First, I moved most of the swapper module to anyhow handling (it’s heaven!), and I also modernized the upk api a bit since it was basically dragged directly from the proof-of-concept repo, meaning it was not really application-ready. Also, it previously looked at the game’s webcache to decode the AES keys for header decryption, but now it uses the wonderful Toga-Files repository along with a really nice caching layer for it to load items and their associated API keys. Having access to the actual item data is also way better since you don’t have to manually type in a package name which is kinda weird for any normal person. Now, you can select it from a dropdown instead! I love UX.
rlbuddy now loads additional playlists straight from the game’s cached webconfig, instead of hardcoding them all! This means that the list of playlists will basically never go out of date. There are actually quite a few services which rely on game files (eg. auto stats api setup, custom maps, asset swapper). So, the first thing I did was to refactor it so make all of these load from the same global value. Then, for playlists, I made it read from a specific file in the game’s http cache directory which contains a bunch of configuration. Then, it parses it into a JSON object, grabs all the values with Class PlaylistSettings_TA, and then extracts the title and playlist id! There are still a bunch of built-in Playlists, since those have internal things like going from a casual playlist type to its respective competitive one or having the hard-coded list of singleplayer playlists. But, all the other ones, like ltms are dynamically loaded. Yay!
I got licensee version 34 (encrypted payloads too) to swap finally! Okay, so this was awesome. Rocket League’s been having a bunch of updates lately, which breaks the packages of people trying to get free stuff. So, in a Reddit thread, I ended up dishing out a bunch of swapped asset files for people in this situation. There’s a new boost which everybody wanted really bad since it was really rare (but they decided to make it unlockable at rocket pass lv99 so it doesn’t even matter anymore), and it was UNSWAPPABLE for three reasons: it was encrypted specially i hadnt encountered specially encrypted packages meaning their handling was wrong aes keys werent out for it yet (or so I thought) I’ll start with 3. I had written a tool which looks in the games cache for AES keys, and dumped them, and it worked great. What I didn’t expect is the filename to change between versions. So, I was super confused since yesterday since the AES key for the boost was just… missing. Thankfully, the geniuses at the RLMM discord got it and helped me figure out that the file I was reading from was just outdated. Great! Anyways, not too big of a deal, just a big delay. Now it’s time for the real challenge: figuring out how the hell to handle this type of package. First, I did some research. The twelve bytes of padding in files with licensee version >=33 before the summary are actually a nonce/aes iv, not just padding. Then, the header is encrypted with AES-CTR with the twelve first bytes of the iv just being the nonce. And the compressed chunks are encrypted too here: each one is also AES-CTRed with their own nonces in FCompressedChunkInfo. Thing is, I don’t have an implementation to really go off anymore, meaning there’s a lot more trial and error. For the original implementation, there were one or two existing asset swappers (though they were vibecoded meaning more of a puzzle to figure out what they’re even doing), but this time I was mostly relying on emii’s fork of UEViewer. Anyways, after spending a while figuring out what exactly I had to masquerade (payload, key, swap nonces) I finally got it to work!
Not much in terms of super-cool stuff this time. Highlights are: make sure dynamic playlist loading uses the latest cache file (and also fix its loading on normal people’s rocket league installs) loading the cache file on another thread so it doesnt freeze the whole app for a second on the first lazy lock access searching for items in the item swapper moved the error handling of the map loader to anyhow So no ultra-exciting things to talk about. anyhow is really cool though, it really simplifies error handling everywhere in the app, and I’m a big fan of its bail! macro. I’m also using Cow a lot more. Moo!
I made a standalone web-based swapper for the people who don’t want to download an entire app. A lot of people had broken packages after the last update but didn’t want to install a dedicated program just for a few swaps. So, I used the asset swapper backend of rlbuddy to make this thingamabob which runs entirely in the browser! First, I had to find out how to actually share rlbuddy’s asset swapper with other projects. Turns out Cargo has a cool thing called workspaces where you can have multiple crates in the same repo! So I moved the dedicated UPK/AES etc. stuff into a new crate and added it as a dependency in regular rlbuddy. Then, I whipped up a small wasm-compatible eframe app with the template, and included the new crate as a dependency. I made a big state machine of the steps meaning it’s impossible to have an invalid state, which is really nice. The only problem was that Rust’s ownership system isn’t smart enough to deal with it, so the code is a bit repetitive in places but it’s definitely worth it. The WASM restrictions were super annoying, mainly do to with filesystem access and requiring async. I ended up using the egui-async crate and spilling Binds all over the place within the state machine. I couldn’t even figure out how to get the actual swap procedure to run in a different thread. I also spent like 30 minutes debugging why in the world asset swapping was just broken. Even when I verified the same binary data were going in to the Upk object in the webapp and rlbuddy, for some reason the output upk was just different. Turns out I used chosen_replacement.name instead of chosen_replacement.package.name() . Isn’t that great? Anyways, it works fine now and I’m planning on posting it on r/RocketLeagueMods and possible r/RocketLeague.
A few fixes here and there. Some refactors, caching externally loaded playlists in savedata, and fixing a deadlock when clearing the items cache. And for some reason the decal option was missing from the items list picker.
more small improvements. i gave the session stats widget an actual service as well which speeds things up a lot since its not recalculating statistics every single frame. the swapper also uses the backup file if one is available and it no longer accepts duplicate custom maps
Ships:
rlbuddy is a feature-filled companion for Rocket League! It shows the skill of everyone in your lobby and has tons of toggleable widgets and features to make your life a lot easier, from Discord integration to music control. This is my first non-tiny Rust project, and I think it was really great! I’ve learned a lot such as proper state management and the ins and outs of Rust’s syntax. You can give it a try by heading to the Github releases section. If you play Rocket League, I hope you use it!
rlbutddy is a feature-rich companion for Rocket League, and v1.2 is out. There’s been some big architectural changes meaning it’s faster and bug-free-er, as well as big new features! New!!! Avatars! Now you can see people’s profile pictures even when you’re not on their platform. Custom map loader! You can import maps from a ZIP or download them straight from Bakkesplugins! Gamepad overlay! Show your controls while playing, to show off your bindings or get some help with your speedflips. I think I’ve definitely improved at Rust since the last release. Just in terms of the amount of mistakes I make, I feel like it’s way more smooth sailing than before. For example, I was able to (mostly) write not-so-buggy code and “run the borrow checker in my head” without needing to cargo check a million times, and clippy tends to have a lot less suggestions for me. Pretty great!
I made rlbuddy, a rocket league companion app! This is the third ship so far. The big features this time are the asset swapper and Linux support, but I think that the feature I’m most proud of this time is the asset swapper! It inserts the appearance of one item into the file of another, meaning by swapping out assets for others you can make your car look however you like! (Client-side only, of course). I learned a lot about byte-level manipulation and working with raw data streams and encryption/decryption in Rust, and I can read hex (relatively) well now! It’s also great because I think this combined with the doorstop experiment from a while ago gives me a nice base to try some reverse-engineering challenges in the future. I also worked a lot on performance this time, such as tuning loop times/ui fps caps and minimizing ram usage (I achieved around an 80% reduction here!) There are a crap ton more features added than that (totaling almost 100 commits), but I’m pretty sure you’re not supposed to have massive feature-dumps on the ship text. So the full list is on the latest github release! In the image, you can see I have a white fennec. In reality, I don’t actually have a tw trim, and the equipped decal isn’t compatible with the fennec either. But, using the power of asset swapping, I can get a beautiful all-white car. Neat!...
|
1793602548.8926115
|
1793688948.8926115
|
|
49879
|
WARIO NEEDS VALORANT by @Astrixzen | Stardance
|
Astrixzen
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-17T18:04:47Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a game using godot called “Wario NEEDS Valorant”. Its a small game using a ton of confusing code. Even though it only has 2 levels right now, im hoping to improve it with the next part of making a warioware game", "repo": "https://github.com/Astrixzen/Warioware-game", "demo": "https://astrixzen.itch.io/warioneedsvalorant"}]...
|
[{"post_id": 48937, "ts": "202 [{"post_id": 48937, "ts": "2026-08-17T14:36:03Z", "hours": 6.0347, "text": "WARIOWARE GAME-Wario NEEDS YOU:I made a wario game where you need to go through 2 totally unique level that totally do not follow the guide. But please guys i hope yall play it cause i spent way to long drawing wario in paint :D"}]...
|
Title: WARIO NEEDS VALORANT by @Astrixzen | Starda Title: WARIO NEEDS VALORANT by @Astrixzen | Stardance
Devlogs:
WARIOWARE GAME-Wario NEEDS YOU:I made a wario game where you need to go through 2 totally unique level that totally do not follow the guide. But please guys i hope yall play it cause i spent way to long drawing wario in paint :D
Ships:
I made a game using godot called “Wario NEEDS Valorant”. Its a small game using a ton of confusing code. Even though it only has 2 levels right now, im hoping to improve it with the next part of making a warioware game...
|
1793602550.4802432
|
1793688950.4802432
|