|
55446
|
Blare thing i guess by @CharlieCatMeow | Stardance
|
CharlieCatMeow
|
0
|
6.35
|
0
|
[]
|
[{"post_id": 80113, "ts": "202 [{"post_id": 80113, "ts": "2026-10-16T08:40:48Z", "hours": 2.6056, "text": "Blare Devlog #5 Finished building it now! This is my second time soldering so it went a lot faster than last time. I fixed a couple bugs with the screen not working, it’s kind of weird. Everything works now though, but I don’t have any complex functionality programmed yet."}, {"post_id": 60909, "ts": "2026-09-03T15:54:08Z", "hours": 0.3836, "text": "Blare Devlog #4 I was wrong. Turns out I still had to do the firmware. So here it is. It’s not much, but it should suffice. I can always work on it later but for now I’ll leave it like that so that I can make sure the screen works first once I get the parts."}, {"post_id": 59749, "ts": "2026-09-01T17:57:33Z", "hours": 1.5397, "text": "Blare Devlog #3 Decorated the case a bit I added some things to the case. I don’t know if it looks good but it looks like that now. Also the PCB I added a bunch of SVG’s to the silkscreen. Forgot a picture. That should be all, I should be able to submit now, once I organize the repo a bit and write a README."}, {"post_id": 57411, "ts": "2026-08-29T15:39:06Z", "hours": 1.0061, "text": "Blare Devlog #2 Rewiring the PCB and making the case I had to rewire the PCB since I forgot to flip some parts. Also finished creating the case in the guide. I can move on to decorating the thing now :D"}, {"post_id": 56765, "ts": "2026-08-28T17:34:26Z", "hours": 0.8186, "text": "Blare Devlog #1 I made the PCB. There’s nothing special about it yet. I haven’t added any designs. Yeah thats it I already did a lot on the hackpad mission so this wasn’t really that hard."}]...
|
Title: Blare thing i guess by @CharlieCatMeow | St Title: Blare thing i guess by @CharlieCatMeow | Stardance
Devlogs:
Blare Devlog #1 I made the PCB. There’s nothing special about it yet. I haven’t added any designs. Yeah thats it I already did a lot on the hackpad mission so this wasn’t really that hard.
Blare Devlog #2 Rewiring the PCB and making the case I had to rewire the PCB since I forgot to flip some parts. Also finished creating the case in the guide. I can move on to decorating the thing now :D
Blare Devlog #3 Decorated the case a bit I added some things to the case. I don’t know if it looks good but it looks like that now. Also the PCB I added a bunch of SVG’s to the silkscreen. Forgot a picture. That should be all, I should be able to submit now, once I organize the repo a bit and write a README.
Blare Devlog #4 I was wrong. Turns out I still had to do the firmware. So here it is. It’s not much, but it should suffice. I can always work on it later but for now I’ll leave it like that so that I can make sure the screen works first once I get the parts.
Blare Devlog #5 Finished building it now! This is my second time soldering so it went a lot faster than last time. I fixed a couple bugs with the screen not working, it’s kind of weird. Everything works now though, but I don’t have any complex functionality programmed yet....
|
1792496924.479102
|
1793101724.479102
|
|
69979
|
RiddleBot by @avycado13 | Stardance
|
avycado13
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T19:37:07Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made riddlebot. A bot to riddel you.!", "repo": "https://github.com/avycado13/riddlebot", "demo": "https://hackclub.enterprise.slack.com/archives/C0C9GCQ4LUX"}]...
|
[{"post_id": 80117, "ts": "202 [{"post_id": 80117, "ts": "2026-10-16T08:52:01Z", "hours": 0.6928, "text": "I finished up the README and also the systemd unit to run on my nixos server"}, {"post_id": 80109, "ts": "2026-10-16T08:06:09Z", "hours": 0.4189, "text": "I wrote a basic slack app in socket mode using bolt to send riddles when a slash command is recieved. I tried using bun for this but turns out. that bun’s undici wrapper is super stupid and fails so good old node and pnpm worked instead"}]...
|
Title: RiddleBot by @avycado13 | Stardance
Devlog Title: RiddleBot by @avycado13 | Stardance
Devlogs:
I wrote a basic slack app in socket mode using bolt to send riddles when a slash command is recieved. I tried using bun for this but turns out. that bun’s undici wrapper is super stupid and fails so good old node and pnpm worked instead
I finished up the README and also the systemd unit to run on my nixos server
Ships:
I made riddlebot. A bot to riddel you.!...
|
1793047995.0353262
|
1793134395.0353262
|
|
69540
|
dumb bot by @Aarjav_3 | Stardance
|
Aarjav_3
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T08:59:59Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a slack bot that replies to ur commands hosting it on nest was a bit challenging Slack bot hosted 24/7 on Nest. Test with /dumb-bot-ping, /dumb-bot-catfact, and /dumb-bot-help in #bot-spam.", "repo": "https://github.com/aarjavjain-in/slack-bot", "demo": "https://hackclub.com/slack/"}]...
|
[{"post_id": 80118, "ts": "202 [{"post_id": 80118, "ts": "2026-10-16T08:53:24Z", "hours": 0.2736, "text": "deployed slcak bot to nest so tht it can work 24/7"}, {"post_id": 79854, "ts": "2026-10-15T16:52:54Z", "hours": 0.3428, "text": "made a slack bot tht replies to ur commands"}]...
|
Title: dumb bot by @Aarjav_3 | Stardance
Devlogs: Title: dumb bot by @Aarjav_3 | Stardance
Devlogs:
made a slack bot tht replies to ur commands
deployed slcak bot to nest so tht it can work 24/7
Ships:
i made a slack bot that replies to ur commands hosting it on nest was a bit challenging Slack bot hosted 24/7 on Nest. Test with /dumb-bot-ping, /dumb-bot-catfact, and /dumb-bot-help in #bot-spam....
|
1793008247.3282568
|
1793094647.3282568
|
|
57208
|
the thing by @rizz | Stardance
|
rizz
|
1
|
11.93
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-14T14:05:06Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What I Made I made Toolbox , a small website where people can find useful everyday tools in one place. It includes a focus timer, task list, notes, password generator, unit converter, customs calculator, color picker, calculator, random picker, and habit tracker. I also added a hand drawn style, pastel colours, dark mode, local saving, breadcrumbs, loading animations, keyboard support, and an interactive 3D background with floating shapes and particle effects. What Was Challenging The hardest part was making the website look interesting without making it difficult to use. I tried several different styles before finding the current hand drawn and colourful look. Adding the 3D background was also challenging because it needed to feel alive while keeping the text and tools easy to see. Another difficult part was making all the tools work properly inside the same modal system. Each tool needed its own controls, buttons, results, reset behavior, and error handling. The breadcrumb navigation and deep links were also challenging. I wanted users to be able to open a specific tool directly and still use the browser back button normally. Dark mode took more work than expected too. Changing only the background colour looked bad, so I had to adjust the cards, text, borders, shadows, forms, and 3D background separately. What I Am Proud Of I am proud that Toolbox is not just a design mockup. The tools actually work. You can add tasks, write notes, generate passwords, convert values, calculate numbers, choose random options, and track habits. Notes, tasks, habits, and theme settings can also be saved in the browser. I am especially proud of the 3D background because I built it with a canvas instead of relying on a large 3D library. It reacts to the mouse, moves objects through depth, and creates particles when the page is clicked. I am also proud of the small accessibility details. The cards, icons, and arrows can be opened with the keyboard. Modals can be closed with Escape, and the site has reduced motion support. What People Should Know Before Testing The project currently works without an account or backend. Tasks, notes, habits, and theme settings are saved only in the browser being used. If browser storage is cleared, that information will disappear. The data will not automatically appear on another device. Authentication and cloud sync are planned but are not active yet. The customs calculator is only a rough estimate using simple example rates. It should not be used as official tax or customs advice. To test the project, try these things: Open a tool card. Click the icon on a card. Click the arrow on a card. Open a card with Enter or Space. Close a modal with Escape. Try the “See the tools” button. Switch between light mode and dark mode. Add and complete a task. Write a note, reload the page, and check if it stayed saved. Mark a few days in the habit tracker. Open a calculator directly with ?tool=calculator . Open a tool and use the browser back button. Move the mouse around the 3D background. Click the page and watch the particle effect. For the best test, run the project with a local server: python3 -m http.server 8000", "repo": "https://github.com/STEVEALEX-source/bleh", "demo": "https://stevealex-source.github.io/bleh/"}]...
|
[{"post_id": 80124, "ts": "202 [{"post_id": 80124, "ts": "2026-10-16T09:25:02Z", "hours": 2.6553, "text": "added new stuff and made it into a proper webos with all the features"}, {"post_id": 70060, "ts": "2026-09-18T11:25:41Z", "hours": 1.2719, "text": "changed the UI cuz it got flagged as AI even tho i didn’t use Ai"}, {"post_id": 68063, "ts": "2026-09-14T13:38:02Z", "hours": 3.0397, "text": "Devlog 08 — Current state and the next backend stepToolbox now combines a pastel hand-drawn interface, ten working browser tools, skeleton loading states, breadcrumb navigation, deep links, local persistence, and an interactive 3D canvas background.The current app works as a static frontend. Tasks, notes, habits, and theme preferences stay in browser storage. No account is required for the existing version.Supabase was selected as the planned backend for the next stage. The intended implementation is email authentication, user-owned records, row-level security, cloud sync, offline fallback, and migration from local storage after sign-in.That backend work has not been faked or partially hidden in the frontend. It still needs a Supabase project URL, public anon key, database schema, and security policies before it can be connected safely.The current deployable project contains index.html, style.css, script.js, and 404.html. The frontend can be deployed now, while authentication and synchronization remain the next planned milestone."}, {"post_id": 65759, "ts": "2026-09-11T03:25:29Z", "hours": 2.2308, "text": "so aghh i have rewrote the code and added some more options but i accidentally deleted my Os cuz i tried to play val by dual booting ahem…i lost all my files."}, {"post_id": 62934, "ts": "2026-09-06T14:09:01Z", "hours": 0.2836, "text": "Devlog 06 — Breadcrumbs, deep links, and history The site now has an actual navigation state instead of relying only on scrolling. A breadcrumb row shows the current location and a live status message. It changes between Home, Tools, and About as the user moves through the page. Hovering over a tool card reports the tool name in the status area. Opening a tool updates the URL with a query parameter such as: Plain Text /?tool=calculator This means a specific tool can be shared directly. Browser back and forward navigation also restores or closes the modal correctly. This stage made the application feel more like a small web app instead of a static collection of panels."}, {"post_id": 62216, "ts": "2026-09-05T14:04:37Z", "hours": 0.2981, "text": "Devlog 05 — Adding more tools and loading feedback I expanded Toolbox from seven tools to ten. The new tools are a basic calculator, a random picker, and a habit tracker. The calculator handles basic arithmetic, decimals, clearing, backspace, and divide-by-zero handling. The random picker accepts one option per line and chooses one result. The habit tracker stores a habit name and marks progress across the last seven days. I also added a visible skeleton loader when opening a modal. The loading state is short, but it gives the interface a clear transition instead of making the tool appear abruptly. The habit tracker still works without an account by using local browser storage."}, {"post_id": 61358, "ts": "2026-09-04T07:23:04Z", "hours": 0.3933, "text": "Devlog 04 — Improving the tools and interaction The project then moved from visual work into interaction design. Tool cards became keyboard accessible. Users can open cards with Enter or Space, and tool icons and arrows can also be focused and activated directly. The modal now manages focus more carefully. It moves focus into the dialog when opened, locks page scrolling, closes on Escape, and returns focus to the original card after closing. The password generator was also improved to use cryptographically stronger random values instead of relying only on Math.random(). The theme toggle stores its state locally and exposes its state through aria-pressed. These changes made the site feel less like a visual experiment and more like a real usable interface."}, {"post_id": 60714, "ts": "2026-09-03T08:37:07Z", "hours": 0.8158, "text": "Devlog 03 — Adding the hand-drawn style The next pass moved Toolbox toward a hand-drawn notebook style. I added handwritten display fonts, uneven rotations, sketch borders, paper textures, dashed outlines, irregular icon shapes, and offset shadows. The goal was to make the interface feel assembled by hand rather than generated from a standard component library. The cards received small imperfections instead of perfectly symmetrical decoration. Buttons, labels, notes, and headings started using a more informal visual language. I also added reduced-motion support so the hand-drawn animation would not become a problem for users who prefer less movement. This was the point where Toolbox developed a recognisable personality."}, {"post_id": 60116, "ts": "2026-09-02T08:48:56Z", "hours": 0.3106, "text": "Devlog 02 — Reworking the visual direction The first visual direction felt too much like a generic landing page, so I rebuilt the layout around a quieter utility interface. I changed the typography, spacing, card proportions, modal layout, and responsive behavior. The hero became less promotional and more like an entry point into a small collection of tools. The copy was shortened and made more direct. Instead of trying to sell the product, the page started explaining what it actually does. The card layout became easier to scan. Each card received a number, a short description, a category label, and a clear open action. This stage established the basic visual rule for the project: the interface should feel like a useful object, not a marketing page."}, {"post_id": 59686, "ts": "2026-09-01T16:39:17Z", "hours": 0.7372, "text": "Devlog 01 — Starting with a small toolbox I started building Toolbox as a simple browser page for the little tasks that usually lead to opening five more tabs. The first version focused on three files: index.html, style.css, and script.js. The page had a hero section, a tool grid, a modal system, a theme toggle, and a few local utilities. The first tools were a focus timer, task list, notes area, password generator, unit converter, customs estimate, and color picker. The goal was deliberately small: open the page, choose a tool, finish the job, and leave. The important early decision was to keep everything client-side. Tasks and notes could use browser storage, while calculators and converters could work without a server."}]...
|
Title: the thing by @rizz | Stardance
Devlogs:
De Title: the thing by @rizz | Stardance
Devlogs:
Devlog 01 — Starting with a small toolbox I started building Toolbox as a simple browser page for the little tasks that usually lead to opening five more tabs. The first version focused on three files: index.html, style.css, and script.js. The page had a hero section, a tool grid, a modal system, a theme toggle, and a few local utilities. The first tools were a focus timer, task list, notes area, password generator, unit converter, customs estimate, and color picker. The goal was deliberately small: open the page, choose a tool, finish the job, and leave. The important early decision was to keep everything client-side. Tasks and notes could use browser storage, while calculators and converters could work without a server.
Devlog 02 — Reworking the visual direction The first visual direction felt too much like a generic landing page, so I rebuilt the layout around a quieter utility interface. I changed the typography, spacing, card proportions, modal layout, and responsive behavior. The hero became less promotional and more like an entry point into a small collection of tools. The copy was shortened and made more direct. Instead of trying to sell the product, the page started explaining what it actually does. The card layout became easier to scan. Each card received a number, a short description, a category label, and a clear open action. This stage established the basic visual rule for the project: the interface should feel like a useful object, not a marketing page.
Devlog 03 — Adding the hand-drawn style The next pass moved Toolbox toward a hand-drawn notebook style. I added handwritten display fonts, uneven rotations, sketch borders, paper textures, dashed outlines, irregular icon shapes, and offset shadows. The goal was to make the interface feel assembled by hand rather than generated from a standard component library. The cards received small imperfections instead of perfectly symmetrical decoration. Buttons, labels, notes, and headings started using a more informal visual language. I also added reduced-motion support so the hand-drawn animation would not become a problem for users who prefer less movement. This was the point where Toolbox developed a recognisable personality.
Devlog 04 — Improving the tools and interaction The project then moved from visual work into interaction design. Tool cards became keyboard accessible. Users can open cards with Enter or Space, and tool icons and arrows can also be focused and activated directly. The modal now manages focus more carefully. It moves focus into the dialog when opened, locks page scrolling, closes on Escape, and returns focus to the original card after closing. The password generator was also improved to use cryptographically stronger random values instead of relying only on Math.random(). The theme toggle stores its state locally and exposes its state through aria-pressed. These changes made the site feel less like a visual experiment and more like a real usable interface.
Devlog 05 — Adding more tools and loading feedback I expanded Toolbox from seven tools to ten. The new tools are a basic calculator, a random picker, and a habit tracker. The calculator handles basic arithmetic, decimals, clearing, backspace, and divide-by-zero handling. The random picker accepts one option per line and chooses one result. The habit tracker stores a habit name and marks progress across the last seven days. I also added a visible skeleton loader when opening a modal. The loading state is short, but it gives the interface a clear transition instead of making the tool appear abruptly. The habit tracker still works without an account by using local browser storage.
Devlog 06 — Breadcrumbs, deep links, and history The site now has an actual navigation state instead of relying only on scrolling. A breadcrumb row shows the current location and a live status message. It changes between Home, Tools, and About as the user moves through the page. Hovering over a tool card reports the tool name in the status area. Opening a tool updates the URL with a query parameter such as: Plain Text /?tool=calculator This means a specific tool can be shared directly. Browser back and forward navigation also restores or closes the modal correctly. This stage made the application feel more like a small web app instead of a static collection of panels.
so aghh i have rewrote the code and added some more options but i accidentally deleted my Os cuz i tried to play val by dual booting ahem…i lost all my files.
Devlog 08 — Current state and the next backend stepToolbox now combines a pastel hand-drawn interface, ten working browser tools, skeleton loading states, breadcrumb navigation, deep links, local persistence, and an interactive 3D canvas background.The current app works as a static frontend. Tasks, notes, habits, and theme preferences stay in browser storage. No account is required for the existing version.Supabase was selected as the planned backend for the next stage. The intended implementation is email authentication, user-owned records, row-level security, cloud sync, offline fallback, and migration from local storage after sign-in.That backend work has not been faked or partially hidden in the frontend. It still needs a Supabase project URL, public anon key, database schema, and security policies before it can be connected safely.The current deployable project contains index.html, style.css, script.js, and 404.html. The frontend can be deployed now, while authentication and synchronization remain the next planned milestone.
changed the UI cuz it got flagged as AI even tho i didn’t use Ai
added new stuff and made it into a proper webos with all the features
Ships:
What I Made I made Toolbox , a small website where people can find useful everyday tools in one place. It includes a focus timer, task list, notes, password generator, unit converter, customs calculator, color picker, calculator, random picker, and habit tracker. I also added a hand drawn style, pastel colours, dark mode, local saving, breadcrumbs, loading animations, keyboard support, and an interactive 3D background with floating shapes and particle effects. What Was Challenging The hardest part was making the website look interesting without making it difficult to use. I tried several different styles before finding the current hand drawn and colourful look. Adding the 3D background was also challenging because it needed to feel alive while keeping the text and tools easy to see. Another difficult part was making all the tools work properly inside the same modal system. Each tool needed its own controls, buttons, results, reset behavior, and error handling. The breadcrumb navigation and deep links were also challenging. I wanted users to be able to open a specific tool directly and still use the browser back button normally. Dark mode took more work than expected too. Changing only the background colour looked bad, so I had to adjust the cards, text, borders, shadows, forms, and 3D background separately. What I Am Proud Of I am proud that Toolbox is not just a design mockup. The tools actually work. You can add tasks, write notes, generate passwords, convert values, calculate numbers, choose random options, and track habits. Notes, tasks, habits, and theme settings can also be saved in the browser. I am especially proud of the 3D background because I built it with a canvas instead of relying on a large 3D library. It reacts to the mouse, moves objects through depth, and creates particles when the page is clicked. I am also proud of the small accessibility details. The cards, icons, and arrows can be opened with the keyboard. Modals can be closed with Escape, and the site has reduced motion support. What People Should Know Before Testing The project currently works without an account or backend. Tasks, notes, habits, and theme settings are saved only in the browser being used. If browser storage is cleared, that information will disappear. The data will not automatically appear on another device. Authentication and cloud sync are planned but are not active yet. The customs calculator is only a rough estimate using simple example rates. It should not be used as official tax or customs advice. To test the project, try these things: Open a tool card. Click the icon on a card. Click the arrow on a card. Open a card with Enter or Space. Close a modal with Escape. Try the “See the tools” button. Switch between light mode and dark mode. Add and complete a task. Write a note, reload the page, and check if it stayed saved. Mark a few days in the habit tracker. Open a calculator directly with ?tool=calculator . Open a tool and use the browser back button. Move the mouse around the 3D background. Click the page and watch the particle effect. For the best test, run the project with a local server: python3 -m http.server 8000...
|
1793004951.5803804
|
1793091351.5803804
|
|
69880
|
Buhtig by @evanxdsouza | Stardance
|
evanxdsouza
|
0
|
0.85
|
0
|
[]
|
[{"post_id": 80141, "ts": "202 [{"post_id": 80141, "ts": "2026-10-16T11:31:07Z", "hours": 0.8467, "text": "Buhtig, my first Rails project So basically, I have been wanting to learn Rails for a while, and I decided to start by coding a GitHub clone. so I first had Claude created a step by step for me on the concepts for this and then looked through Google and docs to find how to do each step. I started by implementing users. When I normalized emails, I put it in the wrong file so it took me some time to figure that out and then there were a few problems with singular plural with validates and exclusion. But I finally managed to get user creation up"}]...
|
Title: Buhtig by @evanxdsouza | Stardance
Devlogs Title: Buhtig by @evanxdsouza | Stardance
Devlogs:
Buhtig, my first Rails project So basically, I have been wanting to learn Rails for a while, and I decided to start by coding a GitHub clone. so I first had Claude created a step by step for me on the concepts for this and then looked through Google and docs to find how to do each step. I started by implementing users. When I normalized emails, I put it in the wrong file so it took me some time to figure that out and then there were a few problems with singular plural with validates and exclusion. But I finally managed to get user creation up...
|
1792918132.1490412
|
1793522932.1490412
|
|
69613
|
My web os by @rishith12 | Stardance
|
rishith12
|
2
|
6.0
|
2
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T11:45:11Z", "hours": 1.0, "multiplier": 1.52, "payout": 2, "blessing": "neutral", "text": "I added and extended its features further by adding a fully functional Todo App, Notepad, and a fully functional countdown timer .", "repo": "https://github.com/Rishith88/My_web_OS/", "demo": "https://rishith88.github.io/My_web_OS/"}, {"ship_num": 2, "ts": "2026-10-15T12:34:19Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is the final product, finally done after a lot of hardwork this is a my own web os with a cool cyberpunk there and also teh date and time (IS- Indian Standard Time) with a calculater ,Calendar and a stop watch. The stop watch was teh most difficualt part so i had to refere many youtube tutorials to understand hwo it works but calendar and teh calculater were relatively easy and also the IST time one i had to do some ggogling liek visit otehr wbesite and see how it wokred good leanring for me .It also has a good pop up screen taht vanishes.", "repo": "https://github.com/Rishith88/My_web_OS/", "demo": "https://rishith88.github.io/My_web_OS/"}]...
|
[{"post_id": 80142, "ts": "202 [{"post_id": 80142, "ts": "2026-10-16T11:43:46Z", "hours": 1.2842, "text": "Finally done with my todo app, note pad and the new timer app."}, {"post_id": 79788, "ts": "2026-10-15T12:31:31Z", "hours": 0.6722, "text": "This is the final product guys finally done after a lot of hardwork this is a my own web os with a cool cyberpunk there and also teh date and time (IS- Indian Standard Time) with a calculater ,Calendar and a stop watch"}, {"post_id": 79764, "ts": "2026-10-15T09:35:24Z", "hours": 1.7678, "text": "Stopwatch and a screen timer added broskis less gooooooooo"}, {"post_id": 79618, "ts": "2026-10-14T18:47:30Z", "hours": 1.2136, "text": "Done with my first app guys"}, {"post_id": 79485, "ts": "2026-10-14T08:01:59Z", "hours": 1.0, "text": "My first layout guys less gooooo"}]...
|
Title: My web os by @rishith12 | Stardance
Devlog Title: My web os by @rishith12 | Stardance
Devlogs:
My first layout guys less gooooo
Done with my first app guys
Stopwatch and a screen timer added broskis less gooooooooo
This is the final product guys finally done after a lot of hardwork this is a my own web os with a cool cyberpunk there and also teh date and time (IS- Indian Standard Time) with a calculater ,Calendar and a stop watch
Finally done with my todo app, note pad and the new timer app.
Ships:
This is the final product, finally done after a lot of hardwork this is a my own web os with a cool cyberpunk there and also teh date and time (IS- Indian Standard Time) with a calculater ,Calendar and a stop watch. The stop watch was teh most difficualt part so i had to refere many youtube tutorials to understand hwo it works but calendar and teh calculater were relatively easy and also the IST time one i had to do some ggogling liek visit otehr wbesite and see how it wokred good leanring for me .It also has a good pop up screen taht vanishes.
I added and extended its features further by adding a fully functional Todo App, Notepad, and a fully functional countdown timer ....
|
1793008314.9363208
|
1793094714.9363208
|
|
24969
|
Taikyoku Shogi by @Harry_wct | Stardance
|
Harry_wct
|
0
|
46.52
|
0
|
[]
|
[{"post_id": 80146, "ts": "202 [{"post_id": 80146, "ts": "2026-10-16T12:15:24Z", "hours": 4.4033, "text": "Made the UI not horrible! I’ve spent some time reading design courses. I should make the boxes a bit taller, but in general I feel like this is at the very least much better than the disorganized slop before."}, {"post_id": 78756, "ts": "2026-10-11T14:44:18Z", "hours": 4.8028, "text": "I finally got my ass to write the stupid code to let you actually play against the model on the website! Now you can get your ass beat to this random model that still kinda doesn’t know how to checkmate but besides!"}, {"post_id": 77764, "ts": "2026-10-08T06:16:29Z", "hours": 4.5239, "text": "making some very very basic visual improvements to my site. I am NOT A SITE DESIGN EXPERT please do not murder me. If you have any ideas please leave in comments. In terms of the bot, struggling as usual. Did some more speedups with the help of Claude though. Hopefully next update I’ll be able to chuck it into the board to play with."}, {"post_id": 73180, "ts": "2026-09-24T15:16:11Z", "hours": 4.1522, "text": "A whole lot of nothingness… Right now the work is mostly trying to debug whatever the heck is wrong with the bot that is learning this game. Other than that though, some actual quality-of-life features (like this ingame display) is being coded. Holidays upcoming, so with stardance extended I can actually spend a bunch of time working on this!"}, {"post_id": 66968, "ts": "2026-09-12T23:17:32Z", "hours": 8.33, "text": "There’s not that much visible stuff, but I’ve spent absolutely monumental amounts of time trying to get the engine working. Thank you marimo for allowing me to use free cloud GPUs lol Either way, I’ve somewhat procrastinated on actually getting the more Quality-of-Life aspects of the board viewer to work. In the next release I probably will include a move-sample viewer, a “pieces in danger” viewer, and a promotions list for the convenience of the end user."}, {"post_id": 60835, "ts": "2026-09-03T13:44:03Z", "hours": 5.7703, "text": "The board is complete now, and unfortunately I have to resort to using claude code to write optimized C code so that the base corpus of move generation doesn’t take literally 90 years to do. (ALL of the green “U” is claude-generated)"}, {"post_id": 56636, "ts": "2026-08-28T13:59:18Z", "hours": 11.7144, "text": "More pieces! God it’s been so long since I uploaded one of these."}, {"post_id": 14787, "ts": "2026-06-24T00:54:13Z", "hours": 2.8278, "text": "still stuck in board creation hell…"}]...
|
Title: Taikyoku Shogi by @Harry_wct | Stardance
D Title: Taikyoku Shogi by @Harry_wct | Stardance
Devlogs:
still stuck in board creation hell…
More pieces! God it’s been so long since I uploaded one of these.
The board is complete now, and unfortunately I have to resort to using claude code to write optimized C code so that the base corpus of move generation doesn’t take literally 90 years to do. (ALL of the green “U” is claude-generated)
There’s not that much visible stuff, but I’ve spent absolutely monumental amounts of time trying to get the engine working. Thank you marimo for allowing me to use free cloud GPUs lol Either way, I’ve somewhat procrastinated on actually getting the more Quality-of-Life aspects of the board viewer to work. In the next release I probably will include a move-sample viewer, a “pieces in danger” viewer, and a promotions list for the convenience of the end user.
A whole lot of nothingness… Right now the work is mostly trying to debug whatever the heck is wrong with the bot that is learning this game. Other than that though, some actual quality-of-life features (like this ingame display) is being coded. Holidays upcoming, so with stardance extended I can actually spend a bunch of time working on this!
making some very very basic visual improvements to my site. I am NOT A SITE DESIGN EXPERT please do not murder me. If you have any ideas please leave in comments. In terms of the bot, struggling as usual. Did some more speedups with the help of Claude though. Hopefully next update I’ll be able to chuck it into the board to play with.
I finally got my ass to write the stupid code to let you actually play against the model on the website! Now you can get your ass beat to this random model that still kinda doesn’t know how to checkmate but besides!
Made the UI not horrible! I’ve spent some time reading design courses. I should make the boxes a bit taller, but in general I feel like this is at the very least much better than the disorganized slop before....
|
1792579775.6198254
|
1793184575.6198254
|
|
69546
|
Esp32-Jammer by @Siyam | Stardance
|
Siyam
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T12:38:12Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have built a noise generator who generates noise in 2.4ghz and jam it. It uses 16000000hz noise to jam, and it has 2x nrf for Vspi and Hspi jamming. it jams all channels needed for Wifi and Bluetooth. I just made it for ethical purpose and only use in my devices, I will never use it with anyone else without permission, i know that its illegal. #Used components, (Main) 2x Nrf24l01 1x 0.96” oled 1x Esp32 c3 zero #Used components (Extra) 1x Capacitor 1x Breadboard and some jumpers", "repo": "https://github.com/Tanzil-Alam/2.4Ghz-Noise-Generator", "demo": ""}]...
|
[{"post_id": 80147, "ts": "202 [{"post_id": 80147, "ts": "2026-10-16T12:19:31Z", "hours": 1.7203, "text": "Finalized the project. added comments in code, fixed all errors in code, tested the feature. And also added another Nrf Module."}, {"post_id": 80126, "ts": "2026-10-16T09:32:30Z", "hours": 0.9658, "text": "I have connected another nrf, but unfortunately, all of the wires got mixed and some of them got short-circuit. i have to fix everything again………."}, {"post_id": 79847, "ts": "2026-10-15T16:34:58Z", "hours": 2.3731, "text": "I have uploaded the code and connected the hardware. I have used Esp32 c3 zero 0.96 inch i2c oled Nrf24l01 radio The jamming is working well, My wifi and Bluetooth is getting noised. But i just made it for ethical use, i will never test on anyone else."}]...
|
Title: Esp32-Jammer by @Siyam | Stardance
Devlogs Title: Esp32-Jammer by @Siyam | Stardance
Devlogs:
I have uploaded the code and connected the hardware. I have used Esp32 c3 zero 0.96 inch i2c oled Nrf24l01 radio The jamming is working well, My wifi and Bluetooth is getting noised. But i just made it for ethical use, i will never test on anyone else.
I have connected another nrf, but unfortunately, all of the wires got mixed and some of them got short-circuit. i have to fix everything again……….
Finalized the project. added comments in code, fixed all errors in code, tested the feature. And also added another Nrf Module.
Ships:
I have built a noise generator who generates noise in 2.4ghz and jam it. It uses 16000000hz noise to jam, and it has 2x nrf for Vspi and Hspi jamming. it jams all channels needed for Wifi and Bluetooth. I just made it for ethical purpose and only use in my devices, I will never use it with anyone else without permission, i know that its illegal. #Used components, (Main) 2x Nrf24l01 1x 0.96” oled 1x Esp32 c3 zero #Used components (Extra) 1x Capacitor 1x Breadboard and some jumpers...
|
1793008250.491919
|
1793094650.491919
|
|
69537
|
automatic humidifier by @mr_kn5196 | Stardance
|
mr_kn5196
|
0
|
2.39
|
0
|
[]
|
[{"post_id": 80148, "ts": "202 [{"post_id": 80148, "ts": "2026-10-16T12:36:10Z", "hours": 0.5667, "text": "PCB IS DONE!! YAYYYY now i need to make the Case for it and work on the firmware"}, {"post_id": 79838, "ts": "2026-10-15T16:18:36Z", "hours": 0.2833, "text": "added the footprint"}, {"post_id": 79821, "ts": "2026-10-15T15:19:26Z", "hours": 1.5375, "text": "Schematic done for the automatic humdifier Plan for it 3 servo to open a door to let the steam come out , 1 for each ear and 1 on top of the head the 3D model will be Anger from Inide Out movie Display to display its emotions and eyes A bettery level checker to see the battery level on phone and to get reminder to charge it when its low TP4056 to charge the battery A water level float to check and notify you when water level is low A humidity sensor to sense when the humidity is low Red color LED to display anger feel when water vapour comes out"}]...
|
Title: automatic humidifier by @mr_kn5196 | Starda Title: automatic humidifier by @mr_kn5196 | Stardance
Devlogs:
Schematic done for the automatic humdifier Plan for it 3 servo to open a door to let the steam come out , 1 for each ear and 1 on top of the head the 3D model will be Anger from Inide Out movie Display to display its emotions and eyes A bettery level checker to see the battery level on phone and to get reminder to charge it when its low TP4056 to charge the battery A water level float to check and notify you when water level is low A humidity sensor to sense when the humidity is low Red color LED to display anger feel when water vapour comes out
added the footprint
PCB IS DONE!! YAYYYY now i need to make the Case for it and work on the firmware...
|
1792857093.579323
|
1793461893.579323
|
|
38966
|
HydroLarm by @DCoder | Stardance
|
DCoder
|
0
|
1.22
|
0
|
[]
|
[{"post_id": 80149, "ts": "202 [{"post_id": 80149, "ts": "2026-10-16T12:36:11Z", "hours": 0.5053, "text": "PCB Today, I focuesed on making the PCB, where I had to search for almost 30 minutes for a valid footprint library for my ESP32. Once I found it, the rest was pretty fun. I wired everything together, added the 3d Model, and was pretty proud of myself!"}, {"post_id": 80015, "ts": "2026-10-15T23:58:50Z", "hours": 0.2689, "text": "HydroLarm Schematics Hello everyone! Today, I focused on creating the schematics for HydroLarm. I added an Esp32 C3 Supermini, a buzzer, a switch, and the hx711 module. This was my second time working on KiCad, and I really enjoyed connecting all the wires together. DevLog tommorow! (i hope)"}, {"post_id": 79673, "ts": "2026-10-15T01:04:35Z", "hours": 0.4483, "text": "HydroLarm This was my first DevLog, and I must say, it was great! I started off by building the base of HydroLarm, using 120 MM as my diameter because im going to 3d print this, and I don’t have a gigantic printer 😭. Anyways, I searched up shematics for the Arduino NANO EVERY, which I’ll be using for the project, as it’s compact. I then proceeded by building the walls, leaving a 8mm USB Gap for the USB thingy. I also embossed ‘HydroLarm’ on the front for extra style 😏. And, yep! That’s it! Thanks for reading! New DevLog tommorow (i hope)"}]...
|
Title: HydroLarm by @DCoder | Stardance
Devlogs:
Title: HydroLarm by @DCoder | Stardance
Devlogs:
HydroLarm This was my first DevLog, and I must say, it was great! I started off by building the base of HydroLarm, using 120 MM as my diameter because im going to 3d print this, and I don’t have a gigantic printer 😭. Anyways, I searched up shematics for the Arduino NANO EVERY, which I’ll be using for the project, as it’s compact. I then proceeded by building the walls, leaving a 8mm USB Gap for the USB thingy. I also embossed ‘HydroLarm’ on the front for extra style 😏. And, yep! That’s it! Thanks for reading! New DevLog tommorow (i hope)
HydroLarm Schematics Hello everyone! Today, I focused on creating the schematics for HydroLarm. I added an Esp32 C3 Supermini, a buzzer, a switch, and the hx711 module. This was my second time working on KiCad, and I really enjoyed connecting all the wires together. DevLog tommorow! (i hope)
PCB Today, I focuesed on making the PCB, where I had to search for almost 30 minutes for a valid footprint library for my ESP32. Once I found it, the rest was pretty fun. I wired everything together, added the 3d Model, and was pretty proud of myself!...
|
1792806745.1628304
|
1793411545.1628304
|
|
17907
|
Image to ASCII convertor by @Nandan | Stardance
|
Nandan
|
0
|
0.9
|
0
|
[]
|
[{"post_id": 8015, "ts": "2026 [{"post_id": 8015, "ts": "2026-06-13T11:37:40Z", "hours": 0.8989, "text": "The program takes a live webcam feed and converts into ASCII characters. Made using Python"}]...
|
Title: Image to ASCII convertor by @Nandan | Stard Title: Image to ASCII convertor by @Nandan | Stardance
Devlogs:
The program takes a live webcam feed and converts into ASCII characters. Made using Python...
|
1792511331.3923664
|
1793116131.3923664
|
|
29376
|
Flipper Echo by @GreatJoel | Stardance
|
GreatJoel
|
0
|
83.46
|
0
|
[]
|
[{"post_id": 80153, "ts": "202 [{"post_id": 80153, "ts": "2026-10-16T13:01:46Z", "hours": 5.4058, "text": "i worked on the ui and setuped the wifi AP and STA. also added a password feature so it can connect easily and its own. other side i annded the scan so it can scan live all the wifi around it."}, {"post_id": 76143, "ts": "2026-10-02T14:17:37Z", "hours": 19.2397, "text": "right now i ahve worked for like the ui stuff. and from here i had added few more updates to the device hardware.. like vibrations when button click an indication led also added a tansisitor for the led display so its led bakclight can be controlled using the gpio in the supermini. here i also added a update over the wifi.. since it doesnt have any keyboard. i added a qr scanner which can scan to any wifi network and connect its own.. it can save the network and use when ever it avalable."}, {"post_id": 71595, "ts": "2026-09-21T03:51:21Z", "hours": 58.8139, "text": "now i have added teo esp board one for the streaming and one for displaying it in the display beacuse the esp32 cam wont able to get sdcard and tft streaming at same time it doesnt gpios the one i am useing here is esp32 devboard and esp32cam,, ESP32 cam captures the live video frame fromthe OV3660 camera sensor at 160x128 (tft resolution) with JPEG auality 18 fragments, each frame is 244byte with espnow packerts and transmit them to esp32 dev bored. the esp32 borad reassembles the packets to compelete JEPG frame it decodes using TJpgDec into 160x128, rigthn now i have only working in the firmware i have made my own firmware it works but have some issue since it suing wifi to transmit th packet to i tried ot make the use softAP to connect esp each so less packets will lose, when the fps drops or packers fails to reach i will ahve to adjuest the STREAM_QUAITY also the cmaera supports the Mirror effect making it much more alive. i have made a prototype"}]...
|
Title: Flipper Echo by @GreatJoel | Stardance
Dev Title: Flipper Echo by @GreatJoel | Stardance
Devlogs:
now i have added teo esp board one for the streaming and one for displaying it in the display beacuse the esp32 cam wont able to get sdcard and tft streaming at same time it doesnt gpios the one i am useing here is esp32 devboard and esp32cam,, ESP32 cam captures the live video frame fromthe OV3660 camera sensor at 160x128 (tft resolution) with JPEG auality 18 fragments, each frame is 244byte with espnow packerts and transmit them to esp32 dev bored. the esp32 borad reassembles the packets to compelete JEPG frame it decodes using TJpgDec into 160x128, rigthn now i have only working in the firmware i have made my own firmware it works but have some issue since it suing wifi to transmit th packet to i tried ot make the use softAP to connect esp each so less packets will lose, when the fps drops or packers fails to reach i will ahve to adjuest the STREAM_QUAITY also the cmaera supports the Mirror effect making it much more alive. i have made a prototype
right now i ahve worked for like the ui stuff. and from here i had added few more updates to the device hardware.. like vibrations when button click an indication led also added a tansisitor for the led display so its led bakclight can be controlled using the gpio in the supermini. here i also added a update over the wifi.. since it doesnt have any keyboard. i added a qr scanner which can scan to any wifi network and connect its own.. it can save the network and use when ever it avalable.
i worked on the ui and setuped the wifi AP and STA. also added a password feature so it can connect easily and its own. other side i annded the scan so it can scan live all the wifi around it....
|
1792684067.1951468
|
1793288867.1951468
|
|
48156
|
AI3DSTUDIO by @Madhanraj | Stardance
|
Madhanraj
|
1
|
43.81
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T11:59:39Z", "hours": 33.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I am shipping Stardance in its current state because my available development time has been limited by my Class 12 studies and school schedule. Although the complete vision for AI3D Studio is much larger and several features are still under development, I wanted to submit the working progress I have achieved rather than leave the project unshipped. The current version represents a major milestone of the project, with a functional 3D environment, AI interaction, computer-vision-based interaction, and database integration already implemented. I plan to continue developing the remaining features after shipping. This is not the final version of AI3D Studio — it is the first major milestone toward the complete system I originally envisioned.", "repo": "https://github.com/maddy9002/AI3DSTUDIO", "demo": "https://ai-3-dstudio-beta.vercel.app/"}]...
|
[{"post_id": 80154, "ts": "202 [{"post_id": 80154, "ts": "2026-10-16T13:02:11Z", "hours": 2.0864, "text": "Worked on the new ui for the html file, implementing necessary features for cad operations"}, {"post_id": 78229, "ts": "2026-10-10T01:32:38Z", "hours": 3.5311, "text": "Worked on AI3DSTUDIO’s advanced modeling capabilities, implementing Merge/Weld Vertices, Vertex Dissolve, Edge Dissolve, and Face Dissolve, including topology updates and Undo/Redo support.I also created requirements.txt and README.md, resolved Python dependency conflicts involving MediaPipe, NumPy, and OpenCV, verified the application launches successfully, and pushed the changes to the advanced-modeling branch on GitHub.Next, I’ll test the installation process in a fresh environment to make AI3DSTUDIO easier for others to try."}, {"post_id": 76640, "ts": "2026-10-04T07:39:58Z", "hours": 2.7172, "text": "After implementing Inset, AI3DSTUDIO’S mesh-editing system was expanded with several advanced modeling features, including Loop Cut, Bevel, Merge/Weld Vertices, Vertex Dissolve, Edge Dissolve, Face Dissolve, and Bridge Edge Loops. The editing workflow was also improved with Vertex, Edge, and Face selection and manipulation, along with Undo/Redo support for mesh-editing operations, significantly improving AI3DSTUDIO’S overall polygon-modeling capabilities."}, {"post_id": 74257, "ts": "2026-09-27T02:43:36Z", "hours": 2.4761, "text": "While upgrading the UI the features that I made had disappeared and now I worked to create a html file where i can link it to Stardance."}, {"post_id": 71170, "ts": "2026-09-20T11:58:49Z", "hours": 0.8817, "text": "Worked to improve the UI"}, {"post_id": 70963, "ts": "2026-09-20T03:52:57Z", "hours": 2.2081, "text": "Implemented and stabilized hand-based viewport interaction. The system now supports a screen-space hand cursor controlled by the index finger, pinch-based selection of vertices, edges, and faces, and two-hand gesture editing. Vertex movement is working, while edge and face movement are being integrated by transforming their underlying mesh vertices. Object Mode gestures for movement, rotation, and scaling remain functional. The next focus is completing reliable hand-based edge/face manipulation and improving pinch-based selection accuracy."}, {"post_id": 68678, "ts": "2026-09-15T15:07:33Z", "hours": 2.2633, "text": "Completed till multi-face selection"}, {"post_id": 64857, "ts": "2026-09-09T15:32:34Z", "hours": 5.7969, "text": "Completed the undo redo system for all the edit options."}, {"post_id": 47430, "ts": "2026-08-15T11:13:47Z", "hours": 22.1772, "text": "WORKING TO UPGRADE THE 3D DESIGNING SOFTWARE"}]...
|
Title: AI3DSTUDIO by @Madhanraj | Stardance
Devlo Title: AI3DSTUDIO by @Madhanraj | Stardance
Devlogs:
WORKING TO UPGRADE THE 3D DESIGNING SOFTWARE
Completed the undo redo system for all the edit options.
Completed till multi-face selection
Implemented and stabilized hand-based viewport interaction. The system now supports a screen-space hand cursor controlled by the index finger, pinch-based selection of vertices, edges, and faces, and two-hand gesture editing. Vertex movement is working, while edge and face movement are being integrated by transforming their underlying mesh vertices. Object Mode gestures for movement, rotation, and scaling remain functional. The next focus is completing reliable hand-based edge/face manipulation and improving pinch-based selection accuracy.
Worked to improve the UI
While upgrading the UI the features that I made had disappeared and now I worked to create a html file where i can link it to Stardance.
After implementing Inset, AI3DSTUDIO’S mesh-editing system was expanded with several advanced modeling features, including Loop Cut, Bevel, Merge/Weld Vertices, Vertex Dissolve, Edge Dissolve, Face Dissolve, and Bridge Edge Loops. The editing workflow was also improved with Vertex, Edge, and Face selection and manipulation, along with Undo/Redo support for mesh-editing operations, significantly improving AI3DSTUDIO’S overall polygon-modeling capabilities.
Worked on AI3DSTUDIO’s advanced modeling capabilities, implementing Merge/Weld Vertices, Vertex Dissolve, Edge Dissolve, and Face Dissolve, including topology updates and Undo/Redo support.I also created requirements.txt and README.md, resolved Python dependency conflicts involving MediaPipe, NumPy, and OpenCV, verified the application launches successfully, and pushed the changes to the advanced-modeling branch on GitHub.Next, I’ll test the installation process in a fresh environment to make AI3DSTUDIO easier for others to try.
Worked on the new ui for the html file, implementing necessary features for cad operations
Ships:
I am shipping Stardance in its current state because my available development time has been limited by my Class 12 studies and school schedule. Although the complete vision for AI3D Studio is much larger and several features are still under development, I wanted to submit the working progress I have achieved rather than leave the project unshipped. The current version represents a major milestone of the project, with a functional 3D environment, AI interaction, computer-vision-based interaction, and database integration already implemented. I plan to continue developing the remaining features after shipping. This is not the final version of AI3D Studio — it is the first major milestone toward the complete system I originally envisioned....
|
1793148468.8246431
|
1793234868.8246431
|
|
65551
|
Profile by @iku_dev | Stardance
|
iku_dev
|
1
|
9.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T15:42:01Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my own personal site I joined the preanal site challenge and I think I made a got project for my first time. I am really proud of the animations and the general design as when I was making this I had no plan!! I got stuck a lot in this creation, not only knowledge issue but technical as well I did not know the difference between “id” and “class” so when I was labeling it as id I was calling it in CSS as a class so nothing was happening. :( my computer was crushing a lot I was writing 2 animations on one element hence sometimes the would not play I even once forgot to connect the html to CSS -honestly a lot happened and it will get to long to list them To use this web u can either use the online website or run it locally by downloading the files from GitHub and opening the index file !!!This was a really fun experience and I pushed to do as many projects before it closes!!!!", "repo": "https://github.com/ikumedev/MY-PROFILE-hackclub-", "demo": "https://ikumedev.github.io/MY-PROFILE-hackclub-/"}]...
|
[{"post_id": 80155, "ts": "202 [{"post_id": 80155, "ts": "2026-10-16T13:05:04Z", "hours": 3.1633, "text": "I KNOW 3 HOURS IS MAD!!! Okay today is my last day of my website development.:) what i did to day? firstly i made more visually pleasant and fixed a lot of bugs. i add a lot of animations to make it more responsive and overall better. i got help to make the adaptive part of my program but apart from that it was fun!!! i hope you like it as much as i did making it"}, {"post_id": 77414, "ts": "2026-10-06T21:29:16Z", "hours": 2.2919, "text": "As for today!! I cleaned up my website and removed some “over the top effects”:). I stool some sticker’s from hackclub website and animated everything.I add 4 more pages and decorated them All almost done!!!!"}, {"post_id": 76862, "ts": "2026-10-04T21:21:21Z", "hours": 2.9114, "text": "I spent today make making my web look better. But low-key spent most of my time learning css and HTML through vids. :)"}, {"post_id": 73839, "ts": "2026-09-26T04:27:14Z", "hours": 0.6089, "text": "Today I made ! plain html code. First of all am, making my own personal profile-page. So I made the basics parts, sections and random info about my self."}]...
|
Title: Profile by @iku_dev | Stardance
Devlogs:
T Title: Profile by @iku_dev | Stardance
Devlogs:
Today I made ! plain html code. First of all am, making my own personal profile-page. So I made the basics parts, sections and random info about my self.
I spent today make making my web look better. But low-key spent most of my time learning css and HTML through vids. :)
As for today!! I cleaned up my website and removed some “over the top effects”:). I stool some sticker’s from hackclub website and animated everything.I add 4 more pages and decorated them All almost done!!!!
I KNOW 3 HOURS IS MAD!!! Okay today is my last day of my website development.:) what i did to day? firstly i made more visually pleasant and fixed a lot of bugs. i add a lot of animations to make it more responsive and overall better. i got help to make the adaptive part of my program but apart from that it was fun!!! i hope you like it as much as i did making it
Ships:
I made my own personal site I joined the preanal site challenge and I think I made a got project for my first time. I am really proud of the animations and the general design as when I was making this I had no plan!! I got stuck a lot in this creation, not only knowledge issue but technical as well I did not know the difference between “id” and “class” so when I was labeling it as id I was calling it in CSS as a class so nothing was happening. :( my computer was crushing a lot I was writing 2 animations on one element hence sometimes the would not play I even once forgot to connect the html to CSS -honestly a lot happened and it will get to long to list them To use this web u can either use the online website or run it locally by downloading the files from GitHub and opening the index file !!!This was a really fun experience and I pushed to do as many projects before it closes!!!!...
|
1793008261.7944913
|
1793094661.7944913
|
|
61791
|
Slack Bot Ichi by @rigid_valmeo | Stardance
|
rigid_valmeo
|
1
|
4.48
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T12:39:10Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created “Ichi Slack Bot,” an animal-themed Slack bot created as part of the NASA Stardance Challenge. This is my first coding project outside of school. I created it while learning the basics of JavaScript, APIs, Slack bot development, and programming through Stardance. The bot is designed around my interest in animals and chemistry. It provides information about cats and dogs, including animal-related chemistry, breeds, foods that dogs should avoid, and feeding reminders. I had fun while doing this, although I was quite puzzled about how to use GitHub at first!", "repo": "https://github.com/rigidvalmeo03/ichi-slack-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 80157, "ts": "202 [{"post_id": 80157, "ts": "2026-10-16T13:27:37Z", "hours": 0.4847, "text": "YIPPIEEE after so long I finally made it work!! The feeder reminder actually reminds!"}, {"post_id": 68619, "ts": "2026-09-15T12:29:57Z", "hours": 3.6483, "text": "Slack bot to know more about your pets!:3"}]...
|
Title: Slack Bot Ichi by @rigid_valmeo | Stardance Title: Slack Bot Ichi by @rigid_valmeo | Stardance
Devlogs:
Slack bot to know more about your pets!:3
YIPPIEEE after so long I finally made it work!! The feeder reminder actually reminds!
Ships:
I created “Ichi Slack Bot,” an animal-themed Slack bot created as part of the NASA Stardance Challenge. This is my first coding project outside of school. I created it while learning the basics of JavaScript, APIs, Slack bot development, and programming through Stardance. The bot is designed around my interest in animals and chemistry. It provides information about cats and dogs, including animal-related chemistry, breeds, foods that dogs should avoid, and feeding reminders. I had fun while doing this, although I was quite puzzled about how to use GitHub at first!...
|
1792813879.7822878
|
1793677879.7822878
|
|
68306
|
Locate with Lois by @EshanDoes | Stardance
|
EshanDoes
|
0
|
13.67
|
0
|
[]
|
[{"post_id": 80158, "ts": "202 [{"post_id": 80158, "ts": "2026-10-16T13:40:37Z", "hours": 8.72, "text": "Yes, I know, second devlog is on the start of voting for the jam, likely not gonna get much in terms of storytelling. Either way though, the game was in a finished enough state for submission! Likely not gonna ship it yet though, because I’m gonna be working on a post-jam patch to patch up the rough spots."}, {"post_id": 78201, "ts": "2026-10-09T23:19:13Z", "hours": 4.9511, "text": "A bit late since there’s already under a week left until round 1 is finished, but I’ve been making progress! I finished the dialogue system as can be seen from this video on Tuesday, but I’ve still got a lot to go, especially in terms of assets. Hopefully I can get it done on time!"}]...
|
Title: Locate with Lois by @EshanDoes | Stardance
Title: Locate with Lois by @EshanDoes | Stardance
Devlogs:
A bit late since there’s already under a week left until round 1 is finished, but I’ve been making progress! I finished the dialogue system as can be seen from this video on Tuesday, but I’ve still got a lot to go, especially in terms of assets. Hopefully I can get it done on time!
Yes, I know, second devlog is on the start of voting for the jam, likely not gonna get much in terms of storytelling. Either way though, the game was in a finished enough state for submission! Likely not gonna ship it yet though, because I’m gonna be working on a post-jam patch to patch up the rough spots....
|
1793119941.6207297
|
1793724741.6207297
|
|
68947
|
swarnabindu by @threatsentinels | Stardance
|
threatsentinels
|
1
|
11.0
|
142
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T15:34:50Z", "hours": 11.0, "multiplier": 13.34, "payout": 142, "blessing": "neutral", "text": "This is a patient and vaccination management system for a government health facility in Nepal. This project taught me a lot about building software beyond just making things work , understanding real-world workflows, handling patient records, and making technology practical for the people who use it. Built with Django and PostgreSQL, with plenty more to learn and improve.", "repo": "https://github.com/threatsentinels/swarnabindu", "demo": "https://ahckhotang.ggsrclub.com/"}]...
|
[{"post_id": 80160, "ts": "202 [{"post_id": 80160, "ts": "2026-10-16T14:02:36Z", "hours": 1.6317, "text": "Devlog no 5 In the last 1 hr 37 mintures i worked on polishing the forms and its grids . I now have fully working self inrollment form . I am so close to finishing it ."}, {"post_id": 79702, "ts": "2026-10-15T03:46:48Z", "hours": 1.2564, "text": "DEVLOG NO 4 , in the last 1 hr i wrote the code for base.html and other templates to be used in the site . I have finally locked into a theme i.e. proper nepali government website theme . I have created a navbar and landing page that displays login form for hospital staff and self registration form for patients and it also displays current nepali date that is derived from AD using my custom code ."}, {"post_id": 79288, "ts": "2026-10-13T10:31:53Z", "hours": 2.3172, "text": "DEVLOG NO 3 : I wrote code for database backup . Since this system is going to be used in critical environment of hospital so it requires timely backups and ready to production data . For backups i have created a system for 2 kinds of backup one is on same drive backup and another is external backup . Project will backup the data in another seperate database and in plain json file too ."}, {"post_id": 78662, "ts": "2026-10-11T06:25:05Z", "hours": 1.2083, "text": "Nepal follows different calender from rest of the world that is BIKRAM SAMBAT (BS.) so currently NEPAL is in year 2083 which is 57 year older than AD . Our servers , databases and all other logical engines work in georgian calender so i wrote a code for conversion of BS TO AD AND AD TO BS for seamless no confusion system for users and admins . I used date time functions and other functions to do this work ."}, {"post_id": 78279, "ts": "2026-10-10T08:20:33Z", "hours": 4.2472, "text": "Swarnabindu is a gold infused ayurvedic medicine given to child below 5 years , it is widely practiced in Nepal . When i visited the hospital with my nephew i saw them writing details and medicine records in notebook so i have decided to make one management software them which will allow the workers to enter the details of the patients , add vaccination dates , manage dosage , create reports and other analytical and official work . In the First Phase i have build the project strucutre , tested it and wrote some basic code ."}]...
|
Title: swarnabindu by @threatsentinels | Stardance Title: swarnabindu by @threatsentinels | Stardance
Devlogs:
Swarnabindu is a gold infused ayurvedic medicine given to child below 5 years , it is widely practiced in Nepal . When i visited the hospital with my nephew i saw them writing details and medicine records in notebook so i have decided to make one management software them which will allow the workers to enter the details of the patients , add vaccination dates , manage dosage , create reports and other analytical and official work . In the First Phase i have build the project strucutre , tested it and wrote some basic code .
Nepal follows different calender from rest of the world that is BIKRAM SAMBAT (BS.) so currently NEPAL is in year 2083 which is 57 year older than AD . Our servers , databases and all other logical engines work in georgian calender so i wrote a code for conversion of BS TO AD AND AD TO BS for seamless no confusion system for users and admins . I used date time functions and other functions to do this work .
DEVLOG NO 3 : I wrote code for database backup . Since this system is going to be used in critical environment of hospital so it requires timely backups and ready to production data . For backups i have created a system for 2 kinds of backup one is on same drive backup and another is external backup . Project will backup the data in another seperate database and in plain json file too .
DEVLOG NO 4 , in the last 1 hr i wrote the code for base.html and other templates to be used in the site . I have finally locked into a theme i.e. proper nepali government website theme . I have created a navbar and landing page that displays login form for hospital staff and self registration form for patients and it also displays current nepali date that is derived from AD using my custom code .
Devlog no 5 In the last 1 hr 37 mintures i worked on polishing the forms and its grids . I now have fully working self inrollment form . I am so close to finishing it .
Ships:
This is a patient and vaccination management system for a government health facility in Nepal. This project taught me a lot about building software beyond just making things work , understanding real-world workflows, handling patient records, and making technology practical for the people who use it. Built with Django and PostgreSQL, with plenty more to learn and improve....
|
1793008298.0589716
|
1793094698.0589716
|
|
69346
|
StudyFlow by @Rocky_3 | Stardance
|
Rocky_3
|
0
|
1.31
|
0
|
[]
|
[{"post_id": 80166, "ts": "202 [{"post_id": 80166, "ts": "2026-10-16T14:46:58Z", "hours": 0.3906, "text": "Bugs de la bibliothèque de cours…"}, {"post_id": 79985, "ts": "2026-10-15T19:07:30Z", "hours": 0.9156, "text": "Nouveau tableau de bord !"}]...
|
Title: StudyFlow by @Rocky_3 | Stardance
Devlogs: Title: StudyFlow by @Rocky_3 | Stardance
Devlogs:
Nouveau tableau de bord !
Bugs de la bibliothèque de cours…...
|
1793130915.1730332
|
1793735715.1730332
|
|
70042
|
My own site! by @gokul2009136 | Stardance
|
gokul2009136
|
0
|
0.65
|
0
|
[]
|
[{"post_id": 80170, "ts": "202 [{"post_id": 80170, "ts": "2026-10-16T15:16:39Z", "hours": 0.65, "text": "i worked in the html and css and i used only the basic code then i created domain using vercel,this is one of the beginner website its look like the beginner website with a good color and fonts it is basically a self intro page like my name my hobby and my skills etc… thats it i think so"}]...
|
Title: My own site! by @gokul2009136 | Stardance
Title: My own site! by @gokul2009136 | Stardance
Devlogs:
i worked in the html and css and i used only the basic code then i created domain using vercel,this is one of the beginner website its look like the beginner website with a good color and fonts it is basically a self intro page like my name my hobby and my skills etc… thats it i think so...
|
1792946967.3746688
|
1793551767.3746688
|
|
63761
|
Todo WinUI by @vilmer_hagelberg | Stardance
|
vilmer_hagelberg
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T15:42:38Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a todo app for windows built in C# with WinUI3. It is very easy to use, works well and has saves the todos.", "repo": "https://github.com/GamerReaper09/WinUI-Todo", "demo": "https://github.com/GamerReaper09/WinUI-Todo/releases/tag/release"}]...
|
[{"post_id": 80172, "ts": "202 [{"post_id": 80172, "ts": "2026-10-16T15:33:49Z", "hours": 1.9189, "text": "Finally done. I made the repo now i just have to do the first ship."}, {"post_id": 76792, "ts": "2026-10-04T16:08:55Z", "hours": 3.2731, "text": "Essentially working now. The add todo is now working and therefore the app is almost done"}, {"post_id": 74932, "ts": "2026-09-28T16:50:02Z", "hours": 1.91, "text": "An early prototype of the app is now working. So far there is only the task list, remove button, and a placeholder add button."}, {"post_id": 73169, "ts": "2026-09-24T15:03:41Z", "hours": 2.58, "text": "I completed microsofts tutorial on how to make a note app. So i now understand the basics and is ready to start making my own program."}, {"post_id": 70623, "ts": "2026-09-19T14:05:36Z", "hours": 0.5856, "text": "I added my first lines of code in the project 🥳🥳"}]...
|
Title: Todo WinUI by @vilmer_hagelberg | Stardance Title: Todo WinUI by @vilmer_hagelberg | Stardance
Devlogs:
I added my first lines of code in the project 🥳🥳
I completed microsofts tutorial on how to make a note app. So i now understand the basics and is ready to start making my own program.
An early prototype of the app is now working. So far there is only the task list, remove button, and a placeholder add button.
Essentially working now. The add todo is now working and therefore the app is almost done
Finally done. I made the repo now i just have to do the first ship.
Ships:
This is a todo app for windows built in C# with WinUI3. It is very easy to use, works well and has saves the todos....
|
1793008253.6231134
|
1793094653.6231134
|
|
44244
|
Lost&Found by @yeagerist | Stardance
|
yeagerist
|
3
|
23.0
|
262
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-24T03:44:47Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "this is a tribute to my lost&found with a dead last ship with small update", "repo": "https://github.com/Aarjal/The_Bug", "demo": "https://the-bug.vercel.app/"}, {"ship_num": 2, "ts": "2026-09-25T10:20:33Z", "hours": 5.0, "multiplier": 11.08, "payout": 59, "blessing": "neutral", "text": "This is my second ship to my project lost&found with little css tweaks and UI/UX enhancements as per the reviews from first ship. This web app is basically a platform for people to perform actions regarding lost items. (either seek their lost item or post a found item) The basic workflow is : -Sign up with a random acc and post a lost item in feed -Sign up with a diff random acc and post a related found item in feed -The system will create a match between those two items and let you choose wat to do furthur with it. As per last ship reviews, One important suggestion i found was to include a demo video of whole workflow in my README and this time I’ve not missed that out dw. That might help yall a lot in this ship since signing in and our repeatedly is troublesome. Looking forward to hear from you guys. (Suggestions are immensely appreciated😋)", "repo": "https://github.com/Aarjal/The_Bug", "demo": "https://the-bug.vercel.app/"}, {"ship_num": 3, "ts": "2026-09-14T09:31:21Z", "hours": 16.0, "multiplier": 12.39, "payout": 203, "blessing": "neutral", "text": "I built Lost&Found mainly with the aim to make finding lost belongings a little less painful. Yes, it was a result of some disappointing personal experience. Instead of having to search through different media groups or hope someone sees your post, you can report a lost or found item here and let the system look for possible matches. The main part I’m proud of is the matching system. Lost and found posts are compared using things like category, description, location and dates to find possible matches, and users can get notified when one is found. I also added the usual stuff around it like authentication, notifications, resolving recovered cases, an admin dashboard, and as always a light/dark mode. It might seem quite like “Okay now how the hell am i supposed to use it then?” Here’s something important. A quick way to test it: create an account → make a Lost Item post → create another account →create a matching Found Item post with similar details → check the notifications/matches → if it’s the right item, you can resolve the case. (You can also try the flow the other way around by posting a found item first.) The backend is hosted through render and may take a LITTLE time to load but please be patient for a few seconds and the flow’s gonna go as mentioned above", "repo": "https://github.com/Aarjal/The_Bug", "demo": "https://the-bug.vercel.app/"}]...
|
[{"post_id": 80173, "ts": "202 [{"post_id": 80173, "ts": "2026-10-16T15:34:34Z", "hours": 1.5981, "text": "I got idea from some other open source web-app and added a new “Recent activity feature in my admin dashboard”. Here’s also the recent data of what ya’ll have been doing ><"}, {"post_id": 73264, "ts": "2026-09-24T18:16:20Z", "hours": 1.6661, "text": "Rewrote the READMe from sctrach and tuned up the CSS a bit cus they asked ¯ _ (ツ)_/¯"}, {"post_id": 70220, "ts": "2026-09-18T18:51:33Z", "hours": 0.8733, "text": "it seems the css wasnt responding well in feed page after the hosting. took me some time but i’ve fixed the code and it works as expected now :)"}, {"post_id": 68774, "ts": "2026-09-15T18:48:39Z", "hours": 0.4542, "text": "just improved the Readme a bit nothing much nothing more showed for review and now adjusted as per the recommendations. Now the next thing is finally the shipping of project Optimistic to hear your says on this😄😄"}, {"post_id": 68246, "ts": "2026-09-14T19:27:07Z", "hours": 2.3539, "text": "I spent some time cleaning up the frontend code and styles to make the app faster and easier to maintain. Split up bloated pages: Broke down massive files like Item Detail, Recovery Requests, Feed, and Navbar into smaller subcomponents (modals, media previews, contact info, filters). Now editing one UI block won’t risk breaking the whole page. Fixed React state quirks: Switched Feed categories to derive directly with useMemo to skip extra re-renders, fixed initial edit form state, and added cleanup guards on API calls so navigating away doesn’t trigger memory leak warnings. Cleaned up the CSS: Replaced duplicated skeleton loaders and empty-state styles across 5 files with shared rules in index.css. Swapped hardcoded colors and overlays across all stylesheets for theme tokens so dark and light modes behave properly everywhere."}, {"post_id": 67507, "ts": "2026-09-13T17:04:49Z", "hours": 1.1086, "text": "Finally got the main workflow of Lost&Found working! The posting flow and matching system are connected now, so users can actually post lost or found items and the backend can go through the matching logic to find possible matches. I also finished up the remaining bits around resolving cases, notifications, and the other backend connections. I’ve now made the project deployable too. The frontend is hosted on Vercel and the backend is running on Render, and I’ve connected the two so the live app can actually communicate with the backend. There are obviously still things I can improve later, but for now the main workflow is working properly and the project is finally ready to ship."}, {"post_id": 66169, "ts": "2026-09-11T20:27:49Z", "hours": 1.7531, "text": "Been working on connecting the rest of the backend now. I got the resolving part done so when someone gets their item back, they can mark the case as resolved and it gets taken out of the active feed instead of sitting there like it’s still available. I also worked on the privacy policy agreement during signup, making sure that gets properly handled instead of just being a checkbox that does nothing. Apart from that I’ve connected the remaining reports, notifications, matching and user posts so they all actually talk to the backend properly. Most of the main stuff is pretty much done now, just a few small things left to fix and test. After that it should finally be ready to ship. Next devlog is basically going to be getting everything ready for deployment😋"}, {"post_id": 66062, "ts": "2026-09-11T17:05:13Z", "hours": 2.1011, "text": "FINALLLLYY I’ve worked on the matching system. This is what the whole app was all about tbh. The backend compares lost and found posts instead of just showing everything as a possible match. It looks at things like the item category, description/details, location, and dates, so a lost wallet and a found wallet in a completely different place or with an impossible date won’t just get treated the same. I’m also working on the backend logic that calculates these matches and sends the relevant results back to the frontend. A certain kinda post and match is successfully tested and its GREEN > < but there’s still some testing to do with different combinations of posts and I’m not confident about it yet :’("}, {"post_id": 65444, "ts": "2026-09-10T16:08:19Z", "hours": 0.9175, "text": "I’ve started working more on the backend! This time I focused on the lost and found reporting system, making sure the reports actually get sent through the API and saved properly in MongoDB. Each report is linked to the user who created it, along with things like the category, description, location, date, and image info. I also added some validation so the backend doesn’t just accept whatever the frontend sends. There were a few annoying little issues between the form, authentication, API and database, but I’ve got the main flow working now."}, {"post_id": 64928, "ts": "2026-09-09T17:25:26Z", "hours": 1.2067, "text": "This time I worked on adding light and dark mode. Previously the button was just sitting there doing nothing. Now the app can adapt to the user’s system theme instead of forcing them to pick one manually. If someone has their device set to dark mode, Lost&Found can follow that preference, while still giving them the option to switch between light and dark mode themselves. Still doing some small tweaks here and there, but this might be the final goodbye to frontend now"}, {"post_id": 64676, "ts": "2026-09-09T08:28:09Z", "hours": 1.2125, "text": "Today I worked on the admin dashboard. The idea behind it is to give me a simple overview of what’s happening across the platform instead of having to dig through individual reports. It includes stats for total lost reports, found reports, resolved cases, recovery rate, average resolution time, and the most common item categories. It doesn’t look the best but works for now.."}, {"post_id": 64320, "ts": "2026-09-08T16:38:23Z", "hours": 1.1492, "text": "Okay the progress is I made a few changes and improvements across the app to make the main user flow feel more complete. Up untill now was just the frontend part. I’ve also started working on the backend side of things, connecting the frontend features with the actual application logic and getting the necessary API functionality in place. There’s still quite a bit to connect and test, but the project is gradually moving from just having separate features to having everything work together as one proper application."}, {"post_id": 50954, "ts": "2026-08-20T12:54:52Z", "hours": 0.9122, "text": "I spent this session working on more of the Lost&Found frontend. I worked on the news feed, the UI for reporting both lost and found items, and the notifications frontend. One thing I also noticed with Stardance: when I linked my other Hackatime projects (i was working on separate directories for client and server side) to this project, their tracked time got added to the time shown on my previous devlog. My first devlog originally showed around 1 hour, but after linking those projects it changed to 6h . It didn’t work like that previously on Flavortown. Other than that, the frontend is coming together and I’m getting closer to having the main Lost → Match → Notification flow fully connected."}, {"post_id": 41398, "ts": "2026-08-05T16:21:00Z", "hours": 6.0625, "text": "I’m working on a web-app which I’ve named ‘Lost&Found’. As the name suggests, it’s a community help oriented, supportive, efficient and easy to use application which people can hop onto to search for their lost belongings. The idea is to create match between lost items and found items based on their descriptions and filters to finally get a confidence match score of whether the item is actually the one the user is looking for ( basically checking if lost-item = found-item ) For now, the actual countable work i’ve done is created a few icons for the web_app and finalised on one which is followed by same favicon."}]...
|
Title: Lost&Found by @yeagerist | Stardance
D Title: Lost&Found by @yeagerist | Stardance
Devlogs:
I’m working on a web-app which I’ve named ‘Lost&Found’. As the name suggests, it’s a community help oriented, supportive, efficient and easy to use application which people can hop onto to search for their lost belongings. The idea is to create match between lost items and found items based on their descriptions and filters to finally get a confidence match score of whether the item is actually the one the user is looking for ( basically checking if lost-item = found-item ) For now, the actual countable work i’ve done is created a few icons for the web_app and finalised on one which is followed by same favicon.
I spent this session working on more of the Lost&Found frontend. I worked on the news feed, the UI for reporting both lost and found items, and the notifications frontend. One thing I also noticed with Stardance: when I linked my other Hackatime projects (i was working on separate directories for client and server side) to this project, their tracked time got added to the time shown on my previous devlog. My first devlog originally showed around 1 hour, but after linking those projects it changed to 6h . It didn’t work like that previously on Flavortown. Other than that, the frontend is coming together and I’m getting closer to having the main Lost → Match → Notification flow fully connected.
Okay the progress is I made a few changes and improvements across the app to make the main user flow feel more complete. Up untill now was just the frontend part. I’ve also started working on the backend side of things, connecting the frontend features with the actual application logic and getting the necessary API functionality in place. There’s still quite a bit to connect and test, but the project is gradually moving from just having separate features to having everything work together as one proper application.
Today I worked on the admin dashboard. The idea behind it is to give me a simple overview of what’s happening across the platform instead of having to dig through individual reports. It includes stats for total lost reports, found reports, resolved cases, recovery rate, average resolution time, and the most common item categories. It doesn’t look the best but works for now..
This time I worked on adding light and dark mode. Previously the button was just sitting there doing nothing. Now the app can adapt to the user’s system theme instead of forcing them to pick one manually. If someone has their device set to dark mode, Lost&Found can follow that preference, while still giving them the option to switch between light and dark mode themselves. Still doing some small tweaks here and there, but this might be the final goodbye to frontend now
I’ve started working more on the backend! This time I focused on the lost and found reporting system, making sure the reports actually get sent through the API and saved properly in MongoDB. Each report is linked to the user who created it, along with things like the category, description, location, date, and image info. I also added some validation so the backend doesn’t just accept whatever the frontend sends. There were a few annoying little issues between the form, authentication, API and database, but I’ve got the main flow working now.
FINALLLLYY I’ve worked on the matching system. This is what the whole app was all about tbh. The backend compares lost and found posts instead of just showing everything as a possible match. It looks at things like the item category, description/details, location, and dates, so a lost wallet and a found wallet in a completely different place or with an impossible date won’t just get treated the same. I’m also working on the backend logic that calculates these matches and sends the relevant results back to the frontend. A certain kinda post and match is successfully tested and its GREEN > < but there’s still some testing to do with different combinations of posts and I’m not confident about it yet :’(
Been working on connecting the rest of the backend now. I got the resolving part done so when someone gets their item back, they can mark the case as resolved and it gets taken out of the active feed instead of sitting there like it’s still available. I also worked on the privacy policy agreement during signup, making sure that gets properly handled instead of just being a checkbox that does nothing. Apart from that I’ve connected the remaining reports, notifications, matching and user posts so they all actually talk to the backend properly. Most of the main stuff is pretty much done now, just a few small things left to fix and test. After that it should finally be ready to ship. Next devlog is basically going to be getting everything ready for deployment😋
Finally got the main workflow of Lost&Found working! The posting flow and matching system are connected now, so users can actually post lost or found items and the backend can go through the matching logic to find possible matches. I also finished up the remaining bits around resolving cases, notifications, and the other backend connections. I’ve now made the project deployable too. The frontend is hosted on Vercel and the backend is running on Render, and I’ve connected the two so the live app can actually communicate with the backend. There are obviously still things I can improve later, but for now the main workflow is working properly and the project is finally ready to ship.
I spent some time cleaning up the frontend code and styles to make the app faster and easier to maintain. Split up bloated pages: Broke down massive files like Item Detail, Recovery Requests, Feed, and Navbar into smaller subcomponents (modals, media previews, contact info, filters). Now editing one UI block won’t risk breaking the whole page. Fixed React state quirks: Switched Feed categories to derive directly with useMemo to skip extra re-renders, fixed initial edit form state, and added cleanup guards on API calls so navigating away doesn’t trigger memory leak warnings. Cleaned up the CSS: Replaced duplicated skeleton loaders and empty-state styles across 5 files with shared rules in index.css. Swapped hardcoded colors and overlays across all stylesheets for theme tokens so dark and light modes behave properly everywhere.
just improved the Readme a bit nothing much nothing more showed for review and now adjusted as per the recommendations. Now the next thing is finally the shipping of project Optimistic to hear your says on this😄😄
it seems the css wasnt responding well in feed page after the hosting. took me some time but i’ve fixed the code and it works as expected now :)
Rewrote the READMe from sctrach and tuned up the CSS a bit cus they asked ¯ _ (ツ)_/¯
I got idea from some other open source web-app and added a new “Recent activity feature in my admin dashboard”. Here’s also the recent data of what ya’ll have been doing ><
Ships:
I built Lost&Found mainly with the aim to make finding lost belongings a little less painful. Yes, it was a result of some disappointing personal experience. Instead of having to search through different media groups or hope someone sees your post, you can report a lost or found item here and let the system look for possible matches. The main part I’m proud of is the matching system. Lost and found posts are compared using things like category, description, location and dates to find possible matches, and users can get notified when one is found. I also added the usual stuff around it like authentication, notifications, resolving recovered cases, an admin dashboard, and as always a light/dark mode. It might seem quite like “Okay now how the hell am i supposed to use it then?” Here’s something important. A quick way to test it: create an account → make a Lost Item post → create another account →create a matching Found Item post with similar details → check the notifications/matches → if it’s the right item, you can resolve the case. (You can also try the flow the other way around by posting a found item first.) The backend is hosted through render and may take a LITTLE time to load but please be patient for a few seconds and the flow’s gonna go as mentioned above
This is my second ship to my project lost&found with little css tweaks and UI/UX enhancements as per the reviews from first ship. This web app is basically a platform for people to perform actions regarding lost items. (either seek their lost item or post a found item) The basic workflow is : -Sign up with a random acc and post a lost item in feed -Sign up with a diff random acc and post a related found item in feed -The system will create a match between those two items and let you choose wat to do furthur with it. As per last ship reviews, One important suggestion i found was to include a demo video of whole workflow in my README and this time I’ve not missed that out dw. That might help yall a lot in this ship since signing in and our repeatedly is troublesome. Looking forward to hear from you guys. (Suggestions are immensely appreciated😋)
this is a tribute to my lost&found with a dead last ship with small update...
|
1793148633.364817
|
1793235033.364817
|
|
65413
|
Celestie by @sylvieisnton | Stardance
|
sylvieisnton
|
0
|
32.71
|
0
|
[]
|
[{"post_id": 80175, "ts": "202 [{"post_id": 80175, "ts": "2026-10-16T15:37:27Z", "hours": 27.3972, "text": "I FORGOT TO WRITE LOGS but icons were made and sadness was had for the 17.5 hours that aren’t counted"}, {"post_id": 73693, "ts": "2026-09-25T18:29:16Z", "hours": 5.31, "text": "Create logo, add SVG building"}]...
|
Title: Celestie by @sylvieisnton | Stardance
Devl Title: Celestie by @sylvieisnton | Stardance
Devlogs:
Create logo, add SVG building
I FORGOT TO WRITE LOGS but icons were made and sadness was had for the 17.5 hours that aren’t counted...
|
1793087422.4841146
|
1793692222.4841146
|
|
6269
|
DuckML / Duckonomics by @ZiggyZonko | Stardance
|
ZiggyZonko
|
1
|
10.0
|
101
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T11:52:33Z", "hours": 10.0, "multiplier": 10.13, "payout": 101, "blessing": "neutral", "text": "Created a duck themed economics simulator, implementing machine learning. I am extremely proud of this project, it was such a fun idea I randomly thought of on the bus home from school. I must add more playability and user interactivity in the next release! (the readme lists were made by AI, the rest was not, I wanted the emojis 🫠, just putting that out there if any of the shipwrighters are questioning it’s authenticity.)", "repo": "https://github.com/ZiggyZonko/Duckonomics", "demo": "https://github.com/ZiggyZonko/Duckonomics/releases/tag/v1.0.0-alpha"}]...
|
[{"post_id": 8018, "ts": "2026 [{"post_id": 8018, "ts": "2026-06-13T11:44:19Z", "hours": 0.395, "text": "More accessories implemented based on wealth! Currently making the demo for shipping #1"}, {"post_id": 6744, "ts": "2026-06-11T09:12:14Z", "hours": 0.3319, "text": "Made a panel to click the ducks and check their age, money, name etc. More shops to come…"}, {"post_id": 6736, "ts": "2026-06-11T08:45:29Z", "hours": 0.2822, "text": "Main Menu Created and working, going to add more shops and machine learning capabilities to choosing different shops"}, {"post_id": 6149, "ts": "2026-06-10T10:37:09Z", "hours": 0.5056, "text": "Made a Bussiness Tax for the government and let the simulator run for 150 days to see what happens, everyone is rich and most only last until they turn 8, will start tweaking the taxing, birth and death rate to simulate a realistic economy."}, {"post_id": 5560, "ts": "2026-06-09T11:53:22Z", "hours": 1.2406, "text": "Added Population control, changing the birth and death rate to execute once every 30 second day. Added an Obituary and implemented Government Taxing on wages, (jobs added) and jobs include: JOBS = { “Baker”: 12, “Fisher”: 8, “Merchant”: 15, “Programmer”: 25, “Unemployed”: 0 } Suggest some jobs in the comments, and suggest some first and last names too FIRST_NAMES = [ “Bob”, “Sarah”, “Alex”, “Emily”, “Oscar” ] LAST_NAMES = [ “Quackson”, “Featherstone”, “Breadsworth”, “McDuck”, “Waddles” ] Also added some UI regarding the treasury and added a seperate birth rate for an additional child."}, {"post_id": 5517, "ts": "2026-06-09T10:17:36Z", "hours": 1.9308, "text": "Added Uniquness, more traits, age, birth, death, accessories based on wealth, names and working toward a more functioning society. Also made a cleaner codebase, with constants and variable scripts in place to make everything cleaner. Fixed the duck finding a shop algorithm, based on nearest shop AND STOCK now, rather than just distance. Increase Screen Size and minor tweaks here and there."}, {"post_id": 4807, "ts": "2026-06-08T09:41:34Z", "hours": 0.4033, "text": "Added a population counter and fixed a previous bug with selling bread"}, {"post_id": 4791, "ts": "2026-06-08T09:00:16Z", "hours": 1.5008, "text": "Added Waves, Icons, And working shop system that refills the stock everyday and uses machine learning to predict what the stock of the bakery needs to be in order to sustain the hunger of the populaation. It tracks the sales, predictions, stock and money of the stores. I also added a day counter and a time label to ensure players know the status of the shop and sales."}, {"post_id": 3392, "ts": "2026-06-06T09:17:12Z", "hours": 1.3297, "text": "Began Duckonomics, created the basics and beginning to implement Machine Learning into the prices for profit of bread. Ducks have a random movement pattern, bread label in progress. Each duck will have own character traits that make it unique."}, {"post_id": 2070, "ts": "2026-06-04T11:49:29Z", "hours": 1.1031, "text": "Experimented with Markov Chains and made a dynamic system that scans a dataset of sentences based off a theme, forms new sentences, that adds to the csv of QuackJudge. This creates a sustainable loop all based off one single initial dataset and a Markov Chain. The Markov chain tracks different sentences and interprets words that come after one another to form sentences. Realistically my dataset isn’t large enough to showcase accurate data but still showcases the concept’s nature."}, {"post_id": 1397, "ts": "2026-06-03T12:33:44Z", "hours": 0.9636, "text": "Made a simple word to emotion classifier using the Naive Bayes Classifier algorithm, with training of 90% and testing of 10%, it provides on average, 51% accuracy based on self-testing. By increasing the size of the dataset, the accuracy and vocabulary will increase, showcased in the vectorisation of the word below, where the one is a recognised word. Mathematically this is represented in a multi-dimensional space based on how many known words the AI understands based on training and testing. Might test image classification next or try new Machine Learning Concepts to create an All-in-one, self taught AI, image, audio, emotion etc."}]...
|
Title: DuckML / Duckonomics by @ZiggyZonko | Stard Title: DuckML / Duckonomics by @ZiggyZonko | Stardance
Devlogs:
Made a simple word to emotion classifier using the Naive Bayes Classifier algorithm, with training of 90% and testing of 10%, it provides on average, 51% accuracy based on self-testing. By increasing the size of the dataset, the accuracy and vocabulary will increase, showcased in the vectorisation of the word below, where the one is a recognised word. Mathematically this is represented in a multi-dimensional space based on how many known words the AI understands based on training and testing. Might test image classification next or try new Machine Learning Concepts to create an All-in-one, self taught AI, image, audio, emotion etc.
Experimented with Markov Chains and made a dynamic system that scans a dataset of sentences based off a theme, forms new sentences, that adds to the csv of QuackJudge. This creates a sustainable loop all based off one single initial dataset and a Markov Chain. The Markov chain tracks different sentences and interprets words that come after one another to form sentences. Realistically my dataset isn’t large enough to showcase accurate data but still showcases the concept’s nature.
Began Duckonomics, created the basics and beginning to implement Machine Learning into the prices for profit of bread. Ducks have a random movement pattern, bread label in progress. Each duck will have own character traits that make it unique.
Added Waves, Icons, And working shop system that refills the stock everyday and uses machine learning to predict what the stock of the bakery needs to be in order to sustain the hunger of the populaation. It tracks the sales, predictions, stock and money of the stores. I also added a day counter and a time label to ensure players know the status of the shop and sales.
Added a population counter and fixed a previous bug with selling bread
Added Uniquness, more traits, age, birth, death, accessories based on wealth, names and working toward a more functioning society. Also made a cleaner codebase, with constants and variable scripts in place to make everything cleaner. Fixed the duck finding a shop algorithm, based on nearest shop AND STOCK now, rather than just distance. Increase Screen Size and minor tweaks here and there.
Added Population control, changing the birth and death rate to execute once every 30 second day. Added an Obituary and implemented Government Taxing on wages, (jobs added) and jobs include: JOBS = { “Baker”: 12, “Fisher”: 8, “Merchant”: 15, “Programmer”: 25, “Unemployed”: 0 } Suggest some jobs in the comments, and suggest some first and last names too FIRST_NAMES = [ “Bob”, “Sarah”, “Alex”, “Emily”, “Oscar” ] LAST_NAMES = [ “Quackson”, “Featherstone”, “Breadsworth”, “McDuck”, “Waddles” ] Also added some UI regarding the treasury and added a seperate birth rate for an additional child.
Made a Bussiness Tax for the government and let the simulator run for 150 days to see what happens, everyone is rich and most only last until they turn 8, will start tweaking the taxing, birth and death rate to simulate a realistic economy.
Main Menu Created and working, going to add more shops and machine learning capabilities to choosing different shops
Made a panel to click the ducks and check their age, money, name etc. More shops to come…
More accessories implemented based on wealth! Currently making the demo for shipping #1
Ships:
Created a duck themed economics simulator, implementing machine learning. I am extremely proud of this project, it was such a fun idea I randomly thought of on the bus home from school. I must add more playability and user interactivity in the next release! (the readme lists were made by AI, the rest was not, I wanted the emojis 🫠, just putting that out there if any of the shipwrighters are questioning it’s authenticity.)...
|
1793144841.879362
|
1793231241.879362
|
|
69334
|
Flight Controller by @LeonOMO | Stardance
|
LeonOMO
|
0
|
7.3
|
0
|
[]
|
[{"post_id": 80180, "ts": "202 [{"post_id": 80180, "ts": "2026-10-16T15:50:01Z", "hours": 7.2978, "text": "Ive made a flightcontroller"}]...
|
Title: Flight Controller by @LeonOMO | Stardance
Title: Flight Controller by @LeonOMO | Stardance
Devlogs:
Ive made a flightcontroller...
|
1793130902.700192
|
1793735702.700192
|
|
51533
|
NetStash by @leam | Stardance
|
leam
|
0
|
0.28
|
0
|
[]
|
[{"post_id": 80181, "ts": "202 [{"post_id": 80181, "ts": "2026-10-16T15:59:21Z", "hours": 0.2847, "text": "Initial commit, made the foundation of the web, planning to add a calendar feature soon but for now i must full prove the code and find shorter ways for the code."}]...
|
Title: NetStash by @leam | Stardance
Devlogs:
Ini Title: NetStash by @leam | Stardance
Devlogs:
Initial commit, made the foundation of the web, planning to add a calendar feature soon but for now i must full prove the code and find shorter ways for the code....
|
1792673592.849505
|
1793278392.849505
|
|
53942
|
Komi OS by @SebbyMortimer | Stardance
|
SebbyMortimer
|
1
|
19.81
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T21:30:48Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Gonna preface this by saying I completely forgot to format my last devlog (even though I know I usually don’t do too much formatting but I at least turn the header into an actual header) so it’s kinda just a big wall of text. So, I made a custom WebOS, I started out by following the guide before splitting off to do my own thing after I thought that I’d gotten everything that I thought I could get out of it. This OS is heavily based on Komi Can’t Communicate so you’ll see that theming throughout the entire project. I learned a lot about web development in this project, especially since I was doing something a lot different than what I usually am creating when working on websites so I gained a ton of ball knowledge about tiny little things and fixes that get your website working nice the way that you want it. I also gained a new appreciation for flexboxes, they are absolutely amazing and now I’m using them for almost anything, goodbye clearfixes. So finding those little bits of ball knowledge through debugging was pretty challenging but I’m proud of what I’ve been able to accomplish so far however I’m no where near finished and I really want to keep working on this project. There are many new features in this project that aren’t listed in the guide, I think the two most obvious ones are a music player and the ability to have infinite windows of the same app open at the same time. To test my project, go to the github repo or demo link directly and you’ll find it there. Thank you.", "repo": "https://github.com/SebbyMortimer/Komi-OS", "demo": "https://sebbymortimer.co.uk/Komi-OS/"}]...
|
[{"post_id": 80184, "ts": "202 [{"post_id": 80184, "ts": "2026-10-16T16:35:37Z", "hours": 6.81, "text": "Komi OS devlog 4 It’s been a while since I wrote my last devlog, just been starting university, but I’ve made a ton of changes since my first ship and I’ll try to remember them all. First off, the boot screen has been cleaned up, the boot video will now stop at the correct time consistently on the beat no matter how bad your wifi might be, and I created a little Windows XP logo cutout on the bootscreen just as a nice little thing. The main difference you’ll notice immediately after it’s booted up is that there is now a taskbar! I always knew I was going to add this eventually I just wanted to implement it properly after I had gotten the apps and desktop working as I intended. There are three apps on the taskbar currently which are the notes, music and settings apps and the ones displayed on the taskbar differ slightly to the desktop icons, where the settings icon is not but there’s an extra app/game that I added there instead. When you click on app icons in the taskbar they pop down and back up, and when you hover over them the background behind them also lights up to show which app will open if you were to click now. I added my own custom right click/“context menu” which I also knew I was going to add at some point and currently it only has copy and paste (I say only but pasting was a pain to program, more than you’d initially think) however more options will be added to it in the future. Now inside the settings app I’ve began adding a side menu where if you click on each one it’ll take you to a different settings page, and the first one allows you to pick a different wallpaper from a selection of minimal Komi wallpapers which I’ll have save eventually in your browser when I implement user preferences. That about page is just there as a template currently just so I could test page switching but I’ll add to that in the future and also add more pages, one last thing for the settings app though is in the sidebar you can see little coloured icons to make it immediately more obvious when looking for a specific page. The last app I added since the last devlog was embedding eaglercraft into an app (which wasn’t as easy as I’d hoped it’d be) however I managed to get it working consistently enough to be able to keep it on my site, the corners of it are clipped to the window so that it doesn’t look out of place and it fits right in. I also added a ton of tiny tweaks, too many and too small to list but just things like changing the time to only show the time just to simplify any clutter in the top right, shadows were tweaked on the desktop icons as well as a dark black solid shadow was added to all of the text under the icons and I added a purple highlight colour when selecting text to match Komi’s haircolour. Other things I could remember were things like adding a favicon and moving some of my styling that had snuck into my HTML back into my CSS file but now I’m really reaching for stuff and this devlog is long enough anyway. Excited to continue working on this"}, {"post_id": 65037, "ts": "2026-09-09T20:56:52Z", "hours": 4.7389, "text": "Komi OS devlog 3 I believe my cold is starting to go away which is good, and I’ve been able to do little bits here and there this week with my OS and I’m super excited to continue working on it. I worked mostly on the music player since the last devlog and I was able to add a playback slider that lets you seek through the song thats currently playing while also showing the current time on the left, with the total duration of the song on the right. I added previous/skip buttons that let you move between songs in the playlist (current total of 4, which are 2 opening themes and 2 ending themes from the show) and I added/switched a lot of buttons to have icons like the play/pause button, previous/skip buttons and both sides of the volume slider. Because of the added playback slider and the icons taking up more space I had to increase the window height of the music player and I also slightly darkened the background of the player too to increase the contrast of the text and buttons and stuff in front of it to make them easier to see on lighter cover art. Lastly, if the song ends it will automatically move forward to the next song, the same thing if a song was currently playing and you skip it’ll autoplay the next song, otherwise if you skip while paused it’ll stay paused. Outside of the music player, I added drop shadows to all the windows and the current focused window gains a darker shadow to show that it’s focused. I also began work on a boot screen that I’ll probably create a cooldown for so that you don’t have to watch it boot up every time you reload the page since it’s pretty long but I’m having a really great time working on this project, it’s been really fun and I can’t wait to get to work on it some more. If I forget anything else I worked on in this devlog I might mention it in my ship."}, {"post_id": 60144, "ts": "2026-09-02T10:13:05Z", "hours": 1.6344, "text": "Komi OS devlog 2 Over the last two days I: Got a heavy cold, not fun Started working on my music player, much more fun :D I first implemented the nice blurred background you quite often get with music players, along with the music cover art. Behind the scenes I got the play/pause button to work and play the current song as well as a working volume slider. I’ve also implemented a function that lets me change the song that’s currently playing however I’ve not yet attached it to any buttons or anything so I can only do it via script. I think I’ll either just have forward/back buttons that move through a hidden playlist or I might make an actual playlist that you select from if I can think of a design for that. Almost forgot to say that I also have the music and artist’s names appear alongside the cover art and I created a spotify-esque icon to make it more obvious to people what my app does before they even open it. I believe I covered everything, a couple of minor annoyances when trying to implement things but I guess I’ll count that as new web ball knowledge."}, {"post_id": 59449, "ts": "2026-09-01T09:38:38Z", "hours": 6.8881, "text": "Komi OS devlog 1 Gonna preface this by saying I really should’ve made more devlogs to split this up more because now I’m going to have to try and remember everything that I did, so here goes. I followed most of the guide initially just to get a similar setup working, but from the beginning I knew there were some fundamental things I wanted to change about the project like making windows use classes/OOP so that I can have multiple of them and easily interact with specific windows and another thing I wanted to change was just having some cleaner/nicer ways of doing things since I noticed the guide was kept relatively simple for absolute beginners. Anyway, once I had gotten as much as I wanted from the guide, I split off and started making the project fully my own. Windows being fully (I believe fully, altho I still have to do some cleanup) converted to using classes along with the ability to have multiple windows of the same app open is really the big main obvious one, however I have made so many tiny changes that don’t show visually which you’ll notice a lot more while you’re using and interacting with it, like adding mini app icons on window headers, changing the z-index ordering so it doesn’t infinitely go up, creating my own selection code for icons on the desktop including them requiring a double click to open, making some text/images non-selectable just like real operating systems and so many more little tweaks that really make it super intuitive to use. Currently I’m stuck on something trivial, I’m trying to decide between two images to use as the operating system’s “image” but I’m just going to set that aside for now, so instead next I think I will be working on adding either a music player or a settings menu that will allow me to change out the wallpaper, and maybe also save/remember anything you do on the operating system. Or I may leave that to WebOS 2 and just work on getting a nice base WebOS 1 page working by customising the operating system more to make it more unique. Either way I guess we’ll see. Sorry if you had to read this entire devlog I understand it’s a lot, so thank you very much."}]...
|
Title: Komi OS by @SebbyMortimer | Stardance
Devl Title: Komi OS by @SebbyMortimer | Stardance
Devlogs:
Komi OS devlog 1 Gonna preface this by saying I really should’ve made more devlogs to split this up more because now I’m going to have to try and remember everything that I did, so here goes. I followed most of the guide initially just to get a similar setup working, but from the beginning I knew there were some fundamental things I wanted to change about the project like making windows use classes/OOP so that I can have multiple of them and easily interact with specific windows and another thing I wanted to change was just having some cleaner/nicer ways of doing things since I noticed the guide was kept relatively simple for absolute beginners. Anyway, once I had gotten as much as I wanted from the guide, I split off and started making the project fully my own. Windows being fully (I believe fully, altho I still have to do some cleanup) converted to using classes along with the ability to have multiple windows of the same app open is really the big main obvious one, however I have made so many tiny changes that don’t show visually which you’ll notice a lot more while you’re using and interacting with it, like adding mini app icons on window headers, changing the z-index ordering so it doesn’t infinitely go up, creating my own selection code for icons on the desktop including them requiring a double click to open, making some text/images non-selectable just like real operating systems and so many more little tweaks that really make it super intuitive to use. Currently I’m stuck on something trivial, I’m trying to decide between two images to use as the operating system’s “image” but I’m just going to set that aside for now, so instead next I think I will be working on adding either a music player or a settings menu that will allow me to change out the wallpaper, and maybe also save/remember anything you do on the operating system. Or I may leave that to WebOS 2 and just work on getting a nice base WebOS 1 page working by customising the operating system more to make it more unique. Either way I guess we’ll see. Sorry if you had to read this entire devlog I understand it’s a lot, so thank you very much.
Komi OS devlog 2 Over the last two days I: Got a heavy cold, not fun Started working on my music player, much more fun :D I first implemented the nice blurred background you quite often get with music players, along with the music cover art. Behind the scenes I got the play/pause button to work and play the current song as well as a working volume slider. I’ve also implemented a function that lets me change the song that’s currently playing however I’ve not yet attached it to any buttons or anything so I can only do it via script. I think I’ll either just have forward/back buttons that move through a hidden playlist or I might make an actual playlist that you select from if I can think of a design for that. Almost forgot to say that I also have the music and artist’s names appear alongside the cover art and I created a spotify-esque icon to make it more obvious to people what my app does before they even open it. I believe I covered everything, a couple of minor annoyances when trying to implement things but I guess I’ll count that as new web ball knowledge.
Komi OS devlog 3 I believe my cold is starting to go away which is good, and I’ve been able to do little bits here and there this week with my OS and I’m super excited to continue working on it. I worked mostly on the music player since the last devlog and I was able to add a playback slider that lets you seek through the song thats currently playing while also showing the current time on the left, with the total duration of the song on the right. I added previous/skip buttons that let you move between songs in the playlist (current total of 4, which are 2 opening themes and 2 ending themes from the show) and I added/switched a lot of buttons to have icons like the play/pause button, previous/skip buttons and both sides of the volume slider. Because of the added playback slider and the icons taking up more space I had to increase the window height of the music player and I also slightly darkened the background of the player too to increase the contrast of the text and buttons and stuff in front of it to make them easier to see on lighter cover art. Lastly, if the song ends it will automatically move forward to the next song, the same thing if a song was currently playing and you skip it’ll autoplay the next song, otherwise if you skip while paused it’ll stay paused. Outside of the music player, I added drop shadows to all the windows and the current focused window gains a darker shadow to show that it’s focused. I also began work on a boot screen that I’ll probably create a cooldown for so that you don’t have to watch it boot up every time you reload the page since it’s pretty long but I’m having a really great time working on this project, it’s been really fun and I can’t wait to get to work on it some more. If I forget anything else I worked on in this devlog I might mention it in my ship.
Komi OS devlog 4 It’s been a while since I wrote my last devlog, just been starting university, but I’ve made a ton of changes since my first ship and I’ll try to remember them all. First off, the boot screen has been cleaned up, the boot video will now stop at the correct time consistently on the beat no matter how bad your wifi might be, and I created a little Windows XP logo cutout on the bootscreen just as a nice little thing. The main difference you’ll notice immediately after it’s booted up is that there is now a taskbar! I always knew I was going to add this eventually I just wanted to implement it properly after I had gotten the apps and desktop working as I intended. There are three apps on the taskbar currently which are the notes, music and settings apps and the ones displayed on the taskbar differ slightly to the desktop icons, where the settings icon is not but there’s an extra app/game that I added there instead. When you click on app icons in the taskbar they pop down and back up, and when you hover over them the background behind them also lights up to show which app will open if you were to click now. I added my own custom right click/“context menu” which I also knew I was going to add at some point and currently it only has copy and paste (I say only but pasting was a pain to program, more than you’d initially think) however more options will be added to it in the future. Now inside the settings app I’ve began adding a side menu where if you click on each one it’ll take you to a different settings page, and the first one allows you to pick a different wallpaper from a selection of minimal Komi wallpapers which I’ll have save eventually in your browser when I implement user preferences. That about page is just there as a template currently just so I could test page switching but I’ll add to that in the future and also add more pages, one last thing for the settings app though is in the sidebar you can see little coloured icons to make it immediately more obvious when looking for a specific page. The last app I added since the last devlog was embedding eaglercraft into an app (which wasn’t as easy as I’d hoped it’d be) however I managed to get it working consistently enough to be able to keep it on my site, the corners of it are clipped to the window so that it doesn’t look out of place and it fits right in. I also added a ton of tiny tweaks, too many and too small to list but just things like changing the time to only show the time just to simplify any clutter in the top right, shadows were tweaked on the desktop icons as well as a dark black solid shadow was added to all of the text under the icons and I added a purple highlight colour when selecting text to match Komi’s haircolour. Other things I could remember were things like adding a favicon and moving some of my styling that had snuck into my HTML back into my CSS file but now I’m really reaching for stuff and this devlog is long enough anyway. Excited to continue working on this
Ships:
Gonna preface this by saying I completely forgot to format my last devlog (even though I know I usually don’t do too much formatting but I at least turn the header into an actual header) so it’s kinda just a big wall of text. So, I made a custom WebOS, I started out by following the guide before splitting off to do my own thing after I thought that I’d gotten everything that I thought I could get out of it. This OS is heavily based on Komi Can’t Communicate so you’ll see that theming throughout the entire project. I learned a lot about web development in this project, especially since I was doing something a lot different than what I usually am creating when working on websites so I gained a ton of ball knowledge about tiny little things and fixes that get your website working nice the way that you want it. I also gained a new appreciation for flexboxes, they are absolutely amazing and now I’m using them for almost anything, goodbye clearfixes. So finding those little bits of ball knowledge through debugging was pretty challenging but I’m proud of what I’ve been able to accomplish so far however I’m no where near finished and I really want to keep working on this project. There are many new features in this project that aren’t listed in the guide, I think the two most obvious ones are a music player and the ability to have infinite windows of the same app open at the same time. To test my project, go to the github repo or demo link directly and you’ll find it there. Thank you....
|
1793101945.1018026
|
1793188345.1018026
|
|
70058
|
screen recorder by @Aarjav_3 | Stardance
|
Aarjav_3
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T16:55:05Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made a very light screen recorder uses around 400mb ram 7% cpu and 0.2%GPU i made it a in jan 2026 the toughest part was to implement a feature in which u can record a specific window i was stuck a lot so i used copilot i hope its satisfacotry ty :)", "repo": "https://github.com/aarjavjain-in/screen-recorder", "demo": "https://drive.google.com/file/d/16EgH0iPuvEWaOY3XpwzCYKGLrS5cI19B/view?usp=sharing"}]...
|
[{"post_id": 80185, "ts": "202 [{"post_id": 80185, "ts": "2026-10-16T16:49:06Z", "hours": 1.2078, "text": "added a feature in which u can record a pirticular window"}]...
|
Title: screen recorder by @Aarjav_3 | Stardance
D Title: screen recorder by @Aarjav_3 | Stardance
Devlogs:
added a feature in which u can record a pirticular window
Ships:
i made a very light screen recorder uses around 400mb ram 7% cpu and 0.2%GPU i made it a in jan 2026 the toughest part was to implement a feature in which u can record a specific window i was stuck a lot so i used copilot i hope its satisfacotry ty :)...
|
1793048087.678893
|
1793134487.678893
|
|
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!...
|
1793090856.5435529
|
1793177256.5435529
|
|
70066
|
doomsday cyberdeck by @Adnancyberdeck | Stardance
|
Adnancyberdeck
|
0
|
0.78
|
0
|
[]
|
[{"post_id": 80206, "ts": "202 [{"post_id": 80206, "ts": "2026-10-16T18:50:07Z", "hours": 0.7836, "text": "doomsday inspired cyberdeck"}]...
|
Title: doomsday cyberdeck by @Adnancyberdeck | Sta Title: doomsday cyberdeck by @Adnancyberdeck | Stardance
Devlogs:
doomsday inspired cyberdeck...
|
1792958006.2333739
|
1793562806.2333739
|
|
41509
|
My simple macropad by @waffles888 | Stardance
|
waffles888
|
0
|
13.71
|
0
|
[]
|
[{"post_id": 80214, "ts": "202 [{"post_id": 80214, "ts": "2026-10-16T19:22:34Z", "hours": 0.4833, "text": "Devlog 5 - Encoder cover I spent a short while just making a nice cover for the encoder on the pad, didn’t take me ages now that I’ve gotten a bit better at fusion. I think I will have to model my own key caps because none still seem to fit."}, {"post_id": 80014, "ts": "2026-10-15T23:56:28Z", "hours": 6.6464, "text": "Devlog 4 - The Pad The parts for my kit finally came recently and I got some time to put it together. After a while of assembling I finally flashed my firmware and got it all working, its the first time I’ve ever really soldered stuff and in my opinion its came out great. However I have ran into some issues, I completely forgot to record my assembly in lapse, my PCB doesn’t even fit into my case and the cut out for the screen was too small. On top of this the switches were so close together I had to snip the ends off. I have gone back through and just sorted the cut out of the screen and added some nice curves around the edges to make it overall nicer. I think the next things I do before I ship will be making sure it fits in the case, making a knob for the encoder and maybe making some really small keycaps due to my mistake of putting the switches so close"}, {"post_id": 64732, "ts": "2026-09-09T11:15:19Z", "hours": 4.4458, "text": "Devlog 3 - The Case After completing the schematic and the PCB I moved onto designing the case. This took me a while as this was the first time I had try to model something. I looked between onshape and fusion however fusion ultimately seemed to be the best software to use. After getting a slight understanding of the tool I made the case and it come out very nice. Next is the actual software."}, {"post_id": 39139, "ts": "2026-08-01T21:02:56Z", "hours": 0.9333, "text": "Devlog 2 - The PCB I went back and adjusted the schematic and removed the status LED as I was out of pins on the Seedunio and needed one more for the button press of the rotary encoder. From there I moved on to making the PCB design. This was hard and took me a few attempts to get wired correctly running into different issue where the traces would overlap leading me to be unable to connect them to the Seedunio. I finally finished the PCB design by adding the final M3 mounting holes for the case."}, {"post_id": 38104, "ts": "2026-07-31T10:01:54Z", "hours": 1.2, "text": "Devlog 1 - The Schematic I started off my Hackpad today, this was designed around the Seeeduino. I decided I wanted 6 buttons, a rotary encoder, a little screen which I can utilise later and finally a little LED to be used as a status light to help understand what state the Hackpad is in. I spent about an hour making this schematic but most were spent in ensuring that the ERC would run correctly without any errors such as something stating its not connected while being connected. Finally, I finished the the schematic with a ERC with zero errors so next is the PCB layout. This was the first schematic I have ever made for a PCB so it definitely took longer that it maybe needed to"}]...
|
Title: My simple macropad by @waffles888 | Stardan Title: My simple macropad by @waffles888 | Stardance
Devlogs:
Devlog 1 - The Schematic I started off my Hackpad today, this was designed around the Seeeduino. I decided I wanted 6 buttons, a rotary encoder, a little screen which I can utilise later and finally a little LED to be used as a status light to help understand what state the Hackpad is in. I spent about an hour making this schematic but most were spent in ensuring that the ERC would run correctly without any errors such as something stating its not connected while being connected. Finally, I finished the the schematic with a ERC with zero errors so next is the PCB layout. This was the first schematic I have ever made for a PCB so it definitely took longer that it maybe needed to
Devlog 2 - The PCB I went back and adjusted the schematic and removed the status LED as I was out of pins on the Seedunio and needed one more for the button press of the rotary encoder. From there I moved on to making the PCB design. This was hard and took me a few attempts to get wired correctly running into different issue where the traces would overlap leading me to be unable to connect them to the Seedunio. I finally finished the PCB design by adding the final M3 mounting holes for the case.
Devlog 3 - The Case After completing the schematic and the PCB I moved onto designing the case. This took me a while as this was the first time I had try to model something. I looked between onshape and fusion however fusion ultimately seemed to be the best software to use. After getting a slight understanding of the tool I made the case and it come out very nice. Next is the actual software.
Devlog 4 - The Pad The parts for my kit finally came recently and I got some time to put it together. After a while of assembling I finally flashed my firmware and got it all working, its the first time I’ve ever really soldered stuff and in my opinion its came out great. However I have ran into some issues, I completely forgot to record my assembly in lapse, my PCB doesn’t even fit into my case and the cut out for the screen was too small. On top of this the switches were so close together I had to snip the ends off. I have gone back through and just sorted the cut out of the screen and added some nice curves around the edges to make it overall nicer. I think the next things I do before I ship will be making sure it fits in the case, making a knob for the encoder and maybe making some really small keycaps due to my mistake of putting the switches so close
Devlog 5 - Encoder cover I spent a short while just making a nice cover for the encoder on the pad, didn’t take me ages now that I’ve gotten a bit better at fusion. I think I will have to model my own key caps because none still seem to fit....
|
1792806837.168993
|
1793411637.168993
|
|
61371
|
combopad by @nathany100 | Stardance
|
nathany100
|
0
|
4.79
|
0
|
[]
|
[{"post_id": 80220, "ts": "202 [{"post_id": 80220, "ts": "2026-10-16T19:45:17Z", "hours": 0.4403, "text": "Devlog #5! (srry guys for the long wait T^T my computer broke and after i got a new one, i had loads of other ysws and forgot about this one) Ok so i finished the basic code for the macropad, uh thats it bye :>"}, {"post_id": 70794, "ts": "2026-09-19T19:38:32Z", "hours": 1.4508, "text": "Devlog #4! okok so this is probably going to be the last time im adding any components into the pcb because gah dayum rearranging and rewiring takes so long Stuff done: added oled screen rearranged layout of pcb to fit oled rewired pcb AGAIN >:( absolutely locked in on onshape modelling (even though it was freezing up every 5 seconds) (is it me or does it kinda look like a calculator )"}, {"post_id": 70591, "ts": "2026-09-19T12:31:59Z", "hours": 0.3439, "text": "Devlog #3 stuff done added rotary encoder wired schematics updated pcb (again)"}, {"post_id": 70584, "ts": "2026-09-19T12:08:32Z", "hours": 0.4753, "text": "Devlog #2 I basically proceeded to discard most of the stuff from the previous tutorial (since im making a 9-key macropad) but i made this keyboard matrix and a rewired pcb"}, {"post_id": 68525, "ts": "2026-09-15T08:19:06Z", "hours": 2.0806, "text": "Macropad Devlog #1! (Ok so i did a LOT of work in one day and completely forgot to devlog any of it, so ill spread out my progress over several logs.) Since this was my 1st time using KiCad, I followed the hackpad guide and familiarised myself with the software. Also ty to my friend @RishitJain for teaching me a lot of the stuff used in kicad"}]...
|
Title: combopad by @nathany100 | Stardance
Devlog Title: combopad by @nathany100 | Stardance
Devlogs:
Macropad Devlog #1! (Ok so i did a LOT of work in one day and completely forgot to devlog any of it, so ill spread out my progress over several logs.) Since this was my 1st time using KiCad, I followed the hackpad guide and familiarised myself with the software. Also ty to my friend @RishitJain for teaching me a lot of the stuff used in kicad
Devlog #2 I basically proceeded to discard most of the stuff from the previous tutorial (since im making a 9-key macropad) but i made this keyboard matrix and a rewired pcb
Devlog #3 stuff done added rotary encoder wired schematics updated pcb (again)
Devlog #4! okok so this is probably going to be the last time im adding any components into the pcb because gah dayum rearranging and rewiring takes so long Stuff done: added oled screen rearranged layout of pcb to fit oled rewired pcb AGAIN >:( absolutely locked in on onshape modelling (even though it was freezing up every 5 seconds) (is it me or does it kinda look like a calculator )
Devlog #5! (srry guys for the long wait T^T my computer broke and after i got a new one, i had loads of other ysws and forgot about this one) Ok so i finished the basic code for the macropad, uh thats it bye :>...
|
1793040571.6727066
|
1793645371.6727066
|
|
67753
|
Personal site V2 by @potipek | Stardance
|
potipek
|
2
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T20:00:36Z", "hours": 1.0, "multiplier": 1.18, "payout": 0, "blessing": "neutral", "text": "I added Zoho helpdesk for livechat and support (mainly for testing for upcoming website for Dragons World: Legacy) and also made an announcement that DSW is running natively on windows android and ios, it was not released yet tho, you can check the about me section if you want! byeeeee", "repo": "https://github.com/tomk1440-cmyk/personal-site-v2", "demo": "https://www.konopasek.dev"}, {"ship_num": 2, "ts": "2026-10-04T09:53:23Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My new vebsite has a new style, age counter, basic button and some text animations, multiple categories and much more! It is made to represent me! It has categories “about me” and “my hobbies” It covers a lot of things. I will read almost every feedback so i can know what to improve!", "repo": "https://github.com/tomk1440-cmyk/personal-site-v2", "demo": "https://www.konopasek.dev"}]...
|
[{"post_id": 80228, "ts": "202 [{"post_id": 80228, "ts": "2026-10-16T19:58:21Z", "hours": 0.6669, "text": "Zoho + Announcement, next is going to be progress report on Dragons World: Legacy"}, {"post_id": 76672, "ts": "2026-10-04T09:49:05Z", "hours": 2.6644, "text": "My personal website v2 ship! This website is an upgraded version of my personal site. it’s hosted via cloudflare pages under my domain konopasek.dev. I want to represent myself so that was why I made it! It has a counter that displays my age. Bye!"}]...
|
Title: Personal site V2 by @potipek | Stardance
D Title: Personal site V2 by @potipek | Stardance
Devlogs:
My personal website v2 ship! This website is an upgraded version of my personal site. it’s hosted via cloudflare pages under my domain konopasek.dev. I want to represent myself so that was why I made it! It has a counter that displays my age. Bye!
Zoho + Announcement, next is going to be progress report on Dragons World: Legacy
Ships:
My new vebsite has a new style, age counter, basic button and some text animations, multiple categories and much more! It is made to represent me! It has categories “about me” and “my hobbies” It covers a lot of things. I will read almost every feedback so i can know what to improve!
I added Zoho helpdesk for livechat and support (mainly for testing for upcoming website for Dragons World: Legacy) and also made an announcement that DSW is running natively on windows android and ios, it was not released yet tho, you can check the about me section if you want! byeeeee...
|
1793062272.487486
|
1793148672.487486
|
|
69493
|
Not-AnEngine by @Alaxtor | Stardance
|
Alaxtor
|
0
|
5.41
|
0
|
[]
|
[{"post_id": 80230, "ts": "202 [{"post_id": 80230, "ts": "2026-10-16T20:01:28Z", "hours": 0.9803, "text": "Need to add better walking animation and make it work then work on the levels before the 20th"}, {"post_id": 80085, "ts": "2026-10-16T05:51:48Z", "hours": 1.1594, "text": "AHhhhhhhh trying to turn left makes it turn right and truning right truns right"}, {"post_id": 79994, "ts": "2026-10-15T20:28:33Z", "hours": 1.6239, "text": "So made and finished up my character design and his movement in movement. so we have left trun, right turn,walk left, walk right and idle"}, {"post_id": 79705, "ts": "2026-10-15T04:01:43Z", "hours": 0.6122, "text": "Made turning right character for my game now need to make his walking animation.Took 30 mins 😭😭😭"}, {"post_id": 79401, "ts": "2026-10-13T20:19:47Z", "hours": 1.0358, "text": "SO created the firsst level but my 1 hour of time was logged ofr some reason ig have to use lapse form now on"}]...
|
Title: Not-AnEngine by @Alaxtor | Stardance
Devlo Title: Not-AnEngine by @Alaxtor | Stardance
Devlogs:
SO created the firsst level but my 1 hour of time was logged ofr some reason ig have to use lapse form now on
Made turning right character for my game now need to make his walking animation.Took 30 mins 😭😭😭
So made and finished up my character design and his movement in movement. so we have left trun, right turn,walk left, walk right and idle
AHhhhhhhh trying to turn left makes it turn right and truning right truns right
Need to add better walking animation and make it work then work on the levels before the 20th...
|
1792857050.4672391
|
1793461850.4672391
|
|
69900
|
My very own WebOS by @CookieePie | Stardance
|
CookieePie
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T20:17:17Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have Built this Web OS from Scratch with the Style of being simple and Cool", "repo": "https://github.com/Devrince/Personal-OS", "demo": "https://devrince.github.io/Personal-OS/"}]...
|
[{"post_id": 80232, "ts": "202 [{"post_id": 80232, "ts": "2026-10-16T20:02:15Z", "hours": 0.42, "text": "Done with CSS and Java !!!"}, {"post_id": 80211, "ts": "2026-10-16T19:14:01Z", "hours": 0.8664, "text": "code first part done!!"}, {"post_id": 80163, "ts": "2026-10-16T14:09:28Z", "hours": 0.5822, "text": "writing the code"}]...
|
Title: My very own WebOS by @CookieePie | Stardanc Title: My very own WebOS by @CookieePie | Stardance
Devlogs:
writing the code
code first part done!!
Done with CSS and Java !!!
Ships:
I have Built this Web OS from Scratch with the Style of being simple and Cool...
|
1793008476.4061985
|
1793094876.4061985
|
|
70082
|
Wifi analyzer by @Siyam | Stardance
|
Siyam
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T20:23:20Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Wifi-analyzer-in-python This is a python code that analyzes wifi connection and gives you a proper output to know how to get better speed. it shows you a proper graph instead just dbi numbers. It uses some blocks and many librarys to get better wifi signal. Here you can download it : Type in your terminal : pip install -i https://test.pypi.org/simple/ Wifi-Analyzer For run : python -m analyzer", "repo": "https://github.com/Tanzil-Alam/Wifi-analyzer-in-python", "demo": "https://test.pypi.org/project/Wifi-Analyzer/"}]...
|
[{"post_id": 80236, "ts": "202 [{"post_id": 80236, "ts": "2026-10-16T20:22:22Z", "hours": 0.9425, "text": "Finalized the code and published in TestPyPI and runned github workflow. everything is done at all. i will ship it now….."}, {"post_id": 80201, "ts": "2026-10-16T18:20:44Z", "hours": 1.1989, "text": "Made the simulated graph of the analyzer. Made in python code, (looks like cava)"}]...
|
Title: Wifi analyzer by @Siyam | Stardance
Devlog Title: Wifi analyzer by @Siyam | Stardance
Devlogs:
Made the simulated graph of the analyzer. Made in python code, (looks like cava)
Finalized the code and published in TestPyPI and runned github workflow. everything is done at all. i will ship it now…..
Ships:
Wifi-analyzer-in-python This is a python code that analyzes wifi connection and gives you a proper output to know how to get better speed. it shows you a proper graph instead just dbi numbers. It uses some blocks and many librarys to get better wifi signal. Here you can download it : Type in your terminal : pip install -i https://test.pypi.org/simple/ Wifi-Analyzer For run : python -m analyzer...
|
1793048123.9483604
|
1793134523.9483604
|
|
67724
|
DQM by @tanzeemrockz | Stardance
|
tanzeemrockz
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T20:30:25Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "DQM (Deterministic Query Model) A lightweight, trie-based lookup engine that traverses pre-built JSON “brains”. What is DQM? Instead of using power and resource-hungry, slow LLMs, We can now clear doubts using this lookup engine that walks through a pre-built “brain” ( .tqm format). Try it out: Official Page Overview Why does DQM exist? You may ask, why does DQM exist? The short answer is, accuracy and speed. I was tired of seeing people using AI for the most trivial things — “How hot is the sun? How deep is the sea?”, these are in fact very simple questions and there should’ve been a better alternative. Sure, search engines exist for a reason but many people have stopped using them and moved over to AI — Search engines themselves are starting to implement AI heavily into them. I was tired of it providing wrong answers and making-up stuff that are simply – not real. So now, we have DQM . Our guarantees We guarantee zero-hallucinations, fully predictable, and absolute offline capability. But any community-made brains are not guarenteed these qualities — as they will turn out to be the brain developers’ fault. How it works Step 1 — Normalisation : Lowercases, expands slang/contractions, removes repeated characters that serve no purpose, strips punctuation, and normalises delimiters. Step 2 — Trie Traversal : Splits the normalised queries into tokens and walks through the dictionary nodes. Step 3 — Resolution : Returns the string leaf, picks randomly if the leaf is an array, or throws clear status messages ( Path not found... or Incomplete query... ) The .tqm brain schema Nothing fancy, just good ole JSON Example: { \"brain_id\" : \"custom_core\" , \"version\" : \"1.0.0\" , \"author\" : \"John Doe\" , \"info\" : \"Rocket science, quantum physics, etc...\" , \"description\" : \"Custom brain for Rocket Science and Quantum Physics\" , \"licence\" : \"CC-BY-NC-SA-4.0\" , \"compatibility\" : \">=2.1.0\" , \"routes\" : { ... } } CLI Commands: Interactive brain selector on startup, cls/clear clears the screen, and exit/quit to quit.", "repo": "https://github.com/tanzeemrockz/DQM", "demo": "https://dqm.cyberslayercorpz.dev/"}]...
|
[{"post_id": 80238, "ts": "202 [{"post_id": 80238, "ts": "2026-10-16T20:26:19Z", "hours": 0.9581, "text": "Hey people! I just wrote the README and now, I’m ready to ship. Wish me luck!"}, {"post_id": 80196, "ts": "2026-10-16T17:37:07Z", "hours": 1.1003, "text": "GUYS! I just added a web-demo using python, js, and html using vercel beta python runtime! please do check it out at https://dqm.cyberslayercorpz.dev/"}, {"post_id": 79782, "ts": "2026-10-15T11:59:04Z", "hours": 1.2731, "text": "guys, i just built a web page (html + css + tailwind) for DQM it’s still in localhost but I’m deploying it in a bit (be sure to visit “dqm.cyberslayercorpz.dev”!)"}, {"post_id": 79327, "ts": "2026-10-13T15:20:11Z", "hours": 1.5156, "text": "heyya! I just added more features and bug-fixes. wanna see? :D Changelog (v2.1.0) Added support for external brains (brains to be placed inside /brains directory) Added standard metadata for every .tqm brain Added more aliases Improved the main.tqm brain Added a brain selector (runs on startup) Added a compatibility checker so newer brains don’t break inside an older engine Added a licence checker (cuz why not) Added a startup greeting function (not exactly but it greets you now) Fixed a few syntax issues and bugs I think that’s it! I’m looking forward to making this drastically better and maybe add a webUI or create a webpage so we’ll see! :D"}, {"post_id": 79083, "ts": "2026-10-12T16:21:36Z", "hours": 1.04, "text": "guys, i just fixed a few bugs now. wanna see what i did? :D Changelog (v2.0.1): Fixed punctuation engine in nodes.py Added more aliases Fixed a few things so each leaf has more than one response and use random.choice() to pick one Expanded main.tqm drastically (that was done in the last commit itself but i didn’t write a devlog lol) Resolved issue where if you were outside the project directory, the brain won’t load but now it will. Added more attention to detail and now it shows you info about the brain, etc… I guess that’s it! :D"}, {"post_id": 78331, "ts": "2026-10-10T13:54:28Z", "hours": 0.7672, "text": "guys so i just added a punctuation system that translates “who’s” to “who is” and so on and added a few responses to every tree so if you say “hi” first time it’ll give you a response and the next time, it’ll give you another response by importing random. I have also made the “brain” (main.tqm) HUGE with a LOT of data (the brain was written by gemini so shout out flash 3.8!) and that’s it for now!"}, {"post_id": 78110, "ts": "2026-10-09T16:16:38Z", "hours": 1.5, "text": "Sup folks! So this is the first devlog for this project. This is DQM otherwise known as Deterministic Query Model. So basically this is an old technique where you split a prompt into words and compare against a tree file (.tqm but it’s just a json file lol) and goes thru. E.g. “who is max verstappen” goes thru “who” > “is” > “max” > “verstappen” then finds the answer inside and tells you it. This is all hardcoded and you can change the stuff inside these so-called “brains”. This project is made in python (i’m a newbie and i’m learning along the way) and I used google gemini to write all the “brains” because it’s way too much work for my “potato brain” lol. So python was really sweet and looking forward to adding more features. Cya!"}]...
|
Title: DQM by @tanzeemrockz | Stardance
Devlogs:
Title: DQM by @tanzeemrockz | Stardance
Devlogs:
Sup folks! So this is the first devlog for this project. This is DQM otherwise known as Deterministic Query Model. So basically this is an old technique where you split a prompt into words and compare against a tree file (.tqm but it’s just a json file lol) and goes thru. E.g. “who is max verstappen” goes thru “who” > “is” > “max” > “verstappen” then finds the answer inside and tells you it. This is all hardcoded and you can change the stuff inside these so-called “brains”. This project is made in python (i’m a newbie and i’m learning along the way) and I used google gemini to write all the “brains” because it’s way too much work for my “potato brain” lol. So python was really sweet and looking forward to adding more features. Cya!
guys so i just added a punctuation system that translates “who’s” to “who is” and so on and added a few responses to every tree so if you say “hi” first time it’ll give you a response and the next time, it’ll give you another response by importing random. I have also made the “brain” (main.tqm) HUGE with a LOT of data (the brain was written by gemini so shout out flash 3.8!) and that’s it for now!
guys, i just fixed a few bugs now. wanna see what i did? :D Changelog (v2.0.1): Fixed punctuation engine in nodes.py Added more aliases Fixed a few things so each leaf has more than one response and use random.choice() to pick one Expanded main.tqm drastically (that was done in the last commit itself but i didn’t write a devlog lol) Resolved issue where if you were outside the project directory, the brain won’t load but now it will. Added more attention to detail and now it shows you info about the brain, etc… I guess that’s it! :D
heyya! I just added more features and bug-fixes. wanna see? :D Changelog (v2.1.0) Added support for external brains (brains to be placed inside /brains directory) Added standard metadata for every .tqm brain Added more aliases Improved the main.tqm brain Added a brain selector (runs on startup) Added a compatibility checker so newer brains don’t break inside an older engine Added a licence checker (cuz why not) Added a startup greeting function (not exactly but it greets you now) Fixed a few syntax issues and bugs I think that’s it! I’m looking forward to making this drastically better and maybe add a webUI or create a webpage so we’ll see! :D
guys, i just built a web page (html + css + tailwind) for DQM it’s still in localhost but I’m deploying it in a bit (be sure to visit “dqm.cyberslayercorpz.dev”!)
GUYS! I just added a web-demo using python, js, and html using vercel beta python runtime! please do check it out at https://dqm.cyberslayercorpz.dev/
Hey people! I just wrote the README and now, I’m ready to ship. Wish me luck!
Ships:
DQM (Deterministic Query Model) A lightweight, trie-based lookup engine that traverses pre-built JSON “brains”. What is DQM? Instead of using power and resource-hungry, slow LLMs, We can now clear doubts using this lookup engine that walks through a pre-built “brain” ( .tqm format). Try it out: Official Page Overview Why does DQM exist? You may ask, why does DQM exist? The short answer is, accuracy and speed. I was tired of seeing people using AI for the most trivial things — “How hot is the sun? How deep is the sea?”, these are in fact very simple questions and there should’ve been a better alternative. Sure, search engines exist for a reason but many people have stopped using them and moved over to AI — Search engines themselves are starting to implement AI heavily into them. I was tired of it providing wrong answers and making-up stuff that are simply – not real. So now, we have DQM . Our guarantees We guarantee zero-hallucinations, fully predictable, and absolute offline capability. But any community-made brains are not guarenteed these qualities — as they will turn out to be the brain developers’ fault. How it works Step 1 — Normalisation : Lowercases, expands slang/contractions, removes repeated characters that serve no purpose, strips punctuation, and normalises delimiters. Step 2 — Trie Traversal : Splits the normalised queries into tokens and walks through the dictionary nodes. Step 3 — Resolution : Returns the string leaf, picks randomly if the leaf is an array, or throws clear status messages ( Path not found... or Incomplete query... ) The .tqm brain schema Nothing fancy, just good ole JSON Example: { "brain_id" : "custom_core" , "version" : "1.0.0" , "author" : "John Doe" , "info" : "Rocket science, quantum physics, etc..." , "description" : "Custom brain for Rocket Science and Quantum Physics" , "licence" : "CC-BY-NC-SA-4.0" , "compatibility" : ">=2.1.0" , "routes" : { ... } } CLI Commands: Interactive brain selector on startup, cls/clear clears the screen, and exit/quit to quit....
|
1793008276.971629
|
1793094676.971629
|
|
70091
|
The Soft Space by @arushkalra52 | Stardance
|
arushkalra52
|
0
|
2.14
|
0
|
[]
|
[{"post_id": 80241, "ts": "202 [{"post_id": 80241, "ts": "2026-10-16T20:31:01Z", "hours": 2.1439, "text": "Built and launched The Soft Space official website"}]...
|
Title: The Soft Space by @arushkalra52 | Stardance Title: The Soft Space by @arushkalra52 | Stardance
Devlogs:
Built and launched The Soft Space official website...
|
1792958035.6403208
|
1793822035.6403208
|
|
70093
|
Typd by @Mehmet | Stardance
|
Mehmet
|
0
|
10.28
|
0
|
[]
|
[{"post_id": 80244, "ts": "202 [{"post_id": 80244, "ts": "2026-10-16T21:01:27Z", "hours": 10.2758, "text": "I’m building Typd: a local dictation app. You hold a key, talk, and finished, formatted text appears wherever your cursor is. It runs entirely on your computer in under 2 GB of VRAM or unified memory, works offline, and it’s free. Why: today’s best dictation apps need the internet, send your voice to the cloud, and ask you to trust whoever’s on the other end with it. And they’re genuinely great. Wispr Flow takes the messy things you say out loud and turns them into clear, well-formatted text. I wanted that without the cloud. My first attempt was a basic Wispr Flow clone. NVIDIA’s Parakeet (a 0.6B speech model) transcribed locally, then a free cloud API cleaned up the text: removing fillers, fixing structure. Only half of it was local. The transcript still left my machine, and everything depended on my connection. Running the cleanup LLM locally didn’t work either: it needed more VRAM than my laptop had, spilled into RAM, and got slow. Then I asked: why do dictation apps use two models at all? Every one that explains how it works, Wispr Flow included, describes the same pipeline: a speech recogniser, then a fine-tuned LLM that removes the “um”s, works out what you meant and writes it properly. My guess is that it’s just history. Good speech models and good LLMs both already existed, so apps glued them together. From first principles, though, the job is simple: audio goes in, finished text comes out. A second model only adds latency, memory and failure points. So why not one model that hears you and writes the final text directly? That’s Typd. I took an open speech model (Qwen3-ASR) and trained it so it doesn’t just transcribe, it writes: fillers and false starts gone, self-corrections resolved, lists and paragraphs where they belong. All the training so far ran on free GPUs. In blind tests on 66 of my own real dictations (judged by AI judges that didn’t know which app wrote what), Typd was preferred over Wispr Flow 27 times to 12, with 27 ties. It returns text about 0.4 s after I stop talking. What I’m working on next: structuring long, rambling speech better, and never losing something you said when you correct yourself mid-sentence. The hard part is that big LLMs are good at this because they know so much. A model that can explain anything from the height of the Eiffel Tower to photon spectra can work out what you meant. It’s like having a professor help you write a letter. But you can’t run a professor on a laptop. So Typd teaches a small model just that one skill, distilling what big models do for dictation into something that uses a sliver of your computer. Typd runs on Windows and macOS, 100% private, no internet needed. It comes in two sizes: a 1.7B-parameter version (about 2 GB) for machines that can spare it, and a lighter 0.6B version (under 1 GB) for everything else."}]...
|
Title: Typd by @Mehmet | Stardance
Devlogs:
I’m b Title: Typd by @Mehmet | Stardance
Devlogs:
I’m building Typd: a local dictation app. You hold a key, talk, and finished, formatted text appears wherever your cursor is. It runs entirely on your computer in under 2 GB of VRAM or unified memory, works offline, and it’s free. Why: today’s best dictation apps need the internet, send your voice to the cloud, and ask you to trust whoever’s on the other end with it. And they’re genuinely great. Wispr Flow takes the messy things you say out loud and turns them into clear, well-formatted text. I wanted that without the cloud. My first attempt was a basic Wispr Flow clone. NVIDIA’s Parakeet (a 0.6B speech model) transcribed locally, then a free cloud API cleaned up the text: removing fillers, fixing structure. Only half of it was local. The transcript still left my machine, and everything depended on my connection. Running the cleanup LLM locally didn’t work either: it needed more VRAM than my laptop had, spilled into RAM, and got slow. Then I asked: why do dictation apps use two models at all? Every one that explains how it works, Wispr Flow included, describes the same pipeline: a speech recogniser, then a fine-tuned LLM that removes the “um”s, works out what you meant and writes it properly. My guess is that it’s just history. Good speech models and good LLMs both already existed, so apps glued them together. From first principles, though, the job is simple: audio goes in, finished text comes out. A second model only adds latency, memory and failure points. So why not one model that hears you and writes the final text directly? That’s Typd. I took an open speech model (Qwen3-ASR) and trained it so it doesn’t just transcribe, it writes: fillers and false starts gone, self-corrections resolved, lists and paragraphs where they belong. All the training so far ran on free GPUs. In blind tests on 66 of my own real dictations (judged by AI judges that didn’t know which app wrote what), Typd was preferred over Wispr Flow 27 times to 12, with 27 ties. It returns text about 0.4 s after I stop talking. What I’m working on next: structuring long, rambling speech better, and never losing something you said when you correct yourself mid-sentence. The hard part is that big LLMs are good at this because they know so much. A model that can explain anything from the height of the Eiffel Tower to photon spectra can work out what you meant. It’s like having a professor help you write a letter. But you can’t run a professor on a laptop. So Typd teaches a small model just that one skill, distilling what big models do for dictation into something that uses a sliver of your computer. Typd runs on Windows and macOS, 100% private, no internet needed. It comes in two sizes: a 1.7B-parameter version (about 2 GB) for machines that can spare it, and a lighter 0.6B version (under 1 GB) for everything else....
|
1792958037.2917237
|
1793562837.2917237
|
|
70105
|
Untitled project by @penguinissus | Stardance
|
penguinissus
|
0
|
2.06
|
0
|
[]
|
[{"post_id": 80251, "ts": "202 [{"post_id": 80251, "ts": "2026-10-16T22:12:26Z", "hours": 2.0625, "text": "I just want to snoop around the shop I don’t have anything to submit"}]...
|
Title: Untitled project by @penguinissus | Stardan Title: Untitled project by @penguinissus | Stardance
Devlogs:
I just want to snoop around the shop I don’t have anything to submit...
|
1792958049.0798318
|
1793562849.0798318
|
|
131
|
WasFlash - A Flashplayer Implimentation in C++/Web WasFlash - A Flashplayer Implimentation in C++/Web by @Silverhoft | Stardance...
|
Silverhoft
|
0
|
61.13
|
0
|
[]
|
[{"post_id": 80252, "ts": "202 [{"post_id": 80252, "ts": "2026-10-16T22:41:11Z", "hours": 9.8989, "text": "WasFlash Devlog # 11.5 Alpha 3.1- Pre Release 4.5 Progress Update: ~ Sprite Parsing and preprocessing done for rendering functionality ~ Currently working on the implementation and actual rendering now… Notes: This serves as a midway point in a more extensive development stage - A real devlog will be posted soon, at a better stopping point."}, {"post_id": 76182, "ts": "2026-10-02T16:45:00Z", "hours": 6.0339, "text": "WasFlash Devlog # 11 Alpha 3.1- Pre Release 4 What I worked on today: ~ Started Work on sprite implementation. Notes: Hello everyone, it’s been quite a while, sorry about that. I am currently working on implementing sprites; it’s a lot of work and more difficult than anything else I’ve done for this project. I’m not sure if they will be done by the end of this, so I plan to ship this now, and possibly release another ship if I can finish it. I am very busy with my school’s performance of Les Mis; that is why this is a bit sparse. I appreciate your patience and hopefully we will have fully working sprites by the end of october. Agenda: - Work on sprite implimentation Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 36721, "ts": "2026-07-28T23:21:34Z", "hours": 1.88, "text": "WasFlash Devlog # 11 Alpha 3.1- Pre Release 3 What I worked on today: ~ DefineBitsLossless2 32Bit + 8Bit ARGB Support ~ Implimented Actual Alpha Pixel Rasterization Notes: Hello friends! I finally finished implementing Bitmaps, and I am very excited to port to WASM, and release the bitmaps release. I am planning on working on fonts and text next, and doing whatever else sprites will require. After which I will work on sprite animation, and a far more polished UI, as well as an official linux release. I have decided to name the first official release(And ship), Alpha 4.0 Anim. I feel that this represents the fact that adding sprites will make this a fully funtional flash animation player. After this, I plan to finish tag support, and try to work on some simple ActionScript, to get buttons and other simple functions working. And the end goal would involve a fully functional ActionScript Engine, and a fully implimented Flash Player replacement. Anyways, I hope you all have a good day, see you all next time! Agenda: - Impliment DefineBitsLossless2 Whats Next: - Create actual autobuild script for both WASM and Native Linux - Font Support + Other small sprite prerequisites - Sprite Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More Note: Image with brighter colors is 8Bit, and the one with the more nuanced colors is 32Bit"}, {"post_id": 34999, "ts": "2026-07-26T04:38:40Z", "hours": 9.8161, "text": "WasFlash Devlog # 10 Alpha 3.1- Pre Release 2 What I worked on today: - Implimented the following: ~ DefineBits2 + Corresponding Bug testing Files ~ DefineBits 3+4 + Corresponding Bug testing Files ~ DefineBitsLossless + Corresponding Bug testing Files, and custom image assemblers for speed. ~ Changed Zlib to Wuffs for much faster decomp times. Notes: Hello Friends, it’s been a while, and I really try to avoid 10 hour devlogs, but I really wanted a good real world testable result for bitmaps before I made one. The main reason being that next on the list is sprites, which will complete the animation stage of this project. Leading us to Alpha 4.0. Now I wanted to take the time to name each coming stage, as each one will be long, yet monumental. I am nearly done with bitmaps, and soon enough, I will be working on the grueling task of implementing the sprites. I think so far the most difficult task was shapes, because it required a very deep understanding of the SWF shape system, but sprites might be a close second. I really appreciate you guys’ support, even though there aren’t too many of you. I love this project, and I am so happy I get to express it here. Agenda: - Impliment DefineBitsLossless2 Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - In Progress - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 11762, "ts": "2026-06-19T04:34:27Z", "hours": 6.3311, "text": "WasFlash Devlog # 9 Alpha 3.1- Pre Release 1 What I worked on today: - Implimented DefineBits - Parsing and rendering ~ Updated Dependency Script to include libJPEGTurbo ~ Created 2 test SWF files using jpexs ~ Fixed major shape disappearing issue Notes: Hello Friends! I spent quite a bit of time on this, both parsing and processing bitmaps. So far we only have one working bitmap parser of 6, and that is the most bare bones one. There are some weird errors that can occur with the JPEG headers, but it is impossible to find SWF files with DefineBits, so I made my own, one without the error, and one with it. It currently works for both, which is great, and I am excited to see where I can take this project. I am so close to being ready for Sprite support. I just need to keep pushing through these tags. Thank you to anyone who’s been keeping up with this, for others, feel free to follow if you think this is cool. See you guys next time! Agenda: - Implement the other 5 DefineBits Types - Get EMScripten libJPEGTurbo Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - In Progress - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 9165, "ts": "2026-06-15T11:00:10Z", "hours": 0.8281, "text": "WasFlash Devlog # 8 Alpha 3.0 What I accomplished today: - MAJOR UPDATE! – NEW RELEASE – MAJOR UPDATE! - Fixed Morph Shape issues - Fixed wrong MorphShape Order - Fixed the Matrix Signing Error - This has been causing the shape warping - Optimized Rendering Packets - Updated Web Implementation Notes: Hello friends, My most recent Devlog may have reflected some distress, but I finally figured it out! The weird warping of shapes was caused by a bug in a script I wrote about 5 months ago, that I thought was solid. There was a signing error, so all numbers ended up unproportionately large if they were negative, because the first bit was being counted towards the value. With a quick change of 2 lines, it completely changed the look of animations. As for the color bug with morph shapes, there is no bug at all, in fact the morph shapes typically are used as templates for sprites. So if you see any odd colored shapes, that’s why :D. Lastly, for some reason morph shapes are interpolated in reverse when using Skia, so I simply reversed the inputs, and the morph shapes are working as intended. The final thing was updating the main tag processor to send render instructions in batches, not one at a time, as to reduce overhead. This is a tough project, and I have poured my soul into it, if you think it’s cool, please feel free to follow it! Anyways, see you guys next time! Whats Next: - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 9093, "ts": "2026-06-15T06:09:44Z", "hours": 6.4083, "text": "WasFlash Devlog # 7 Alpha 3.0 - Pre Release 3 What I worked on today: - Implimented DefineMorphShape’s - Still not fully working ~ Implemented MorphFillStyle Translator ~ Implemented MorphLineStyle Translator - 1 and 2 ~ Implemented MorphGradient Translator ~ Implemented DefineMorphShape to Shape Builder * ~ Fixed parsers to work with builders Notes: Hello friends, I did a lot of work in this long extended session! I decided that it would make sense to just convert the morph variants to the normal variants, and use my current framework to just build 2 shapes, and interpolate them. There were a lot of issues, because there are some odd SWF bugs that happen sometimes, and I thought they were my own errors, so I spent like 2 hours trying to get things working, and I just ended up putting in some fall back code, and got things working, but now there are some weird color bugs, so I need to work those out, but overall it seems to be working ok. It’s been a rough week, so I hope it gets a little easier(It’s not gonna be with sprites, but it is what it is). Anyways, thank you guys for following along, for anyone else coming across this, feel free to like this comment, and follow the project if you think it’s cool. See you guys next time! Agenda: - Fix odd color issues with morph shapes - Clean up parsing output - Update the website to use new update Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 6741, "ts": "2026-06-11T09:07:58Z", "hours": 5.9478, "text": "WasFlash Devlog # 6 Alpha 3.0 - Pre Release 2 What I worked on today: - Implemented Full DefineMorphShape Parsing - Currently not fully working ~ Implemented MorphFillStyle Parsing ~ Implemented MorphLineStyle Parsing - 1 and 2 ~ Implemented MorphGradient Parsing ~ Implemented SHAPE Struct Parsing ~ Implemented DefineMorphShape Parsing ~ Implemented DefineMorphShape2 Parsing Notes: Hello friends, as you can see, this Devlog is pretty long. This took around twice as long as ordinary Shape Styles, seen in DefineShape tags. This is because each DefineMorphShape tag contains a pair of each type of data for interpolation, rather than one set. For the most part this was just pretty tedious low level Bitmath operations, and a lot of nested structures. It wasn’t too bad, because I had a good reference from the original DefineShape structures, and just general experience, but yes, it was very tedious, and likely the least fun part of this process. Hopefully my next Devlog has a better timeframe, and parsing is working! Thank you all for stopping by, as always, please feel free to leave a comment with any questions you might have, or just feedback in general, as well as following and liking this post! See you all later! Agenda: - Get Parsing to a Functional State - Create a processor for Morph Shapes - Add rendering case for Morph Shapes Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 4777, "ts": "2026-06-08T08:29:50Z", "hours": 2.455, "text": "WasFlash Devlog # 5 Alpha 3.0 - Pre Release 1 What I worked on today: - Started Development Of DefineMorphShape tags ~ Created new SHAPE base structure ~ Set up all required structures for DefineMorphShape ~ Added DefineMorphShape to tags.h Notes: Hello friends, you may have noticed a different version type, “Pre Release”. This is simply an indication that this is not an official change, and is not implemented into the project. Pre Release Devlogs should tend to reflect 1-2 big changes, with a large majority of the content nested inside, as shown above. This Devlog serves to both announce the beginning of Morph Shape Development, and represent what to expect from Pre Releases. As a quick note to the fact that Morph Shapes were not even on the To Do list, I recently discovered that Morph Shapes were just as important as Sprites, when properly rendering animations. Anyways, though this one was short, thank you for stopping by, and feel free to check out my project, follow it, and like this post if you think it’s cool! See you all next time! Agenda: - Work on parsing for Morph Shapes - Create a processor for Morph Shapes - Add rendering case for Morph Shapes Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 2111, "ts": "2026-06-04T13:16:26Z", "hours": 1.9697, "text": "WasFlash Devlog # 4 Alpha 2.2.1 What I accomplished today: - Added even more optimizations to the shape processing - Implemented DefineShape4 support - Pushed Updates to Web - Updated Skia Git Clone - To prevent the deadly stack trace issue Notes: Hello friends, this session was very exciting! I was able to get DefineShape4 Shapes to render properly, and although it was a pain it looks really good! I had to kinda rework the processor a little bit, because DefineShape4 adds a few flags, but I already added LineStyles2 support, so it implemented well. I also got rid of the redundant line/fill storage, which was a small optimization, but still mostly noticeable. To end off the session, I changed the Skia commit hash, so we won’t need to deal with outdated headers. Whats Next: - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 1022, "ts": "2026-06-02T20:18:24Z", "hours": 1.4325, "text": "WasFlash Devlog # 3 Alpha 2.1.4 What I accomplished today: - Fixed scaling of canvas on website - Added anti-aliasing to smooth out animations on both web and native builds - Pushed web compiler flags to main build - Made Cinnamon Rolls Notes: Hello friends! I spent a lot of time trying to figure this one out, many hours were spent debugging this session. Originally the website was just plugging the file into the WASM binary, and re-scaling to output to make the output match the canvas size, but this would cause blurriness and distorted quality. The good thing about this is, because we actually have to build each shape, we can just tell Skia to draw the shapes bigger, so the scaling still produces a native shape, just with different dimensions. So I had to rework the way the scaling worked. I also added back anti-aliasing, because the optimizations worked so well, that we can run anti-aliased’ output at full speed! There wasn’t too much going on this time around. but it really made a big difference! Thank you all for being here, I really appreciate it! Please feel free to leave a comment, with any questions or feedback, and like this post if you think it’s cool, and follow the project, if you think it’s cool! Have a good day everyone! PS. The cinnamon rolls were yummy! Whats Next: - Adding DefineShape4 support + Port DefineShape4 to WebAssembly - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 400, "ts": "2026-06-01T19:45:39Z", "hours": 2.1522, "text": "WasFlash Devlog # 2 Alpha 2.1.3 What I accomplished today: - Added major optimizations to WebAssembly compilation - Revamped WasFlash official color scheme - Using the Catppuccin color scheme - Fixed some bugs with buttons + Added functionality to a few buttons - Updated logo with new color scheme Notes: Hello friends! I made some big differences to the look of the website, with a new logo, completely different color palette, and the general feel of the website. My original idea for WasFlash was a kind of cyberpunk theme, I spent countless hours adding little glowing effects, and these moving gradients, but I couldn’t shake the awkward feeling of it all. A flash emulator is old software, but it is by no means is it retro. I decided it was time to finally change it up, and I am so happy I did, because the website feels much cleaner, and well implemented. While pink and blue are my favorite gradient palette, cyan and green are a close second, and worked perfectly for this. Overall the website is much nicer on the eyes, and generally better to use! Finally I updated the popup to mention Stardance instead of Flavortown. Thank you for joining me today! Please feel free to leave a comment with what you think below, and like the project if you think it’s cool! Anyways, that’s all from me today, see you guys around! Whats Next: - Adding DefineShape4 support + Port DefineShape4 to WebAssembly - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More Images"}, {"post_id": 191, "ts": "2026-06-01T07:02:35Z", "hours": 5.6261, "text": "WasFlash Devlog # 1 What I accomplished today: Debugging deadly stack trace error - Ended up being outdated headers from Skia Updating Skia headers to modern version Re-Added gradient shape fill support Added heavy optimizations for all locally built dependencies, for native Linux builds - Removes latency entirely Cleaned up loose files Notes: Hello friends, today was a little bit of a drag, given the fact that I just could not figure out what was causing this nonstop stack trace. I finally looked into Skia, and realized my headers were out of date with the actual program, so I had to update those, ultimately fixing the program entirely. I also took some time to add optimization, so much so, that there is now zero latency in both audible, and visual playback. Overall, this was a productive session, even though it took ages. Whats Next: Porting current version to WebAssembly - With similar optimizations Adding DefineShape4 support + Port DefineShape4 to WebAssembly Update Wasflash Website with new Catppuccin color palette Create actual autobuild script for both WASM and Native Linux - Some time in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More"}, {"post_id": 7, "ts": "2026-05-31T07:11:48Z", "hours": 0.3519, "text": "WasFlash has Officially Re-Started Development!"}]...
|
Title: WasFlash - A Flashplayer Implimentation in Title: WasFlash - A Flashplayer Implimentation in C++/Web by @Silverhoft | Stardance
Devlogs:
WasFlash has Officially Re-Started Development!
WasFlash Devlog # 1 What I accomplished today: Debugging deadly stack trace error - Ended up being outdated headers from Skia Updating Skia headers to modern version Re-Added gradient shape fill support Added heavy optimizations for all locally built dependencies, for native Linux builds - Removes latency entirely Cleaned up loose files Notes: Hello friends, today was a little bit of a drag, given the fact that I just could not figure out what was causing this nonstop stack trace. I finally looked into Skia, and realized my headers were out of date with the actual program, so I had to update those, ultimately fixing the program entirely. I also took some time to add optimization, so much so, that there is now zero latency in both audible, and visual playback. Overall, this was a productive session, even though it took ages. Whats Next: Porting current version to WebAssembly - With similar optimizations Adding DefineShape4 support + Port DefineShape4 to WebAssembly Update Wasflash Website with new Catppuccin color palette Create actual autobuild script for both WASM and Native Linux - Some time in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 2 Alpha 2.1.3 What I accomplished today: - Added major optimizations to WebAssembly compilation - Revamped WasFlash official color scheme - Using the Catppuccin color scheme - Fixed some bugs with buttons + Added functionality to a few buttons - Updated logo with new color scheme Notes: Hello friends! I made some big differences to the look of the website, with a new logo, completely different color palette, and the general feel of the website. My original idea for WasFlash was a kind of cyberpunk theme, I spent countless hours adding little glowing effects, and these moving gradients, but I couldn’t shake the awkward feeling of it all. A flash emulator is old software, but it is by no means is it retro. I decided it was time to finally change it up, and I am so happy I did, because the website feels much cleaner, and well implemented. While pink and blue are my favorite gradient palette, cyan and green are a close second, and worked perfectly for this. Overall the website is much nicer on the eyes, and generally better to use! Finally I updated the popup to mention Stardance instead of Flavortown. Thank you for joining me today! Please feel free to leave a comment with what you think below, and like the project if you think it’s cool! Anyways, that’s all from me today, see you guys around! Whats Next: - Adding DefineShape4 support + Port DefineShape4 to WebAssembly - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More Images
WasFlash Devlog # 3 Alpha 2.1.4 What I accomplished today: - Fixed scaling of canvas on website - Added anti-aliasing to smooth out animations on both web and native builds - Pushed web compiler flags to main build - Made Cinnamon Rolls Notes: Hello friends! I spent a lot of time trying to figure this one out, many hours were spent debugging this session. Originally the website was just plugging the file into the WASM binary, and re-scaling to output to make the output match the canvas size, but this would cause blurriness and distorted quality. The good thing about this is, because we actually have to build each shape, we can just tell Skia to draw the shapes bigger, so the scaling still produces a native shape, just with different dimensions. So I had to rework the way the scaling worked. I also added back anti-aliasing, because the optimizations worked so well, that we can run anti-aliased’ output at full speed! There wasn’t too much going on this time around. but it really made a big difference! Thank you all for being here, I really appreciate it! Please feel free to leave a comment, with any questions or feedback, and like this post if you think it’s cool, and follow the project, if you think it’s cool! Have a good day everyone! PS. The cinnamon rolls were yummy! Whats Next: - Adding DefineShape4 support + Port DefineShape4 to WebAssembly - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 4 Alpha 2.2.1 What I accomplished today: - Added even more optimizations to the shape processing - Implemented DefineShape4 support - Pushed Updates to Web - Updated Skia Git Clone - To prevent the deadly stack trace issue Notes: Hello friends, this session was very exciting! I was able to get DefineShape4 Shapes to render properly, and although it was a pain it looks really good! I had to kinda rework the processor a little bit, because DefineShape4 adds a few flags, but I already added LineStyles2 support, so it implemented well. I also got rid of the redundant line/fill storage, which was a small optimization, but still mostly noticeable. To end off the session, I changed the Skia commit hash, so we won’t need to deal with outdated headers. Whats Next: - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 5 Alpha 3.0 - Pre Release 1 What I worked on today: - Started Development Of DefineMorphShape tags ~ Created new SHAPE base structure ~ Set up all required structures for DefineMorphShape ~ Added DefineMorphShape to tags.h Notes: Hello friends, you may have noticed a different version type, “Pre Release”. This is simply an indication that this is not an official change, and is not implemented into the project. Pre Release Devlogs should tend to reflect 1-2 big changes, with a large majority of the content nested inside, as shown above. This Devlog serves to both announce the beginning of Morph Shape Development, and represent what to expect from Pre Releases. As a quick note to the fact that Morph Shapes were not even on the To Do list, I recently discovered that Morph Shapes were just as important as Sprites, when properly rendering animations. Anyways, though this one was short, thank you for stopping by, and feel free to check out my project, follow it, and like this post if you think it’s cool! See you all next time! Agenda: - Work on parsing for Morph Shapes - Create a processor for Morph Shapes - Add rendering case for Morph Shapes Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 6 Alpha 3.0 - Pre Release 2 What I worked on today: - Implemented Full DefineMorphShape Parsing - Currently not fully working ~ Implemented MorphFillStyle Parsing ~ Implemented MorphLineStyle Parsing - 1 and 2 ~ Implemented MorphGradient Parsing ~ Implemented SHAPE Struct Parsing ~ Implemented DefineMorphShape Parsing ~ Implemented DefineMorphShape2 Parsing Notes: Hello friends, as you can see, this Devlog is pretty long. This took around twice as long as ordinary Shape Styles, seen in DefineShape tags. This is because each DefineMorphShape tag contains a pair of each type of data for interpolation, rather than one set. For the most part this was just pretty tedious low level Bitmath operations, and a lot of nested structures. It wasn’t too bad, because I had a good reference from the original DefineShape structures, and just general experience, but yes, it was very tedious, and likely the least fun part of this process. Hopefully my next Devlog has a better timeframe, and parsing is working! Thank you all for stopping by, as always, please feel free to leave a comment with any questions you might have, or just feedback in general, as well as following and liking this post! See you all later! Agenda: - Get Parsing to a Functional State - Create a processor for Morph Shapes - Add rendering case for Morph Shapes Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 7 Alpha 3.0 - Pre Release 3 What I worked on today: - Implimented DefineMorphShape’s - Still not fully working ~ Implemented MorphFillStyle Translator ~ Implemented MorphLineStyle Translator - 1 and 2 ~ Implemented MorphGradient Translator ~ Implemented DefineMorphShape to Shape Builder * ~ Fixed parsers to work with builders Notes: Hello friends, I did a lot of work in this long extended session! I decided that it would make sense to just convert the morph variants to the normal variants, and use my current framework to just build 2 shapes, and interpolate them. There were a lot of issues, because there are some odd SWF bugs that happen sometimes, and I thought they were my own errors, so I spent like 2 hours trying to get things working, and I just ended up putting in some fall back code, and got things working, but now there are some weird color bugs, so I need to work those out, but overall it seems to be working ok. It’s been a rough week, so I hope it gets a little easier(It’s not gonna be with sprites, but it is what it is). Anyways, thank you guys for following along, for anyone else coming across this, feel free to like this comment, and follow the project if you think it’s cool. See you guys next time! Agenda: - Fix odd color issues with morph shapes - Clean up parsing output - Update the website to use new update Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 8 Alpha 3.0 What I accomplished today: - MAJOR UPDATE! – NEW RELEASE – MAJOR UPDATE! - Fixed Morph Shape issues - Fixed wrong MorphShape Order - Fixed the Matrix Signing Error - This has been causing the shape warping - Optimized Rendering Packets - Updated Web Implementation Notes: Hello friends, My most recent Devlog may have reflected some distress, but I finally figured it out! The weird warping of shapes was caused by a bug in a script I wrote about 5 months ago, that I thought was solid. There was a signing error, so all numbers ended up unproportionately large if they were negative, because the first bit was being counted towards the value. With a quick change of 2 lines, it completely changed the look of animations. As for the color bug with morph shapes, there is no bug at all, in fact the morph shapes typically are used as templates for sprites. So if you see any odd colored shapes, that’s why :D. Lastly, for some reason morph shapes are interpolated in reverse when using Skia, so I simply reversed the inputs, and the morph shapes are working as intended. The final thing was updating the main tag processor to send render instructions in batches, not one at a time, as to reduce overhead. This is a tough project, and I have poured my soul into it, if you think it’s cool, please feel free to follow it! Anyways, see you guys next time! Whats Next: - Create actual autobuild script for both WASM and Native Linux - Some time a little less in the future… - Adding Sprite Support - Will take a very long time - Adding Bitmap Support - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 9 Alpha 3.1- Pre Release 1 What I worked on today: - Implimented DefineBits - Parsing and rendering ~ Updated Dependency Script to include libJPEGTurbo ~ Created 2 test SWF files using jpexs ~ Fixed major shape disappearing issue Notes: Hello Friends! I spent quite a bit of time on this, both parsing and processing bitmaps. So far we only have one working bitmap parser of 6, and that is the most bare bones one. There are some weird errors that can occur with the JPEG headers, but it is impossible to find SWF files with DefineBits, so I made my own, one without the error, and one with it. It currently works for both, which is great, and I am excited to see where I can take this project. I am so close to being ready for Sprite support. I just need to keep pushing through these tags. Thank you to anyone who’s been keeping up with this, for others, feel free to follow if you think this is cool. See you guys next time! Agenda: - Implement the other 5 DefineBits Types - Get EMScripten libJPEGTurbo Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - In Progress - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 10 Alpha 3.1- Pre Release 2 What I worked on today: - Implimented the following: ~ DefineBits2 + Corresponding Bug testing Files ~ DefineBits 3+4 + Corresponding Bug testing Files ~ DefineBitsLossless + Corresponding Bug testing Files, and custom image assemblers for speed. ~ Changed Zlib to Wuffs for much faster decomp times. Notes: Hello Friends, it’s been a while, and I really try to avoid 10 hour devlogs, but I really wanted a good real world testable result for bitmaps before I made one. The main reason being that next on the list is sprites, which will complete the animation stage of this project. Leading us to Alpha 4.0. Now I wanted to take the time to name each coming stage, as each one will be long, yet monumental. I am nearly done with bitmaps, and soon enough, I will be working on the grueling task of implementing the sprites. I think so far the most difficult task was shapes, because it required a very deep understanding of the SWF shape system, but sprites might be a close second. I really appreciate you guys’ support, even though there aren’t too many of you. I love this project, and I am so happy I get to express it here. Agenda: - Impliment DefineBitsLossless2 Whats Next: - Create actual autobuild script for both WASM and Native Linux - Adding Sprite Support - Adding Bitmap Support - In Progress - Adding Jpeg + Font Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 11 Alpha 3.1- Pre Release 3 What I worked on today: ~ DefineBitsLossless2 32Bit + 8Bit ARGB Support ~ Implimented Actual Alpha Pixel Rasterization Notes: Hello friends! I finally finished implementing Bitmaps, and I am very excited to port to WASM, and release the bitmaps release. I am planning on working on fonts and text next, and doing whatever else sprites will require. After which I will work on sprite animation, and a far more polished UI, as well as an official linux release. I have decided to name the first official release(And ship), Alpha 4.0 Anim. I feel that this represents the fact that adding sprites will make this a fully funtional flash animation player. After this, I plan to finish tag support, and try to work on some simple ActionScript, to get buttons and other simple functions working. And the end goal would involve a fully functional ActionScript Engine, and a fully implimented Flash Player replacement. Anyways, I hope you all have a good day, see you all next time! Agenda: - Impliment DefineBitsLossless2 Whats Next: - Create actual autobuild script for both WASM and Native Linux - Font Support + Other small sprite prerequisites - Sprite Support - Add a GUI to Native Linux Build - Finally Release for Native Linux Builds - Port for Windows and MacOS - Work on more tags in the future… Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More Note: Image with brighter colors is 8Bit, and the one with the more nuanced colors is 32Bit
WasFlash Devlog # 11 Alpha 3.1- Pre Release 4 What I worked on today: ~ Started Work on sprite implementation. Notes: Hello everyone, it’s been quite a while, sorry about that. I am currently working on implementing sprites; it’s a lot of work and more difficult than anything else I’ve done for this project. I’m not sure if they will be done by the end of this, so I plan to ship this now, and possibly release another ship if I can finish it. I am very busy with my school’s performance of Les Mis; that is why this is a bit sparse. I appreciate your patience and hopefully we will have fully working sprites by the end of october. Agenda: - Work on sprite implimentation Resources: If you are completely lost, here is a good place to learn a little more about what I’m doing: Learn More
WasFlash Devlog # 11.5 Alpha 3.1- Pre Release 4.5 Progress Update: ~ Sprite Parsing and preprocessing done for rendering functionality ~ Currently working on the implementation and actual rendering now… Notes: This serves as a midway point in a more extensive development stage - A real devlog will be posted soon, at a better stopping point....
|
1792511316.1022744
|
1793116116.1022744
|
|
47079
|
agribot by @malek_sameh61 | Stardance
|
malek_sameh61
|
0
|
38.04
|
0
|
[]
|
[{"post_id": 80254, "ts": "202 [{"post_id": 80254, "ts": "2026-10-16T22:43:38Z", "hours": 6.1072, "text": "I FINALLY FINISHED THE PCB!!!! Finally, after 2 months, I finished the entire PCB. It has been a long journey, and I learned a lot in it. I hope you like my work. I know it’s not the best thing, but I gave it my best, and I think that what matters most is hope you like my project and comment. :) Bye-bye"}, {"post_id": 76102, "ts": "2026-10-02T10:09:58Z", "hours": 14.1619, "text": "i finally finished the updated schmatics and the assignment for the footprint and now the last step that remains is completing the footprint and traces and the silk screen"}, {"post_id": 58184, "ts": "2026-08-30T15:18:56Z", "hours": 9.7356, "text": "THE AGRIBOT PCB FOOTPRINT (i am getting cooked) In the last few days I have been working on the AgriBot motion board in KiCad and have reduced the number of DRC violations from 191 to zero. I found that 173 of the violations were due to one particular setting, namely the fact that the default netclass had a 1 mm pad with a 0.9 mm drill, which made me feel like the biggest idiot in the world since it left only a 0.05 mm annular ring for each via. After I changed the drill size to 0.6 mm, all of those errors vanished. The trace which I had been looking for during the last few days wasn’t really there—it was a missing via. Each of the two sections of the 12v run ended at the same place, one on the front layer and the other on the back layer, but they weren’t connected. This type of error is easy to overlook since the trace appears complete at first sight. Following that, I changed the fuse holder footprints and put their pads directly onto the existing routes. This resulted in six short circuits on the 12 V rails and on ground. I also realised that fuse (f3) is entirely bypassed since the same net is used on both sides. At the moment I have no intention of carrying out these changes, but I’ll most likely rebuild the whole board since I want to replace the motor drivers and add a few new features. Most of the routing will also be done over again. So yes, If you have been lucky these last few days plz pass some I really need your luck."}, {"post_id": 47455, "ts": "2026-08-15T11:58:50Z", "hours": 8.0397, "text": "My GREENSHIFT rover schematics are FINALLY DONE one of the most annoying and ragebaiting sessions of all time in kicad but finally got it done. This is the pcb for my project thats called GREENSHIFT its a farm rover that helps you inyour farm and helps you take care of it i just finished the schematics, and i really dont know how i did it with out breaking the screen kicad crashed 2 times and i had to do all of this 3 times, but at least it’s done. I will run ERC and than start routing plz wish me luck because i think I am going crazy"}]...
|
Title: agribot by @malek_sameh61 | Stardance
Devl Title: agribot by @malek_sameh61 | Stardance
Devlogs:
My GREENSHIFT rover schematics are FINALLY DONE one of the most annoying and ragebaiting sessions of all time in kicad but finally got it done. This is the pcb for my project thats called GREENSHIFT its a farm rover that helps you inyour farm and helps you take care of it i just finished the schematics, and i really dont know how i did it with out breaking the screen kicad crashed 2 times and i had to do all of this 3 times, but at least it’s done. I will run ERC and than start routing plz wish me luck because i think I am going crazy
THE AGRIBOT PCB FOOTPRINT (i am getting cooked) In the last few days I have been working on the AgriBot motion board in KiCad and have reduced the number of DRC violations from 191 to zero. I found that 173 of the violations were due to one particular setting, namely the fact that the default netclass had a 1 mm pad with a 0.9 mm drill, which made me feel like the biggest idiot in the world since it left only a 0.05 mm annular ring for each via. After I changed the drill size to 0.6 mm, all of those errors vanished. The trace which I had been looking for during the last few days wasn’t really there—it was a missing via. Each of the two sections of the 12v run ended at the same place, one on the front layer and the other on the back layer, but they weren’t connected. This type of error is easy to overlook since the trace appears complete at first sight. Following that, I changed the fuse holder footprints and put their pads directly onto the existing routes. This resulted in six short circuits on the 12 V rails and on ground. I also realised that fuse (f3) is entirely bypassed since the same net is used on both sides. At the moment I have no intention of carrying out these changes, but I’ll most likely rebuild the whole board since I want to replace the motor drivers and add a few new features. Most of the routing will also be done over again. So yes, If you have been lucky these last few days plz pass some I really need your luck.
i finally finished the updated schmatics and the assignment for the footprint and now the last step that remains is completing the footprint and traces and the silk screen
I FINALLY FINISHED THE PCB!!!! Finally, after 2 months, I finished the entire PCB. It has been a long journey, and I learned a lot in it. I hope you like my work. I know it’s not the best thing, but I gave it my best, and I think that what matters most is hope you like my project and comment. :) Bye-bye...
|
1792500667.8626938
|
1793105467.8626938
|
|
38164
|
Determinist by @Mate1166 | Stardance
|
Mate1166
|
3
|
83.0
|
503
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T23:53:05Z", "hours": 38.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Determinist Determinist is a deterministic password generator that lets you recover forgotten passwords easily, given that you remember a master password, and a few things about your lost password. Features CLI and Web interface, featuring a PWA that also works offline Three algorithm versions to choose from A preset system Generated passwords are identical on both the website and the CLI Fully local generation Presets The presets use the TOML format, which is very user-friendly and easy to edit. The presets have multiple categories inside them like ‘general’ (for the algorithm version and password length), ‘preset’ (the preset name, description and whether it is set as defaul), and version specific ones like ‘v3’, which has the settings for the v3 algorithm. If you’re unsure how to edit preset files, you can also just export your settings from the website, and use it across all versions of Determinist! To Reviewers Please, test both the CLI and the website (if possible), and provide feedback on User Experience if you encountered any issues, include that in the review. You can even suggest features, and I may implement them :) Thank you!", "repo": "https://github.com/szentpeterimate/Determinist", "demo": "https://szentpeterimate.github.io/determinist/"}, {"ship_num": 2, "ts": "2026-08-13T14:20:06Z", "hours": 29.0, "multiplier": 14.15, "payout": 412, "blessing": "neutral", "text": "Well, it’s official: Determinist now has a website! Features: Easy to use interface Straightforward settings 1:1 compatibility with the CLI Fully client-side The only thing that hasn’t made it into the website (yet) is the preset system, just like with the CLI, I’m adding that later as the web UI is already really easy to use. And now the less technical bit… It’s been an incredible journey, Determinist has been my dream project for a few years now, and it’s really amazing how I can share it with the world now that it’s done. Just to mention a few things I learned from this project: Testing Proper git usage Cryptography JavaScript These are things I wouldn’t really have learned without Determinist. Sure, I could have done so, but not this fast and effectively. I must thank those who supported the project, who liked the devlogs, and of course the reviewers who gave their opinion on the CLI. Because of your feedback, I made Determinist even easier to use now, and I will continue doing so. Version 3 of the algorithm is on its way, as well as the preset system for the web. Thank you everyone!", "repo": "https://github.com/szentpeterimate/Determinist", "demo": "https://szentpeterimate.github.io/determinist/"}, {"ship_num": 3, "ts": "2026-08-01T18:32:59Z", "hours": 16.0, "multiplier": 6.15, "payout": 91, "blessing": "neutral", "text": "Determinist is a password generator made for people who often forget or leave passwords behind, just like me. A few years ago I was on vacation when I wanted to log into a website. However, the password for it was left at home on my PC, which I didn’t bring with myself. Of course, I could’ve just reset the password, but that would’ve been worse since I’d still have mismatched passwords. Determinist solves that. It uses a deterministic algorithm to take your inputs, and generate you a password you can recover anytime, anywhere. The only thing you need to remember is your master passphrase, which site you want to log in, and a few additional settings. (presets coming soon!) I had a lot of fun with this project, and it taught me quite a bit about encryption, randomness, and most importantly how a real-world project functions. (I do have to mention my initial struggle with Typer though, I would not want to wish that on my worst enemy.) With that being said, I hope you’ll have your password problems solved, and that you’ll enjoy using Determinist! Have fun!", "repo": "https://github.com/szentpeterimate/Determinist", "demo": "https://szentpeterimate.github.io/determinist/"}]...
|
[{"post_id": 80257, "ts": "202 [{"post_id": 80257, "ts": "2026-10-16T23:42:22Z", "hours": 1.6311, "text": "Determinist // Devlog 16 // 2026.09.17. Version 1.0.0 is out, and this is my final devlog. Well, it finally arrived. Version 1.0.0. This is where active development stops. Of course, I will still fix issues and implement features suggested by you guys, but I probably won’t be adding any by myself. Stardance has been a great inspiration for me, not only to make this project, but to keep going and coming back to doing what I love: coding, and making things for others. I am very happy with how Determinist turned out, despite the difficulties and me being busy with school. But enough of this, what was changed since my last devlog? Changes Updated the documentation to show that a PWA is available to install Fixed various bugs and style inconsistencies Added a description of the generation process to the website Added a Copy to Clipboard toggle Added an Export as Preset button Removed Google Fonts connections What’s next? Nothing. I’d like to thank everyone who had a chance to try and use Determinist. Everyone who reviewed it and even you, the one reading this devlog :) Y’all have showed me that things I make can and are useful for others. See you in the next Hack Club program!"}, {"post_id": 79995, "ts": "2026-10-15T20:30:50Z", "hours": 5.9489, "text": "Determinist // Devlog 15 // 2026.09.15. A few design changes, and a brand new section on the website! Design I have fixed several design issues I noticed and did not like. Just to mention a few, there was unnecessary overflow on mobile devices, the spacing was off on several elements, and the width of the file input field was also too big. The Wall of Text™ It isn’t that big to be fair, it just explains how Determinist works, split into the 3 versions of the generation algorithm. I didn’t want to copy the page I had linked in the README, so I just wrote it down again and tried wording it better. Additionally, I tried to preserve the original one page, no scroll design by placing the About section below the actual app, so you have to scroll to see it. Other changes I refactored parts of the web code as the Generator element was getting really long, above 500 lines. I moved the algorithms out to a separate importable module, and I placed it along with the python-random module into a self-explanatory modules directory. I’ve also moved generror.jsx and presethandler.jsx into their own handlers/ directory, and the two specialized input fields into an inputs/ directory. Overall, this change makes the code way easier to read. The preset generator works now as well, just click the “Export as Preset” button below “Generate”, name the preset and the preset will be downloaded for you! You can also toggle on a “Copy to Clipboard” feature which allows you to automatically copy your generated password to your clipboard. Pretty neat! What’s next? Bug fixes Auto clear password popup"}, {"post_id": 77686, "ts": "2026-10-07T21:23:27Z", "hours": 2.1339, "text": "Determinist // Devlog 14 // 2026.09.06. Finally, I figured out how to make the site work offline… The process After working on the PWA for way longer than I expected, it finally works as intended! After I’ve figured out how to use next-pwa , I encountered an issue: the site was being cached and loaded correctly in the browser but not when installed as a PWA. I rewrote multiple parts of the code for it to work, yet it did not. In the end, it was the unsecured connections that were at fault. Discovering that, I have learned to use something new again: Localtunnel, which allows me to use a valid (not self-signed) HTTPS connection while testing. This uncovered even more issues with my code, the most obvious being the fact that fonts were not cached at all. This was because I was getting my fonts by connecting to fonts.google.com . This was a really easy thing to fix though, as Next.js already has a next/fonts/google library that had the fonts I used, and now everything works well. What’s next? Bug fixes Descriptions Preset Generator Auto Copy to Clipboard toggle"}, {"post_id": 73593, "ts": "2026-09-25T13:12:35Z", "hours": 4.1403, "text": "Determinist // Devlog 13 // 2026.09.25. Quite a few issues, but apparently it works… Progressive Web App Well, making Determinist a PWA certainly took way longer than expected. I thought it would be an hour at most, I mean Next.js literally has a guide that tells me what to do step-by-step. It was in fact NOT easy. I encountered a ton of problems. First off, I had to write a manifest which had the app name, icons etc., the obvious things. What was not obvious however was that I had multiple ways of doing that. I could write a JSON file, or write a JavaScript file that exports an object. I chose the latter as it was the version that the Next.js guide was using. Then came the icons. Oh, the icons. I made my icons and put it in the public/ directory with the correct names so that they match the manifest. Cool, works when I share it but there is no icon when I add it to my home screen on my iPhone. It said I’m missing a file called apple-touch-icon and apple-touch-icon-precomposed . Cool, I duplicated the icons and I renamed them. No 404s, but it still did not work. I look for a solution. For hours. I look at Next.js docs, YouTube, StackOverflow, Reddit, GitHub issues and there is nothing that would fix it. Finally, I found out I need to link the icon in the head of the website. Great, but still doesn’t work. Turns out, the problem was that I was following the Next.js guide which told me to use HTTPS to test the PWA, but iOS does not trust self-signed keys so it did not download the icon. After that, the generation broke when I was connecting to the site with the IP and not through localhost . I noticed that submitting (pressing the generate button) redirected me which should not have happened due to the line e.preventDefault() . Then I saw Next.js attempting to connect a websocket, and a bunch of 403 errors that weren’t there before. I spent quite a bit of time debugging that, and it was due to not adding my IP to allowedDevOrigins in the next.config.mjs file despite it working perfectly fine before. The Icon As you can see, the image I decided to include in my devlog is the icon for Determinist. I actually did not think of putting the D and the E together at first, but when I did, it reminded me of a lock (hope you can see it!) and I chose to keep it as it kind of fits. And I didn’t want a solid color background, so I decided I’ll just add the name repeating. It was fun making it, and it was also a very good way to practice using Illustrator. What’s next? Making the PWA work offline Bug fixes Descriptions Preset Generator Auto Copy to Clipboard toggle"}, {"post_id": 69184, "ts": "2026-09-16T15:26:59Z", "hours": 5.1517, "text": "Determinist // Devlog 12 // 2026.09.16. Well, it took me more than a week, but the v3 algorithm is on the website! CLI Update I have published version 0.5.2 of the Python CLI, which fixed a few issues I found (you can see them on the GitHub page!), and added actual functionality to the default presets. You can also report issues on the GitHub page, and it is highly appreciated. What changed? I added the v3 algorithm, after a bit of tinkering with the error handling. My problem was that the error handling wasn’t really dynamic. It couldn’t handle the invalid input errprs from v3, so I made a separate component. I also had to learn how to use HKDF on the client side, which was actually easier to do than I expected, although the actual usage of HKDF was a bit more complicated than it is in Python. What’s next? Bug fixes Descriptions Preset Generator PWA Implementation Auto Copy to Clipboard toggle"}, {"post_id": 63122, "ts": "2026-09-06T19:06:33Z", "hours": 8.5219, "text": "Determinist // Devlog 11 // 2026.09.06. After the first week of school, I have finished work on the CLI, and Determinist 0.5.1 is released! Changes Added presets create command Changed preset option to allow selection in one line Changed the presets list to show invalid files in the configuration directory Added password generation errors Fixed bugs: The password being allowed to have less characters than the sum of the minimum required characters is fixed The g prefix from the commit hash is now removed Various preset error handling issues have been fixed Presets are now not required to have all the versions inside them What’s taking so long? Is Determinist done? Firstly, I just started school, so I got very busy lately and that is why I haven’t been doing much work. As a compensation, v3 of the algorithm is now available on GitHub !! This is version 0.5.1, which is a pretty big jump if you look at the versions before. However, there is a reason for that: active development of Determinist is going to stop once version 1.0.0 comes out, with all the new features and fixes being ported to the website. This will come out in the next week or so. Determinist will still be updated here and there if I miss some features or people have suggestions and issues, but I will be mainly focusing on other projects. Latest development stuff The preset creation was actually pretty easy. I figured I’ll reuse the options from the generate command so I don’t have to write them manually again, and it worked amazing! I had to add to the PresetHandler to make it work, and that was really simple as well. I first thought of adding strings together, but then I realized I could just create dictionaries that my TOML library can convert to TOML and write them to the preset, so I didn’t have to do all the writing myself. The bug fixes weren’t interesting at all, honestly. I messed around with Determinist, found bugs and issues and I fixed them. My favorite one was debugging errors with the preset commands however. I found a bunch of things worth fixing, and in the end I made another helper function, as well as changing how check_file_type works. To do Port everything over to the website Add more text to the website explaining Determinist and how it works"}, {"post_id": 55761, "ts": "2026-08-27T19:06:48Z", "hours": 4.7333, "text": "Determinist // Devlog 10 // 2026.08.27 Updates here and there, and the v3 algorithm is finally complete! All of this and the content of the rest of the devlogs will only be released with the final 1.0.0 release of Determinist. Changes Added v3 algorithm for the Python CLI It features dynamic byte generation so that no matter what, you’ll never run out of characters! (Unless you’re VERY unlucky) You can now enter a third value called a “differentiator” that can be used to change the output further. This is especially useful if you have multiple accounts on the same site. This option can be left empty Your generated password is now guaranteed to have the correct amount of characters You can now set a minimum amount of characters of each type! Simply enter 0 to exclude the character type, and 1 or above to choose how many characters your password have minimum of that type. Made generate prompt only prompt users if the prompts are applicable. This means you will no longer be prompted for the settings of v1 when you use one of the other two algorithms. Fixed an issue where if the site_name option is omitted, the prompt will display Master pass instead of the correct prompt. The difficulties Well, of course the development of v3 came with some challenges. Firstly, I had to figure out how to actually generate enough bytes to pass rejection sampling (making sure no bytes are out of range when mapped onto the character set), as the previous implementation was that I multiplied the password length by 32. This worked, but wasn’t pretty and in very rare and unlucky cases, there weren’t enough bytes. I fixed this by using something called HKDF, which stands for HMAC-based Extract-and-Expand Key Derivation Function. I’d really prefer to use HKDF. Anyway, this function was really good for this task, as it can take the Argon2 output and create a long, pseudo-random key that can go through rejection sampling, and finally end up in the password. In case this generated key is not enough, HKDF will generate more of it, essentially giving us infinite bytes to then map to our characters. This was especially good because in the same loop I could implement… Minimum requirements This should have been easy, but it took me a day to think about how to do it. The challenge: take a dictionary ( {\"lowercase\": 2, \"uppercase\": 3, \"special\": 1, \"digits\": 0} ), and include at least as many characters of each type as their value in that dictionary says, and if it’s 0 then don’t include it at all. Fine, I said, but I didn’t actually know how to implement this. After a day of thinking, it finally clicked: I implement this in the rejection sampling loop, as that is where my characters get added. Introducing the _construct_pass function: it looks for the already added characters, determines the type of the current character, counts how many are missing, and if a character type is missing some characters or there aren’t any left, the character is added, and otherwise it is discarded. To do Add a preset generator command Fix a g prefix appearing in the version command output before the git commit hash Add the ability to choose a preset in one line instead of being prompted for it Fix the password being allowed to be shorter than the sum of minimum required characters (I found that one while writing this) Port everything over to the website Update the docs Add more text to the website explaining Determinist and how it works"}, {"post_id": 52485, "ts": "2026-08-22T16:59:34Z", "hours": 6.1439, "text": "Determinist // Devlog 9 // 2026.08.22 Long time no see y’all, sorry for the wait! I’m on vacation so I had less time to work on the project, but I did bring some amazing improvements. Announcement The website is officially up and works identically to the CLI, now with presets! Just load your TOML presets into the website, and they will be saved for you to reuse! Important note: they are saved locally, therefore you will not see them on different devices unless you import them there too. Changes Added the preset system to the website! You can now import and use presets, and you can easily remove them if needed. Adjusted the UI so that it fits most (if not all) screens. The smallest screen I tested was an iPhone SE. The Challenges There actually weren’t a lot of challenges for once. The biggest one was that I forgot to work on the project while on vacation, but that’s not horrible. And then came React, JavaScript and everything else… firstly, the preset loading was actually really easy, I did however fight with React about passing values from a child component to the parent. And then it turned out I forgot to make it actually pleasant to use, as I had to select the preset file every time I wanted to load it. Now you can save, select and load your presets on the website. However, React had other plans. I finally learned how React’s useEffect hook works, and using it is pretty easy now that I get what I’m doing. Along with this, I also properly learned about using functions inside useState for lazy initialization which I needed for localStorage . Oh, localStorage was a pleasure to learn and use… Well, the operations with it are actually fairly easy, it’s like an object, and my first thought of initializing a state with it was to use useState({ ...localStorage }) , which did work, but it introduced something else: a build error after I merged the changes into main . Turns out, localStorage is undefined when GitHub Actions wants to build my website, therefore it gave me an error saying so. What I had to do is check if the window object is equal to 'undefined' , and if not, then spread localStorage and initialize the state. Finally, the website managed to build properly, but when I tried to use it on my phone, the output of the generator was outside my screen… so I had to go back and change how the UI looks after I’ve already merged everything into main . Amazing. Well, the good new is that it works, and next up is the v3 algorithm, as well as QoL changes, bug fixes, and more in both the CLI and web versions."}, {"post_id": 46026, "ts": "2026-08-12T22:45:54Z", "hours": 6.4178, "text": "Determinist // Devlog 8 // 2026.08.13 The UI is mostly complete, and I will be releasing the website tomorrow! Changes Significantly improved the entire user interface Version and special character mode (V1) now use <select> instead of the regular <input> , so you don’t have to type them out The difficulties There really wasn’t anything too hard about making the UI. You might ask, “why did you spend over 6 hours on it then?”. I have an answer for you. I tried using Figma for designing the UI but it was just too boring for me, so I decided to start coding it and figure it out as I go. I’m pretty satisfied with the result, but with everything, it can always be improved. The second problem was that while I was coding, I was also listening to music and I spent a bunch of time skipping songs because I didn’t feel like listening to them. This took my attention along with singing a bit too much, so my progress was slowed… The last thing to slow me down was my general inexperience with React and JS, although I got over that quick because the frontend is way easier to work on. Planned Adding the preset system Building the site & uploading to GitHub Pages"}, {"post_id": 45454, "ts": "2026-08-11T22:28:05Z", "hours": 4.7858, "text": "Determinist // Devlog 7 // 2026.08.12 Well, it’s official. I had to use AI for the first time :( Why? JavaScript does not have the same random implementation as Python does. Python uses MT19937 while JS uses Xorshift128+. This means we can’t use JavaScript’s random number generator, not to mention that we can’t even use it to shuffle arrays, as it lacks the method. And since I am relatively new to JS, I had two options: get a 15 year old module work that does exactly what I need it to, or make it with AI. I tried getting that package to work. I really did. Unfortunately, the algorithm it uses seems to be outdated, as the results differed in tests. That is why I used AI. I really didn’t want to, but I had to. Well, let’s look at the positives, at least! Changes The V2 algorithm is implemented and works 1:1 with the Python version! I managed to make another input component that uses checkboxes so you can select what kind of characters you’d like. It was challenging but it works! Next Up Tomorrow I’ll work on the UI design Adding the preset system Building the site Uploading to GitHub Pages"}, {"post_id": 44862, "ts": "2026-08-10T21:58:48Z", "hours": 2.4364, "text": "Determinist // Devlog 6 // 2026.08.10 Pretty big milestone: V1 is finally working on the website! Additions Added the V1 generation algorithm Added the customization options to the interface The Generator V1 is complete and works perfectly! I had to figure out a way to enter objects, and it was quite difficult. See, JavaScript doesn’t really have a dictionary type like Python does, so I had to use an object, which is similar enough and I can look for keys with in , just like in Python. The tricky part was creating such an object from the user’s input. I chose the most user friendly way I could think of, and made separate inputs for the key and value, and you can dynamically add more with an “Add Character Pair” button. I really wish there was an easier way and maybe there is a template out there, but I didn’t consider it until writing this very sentence. Anyways, tomorrow I’ll spend more time refining V1, the inputs and I’ll start working on V2. To Do Refining the generator and inputs Creating V2 Desgining the UI Adding the preset system Generating the static site"}, {"post_id": 44238, "ts": "2026-08-09T21:17:27Z", "hours": 2.4381, "text": "Determinist // Devlog 5 // 2026.08.09 I’ve started working on the website finally! The plan I’ll use GitHub Pages to host Determinist until I can get my own domain and personal site up, after which I’ll transfer it there. The plan is to make the generator client sided by using WebAssembly to access Argon2 in the browser without requiring a backend. I wanna do this so that no information leaves the user’s computer, which is a key part of keeping Determinist privacy focused. I chose to use Next.js because I used it before, and it has Static Site Generation which is essential if I want to put the site on GitHub Pages. What I achieved in 2 and a half hours I made Argon2 work Yes, that’s about it. I spent most of my time debugging errors and learning basics as I’ve only used JavaScript for making components, not to make more complex algorithms like Determinist’s is. I am a fast learner though, so I expect to be able to recreate Determinist V1 relatively quickly. Starting with WASM on my first serious web project where I’m still learning JS maybe wasn’t the most amazing idea, but hey, I like challenges and learning by doing. What’s next? Continuing work on V1 Porting V2 to JavaScript Desgining the UI Adding the preset system Generating the static site and fixing errors after it’s done And to the reviewers and people who liked the Determinist CLI… Thank you! Developing Determinist has been lots of fun and I’ve learned a lot of valuable things. Your support and feedback is greatly appreciated, it motivates me to work every single day. It’s a project I’m really passionate about, as I wanted to create this for years. Thank you all for your support, and I hope you’ll enjoy using Determinist whether it’s in your terminal or the web. See you in the next devlog!"}, {"post_id": 42594, "ts": "2026-08-07T12:38:38Z", "hours": 3.0314, "text": "Determinist // Devlog 4 // 2026.08.07 Developer experience and cleanups What changed My code now has comments! Although it is quite straightforward to understand, I did include a few here and there. A brand new version command shows what version Determinist is on, what commit it was built from, and the Python version it uses. I added more custom error handling to commands Something funny happened… I was testing the generation of the default preset, and I forgot to press tab when deleting the Determinist config directory. I only realized that when Hyprland started screaming at me about missing configurations. I thought “that’s weird”, so I checked the command I ran. rm -rf ~/.config/ . I deleted my entire configuration directory… Luckily, I had backups, but at least I’ve learned that I should double check my commands. Another Typer issue To absolutely no one’s surprise, Typer didn’t work as intended, once again. It kept reporting the wrong error when running presets subcommands. Turns out it was the callback I wrote to list the presets. It actually ran the check every time a presets command was run, giving the wrong error when a non TOML file was detected in the presets directory. It was a quick fix, but now I’m quite comfortable with Typer."}, {"post_id": 41993, "ts": "2026-08-06T15:11:38Z", "hours": 10.2806, "text": "Determinist // Devlog 3 // 2026.08.06. Determinist v0.2.2 is here and available to install, but I certainly did not thing this would take another 10 hours… What changed I have made a preset system that can load settings so you don’t have to type them out manually. You can only use this with the regular generate command. The presets command lists out all installed presets Running presets save with a path added at the end will save the selected preset to your config folder Adding delete after presets with the name of a preset will delete that permanently Using presets default and adding the preset name will set that preset as default Running --help is actually helpful now! Another change is I made prompt a subcommand of generate . I ran into an issue while implementing this… The issue You see, Typer cannot tell the difference between a positional argument and a subcommand, meaning that it took prompt as the master_pass argument for generate . This is obviously not at all what I intended, so I needed a way to figure out how to solve this. I didn’t want to make prompt an option, since that would’ve complicated things a lot more than they needed to be. Therefore, I changed master_pass and site_name to required options, which means they need to be typed out manually. Fear not however, because if you forget to do that, Determinist now prompts you for it! Another problem was with types, again. Typer apparently doesn’t like Union types, which I would’ve used for the preset option. What I wanted to do is make the user be able to type out the name of the preset, select one if none is entered in the command, or do everything manually. Problem: that’s 3 types: None , str and UNSET , which is basically a different spelling of None , it jut signals that the presets option was passed without an argument, as a flag. But Typer decided to ruin my day and only let me use two types, so I removed it all and made --preset a boolean, therefore a flag. That’s about it for now, if you like the idea of having an easy way of remembering your passwords, check out Determinist!"}, {"post_id": 39036, "ts": "2026-08-01T18:20:18Z", "hours": 11.0289, "text": "Determinist // Devlog 2 // 2026.08.01 Welcome back to the second devlog of Determinist! It’s been a while, so let’s recap what happened… Release!! The first official release of Determinist is here! You can check out the GitHub page to learn more. Algorithm V2 Quite a few changes here. I changed the algorithm so that it uses the bytes that Argon2 returns The bytes are now mapped to characters in a shuffled charset Insert/Replace modes have been removed because special characters are already in the charset You can now construct your own charset Typer I made my CLI with Typer, which was a challenge to say the least. This is my first time using it, and looking back, it wasn’t THAT bad. All I had to do is refactor generator.py completely, and make my types compatible (which I worked REALLY HARD on for V1). Typer doesn’t allow me to use things like lists and dictionaries, both of which are essential, but I managed to change everything in a way that’s mostly straightforward. I can split strings into a list and use JSON for dictionaries. Refactoring Challenges This is pretty funny. I wrote a series of tests for version 2 of the algorithm before I started implementing Typer. After than however, all tests passed except one. I was supposed to use assertUnequal() , but used the opposite instead, and that was I caught an error in my code that would’ve went unnoticed. The tests saved me another time, when I noticed that changing the order in which the charset character types are written changes the output, which is not what I need because it’s essentially the same input, and it should be more like a toggle. The fix was making the charset canonical. The algorithm goes through the list, writes the correct characters into a string, and uses that in the salt instead of the list of the charset. Other The Generator class was removed, as it served no purpose."}, {"post_id": 33987, "ts": "2026-07-24T11:33:26Z", "hours": 4.8617, "text": "Determinist // Devlog 1 // 2026.07.24. Hey everyone! This is the first devlog of Determinist, a deterministic password generator. After a few hours of messing around, I’ve managed to write the first working version of the generator algorithm. (Flowchart attached) You can specify the parameters such as password length, special character frequency, etc. as well as the master passphrase and the salt (site name in this case), and the script will generate a pseudorandom password for you. I’ve hit quite a few roadblock along the way, such as the salt being too small. This is a feature of Argon2, so for now you can only use custom salts that are bigger than 8 bytes. I’ve also included a few unit tests as proof of concept. The generator algorithm will be improved in later versions, and a CLI tool will be available."}]...
|
Title: Determinist by @Mate1166 | Stardance
Devlo Title: Determinist by @Mate1166 | Stardance
Devlogs:
Determinist // Devlog 1 // 2026.07.24. Hey everyone! This is the first devlog of Determinist, a deterministic password generator. After a few hours of messing around, I’ve managed to write the first working version of the generator algorithm. (Flowchart attached) You can specify the parameters such as password length, special character frequency, etc. as well as the master passphrase and the salt (site name in this case), and the script will generate a pseudorandom password for you. I’ve hit quite a few roadblock along the way, such as the salt being too small. This is a feature of Argon2, so for now you can only use custom salts that are bigger than 8 bytes. I’ve also included a few unit tests as proof of concept. The generator algorithm will be improved in later versions, and a CLI tool will be available.
Determinist // Devlog 2 // 2026.08.01 Welcome back to the second devlog of Determinist! It’s been a while, so let’s recap what happened… Release!! The first official release of Determinist is here! You can check out the GitHub page to learn more. Algorithm V2 Quite a few changes here. I changed the algorithm so that it uses the bytes that Argon2 returns The bytes are now mapped to characters in a shuffled charset Insert/Replace modes have been removed because special characters are already in the charset You can now construct your own charset Typer I made my CLI with Typer, which was a challenge to say the least. This is my first time using it, and looking back, it wasn’t THAT bad. All I had to do is refactor generator.py completely, and make my types compatible (which I worked REALLY HARD on for V1). Typer doesn’t allow me to use things like lists and dictionaries, both of which are essential, but I managed to change everything in a way that’s mostly straightforward. I can split strings into a list and use JSON for dictionaries. Refactoring Challenges This is pretty funny. I wrote a series of tests for version 2 of the algorithm before I started implementing Typer. After than however, all tests passed except one. I was supposed to use assertUnequal() , but used the opposite instead, and that was I caught an error in my code that would’ve went unnoticed. The tests saved me another time, when I noticed that changing the order in which the charset character types are written changes the output, which is not what I need because it’s essentially the same input, and it should be more like a toggle. The fix was making the charset canonical. The algorithm goes through the list, writes the correct characters into a string, and uses that in the salt instead of the list of the charset. Other The Generator class was removed, as it served no purpose.
Determinist // Devlog 3 // 2026.08.06. Determinist v0.2.2 is here and available to install, but I certainly did not thing this would take another 10 hours… What changed I have made a preset system that can load settings so you don’t have to type them out manually. You can only use this with the regular generate command. The presets command lists out all installed presets Running presets save with a path added at the end will save the selected preset to your config folder Adding delete after presets with the name of a preset will delete that permanently Using presets default and adding the preset name will set that preset as default Running --help is actually helpful now! Another change is I made prompt a subcommand of generate . I ran into an issue while implementing this… The issue You see, Typer cannot tell the difference between a positional argument and a subcommand, meaning that it took prompt as the master_pass argument for generate . This is obviously not at all what I intended, so I needed a way to figure out how to solve this. I didn’t want to make prompt an option, since that would’ve complicated things a lot more than they needed to be. Therefore, I changed master_pass and site_name to required options, which means they need to be typed out manually. Fear not however, because if you forget to do that, Determinist now prompts you for it! Another problem was with types, again. Typer apparently doesn’t like Union types, which I would’ve used for the preset option. What I wanted to do is make the user be able to type out the name of the preset, select one if none is entered in the command, or do everything manually. Problem: that’s 3 types: None , str and UNSET , which is basically a different spelling of None , it jut signals that the presets option was passed without an argument, as a flag. But Typer decided to ruin my day and only let me use two types, so I removed it all and made --preset a boolean, therefore a flag. That’s about it for now, if you like the idea of having an easy way of remembering your passwords, check out Determinist!
Determinist // Devlog 4 // 2026.08.07 Developer experience and cleanups What changed My code now has comments! Although it is quite straightforward to understand, I did include a few here and there. A brand new version command shows what version Determinist is on, what commit it was built from, and the Python version it uses. I added more custom error handling to commands Something funny happened… I was testing the generation of the default preset, and I forgot to press tab when deleting the Determinist config directory. I only realized that when Hyprland started screaming at me about missing configurations. I thought “that’s weird”, so I checked the command I ran. rm -rf ~/.config/ . I deleted my entire configuration directory… Luckily, I had backups, but at least I’ve learned that I should double check my commands. Another Typer issue To absolutely no one’s surprise, Typer didn’t work as intended, once again. It kept reporting the wrong error when running presets subcommands. Turns out it was the callback I wrote to list the presets. It actually ran the check every time a presets command was run, giving the wrong error when a non TOML file was detected in the presets directory. It was a quick fix, but now I’m quite comfortable with Typer.
Determinist // Devlog 5 // 2026.08.09 I’ve started working on the website finally! The plan I’ll use GitHub Pages to host Determinist until I can get my own domain and personal site up, after which I’ll transfer it there. The plan is to make the generator client sided by using WebAssembly to access Argon2 in the browser without requiring a backend. I wanna do this so that no information leaves the user’s computer, which is a key part of keeping Determinist privacy focused. I chose to use Next.js because I used it before, and it has Static Site Generation which is essential if I want to put the site on GitHub Pages. What I achieved in 2 and a half hours I made Argon2 work Yes, that’s about it. I spent most of my time debugging errors and learning basics as I’ve only used JavaScript for making components, not to make more complex algorithms like Determinist’s is. I am a fast learner though, so I expect to be able to recreate Determinist V1 relatively quickly. Starting with WASM on my first serious web project where I’m still learning JS maybe wasn’t the most amazing idea, but hey, I like challenges and learning by doing. What’s next? Continuing work on V1 Porting V2 to JavaScript Desgining the UI Adding the preset system Generating the static site and fixing errors after it’s done And to the reviewers and people who liked the Determinist CLI… Thank you! Developing Determinist has been lots of fun and I’ve learned a lot of valuable things. Your support and feedback is greatly appreciated, it motivates me to work every single day. It’s a project I’m really passionate about, as I wanted to create this for years. Thank you all for your support, and I hope you’ll enjoy using Determinist whether it’s in your terminal or the web. See you in the next devlog!
Determinist // Devlog 6 // 2026.08.10 Pretty big milestone: V1 is finally working on the website! Additions Added the V1 generation algorithm Added the customization options to the interface The Generator V1 is complete and works perfectly! I had to figure out a way to enter objects, and it was quite difficult. See, JavaScript doesn’t really have a dictionary type like Python does, so I had to use an object, which is similar enough and I can look for keys with in , just like in Python. The tricky part was creating such an object from the user’s input. I chose the most user friendly way I could think of, and made separate inputs for the key and value, and you can dynamically add more with an “Add Character Pair” button. I really wish there was an easier way and maybe there is a template out there, but I didn’t consider it until writing this very sentence. Anyways, tomorrow I’ll spend more time refining V1, the inputs and I’ll start working on V2. To Do Refining the generator and inputs Creating V2 Desgining the UI Adding the preset system Generating the static site
Determinist // Devlog 7 // 2026.08.12 Well, it’s official. I had to use AI for the first time :( Why? JavaScript does not have the same random implementation as Python does. Python uses MT19937 while JS uses Xorshift128+. This means we can’t use JavaScript’s random number generator, not to mention that we can’t even use it to shuffle arrays, as it lacks the method. And since I am relatively new to JS, I had two options: get a 15 year old module work that does exactly what I need it to, or make it with AI. I tried getting that package to work. I really did. Unfortunately, the algorithm it uses seems to be outdated, as the results differed in tests. That is why I used AI. I really didn’t want to, but I had to. Well, let’s look at the positives, at least! Changes The V2 algorithm is implemented and works 1:1 with the Python version! I managed to make another input component that uses checkboxes so you can select what kind of characters you’d like. It was challenging but it works! Next Up Tomorrow I’ll work on the UI design Adding the preset system Building the site Uploading to GitHub Pages
Determinist // Devlog 8 // 2026.08.13 The UI is mostly complete, and I will be releasing the website tomorrow! Changes Significantly improved the entire user interface Version and special character mode (V1) now use <select> instead of the regular <input> , so you don’t have to type them out The difficulties There really wasn’t anything too hard about making the UI. You might ask, “why did you spend over 6 hours on it then?”. I have an answer for you. I tried using Figma for designing the UI but it was just too boring for me, so I decided to start coding it and figure it out as I go. I’m pretty satisfied with the result, but with everything, it can always be improved. The second problem was that while I was coding, I was also listening to music and I spent a bunch of time skipping songs because I didn’t feel like listening to them. This took my attention along with singing a bit too much, so my progress was slowed… The last thing to slow me down was my general inexperience with React and JS, although I got over that quick because the frontend is way easier to work on. Planned Adding the preset system Building the site & uploading to GitHub Pages
Determinist // Devlog 9 // 2026.08.22 Long time no see y’all, sorry for the wait! I’m on vacation so I had less time to work on the project, but I did bring some amazing improvements. Announcement The website is officially up and works identically to the CLI, now with presets! Just load your TOML presets into the website, and they will be saved for you to reuse! Important note: they are saved locally, therefore you will not see them on different devices unless you import them there too. Changes Added the preset system to the website! You can now import and use presets, and you can easily remove them if needed. Adjusted the UI so that it fits most (if not all) screens. The smallest screen I tested was an iPhone SE. The Challenges There actually weren’t a lot of challenges for once. The biggest one was that I forgot to work on the project while on vacation, but that’s not horrible. And then came React, JavaScript and everything else… firstly, the preset loading was actually really easy, I did however fight with React about passing values from a child component to the parent. And then it turned out I forgot to make it actually pleasant to use, as I had to select the preset file every time I wanted to load it. Now you can save, select and load your presets on the website. However, React had other plans. I finally learned how React’s useEffect hook works, and using it is pretty easy now that I get what I’m doing. Along with this, I also properly learned about using functions inside useState for lazy initialization which I needed for localStorage . Oh, localStorage was a pleasure to learn and use… Well, the operations with it are actually fairly easy, it’s like an object, and my first thought of initializing a state with it was to use useState({ ...localStorage }) , which did work, but it introduced something else: a build error after I merged the changes into main . Turns out, localStorage is undefined when GitHub Actions wants to build my website, therefore it gave me an error saying so. What I had to do is check if the window object is equal to 'undefined' , and if not, then spread localStorage and initialize the state. Finally, the website managed to build properly, but when I tried to use it on my phone, the output of the generator was outside my screen… so I had to go back and change how the UI looks after I’ve already merged everything into main . Amazing. Well, the good new is that it works, and next up is the v3 algorithm, as well as QoL changes, bug fixes, and more in both the CLI and web versions.
Determinist // Devlog 10 // 2026.08.27 Updates here and there, and the v3 algorithm is finally complete! All of this and the content of the rest of the devlogs will only be released with the final 1.0.0 release of Determinist. Changes Added v3 algorithm for the Python CLI It features dynamic byte generation so that no matter what, you’ll never run out of characters! (Unless you’re VERY unlucky) You can now enter a third value called a “differentiator” that can be used to change the output further. This is especially useful if you have multiple accounts on the same site. This option can be left empty Your generated password is now guaranteed to have the correct amount of characters You can now set a minimum amount of characters of each type! Simply enter 0 to exclude the character type, and 1 or above to choose how many characters your password have minimum of that type. Made generate prompt only prompt users if the prompts are applicable. This means you will no longer be prompted for the settings of v1 when you use one of the other two algorithms. Fixed an issue where if the site_name option is omitted, the prompt will display Master pass instead of the correct prompt. The difficulties Well, of course the development of v3 came with some challenges. Firstly, I had to figure out how to actually generate enough bytes to pass rejection sampling (making sure no bytes are out of range when mapped onto the character set), as the previous implementation was that I multiplied the password length by 32. This worked, but wasn’t pretty and in very rare and unlucky cases, there weren’t enough bytes. I fixed this by using something called HKDF, which stands for HMAC-based Extract-and-Expand Key Derivation Function. I’d really prefer to use HKDF. Anyway, this function was really good for this task, as it can take the Argon2 output and create a long, pseudo-random key that can go through rejection sampling, and finally end up in the password. In case this generated key is not enough, HKDF will generate more of it, essentially giving us infinite bytes to then map to our characters. This was especially good because in the same loop I could implement… Minimum requirements This should have been easy, but it took me a day to think about how to do it. The challenge: take a dictionary ( {"lowercase": 2, "uppercase": 3, "special": 1, "digits": 0} ), and include at least as many characters of each type as their value in that dictionary says, and if it’s 0 then don’t include it at all. Fine, I said, but I didn’t actually know how to implement this. After a day of thinking, it finally clicked: I implement this in the rejection sampling loop, as that is where my characters get added. Introducing the _construct_pass function: it looks for the already added characters, determines the type of the current character, counts how many are missing, and if a character type is missing some characters or there aren’t any left, the character is added, and otherwise it is discarded. To do Add a preset generator command Fix a g prefix appearing in the version command output before the git commit hash Add the ability to choose a preset in one line instead of being prompted for it Fix the password being allowed to be shorter than the sum of minimum required characters (I found that one while writing this) Port everything over to the website Update the docs Add more text to the website explaining Determinist and how it works
Determinist // Devlog 11 // 2026.09.06. After the first week of school, I have finished work on the CLI, and Determinist 0.5.1 is released! Changes Added presets create command Changed preset option to allow selection in one line Changed the presets list to show invalid files in the configuration directory Added password generation errors Fixed bugs: The password being allowed to have less characters than the sum of the minimum required characters is fixed The g prefix from the commit hash is now removed Various preset error handling issues have been fixed Presets are now not required to have all the versions inside them What’s taking so long? Is Determinist done? Firstly, I just started school, so I got very busy lately and that is why I haven’t been doing much work. As a compensation, v3 of the algorithm is now available on GitHub !! This is version 0.5.1, which is a pretty big jump if you look at the versions before. However, there is a reason for that: active development of Determinist is going to stop once version 1.0.0 comes out, with all the new features and fixes being ported to the website. This will come out in the next week or so. Determinist will still be updated here and there if I miss some features or people have suggestions and issues, but I will be mainly focusing on other projects. Latest development stuff The preset creation was actually pretty easy. I figured I’ll reuse the options from the generate command so I don’t have to write them manually again, and it worked amazing! I had to add to the PresetHandler to make it work, and that was really simple as well. I first thought of adding strings together, but then I realized I could just create dictionaries that my TOML library can convert to TOML and write them to the preset, so I didn’t have to do all the writing myself. The bug fixes weren’t interesting at all, honestly. I messed around with Determinist, found bugs and issues and I fixed them. My favorite one was debugging errors with the preset commands however. I found a bunch of things worth fixing, and in the end I made another helper function, as well as changing how check_file_type works. To do Port everything over to the website Add more text to the website explaining Determinist and how it works
Determinist // Devlog 12 // 2026.09.16. Well, it took me more than a week, but the v3 algorithm is on the website! CLI Update I have published version 0.5.2 of the Python CLI, which fixed a few issues I found (you can see them on the GitHub page!), and added actual functionality to the default presets. You can also report issues on the GitHub page, and it is highly appreciated. What changed? I added the v3 algorithm, after a bit of tinkering with the error handling. My problem was that the error handling wasn’t really dynamic. It couldn’t handle the invalid input errprs from v3, so I made a separate component. I also had to learn how to use HKDF on the client side, which was actually easier to do than I expected, although the actual usage of HKDF was a bit more complicated than it is in Python. What’s next? Bug fixes Descriptions Preset Generator PWA Implementation Auto Copy to Clipboard toggle
Determinist // Devlog 13 // 2026.09.25. Quite a few issues, but apparently it works… Progressive Web App Well, making Determinist a PWA certainly took way longer than expected. I thought it would be an hour at most, I mean Next.js literally has a guide that tells me what to do step-by-step. It was in fact NOT easy. I encountered a ton of problems. First off, I had to write a manifest which had the app name, icons etc., the obvious things. What was not obvious however was that I had multiple ways of doing that. I could write a JSON file, or write a JavaScript file that exports an object. I chose the latter as it was the version that the Next.js guide was using. Then came the icons. Oh, the icons. I made my icons and put it in the public/ directory with the correct names so that they match the manifest. Cool, works when I share it but there is no icon when I add it to my home screen on my iPhone. It said I’m missing a file called apple-touch-icon and apple-touch-icon-precomposed . Cool, I duplicated the icons and I renamed them. No 404s, but it still did not work. I look for a solution. For hours. I look at Next.js docs, YouTube, StackOverflow, Reddit, GitHub issues and there is nothing that would fix it. Finally, I found out I need to link the icon in the head of the website. Great, but still doesn’t work. Turns out, the problem was that I was following the Next.js guide which told me to use HTTPS to test the PWA, but iOS does not trust self-signed keys so it did not download the icon. After that, the generation broke when I was connecting to the site with the IP and not through localhost . I noticed that submitting (pressing the generate button) redirected me which should not have happened due to the line e.preventDefault() . Then I saw Next.js attempting to connect a websocket, and a bunch of 403 errors that weren’t there before. I spent quite a bit of time debugging that, and it was due to not adding my IP to allowedDevOrigins in the next.config.mjs file despite it working perfectly fine before. The Icon As you can see, the image I decided to include in my devlog is the icon for Determinist. I actually did not think of putting the D and the E together at first, but when I did, it reminded me of a lock (hope you can see it!) and I chose to keep it as it kind of fits. And I didn’t want a solid color background, so I decided I’ll just add the name repeating. It was fun making it, and it was also a very good way to practice using Illustrator. What’s next? Making the PWA work offline Bug fixes Descriptions Preset Generator Auto Copy to Clipboard toggle
Determinist // Devlog 14 // 2026.09.06. Finally, I figured out how to make the site work offline… The process After working on the PWA for way longer than I expected, it finally works as intended! After I’ve figured out how to use next-pwa , I encountered an issue: the site was being cached and loaded correctly in the browser but not when installed as a PWA. I rewrote multiple parts of the code for it to work, yet it did not. In the end, it was the unsecured connections that were at fault. Discovering that, I have learned to use something new again: Localtunnel, which allows me to use a valid (not self-signed) HTTPS connection while testing. This uncovered even more issues with my code, the most obvious being the fact that fonts were not cached at all. This was because I was getting my fonts by connecting to fonts.google.com . This was a really easy thing to fix though, as Next.js already has a next/fonts/google library that had the fonts I used, and now everything works well. What’s next? Bug fixes Descriptions Preset Generator Auto Copy to Clipboard toggle
Determinist // Devlog 15 // 2026.09.15. A few design changes, and a brand new section on the website! Design I have fixed several design issues I noticed and did not like. Just to mention a few, there was unnecessary overflow on mobile devices, the spacing was off on several elements, and the width of the file input field was also too big. The Wall of Text™ It isn’t that big to be fair, it just explains how Determinist works, split into the 3 versions of the generation algorithm. I didn’t want to copy the page I had linked in the README, so I just wrote it down again and tried wording it better. Additionally, I tried to preserve the original one page, no scroll design by placing the About section below the actual app, so you have to scroll to see it. Other changes I refactored parts of the web code as the Generator element was getting really long, above 500 lines. I moved the algorithms out to a separate importable module, and I placed it along with the python-random module into a self-explanatory modules directory. I’ve also moved generror.jsx and presethandler.jsx into their own handlers/ directory, and the two specialized input fields into an inputs/ directory. Overall, this change makes the code way easier to read. The preset generator works now as well, just click the “Export as Preset” button below “Generate”, name the preset and the preset will be downloaded for you! You can also toggle on a “Copy to Clipboard” feature which allows you to automatically copy your generated password to your clipboard. Pretty neat! What’s next? Bug fixes Auto clear password popup
Determinist // Devlog 16 // 2026.09.17. Version 1.0.0 is out, and this is my final devlog. Well, it finally arrived. Version 1.0.0. This is where active development stops. Of course, I will still fix issues and implement features suggested by you guys, but I probably won’t be adding any by myself. Stardance has been a great inspiration for me, not only to make this project, but to keep going and coming back to doing what I love: coding, and making things for others. I am very happy with how Determinist turned out, despite the difficulties and me being busy with school. But enough of this, what was changed since my last devlog? Changes Updated the documentation to show that a PWA is available to install Fixed various bugs and style inconsistencies Added a description of the generation process to the website Added a Copy to Clipboard toggle Added an Export as Preset button Removed Google Fonts connections What’s next? Nothing. I’d like to thank everyone who had a chance to try and use Determinist. Everyone who reviewed it and even you, the one reading this devlog :) Y’all have showed me that things I make can and are useful for others. See you in the next Hack Club program!
Ships:
Determinist is a password generator made for people who often forget or leave passwords behind, just like me. A few years ago I was on vacation when I wanted to log into a website. However, the password for it was left at home on my PC, which I didn’t bring with myself. Of course, I could’ve just reset the password, but that would’ve been worse since I’d still have mismatched passwords. Determinist solves that. It uses a deterministic algorithm to take your inputs, and generate you a password you can recover anytime, anywhere. The only thing you need to remember is your master passphrase, which site you want to log in, and a few additional settings. (presets coming soon!) I had a lot of fun with this project, and it taught me quite a bit about encryption, randomness, and most importantly how a real-world project functions. (I do have to mention my initial struggle with Typer though, I would not want to wish that on my worst enemy.) With that being said, I hope you’ll have your password problems solved, and that you’ll enjoy using Determinist! Have fun!
Well, it’s official: Determinist now has a website! Features: Easy to use interface Straightforward settings 1:1 compatibility with the CLI Fully client-side The only thing that hasn’t made it into the website (yet) is the preset system, just like with the CLI, I’m adding that later as the web UI is already really easy to use. And now the less technical bit… It’s been an incredible journey, Determinist has been my dream project for a few years now, and it’s really amazing how I can share it with the world now that it’s done. Just to mention a few things I learned from this project: Testing Proper git usage Cryptography JavaScript These are things I wouldn’t really have learned without Determinist. Sure, I could have done so, but not this fast and effectively. I must thank those who supported the project, who liked the devlogs, and of course the reviewers who gave their opinion on the CLI. Because of your feedback, I made Determinist even easier to use now, and I will continue doing so. Version 3 of the algorithm is on its way, as well as the preset system for the web. Thank you everyone!
Determinist Determinist is a deterministic password generator that lets you recover forgotten passwords easily, given that you remember a master password, and a few things about your lost password. Features CLI and Web interface, featuring a PWA that also works offline Three algorithm versions to choose from A preset system Generated passwords are identical on both the website and the CLI Fully local generation Presets The presets use the TOML format, which is very user-friendly and easy to edit. The presets have multiple categories inside them like ‘general’ (for the algorithm version and password length), ‘preset’ (the preset name, description and whether it is set as defaul), and version specific ones like ‘v3’, which has the settings for the v3 algorithm. If you’re unsure how to edit preset files, you can also just export your settings from the website, and use it across all versions of Determinist! To Reviewers Please, test both the CLI and the website (if possible), and provide feedback on User Experience if you encountered any issues, include that in the review. You can even suggest features, and I may implement them :) Thank you!...
|
1792304412.9257355
|
1793168412.9257355
|
|
52082
|
GCL - Game Cartridge Launcher by @dylz | Stardance
|
dylz
|
0
|
47.89
|
0
|
[]
|
[{"post_id": 80259, "ts": "202 [{"post_id": 80259, "ts": "2026-10-16T23:47:29Z", "hours": 10.5383, "text": "Backend work Alright, it’s been a while since I’ve worked on this, and coming back I realize that I knew so little about any of how drives, media, filesystems, and all that works. So, I’m going to give a quick synopsis of all I’ve learned (keep in mind, this all applies to LINUX ONLY since that’s what I’m on, the app will come to windows eventually but for the time being I’m not worrying about it): Storage devices are where your computer stores data for storage. One physical device (i.e. a thumb drive) corresponds to one drive , although some physical devices can have multiple drives. These drives are split into BlockDevices, so one drive can have many Block Devices . Block devices can have one or none filesystems; keep in mind there isn’t one universal filesystem that everybody agreed to use so we could all be happy; you’re gonna have to deal with FAT32, NTFS, ext4, exfat and btrfs at a minimum. Now, those filesystems aren’t immediately accessible; they need to be mounted , which esentially means just putting it somewhere in another filesystem on your computer, probably the main one, like your HDD/SSD. A single blockdevice can have many mount points, each with different permissions; one might have NOEXEC permissions so you can’t launch a game from there, another might have RO so you can’t write anything to it. Keep in mind, these permissions are completely separate from file and directory permissions; those are a whole ’nother can of worms. Basically, Physical Device -> Drive[] , Drive -> BlockDevice[] , BlockDevice -> Filesystem? , Filesystem -> (MountPath, Permissions)[] . That’s the really really really big oversimplification but yeah. If you read to here, hopefully you know understand my pain; I commend your patience."}, {"post_id": 61864, "ts": "2026-09-05T00:06:37Z", "hours": 12.6272, "text": "New UI, massively improved backend API To be honest basically all of this devlog was backend, but I’m really happy with how it is now! The time I’ve spent learning rust (there’s a lot of stuff lol) paid off and now I can easily expand the format and add new features whenever I please! For stuff that you can actually see, here’s a new concept UI I made. I’m not at all a designer and I deliberately made this project backend/API focused so that better designers than me could be the ones making actually nice looking apps, but i’m pretty happy with how it looks right now! The last major feature I need to add is animated banners. Unfortunately, there aren’t really any great formats for this, but I’m planning on expirementing with Lottie as it seems like the closest option to what I want. There’ll still be video and static image support, of course, but animated banners are objectively way cooler. Anyways, yeah that’s what I’m gonna focus on next devlog. After that, I’ll do a round of polishing but that should be the first version (call it alpha maybe?) of the app finished! Very happy with the progress :) (see app and json schema preview below)"}, {"post_id": 56892, "ts": "2026-08-28T21:49:32Z", "hours": 14.8028, "text": "an actually good demo next devlog i promise Ok the reason this count is so high is because I spent a diabolical amount of time researching, practicing and learning a bunch of new things. I had never done asynchronous or concurrency before, and now I’m slightly ok at it!!! yippee!! Anyways, under the hood we use events (via UDisks2 and d-bus which was a whole other can of worms) now instead of lsblk to detect when a usb goes in and out so that’ll be a lot more responsive. On that note, I still gotta code windows support (I’m on linux) but I think windows, just by nature of not being linux and having 20 billion different ways to do everything will be a lot easier. mac also exists but uhh erm idk i don’t really wanna do allat (picture is some random ahh code cuz i have no new ui in the slightest lol)"}, {"post_id": 52603, "ts": "2026-08-22T20:08:05Z", "hours": 9.9239, "text": "tbh the majority of these hours have been learning rust, so i’m just gonna explain the project: I’m trying to make a standardized format + launcher for physical pc games . the idea is you’ll just be able to plug in a usb, it’ll get detected and you can click a button to run the game! I also want it to have support for animated banners, metadata, all that stuff. Basically just think like how the wii did it lol anyways next log hopefully i’ll have some gui, even if its just a test. cyall then img is the tentative format"}]...
|
Title: GCL - Game Cartridge Launcher by @dylz | St Title: GCL - Game Cartridge Launcher by @dylz | Stardance
Devlogs:
tbh the majority of these hours have been learning rust, so i’m just gonna explain the project: I’m trying to make a standardized format + launcher for physical pc games . the idea is you’ll just be able to plug in a usb, it’ll get detected and you can click a button to run the game! I also want it to have support for animated banners, metadata, all that stuff. Basically just think like how the wii did it lol anyways next log hopefully i’ll have some gui, even if its just a test. cyall then img is the tentative format
an actually good demo next devlog i promise Ok the reason this count is so high is because I spent a diabolical amount of time researching, practicing and learning a bunch of new things. I had never done asynchronous or concurrency before, and now I’m slightly ok at it!!! yippee!! Anyways, under the hood we use events (via UDisks2 and d-bus which was a whole other can of worms) now instead of lsblk to detect when a usb goes in and out so that’ll be a lot more responsive. On that note, I still gotta code windows support (I’m on linux) but I think windows, just by nature of not being linux and having 20 billion different ways to do everything will be a lot easier. mac also exists but uhh erm idk i don’t really wanna do allat (picture is some random ahh code cuz i have no new ui in the slightest lol)
New UI, massively improved backend API To be honest basically all of this devlog was backend, but I’m really happy with how it is now! The time I’ve spent learning rust (there’s a lot of stuff lol) paid off and now I can easily expand the format and add new features whenever I please! For stuff that you can actually see, here’s a new concept UI I made. I’m not at all a designer and I deliberately made this project backend/API focused so that better designers than me could be the ones making actually nice looking apps, but i’m pretty happy with how it looks right now! The last major feature I need to add is animated banners. Unfortunately, there aren’t really any great formats for this, but I’m planning on expirementing with Lottie as it seems like the closest option to what I want. There’ll still be video and static image support, of course, but animated banners are objectively way cooler. Anyways, yeah that’s what I’m gonna focus on next devlog. After that, I’ll do a round of polishing but that should be the first version (call it alpha maybe?) of the app finished! Very happy with the progress :) (see app and json schema preview below)
Backend work Alright, it’s been a while since I’ve worked on this, and coming back I realize that I knew so little about any of how drives, media, filesystems, and all that works. So, I’m going to give a quick synopsis of all I’ve learned (keep in mind, this all applies to LINUX ONLY since that’s what I’m on, the app will come to windows eventually but for the time being I’m not worrying about it): Storage devices are where your computer stores data for storage. One physical device (i.e. a thumb drive) corresponds to one drive , although some physical devices can have multiple drives. These drives are split into BlockDevices, so one drive can have many Block Devices . Block devices can have one or none filesystems; keep in mind there isn’t one universal filesystem that everybody agreed to use so we could all be happy; you’re gonna have to deal with FAT32, NTFS, ext4, exfat and btrfs at a minimum. Now, those filesystems aren’t immediately accessible; they need to be mounted , which esentially means just putting it somewhere in another filesystem on your computer, probably the main one, like your HDD/SSD. A single blockdevice can have many mount points, each with different permissions; one might have NOEXEC permissions so you can’t launch a game from there, another might have RO so you can’t write anything to it. Keep in mind, these permissions are completely separate from file and directory permissions; those are a whole ’nother can of worms. Basically, Physical Device -> Drive[] , Drive -> BlockDevice[] , BlockDevice -> Filesystem? , Filesystem -> (MountPath, Permissions)[] . That’s the really really really big oversimplification but yeah. If you read to here, hopefully you know understand my pain; I commend your patience....
|
1792695063.4179816
|
1793299863.4179816
|
|
45265
|
(TVC) Rocket by @advay_chatriki | Stardance
|
advay_chatriki
|
0
|
42.4
|
0
|
[]
|
[{"post_id": 80261, "ts": "202 [{"post_id": 80261, "ts": "2026-10-16T23:57:27Z", "hours": 5.9467, "text": "Created footprints for each part, got started routing"}, {"post_id": 78935, "ts": "2026-10-12T02:51:08Z", "hours": 1.5669, "text": "Made some tweaks to the TVC and make the mount to fit ID of the body and maybe this week we will have everything done with the electronics and hardware and will start to order parts!!! And also I have not been made a devlog in sometime because school is lowk cooked but will keep it updated and hopefully have a ROCKETTTTTT bueeee."}, {"post_id": 78877, "ts": "2026-10-11T20:57:30Z", "hours": 0.3333, "text": "Added the power from the schematic onto the PCB CAD"}, {"post_id": 73789, "ts": "2026-09-26T00:16:49Z", "hours": 2.5344, "text": "Today I worked on fixing minor issues, as a comment on the last post said, and added the rod holes for the servo rods to sit in, and also made some small fixes to the schematic but I was more focused on TVC today."}, {"post_id": 73335, "ts": "2026-09-24T22:07:28Z", "hours": 2.2008, "text": "Finished V2 of the TVC with all of the errors fixed and it looks more fun tbh but I anyways I did optimize it for the new servos we are using and also fixed the pitch and yaw which were kind of goofy on the last one. But thankfully, this one has no errors and might start to print it in some time."}, {"post_id": 71978, "ts": "2026-09-21T21:48:22Z", "hours": 5.9264, "text": "Today, I rebuilt the TVC because the last TVC had major issues where the pitch and yaw were not moving correctly, so I redid the whole thing, where this is the bottom part of the TVC. Also fixed some errors on the eeschema including issues with polarity, footprints, component values, power reg, and logic, the continuation of this should ensure that the PCB routing process remains easy."}, {"post_id": 68882, "ts": "2026-09-15T23:02:14Z", "hours": 2.5525, "text": "Finished the schematic, learned a lot in the process, ESP32, MicroSD, ICM42688, BMP280, Power, GND, USBC, UART(conversion), Pyro Firing, and Servo circuits are complete, after a short review period will be ready for quick layout and manufacturer sendoff!"}, {"post_id": 67012, "ts": "2026-09-13T01:39:13Z", "hours": 1.2656, "text": "Made a compartment for the PCB to lay in"}, {"post_id": 66239, "ts": "2026-09-11T23:04:03Z", "hours": 3.4833, "text": "Made the fins, made some changes to the inner body, finished the servo power circuit, and started the SD logging circuit."}, {"post_id": 63918, "ts": "2026-09-07T23:23:32Z", "hours": 2.3406, "text": "Wsp guys had a break in the middle because school lowk started :( but I am back at it and today I made the body and Nosecone and assembled it on CAD and added it to the TVC as well"}, {"post_id": 53441, "ts": "2026-08-24T00:05:14Z", "hours": 3.1172, "text": "Started working on the wiring for the connections to the servos so they can actually do TVC work, chose 20kgcm servos for this, supplied by a 2S LiPo battery, also redid the layout on the schematic(which is close to being finished!)"}, {"post_id": 53337, "ts": "2026-08-23T20:29:46Z", "hours": 0.4667, "text": "Fully finished the TVC! and made some holes in it to save weight."}, {"post_id": 53309, "ts": "2026-08-23T19:38:35Z", "hours": 1.2194, "text": "I finished the Pyro Firing Channel(parachute ejection circuit) in the schematic, now for the servo connectors and GPS and the schematic is finished!"}, {"post_id": 50699, "ts": "2026-08-20T00:56:12Z", "hours": 1.5336, "text": "Today I simulated the rocket’s altitude, velocity, and acceleration curves. First, I used regression in Desmos in order to find a fitting polynomial curve for the thrust. After that, I factored in gravity and drag to make an ODE(Riccati differential equation) for the acceleration. Since Desmos is quite slow with numerical integration, I opted to create a python script instead and use matplotlib to graph all the curves, yielding this visual and a calculated apogee of 268.65 meters at 7.66 seconds!"}, {"post_id": 50617, "ts": "2026-08-19T20:56:15Z", "hours": 1.1667, "text": "Started to make the bottom of TVC"}, {"post_id": 48616, "ts": "2026-08-17T02:37:16Z", "hours": 1.6503, "text": "Started wiring the pyro channels for rocket parachute ejection"}, {"post_id": 47132, "ts": "2026-08-14T20:06:03Z", "hours": 1.1667, "text": "Finished CAD for first servo mount"}, {"post_id": 45995, "ts": "2026-08-12T20:43:36Z", "hours": 0.3667, "text": "Started to build the TVC mount for the rocket"}, {"post_id": 45199, "ts": "2026-08-11T14:58:33Z", "hours": 0.8667, "text": "Finished wiring the BMP280 as I2C"}, {"post_id": 44824, "ts": "2026-08-10T21:01:22Z", "hours": 0.6025, "text": "Added more stuff for the schematic(incomplete)"}, {"post_id": 44801, "ts": "2026-08-10T20:22:28Z", "hours": 0.9344, "text": "Fixed naming conventions on net labels and fixed a few wiring issues here and there."}, {"post_id": 42971, "ts": "2026-08-07T23:34:22Z", "hours": 1.1556, "text": "Cleaned up the wiring on my (incomplete) schematic for the PCB which will house the flight computer and sensors"}]...
|
Title: (TVC) Rocket by @advay_chatriki | Stardance Title: (TVC) Rocket by @advay_chatriki | Stardance
Devlogs:
Cleaned up the wiring on my (incomplete) schematic for the PCB which will house the flight computer and sensors
Fixed naming conventions on net labels and fixed a few wiring issues here and there.
Added more stuff for the schematic(incomplete)
Finished wiring the BMP280 as I2C
Started to build the TVC mount for the rocket
Finished CAD for first servo mount
Started wiring the pyro channels for rocket parachute ejection
Started to make the bottom of TVC
Today I simulated the rocket’s altitude, velocity, and acceleration curves. First, I used regression in Desmos in order to find a fitting polynomial curve for the thrust. After that, I factored in gravity and drag to make an ODE(Riccati differential equation) for the acceleration. Since Desmos is quite slow with numerical integration, I opted to create a python script instead and use matplotlib to graph all the curves, yielding this visual and a calculated apogee of 268.65 meters at 7.66 seconds!
I finished the Pyro Firing Channel(parachute ejection circuit) in the schematic, now for the servo connectors and GPS and the schematic is finished!
Fully finished the TVC! and made some holes in it to save weight.
Started working on the wiring for the connections to the servos so they can actually do TVC work, chose 20kgcm servos for this, supplied by a 2S LiPo battery, also redid the layout on the schematic(which is close to being finished!)
Wsp guys had a break in the middle because school lowk started :( but I am back at it and today I made the body and Nosecone and assembled it on CAD and added it to the TVC as well
Made the fins, made some changes to the inner body, finished the servo power circuit, and started the SD logging circuit.
Made a compartment for the PCB to lay in
Finished the schematic, learned a lot in the process, ESP32, MicroSD, ICM42688, BMP280, Power, GND, USBC, UART(conversion), Pyro Firing, and Servo circuits are complete, after a short review period will be ready for quick layout and manufacturer sendoff!
Today, I rebuilt the TVC because the last TVC had major issues where the pitch and yaw were not moving correctly, so I redid the whole thing, where this is the bottom part of the TVC. Also fixed some errors on the eeschema including issues with polarity, footprints, component values, power reg, and logic, the continuation of this should ensure that the PCB routing process remains easy.
Finished V2 of the TVC with all of the errors fixed and it looks more fun tbh but I anyways I did optimize it for the new servos we are using and also fixed the pitch and yaw which were kind of goofy on the last one. But thankfully, this one has no errors and might start to print it in some time.
Today I worked on fixing minor issues, as a comment on the last post said, and added the rod holes for the servo rods to sit in, and also made some small fixes to the schematic but I was more focused on TVC today.
Added the power from the schematic onto the PCB CAD
Made some tweaks to the TVC and make the mount to fit ID of the body and maybe this week we will have everything done with the electronics and hardware and will start to order parts!!! And also I have not been made a devlog in sometime because school is lowk cooked but will keep it updated and hopefully have a ROCKETTTTTT bueeee.
Created footprints for each part, got started routing...
|
1792619331.0495994
|
1793224131.0495994
|
|
30695
|
DraftONE by @saharshn | Stardance
|
saharshn
|
0
|
65.66
|
0
|
[]
|
[{"post_id": 80263, "ts": "202 [{"post_id": 80263, "ts": "2026-10-17T00:19:00Z", "hours": 3.9808, "text": "Devlog 15: ALMOST THERE WOOOO made final assembly! made a cool render! Started BOM! so my goal is to get this out by the 20th or 21st, and this is becoming slowly more in reach! cant wait to cross this final stretch!"}, {"post_id": 64495, "ts": "2026-09-08T22:40:40Z", "hours": 17.5486, "text": "Devlog #14: Introducing VKTR so as you can see i did forget to devlog its alr tho i got some INSANE changes watch out Introducing VKTR: it is probably one of the coolest toolheads I have made. Packaging and form factor inspired by the A4T, and front plate styling inspired by the Stealthburner. Utilizes a Wristwatch v3 BMG extruder, and a Bambu Labs P1s Hotend for cost purposes. has two 4010 Blower fans for part cooling, 2510 Intake fan, and 3007 Exhaust fan. The name is inspired by the vectoring i had to use for my ducting but somehow i accidentally put a K instead of a C but didnt notice??? still sounds cool asf tho The entire gantry is reworked to make this voron-compatible and to make this workable with voron toolheads. this allows me to not only use the toolheads I make, but rather the ones anyone in the voron community makes to work on this new V2 Frame with V2 Bed! 220 220 195 total volume, and now its considerable more stable and cleaner looking (with extra space for rgb!!!) as of right now, the entire motion system should be done!!! time for enclosure and elec spacing, and we can actually build this!!!"}, {"post_id": 46114, "ts": "2026-08-13T03:28:20Z", "hours": 4.7422, "text": "Devlog #13: Restructuring I realized I’ve gone about this a completely wrong way. I’ve been overcomplicating this gantry wayy too much, and ended up making this so much more complicated and a LOT weaker than it could be. As a result, I am re-doing the whole CoreXY Motion system!!! So what I have accomplished: all new gantry based off of lie-flat Y rails and Voron-based CoreXY rigging (belt plate sandwich between toolhead and carriage) moved toolhead to be facing forward instead of backward, frees up alot of space but makes hot-swapping toolheads alot harder so I might have to temporarily drop it. made these cool asl idler blocks that look so aura dropped rail profile by ~29.3mm vertically made a lot stronger due to aluminum plate sandwich zero cantilever design"}, {"post_id": 45159, "ts": "2026-08-11T13:58:09Z", "hours": 8.2933, "text": "Devlog #12: Frame(work) -so main thing is that ive been out of town for some time so im lwk just doing work whenever possible, so this is what im doing: motion-wise, the frame is almost done!!! its crazy how close i’m getting to being finished!!! midway through re-doing Z axis from linear rods to rails, mainly just due to ease of use. finished coreXY idler box! essentially this is just what holds 4 idlers and a single tensioned Nema17 motor for coreXY motion had to drop build size to 235 235 180mm due to issues with linear rails im buying i forgot if this was mentioned before but Z leadscrews!!! ok ill prob write more once i get back but yeah thats maily what ive done"}, {"post_id": 41106, "ts": "2026-08-05T02:56:44Z", "hours": 4.5347, "text": "Devlog #11: ANOTHER new toolhead??? overall a very productive devlog!!! so what I worked on: Introducing the DoubleDecker Toolhead, a larger, all-in-one toolhead with a direct drive extruder and bi-directional cooling done via double part cooling fans. Despite the many added features, it weiths around 240 grams, which is significantly less than the Voron Stealthburner (a reference for this toolhead). Alongside that, it uses an entirely surface-modeled duct, based off of multiple Computational Fluid Dynamics simulations. modified the sailfin even more to better suit my needs (better mounting solution, smaller packaging) and now fits very well into my packaging ik i said it alr but: the duct!!! it took me like 1-2 hours of surface modelling to get the geometries just right, but its definitely paid off (looks tuff asl, works well) ok so thats p much it for my devlog, heres my bucket list: more gantry work frame (swap 3dp for extrusion??? more corexy rigging work ok byeee"}, {"post_id": 40534, "ts": "2026-08-04T04:07:19Z", "hours": 4.3267, "text": "Devlog # 10: Packaging Headache so what i actually achieved: modified sailfin extruder with side mount for bowden setup i tried to make a direct drive toolhead (again smh) but this time actually compact and an all-rounder. The main limitation for me was the fact that the sailfin mounting holes just aren’t meant for a toolhead this small. one cool thing about this toolhead is that despite the extra direct drive extruder, its still very light, sitting at around 180 grams total. heavier than my previous sub-90 toolheads but this should be better consistency-wise and work very well with filaments like TPU and TPA. more gantry and frame work!!! in the next devlog, i’m gonna be reworking the mounting of the sailfin toolhead to fit into this better, but I’d say that this actually was a pretty locked in session."}, {"post_id": 38600, "ts": "2026-08-01T02:35:00Z", "hours": 3.1839, "text": "Devlog #9: Triple it and give it to the next person WOW. This is genuinely one of the best checkpoints im at. i did not expect to be able to get here lol so what i did: TWO new hotends!!! bolt-on hotend and carriage: essentially a carriage that ditches the heavy servo and toolchanger for a more secure screw-on changer. This means you’ll be able to push feeds and speeds higher on this, and is especially useful if you’re doing single material prints. Lightspeed hotend (get it? its light and its fast lol): if your chasing true performance this genuinely might be your best bet. it ditches the large eddy probe for a sub-90 gram carriage, meaning you’ll be able to push this to the limit. Also, the Center of Gravity is a lot closer to the gantry meaning more control. Updated gantry: so I fixed the main issue with the gantry, being pulleys in the center. If theyre in the center, it ends up being very weird belt geometry wise due to how CoreXY is rigged, and as a result, had to make the gentry idlers side-agonistic, meaning the belt path will stay perfectly parallel to the gantry. updated clamp plates: these clamp plates ACTUALLY WORK!!! ikr ts so cool"}, {"post_id": 38019, "ts": "2026-07-31T05:00:32Z", "hours": 4.3781, "text": "Devlog #8: A Big Mis-step stuff i worked on that actually works: the coreXY idler rigging for the gantry is done! looks nice basic frame packaging work done, planning out space for extruders, docking station, electronics, and coreXY hardware. so i realized wayyyy too late that for coreXY rigging i need to have the belt run parallel to the x axis 😭 i thought i could get away with angled belts but sadly i do have to redo the carriage clamps for belting also I thought up of a newer and better system to add more modularity: the actual modular system is a set of 4 corner holes you can add any tool system you want after that, meaning if your chasing performance you can do a single fixed hotend, of if you need the extra ability multicolor adds you can install the toolchanging and docking system. as a result this means im going to have to install the probe on my toolhead but it isnt too big of a deal. so yeah thats pretty much it for today!!!"}, {"post_id": 37269, "ts": "2026-07-29T20:59:06Z", "hours": 3.1169, "text": "Devlog #7: Unpowered Gantry and a smaller toolhead so so far, all I’ve done is shorten the toolhead, and made a gantry structure wise. One main thing I need to do later is actually add corexy hardware but trust we’re getting there. Alongside the gantry work, i shortened the toolhead by approx ~20mm and brought it significantly closer to the carriage to reduce the amount of forces on it as a result of it being so far. for both of these i do need to work on adding the coreXY rigging, but thats something i can work on later so im not too worried about it."}, {"post_id": 36577, "ts": "2026-07-28T19:46:25Z", "hours": 2.2803, "text": "Devlog #6: what is a toolhead so basically although this is somewhat of a smaller devlog time-wise, i got my whole toolhead plus swapping mechanism done!!! so how it works: there is a SWYFT Micro servo in the actual carriage with a servo arm that latches onto the toolhead 3 low profile socket head cap screws act as pins to prevent any angular movements (one in each corner for 3/4 corners) some cool nerd tech specs: toolhead projected to be approx ~ 90 g, lighter than most vorons uses BIQU Eddy Probe for quick Z-probing overall carriage weight projected to be under 140g so yeah cant wait to do more!!! see yall next one"}, {"post_id": 36196, "ts": "2026-07-28T03:59:32Z", "hours": 2.5631, "text": "Devlog #5: An actually Productive Devlog??? So i re-did the whole extruder assemble and it looks so nice now!!! probably the smallest its gonna be has a blower fan for cooling the print layer (just like many modern bambus/vorons) WITH DUCTING!!! not pictured: mounting hardware in the back onto aura carriage Bowden Pneumatic Push-to-connect M6 Fittings so basically i re-did this to be as small and lightweight as possible, and as a result i got it to look SUPER cool, and looks so nice and almost like an actually good printer!!! On the latch/toolchange mechanism: this has gone past multiple modifications over the past hour. Initially, I thought it would be best to have a whole hub that uses clips to latch onto the carriage, but i ended up settling with just using a single servo arm to hold the latching and adding stability screws so it should (keyword: should) be precise enough to not add any slop. ok first nice productive devlog in some time, time to get some rest!!!"}, {"post_id": 35900, "ts": "2026-07-27T17:01:56Z", "hours": 1.7203, "text": "DEVLOG #4: Am I going the wrong way??? So I spent some time today working on a toolhead, but realized I might be doing this wrong. This is originally for a stock hotend setup that is larger so that it ends up being the same size as a larger direct drive hotend for more sensitive filaments such as TPU. But i realized, i might just be thinking about this the wrong way… Instead of making a direct drive extruder thats larger and heavier, what if I just use a bowden extruder (like all my other extruders on this printer) thats a lot more sensitive and conservative performance wise for TPU instead of a direct drive extruder. Alongside this, I cant just use a standard extruder because it would end up causing the TPU to bind, meaning I’m going to have to design a custom spring loaded extruder. I might also use the same extruders for my other extruders due to how much better a spring loaded extruder is compared to a fixed extruder, despite the added complexity."}, {"post_id": 35574, "ts": "2026-07-27T03:24:43Z", "hours": 1.1281, "text": "after a break, I decided it’d be better for me to just let go of the double hotend idea. the main thing is that it just overcomplicates the idea wayyyy too much and ends up just being worse: the main ideology behind the double hotend tool was so that I can print supports with a larger .8mm nozzle, speeding up print times due to higher flow and taller layer heights. what I didnt realize was that if I did do this, it would be extremely messy with dual nozzles as theres a high chance the secondary nozzle would just hit the newly printed layers on a large enough part. Also, I wouldnt be able to take the taller layers to my advantage due to the fact that theres a .4mm nozzle that physically cant do those tall layer heights and it ends up becoming too messy, pretty much just handicapping the performance of the .8mm nozzle The new idea: just have a seperate high flow toolhead with a .8mm nozzle thats just as light as a single toolhead, which can take advantage of the higher print speed and the taller layer heights To replace the double hotend tool, I came up with the idea for another toolhead: so basically my current toolheads use a bowden tube extruder, which essentially is having the actual extruder part of the toolhead somewhere on the printer frame, and it feeds filament from there into the hotend. It saves alot of weight, but ends up being worse for some filaments (like TPU) which bind very easily and cause issues with a bowden setup (which is why tpu doesnt work well on the AMS!). The idea is having a heavier toolhead which has the main purpose of using a Direct Drive extrusion setup, using a Nema17 Stepper sitting on the actual toolhead, and unlike the bowden setup that “pushes” filament and causes binding, this “pulls” in filament and reduces binding risk. the extra weight means I wont be able to print as fast, but means that it’d be compatible with filaments sensitive to binding up such as TPU. ik this is a yap session, sorry to the reviewers that have to read this in advance!!! I have also attached my base level airflow diagram for the single nozzle setup because you guys deserve more data :) The extra space for the outtake fan also acts as a ledge to mount the Nema17 Stepper motor for the direct drive toolhead (im trying to keep everything the same size to help uniformity when i make the toolchanger.) (also disclaimer the ai response was edited i wish google gemini could be this blunt)"}, {"post_id": 35451, "ts": "2026-07-26T21:26:57Z", "hours": 3.0669, "text": "after some onshape work, I have a normal looking printbed! its inspired by the triple lead screw beds found on many coreXY printers, and based on an equilateral triangle for better triangulation for printbed leveling."}, {"post_id": 33068, "ts": "2026-07-22T17:17:32Z", "hours": 0.8003, "text": "the idea of a modular 3d printer: so I was bored and thought, “what if i could make a 3d printer that has dual hotends for faster printing and better supports, but then also a toolchanger so i can swap it to a lighter single hotend, or even potentially a router endmill? so my main goal from this devlog was to capture the planning I’ve done with choosing materials for the gantry, movement, and the extrusion system. only the electronigc to go and I can get CAD started!"}]...
|
Title: DraftONE by @saharshn | Stardance
Devlogs: Title: DraftONE by @saharshn | Stardance
Devlogs:
the idea of a modular 3d printer: so I was bored and thought, “what if i could make a 3d printer that has dual hotends for faster printing and better supports, but then also a toolchanger so i can swap it to a lighter single hotend, or even potentially a router endmill? so my main goal from this devlog was to capture the planning I’ve done with choosing materials for the gantry, movement, and the extrusion system. only the electronigc to go and I can get CAD started!
after some onshape work, I have a normal looking printbed! its inspired by the triple lead screw beds found on many coreXY printers, and based on an equilateral triangle for better triangulation for printbed leveling.
after a break, I decided it’d be better for me to just let go of the double hotend idea. the main thing is that it just overcomplicates the idea wayyyy too much and ends up just being worse: the main ideology behind the double hotend tool was so that I can print supports with a larger .8mm nozzle, speeding up print times due to higher flow and taller layer heights. what I didnt realize was that if I did do this, it would be extremely messy with dual nozzles as theres a high chance the secondary nozzle would just hit the newly printed layers on a large enough part. Also, I wouldnt be able to take the taller layers to my advantage due to the fact that theres a .4mm nozzle that physically cant do those tall layer heights and it ends up becoming too messy, pretty much just handicapping the performance of the .8mm nozzle The new idea: just have a seperate high flow toolhead with a .8mm nozzle thats just as light as a single toolhead, which can take advantage of the higher print speed and the taller layer heights To replace the double hotend tool, I came up with the idea for another toolhead: so basically my current toolheads use a bowden tube extruder, which essentially is having the actual extruder part of the toolhead somewhere on the printer frame, and it feeds filament from there into the hotend. It saves alot of weight, but ends up being worse for some filaments (like TPU) which bind very easily and cause issues with a bowden setup (which is why tpu doesnt work well on the AMS!). The idea is having a heavier toolhead which has the main purpose of using a Direct Drive extrusion setup, using a Nema17 Stepper sitting on the actual toolhead, and unlike the bowden setup that “pushes” filament and causes binding, this “pulls” in filament and reduces binding risk. the extra weight means I wont be able to print as fast, but means that it’d be compatible with filaments sensitive to binding up such as TPU. ik this is a yap session, sorry to the reviewers that have to read this in advance!!! I have also attached my base level airflow diagram for the single nozzle setup because you guys deserve more data :) The extra space for the outtake fan also acts as a ledge to mount the Nema17 Stepper motor for the direct drive toolhead (im trying to keep everything the same size to help uniformity when i make the toolchanger.) (also disclaimer the ai response was edited i wish google gemini could be this blunt)
DEVLOG #4: Am I going the wrong way??? So I spent some time today working on a toolhead, but realized I might be doing this wrong. This is originally for a stock hotend setup that is larger so that it ends up being the same size as a larger direct drive hotend for more sensitive filaments such as TPU. But i realized, i might just be thinking about this the wrong way… Instead of making a direct drive extruder thats larger and heavier, what if I just use a bowden extruder (like all my other extruders on this printer) thats a lot more sensitive and conservative performance wise for TPU instead of a direct drive extruder. Alongside this, I cant just use a standard extruder because it would end up causing the TPU to bind, meaning I’m going to have to design a custom spring loaded extruder. I might also use the same extruders for my other extruders due to how much better a spring loaded extruder is compared to a fixed extruder, despite the added complexity.
Devlog #5: An actually Productive Devlog??? So i re-did the whole extruder assemble and it looks so nice now!!! probably the smallest its gonna be has a blower fan for cooling the print layer (just like many modern bambus/vorons) WITH DUCTING!!! not pictured: mounting hardware in the back onto aura carriage Bowden Pneumatic Push-to-connect M6 Fittings so basically i re-did this to be as small and lightweight as possible, and as a result i got it to look SUPER cool, and looks so nice and almost like an actually good printer!!! On the latch/toolchange mechanism: this has gone past multiple modifications over the past hour. Initially, I thought it would be best to have a whole hub that uses clips to latch onto the carriage, but i ended up settling with just using a single servo arm to hold the latching and adding stability screws so it should (keyword: should) be precise enough to not add any slop. ok first nice productive devlog in some time, time to get some rest!!!
Devlog #6: what is a toolhead so basically although this is somewhat of a smaller devlog time-wise, i got my whole toolhead plus swapping mechanism done!!! so how it works: there is a SWYFT Micro servo in the actual carriage with a servo arm that latches onto the toolhead 3 low profile socket head cap screws act as pins to prevent any angular movements (one in each corner for 3/4 corners) some cool nerd tech specs: toolhead projected to be approx ~ 90 g, lighter than most vorons uses BIQU Eddy Probe for quick Z-probing overall carriage weight projected to be under 140g so yeah cant wait to do more!!! see yall next one
Devlog #7: Unpowered Gantry and a smaller toolhead so so far, all I’ve done is shorten the toolhead, and made a gantry structure wise. One main thing I need to do later is actually add corexy hardware but trust we’re getting there. Alongside the gantry work, i shortened the toolhead by approx ~20mm and brought it significantly closer to the carriage to reduce the amount of forces on it as a result of it being so far. for both of these i do need to work on adding the coreXY rigging, but thats something i can work on later so im not too worried about it.
Devlog #8: A Big Mis-step stuff i worked on that actually works: the coreXY idler rigging for the gantry is done! looks nice basic frame packaging work done, planning out space for extruders, docking station, electronics, and coreXY hardware. so i realized wayyyy too late that for coreXY rigging i need to have the belt run parallel to the x axis 😭 i thought i could get away with angled belts but sadly i do have to redo the carriage clamps for belting also I thought up of a newer and better system to add more modularity: the actual modular system is a set of 4 corner holes you can add any tool system you want after that, meaning if your chasing performance you can do a single fixed hotend, of if you need the extra ability multicolor adds you can install the toolchanging and docking system. as a result this means im going to have to install the probe on my toolhead but it isnt too big of a deal. so yeah thats pretty much it for today!!!
Devlog #9: Triple it and give it to the next person WOW. This is genuinely one of the best checkpoints im at. i did not expect to be able to get here lol so what i did: TWO new hotends!!! bolt-on hotend and carriage: essentially a carriage that ditches the heavy servo and toolchanger for a more secure screw-on changer. This means you’ll be able to push feeds and speeds higher on this, and is especially useful if you’re doing single material prints. Lightspeed hotend (get it? its light and its fast lol): if your chasing true performance this genuinely might be your best bet. it ditches the large eddy probe for a sub-90 gram carriage, meaning you’ll be able to push this to the limit. Also, the Center of Gravity is a lot closer to the gantry meaning more control. Updated gantry: so I fixed the main issue with the gantry, being pulleys in the center. If theyre in the center, it ends up being very weird belt geometry wise due to how CoreXY is rigged, and as a result, had to make the gentry idlers side-agonistic, meaning the belt path will stay perfectly parallel to the gantry. updated clamp plates: these clamp plates ACTUALLY WORK!!! ikr ts so cool
Devlog # 10: Packaging Headache so what i actually achieved: modified sailfin extruder with side mount for bowden setup i tried to make a direct drive toolhead (again smh) but this time actually compact and an all-rounder. The main limitation for me was the fact that the sailfin mounting holes just aren’t meant for a toolhead this small. one cool thing about this toolhead is that despite the extra direct drive extruder, its still very light, sitting at around 180 grams total. heavier than my previous sub-90 toolheads but this should be better consistency-wise and work very well with filaments like TPU and TPA. more gantry and frame work!!! in the next devlog, i’m gonna be reworking the mounting of the sailfin toolhead to fit into this better, but I’d say that this actually was a pretty locked in session.
Devlog #11: ANOTHER new toolhead??? overall a very productive devlog!!! so what I worked on: Introducing the DoubleDecker Toolhead, a larger, all-in-one toolhead with a direct drive extruder and bi-directional cooling done via double part cooling fans. Despite the many added features, it weiths around 240 grams, which is significantly less than the Voron Stealthburner (a reference for this toolhead). Alongside that, it uses an entirely surface-modeled duct, based off of multiple Computational Fluid Dynamics simulations. modified the sailfin even more to better suit my needs (better mounting solution, smaller packaging) and now fits very well into my packaging ik i said it alr but: the duct!!! it took me like 1-2 hours of surface modelling to get the geometries just right, but its definitely paid off (looks tuff asl, works well) ok so thats p much it for my devlog, heres my bucket list: more gantry work frame (swap 3dp for extrusion??? more corexy rigging work ok byeee
Devlog #12: Frame(work) -so main thing is that ive been out of town for some time so im lwk just doing work whenever possible, so this is what im doing: motion-wise, the frame is almost done!!! its crazy how close i’m getting to being finished!!! midway through re-doing Z axis from linear rods to rails, mainly just due to ease of use. finished coreXY idler box! essentially this is just what holds 4 idlers and a single tensioned Nema17 motor for coreXY motion had to drop build size to 235 235 180mm due to issues with linear rails im buying i forgot if this was mentioned before but Z leadscrews!!! ok ill prob write more once i get back but yeah thats maily what ive done
Devlog #13: Restructuring I realized I’ve gone about this a completely wrong way. I’ve been overcomplicating this gantry wayy too much, and ended up making this so much more complicated and a LOT weaker than it could be. As a result, I am re-doing the whole CoreXY Motion system!!! So what I have accomplished: all new gantry based off of lie-flat Y rails and Voron-based CoreXY rigging (belt plate sandwich between toolhead and carriage) moved toolhead to be facing forward instead of backward, frees up alot of space but makes hot-swapping toolheads alot harder so I might have to temporarily drop it. made these cool asl idler blocks that look so aura dropped rail profile by ~29.3mm vertically made a lot stronger due to aluminum plate sandwich zero cantilever design
Devlog #14: Introducing VKTR so as you can see i did forget to devlog its alr tho i got some INSANE changes watch out Introducing VKTR: it is probably one of the coolest toolheads I have made. Packaging and form factor inspired by the A4T, and front plate styling inspired by the Stealthburner. Utilizes a Wristwatch v3 BMG extruder, and a Bambu Labs P1s Hotend for cost purposes. has two 4010 Blower fans for part cooling, 2510 Intake fan, and 3007 Exhaust fan. The name is inspired by the vectoring i had to use for my ducting but somehow i accidentally put a K instead of a C but didnt notice??? still sounds cool asf tho The entire gantry is reworked to make this voron-compatible and to make this workable with voron toolheads. this allows me to not only use the toolheads I make, but rather the ones anyone in the voron community makes to work on this new V2 Frame with V2 Bed! 220 220 195 total volume, and now its considerable more stable and cleaner looking (with extra space for rgb!!!) as of right now, the entire motion system should be done!!! time for enclosure and elec spacing, and we can actually build this!!!
Devlog 15: ALMOST THERE WOOOO made final assembly! made a cool render! Started BOM! so my goal is to get this out by the 20th or 21st, and this is becoming slowly more in reach! cant wait to cross this final stretch!...
|
1792694962.9368715
|
1793299762.9368715
|
|
41357
|
Normal Golf game Multiplayer Mod by @Mr-Milky-Way Normal Golf game Multiplayer Mod by @Mr-Milky-Way | Stardance...
|
Mr-Milky-Way
|
0
|
57.65
|
0
|
[]
|
[{"post_id": 80264, "ts": "202 [{"post_id": 80264, "ts": "2026-10-17T00:33:25Z", "hours": 33.2419, "text": "NOW I KNOW THIS LOOKS BAD, BUT IT’S NOT MY FAULT ( mostly ) Ok, so my last devlog was 3 months ago, and not devloging was like 60% not my fault. Basically, I was making a lot of official bug reports for the game, do to, ya know, making a multiplayer mod. So after I posted that last devlog (like 2 weeks lol) luke asked me if I wanted to be a beta tester, and obv I said yes, part of that was that I couldn’t share anything about what will be in the game, which also means pictures, or any code for my mod (bc that might leak smt related to the game). So I just didn’t devlog, then forgot about stardance :( BUT I have a lot of cool things to show off: I spent a lot of time working on the character models, I wanted something that would fit the vibe, and after a little bit of work (and a few models) I pulled one of the videos of Luke from the files and made that the character model. I think it fits the vibe and is pretty cool. I also got the map to sync up so that if the host changes the map (like opens a gate) it also opens on the client side. That took awhile to get right and is kinda unoptimized, but it works I also added AUIDO!!! This took waayyyyy to long and it kinda jank, BUT it works, ball sounds come from that players ball, and global sounds are, well… global. Next up scoring and better other players ball trails: I added 2 scoring modes, one from Nintendo switch sports golf, and the other is just normal golf. Along with the scoreboard I also made it so that each player would have there own ball color. Oh also I did some bug fixes lol, hard to test a multiplayer mod with 1 client lmao (I have some testers now tho) also added steam overlay support so you can join them from steam overlay PICS/DEMOS Check out this crazy shot done using my multiplayer mod :) Player model A bunch of score card stuff Ball trails with player color (example)"}, {"post_id": 36838, "ts": "2026-07-29T04:53:00Z", "hours": 24.4064, "text": "Welp it happened again, Signed up for a hack club event then forgot about it till I was already past 10 hours on multiple projects Anyways, this is a mod for a unity game called Normal Golf Game by Luke Muscat (The guy that made Fruit Ninja and Jetpack Joyride). It adds multiplayer. Currently it supports 2 different frameworks (Photon Fusion and Steamworks). This is because I’m lazy i set up the whole thing to work with fusion first instead of just learning steamworks. Fusion has a free version that works with unity, but it has a 20 player limit. Steamworks is free and has no player limit, which is why it’s better. BUT normally photon fusion is easier to set up with unity, and I already know it so thats why I started with it. I learned at about the 6 hour mark that photon fusion is only easy for unity… when you are not modding. I also made the mistake of not setting up git at the start so when I swapped over to Steamworks I would have to start a git repo or just delete all of my code. So I did neither and added a Steamworks build option and a Fusion option so that I could build for both of them. (I set up a git repo at after a little while tho) Oh btw the game isn’t even out yet, I made all of this for the demo. Learning Steamworks was really easy but hindsight is 20/20 or smt ig. I even filmed a trickshot with it Pics in order Pic of Room host/Join menu pic of the shot perceptive of that trickshot i hit (Other player is visible as a cylinder) I wish I had more to show, but this is it for now If anyone has any ideas on what the player model should be I am very open to suggestions."}]...
|
Title: Normal Golf game Multiplayer Mod by @Mr-Mil Title: Normal Golf game Multiplayer Mod by @Mr-Milky-Way | Stardance
Devlogs:
Welp it happened again, Signed up for a hack club event then forgot about it till I was already past 10 hours on multiple projects Anyways, this is a mod for a unity game called Normal Golf Game by Luke Muscat (The guy that made Fruit Ninja and Jetpack Joyride). It adds multiplayer. Currently it supports 2 different frameworks (Photon Fusion and Steamworks). This is because I’m lazy i set up the whole thing to work with fusion first instead of just learning steamworks. Fusion has a free version that works with unity, but it has a 20 player limit. Steamworks is free and has no player limit, which is why it’s better. BUT normally photon fusion is easier to set up with unity, and I already know it so thats why I started with it. I learned at about the 6 hour mark that photon fusion is only easy for unity… when you are not modding. I also made the mistake of not setting up git at the start so when I swapped over to Steamworks I would have to start a git repo or just delete all of my code. So I did neither and added a Steamworks build option and a Fusion option so that I could build for both of them. (I set up a git repo at after a little while tho) Oh btw the game isn’t even out yet, I made all of this for the demo. Learning Steamworks was really easy but hindsight is 20/20 or smt ig. I even filmed a trickshot with it Pics in order Pic of Room host/Join menu pic of the shot perceptive of that trickshot i hit (Other player is visible as a cylinder) I wish I had more to show, but this is it for now If anyone has any ideas on what the player model should be I am very open to suggestions.
NOW I KNOW THIS LOOKS BAD, BUT IT’S NOT MY FAULT ( mostly ) Ok, so my last devlog was 3 months ago, and not devloging was like 60% not my fault. Basically, I was making a lot of official bug reports for the game, do to, ya know, making a multiplayer mod. So after I posted that last devlog (like 2 weeks lol) luke asked me if I wanted to be a beta tester, and obv I said yes, part of that was that I couldn’t share anything about what will be in the game, which also means pictures, or any code for my mod (bc that might leak smt related to the game). So I just didn’t devlog, then forgot about stardance :( BUT I have a lot of cool things to show off: I spent a lot of time working on the character models, I wanted something that would fit the vibe, and after a little bit of work (and a few models) I pulled one of the videos of Luke from the files and made that the character model. I think it fits the vibe and is pretty cool. I also got the map to sync up so that if the host changes the map (like opens a gate) it also opens on the client side. That took awhile to get right and is kinda unoptimized, but it works I also added AUIDO!!! This took waayyyyy to long and it kinda jank, BUT it works, ball sounds come from that players ball, and global sounds are, well… global. Next up scoring and better other players ball trails: I added 2 scoring modes, one from Nintendo switch sports golf, and the other is just normal golf. Along with the scoreboard I also made it so that each player would have there own ball color. Oh also I did some bug fixes lol, hard to test a multiplayer mod with 1 client lmao (I have some testers now tho) also added steam overlay support so you can join them from steam overlay PICS/DEMOS Check out this crazy shot done using my multiplayer mod :) Player model A bunch of score card stuff Ball trails with player color (example)...
|
1792802914.5923064
|
1793407714.5923064
|
|
70116
|
Javascript by @syedakhter | Stardance
|
syedakhter
|
1
|
2.0
|
1
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-17T01:23:32Z", "hours": 2.0, "multiplier": 1.01, "payout": 1, "blessing": "neutral", "text": "I made a website with some random JavaScript I am trying out JavaScript.", "repo": "https://github.com/8051987-eng/Javascript", "demo": "https://8051987-eng.github.io/Javascript/"}]...
|
[{"post_id": 80267, "ts": "202 [{"post_id": 80267, "ts": "2026-10-17T01:22:01Z", "hours": 2.12, "text": "I website with javascript"}]...
|
Title: Javascript by @syedakhter | Stardance
Devl Title: Javascript by @syedakhter | Stardance
Devlogs:
I website with javascript
Ships:
I made a website with some random JavaScript I am trying out JavaScript....
|
1793112858.4883344
|
1793199258.4883344
|
|
50061
|
mini maraca cracker by @Nolan-L-from-Milorad | Sta mini maraca cracker by @Nolan-L-from-Milorad | Stardance...
|
Nolan-L-from-Milorad
|
0
|
15.5
|
0
|
[]
|
[{"post_id": 80269, "ts": "202 [{"post_id": 80269, "ts": "2026-10-17T01:39:04Z", "hours": 4.19, "text": "I did a tonne of minor case work for the device and got it all buttoned up and added a power LED. . I also filmed and edited a video advertising and showing off the maraca cracker 2000 with my friend and totally did not rip off dankpods in the process by blowing up earbuds and overdriving speakers that I couldn’t lapse BECAUSE LAPSE DOESN’T WORK ON LINUX (please fix this nothing works about it I have brought this up multiple times in stardance-help in slack and I’ve gotten nothing) . NEXT: I need to pull all the documentation (that I still need to make) and files into a gitlab repo"}, {"post_id": 74738, "ts": "2026-09-28T03:07:51Z", "hours": 2.2236, "text": "After more case work we have a top for it and the best branding known to humankind MARACA CRACKER 2,000!!!!!!! I’m really happy to see this project come together as well as it has I did a majour boo-boo where I moddeled the case as if the amp was 15mm wider and on the remodel I mucked up the case’s screw holes that I now realise I really need two more of. will do more soon"}, {"post_id": 70447, "ts": "2026-09-19T06:33:51Z", "hours": 1.0833, "text": "More case work with fusion, not terribly interesting but it must be done :( The volume knob now fits and the audio input is screwed into the case as well. I’m contemplating the design for the final case too. I must first do the basic case then make it look nice once that is done I can add cool patterns, text and MARACA CRACKER 2,000!!!!! MUST MAKE DADDY DANKPODS PROUD (lol) I’ll blow up some dirtybuds in the demo video too! (or at least try)"}, {"post_id": 61955, "ts": "2026-09-05T04:22:53Z", "hours": 4.3492, "text": "I recently locked in and did a tonne (kinda forgot to post a bit) But I started designing a case in fusion 360 (FreeCad stinks) I also put screw terminals on the side with a DC barrel jack for power input (edit I put a picture in as I realized I completely forgot to add one LOL :3)"}, {"post_id": 49446, "ts": "2026-08-18T09:13:08Z", "hours": 1.4833, "text": "I’ve kept myself busy! I’ve soldered in the socket and part of the right channel, the rest of the circuit’s parts have been pushed in and I will solder them in the morning. additionally I have soldered up left / right RCA jacks and a volume knob out of two trimpots vertically mounted and attached with a board at the top. This is all going surprisingly well considering the complexity of building a dual-channel amplifier with just the datasheet’s schematic to go off of!"}, {"post_id": 49123, "ts": "2026-08-17T19:12:18Z", "hours": 2.1742, "text": "My goal for this project is to build a small high power amplifier that also doesn’t look trash and start fires. BUT STILL PLAYS SCARLET FIRE I just dropped $50 NZD at jaycar for parts for this project 💀 somehow I managed to perfectly assemble one channel just out of following the datasheet’s example schematic, I know I’m amazed too but miracles happen! attached is the schematic I was using and a picture of what I built"}]...
|
Title: mini maraca cracker by @Nolan-L-from-Milora Title: mini maraca cracker by @Nolan-L-from-Milorad | Stardance
Devlogs:
My goal for this project is to build a small high power amplifier that also doesn’t look trash and start fires. BUT STILL PLAYS SCARLET FIRE I just dropped $50 NZD at jaycar for parts for this project 💀 somehow I managed to perfectly assemble one channel just out of following the datasheet’s example schematic, I know I’m amazed too but miracles happen! attached is the schematic I was using and a picture of what I built
I’ve kept myself busy! I’ve soldered in the socket and part of the right channel, the rest of the circuit’s parts have been pushed in and I will solder them in the morning. additionally I have soldered up left / right RCA jacks and a volume knob out of two trimpots vertically mounted and attached with a board at the top. This is all going surprisingly well considering the complexity of building a dual-channel amplifier with just the datasheet’s schematic to go off of!
I recently locked in and did a tonne (kinda forgot to post a bit) But I started designing a case in fusion 360 (FreeCad stinks) I also put screw terminals on the side with a DC barrel jack for power input (edit I put a picture in as I realized I completely forgot to add one LOL :3)
More case work with fusion, not terribly interesting but it must be done :( The volume knob now fits and the audio input is screwed into the case as well. I’m contemplating the design for the final case too. I must first do the basic case then make it look nice once that is done I can add cool patterns, text and MARACA CRACKER 2,000!!!!! MUST MAKE DADDY DANKPODS PROUD (lol) I’ll blow up some dirtybuds in the demo video too! (or at least try)
After more case work we have a top for it and the best branding known to humankind MARACA CRACKER 2,000!!!!!!! I’m really happy to see this project come together as well as it has I did a majour boo-boo where I moddeled the case as if the amp was 15mm wider and on the remodel I mucked up the case’s screw holes that I now realise I really need two more of. will do more soon
I did a tonne of minor case work for the device and got it all buttoned up and added a power LED. . I also filmed and edited a video advertising and showing off the maraca cracker 2000 with my friend and totally did not rip off dankpods in the process by blowing up earbuds and overdriving speakers that I couldn’t lapse BECAUSE LAPSE DOESN’T WORK ON LINUX (please fix this nothing works about it I have brought this up multiple times in stardance-help in slack and I’ve gotten nothing) . NEXT: I need to pull all the documentation (that I still need to make) and files into a gitlab repo...
|
1792615992.361011
|
1793220792.361011
|
|
69860
|
Paper_Trading by @Ankit_7 | Stardance
|
Ankit_7
|
0
|
2.79
|
0
|
[]
|
[{"post_id": 80274, "ts": "202 [{"post_id": 80274, "ts": "2026-10-17T02:27:32Z", "hours": 2.0525, "text": "Just complete the project by making dashboard , history, leaderboard, Portfolio ."}, {"post_id": 79812, "ts": "2026-10-15T14:53:17Z", "hours": 0.7419, "text": "Making a webpage for paper trading. Login page done"}]...
|
Title: Paper_Trading by @Ankit_7 | Stardance
Devl Title: Paper_Trading by @Ankit_7 | Stardance
Devlogs:
Making a webpage for paper trading. Login page done
Just complete the project by making dashboard , history, leaderboard, Portfolio ....
|
1792878638.5642982
|
1793483438.5642982
|
|
70124
|
Novite Media Player by @robin | Stardance
|
robin
|
0
|
3.19
|
0
|
[]
|
[{"post_id": 80275, "ts": "202 [{"post_id": 80275, "ts": "2026-10-17T02:27:48Z", "hours": 3.185, "text": "NOVITE Devlog #1 Alright, so NOVITE actually works now. For anyone just joining, it’s a little media player I’m building in Python with ffmpeg and Qt. It can open any video file you throw at it and there’s a slider so you can skip around instead of watching everything from the start. That’s all it does so far, but it does it. The video wouldn’t show up This one annoyed me for a while. The file loaded fine, no errors, just a black box where the video should be. Turns out I was using “SP” when passing the frame to Qt instead of the proper format constant, and PyQt6 just quietly said no. ffmpeg was innocent the whole time, it was totally my fault. Changed one line and boom, video. An hour of my life spent blaming the wrong thing. The slider was decorative Yeah. The slider was there, it even moved with the video, but you couldn’t actually touch it. Clicking did nothing, dragging did nothing. Just a progress bar cosplaying as a slider. The reason? I forgot to hook it up to the media player’s position. That’s it. That was the whole bug. Connected it and suddenly it works like a real seek bar, click anywhere, drag it around, the works. What’s next Volume control. Should’ve been in from the start, honestly. Right now it’s loud and you just deal with it. Replay/loop button. For when you want to watch the same thing again without clicking anything. Make it not ugly. It’s very gray and default right now. I’m thinking dark theme, nicer sliders, some personality. NOVITE sounds like it should look cool, and right now it does not. That’s the update. I’ll write again once volume exists and the app stops looking like a school project."}]...
|
Title: Novite Media Player by @robin | Stardance
Title: Novite Media Player by @robin | Stardance
Devlogs:
NOVITE Devlog #1 Alright, so NOVITE actually works now. For anyone just joining, it’s a little media player I’m building in Python with ffmpeg and Qt. It can open any video file you throw at it and there’s a slider so you can skip around instead of watching everything from the start. That’s all it does so far, but it does it. The video wouldn’t show up This one annoyed me for a while. The file loaded fine, no errors, just a black box where the video should be. Turns out I was using “SP” when passing the frame to Qt instead of the proper format constant, and PyQt6 just quietly said no. ffmpeg was innocent the whole time, it was totally my fault. Changed one line and boom, video. An hour of my life spent blaming the wrong thing. The slider was decorative Yeah. The slider was there, it even moved with the video, but you couldn’t actually touch it. Clicking did nothing, dragging did nothing. Just a progress bar cosplaying as a slider. The reason? I forgot to hook it up to the media player’s position. That’s it. That was the whole bug. Connected it and suddenly it works like a real seek bar, click anywhere, drag it around, the works. What’s next Volume control. Should’ve been in from the start, honestly. Right now it’s loud and you just deal with it. Replay/loop button. For when you want to watch the same thing again without clicking anything. Make it not ugly. It’s very gray and default right now. I’m thinking dark theme, nicer sliders, some personality. NOVITE sounds like it should look cool, and right now it does not. That’s the update. I’ll write again once volume exists and the app stops looking like a school project....
|
1792958078.0642283
|
1793562878.0642283
|