|
7680
|
My awesome macropad! by @codemaster | Stardance
|
codemaster
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T11:45:31Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "For this project, I built Hackpad, a custom 3-key media macropad powered by a Seeed Studio XIAO RP2040 microcontroller and running KMK keyboard firmware. The hardware features a custom-routed PCB housed in a compact, 3D-printed enclosure that is securely assembled using durable M3 screws and brass heatset inserts. On the software side, the main challenge was optimizing the code syntax in VS Code and fine-tuning the framework’s Tap Dance module. I am most proud of maximizing efficiency by mapping six full media functions (Volume Up/Down, Mute, Play/Pause, Next, and Previous Track) onto just three physical switches, creating a highly portable, durable device that works automatically on any computer via USB-C.", "repo": "https://github.com/Yourm5m5/Hackpad-for-stardance", "demo": ""}]...
|
[{"post_id": 3437, "ts": "2026 [{"post_id": 3437, "ts": "2026-06-06T11:28:45Z", "hours": 0.3389, "text": "I have finished- been working on this for 3hr"}]...
|
Title: My awesome macropad! by @codemaster | Stard Title: My awesome macropad! by @codemaster | Stardance
Devlogs:
I have finished- been working on this for 3hr
Ships:
For this project, I built Hackpad, a custom 3-key media macropad powered by a Seeed Studio XIAO RP2040 microcontroller and running KMK keyboard firmware. The hardware features a custom-routed PCB housed in a compact, 3D-printed enclosure that is securely assembled using durable M3 screws and brass heatset inserts. On the software side, the main challenge was optimizing the code syntax in VS Code and fine-tuning the framework’s Tap Dance module. I am most proud of maximizing efficiency by mapping six full media functions (Volume Up/Down, Mute, Play/Pause, Next, and Previous Track) onto just three physical switches, creating a highly portable, durable device that works automatically on any computer via USB-C....
|
1793116051.17983
|
1793202451.17983
|
|
7684
|
Plutopad by @Eli_Mendez | Stardance
|
Eli_Mendez
|
1
|
16.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-12T08:29:11Z", "hours": 16.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Hackpad, which I named the Plutopad. This was very challenging due to the fact that I have never used KiCAD prior to this mission. I have also never worked with building firmware or even trying a “ysws” program like this, so I am going in headfirst with something I enjoy very much, building “things”. My firmware works and is compiliable but it is baseline it can still be configure and the OLED screen doesn’t have any input yet; however, if this is approved I will definitely be taking a crack at this really cool thing that I built. The screenshot is of my QMK firmware finally working after about 2 hours of troubleshooting. It was a wonderful and joyous end to a project.", "repo": "https://github.com/pluto-227/Plutopad", "demo": ""}]...
|
[{"post_id": 7356, "ts": "2026 [{"post_id": 7356, "ts": "2026-06-12T08:17:01Z", "hours": 9.7436, "text": "I have finished my Plutopad and have gathered all my files and spent a very long time trying to compile my firmware to get it right. I was also doing all this in the midst of a possible tornado around me. Anyways, I was able to settle on my PCB and case and am ready to submit this project. This is my very final PCB."}, {"post_id": 6618, "ts": "2026-06-11T03:17:34Z", "hours": 1.4833, "text": "This is my new and improved PCB. I redid my schematic for safe measures and was able to finish both the PCB and schematic in this time span. Now I will move onto making my firmware and try to code it in QMK firmware to get the most out of my macropad. I am not doing the case yet because I might change my mind on the layout and don’t want to keep remaking a case. This is be my fifth iteration of this design and have learned a lot and am planning to learn more."}, {"post_id": 6578, "ts": "2026-06-11T01:41:12Z", "hours": 4.7956, "text": "I am starting all the way over. I had weighed how my workflow was going and it wasn’t going well; therefore I am starting over. I plan on making this version much better and done more efficiently. I am doing this for 3 main reasons: to be more efficient, properly organized, and better set up. This photo was of my last PCB"}, {"post_id": 3746, "ts": "2026-06-06T19:50:42Z", "hours": 0.3444, "text": "I have worked on the Schematic, PCB, and Case up to this point. A total of 23 hours has been put in due to the fact that I am brand new to making electronics and have had to search up how to do a lot (I did not know how to track my time outside of coding before this). I went through a lot of trial and error with schematics and PCBs. I went through 3 iterations of a schematic trying to see how I can optimize the number of pins I’m using while keeping 10 or 12 switches. I tried LEDs but they were causing many errors in the DRC. The LEDs were more hassle than function so i decided to go with my optimized 12 switches, OLED display, and Rotary Encoder with no switch capabilities. Below is my final interation of my PCB that was able to throw no errors."}]...
|
Title: Plutopad by @Eli_Mendez | Stardance
Devlog Title: Plutopad by @Eli_Mendez | Stardance
Devlogs:
I have worked on the Schematic, PCB, and Case up to this point. A total of 23 hours has been put in due to the fact that I am brand new to making electronics and have had to search up how to do a lot (I did not know how to track my time outside of coding before this). I went through a lot of trial and error with schematics and PCBs. I went through 3 iterations of a schematic trying to see how I can optimize the number of pins I’m using while keeping 10 or 12 switches. I tried LEDs but they were causing many errors in the DRC. The LEDs were more hassle than function so i decided to go with my optimized 12 switches, OLED display, and Rotary Encoder with no switch capabilities. Below is my final interation of my PCB that was able to throw no errors.
I am starting all the way over. I had weighed how my workflow was going and it wasn’t going well; therefore I am starting over. I plan on making this version much better and done more efficiently. I am doing this for 3 main reasons: to be more efficient, properly organized, and better set up. This photo was of my last PCB
This is my new and improved PCB. I redid my schematic for safe measures and was able to finish both the PCB and schematic in this time span. Now I will move onto making my firmware and try to code it in QMK firmware to get the most out of my macropad. I am not doing the case yet because I might change my mind on the layout and don’t want to keep remaking a case. This is be my fifth iteration of this design and have learned a lot and am planning to learn more.
I have finished my Plutopad and have gathered all my files and spent a very long time trying to compile my firmware to get it right. I was also doing all this in the midst of a possible tornado around me. Anyways, I was able to settle on my PCB and case and am ready to submit this project. This is my very final PCB.
Ships:
I made a Hackpad, which I named the Plutopad. This was very challenging due to the fact that I have never used KiCAD prior to this mission. I have also never worked with building firmware or even trying a “ysws” program like this, so I am going in headfirst with something I enjoy very much, building “things”. My firmware works and is compiliable but it is baseline it can still be configure and the OLED screen doesn’t have any input yet; however, if this is approved I will definitely be taking a crack at this really cool thing that I built. The screenshot is of my QMK firmware finally working after about 2 hours of troubleshooting. It was a wonderful and joyous end to a project....
|
1793123639.868851
|
1793210039.868851
|
|
7738
|
Space Decrypter Officer by @lee264 | Stardance
|
lee264
|
1
|
15.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-09T02:05:12Z", "hours": 15.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is my first project for Stardance about a silly game idea I had thought of in passing. The hardest thing about this project is definitely the coding as this is my first ever actual project without a teacher or friend to get help. I’m no code wiz so I had to look through YT tutorials and documentation that probably added ~5 hours to the overall project. I’m still pretty happy with the end result though, the terminal-like messages and story is something I’m proud of. After 34 days I can finally ship my project, have a wonderful day/night to anyone reading :).", "repo": "https://github.com/leelawryanto264-afk/SDO", "demo": "https://hackclub.enterprise.slack.com/archives/C0BH50P7XAT"}]...
|
[{"post_id": 25048, "ts": "202 [{"post_id": 25048, "ts": "2026-07-09T00:22:47Z", "hours": 14.56, "text": "My first project is finally finished, hopefully nothing crashes :’). Also completely forgot to post a devlog, whoops"}]...
|
Title: Space Decrypter Officer by @lee264 | Starda Title: Space Decrypter Officer by @lee264 | Stardance
Devlogs:
My first project is finally finished, hopefully nothing crashes :’). Also completely forgot to post a devlog, whoops
Ships:
This is my first project for Stardance about a silly game idea I had thought of in passing. The hardest thing about this project is definitely the coding as this is my first ever actual project without a teacher or friend to get help. I’m no code wiz so I had to look through YT tutorials and documentation that probably added ~5 hours to the overall project. I’m still pretty happy with the end result though, the terminal-like messages and story is something I’m proud of. After 34 days I can finally ship my project, have a wonderful day/night to anyone reading :)....
|
1793072961.4148803
|
1793159361.4148803
|
|
7750
|
Updato by @NellowTCS | Stardance
|
NellowTCS
|
1
|
5.0
|
78
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T04:27:18Z", "hours": 5.0, "multiplier": 14.89, "payout": 78, "blessing": "neutral", "text": "Updato is a decentralized update system for web apps. A GitHub Action publishes builds to a CDN branch, a Cloudflare Worker handles version checks, and a client library hot-swaps files in the browser with no reload. It’s on npm as @nellowtcs /updato. It works end to end. Push code, Action builds it, Worker picks it up, client swaps files live. No server, no database. Also there’s a live demo, a docs site, and a real npm package now. It became a real project somewhere along the way. CSS hot-swapping was a whole thing. Ended up using CSSStyleSheet.replaceSync with adoptedStyleSheets to make it work without flashing or breaking CSP. Also npm told me my package name was too similar to “upath” which is just not true but whatever, scoped it and moved on. The live demo ( https://nellowtcs.me/updato/ ) is a clock app that checks for updates from the Worker. You can also install it with npm i @nellowtcs/updato and the docs are at https://nellowtcs.me/updato/docs .", "repo": "https://github.com/NellowTCS/updato", "demo": "https://nellowtcs.me/updato/"}]...
|
[{"post_id": 3282, "ts": "2026 [{"post_id": 3282, "ts": "2026-06-06T04:21:10Z", "hours": 0.6542, "text": "devlog: shipped updato is published. it’s on npm. it has a version number and everything. the publish switched the build from vite to tsdown. vite was fine for dev but tsdown gives you dual esm/cjs output with proper .mjs/.cjs extensions and matching declaration files out of the box. the package exports map has real conditional exports now — separate import and require entries with their own types. it’s the kind of package.json that doesn’t make people file issues. scoped it to @nellowtcs/updato because apparently updato was too close to upath for npm’s similarity check. it is not similar. at all. but scoped names are better practice anyway so whatever, npm wins this round. the release workflow strips private , scripts , and devDependencies from package.json before publish. originally did that with an inline node script, swapped it to a one-liner jq pipe because why run a whole runtime to delete three keys. 1.0.0 → 1.0.1 released 1.0.0. immediately released 1.0.1 because of the name conflict. so it goes. the important thing is npm i @nellowtcs/updato works and the types resolve and the imports are correct. tested it, it’s real. what actually shipped all of it: github action that publishes builds to a cdn branch cloudflare worker that serves version checks from KV client library on npm with hot-swap, two update modes, optional metrics live demo at nellowtcs.me/updato docs site at nellowtcs.me/updato/docs ci pipeline for all of it a readme that actually explains what this thing does what’s left one item on the todo list: custom domain for the worker. that’s a “maybe” and it’s been a “maybe” for a while. it can stay a maybe. closing this started as a dumb idea about pushing updates without a server. it is now a real system with five directories and a package on npm and documentation with a sidebar. i don’t know when it became a real project but it did and now it’s done. first release. final (nah, probably not) devlog."}, {"post_id": 3255, "ts": "2026-06-06T03:05:19Z", "hours": 1.6772, "text": "devlog: docs, workflows, and the finish line this is the “make it real” commit. everything that was on the todo list under “before you can call this a real project” happened in one sitting. docs site built a full docs site using docmd. lives in Docs/ with its own package. seven pages covering everything: home/landing page, quickstart guide, core concepts explainer, and individual reference pages for the client library, github action, worker, hot-swap internals, manifest format, and download metrics. the client library page has full config tables, event references, api docs for every public method, and the UpdateNotification component. the action page documents every input and shows what the cdn branch looks like after a deploy. the worker page covers both endpoints, version comparison logic, caching, and rate limiting. the hot-swap page explains how each asset type gets replaced: scripts via dom replacement with data-hot-file tagging for subsequent updates, css via CSSStyleSheet.replaceSync and adoptedStyleSheets (which is CSP-safe), and images via base64 data uris. used the “sky” theme with system dark mode toggle. search, sitemap plugin, code highlighting, all enabled. github pages deployment new workflow at .github/workflows/static.yml . builds the client library, builds the demo, builds the docs, then assembles them into a single pages-root/ directory. demo goes under /demo/ , docs go at the root. deploys to gh-pages with peaceiris/actions-gh-pages. npm publish workflow .github/workflows/release-npm.yml . triggers on github release publish or manual dispatch with a dry-run option. builds the client library, strips private , scripts , and devDependencies from package.json, copies in the readme and license, then publishes with --provenance . also removed \"private\": true from Build/package.json so npm will actually accept it. security audit workflow daily cron job plus on-push when lockfiles change. runs npm audit --audit-level=high across every package (root, Build, Worker, Action, Demo, Docs). all the audit steps have || true so the workflow reports issues without failing the build, which felt like the right balance for now. separate test workflow split the test job out of ci.yml into its own .github/workflows/test.yml . same matrix across node 20 and 22, runs jest in all three packages. keeps the ci workflow focused on lint and build. todo status checked off docs. what’s left: update the readme with better examples, maybe attach the worker to a custom domain, and publish to npm. the npm workflow is ready, just need to actually pull the trigger."}, {"post_id": 3067, "ts": "2026-06-05T23:24:18Z", "hours": 1.5717, "text": "devlog: the three commits i forgot to write about got in a flow state and forgot to devlog. here’s the catch-up. multi-branch support + notification ui the whole system was hardcoded to a branch called cdn . now you can pass a branch parameter everywhere. the worker accepts it as a query param (defaults to cdn ), the client sends it with check requests, and download urls use the right branch. manifest cache keys in kv include the branch name so different environments don’t collide. the idea is you could have cdn-staging and cdn-production in the same repo and point different app builds at different ones. added branch validation in the worker too since someone’s going to try passing something weird eventually. also built an UpdateNotification class in update-ui.ts . it’s a drop-in banner component that handles the whole flow. you pick top or bottom, set it dismissable or not, and call notification.show(result) when there’s an update. clicking the button downloads and applies. if the download fails it resets. styling is all inline so there’s no css file to import. updated both examples to use it. the example-app.html went from a hand-rolled banner with window.__pendingUpdate to just notification.show(result) . much cleaner. module scripts + download metrics the action now scans html files for <script type=\"module\"> tags and includes a modules array in the manifest. the client passes this through to hot-swap so module scripts get replaced with type=\"module\" set on the new element. the regex for finding them is a little fragile but it works for standard vite/webpack output. also switched the action bundler from @vercel/ncc to esbuild . ncc was fine but esbuild is faster and i was already using it elsewhere. added an opt-in DownloadMetrics class that records timing data per file download (start, end, duration, size, url) in localStorage. pass it into the config and it starts tracking. you can export as json or clear it. useful for debugging slow updates but not the kind of thing you want on by default. tests + ci wrote jest tests for all three packages. action tests mock @actions/core , @actions/github , and @actions/exec . covers input parsing, repo context, package.json version reading, recursive file listing, module script detection, and clone url construction. had to export a bunch of internal functions to make them testable. client tests use jsdom with mocked fetch. covers hot-swap (regular scripts, module scripts, stylesheets, images, unknown types), the metrics class, and the main updato class (version tracking, cache management, update checking, downloads, event callbacks). worker tests cover validation helpers, the full fetch handler (missing params, invalid params, successful checks, unknown endpoints, OPTIONS, method rejection), manifest validation with every field failure case, and the rate limiter with fake timers. ci workflow at .github/workflows/ci.yml . runs on push and pr to main, matrix across node 20 and 22. lints, runs all tests, builds all three packages. todo status checked off: multi-branch, notification ui, module types, metrics, tests, ci. what’s left is docs, a demo, and release automation. the core functionality is done."}, {"post_id": 2861, "ts": "2026-06-05T18:37:02Z", "hours": 0.8061, "text": "devlog: the “just rename it” update (and a bunch of other stuff) the name thing changed name: Updato to name: Updato Action in action.yml. that’s it. that’s the fix. spent hours filing a support ticket, got a polite “no” from github, and the solution was adding one word. sometimes software development is humbling. hot-swap got its own file ripped the hot-swap logic out of updato.ts and gave it a proper home in hot-swap.ts . while i was in there i figured i might as well make it actually good. it now supports images too. png, jpg, gif, svg, webp, ico, bmp, avif. it finds matching <img> , <source> , and favicon <link> elements by basename and swaps their src/href to a base64 data uri. so if your update is just a new logo, no reload needed. also switched the element matching from substring ( src*=\"${file}\" ) to basename comparison, which is way less fragile. before, a file called app.js could’ve accidentally matched webapp.js . now it actually compares the filename part properly. the css swap switched from btoa() to encodeURIComponent() which handles unicode better. small thing but the kind of thing that would’ve been a weird bug later. everything returns a typed HotSwapResult now instead of just a boolean. so the caller knows what got swapped, what type it was, and which file it was for. manifest validation added a real validator in Worker/src/manifest.ts . before, the worker was just casting response.json() as Manifest and hoping for the best with a couple of if-checks. now there’s a validateManifest() function that checks every field properly and returns typed errors. each error tells you which field failed and why. this runs both when fetching fresh manifests from github and when reading cached ones from kv. if a cached manifest is corrupted it just falls through and re-fetches. rate limiting new file: Worker/src/rate-limit.ts . uses cloudflare kv to track requests per ip. 60 requests per 60 second window, which is generous enough for normal usage but should keep anyone from hammering it. uses CF-Connecting-IP for the real client ip, falls back to X-Forwarded-For . returns a proper 429 with a Retry-After header when you hit the limit. the kv entries auto-expire so they don’t pile up forever. I half wanted to make the 429 return silly messages, but I gotta be serious apparently sometimes :/ had to add a kv namespace binding in wrangler.toml for this. the worker was fully stateless before, now it has a little bit of state. felt like a big architectural decision for what’s basically a counter but whatever, it’s the right call. kv caching for manifests while i was adding kv for rate limiting i figured i might as well use it for manifest caching too. previously every /check request was hitting github’s raw content cdn directly. now it caches the manifest in kv with a configurable ttl (defaults to 300 seconds). means fewer github api calls and faster responses for repeat checks. worker got lint + prettier too copied the eslint + prettier setup from Build into Worker. also added projectService and tsconfigRootDir to both eslint configs so typescript-eslint can actually find the tsconfigs. this was one of those “why is eslint yelling at me” rabbit holes. todo cleanup checked off rate limiting and manifest validation. removed the already-completed items that were cluttering the list. it’s getting shorter."}, {"post_id": 2619, "ts": "2026-06-05T07:31:58Z", "hours": 0.3933, "text": "devlog: hot-swap and cleanup two things happened here and they’re very different vibes. hot-swap so previously applyUpdate() was just… reload the page. which works, obviously, but it’s not exactly elegant. if you’re updating a css file there’s no reason to nuke the entire page state. now it actually tries to be smart about it. when you call applyUpdate() , it looks at each file’s extension and attempts to swap it in-place: for .js files, it finds the matching <script> tag by src and replaces it with a new one containing the updated content for .css files, it finds the matching <link> stylesheet and swaps it with a base64 data url version of the new css if none of the files can be hot-swapped (like if there’s no matching dom element, or it’s a file type it doesn’t know about), it falls back to the classic window.location.reload() . so nothing breaks, it just tries the nice path first. the base64 css thing is a little cursed honestly. but it works and avoids needing to host the file anywhere. the browser just reads it inline. i might revisit this later if it causes issues with large stylesheets but for now it’s fine. eslint + prettier added eslint and prettier to the Build package because the code was starting to look inconsistent and it was bothering me. set up a flat config with typescript-eslint, browser globals, the usual. named the prettier script make-pretty because i thought it was funny. and idk, it’s how i do it ig prettier immediately reformatted a bunch of stuff in updato.ts . removed some unnecessary quote wrapping on \"Accept\" , collapsed a few multi-line expressions that didn’t need to be multi-line, cleaned up trailing commas. nothing behavioral, just formatting. also committed the lockfile. should’ve done that earlier but here we are. todo progress checked off hot-swap support and the linting setup. removed the version bump script todo since that was already done in the last round. the list is getting shorter. slowly."}, {"post_id": 2606, "ts": "2026-06-05T06:58:58Z", "hours": 0.3131, "text": "the one big devlog so updato exists now. figured i should write down what actually happened before i forget why i made half these decisions. what even is this updato is a decentralized update system for browser apps. the whole idea is: you push code, your app knows there’s a new version, and it updates itself. no app store, no server infrastructure you have to maintain. just github and a cloudflare worker. it’s three pieces: a github action that takes your build output and pushes it to a cdn branch on your repo. every version gets its own folder, plus there’s always a latest/ copy. it writes a manifest.json with metadata about what’s current. a cloudflare worker that acts as the middleman. your app asks it “hey is there an update?” and it goes and reads your manifest off github, compares versions, and tells the client yes or no. stateless, basically free to run. a js client library that you drop into your app. it talks to the worker, downloads new files if there’s an update, caches them in localStorage, and reloads when you’re ready. two modes because i couldn’t pick one there’s commit mode and version mode. commit mode means every push is a new version and the “version” is just the commit sha. version mode uses semver from your package.json. commit mode is nice for apps where you just want continuous deployment. version mode is for when you want to be more intentional about it. honestly i went back and forth on whether to support both. decided it was easy enough to keep and the action just reads a flag. the action lives in Action/ . typescript, compiled with ncc. it clones your cdn branch into a temp directory (or inits a fresh one if the branch doesn’t exist yet), copies your dist folder into latest/ and versions/{version}/ , writes the manifest, commits, and pushes. the commit messages are kinda nice actually, they show what version replaced what: deploy: abc123 (was def456) . one thing i’m quietly proud of is that it handles the “branch doesn’t exist yet” case gracefully. first run just works. the worker lives in Worker/ . pretty small. two endpoints: /check and /manifest . /check takes a repo and your current version, fetches the manifest from github, does the comparison, and returns whether there’s an update. wrote my own semver parser because i didn’t want to pull in a dependency for what’s basically three number comparisons. it’s probably fine. it validates the repo format with a regex so you can’t pass in weird stuff. set up wrangler.toml with a production and staging env. the client lives in Build/ . this is the part that actually runs in people’s apps. it’s a class called Updato (creative naming, i know). you init it with your repo, mode, and current version. then you can check for updates, download them, and apply them. downloads get cached in localStorage with version tags so stale cache gets cleaned up automatically. built with vite, outputs both esm and umd so you can import it or just drop a script tag. tooling i added after wrote a bump-version.js script that bumps the version across all four package.jsons (root + the three workspace packages), commits, tags, and pushes. one command to do a release, basically. also a little print-cdn-commit.js that tells you what the latest cdn branch commit is, which is useful for debugging. there’s a TODO.md with a bunch of stuff i want to do eventually. hot-swap support, rate limiting in the worker, tests, linting, npm publishing. the usual “i’ll get to it” list. current status it works. the action runs, the worker deploys, the client checks and downloads. trying to publish the action to the github marketplace but the name “Updato” is apparently reserved by a ghost account that doesn’t exist. so that’s cool. working on that."}]...
|
Title: Updato by @NellowTCS | Stardance
Devlogs:
Title: Updato by @NellowTCS | Stardance
Devlogs:
the one big devlog so updato exists now. figured i should write down what actually happened before i forget why i made half these decisions. what even is this updato is a decentralized update system for browser apps. the whole idea is: you push code, your app knows there’s a new version, and it updates itself. no app store, no server infrastructure you have to maintain. just github and a cloudflare worker. it’s three pieces: a github action that takes your build output and pushes it to a cdn branch on your repo. every version gets its own folder, plus there’s always a latest/ copy. it writes a manifest.json with metadata about what’s current. a cloudflare worker that acts as the middleman. your app asks it “hey is there an update?” and it goes and reads your manifest off github, compares versions, and tells the client yes or no. stateless, basically free to run. a js client library that you drop into your app. it talks to the worker, downloads new files if there’s an update, caches them in localStorage, and reloads when you’re ready. two modes because i couldn’t pick one there’s commit mode and version mode. commit mode means every push is a new version and the “version” is just the commit sha. version mode uses semver from your package.json. commit mode is nice for apps where you just want continuous deployment. version mode is for when you want to be more intentional about it. honestly i went back and forth on whether to support both. decided it was easy enough to keep and the action just reads a flag. the action lives in Action/ . typescript, compiled with ncc. it clones your cdn branch into a temp directory (or inits a fresh one if the branch doesn’t exist yet), copies your dist folder into latest/ and versions/{version}/ , writes the manifest, commits, and pushes. the commit messages are kinda nice actually, they show what version replaced what: deploy: abc123 (was def456) . one thing i’m quietly proud of is that it handles the “branch doesn’t exist yet” case gracefully. first run just works. the worker lives in Worker/ . pretty small. two endpoints: /check and /manifest . /check takes a repo and your current version, fetches the manifest from github, does the comparison, and returns whether there’s an update. wrote my own semver parser because i didn’t want to pull in a dependency for what’s basically three number comparisons. it’s probably fine. it validates the repo format with a regex so you can’t pass in weird stuff. set up wrangler.toml with a production and staging env. the client lives in Build/ . this is the part that actually runs in people’s apps. it’s a class called Updato (creative naming, i know). you init it with your repo, mode, and current version. then you can check for updates, download them, and apply them. downloads get cached in localStorage with version tags so stale cache gets cleaned up automatically. built with vite, outputs both esm and umd so you can import it or just drop a script tag. tooling i added after wrote a bump-version.js script that bumps the version across all four package.jsons (root + the three workspace packages), commits, tags, and pushes. one command to do a release, basically. also a little print-cdn-commit.js that tells you what the latest cdn branch commit is, which is useful for debugging. there’s a TODO.md with a bunch of stuff i want to do eventually. hot-swap support, rate limiting in the worker, tests, linting, npm publishing. the usual “i’ll get to it” list. current status it works. the action runs, the worker deploys, the client checks and downloads. trying to publish the action to the github marketplace but the name “Updato” is apparently reserved by a ghost account that doesn’t exist. so that’s cool. working on that.
devlog: hot-swap and cleanup two things happened here and they’re very different vibes. hot-swap so previously applyUpdate() was just… reload the page. which works, obviously, but it’s not exactly elegant. if you’re updating a css file there’s no reason to nuke the entire page state. now it actually tries to be smart about it. when you call applyUpdate() , it looks at each file’s extension and attempts to swap it in-place: for .js files, it finds the matching <script> tag by src and replaces it with a new one containing the updated content for .css files, it finds the matching <link> stylesheet and swaps it with a base64 data url version of the new css if none of the files can be hot-swapped (like if there’s no matching dom element, or it’s a file type it doesn’t know about), it falls back to the classic window.location.reload() . so nothing breaks, it just tries the nice path first. the base64 css thing is a little cursed honestly. but it works and avoids needing to host the file anywhere. the browser just reads it inline. i might revisit this later if it causes issues with large stylesheets but for now it’s fine. eslint + prettier added eslint and prettier to the Build package because the code was starting to look inconsistent and it was bothering me. set up a flat config with typescript-eslint, browser globals, the usual. named the prettier script make-pretty because i thought it was funny. and idk, it’s how i do it ig prettier immediately reformatted a bunch of stuff in updato.ts . removed some unnecessary quote wrapping on "Accept" , collapsed a few multi-line expressions that didn’t need to be multi-line, cleaned up trailing commas. nothing behavioral, just formatting. also committed the lockfile. should’ve done that earlier but here we are. todo progress checked off hot-swap support and the linting setup. removed the version bump script todo since that was already done in the last round. the list is getting shorter. slowly.
devlog: the “just rename it” update (and a bunch of other stuff) the name thing changed name: Updato to name: Updato Action in action.yml. that’s it. that’s the fix. spent hours filing a support ticket, got a polite “no” from github, and the solution was adding one word. sometimes software development is humbling. hot-swap got its own file ripped the hot-swap logic out of updato.ts and gave it a proper home in hot-swap.ts . while i was in there i figured i might as well make it actually good. it now supports images too. png, jpg, gif, svg, webp, ico, bmp, avif. it finds matching <img> , <source> , and favicon <link> elements by basename and swaps their src/href to a base64 data uri. so if your update is just a new logo, no reload needed. also switched the element matching from substring ( src*="${file}" ) to basename comparison, which is way less fragile. before, a file called app.js could’ve accidentally matched webapp.js . now it actually compares the filename part properly. the css swap switched from btoa() to encodeURIComponent() which handles unicode better. small thing but the kind of thing that would’ve been a weird bug later. everything returns a typed HotSwapResult now instead of just a boolean. so the caller knows what got swapped, what type it was, and which file it was for. manifest validation added a real validator in Worker/src/manifest.ts . before, the worker was just casting response.json() as Manifest and hoping for the best with a couple of if-checks. now there’s a validateManifest() function that checks every field properly and returns typed errors. each error tells you which field failed and why. this runs both when fetching fresh manifests from github and when reading cached ones from kv. if a cached manifest is corrupted it just falls through and re-fetches. rate limiting new file: Worker/src/rate-limit.ts . uses cloudflare kv to track requests per ip. 60 requests per 60 second window, which is generous enough for normal usage but should keep anyone from hammering it. uses CF-Connecting-IP for the real client ip, falls back to X-Forwarded-For . returns a proper 429 with a Retry-After header when you hit the limit. the kv entries auto-expire so they don’t pile up forever. I half wanted to make the 429 return silly messages, but I gotta be serious apparently sometimes :/ had to add a kv namespace binding in wrangler.toml for this. the worker was fully stateless before, now it has a little bit of state. felt like a big architectural decision for what’s basically a counter but whatever, it’s the right call. kv caching for manifests while i was adding kv for rate limiting i figured i might as well use it for manifest caching too. previously every /check request was hitting github’s raw content cdn directly. now it caches the manifest in kv with a configurable ttl (defaults to 300 seconds). means fewer github api calls and faster responses for repeat checks. worker got lint + prettier too copied the eslint + prettier setup from Build into Worker. also added projectService and tsconfigRootDir to both eslint configs so typescript-eslint can actually find the tsconfigs. this was one of those “why is eslint yelling at me” rabbit holes. todo cleanup checked off rate limiting and manifest validation. removed the already-completed items that were cluttering the list. it’s getting shorter.
devlog: the three commits i forgot to write about got in a flow state and forgot to devlog. here’s the catch-up. multi-branch support + notification ui the whole system was hardcoded to a branch called cdn . now you can pass a branch parameter everywhere. the worker accepts it as a query param (defaults to cdn ), the client sends it with check requests, and download urls use the right branch. manifest cache keys in kv include the branch name so different environments don’t collide. the idea is you could have cdn-staging and cdn-production in the same repo and point different app builds at different ones. added branch validation in the worker too since someone’s going to try passing something weird eventually. also built an UpdateNotification class in update-ui.ts . it’s a drop-in banner component that handles the whole flow. you pick top or bottom, set it dismissable or not, and call notification.show(result) when there’s an update. clicking the button downloads and applies. if the download fails it resets. styling is all inline so there’s no css file to import. updated both examples to use it. the example-app.html went from a hand-rolled banner with window.__pendingUpdate to just notification.show(result) . much cleaner. module scripts + download metrics the action now scans html files for <script type="module"> tags and includes a modules array in the manifest. the client passes this through to hot-swap so module scripts get replaced with type="module" set on the new element. the regex for finding them is a little fragile but it works for standard vite/webpack output. also switched the action bundler from @vercel/ncc to esbuild . ncc was fine but esbuild is faster and i was already using it elsewhere. added an opt-in DownloadMetrics class that records timing data per file download (start, end, duration, size, url) in localStorage. pass it into the config and it starts tracking. you can export as json or clear it. useful for debugging slow updates but not the kind of thing you want on by default. tests + ci wrote jest tests for all three packages. action tests mock @actions/core , @actions/github , and @actions/exec . covers input parsing, repo context, package.json version reading, recursive file listing, module script detection, and clone url construction. had to export a bunch of internal functions to make them testable. client tests use jsdom with mocked fetch. covers hot-swap (regular scripts, module scripts, stylesheets, images, unknown types), the metrics class, and the main updato class (version tracking, cache management, update checking, downloads, event callbacks). worker tests cover validation helpers, the full fetch handler (missing params, invalid params, successful checks, unknown endpoints, OPTIONS, method rejection), manifest validation with every field failure case, and the rate limiter with fake timers. ci workflow at .github/workflows/ci.yml . runs on push and pr to main, matrix across node 20 and 22. lints, runs all tests, builds all three packages. todo status checked off: multi-branch, notification ui, module types, metrics, tests, ci. what’s left is docs, a demo, and release automation. the core functionality is done.
devlog: docs, workflows, and the finish line this is the “make it real” commit. everything that was on the todo list under “before you can call this a real project” happened in one sitting. docs site built a full docs site using docmd. lives in Docs/ with its own package. seven pages covering everything: home/landing page, quickstart guide, core concepts explainer, and individual reference pages for the client library, github action, worker, hot-swap internals, manifest format, and download metrics. the client library page has full config tables, event references, api docs for every public method, and the UpdateNotification component. the action page documents every input and shows what the cdn branch looks like after a deploy. the worker page covers both endpoints, version comparison logic, caching, and rate limiting. the hot-swap page explains how each asset type gets replaced: scripts via dom replacement with data-hot-file tagging for subsequent updates, css via CSSStyleSheet.replaceSync and adoptedStyleSheets (which is CSP-safe), and images via base64 data uris. used the “sky” theme with system dark mode toggle. search, sitemap plugin, code highlighting, all enabled. github pages deployment new workflow at .github/workflows/static.yml . builds the client library, builds the demo, builds the docs, then assembles them into a single pages-root/ directory. demo goes under /demo/ , docs go at the root. deploys to gh-pages with peaceiris/actions-gh-pages. npm publish workflow .github/workflows/release-npm.yml . triggers on github release publish or manual dispatch with a dry-run option. builds the client library, strips private , scripts , and devDependencies from package.json, copies in the readme and license, then publishes with --provenance . also removed "private": true from Build/package.json so npm will actually accept it. security audit workflow daily cron job plus on-push when lockfiles change. runs npm audit --audit-level=high across every package (root, Build, Worker, Action, Demo, Docs). all the audit steps have || true so the workflow reports issues without failing the build, which felt like the right balance for now. separate test workflow split the test job out of ci.yml into its own .github/workflows/test.yml . same matrix across node 20 and 22, runs jest in all three packages. keeps the ci workflow focused on lint and build. todo status checked off docs. what’s left: update the readme with better examples, maybe attach the worker to a custom domain, and publish to npm. the npm workflow is ready, just need to actually pull the trigger.
devlog: shipped updato is published. it’s on npm. it has a version number and everything. the publish switched the build from vite to tsdown. vite was fine for dev but tsdown gives you dual esm/cjs output with proper .mjs/.cjs extensions and matching declaration files out of the box. the package exports map has real conditional exports now — separate import and require entries with their own types. it’s the kind of package.json that doesn’t make people file issues. scoped it to @nellowtcs/updato because apparently updato was too close to upath for npm’s similarity check. it is not similar. at all. but scoped names are better practice anyway so whatever, npm wins this round. the release workflow strips private , scripts , and devDependencies from package.json before publish. originally did that with an inline node script, swapped it to a one-liner jq pipe because why run a whole runtime to delete three keys. 1.0.0 → 1.0.1 released 1.0.0. immediately released 1.0.1 because of the name conflict. so it goes. the important thing is npm i @nellowtcs/updato works and the types resolve and the imports are correct. tested it, it’s real. what actually shipped all of it: github action that publishes builds to a cdn branch cloudflare worker that serves version checks from KV client library on npm with hot-swap, two update modes, optional metrics live demo at nellowtcs.me/updato docs site at nellowtcs.me/updato/docs ci pipeline for all of it a readme that actually explains what this thing does what’s left one item on the todo list: custom domain for the worker. that’s a “maybe” and it’s been a “maybe” for a while. it can stay a maybe. closing this started as a dumb idea about pushing updates without a server. it is now a real system with five directories and a package on npm and documentation with a sidebar. i don’t know when it became a real project but it did and now it’s done. first release. final (nah, probably not) devlog.
Ships:
Updato is a decentralized update system for web apps. A GitHub Action publishes builds to a CDN branch, a Cloudflare Worker handles version checks, and a client library hot-swaps files in the browser with no reload. It’s on npm as @nellowtcs /updato. It works end to end. Push code, Action builds it, Worker picks it up, client swaps files live. No server, no database. Also there’s a live demo, a docs site, and a real npm package now. It became a real project somewhere along the way. CSS hot-swapping was a whole thing. Ended up using CSSStyleSheet.replaceSync with adoptedStyleSheets to make it work without flashing or breaking CSP. Also npm told me my package name was too similar to “upath” which is just not true but whatever, scoped it and moved on. The live demo ( https://nellowtcs.me/updato/ ) is a clock app that checks for updates from the Worker. You can also install it with npm i @nellowtcs/updato and the docs are at https://nellowtcs.me/updato/docs ....
|
1793105711.6892698
|
1793192111.6892698
|
|
7758
|
the rude slack bot by @shivank | Stardance
|
shivank
|
1
|
16.44
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-05T10:13:26Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Slack, but which can respond to you. You can make your good mood into something different. It’s response. Can be anywhere from funny to annoying. Good luck.", "repo": "https://github.com/ShivankVibes/rude-slack-bot-tempilate", "demo": "https://hackclub.enterprise.slack.com/archives/D0B8KPXM3HP"}]...
|
[{"post_id": 9720, "ts": "2026 [{"post_id": 9720, "ts": "2026-06-16T04:23:58Z", "hours": 15.4383, "text": "Added fall backs in case of the Gemini reply failing and added Easter eggs"}, {"post_id": 2657, "ts": "2026-06-05T10:12:20Z", "hours": 0.3508, "text": "a rude slack bot, how is the poster?"}, {"post_id": 2649, "ts": "2026-06-05T09:45:01Z", "hours": 0.9972, "text": "the “kindest” slack bot on earth"}]...
|
Title: the rude slack bot by @shivank | Stardance
Title: the rude slack bot by @shivank | Stardance
Devlogs:
the “kindest” slack bot on earth
a rude slack bot, how is the poster?
Added fall backs in case of the Gemini reply failing and added Easter eggs
Ships:
I made a Slack, but which can respond to you. You can make your good mood into something different. It’s response. Can be anywhere from funny to annoying. Good luck....
|
1793091151.6211393
|
1793177551.6211393
|
|
7761
|
Zico Chess Engine by @zico | Stardance
|
zico
|
1
|
11.0
|
97
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-09T23:06:12Z", "hours": 11.0, "multiplier": 9.01, "payout": 97, "blessing": "neutral", "text": "I created a chess-engine with a chess bot that plays smarter move by looking into the game by 3 steps or even more. Managing states was challenging to me at first cause the state was mutated which caused lot of error and missing piece so i cloned the board which makes it immutable. I’m proud because this project taught me a lot of things from state management to writing my first algorithm. You can check out my project at https://zico-chess-engine.vercel.app . My repo at https://github.com/young1dev/chess-engine", "repo": "https://github.com/young1dev/chess-engine", "demo": "https://zico-chess-engine.vercel.app"}]...
|
[{"post_id": 5944, "ts": "2026 [{"post_id": 5944, "ts": "2026-06-09T22:58:32Z", "hours": 7.8381, "text": "Added the min-max and alpha-beta pruning algorithm to enable the bot make smarter moves"}, {"post_id": 2605, "ts": "2026-06-05T06:52:56Z", "hours": 2.8917, "text": "I’m working on the v2 of my chessbot using the minmax algorithm and alpha beta pruning"}]...
|
Title: Zico Chess Engine by @zico | Stardance
Dev Title: Zico Chess Engine by @zico | Stardance
Devlogs:
I’m working on the v2 of my chessbot using the minmax algorithm and alpha beta pruning
Added the min-max and alpha-beta pruning algorithm to enable the bot make smarter moves
Ships:
I created a chess-engine with a chess bot that plays smarter move by looking into the game by 3 steps or even more. Managing states was challenging to me at first cause the state was mutated which caused lot of error and missing piece so i cloned the board which makes it immutable. I’m proud because this project taught me a lot of things from state management to writing my first algorithm. You can check out my project at https://zico-chess-engine.vercel.app . My repo at https://github.com/young1dev/chess-engine...
|
1793127174.5825276
|
1793213574.5825276
|
|
7777
|
website by @davids | Stardance
|
davids
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-08T08:15:43Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "personal website", "repo": "", "demo": ""}]...
|
[{"post_id": 4771, "ts": "2026 [{"post_id": 4771, "ts": "2026-06-08T08:11:00Z", "hours": 1.3642, "text": "df"}]...
|
Title: website by @davids | Stardance
Devlogs:
df Title: website by @davids | Stardance
Devlogs:
df
Ships:
personal website...
|
1793108975.226382
|
1793195375.226382
|
|
7783
|
DuskCoffee by @Diqi | Stardance
|
Diqi
|
1
|
28.49
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-30T01:36:55Z", "hours": 27.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built DuskCoffee, a fullstack web application for a modern coffee shop catalog and guest ordering system. Built with Node.js, Express, and Vanilla JavaScript, paired with a cloud-managed MySQL database on Aiven and live hosting on Railway over HTTPS. The most challenging part was managing environment configurations, fixing strict SSL connections between Node.js and Aiven MySQL, and setting up proper routing to prevent API errors. I’m really proud of getting a complete cloud database pipeline running smoothly with zero-downtime deployment setup! To test the project, navigate through the Menu/Products tab to see live data pulled straight from the cloud database, or try out the feedback/contact form", "repo": "https://github.com/zDiqim7/DuskCoffee", "demo": "https://duskcoffee-production.up.railway.app/index.html#home"}]...
|
[{"post_id": 59493, "ts": "202 [{"post_id": 59493, "ts": "2026-09-01T11:15:30Z", "hours": 0.8606, "text": "rewrite the readme"}, {"post_id": 57802, "ts": "2026-08-30T03:12:00Z", "hours": 0.6333, "text": "OTP UX Fix and SMTP IPv4 Compatibility Summary This update focused on two main issues in the OTP flow: improving the user experience when the send-code button is pressed, and making the Gmail SMTP fallback more reliable on Railway by forcing IPv4 instead of the blocked IPv6 path. 1) OTP Send Button UX Improvement Problem The previous OTP flow allowed users to click the “Send Code” button repeatedly while the backend was still processing the request. This created a poor user experience and could trigger duplicate email sends or repeated requests. Fix The frontend button logic was updated so that while the OTP request is in progress: the button is disabled, the text changes to “Sending…”, repeated clicks are prevented, the button returns to “Send Code” after the request finishes, the user receives a clearer success/error message in English.This makes the request flow feel intentional and prevents confusion during slow network conditions. 2) SMTP IPv4 Fix for Railway: Problem The app was trying to connect to Gmail SMTP using Railway’s outbound networking stack. Railway was preferring IPv6 resolution for Gmail, which caused outbound connections to fail with unreachable network errors. Root Cause The SMTP connection attempted to reach Gmail over IPv6, but the Railway container did not have a working outbound route for that address family. As a result, the backend could not complete the SMTP connection, even though the app code itself was otherwise valid. Fix The Nodemailer transport was updated to force IPv4 resolution by setting: jsfamily: 4 This keeps the existing SMTP host configuration ( host: process.env.SMTP_HOST ) but forces Node.js to use IPv4 instead of attempting the failing IPv6 route.Additional timeout settings were also added to prevent request hangs: jsconnectionTimeout: 10000,greetingTimeout: 5000,socketTimeout: 10000, This ensures that if SMTP is blocked or slow, the backend responds quickly with a clear error instead of leaving the browser hanging with a generic network issue. Outcome The OTP flow is now more stable and user-friendly: the button cannot be spam-clicked, users receive better status feedback, the SMTP connection is more resilient in Railway when Gmail is accessed over IPv4. This patch addresses the UX problem and the deployment-specific SMTP issue without changing the overall app architecture."}, {"post_id": 57481, "ts": "2026-08-29T17:15:16Z", "hours": 1.1842, "text": "Summary : Email delivery system integration (Contact Form + OTP), Railway deployment debugging, and infrastructure troubleshooting. What’s Complete Email Service Architecture (Priority-Based Fallback) Status: Fully Integrated & Production-Ready Contact Form Email Flow File: src/routes/contact.js Priority 1 (Production): Resend API — works on Railway, no outbound restrictions Priority 2 (Local Dev): Nodemailer + Gmail SMTP (port 587, TLS) Format: Visitor name in sender, reply-to set to visitor email for direct Gmail replies Testing: Verified via curl — email successfully delivered to [email protected] OTP Email Flow File: src/routes/auth.js Priority 1 (Production): Resend API — handles 6-digit OTP codes Priority 2 (Local Dev): Nodemailer + Gmail SMTP Timeout: 5-minute code expiration Verified: Code generation and storage logic working correctly 2. Frontend Contact Form Fix Status: Resolved Event Binding Issue Problem: DOMContentLoaded event wrapper in contact.js was unreliable because script loads after DOM already ready Solution: Removed wrapper, direct event attachment at script execution- Added: Console debug logging for form submission tracking and error diagnosis Result: Form submission now reliably attaches event listeners and sends fetch requests 3. Railway Deployment Testing* Status: Contact form working in production Domain: https://duskcoffee-production.up.railway.app Tested by: User (Kaedara) — successfully sent contact message Response logs show: Payload received, message queued, response returned to frontend Email delivery: Via Resend (Nodemailer fallback blocked due to Railway SMTP restrictions)"}, {"post_id": 57180, "ts": "2026-08-29T09:03:32Z", "hours": 0.7717, "text": "Project Goes Live! Status: Core Architecture Deployed & Live (Railway + Aiven DB). Whats working perfect: Database Migration & Cloud Infrastructure: Successfully migrated local MariaDB schema to Aiven Managed Cloud MySQL. Backend Deployment: Node.js / Express backend is live on Railway with dynamic port handling and SSL configuration (rejectUnauthorized: false). Catalog APIs: Core catalog endpoints (/api/products/menu & /api/products/beans) are returning 200 OK responses directly from the cloud database. Guest Checkout Schema: Relational database schema refactored to support seamless guest ordering (orders and order_items tables with proper menu_id & product_id key constraints). Next things to do (Might do later): Email OTP Verification MechanismCurrent Status: Temporarily disabled.Future Idea: Swapping Resend for Nodemailer with Gmail App Passwords so guests can actually get their verification codes… if I feel like setting up SMTP again. Order Queue & Confirmation FlowCurrent Status: The database saves transactions fine, but the post-checkout experience is pretty plain right now.Future Idea: Adding a real-time order queue screen (pending $\\rightarrow$ paid $\\rightarrow$ completed) and an instant digital receipt, assuming I don’t get distracted by another project. Contact Form MailerCurrent Status: The UI form looks nice, but submit doesn’t send anything yet.Future Idea: Hooking it up to the mailer service whenever I get around to fixing the email pipeline. Next Steps after that (Maybe) Mess around with Nodemailer in Express routes for OTP. Auto-clear the localStorage cart after checkout. Call it a day and grab an actual coffee"}, {"post_id": 56694, "ts": "2026-08-28T15:39:07Z", "hours": 2.6636, "text": "Summary Today’s work focused on aligning the project with the intended business flow: guest checkout with email OTP validation, instead of traditional user registration/login. The backend, schema, and cart payload were cleaned up to remove account-based flow and enforce a consistent transaction model. What changed Removed the account-based auth flow from the project. No more users table in the database. No more login and register endpoints. Kept the guest checkout path as the only legitimate order flow. Customer browses without logging in. Customer enters name, phone, and email on checkout. Email OTP is sent and validated before the order is placed. Fixed the order schema to match the real business model. orders.customer_phone is used as the canonical phone field. orders.total remains the canonical total value. Refined the order item model. order_items now stores either menu_id or product_id , never both. This avoids the earlier issue where product_id was effectively a stringly-typed placeholder and not a real product reference. Resolved cart identity collisions. Menu and product items can share the same numeric id , so the cart now distinguishes them using item_type . Created a separate seed.sql file for catalog data. Schema file now defines structure only. Seed file loads initial menu and product records. Key architecture decision The system now follows a single contract: Guest checkout only Email OTP verification required before order placement Orders stored in orders Line items stored in order_items Each order item references either: a menu item, or a product item This avoids duplicated and confusing legacy fields such as phone , total_amount , and users authentication. Validation I verified the JavaScript syntax for the changed backend and cart code: node --check passed for the modified JavaScript files. No editor errors were reported for the updated route and cart logic. Notes / Follow-up The remaining operational step is database migration/import: recreate the local MariaDB database import the cleaned schema import the seed file start the app and test the OTP checkout flow end-to-end"}, {"post_id": 52931, "ts": "2026-08-23T09:39:25Z", "hours": 1.7053, "text": "Guest Checkout and email OTP refactor Removed the need for users to create an account before browsing or ordering. Kept the storefront experience frictionless: users can still browse products and add items to the cart without logging in. Added checkout.html Added a checkout flow that collects: full name, phone number, email, 6-digit OTP code Added a “Send Code” button in the checkout form to trigger email verification before order placement. Implemented OTP storage with a temporary in-memory map and expiration logic. Added backend endpoints for:sending OTP emailsverifying OTP codessubmitting guest checkout orders after successful validationUpdated the order flow to store guest customer data directly in the database instead of requiring a registered user session. Kept the storefront experience frictionless: users can still browse products and add items to the cart without logging in. REMOVE auth.html"}, {"post_id": 52488, "ts": "2026-08-22T17:04:13Z", "hours": 2.8456, "text": "Overview : Refactored the DuskCoffee client and backend to replace static mockups with a dynamic, data-driven system. Implemented checkout calculations, order submission endpoints, schema updates for order persistence, and a local JSON fallback mechanism for offline development. File Changes SummaryEdited Files: checkout.html — Updated UI container structure to support dynamic order rendering.checkout. js — Added localStorage cart parsing, dynamic item rendering, price computations (subtotal, tax, delivery), and API POST triggers. menu.html — Removed duplicate static .menu-full-card markup to rely on JavaScript rendering. script.js — Refactored fetch logic to hit live API endpoints first, falling back to static JSON on failure. schema.sql — Extended database schema with orders and order_items tables; verified product image paths. server.js — Mounted orders API route and configured server initialization. Added Files: orders.js — Express route handler to process incoming checkout payloads and persist orders to MariaDB. menu-fallback.json — Static fallback dataset containing all 16 menu items for local development. checkout.html - Static checkout page but with dynamic/sync data with what item’s user add to cart"}, {"post_id": 48915, "ts": "2026-08-17T14:08:30Z", "hours": 2.4075, "text": "add dynamic notif “add to cart”"}, {"post_id": 47529, "ts": "2026-08-15T14:28:43Z", "hours": 0.7072, "text": "make the contact section look better i thnk, tryna user resend for the logic of sending messages, but it didnt work when i tried it myself for testing. well ill think about that later, i got bigger problem here, how to deploy this thing as full stack web 😭"}, {"post_id": 47450, "ts": "2026-08-15T11:48:12Z", "hours": 10.4225, "text": "add auth page for both sign in and signup"}, {"post_id": 6268, "ts": "2026-06-10T15:10:44Z", "hours": 3.4931, "text": "edit 8/15/2026, i decided to seperate the menu-producs.html to each has it own page"}, {"post_id": 2626, "ts": "2026-06-05T08:10:50Z", "hours": 0.4014, "text": "Key Features: Navbar - Navigation menu with Home, About Us, Menu, Products, and Contact links; includes search bar and shopping cart Hero Section - Eye-catching welcome banner with call-to-action (“Order Now”) About Us - Company story and values with images Menu Section - Showcases coffee beverages and food items (Croissant, Cappuccino, Americano, etc.) with prices Interactive Elements - Hamburger menu for mobile, search functionality, click-outside handlers will add more soon….."}]...
|
Title: DuskCoffee by @Diqi | Stardance
Devlogs:
K Title: DuskCoffee by @Diqi | Stardance
Devlogs:
Key Features: Navbar - Navigation menu with Home, About Us, Menu, Products, and Contact links; includes search bar and shopping cart Hero Section - Eye-catching welcome banner with call-to-action (“Order Now”) About Us - Company story and values with images Menu Section - Showcases coffee beverages and food items (Croissant, Cappuccino, Americano, etc.) with prices Interactive Elements - Hamburger menu for mobile, search functionality, click-outside handlers will add more soon…..
edit 8/15/2026, i decided to seperate the menu-producs.html to each has it own page
add auth page for both sign in and signup
make the contact section look better i thnk, tryna user resend for the logic of sending messages, but it didnt work when i tried it myself for testing. well ill think about that later, i got bigger problem here, how to deploy this thing as full stack web 😭
add dynamic notif “add to cart”
Overview : Refactored the DuskCoffee client and backend to replace static mockups with a dynamic, data-driven system. Implemented checkout calculations, order submission endpoints, schema updates for order persistence, and a local JSON fallback mechanism for offline development. File Changes SummaryEdited Files: checkout.html — Updated UI container structure to support dynamic order rendering.checkout. js — Added localStorage cart parsing, dynamic item rendering, price computations (subtotal, tax, delivery), and API POST triggers. menu.html — Removed duplicate static .menu-full-card markup to rely on JavaScript rendering. script.js — Refactored fetch logic to hit live API endpoints first, falling back to static JSON on failure. schema.sql — Extended database schema with orders and order_items tables; verified product image paths. server.js — Mounted orders API route and configured server initialization. Added Files: orders.js — Express route handler to process incoming checkout payloads and persist orders to MariaDB. menu-fallback.json — Static fallback dataset containing all 16 menu items for local development. checkout.html - Static checkout page but with dynamic/sync data with what item’s user add to cart
Guest Checkout and email OTP refactor Removed the need for users to create an account before browsing or ordering. Kept the storefront experience frictionless: users can still browse products and add items to the cart without logging in. Added checkout.html Added a checkout flow that collects: full name, phone number, email, 6-digit OTP code Added a “Send Code” button in the checkout form to trigger email verification before order placement. Implemented OTP storage with a temporary in-memory map and expiration logic. Added backend endpoints for:sending OTP emailsverifying OTP codessubmitting guest checkout orders after successful validationUpdated the order flow to store guest customer data directly in the database instead of requiring a registered user session. Kept the storefront experience frictionless: users can still browse products and add items to the cart without logging in. REMOVE auth.html
Summary Today’s work focused on aligning the project with the intended business flow: guest checkout with email OTP validation, instead of traditional user registration/login. The backend, schema, and cart payload were cleaned up to remove account-based flow and enforce a consistent transaction model. What changed Removed the account-based auth flow from the project. No more users table in the database. No more login and register endpoints. Kept the guest checkout path as the only legitimate order flow. Customer browses without logging in. Customer enters name, phone, and email on checkout. Email OTP is sent and validated before the order is placed. Fixed the order schema to match the real business model. orders.customer_phone is used as the canonical phone field. orders.total remains the canonical total value. Refined the order item model. order_items now stores either menu_id or product_id , never both. This avoids the earlier issue where product_id was effectively a stringly-typed placeholder and not a real product reference. Resolved cart identity collisions. Menu and product items can share the same numeric id , so the cart now distinguishes them using item_type . Created a separate seed.sql file for catalog data. Schema file now defines structure only. Seed file loads initial menu and product records. Key architecture decision The system now follows a single contract: Guest checkout only Email OTP verification required before order placement Orders stored in orders Line items stored in order_items Each order item references either: a menu item, or a product item This avoids duplicated and confusing legacy fields such as phone , total_amount , and users authentication. Validation I verified the JavaScript syntax for the changed backend and cart code: node --check passed for the modified JavaScript files. No editor errors were reported for the updated route and cart logic. Notes / Follow-up The remaining operational step is database migration/import: recreate the local MariaDB database import the cleaned schema import the seed file start the app and test the OTP checkout flow end-to-end
Project Goes Live! Status: Core Architecture Deployed & Live (Railway + Aiven DB). Whats working perfect: Database Migration & Cloud Infrastructure: Successfully migrated local MariaDB schema to Aiven Managed Cloud MySQL. Backend Deployment: Node.js / Express backend is live on Railway with dynamic port handling and SSL configuration (rejectUnauthorized: false). Catalog APIs: Core catalog endpoints (/api/products/menu & /api/products/beans) are returning 200 OK responses directly from the cloud database. Guest Checkout Schema: Relational database schema refactored to support seamless guest ordering (orders and order_items tables with proper menu_id & product_id key constraints). Next things to do (Might do later): Email OTP Verification MechanismCurrent Status: Temporarily disabled.Future Idea: Swapping Resend for Nodemailer with Gmail App Passwords so guests can actually get their verification codes… if I feel like setting up SMTP again. Order Queue & Confirmation FlowCurrent Status: The database saves transactions fine, but the post-checkout experience is pretty plain right now.Future Idea: Adding a real-time order queue screen (pending $\rightarrow$ paid $\rightarrow$ completed) and an instant digital receipt, assuming I don’t get distracted by another project. Contact Form MailerCurrent Status: The UI form looks nice, but submit doesn’t send anything yet.Future Idea: Hooking it up to the mailer service whenever I get around to fixing the email pipeline. Next Steps after that (Maybe) Mess around with Nodemailer in Express routes for OTP. Auto-clear the localStorage cart after checkout. Call it a day and grab an actual coffee
Summary : Email delivery system integration (Contact Form + OTP), Railway deployment debugging, and infrastructure troubleshooting. What’s Complete Email Service Architecture (Priority-Based Fallback) Status: Fully Integrated & Production-Ready Contact Form Email Flow File: src/routes/contact.js Priority 1 (Production): Resend API — works on Railway, no outbound restrictions Priority 2 (Local Dev): Nodemailer + Gmail SMTP (port 587, TLS) Format: Visitor name in sender, reply-to set to visitor email for direct Gmail replies Testing: Verified via curl — email successfully delivered to [email protected] OTP Email Flow File: src/routes/auth.js Priority 1 (Production): Resend API — handles 6-digit OTP codes Priority 2 (Local Dev): Nodemailer + Gmail SMTP Timeout: 5-minute code expiration Verified: Code generation and storage logic working correctly 2. Frontend Contact Form Fix Status: Resolved Event Binding Issue Problem: DOMContentLoaded event wrapper in contact.js was unreliable because script loads after DOM already ready Solution: Removed wrapper, direct event attachment at script execution- Added: Console debug logging for form submission tracking and error diagnosis Result: Form submission now reliably attaches event listeners and sends fetch requests 3. Railway Deployment Testing* Status: Contact form working in production Domain: https://duskcoffee-production.up.railway.app Tested by: User (Kaedara) — successfully sent contact message Response logs show: Payload received, message queued, response returned to frontend Email delivery: Via Resend (Nodemailer fallback blocked due to Railway SMTP restrictions)
OTP UX Fix and SMTP IPv4 Compatibility Summary This update focused on two main issues in the OTP flow: improving the user experience when the send-code button is pressed, and making the Gmail SMTP fallback more reliable on Railway by forcing IPv4 instead of the blocked IPv6 path. 1) OTP Send Button UX Improvement Problem The previous OTP flow allowed users to click the “Send Code” button repeatedly while the backend was still processing the request. This created a poor user experience and could trigger duplicate email sends or repeated requests. Fix The frontend button logic was updated so that while the OTP request is in progress: the button is disabled, the text changes to “Sending…”, repeated clicks are prevented, the button returns to “Send Code” after the request finishes, the user receives a clearer success/error message in English.This makes the request flow feel intentional and prevents confusion during slow network conditions. 2) SMTP IPv4 Fix for Railway: Problem The app was trying to connect to Gmail SMTP using Railway’s outbound networking stack. Railway was preferring IPv6 resolution for Gmail, which caused outbound connections to fail with unreachable network errors. Root Cause The SMTP connection attempted to reach Gmail over IPv6, but the Railway container did not have a working outbound route for that address family. As a result, the backend could not complete the SMTP connection, even though the app code itself was otherwise valid. Fix The Nodemailer transport was updated to force IPv4 resolution by setting: jsfamily: 4 This keeps the existing SMTP host configuration ( host: process.env.SMTP_HOST ) but forces Node.js to use IPv4 instead of attempting the failing IPv6 route.Additional timeout settings were also added to prevent request hangs: jsconnectionTimeout: 10000,greetingTimeout: 5000,socketTimeout: 10000, This ensures that if SMTP is blocked or slow, the backend responds quickly with a clear error instead of leaving the browser hanging with a generic network issue. Outcome The OTP flow is now more stable and user-friendly: the button cannot be spam-clicked, users receive better status feedback, the SMTP connection is more resilient in Railway when Gmail is accessed over IPv4. This patch addresses the UX problem and the deployment-specific SMTP issue without changing the overall app architecture.
rewrite the readme
Ships:
I built DuskCoffee, a fullstack web application for a modern coffee shop catalog and guest ordering system. Built with Node.js, Express, and Vanilla JavaScript, paired with a cloud-managed MySQL database on Aiven and live hosting on Railway over HTTPS. The most challenging part was managing environment configurations, fixing strict SSL connections between Node.js and Aiven MySQL, and setting up proper routing to prevent API errors. I’m really proud of getting a complete cloud database pipeline running smoothly with zero-downtime deployment setup! To test the project, navigate through the Menu/Products tab to see live data pulled straight from the cloud database, or try out the feedback/contact form...
|
1793098377.712292
|
1793184777.712292
|
|
7799
|
Create: Just for Fun by @janekmusin | Stardance
|
janekmusin
|
1
|
5.94
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-11T18:37:36Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "The project is officially Finished! Creating a minecraft modpack was much easier than I anticipated, thanks to packwiz and modrinth. There were no major hurdles along the way, except for the fact that sodium was undergoing a major update around this time. Thanks to that, shaders with iris are still unusable, but there’re no other issues. Additionally, my modpack isn’t being indexed on modrinth (despite allegedly ‘public’ visibility), but that’s not something I can fix. Also also, Lithostitched, a library mod one of the mods I use needs, have some issues and doesn’t want to be downloaded, so users need to add it manually. Hope you have fun reviewing this project and don’t forget to disable/remove Iris and add Lithostitched, as mentioned in the known issues part of the modpack description. On image: The best create creation I could create within 30 seconds of joining a world", "repo": "https://github.com/First-Non-Interesting-Username/create-just-for-fun", "demo": "https://modrinth.com/modpack/create-just-for-fun"}]...
|
[{"post_id": 14423, "ts": "202 [{"post_id": 14423, "ts": "2026-06-23T15:28:30Z", "hours": 0.9372, "text": "I did a lot of minor things, such as making sure CI passes, fixing the modpack and swapping few mods here and there. I don’t expect to change many things from now, the modpack is finished."}, {"post_id": 6965, "ts": "2026-06-11T17:58:33Z", "hours": 0.48, "text": "I troubleshot some things, made few changes on the mod list and switched from Dependabot to Renovate. I finally got the game to work, which is a success considering what was happening before. More in the ship message."}, {"post_id": 6338, "ts": "2026-06-10T17:50:50Z", "hours": 4.8919, "text": "The modpack is done and waiting for acceptation from modrinth stuff. I only need to create a workflow for automatic pushing to modrinth and I’m set. It was a pretty enjoyable experience. Packwiz makes it easy to maintain and create a modpack, I basically had to create a little bit of infrastructure and push to modrinth."}]...
|
Title: Create: Just for Fun by @janekmusin | Stard Title: Create: Just for Fun by @janekmusin | Stardance
Devlogs:
The modpack is done and waiting for acceptation from modrinth stuff. I only need to create a workflow for automatic pushing to modrinth and I’m set. It was a pretty enjoyable experience. Packwiz makes it easy to maintain and create a modpack, I basically had to create a little bit of infrastructure and push to modrinth.
I troubleshot some things, made few changes on the mod list and switched from Dependabot to Renovate. I finally got the game to work, which is a success considering what was happening before. More in the ship message.
I did a lot of minor things, such as making sure CI passes, fixing the modpack and swapping few mods here and there. I don’t expect to change many things from now, the modpack is finished.
Ships:
The project is officially Finished! Creating a minecraft modpack was much easier than I anticipated, thanks to packwiz and modrinth. There were no major hurdles along the way, except for the fact that sodium was undergoing a major update around this time. Thanks to that, shaders with iris are still unusable, but there’re no other issues. Additionally, my modpack isn’t being indexed on modrinth (despite allegedly ‘public’ visibility), but that’s not something I can fix. Also also, Lithostitched, a library mod one of the mods I use needs, have some issues and doesn’t want to be downloaded, so users need to add it manually. Hope you have fun reviewing this project and don’t forget to disable/remove Iris and add Lithostitched, as mentioned in the known issues part of the modpack description. On image: The best create creation I could create within 30 seconds of joining a world...
|
1793119942.5066793
|
1793206342.5066793
|
|
7824
|
Sights by @eph | Stardance
|
eph
|
1
|
5.44
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-08T14:12:24Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Sights, a real-time hand-tracking VFX application built with MediaPipe and OpenCV. It tracks your hand using your webcam feed and applies visual effects to them. The most challenging part for me wasn’t the hand tracking but rather figuring out how to make vfx with just opencv. Anything graphics design usually isn’t my forte so it was nice to get out of my comfort zone. I’m most proud of how interactive the project feels. Even though I made it it’s still impressing to me how I can move my hands around and in turn affect the program. To demo the project, the user will need a webcam.", "repo": "https://github.com/vanillacrepes/sights", "demo": "https://github.com/vanillacrepes/sights/releases/tag/v1.0.0"}]...
|
[{"post_id": 5541, "ts": "2026 [{"post_id": 5541, "ts": "2026-06-09T10:57:47Z", "hours": 0.4406, "text": "Fixed an issue where your webcam can’t be found. Now you can press space to scroll through all the webcams sights finds on initialization."}, {"post_id": 4209, "ts": "2026-06-07T13:21:00Z", "hours": 1.4861, "text": "Wrapping this project up by modularizing the code, making a simple demo, and writing a readme for the project. It’s been fun!"}, {"post_id": 3390, "ts": "2026-06-06T09:04:45Z", "hours": 3.8108, "text": "Hi! I stopped working on Eulalia for a bit to work on this. Using google mediapipe hand tracking and “filters” made with opencv, it adds vfx to your webcam feed live. Currently I have a working prototype, I’m working on making it more user friendly, making the code less cluttered, and overall polishing it into a better final product."}]...
|
Title: Sights by @eph | Stardance
Devlogs:
Hi! I Title: Sights by @eph | Stardance
Devlogs:
Hi! I stopped working on Eulalia for a bit to work on this. Using google mediapipe hand tracking and “filters” made with opencv, it adds vfx to your webcam feed live. Currently I have a working prototype, I’m working on making it more user friendly, making the code less cluttered, and overall polishing it into a better final product.
Wrapping this project up by modularizing the code, making a simple demo, and writing a readme for the project. It’s been fun!
Fixed an issue where your webcam can’t be found. Now you can press space to scroll through all the webcams sights finds on initialization.
Ships:
I made Sights, a real-time hand-tracking VFX application built with MediaPipe and OpenCV. It tracks your hand using your webcam feed and applies visual effects to them. The most challenging part for me wasn’t the hand tracking but rather figuring out how to make vfx with just opencv. Anything graphics design usually isn’t my forte so it was nice to get out of my comfort zone. I’m most proud of how interactive the project feels. Even though I made it it’s still impressing to me how I can move my hands around and in turn affect the program. To demo the project, the user will need a webcam....
|
1793051706.9766536
|
1793138106.9766536
|
|
7831
|
Windows SpotLight by @chaitanya57313 | Stardance
|
chaitanya57313
|
1
|
14.0
|
103
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-22T14:24:53Z", "hours": 14.0, "multiplier": 10.28, "payout": 103, "blessing": "neutral", "text": "Spotlight is a lightweight windows search engine. To use the actual version, you’ll need to download and run the python files from my github. (I am going to make an installer soon!!!). You can also try the front end demo web verison.", "repo": "https://github.com/Chaitanya1956/Windows-Search", "demo": "https://bagesai.me/spotlightdemo/"}]...
|
[{"post_id": 13716, "ts": "202 [{"post_id": 13716, "ts": "2026-06-22T14:13:55Z", "hours": 13.0, "text": "SPOTLIGHT - PHASE 1 SUMMARY Spotlight is a Windows launcher built using Python that allows users to quickly search and launch applications and files using the Alt + Space shortcut. The goal of Phase 1 was to create a fast, reliable and expandable foundation instead of a simple prototype. The project contains 34 files and around 2100 lines of Python code. It follows a modular architecture where each component has a specific responsibility, making the application easier to maintain, test and expand in future phases. The utilities layer stores constants, logging functions and helper functions. Constants such as search limits and window dimensions are stored in one place, while a debouncer reduces unnecessary searches when users type quickly. The models layer contains data structures used throughout the application. These include search results, launch history and application settings. The core engine is the most important part of Spotlight. The Cache Manager handles all database operations using SQLite and prevents the interface from freezing. The File Indexer scans folders, ignores unnecessary directories and monitors file changes automatically. The Search Engine combines SQL filtering with fuzzy matching to provide accurate search results. The Command Runner launches files and applications, while the Settings Manager saves user preferences. The Launcher connects all components together. The services layer discovers installed applications from the Windows Start Menu, extracts their icons and manages global keyboard shortcuts. The user interface consists of a floating, frameless search window inspired by Windows 11. It includes a search bar and a list of results showing icons, titles and categories. Users can navigate entirely with the keyboard using arrow keys, Enter and Escape. The application uses a simple design system with a dark theme, one orange accent colour and subtle animations to create a polished appearance without distractions. During development, an important bug was discovered. The search engine originally filtered results using the entire query, causing spelling mistakes to fail. This was fixed by filtering only the first one or two letters before applying fuzzy matching. As a result, searches with minor mistakes can still find the correct files. Several advanced features were intentionally postponed to future phases. These include file previews, a settings window, clipboard history, plugins, calculators and natural language commands. Performance was also prioritised. The application is designed to launch in under one second, provide search responses in under 50 milliseconds, use minimal CPU power and consume less than 150 MB of RAM. Overall, Phase 1 successfully creates a fast, stable and scalable foundation that can support more advanced features in future versions without requiring major redesigns."}]...
|
Title: Windows SpotLight by @chaitanya57313 | Star Title: Windows SpotLight by @chaitanya57313 | Stardance
Devlogs:
SPOTLIGHT - PHASE 1 SUMMARY Spotlight is a Windows launcher built using Python that allows users to quickly search and launch applications and files using the Alt + Space shortcut. The goal of Phase 1 was to create a fast, reliable and expandable foundation instead of a simple prototype. The project contains 34 files and around 2100 lines of Python code. It follows a modular architecture where each component has a specific responsibility, making the application easier to maintain, test and expand in future phases. The utilities layer stores constants, logging functions and helper functions. Constants such as search limits and window dimensions are stored in one place, while a debouncer reduces unnecessary searches when users type quickly. The models layer contains data structures used throughout the application. These include search results, launch history and application settings. The core engine is the most important part of Spotlight. The Cache Manager handles all database operations using SQLite and prevents the interface from freezing. The File Indexer scans folders, ignores unnecessary directories and monitors file changes automatically. The Search Engine combines SQL filtering with fuzzy matching to provide accurate search results. The Command Runner launches files and applications, while the Settings Manager saves user preferences. The Launcher connects all components together. The services layer discovers installed applications from the Windows Start Menu, extracts their icons and manages global keyboard shortcuts. The user interface consists of a floating, frameless search window inspired by Windows 11. It includes a search bar and a list of results showing icons, titles and categories. Users can navigate entirely with the keyboard using arrow keys, Enter and Escape. The application uses a simple design system with a dark theme, one orange accent colour and subtle animations to create a polished appearance without distractions. During development, an important bug was discovered. The search engine originally filtered results using the entire query, causing spelling mistakes to fail. This was fixed by filtering only the first one or two letters before applying fuzzy matching. As a result, searches with minor mistakes can still find the correct files. Several advanced features were intentionally postponed to future phases. These include file previews, a settings window, clipboard history, plugins, calculators and natural language commands. Performance was also prioritised. The application is designed to launch in under one second, provide search responses in under 50 milliseconds, use minimal CPU power and consume less than 150 MB of RAM. Overall, Phase 1 successfully creates a fast, stable and scalable foundation that can support more advanced features in future versions without requiring major redesigns.
Ships:
Spotlight is a lightweight windows search engine. To use the actual version, you’ll need to download and run the python files from my github. (I am going to make an installer soon!!!). You can also try the front end demo web verison....
|
1792878774.859269
|
1793742774.859269
|
|
7832
|
Control Game by @abigail_L | Stardance
|
abigail_L
|
1
|
8.0
|
28
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T12:16:14Z", "hours": 8.0, "multiplier": 3.46, "payout": 28, "blessing": "neutral", "text": "I made a game where the player controls an astronaut that can control a red robot with visible arrows in the top left corner. The goal is for the red robot to get to the green robot. To move the astronaut the player can use arrow keys or “W”, “A”, “S”,“D”. A challenge I faced was continuing to work on the project, even when I lost motivation. I am very proud that I signed up for the game jam and actually sticked to completing the game. Below is an image of one of the mazes/levels", "repo": "https://github.com/Abbby1007/Control-Evil-Robot", "demo": "https://abbby1007.itch.io/control-not-so-good-robot"}]...
|
[{"post_id": 4110, "ts": "2026 [{"post_id": 4110, "ts": "2026-06-07T09:36:39Z", "hours": 3.4883, "text": "I have completed the game. In this video the robot is close to the goal, to show a sped up version of what the full game looks like. In the actually game I have spaced out the two robots farther from each other. Theme: Control Limitation: You are the enemy"}, {"post_id": 3419, "ts": "2026-06-06T10:55:56Z", "hours": 2.855, "text": "For this game jam game where you can control an evil robot. I have worked on the layout of the tutorial level and level 1. I will work on levels 2 and 3. Then I will make the player, robot, and goal sprite. While also making an end screen For the tiles I am using the “world of Solaria” Free demo Pack by Jamie Brownhill."}, {"post_id": 2685, "ts": "2026-06-05T11:15:32Z", "hours": 1.6531, "text": "This is a game for a mini game jam. Theme is Control with a limitation that “You are the emeny” the concept is that the player will control an evil robot, that will need to navigate through a maze towards a “good” robot. Here I have completed the Basic controls"}]...
|
Title: Control Game by @abigail_L | Stardance
Dev Title: Control Game by @abigail_L | Stardance
Devlogs:
This is a game for a mini game jam. Theme is Control with a limitation that “You are the emeny” the concept is that the player will control an evil robot, that will need to navigate through a maze towards a “good” robot. Here I have completed the Basic controls
For this game jam game where you can control an evil robot. I have worked on the layout of the tutorial level and level 1. I will work on levels 2 and 3. Then I will make the player, robot, and goal sprite. While also making an end screen For the tiles I am using the “world of Solaria” Free demo Pack by Jamie Brownhill.
I have completed the game. In this video the robot is close to the goal, to show a sped up version of what the full game looks like. In the actually game I have spaced out the two robots farther from each other. Theme: Control Limitation: You are the enemy
Ships:
I made a game where the player controls an astronaut that can control a red robot with visible arrows in the top left corner. The goal is for the red robot to get to the green robot. To move the astronaut the player can use arrow keys or “W”, “A”, “S”,“D”. A challenge I faced was continuing to work on the project, even when I lost motivation. I am very proud that I signed up for the game jam and actually sticked to completing the game. Below is an image of one of the mazes/levels...
|
1793130686.6902852
|
1793217086.6902852
|
|
7848
|
fixMy-Portfolio by @Cret | Stardance
|
Cret
|
1
|
3.0
|
20
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T04:03:42Z", "hours": 3.0, "multiplier": 7.24, "payout": 20, "blessing": "neutral", "text": "This is the MVP for the ship (maybe nah, I finish it long time ago) However, this series of modifications makes the entire project feel more polished; bugs (such as redirection issues) were fixed, and a 404 page and Markdown compatibility for the blog were added.", "repo": "https://github.com/wenfeng110402/MyPortfolio", "demo": "https://cret.uk"}]...
|
[{"post_id": 3989, "ts": "2026 [{"post_id": 3989, "ts": "2026-06-07T04:00:31Z", "hours": 1.4817, "text": "👍the blogs works I am currently fixing image path errors (404s) and cleaning up redundant files in my Next.js portfolio project, as well as adding a blog page with Markdown support. Additionally, after realizing that translation changes were unnecessary, I reverted the “About” page to its original state to ensure better overall consistency."}, {"post_id": 3529, "ts": "2026-06-06T14:44:24Z", "hours": 1.2569, "text": "removed some photos. and I standardize some code and then create a 404 page terms page and skills page."}]...
|
Title: fixMy-Portfolio by @Cret | Stardance
Devlo Title: fixMy-Portfolio by @Cret | Stardance
Devlogs:
removed some photos. and I standardize some code and then create a 404 page terms page and skills page.
👍the blogs works I am currently fixing image path errors (404s) and cleaning up redundant files in my Next.js portfolio project, as well as adding a blog page with Markdown support. Additionally, after realizing that translation changes were unnecessary, I reverted the “About” page to its original state to ensure better overall consistency.
Ships:
This is the MVP for the ship (maybe nah, I finish it long time ago) However, this series of modifications makes the entire project feel more polished; bugs (such as redirection issues) were fixed, and a 404 page and Markdown compatibility for the blog were added....
|
1793130815.3163135
|
1793217215.3163135
|
|
7854
|
CometOS by @Aradhana | Stardance
|
Aradhana
|
1
|
39.23
|
48
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-22T11:27:56Z", "hours": 31.0, "multiplier": 1.71, "payout": 48, "blessing": "neutral", "text": "I built a WebOS that was designed to explore a character - the Sorceress Comet, a student at the Arx Nubium - and her fictional world of Alarica. As people use it, they find out more about Comet’s world, thoughts and family. It has a notebook app (where you can write your thoughts), a family tree app (to see a bit more of what Comet’s life is like) and comes with added functionality for the users - a date and time display, and battery meter. Now, the project is finally SHIPPED!", "repo": "https://github.com/dragonloversod051-max/CometOS", "demo": "https://dragonloversod051-max.github.io/CometOS/"}]...
|
[{"post_id": 79292, "ts": "202 [{"post_id": 79292, "ts": "2026-10-13T11:03:42Z", "hours": 8.2306, "text": "Devlog #8 Ok, so this is the FIRST devlog after the ship. Not really happy about how the ship went but oh well. Anyway, so, I added stuff: A Settings App Upgrades to the UI Worked on a sort of dictionary for all the new stuff that I’m introducing (after all, it is CometOS) The Settings App: Ok, so one of the major themes in the feedback I got was there needed to be more apps (since its an OS). So, I added a settings app, as just a basic, customization app. So, you can change the background image, and there’s a bit of design choices as well. I kept it so you need to scroll down to see all the images (some people won’t agree with this, but personally, I really like it. The scrolling feels more interactive and is required for a window size that looks really, really good). Also, the borders of the buttons turn blue when selected, and there obviously also a shadow indication that its a button when you hover over it. UI changes: So this was actually pretty small but looked really cool. I’ve seen on some sites there are just these little elements that blur the background behind them. While I was tinkering with css for the button shading I realized there was a style of filter: blur() . From there I found out about backdrop-filter: blur() and used that in the CometOS welcome window and the top and bottom bars. The dictionary app (name needs workshopping) So this is basically just because CometOS is about a fictional character in a fantasy world, so there needed to be an app that dealt with some words and terms used in other partts of the website (specifically the family tree). I felt there needed to be something to explain it, so, I added this. Its not done, so far I’m just done with one of the Relseiðr pages. Currently this is just hidden with display: none so I can work on functionality first. Challenges: There were really only a few challenges this time. The largest one was actually just getting the seperate visual cues which go ( oh, this is interactive! ) for the button and the image inside. Because I kept accidentally giving the button’s new classList to the image. And thats when I realized event.target and event.currentTarget were different and made for this….. On a side note, omg, display: inline-flex is so helpful! What I’ll work on next: I have now realized that since I’m adding so many apps, I need to add proper, adaptive view bounds. Before this I was using local pixel-specific bounds which were adapted to my viewport, and just not putting it on github, because I had already put in the work for those view bounds a few months ago, and it worked really well for me. So, anyway, I have now decided I need proper view bounds, so definitely going to work on that. Also, heres the new Settings app, and the beginning of the dictionary app."}, {"post_id": 71729, "ts": "2026-09-21T12:19:13Z", "hours": 2.21, "text": "Devlog #7 So, I thought it was ready to be shipped, but it wasn’t. In the final checks, I found out that because I had used pixel - specific drag bounds , while it worked perfectly on my laptop, it didn’t on anyone else’s (since other devices have different viewports, different areas. Some have longer lengths or widths than others, leading drag bounds to potentially be in the middle of the screen). I tinkered with it for a while (enlisting a bit of AI help) , but then realized that there was something about the new code that was messing up the notebook app (the sidebar stuck to the edge of the viewport). And, since there was about only one week left (and exams are starting soon), I decided to not accidentally mess up anything else, and so, deleted the drag bounds - I mean, better to be able to drag windows anywhere than have bounds that completely restrict it, right? - The good part is that even if the window goes out of the viewport somehow, you can just reload the screen to get it all back, which has no real downside since notes autosave. So anyway, now, we are actually , finally ready to ship ! This was what was happening to the notebook app btw"}, {"post_id": 43179, "ts": "2026-08-08T09:26:22Z", "hours": 3.4597, "text": "Devlog #6 We are FINALLY DONE and ready for the FIRST SHIP! Here’s whats new: Added information bubbles for each and every character in the family tree, which can be easily opened and closed. Fixed the selection for icons in the bottom bar: The green highlighted background would also highlight the areas where there were padding which we didn’t want because the icons would then be off center. Fixed this by adding a new transparent div in the middle, so padding is no longer required. Challenges: Fixing the icon selection bug. I played around with box-size for a bit but then chose to just add a transparent div between icons. Getting the information window to move along with the family tree window (as that is draggable). After a lot of testing, I realized I could just keep it inside the div but in positioning, its overflowing, so with an overflow: auto tag, it’s now set up and working! This is a screenshot of how the info bubble would break because it wasn’t in the same div:"}, {"post_id": 38671, "ts": "2026-08-01T05:38:48Z", "hours": 5.8169, "text": "Devlog #5 Ok, so, update: Created the family tree Improved feel of the app (through a visual sign when you hover over a character button) Fully initialized the window for the family tree app (made it closable, draggable, opens with an icon, added drag bounds). Challenges: The family tree image kept going above the icons used to drag and close the window. I put them in a different and experimented with different ways for SOOOO long - turned out I was just missing a position: absolute tag…. There was also a small bug where the buttons would go under the image instead of on it. Here are some pictures of the bugs, since it’s pretty hard to explain:"}, {"post_id": 34516, "ts": "2026-07-25T09:34:28Z", "hours": 0.6922, "text": "Devlog #4 I’ve started the next app - an interactive family tree. Since CometOS is based around Comet, I figured I should add a family tree. So this app is going to have clickable buttons for each member of the family, to give some info. Basically, its a massive lore drop. Here’s the wireframe for the app, and also an entire page I spent planning it because I ran into a few problems…"}, {"post_id": 31185, "ts": "2026-07-19T11:57:03Z", "hours": 12.5381, "text": "Devlog #3 What’s new: Added a bottom bar to store content selection options Added a notes app which is editable (and stored in javascript)-you can add your own notes. Added a save feature to the notes app-log back in anytime and the note is still there. YOU WOULD NOT BELIEVE HOW LONG THIS TOOK ( but, I learned how to save things in localStorage ). Fixed a bug where was at the bottom of the and the .js file and .css file weren’t loading in the live server. Fixed the bug where you lose the handle and the window gets stuck at the top/bottom of the page by making it so you can click through the top and bottom bar. Challenges: I spent a whole afternoon trying to come up with a clever way to avoid putting html in my .js file (because it looked messy), only to end up putting it in my .js file….. MOVING ON, There was some really weird stuff happening with saving notes. Like, I would write stuff, and it would be saved, but in different ’s? So only one was actually editable and the rest were all floating under it. Started to debug in a live server instead of as a file. The html and css files weren’t loading in. I spent so long trying to figure out why, and then realized that should be at the top of the body, not at the bottom ( You know, like an actual head. Wow, thats pretty self-explanatory ). So then, I fixed that and to check if it was working or not, made the background hot pink in css.( AND IT WORKED! And I will never be able to forget that image ). What’s next: Ok, so next, I still have to finish a few things. Make it so that you can’t drag windows past a certain limit (to prevent the background image scrolling and multiplying - learned how to clamp draggable elements to the viewport!). START STEP 5! So since this entire webOS is based around a fictional character-Comet, I think I’ll make an interactive family tree. So, each person has buttons and that leads you to a brief description about them ( and lore. LOTS of lore ). This is how the webOS looked in the test. I’m still not sure how the top bar also turned light pink, but, cool I guess"}, {"post_id": 15523, "ts": "2026-06-25T06:48:06Z", "hours": 1.6658, "text": "Devlog#2 Done with step 3. So now I can open, close and move around the welcome screen window. The cross acts as the close button, and you click and drag the hand part of the window to move it around. So I’ve updated the CometOS text in the top bar to open this window - hence it looks a lot more like a button. I think for the next windows and apps I’m going to make the open button in a side bar. And I finally figured out what classes are! So yeah, for now thats it, but I think by the end of step 4 its going to be a massive update with a lot more things."}, {"post_id": 13644, "ts": "2026-06-22T11:56:42Z", "hours": 4.2733, "text": "Devlog #1 So this is CometOS which is from the mission WebOS 1. It revolves around a fictional character - the Sorceress (in-training) Comet, set in the fictional world of Alarica. So far I’ve finished uptil step 2. So the top bar can track time, and also battery levels and gives custom messages based on the battery. Right now that’s pretty much it but I can’t wait to expand the project and develop the world and everything."}]...
|
Title: CometOS by @Aradhana | Stardance
Devlogs:
Title: CometOS by @Aradhana | Stardance
Devlogs:
Devlog #1 So this is CometOS which is from the mission WebOS 1. It revolves around a fictional character - the Sorceress (in-training) Comet, set in the fictional world of Alarica. So far I’ve finished uptil step 2. So the top bar can track time, and also battery levels and gives custom messages based on the battery. Right now that’s pretty much it but I can’t wait to expand the project and develop the world and everything.
Devlog#2 Done with step 3. So now I can open, close and move around the welcome screen window. The cross acts as the close button, and you click and drag the hand part of the window to move it around. So I’ve updated the CometOS text in the top bar to open this window - hence it looks a lot more like a button. I think for the next windows and apps I’m going to make the open button in a side bar. And I finally figured out what classes are! So yeah, for now thats it, but I think by the end of step 4 its going to be a massive update with a lot more things.
Devlog #3 What’s new: Added a bottom bar to store content selection options Added a notes app which is editable (and stored in javascript)-you can add your own notes. Added a save feature to the notes app-log back in anytime and the note is still there. YOU WOULD NOT BELIEVE HOW LONG THIS TOOK ( but, I learned how to save things in localStorage ). Fixed a bug where was at the bottom of the and the .js file and .css file weren’t loading in the live server. Fixed the bug where you lose the handle and the window gets stuck at the top/bottom of the page by making it so you can click through the top and bottom bar. Challenges: I spent a whole afternoon trying to come up with a clever way to avoid putting html in my .js file (because it looked messy), only to end up putting it in my .js file….. MOVING ON, There was some really weird stuff happening with saving notes. Like, I would write stuff, and it would be saved, but in different ’s? So only one was actually editable and the rest were all floating under it. Started to debug in a live server instead of as a file. The html and css files weren’t loading in. I spent so long trying to figure out why, and then realized that should be at the top of the body, not at the bottom ( You know, like an actual head. Wow, thats pretty self-explanatory ). So then, I fixed that and to check if it was working or not, made the background hot pink in css.( AND IT WORKED! And I will never be able to forget that image ). What’s next: Ok, so next, I still have to finish a few things. Make it so that you can’t drag windows past a certain limit (to prevent the background image scrolling and multiplying - learned how to clamp draggable elements to the viewport!). START STEP 5! So since this entire webOS is based around a fictional character-Comet, I think I’ll make an interactive family tree. So, each person has buttons and that leads you to a brief description about them ( and lore. LOTS of lore ). This is how the webOS looked in the test. I’m still not sure how the top bar also turned light pink, but, cool I guess
Devlog #4 I’ve started the next app - an interactive family tree. Since CometOS is based around Comet, I figured I should add a family tree. So this app is going to have clickable buttons for each member of the family, to give some info. Basically, its a massive lore drop. Here’s the wireframe for the app, and also an entire page I spent planning it because I ran into a few problems…
Devlog #5 Ok, so, update: Created the family tree Improved feel of the app (through a visual sign when you hover over a character button) Fully initialized the window for the family tree app (made it closable, draggable, opens with an icon, added drag bounds). Challenges: The family tree image kept going above the icons used to drag and close the window. I put them in a different and experimented with different ways for SOOOO long - turned out I was just missing a position: absolute tag…. There was also a small bug where the buttons would go under the image instead of on it. Here are some pictures of the bugs, since it’s pretty hard to explain:
Devlog #6 We are FINALLY DONE and ready for the FIRST SHIP! Here’s whats new: Added information bubbles for each and every character in the family tree, which can be easily opened and closed. Fixed the selection for icons in the bottom bar: The green highlighted background would also highlight the areas where there were padding which we didn’t want because the icons would then be off center. Fixed this by adding a new transparent div in the middle, so padding is no longer required. Challenges: Fixing the icon selection bug. I played around with box-size for a bit but then chose to just add a transparent div between icons. Getting the information window to move along with the family tree window (as that is draggable). After a lot of testing, I realized I could just keep it inside the div but in positioning, its overflowing, so with an overflow: auto tag, it’s now set up and working! This is a screenshot of how the info bubble would break because it wasn’t in the same div:
Devlog #7 So, I thought it was ready to be shipped, but it wasn’t. In the final checks, I found out that because I had used pixel - specific drag bounds , while it worked perfectly on my laptop, it didn’t on anyone else’s (since other devices have different viewports, different areas. Some have longer lengths or widths than others, leading drag bounds to potentially be in the middle of the screen). I tinkered with it for a while (enlisting a bit of AI help) , but then realized that there was something about the new code that was messing up the notebook app (the sidebar stuck to the edge of the viewport). And, since there was about only one week left (and exams are starting soon), I decided to not accidentally mess up anything else, and so, deleted the drag bounds - I mean, better to be able to drag windows anywhere than have bounds that completely restrict it, right? - The good part is that even if the window goes out of the viewport somehow, you can just reload the screen to get it all back, which has no real downside since notes autosave. So anyway, now, we are actually , finally ready to ship ! This was what was happening to the notebook app btw
Devlog #8 Ok, so this is the FIRST devlog after the ship. Not really happy about how the ship went but oh well. Anyway, so, I added stuff: A Settings App Upgrades to the UI Worked on a sort of dictionary for all the new stuff that I’m introducing (after all, it is CometOS) The Settings App: Ok, so one of the major themes in the feedback I got was there needed to be more apps (since its an OS). So, I added a settings app, as just a basic, customization app. So, you can change the background image, and there’s a bit of design choices as well. I kept it so you need to scroll down to see all the images (some people won’t agree with this, but personally, I really like it. The scrolling feels more interactive and is required for a window size that looks really, really good). Also, the borders of the buttons turn blue when selected, and there obviously also a shadow indication that its a button when you hover over it. UI changes: So this was actually pretty small but looked really cool. I’ve seen on some sites there are just these little elements that blur the background behind them. While I was tinkering with css for the button shading I realized there was a style of filter: blur() . From there I found out about backdrop-filter: blur() and used that in the CometOS welcome window and the top and bottom bars. The dictionary app (name needs workshopping) So this is basically just because CometOS is about a fictional character in a fantasy world, so there needed to be an app that dealt with some words and terms used in other partts of the website (specifically the family tree). I felt there needed to be something to explain it, so, I added this. Its not done, so far I’m just done with one of the Relseiðr pages. Currently this is just hidden with display: none so I can work on functionality first. Challenges: There were really only a few challenges this time. The largest one was actually just getting the seperate visual cues which go ( oh, this is interactive! ) for the button and the image inside. Because I kept accidentally giving the button’s new classList to the image. And thats when I realized event.target and event.currentTarget were different and made for this….. On a side note, omg, display: inline-flex is so helpful! What I’ll work on next: I have now realized that since I’m adding so many apps, I need to add proper, adaptive view bounds. Before this I was using local pixel-specific bounds which were adapted to my viewport, and just not putting it on github, because I had already put in the work for those view bounds a few months ago, and it worked really well for me. So, anyway, I have now decided I need proper view bounds, so definitely going to work on that. Also, heres the new Settings app, and the beginning of the dictionary app.
Ships:
I built a WebOS that was designed to explore a character - the Sorceress Comet, a student at the Arx Nubium - and her fictional world of Alarica. As people use it, they find out more about Comet’s world, thoughts and family. It has a notebook app (where you can write your thoughts), a family tree app (to see a bit more of what Comet’s life is like) and comes with added functionality for the users - a date and time display, and battery meter. Now, the project is finally SHIPPED!...
|
1793152232.0427723
|
1793238632.0427723
|
|
7864
|
Chief Purr-officer (CPO) by @ThatChillCat | Starda Chief Purr-officer (CPO) by @ThatChillCat | Stardance...
|
ThatChillCat
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T09:52:05Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Chief Purr-Officier a very simple slack bot for the mission “Make a Slack Bot”. It has 6 commands /cpo-help - Shows every command available /cpo-ping - Shows the Latency /cpo-joke - Get a random joke /cpo-catfact - Get a random cat fact /cpo-explode - Overstimulates the Chief and triggers a detonation /cpo-knock - Knocks something valuable off the table This also was my first time making a slack bot and also my first time using nest! I also learned how to use SSH now! The most difficiult part for me was learning how to host this on a nest server.", "repo": "https://github.com/x86paul/Chief-Purr-Officier", "demo": "https://app.slack.com/client/E09V59WQY1E/C0B9NRZCU1W"}]...
|
[{"post_id": 4074, "ts": "2026 [{"post_id": 4074, "ts": "2026-06-07T08:27:29Z", "hours": 0.5864, "text": "I am working on a goofy slack bot called Chief Purr-Officier. It is a simple bot which does some goofy things too. The Commands of the bot is /cpo-ping - Shows Latency /cpo-joke - Get a random joke /cpo-catfack - Get a random fact about cats /cpo-knock - Knock something off the table /cpo-explode - Triggers a explosion"}]...
|
Title: Chief Purr-officer (CPO) by @ThatChillCat | Title: Chief Purr-officer (CPO) by @ThatChillCat | Stardance
Devlogs:
I am working on a goofy slack bot called Chief Purr-Officier. It is a simple bot which does some goofy things too. The Commands of the bot is /cpo-ping - Shows Latency /cpo-joke - Get a random joke /cpo-catfack - Get a random fact about cats /cpo-knock - Knock something off the table /cpo-explode - Triggers a explosion
Ships:
I made Chief Purr-Officier a very simple slack bot for the mission “Make a Slack Bot”. It has 6 commands /cpo-help - Shows every command available /cpo-ping - Shows the Latency /cpo-joke - Get a random joke /cpo-catfact - Get a random cat fact /cpo-explode - Overstimulates the Chief and triggers a detonation /cpo-knock - Knocks something valuable off the table This also was my first time making a slack bot and also my first time using nest! I also learned how to use SSH now! The most difficiult part for me was learning how to host this on a nest server....
|
1793119814.515313
|
1793206214.515313
|
|
7876
|
myMacropad by @heian | Stardance
|
heian
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-11T23:09:18Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Custom Hackpad! My first time using QMK, so that was a learning curve. I’m proud of how it turned out.", "repo": "https://github.com/syntonos/myMacropad", "demo": ""}]...
|
[{"post_id": 7147, "ts": "2026 [{"post_id": 7147, "ts": "2026-06-11T22:43:34Z", "hours": 2.4367, "text": "Made a macropad! Did not expect to suffer so much. I genuinely think engineering is just a measure of how many small problems you can tolerate before you combust. This took wayy more than 2.5 hours I just did not know how to use either Lapse or Hackatime and I suffered quite a lot off camera. PCB wasn’t that bad. I still have no idea how KiCad does any sort of positioning (from where in the object is the position calculated?? why is it so different across objects?? why does align just never work???), and it’s also deeply wonky switching back and forth from KiCad to Altium for different projects. It’s really nice not having to worry about any complications (signal processing, hunting down or making 3D models, etc) with wiring for once. CAD went alright! I feel like you notice a lot of fun quality of life features that Fusion is missing when you start doing CAD for a bit. I’d love to be able to group objects or parts of a sketch and have them behave the same way. I’d love to have an easy way to find the midpoint or centers in a sketch. I’d love a way to align objects. oh well ! First time using QMK! Took a while to install and learn. I think I genuinely spent an hour scrolling through documentation. I imagine I’ll have to do some more wrangling when I flash it. Finally done! I can finally sleep."}]...
|
Title: myMacropad by @heian | Stardance
Devlogs:
Title: myMacropad by @heian | Stardance
Devlogs:
Made a macropad! Did not expect to suffer so much. I genuinely think engineering is just a measure of how many small problems you can tolerate before you combust. This took wayy more than 2.5 hours I just did not know how to use either Lapse or Hackatime and I suffered quite a lot off camera. PCB wasn’t that bad. I still have no idea how KiCad does any sort of positioning (from where in the object is the position calculated?? why is it so different across objects?? why does align just never work???), and it’s also deeply wonky switching back and forth from KiCad to Altium for different projects. It’s really nice not having to worry about any complications (signal processing, hunting down or making 3D models, etc) with wiring for once. CAD went alright! I feel like you notice a lot of fun quality of life features that Fusion is missing when you start doing CAD for a bit. I’d love to be able to group objects or parts of a sketch and have them behave the same way. I’d love to have an easy way to find the midpoint or centers in a sketch. I’d love a way to align objects. oh well ! First time using QMK! Took a while to install and learn. I think I genuinely spent an hour scrolling through documentation. I imagine I’ll have to do some more wrangling when I flash it. Finally done! I can finally sleep.
Ships:
Custom Hackpad! My first time using QMK, so that was a learning curve. I’m proud of how it turned out....
|
1792878654.6206846
|
1793742654.6206846
|
|
7880
|
My awesome Slashpad! by @alessandro_09 | Stardance
|
alessandro_09
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-11T19:08:25Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my very own hackpad! By reviewing the provided guides and searching through the Internet, I managed to customize it a bit more too without copying the example made from the guide! I had various challenges since I never did 3D Modeling with Fusion 360 and never made a schematic and a PCB in my life. But thanks to this project I learned how to do it and I even liked it really much so I’ll probably explore Hardware making further! I’m really proud of the work I did and I hope to be able to build it physically as soon as possible so I can use it and even improve it further! One thing that I’m not so sure about is the firmware cause the documentation was pretty hard to follow.. But it should be good enough to work! Thanks for everything you do and for taking the time to review my project!", "repo": "https://github.com/fireslash88/Slashpad", "demo": ""}]...
|
[{"post_id": 6993, "ts": "2026 [{"post_id": 6993, "ts": "2026-06-11T18:54:44Z", "hours": 2.4597, "text": "Day #3 Creating the firmware and adding the last files I finally managed to export the case as .step files and loaded them onto the GitHub Repo! Then, I started working on the firmware and was able to complete it! I’m not sure that it works cause it was pretty hard to understand but in the end I managed at least to do something! (Once I’m sure that everything is working I’ll probably add VIA support). Then, I fixed somethings on the PCB cause I noticed that to use the button of the Encoder I had to wire it to the switch matrix, so I went into KiCad, added another column to the matrix and re-wired everything! Anyway, this is probably the last Devlog for this project since I made everything I had to do. So, thank you for everything and see you in another project!"}, {"post_id": 6594, "ts": "2026-06-11T02:24:05Z", "hours": 4.9892, "text": "Day #2 Creating the case I finally created the case for my Hackpad! It was probably the hardest thing ever, especially as someone who has never used Fusion 360 before. And honestly, I hate it pretty much. I even tried to export the 3D model as a .step file but it just keep crashing over and over. Anyway, other than that I: Added more cats onto the PCB as decoration Adjusted and fixed some things on the schematic Adjusted and re-routed every track on the PCB It was a rough day because of Fusion 360 that kept crashing.. But whatever, see you in another devlog!"}, {"post_id": 5341, "ts": "2026-06-09T02:28:35Z", "hours": 2.8236, "text": "Day #1 Creating the schematic and the PCB I’m making my very first macropad from scratch! Since this was my first time creating a schematic and routing a PCB, it was a bit chaotic but I managed to get it done at the end! It wasn’t that hard actually, especially thanks to the guides given by the Hack Club! What I did today: Created the schematic and then routed all the wires on the PCB. Loaded the 3D models of the various footprints -Decorated the PCB with some silly cats (I love them) Created a GitHub repository with all the files and made the first commit Started writing the readme file. It’s still incomplete and I’ll modify it while I continue the project. That was all and see you all in another Devlog!"}]...
|
Title: My awesome Slashpad! by @alessandro_09 | St Title: My awesome Slashpad! by @alessandro_09 | Stardance
Devlogs:
Day #1 Creating the schematic and the PCB I’m making my very first macropad from scratch! Since this was my first time creating a schematic and routing a PCB, it was a bit chaotic but I managed to get it done at the end! It wasn’t that hard actually, especially thanks to the guides given by the Hack Club! What I did today: Created the schematic and then routed all the wires on the PCB. Loaded the 3D models of the various footprints -Decorated the PCB with some silly cats (I love them) Created a GitHub repository with all the files and made the first commit Started writing the readme file. It’s still incomplete and I’ll modify it while I continue the project. That was all and see you all in another Devlog!
Day #2 Creating the case I finally created the case for my Hackpad! It was probably the hardest thing ever, especially as someone who has never used Fusion 360 before. And honestly, I hate it pretty much. I even tried to export the 3D model as a .step file but it just keep crashing over and over. Anyway, other than that I: Added more cats onto the PCB as decoration Adjusted and fixed some things on the schematic Adjusted and re-routed every track on the PCB It was a rough day because of Fusion 360 that kept crashing.. But whatever, see you in another devlog!
Day #3 Creating the firmware and adding the last files I finally managed to export the case as .step files and loaded them onto the GitHub Repo! Then, I started working on the firmware and was able to complete it! I’m not sure that it works cause it was pretty hard to understand but in the end I managed at least to do something! (Once I’m sure that everything is working I’ll probably add VIA support). Then, I fixed somethings on the PCB cause I noticed that to use the button of the Encoder I had to wire it to the switch matrix, so I went into KiCad, added another column to the matrix and re-wired everything! Anyway, this is probably the last Devlog for this project since I made everything I had to do. So, thank you for everything and see you in another project!
Ships:
I made my very own hackpad! By reviewing the provided guides and searching through the Internet, I managed to customize it a bit more too without copying the example made from the guide! I had various challenges since I never did 3D Modeling with Fusion 360 and never made a schematic and a PCB in my life. But thanks to this project I learned how to do it and I even liked it really much so I’ll probably explore Hardware making further! I’m really proud of the work I did and I hope to be able to build it physically as soon as possible so I can use it and even improve it further! One thing that I’m not so sure about is the firmware cause the documentation was pretty hard to follow.. But it should be good enough to work! Thanks for everything you do and for taking the time to review my project!...
|
1793130932.0864093
|
1793217332.0864093
|
|
7886
|
VisualSort by @alessandro_09 | Stardance
|
alessandro_09
|
1
|
28.89
|
244
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-07T14:30:29Z", "hours": 28.0, "multiplier": 8.62, "payout": 244, "blessing": "neutral", "text": "I made a C++ software based on Raylib and Raygui to visualize how sorting algorithms work! Working on this project was a bit challenging for me as I never code something like this and by using external libraries! Another challenging thing was implementing the sorting algortihms since I didn’t find a way to implement them with their original code! I’m proud of what I’ve made and I’m happy to have learned a lot of new things and new ways to code! One thing people should know is that unfortunately this software is for Windows only and not for Linux or MacOS. I don’t know how to compile code for those platforms but I’ll learn how to do it!", "repo": "https://github.com/fireslash88/VisualSort", "demo": "https://github.com/fireslash88/VisualSort/releases/tag/v1.1"}]...
|
[{"post_id": 64517, "ts": "202 [{"post_id": 64517, "ts": "2026-09-08T23:55:28Z", "hours": 0.8856, "text": "Thanks to everyone! Hey there, it’s been a while! My project got approved and I got my payout, yay! I’ve been absent for quite a while because of summer holidays and other than that I just played games with my friends.. Lol Anyway, I’m finally back and ready to make another project! This time, the project I want to make is REAALLY hard.. And I don’t think I’ll ever manage to get it done. But who cares right? I mean, this is what programming is all about… Making things to improve yourself even if they’re hard! And you can even have fun in the meanwhile! (while suffering too, but those are details.. shh) I genuinely hope I’ll be able to make a good project even if I don’t have enough time.. I should have made this project sooner.. Better late than never… I’ll make the first devlog of the project tomorrow (or later, since for me it’s currently 1:49AM) and I won’t reveal much! But if you go check out my profile you can see for yourself what’s about! For last, I want to thank everyone that rated my project and gave me so much feedback! I don’t know if I’ll work on this project again since it was just something to prepare myself for other projects and ideas of mine but I’ll think about it.. Thanks for everything and hope to see y’all on my other project! I know that it’s nothing and probably bad compared to some big projects I checked out here on Stardance, and honestly I’m amazed by what teenagers can do at this age.. Genuinely, some people are crazy and I admire them so much and I hope one day, even if it’s late compared to them, I’ll be able to create projects like theirs! Love you all! (screenshot of a silly cat since I don’t have anything to show)"}, {"post_id": 42645, "ts": "2026-08-07T14:11:42Z", "hours": 0.4114, "text": "Uhh.. Okay.. I might have forgotten to add some things… I forgot to add the colors to the Merge sort and then to add the platform matrix on the GitHub README… Well it was quick… I mean, as of now the software is only for Windows as I don’t know at all how to compile for other platforms.. But don’t worry.. If I choose to work on one of the two project I mentioned in the previous devlog, I’ll definitely try to add Linux support! Okay.. now this is the last devlog. for real. Byee!"}, {"post_id": 42637, "ts": "2026-08-07T13:43:12Z", "hours": 0.3981, "text": "Day 10 - Final devlog! And just like I said.. There we go.. This is going to be my last devlog before shipping! I’ve updated the readme of the repo with instructions on how to compile the program and should be good to ship! Now I just have to make the release on GitHub and change the project info and ship it! It’s not a big project, I know. And the code is probably the worst thing ever lol. But at least I’m happy that I started to work on making random and fun projects like this to learn how to code better! It’s been fun and it was nice to learn all of these things! After shipping I’ll definitely start working on 2 new projects! I won’t say anything cause I’m not sure if I’ll be able to do one of them since it’s pretty hard.. but who knows. Anyway.. Thanks for everything and see you in another project!"}, {"post_id": 42351, "ts": "2026-08-07T01:06:33Z", "hours": 5.5756, "text": "Day 9 - Getting ready to ship! And once again… there we are after another week! Unfortunately I love procrastinating and playing games with my friends so I’m working on these project less… ops. Anyway let’s talk about the new changes! New GUI Layout! I gave the GUI a quick rework to make it a bit prettier. It’s not a work of art, I know. But it’s still something cmon.. At least it’s better than the previous one… Descriptions! I added a box on the GUI to show a quick and easy to understand (I hope) description of the algorithm that the user is using! It’s quick and easy to understand since this software is supposed to help people who had some problems learning these algorithms! Yeah… So, I decided to not include the Quick Sort since I don’t know how to add it… It’s pretty hard and after trying for a bit I decided to drop it directly together with the feature of comparing algorithms. It was a bit difficult… Fixes and last things before shipping! While working, I encountered some bugs and immediately fixed them. Now the software has some more checks so that people can’t press the “Sort” button while already sorting and can’t switch algorithm while sorting! So now, I just have to finish writing the README with all the instructions on how to compile the project and it’s ready to ship! I should be able to do it by tomorrow! Thanks for everything and see you in the next, and probably last, devlog!"}, {"post_id": 38246, "ts": "2026-07-31T15:24:13Z", "hours": 2.9597, "text": "Day 8 - Yay, new algorithm! There we are after another week.. it’s gonna be quick since I didn’t change many things. New sorting algorith, merge sort! yay! After reworking the entire code to use vectors, I managed to add the merge sort algorithm! I had to use some AI because after making the basic implementation, it just kept crashing the program. The problem was that the function that merged everything had recursions in it, and since my way of visualizing this sorting algorithms is step-by-step, it would cause calling the function too many times until it crashed. Anyway, after fixing with ChatGPT now it works well and it shouldn’t have any problem! Next thing I’ll work on is: Quick sort, so at least I have 5 algorithms for shipping Add a way to show a quick description of the algorithm Add a way to compare the algorithms (I’m not sure I’ll add it though as I have no idea what to compare) Cleaning up some code Work more on the animations while sorting (they’re kinda ugly but I have no idea how to make them better) Here’s a quick screenshot of the merge algorithm working!"}, {"post_id": 33677, "ts": "2026-07-23T19:52:47Z", "hours": 3.2572, "text": "Day 7 - A lot of changes And there we are! After about.. a week from the last devlog and I’ve made some changes since then! Vectors! Yay! Now the entire code uses vectors instead of arrays! At first I used arrays cause it was the only thing I knew, but I read some guides about vectors and I refactored the entire code to use them instead! After doing this, I can easily implement merge sort and quick sort! Problems While reworking the code, I had quite some problems with the selection sort and insertion sort since it crashed the program when I tried to sort the values. I tried everything, but once I found the problems, I didn’t know how to fix them. So unfortunately, I had to use ChatGPT to help me fix them since I really didn’t know how. (Every change I made with AI it’s tagged with the prefix //AI: in the comments of the code.) I didn’t want to use AI cause I want to learn these things by myself and without any help of AI, after all I’m still learning and I said at first that this project it’s just a way for me to practice. But I guess it’s fine to get help from time to time, I just need to not do it often and try by myself first! That’s all for this devlog and see you in another devlog! (Yeah, the screenshot is the same as the previous one since I didn’t change anything graphically, lol)"}, {"post_id": 30334, "ts": "2026-07-17T20:07:30Z", "hours": 1.2111, "text": "Day 6 - I don’t know what to put… Hey there, this is going to be another quick devlog.. I usually post devlogs as I make commits so, everytime I commit something to the repo I make a devlog and say what I did, lol Anyway.. there we go. Statistics!! Yayyy! I’ve finally added statistics! So now, every time you finish sorting a range of values, it shows how many comparisons and swaps the algorithm performed and how many array accesses it made! It wasn’t hard to implement but for now it works only for bubble sort and selection sort! (I was lazy and didn’t want to add it yesterday lol). And still isn’t quite complete.. cause I don’t know for what reason but if I compare the statistics with a normal implementation of the algorithm, my Selection sort appears to do one cycle more than it needs too.. So I have to check that out. Other things After adding the statistics I just cleaned up some code, added some comments so people can actually understand what everything does and then added a quick button to show/hide the text under the rectangles with a limit. The limit is there so that you can still see the text of the rectangles without them overlapping on each other."}, {"post_id": 29742, "ts": "2026-07-16T20:42:50Z", "hours": 1.4253, "text": "Day 5 - New algorithm Hey there and there we are in another devlog! This is going to be quite short but whatever. New algorithm I added a new algorithm, the Insertion sort! I tested it multiple times and I managed to get it to work in about an hour. Then, I even fixed a bug where sometimes a value would disappear.. (I didn’t put a “=” , lol) What’s next? Next thing is going to be to add simple stats about the algorithm. Like I said in the previous devlog it’s going to be: Comparisons Swaps Array accesses Another thing I’ll work on is to add a way to show/hide the actual value of a rectangle. It will have a limit, cause when you decide to widen the quantity of values, they don’t have enough space to see the text of the value clearly. Next algorithms I won’t focus on them for now since I already implemented some starting algorithms. I first want to polish some code (It’s going to be bad anyway) and add these little features first.. The reason? Well, I wanted to add Quick sort and Merge sort but they’re quite hard to create in the style I need.. and I noticed that they might need vectors to work.. and they haven’t teached me vectors at school… So first, I need to understand how vectors work in C++, THEN I’ll add Merge sort and Quick sort (Or I’ll just ignore them and ship the project anyway. I’ll definitely add them after shipping though) (Oh yeah, I also need to fix how the rectangle change color when the sorting is active. It’s a bit rough now.. I need to make it better.) Anyway see you in another devlog and thank you!"}, {"post_id": 28400, "ts": "2026-07-14T17:11:54Z", "hours": 4.7039, "text": "Day 4 - A lot of changes So.. It’s been a while.. (again) Unfortunately I started doing other personal things and forgot about this project but I still kept doing small fixes. In fact, I had a 12 day streak but unfortunately I lost it lol. Anyway.. yesterday I finally locked in again and finished what I needed to do! New algorithm! I finally added the Selection sort algorithm! It was a bit harder compared to the bubble sort cause I had some problems while porting it in this new style. Another reason is because of all the refactoring I did of the main code that I’m just about to introduce! ## Splitting files! Like I said in the beginning, this project is a way for me to get better at coding, learn sorting algorithms and even learn new approaches into coding that I haven’t learned at school! For this reason, I decided to learn more about header files and how to split the code on multiple files instead of having just one big .cpp file! As of now, the structure look like this! VisualSort/ ├── images/ │ └── image1.png ├── src/ │ ├── algorithms/ │ │ ├── bubbleSort.h │ │ └── selectionSort.h │ ├── main.cpp │ └── main.h ├── .gitignore ├── CMakeLists.txt └── README.md So now I have the main.h for all the variables needed for the sorting algorithms and the main GUI to function. Then, I have a folder called algorithms where I have all the header files of the algorithms I implemented! (I know that I should make a .h and .cpp file and that the header is only for declaration but I didn’t want to add more files since it’s a simple project). Speed slider! Now, I even added a slider bar to let the user choose the speed of the sorting algorithm! The slider changes the seconds of the delay between every step of the algorithm and it goes from a minimum of 0.1 sec (fastest) and a maximum of 2.0 (slowest). Next features… After all of this I think I’m gonna add atleast 1 or 2 new algorithms, a box to show a quick description of the algorithm and then some stats about the like: Array accesses Comparisons performed Swaps performed (Of course the data will be equal to a normal implementation of the algorithm and not according to my way of implementation.) Something first.. If you ask why I took 4h 36min to implement ONLY these features it’s because I’m not really quick at coding and everytime I tried to implement the Selection sort I always had problems.. and other than that I even had to refactor all the code to divide it into files unfortunately. Anyway, that’s all and see you in the next devlog! Hoping that it will be soon. If I lock in it should be tomorrow maybe or I don’t know. Before saying goodbye, here’s a quick screenshot of how the software looks now!"}, {"post_id": 24276, "ts": "2026-07-07T18:55:22Z", "hours": 4.4075, "text": "Day 3 - Getting somewhere! It’s been a while since my last devlog. Since then, I spent all the time working on the delay between each swap of rectangles. I know that it sounds silly but I really didn’t know how to do it.. But now, I managed to solve it and now it works! What was the problem? The problem was that, to start the sorting algorithm, I would press a button and it would call the sorting function. But.. once it starts, it does everything in ONE frame, instead of waiting for the delay I set. So once I understood my mistake, I rewrote the algorithm in the exact same way but in a step-by-step style, without using any kind of loops. Now, thanks to this new approach, I managed to add a delay between the swaps! Thanks to this, I even managed to add a simple animation when the sorting is completed! Next features The next features that I’m working to add is: More algorithms (of course), but to add them I wanna do something special.. Since this project is a way for me to learn to code better.. I’ll add the other algorithms and the bubble sort in other files and I’ll call the actual functions inside the main.cpp. So they’ll become something like libraries. This is a way to maintain the code clean and even a way for me to learn how to connect multiple files between them! A display box to show a quick description of how the algorithm works and even the pros and cons! (I don’t know if I can but I’ll try). A way to compare stats of the sorting algorithms A slider to choose the speed of the sorting algorithm Then I don’t know.. I thought of something else but I forgot.. lol. Anyway thanks for reading this new devlog and see you onto the next one! Here’s finally a quick video demonstration of the software in function!"}, {"post_id": 20478, "ts": "2026-07-02T02:33:37Z", "hours": 3.1392, "text": "Day 2 - GUI and the first algorithm Hey there! This is the second devlog of my project. I wanted to make it yesterday but I was busy, lol. Yayyy GUI! Anyway, I started implementing a reallyyy rough (I mean really rough) draft of the GUI of the software! Of course, since I’m using the Raylib library, for the GUI I’m using the Raygui library! It was a bit hard to understand at first because of all the types of GUI available, but thanks to the tools offered by raysan5 (aka the creator of Raylib), I managed to find what I needed! (Raysan5 is the real goat, y’all should definitely check him out and all of his work. Especially the raylib library if you want to code a game in the most spartan and raw way possible! Trust me, it’s a real piece of art this library.) Of course, once I’m satisfied of how the code is and after implementing all the features I had in mind, I’ll improve the GUI. That’s mainly because I want to focus first on cleaning the code, optimize it, add the algoritms I want and every feature that I had in mind. Only by then I’ll work on the GUI again, as of now, the positions of the controls on screen are random cause I still need to test them after all! First algorithm! After talking about the GUI, let’s talk about algoritms!The first one I implemented it’s the bubble sort! Quite easy to implement and it works well! Next time, I’ll try to add something else but I doubt cause I still need to do some things first, then I’ll work on adding as many algoritms as possible. I’m going crazy. Of course, when the software starts sorting, I’d like to add some kind of delay to see the rectangles swap places… I though it was easy.. Well.. It isn’t. I spent 1h 30mins just to try and this damn delay and it still doesn’t work. It’s a pain. I hate this. But I should be close to get it right.. Or at least that’s what I hope.. And of course, I shall use no AI to help me in this task and suffer through it. I need to learn on how to overtake this difficulties, so NO Ai and just raw searching on Google, checking out other people’s codes to see if I can apply something to my case, check examples by raylib and the docs, reddit’s posts and anything else that is available, except AI. Anyway, thanks for everything and see you in another devlog! (Yes I know, the screenshot is still useless but once I add this damn delay I’ll try and a quick timelapse of the software working)"}, {"post_id": 18926, "ts": "2026-06-30T03:16:59Z", "hours": 0.8125, "text": "Day 1 - Starting! The Idea Hey y’all! I’m starting this new project about a C++ software that makes it able to visualize sorting algorithms! As of now, I don’t know how many algorithms I’ll add, but I’ll try to add as many algoritms as I can. Why? During this year of high school we started learning C++ and we even got a quick look at Sorting algorithms. I’ve always been curious about them and always wanted to learn more about it but, I couldn’t notice the fact that they were hard to understand, especially for my classmates. But after I helped them personally by making them visualize on paper how the algorithm worked, they seemed to understand better. So, I decided to make a software to visualize them automatically through software! What I’ll use To create this software I’ll use CLion as IDE and C++ as the programming language. To make the GUI and everything I’ll use the Raylib library! It’s a really nice library that I started learning some time ago. I started by remaking Pong by myself without any help and now, I wanted to step up a bit and use it in a more complicated project! See you! This was pretty much everything. I already started writing some code but it isn’t much. I just made the basics and they already need some fixing. This is a quick screenshot of the project as of now. I’ll definitely fix it up tomorrow. Anyway, thanks for everything and see you in another Devlog!"}]...
|
Title: VisualSort by @alessandro_09 | Stardance
D Title: VisualSort by @alessandro_09 | Stardance
Devlogs:
Day 1 - Starting! The Idea Hey y’all! I’m starting this new project about a C++ software that makes it able to visualize sorting algorithms! As of now, I don’t know how many algorithms I’ll add, but I’ll try to add as many algoritms as I can. Why? During this year of high school we started learning C++ and we even got a quick look at Sorting algorithms. I’ve always been curious about them and always wanted to learn more about it but, I couldn’t notice the fact that they were hard to understand, especially for my classmates. But after I helped them personally by making them visualize on paper how the algorithm worked, they seemed to understand better. So, I decided to make a software to visualize them automatically through software! What I’ll use To create this software I’ll use CLion as IDE and C++ as the programming language. To make the GUI and everything I’ll use the Raylib library! It’s a really nice library that I started learning some time ago. I started by remaking Pong by myself without any help and now, I wanted to step up a bit and use it in a more complicated project! See you! This was pretty much everything. I already started writing some code but it isn’t much. I just made the basics and they already need some fixing. This is a quick screenshot of the project as of now. I’ll definitely fix it up tomorrow. Anyway, thanks for everything and see you in another Devlog!
Day 2 - GUI and the first algorithm Hey there! This is the second devlog of my project. I wanted to make it yesterday but I was busy, lol. Yayyy GUI! Anyway, I started implementing a reallyyy rough (I mean really rough) draft of the GUI of the software! Of course, since I’m using the Raylib library, for the GUI I’m using the Raygui library! It was a bit hard to understand at first because of all the types of GUI available, but thanks to the tools offered by raysan5 (aka the creator of Raylib), I managed to find what I needed! (Raysan5 is the real goat, y’all should definitely check him out and all of his work. Especially the raylib library if you want to code a game in the most spartan and raw way possible! Trust me, it’s a real piece of art this library.) Of course, once I’m satisfied of how the code is and after implementing all the features I had in mind, I’ll improve the GUI. That’s mainly because I want to focus first on cleaning the code, optimize it, add the algoritms I want and every feature that I had in mind. Only by then I’ll work on the GUI again, as of now, the positions of the controls on screen are random cause I still need to test them after all! First algorithm! After talking about the GUI, let’s talk about algoritms!The first one I implemented it’s the bubble sort! Quite easy to implement and it works well! Next time, I’ll try to add something else but I doubt cause I still need to do some things first, then I’ll work on adding as many algoritms as possible. I’m going crazy. Of course, when the software starts sorting, I’d like to add some kind of delay to see the rectangles swap places… I though it was easy.. Well.. It isn’t. I spent 1h 30mins just to try and this damn delay and it still doesn’t work. It’s a pain. I hate this. But I should be close to get it right.. Or at least that’s what I hope.. And of course, I shall use no AI to help me in this task and suffer through it. I need to learn on how to overtake this difficulties, so NO Ai and just raw searching on Google, checking out other people’s codes to see if I can apply something to my case, check examples by raylib and the docs, reddit’s posts and anything else that is available, except AI. Anyway, thanks for everything and see you in another devlog! (Yes I know, the screenshot is still useless but once I add this damn delay I’ll try and a quick timelapse of the software working)
Day 3 - Getting somewhere! It’s been a while since my last devlog. Since then, I spent all the time working on the delay between each swap of rectangles. I know that it sounds silly but I really didn’t know how to do it.. But now, I managed to solve it and now it works! What was the problem? The problem was that, to start the sorting algorithm, I would press a button and it would call the sorting function. But.. once it starts, it does everything in ONE frame, instead of waiting for the delay I set. So once I understood my mistake, I rewrote the algorithm in the exact same way but in a step-by-step style, without using any kind of loops. Now, thanks to this new approach, I managed to add a delay between the swaps! Thanks to this, I even managed to add a simple animation when the sorting is completed! Next features The next features that I’m working to add is: More algorithms (of course), but to add them I wanna do something special.. Since this project is a way for me to learn to code better.. I’ll add the other algorithms and the bubble sort in other files and I’ll call the actual functions inside the main.cpp. So they’ll become something like libraries. This is a way to maintain the code clean and even a way for me to learn how to connect multiple files between them! A display box to show a quick description of how the algorithm works and even the pros and cons! (I don’t know if I can but I’ll try). A way to compare stats of the sorting algorithms A slider to choose the speed of the sorting algorithm Then I don’t know.. I thought of something else but I forgot.. lol. Anyway thanks for reading this new devlog and see you onto the next one! Here’s finally a quick video demonstration of the software in function!
Day 4 - A lot of changes So.. It’s been a while.. (again) Unfortunately I started doing other personal things and forgot about this project but I still kept doing small fixes. In fact, I had a 12 day streak but unfortunately I lost it lol. Anyway.. yesterday I finally locked in again and finished what I needed to do! New algorithm! I finally added the Selection sort algorithm! It was a bit harder compared to the bubble sort cause I had some problems while porting it in this new style. Another reason is because of all the refactoring I did of the main code that I’m just about to introduce! ## Splitting files! Like I said in the beginning, this project is a way for me to get better at coding, learn sorting algorithms and even learn new approaches into coding that I haven’t learned at school! For this reason, I decided to learn more about header files and how to split the code on multiple files instead of having just one big .cpp file! As of now, the structure look like this! VisualSort/ ├── images/ │ └── image1.png ├── src/ │ ├── algorithms/ │ │ ├── bubbleSort.h │ │ └── selectionSort.h │ ├── main.cpp │ └── main.h ├── .gitignore ├── CMakeLists.txt └── README.md So now I have the main.h for all the variables needed for the sorting algorithms and the main GUI to function. Then, I have a folder called algorithms where I have all the header files of the algorithms I implemented! (I know that I should make a .h and .cpp file and that the header is only for declaration but I didn’t want to add more files since it’s a simple project). Speed slider! Now, I even added a slider bar to let the user choose the speed of the sorting algorithm! The slider changes the seconds of the delay between every step of the algorithm and it goes from a minimum of 0.1 sec (fastest) and a maximum of 2.0 (slowest). Next features… After all of this I think I’m gonna add atleast 1 or 2 new algorithms, a box to show a quick description of the algorithm and then some stats about the like: Array accesses Comparisons performed Swaps performed (Of course the data will be equal to a normal implementation of the algorithm and not according to my way of implementation.) Something first.. If you ask why I took 4h 36min to implement ONLY these features it’s because I’m not really quick at coding and everytime I tried to implement the Selection sort I always had problems.. and other than that I even had to refactor all the code to divide it into files unfortunately. Anyway, that’s all and see you in the next devlog! Hoping that it will be soon. If I lock in it should be tomorrow maybe or I don’t know. Before saying goodbye, here’s a quick screenshot of how the software looks now!
Day 5 - New algorithm Hey there and there we are in another devlog! This is going to be quite short but whatever. New algorithm I added a new algorithm, the Insertion sort! I tested it multiple times and I managed to get it to work in about an hour. Then, I even fixed a bug where sometimes a value would disappear.. (I didn’t put a “=” , lol) What’s next? Next thing is going to be to add simple stats about the algorithm. Like I said in the previous devlog it’s going to be: Comparisons Swaps Array accesses Another thing I’ll work on is to add a way to show/hide the actual value of a rectangle. It will have a limit, cause when you decide to widen the quantity of values, they don’t have enough space to see the text of the value clearly. Next algorithms I won’t focus on them for now since I already implemented some starting algorithms. I first want to polish some code (It’s going to be bad anyway) and add these little features first.. The reason? Well, I wanted to add Quick sort and Merge sort but they’re quite hard to create in the style I need.. and I noticed that they might need vectors to work.. and they haven’t teached me vectors at school… So first, I need to understand how vectors work in C++, THEN I’ll add Merge sort and Quick sort (Or I’ll just ignore them and ship the project anyway. I’ll definitely add them after shipping though) (Oh yeah, I also need to fix how the rectangle change color when the sorting is active. It’s a bit rough now.. I need to make it better.) Anyway see you in another devlog and thank you!
Day 6 - I don’t know what to put… Hey there, this is going to be another quick devlog.. I usually post devlogs as I make commits so, everytime I commit something to the repo I make a devlog and say what I did, lol Anyway.. there we go. Statistics!! Yayyy! I’ve finally added statistics! So now, every time you finish sorting a range of values, it shows how many comparisons and swaps the algorithm performed and how many array accesses it made! It wasn’t hard to implement but for now it works only for bubble sort and selection sort! (I was lazy and didn’t want to add it yesterday lol). And still isn’t quite complete.. cause I don’t know for what reason but if I compare the statistics with a normal implementation of the algorithm, my Selection sort appears to do one cycle more than it needs too.. So I have to check that out. Other things After adding the statistics I just cleaned up some code, added some comments so people can actually understand what everything does and then added a quick button to show/hide the text under the rectangles with a limit. The limit is there so that you can still see the text of the rectangles without them overlapping on each other.
Day 7 - A lot of changes And there we are! After about.. a week from the last devlog and I’ve made some changes since then! Vectors! Yay! Now the entire code uses vectors instead of arrays! At first I used arrays cause it was the only thing I knew, but I read some guides about vectors and I refactored the entire code to use them instead! After doing this, I can easily implement merge sort and quick sort! Problems While reworking the code, I had quite some problems with the selection sort and insertion sort since it crashed the program when I tried to sort the values. I tried everything, but once I found the problems, I didn’t know how to fix them. So unfortunately, I had to use ChatGPT to help me fix them since I really didn’t know how. (Every change I made with AI it’s tagged with the prefix //AI: in the comments of the code.) I didn’t want to use AI cause I want to learn these things by myself and without any help of AI, after all I’m still learning and I said at first that this project it’s just a way for me to practice. But I guess it’s fine to get help from time to time, I just need to not do it often and try by myself first! That’s all for this devlog and see you in another devlog! (Yeah, the screenshot is the same as the previous one since I didn’t change anything graphically, lol)
Day 8 - Yay, new algorithm! There we are after another week.. it’s gonna be quick since I didn’t change many things. New sorting algorith, merge sort! yay! After reworking the entire code to use vectors, I managed to add the merge sort algorithm! I had to use some AI because after making the basic implementation, it just kept crashing the program. The problem was that the function that merged everything had recursions in it, and since my way of visualizing this sorting algorithms is step-by-step, it would cause calling the function too many times until it crashed. Anyway, after fixing with ChatGPT now it works well and it shouldn’t have any problem! Next thing I’ll work on is: Quick sort, so at least I have 5 algorithms for shipping Add a way to show a quick description of the algorithm Add a way to compare the algorithms (I’m not sure I’ll add it though as I have no idea what to compare) Cleaning up some code Work more on the animations while sorting (they’re kinda ugly but I have no idea how to make them better) Here’s a quick screenshot of the merge algorithm working!
Day 9 - Getting ready to ship! And once again… there we are after another week! Unfortunately I love procrastinating and playing games with my friends so I’m working on these project less… ops. Anyway let’s talk about the new changes! New GUI Layout! I gave the GUI a quick rework to make it a bit prettier. It’s not a work of art, I know. But it’s still something cmon.. At least it’s better than the previous one… Descriptions! I added a box on the GUI to show a quick and easy to understand (I hope) description of the algorithm that the user is using! It’s quick and easy to understand since this software is supposed to help people who had some problems learning these algorithms! Yeah… So, I decided to not include the Quick Sort since I don’t know how to add it… It’s pretty hard and after trying for a bit I decided to drop it directly together with the feature of comparing algorithms. It was a bit difficult… Fixes and last things before shipping! While working, I encountered some bugs and immediately fixed them. Now the software has some more checks so that people can’t press the “Sort” button while already sorting and can’t switch algorithm while sorting! So now, I just have to finish writing the README with all the instructions on how to compile the project and it’s ready to ship! I should be able to do it by tomorrow! Thanks for everything and see you in the next, and probably last, devlog!
Day 10 - Final devlog! And just like I said.. There we go.. This is going to be my last devlog before shipping! I’ve updated the readme of the repo with instructions on how to compile the program and should be good to ship! Now I just have to make the release on GitHub and change the project info and ship it! It’s not a big project, I know. And the code is probably the worst thing ever lol. But at least I’m happy that I started to work on making random and fun projects like this to learn how to code better! It’s been fun and it was nice to learn all of these things! After shipping I’ll definitely start working on 2 new projects! I won’t say anything cause I’m not sure if I’ll be able to do one of them since it’s pretty hard.. but who knows. Anyway.. Thanks for everything and see you in another project!
Uhh.. Okay.. I might have forgotten to add some things… I forgot to add the colors to the Merge sort and then to add the platform matrix on the GitHub README… Well it was quick… I mean, as of now the software is only for Windows as I don’t know at all how to compile for other platforms.. But don’t worry.. If I choose to work on one of the two project I mentioned in the previous devlog, I’ll definitely try to add Linux support! Okay.. now this is the last devlog. for real. Byee!
Thanks to everyone! Hey there, it’s been a while! My project got approved and I got my payout, yay! I’ve been absent for quite a while because of summer holidays and other than that I just played games with my friends.. Lol Anyway, I’m finally back and ready to make another project! This time, the project I want to make is REAALLY hard.. And I don’t think I’ll ever manage to get it done. But who cares right? I mean, this is what programming is all about… Making things to improve yourself even if they’re hard! And you can even have fun in the meanwhile! (while suffering too, but those are details.. shh) I genuinely hope I’ll be able to make a good project even if I don’t have enough time.. I should have made this project sooner.. Better late than never… I’ll make the first devlog of the project tomorrow (or later, since for me it’s currently 1:49AM) and I won’t reveal much! But if you go check out my profile you can see for yourself what’s about! For last, I want to thank everyone that rated my project and gave me so much feedback! I don’t know if I’ll work on this project again since it was just something to prepare myself for other projects and ideas of mine but I’ll think about it.. Thanks for everything and hope to see y’all on my other project! I know that it’s nothing and probably bad compared to some big projects I checked out here on Stardance, and honestly I’m amazed by what teenagers can do at this age.. Genuinely, some people are crazy and I admire them so much and I hope one day, even if it’s late compared to them, I’ll be able to create projects like theirs! Love you all! (screenshot of a silly cat since I don’t have anything to show)
Ships:
I made a C++ software based on Raylib and Raygui to visualize how sorting algorithms work! Working on this project was a bit challenging for me as I never code something like this and by using external libraries! Another challenging thing was implementing the sorting algortihms since I didn’t find a way to implement them with their original code! I’m proud of what I’ve made and I’m happy to have learned a lot of new things and new ways to code! One thing people should know is that unfortunately this software is for Windows only and not for Linux or MacOS. I don’t know how to compile code for those platforms but I’ll learn how to do it!...
|
1793072897.0915139
|
1793159297.0915139
|
|
7925
|
OpenMythos by @nish24 | Stardance
|
nish24
|
1
|
54.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T15:23:36Z", "hours": 54.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "OpenMythos is a cybersecurity-focused LLM It’s trained specifically on: ArXiv cs.CR (Cryptography & Security) research papers Real CVE vulnerability data with detailed descriptions What did we build? Full SFT + RLVR training pipeline on H100 GPUs (via Modal) Custom datasets: filtered ArXiv papers + CVE vulnerability data Deployed on Hugging Face Spaces What was challenging? Scraping and filtering high-quality dataset Getting RLVR to actually improve security reasoning. Running stable distributed training on Modal with DeepSpeed Making the model actually useful for real vuln analysis, not just theory What are we proud of? Model genuinely understands CVEs and can reason about attack surfaces Clean SFT → RLVR pipeline that others can replicate 9,000+ users in the first week with zero marketing budget Benchmark results on CyberGym and cybench How to test it? Hugging Face Space: https://huggingface.co/spaces/build-small-hackathon/OpenMythos Try prompts like: “Analyze this code for security vulnerabilities: [paste your code]” “Review this API endpoint for security issues: [paste code]” It works best for: ✅ Code security review ✅ CVE explanation & mitigation ✅ Attack surface analysis ✅ Security research questions", "repo": "https://github.com/KingNish24/OpenMythosDemo", "demo": "https://huggingface.co/spaces/build-small-hackathon/OpenMythos"}]...
|
[{"post_id": 18400, "ts": "202 [{"post_id": 18400, "ts": "2026-06-29T15:17:35Z", "hours": 0.2858, "text": "Hit 9,000+ users on OpenMythos last week OpenMythos is a cybersecurity-focused LLM trained on ArXiv cs.CR papers and real CVE data. If you’ve tried it: → Share your feedback → Found a vuln in your project using it? We’d love to hear Want to stress-test your own project’s security? Give it a shot 👇 https://huggingface.co/spaces/build-small-hackathon/OpenMythos"}, {"post_id": 18274, "ts": "2026-06-29T11:21:45Z", "hours": 46.4808, "text": "Hey everyone! OpenMythos benchmarks are finally here. Sorry it took about a week to post these. The delay was mainly because SWE-bench results weren’t matching up with Qwen 3.6 27B official numbers. Turns out Qwen used a different eval harness and also refined/filtered the benchmark problems, even there prev 3.5 (72.4 in SWE Verified ) version benchmark score is not matching with the numbers published in 3.6 (75 in SWE Verified). Anyway, here are the results across SWE-bench Pro, CyberGym, and cybench. OpenMythos holds up pretty well for a small cybersecurity-focused model! But it has capability to do better. So, will train it further. Demo: https://huggingface.co/spaces/build-small-hackathon/OpenMythos Model: https://huggingface.co/build-small-hackathon/OpenMythos"}, {"post_id": 4019, "ts": "2026-06-07T05:53:03Z", "hours": 4.6978, "text": "Devlog 2 of OpenMythos Dataset Progress: 45k rows of dataset completed. Generation got stuck after 37k due to a bug from upstream provider. Resolved the issue now back on track."}, {"post_id": 2794, "ts": "2026-06-05T16:40:04Z", "hours": 2.7564, "text": "Generating dataset for OpenMythos"}]...
|
Title: OpenMythos by @nish24 | Stardance
Devlogs: Title: OpenMythos by @nish24 | Stardance
Devlogs:
Generating dataset for OpenMythos
Devlog 2 of OpenMythos Dataset Progress: 45k rows of dataset completed. Generation got stuck after 37k due to a bug from upstream provider. Resolved the issue now back on track.
Hey everyone! OpenMythos benchmarks are finally here. Sorry it took about a week to post these. The delay was mainly because SWE-bench results weren’t matching up with Qwen 3.6 27B official numbers. Turns out Qwen used a different eval harness and also refined/filtered the benchmark problems, even there prev 3.5 (72.4 in SWE Verified ) version benchmark score is not matching with the numbers published in 3.6 (75 in SWE Verified). Anyway, here are the results across SWE-bench Pro, CyberGym, and cybench. OpenMythos holds up pretty well for a small cybersecurity-focused model! But it has capability to do better. So, will train it further. Demo: https://huggingface.co/spaces/build-small-hackathon/OpenMythos Model: https://huggingface.co/build-small-hackathon/OpenMythos
Hit 9,000+ users on OpenMythos last week OpenMythos is a cybersecurity-focused LLM trained on ArXiv cs.CR papers and real CVE data. If you’ve tried it: → Share your feedback → Found a vuln in your project using it? We’d love to hear Want to stress-test your own project’s security? Give it a shot 👇 https://huggingface.co/spaces/build-small-hackathon/OpenMythos
Ships:
OpenMythos is a cybersecurity-focused LLM It’s trained specifically on: ArXiv cs.CR (Cryptography & Security) research papers Real CVE vulnerability data with detailed descriptions What did we build? Full SFT + RLVR training pipeline on H100 GPUs (via Modal) Custom datasets: filtered ArXiv papers + CVE vulnerability data Deployed on Hugging Face Spaces What was challenging? Scraping and filtering high-quality dataset Getting RLVR to actually improve security reasoning. Running stable distributed training on Modal with DeepSpeed Making the model actually useful for real vuln analysis, not just theory What are we proud of? Model genuinely understands CVEs and can reason about attack surfaces Clean SFT → RLVR pipeline that others can replicate 9,000+ users in the first week with zero marketing budget Benchmark results on CyberGym and cybench How to test it? Hugging Face Space: https://huggingface.co/spaces/build-small-hackathon/OpenMythos Try prompts like: “Analyze this code for security vulnerabilities: [paste your code]” “Review this API endpoint for security issues: [paste code]” It works best for: ✅ Code security review ✅ CVE explanation & mitigation ✅ Attack surface analysis ✅ Security research questions...
|
1793094929.186081
|
1793181329.186081
|
|
7968
|
Chess Now! by @AngelCMHxD | Stardance
|
AngelCMHxD
|
1
|
140.11
|
1509
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-30T15:00:21Z", "hours": 137.0, "multiplier": 18.82, "payout": 1509, "blessing": "neutral", "text": "This is Chess Now! A real-time chess API with challenges handling, matches, friends, and much more! The idea is for anyone to be able to make a custom client, bot or integration with the platform, thus it’s as open as it can possibly be while trying to also stay secure. One of the biggest parts of the proyect was doing that many clients, especially the TUI client. While I learned Vue doing the TUI client, I found it’s behaviour kinda… unintuitive in some way I can’t really explain. Though at the end I felt that Vue is better than React by a mile (now I only have to try out Svelte) I am proud of how well structured the API is, and while I’m sure it can be improved, the bases feel pretty solid. I’m also proud of how much I learned doing this. I mean, I tried a lot of things I’ve been meaning to try for some time already: Vue, Better Auth, Drizzle ORM, actually deploying a Next.js app, React mail + Resend, Elysia, and Fumadocs. And probably something else I already forgot about hehe Would I do something different if I started right now? Probably, but mostly just to try out even more things, which is the main reason why I do most of my projects. If you want to try out the project, you should probably just check the instance hosted at https://chessnow.angelcmh.com/ , create an account and play against a bot. You should also check out the docs, or the npm package over at https://www.npmjs.com/package/@chess-now/api if you are interested. Thanks for reading till the end, have a great day! ;P", "repo": "https://github.com/AngelCMHxD/chess-now", "demo": "https://chessnow.angelcmh.com/"}]...
|
[{"post_id": 62578, "ts": "202 [{"post_id": 62578, "ts": "2026-09-06T01:20:34Z", "hours": 3.1125, "text": "aaaa, so… long time no see! also, super star!!! So, I’ve began doing some things that I’ve meant to do before, but completely forgot as I got quite busy… lol I fixed an error which made the TUI not work on Linux, it works now! It was an issue as I was building on NixOS, and the linker path was on my /nix/store folder instead of the usual /lib one. that means it also broke for me after an update lol You can now configure challenges! This needed to be implemented on all clients, hence why it took a little while lol Select whether you want to start with white, black or random. The opponent will be able to see which color you selected before accepting the challenge though! :P Also, meet unrankeds! You can now also mark a match as unranked so it doesn’t affect your ELO ratings at all . Take into account that there is decay though! so if you don’t play ranked for a while, your next match ELO diffs might be a little bit different Fun fact: The starting color option has been available on the API for a while already, even documented. so, if you did API calls directly, you could have selected a starting color and the opponent would not have been able to notice! as none of the clients showed it. except for the Discord bot… I think… or if you requested the match through the API too ;D"}, {"post_id": 37641, "ts": "2026-07-30T14:59:49Z", "hours": 0.8269, "text": "Hewo! This devlog was unexpected. I prepared a small video/trailer so I had something to upload when shipping the project, and when I tried to upload it I realized that you can only upload images when shipping a project :/ So here is that video as it won’t go to waste. I tried my best, hope my voice doesn’t sound awkward, I’m not a native speaker Also, check out the shipped project! As I probably shipped it right after this devlog"}, {"post_id": 37305, "ts": "2026-07-29T22:23:23Z", "hours": 3.36, "text": "Well, I set up the domain + reverse proxy and all kind of problems arose. I changed the package so you only need to instantiate the class without any arguments to use the default server over at https://chessnow.angelcmh.com though you can still pass an optional baseUrl in case you selfhost your own instance at first nothing worked, but then i noticed that I had a port conflict on my VPS with two things trying to use the same port lol i also tried to improve SEO on the main page as much as I could, though im not an expert on that. i also added an official bots section so you can challenge some bots without having to look at any docs to find them shipping in some minutes!"}, {"post_id": 36858, "ts": "2026-07-29T05:39:21Z", "hours": 6.6392, "text": "Hewo! Last devlog till ship here (i think) I didn’t think I’d add anything else, but you can now forfeit matches or ask the opponent for a draw! They just seemed like something that should exist on the shipped project… Each player can request only one draw per match, so you think before you do it. why did i do it like that? well, asking for a draw pauses the whole match, an neither player can do any moves until the draw request is answered. in order to prevent one of the users spamming draws, i simply limited to only one per match. also, ending the match in a draw doesn’t mean that your ELO isn’t affected, it is affected. depending on the elo of your opponent, you’ll lose/earn elo on a draw, just as you’d do on a stalemate. I also added a piece promotion selector. i forgot i made it so it always chose the queen by default, but in some matches that might not be wanted, so now you get a popup to select the piece you want to promote to well, i don’t really know if i’m missing any other things, as that was all that was i had on my TODO list, so i guess i’ll start setting up the prod environment below is a video showing the forfeit and draw flows, along with the promotion popup. don’t worry about the first match being a valid checkmate but the match continued being active, i already fixed that bug but it didn’t apply to already affected matches :P i also sped up (is that the correct way to say it?) and cutted out some parts of the video to prevent it from being 6 minutes of me playing the match lol"}, {"post_id": 34658, "ts": "2026-07-25T15:44:56Z", "hours": 9.5286, "text": "Well, that took way longer than expected. The docs are way more polished now! All endpoints have example responses so you know exactly what each one will return, along with a small description. HTTP endpoints that trigger a WebSocket event for any user (like friend requests, challenges, match moves, etc), mention it on their descriptions. I also added some headers to the PGN strings, as they were previously filled with “?“s. This mostly took this long due to a LOT of issues with the account deletion process, but it works perfectly now. When you delete your account, your user is replaced in all the matches you’ve played to @deleted_user . This is to keep the match data available even after any user deletes it. After that, your account is deleted from the DB. Due to how the DB is configured with cascade deletes, that will delete all other rows that reference the user (friendships, friend requests, pending challenges, etc.) except for matches, as they no longer reference the user that is being deleted. I’m am quite close to the ship, which I’m kinda nervous about. I want the project to be in the best state and as polished as possible, without any bugs (well, any known bugs lol). Which is mostly the reason this project as a whole has taken soo long :/ Below is a small video showing the docs with the example data. At the end is the delete account flow, which have lot’s of confirmations as it currently doesn’t send an email. I’m thinking it probably should send one lol See you in the next (and probably last) devlog! (I fixed my OBS settings, the video should look a bit better than the previous ones :P)"}, {"post_id": 33878, "ts": "2026-07-24T04:38:40Z", "hours": 5.6958, "text": "ELO system! let’s go!! At the end, I did add an ELO system. Well, it’s not really ELO, it’s Glicko . I used the glicko2-lite library, which is stateless unlike other glicko implementations I found. I wanted a stateless one because I’m saving the data on the DB anyways, so making it stateful would only make it use more resources (primarly RAM). You start with a rating of 1500. After every match your rating will go up/down depending on whether you win or lose. How much you win or lose depends on how many matches you have played (the first one are worth a bit more to get you to the optimal points), and depending on the rating of your oponent. If you win against someone with a bigger rating than yours, you’ll gain way more points than if you win agains someone around your rating or less. I also added a settings page so you can change your name and username, along with a page to change your password. Below is a small video showing how the ELO Glicko system works: What remains is just to also add the name/username change for bots and improve the docs. I also made a Stockfish bot which you can try to play against. (Keyword: try , because it’s probably almost impossible)"}, {"post_id": 33281, "ts": "2026-07-23T02:11:49Z", "hours": 2.855, "text": "User page done! You can now see all of the matches and friends of other people, along with a small list of stats. I’m thinking about implementing the ELO system. While I previously said that I wouldn’t be able to moderate people artificially inflating it (by selfbotting), having it without a leaderboard wouldn’t really make it that enticing to abuse. And personally, if there isn’t a leaderboard, I don’t think moderating it would be that important, what would the user gain more than having a bigger number on their profile? Still thinking about it though I’m not sure about adding custom profile pictures or really any other user generated content. It would be nice to have, but it also involves moderation in order to prevent anything inappropriate from being uploaded (i mean, we all know how the internet works :/) Below is a small video showing the user page, along with the bot auto accepting any new friend requests :P"}, {"post_id": 32786, "ts": "2026-07-22T05:22:14Z", "hours": 6.9678, "text": "Well, the web client is done!! I used react-chessboard and it’s a pretty good library. I didn’t add click-to-move pieces as it makes the logic a LOT more complex, so I didn’t want to do it for now I also used the API package from before, so we can use the websocket connection and listen for any changes. I also added it onto the matches page so any updates on the boards are reflected in real-time (which would probably look amazing if you have multiple automated matches running lol), and any new matches are added to the list without needing to refresh the page. I also want to add it onto the friends page, so it also updates in real-time I had to change the icons on the discord bot as I realized they were Chess.com’s icons, and they aren’t free to use, so I removed them and replaced them with a pack named Caliente , which look amazing. It’s the same one I use on the web client I think I should add a popup once the match is over as the current result feels quite plain. I also gotta add another page where you can spectate the match of other people, as the current one has too many logic already I prefer to duplicate it and remove the need of handling input and what not. I also haven’t added a profiles page yet, so that’s still on the TODO list hahah Below is a small video of me playing a match against a bot. Two disclaimers: I used AI to fix some issues I had with the CSS on the page, though it didn’t change anything other than fix some class names, and the whole logic was made by me. I played horribly against the bot, as the difficulty is set quite low lol Additional disclaimer: Ignore the -55s duration on one of the matches, it was an old bug but I’ve gotten lazy and haven’t fixed the match on the DB yet .-."}, {"post_id": 32426, "ts": "2026-07-21T16:34:43Z", "hours": 0.685, "text": "The TUI is 100% done! (I think…) There is no longer any mock data and it works with the actual API. You can send and receive challenges and friend requests, and you can see/play your running matches. I think that, for the account management, I’ll remove email signups and only allow social OAuth2 (currently Google and Discord). As with email/password signups I need to handle email verification and password reset, and while Resend (what I use right now) is REALLY good and it’s free tier is great (3000 mails a month, 100 daily), if someone tries to spam the endpoints, it’s gonna eat up the limit. Though I might just put a rate limiter in place, and with Cloudflare Turnstile I already combat at least some botting, still thinking about it… I’ll probably start with the web client for now, which might be the last thing to do Below is a little video showing the TUI in action, while playing a match: (I took quite a bit of time thinking about the move I should make till I remembered I was just recording a test video lol)"}, {"post_id": 32210, "ts": "2026-07-21T07:10:56Z", "hours": 0.5875, "text": "And… This devlog is just to show the web dashboard, which I have forgotten to do a devlog for it all this time, which is why the logged time is so low lol I used the Next.js framework to build the web dashboard (well, the whole dashboard + welcome page and just the whole web thing). I also used the shadcn/ui components library, as I’m not that good making frontend stuff, so that helped a lot. The dashboard layout is actually a template you can find on the shadcn site, I love the huge amount of things they have I didn’t know what else to put as a welcome to the dashboard, so I left a little welcome message as seen at the beginning of the video And I also forgot to show (mostly because there wasn’t any) the notifications button, where you can find any incoming challenges and friend requests. The whole bot creation process works, at the end it gives you a token that you can use as if it were a user auth token, but you have all the scopes by default, so you can do anything you want with the account What remains to do on this web part is to be able to see the profile of other users, along with their recent matches. And also a web client so you can play without downloading the TUI client or needing to use the discord bot"}, {"post_id": 32193, "ts": "2026-07-21T06:11:10Z", "hours": 5.3728, "text": "Edit: I realized right after posting this devlog: 100 hours! This has taken me more time than what I expected and gone quite big at this point hahah Welp, the bots are done, and now I’ve tested the Discord integration. I made the bots using the js-chess-engine package. Why that instead of something like stockfish? it simply was way easier to do as it’s a full js/ts engine lol Though, that doesn’t mean that the stockfish engine wouldn’t be posible to integrate! as anyone can create bots, that also means that anyone could create a stockfish bot if they wanted to. In case you don’t know what Stockfish is: It’s a really powerful and popular chess engine written in C++. Also, while writing this devlog, I found this package , which could be used to make a stockfish bot really easily. Though the ELO of the stockfish bot is really high, so I don’t really regret choosing js-chess-engine as a simpler engine means people can at least win against it lol Here is a small video showing a match running on the discord bot. There are some small coordinates on the image so writing the SAN/LAN notation is easier, though it’s quire hard to see them on the video due to compression. While it has support for everything (friend requests, send challenges, accept challenges, etc), I kinda forgot to record the rest :P"}, {"post_id": 31519, "ts": "2026-07-20T00:11:39Z", "hours": 9.0231, "text": "Well, making the TUI has gone quite well. While I initially thought that Vue seemed weird for doing TUIs, it’s actually not that bad. No wonder Ink is so popular. (Though I’m liking Vue more than I like React, and Ink felt kinda clunky at times when I first tried it) If you want to do TUIs with TypeScript/JavaScript, I’d recommend you give Vue TermUI a try. It also supports the Vue Router, so it’s easy to make a lot of pages and then navigate through them. The data show in the video is just mock data. So it still doesn’t use the actual API, though progress have gone quite well without many hiccups. The send friend request button, and the accept/reject challenge buttons do use the actual API, but they just throw an error because it tries to accept/reject a challenge that doesn’t actually exist, as it’s just mock data. The app doesn’t crash on error though, it displays the error message right below the button, that way the user can see what went wrong without having the whole app crash or any other unexpected behavior. What remains now is making some bots, that way I can make the whole “Playing a game” page, as having mock data for the WHOLE game state is not very… easy? I mean, I’ll have to do some bots anyway, so why not do them now instead of creating some weird mock functions hahah I also think that the icons on the authorization page feel weird. I dont know if maybe they are too big or if I should just change them to other ones. I also have to change the card after approval or denial instead of just showing the toast at the bottom, as it doesnt give feedback to the user Below is a small video of the TUI in action: (Disclaimer: Some AI was used, primarily to create the mock data so I could focus on the TUI itself)"}, {"post_id": 30506, "ts": "2026-07-18T04:16:32Z", "hours": 8.6408, "text": "Welp, designing how to do the TUI was kinda… complex. I mostly know JS/TS, so I wanted to use that. And that made everything way more complex, as there aren’t so many options as you might have with something like how good Bubble Tea is on Go. So these were the options I considered: Ink : Which didn’t have mouse support and uses React, which I’ve felt kinda clunky while doing the webpage, so I wanted try something else. Rezi : Which, at first, was AMAZING. But it had some bugs where focus didn’t work at all and I couldn’t interact with the TUI, or just started getting weird. OpenTUI : tbf, I didn’t test it out that much, couldn’t really understand it’s TS bindings So what I ended up going with? Something not listed above: I ended up going with Vue TermUI ( for now ). Why? Well, I’ve wanted to try out Vue for some time now, and it uses OpenTUI under the hood, so it’s backend is probably pretty stable, or so I think, i don’t really know. It does handles mouse input and focus management, making it quite easy to use. Will I stay with Vue TermUI? I don’t really know yet. I’m just beginning to try it out, and I’m curious to see how it ends up. Especially because Vue for TUI sounds pretty weird lol I actually really liked Rezi and you should check it out, as the issues I had were probably because I was doing something wrong hahah"}, {"post_id": 24535, "ts": "2026-07-08T04:57:03Z", "hours": 62.6878, "text": "Welp, I’ve been working for quite a while and this is quite a long devlog. If this seems interesting to you, leave a comment with suggestions! Maybe I could do some of them depending on their difficulty I now have a pretty good API structure. It has normal HTTP endpoints and also a subscription system using WebSockets so you can get event-based messages, all of it working already. I also did a JS/TS package so it’s easier to implement it on your proyects. (Still not published to npm) I currently have the following systems working: Account, Friends, Challenges, Matches, Bot management and Device auth (the thing where the app can show you an 8 character code to login). I also did a scopes system, that way you can know exactly what data the app will have access to and what actions it’d be able to do on your behalf I made the backend using Elysia , while the whole storage is a PostgreSQL database that I interface with using Drizzle . The doc pages were done using Fumadocs , I love the way they look :D A secondary DB, using Redis (or Redis-compatible DB) is also optional, quite useful as some thing like board movements might be done by players quite fast on low timers (like 1 min) and should be replied to as fast as possible to prevent the DB write speeds and reply time from counting against a player’s timer or affecting the match playability, though I still haven’t implemented timers lol If the secondary Redis DB isn’t setup, then that data will be stored on RAM in order to keep it fast. Things like match status is kept there until the match ends, that means if the API server restarts, the matches that are currently being played are restarted too. I thought this isn’t as bad of a tradeoff in order to have a fast API reply, especially because you can solve it by setting up the Redis DB, and then you can restart the API server without worry, as the data is stored on the Redis server. While the whole API is done, the account dashboard still requires some work to do, and I’m planning to do some integrations to make it easy to test, like a Discord bot (which is already done), a TUI, or maybe a web interface, though frontend interactivity isn’t something I’m really good at, and still haven’t gotten used to doing things “the React way” :P I also added some bot management endpoints. That way someone can create a bot account under their user and be able to create any “bot opponent” to play against, something that I also want to do so anyone trying out the API or implementations can test it without requiring another available opponent Don’t know if I should make an ELO/Leaderboard system, as those could be easily cheated and can’t really moderate them, and doing skill based match making wouldn’t work with a small user base."}, {"post_id": 7750, "ts": "2026-06-12T22:58:59Z", "hours": 14.0508, "text": "This is Chess Now! An open-source (soon!) API to control chess games. The idea is for anyone to be able to create and integrate their apps and be able to control the games from there. This also means that you could be playing on App1 while your opponent can be playing on App2, as the server-side is shared between them. I’ve added the whole auth flow and database integration. Better Auth really helped a lot in this regard, the docs were awesome. I used some templates for the hero and login/signup flow as I don’t have almost any experience with frontend development (and a side-goal for me is to not use AI for codegen while making this project), though I’ve been learning a LOT about frontend doing this. I’ll begin planning the whole API structure, I still don’t know where to begin hahah"}]...
|
Title: Chess Now! by @AngelCMHxD | Stardance
Devl Title: Chess Now! by @AngelCMHxD | Stardance
Devlogs:
This is Chess Now! An open-source (soon!) API to control chess games. The idea is for anyone to be able to create and integrate their apps and be able to control the games from there. This also means that you could be playing on App1 while your opponent can be playing on App2, as the server-side is shared between them. I’ve added the whole auth flow and database integration. Better Auth really helped a lot in this regard, the docs were awesome. I used some templates for the hero and login/signup flow as I don’t have almost any experience with frontend development (and a side-goal for me is to not use AI for codegen while making this project), though I’ve been learning a LOT about frontend doing this. I’ll begin planning the whole API structure, I still don’t know where to begin hahah
Welp, I’ve been working for quite a while and this is quite a long devlog. If this seems interesting to you, leave a comment with suggestions! Maybe I could do some of them depending on their difficulty I now have a pretty good API structure. It has normal HTTP endpoints and also a subscription system using WebSockets so you can get event-based messages, all of it working already. I also did a JS/TS package so it’s easier to implement it on your proyects. (Still not published to npm) I currently have the following systems working: Account, Friends, Challenges, Matches, Bot management and Device auth (the thing where the app can show you an 8 character code to login). I also did a scopes system, that way you can know exactly what data the app will have access to and what actions it’d be able to do on your behalf I made the backend using Elysia , while the whole storage is a PostgreSQL database that I interface with using Drizzle . The doc pages were done using Fumadocs , I love the way they look :D A secondary DB, using Redis (or Redis-compatible DB) is also optional, quite useful as some thing like board movements might be done by players quite fast on low timers (like 1 min) and should be replied to as fast as possible to prevent the DB write speeds and reply time from counting against a player’s timer or affecting the match playability, though I still haven’t implemented timers lol If the secondary Redis DB isn’t setup, then that data will be stored on RAM in order to keep it fast. Things like match status is kept there until the match ends, that means if the API server restarts, the matches that are currently being played are restarted too. I thought this isn’t as bad of a tradeoff in order to have a fast API reply, especially because you can solve it by setting up the Redis DB, and then you can restart the API server without worry, as the data is stored on the Redis server. While the whole API is done, the account dashboard still requires some work to do, and I’m planning to do some integrations to make it easy to test, like a Discord bot (which is already done), a TUI, or maybe a web interface, though frontend interactivity isn’t something I’m really good at, and still haven’t gotten used to doing things “the React way” :P I also added some bot management endpoints. That way someone can create a bot account under their user and be able to create any “bot opponent” to play against, something that I also want to do so anyone trying out the API or implementations can test it without requiring another available opponent Don’t know if I should make an ELO/Leaderboard system, as those could be easily cheated and can’t really moderate them, and doing skill based match making wouldn’t work with a small user base.
Welp, designing how to do the TUI was kinda… complex. I mostly know JS/TS, so I wanted to use that. And that made everything way more complex, as there aren’t so many options as you might have with something like how good Bubble Tea is on Go. So these were the options I considered: Ink : Which didn’t have mouse support and uses React, which I’ve felt kinda clunky while doing the webpage, so I wanted try something else. Rezi : Which, at first, was AMAZING. But it had some bugs where focus didn’t work at all and I couldn’t interact with the TUI, or just started getting weird. OpenTUI : tbf, I didn’t test it out that much, couldn’t really understand it’s TS bindings So what I ended up going with? Something not listed above: I ended up going with Vue TermUI ( for now ). Why? Well, I’ve wanted to try out Vue for some time now, and it uses OpenTUI under the hood, so it’s backend is probably pretty stable, or so I think, i don’t really know. It does handles mouse input and focus management, making it quite easy to use. Will I stay with Vue TermUI? I don’t really know yet. I’m just beginning to try it out, and I’m curious to see how it ends up. Especially because Vue for TUI sounds pretty weird lol I actually really liked Rezi and you should check it out, as the issues I had were probably because I was doing something wrong hahah
Well, making the TUI has gone quite well. While I initially thought that Vue seemed weird for doing TUIs, it’s actually not that bad. No wonder Ink is so popular. (Though I’m liking Vue more than I like React, and Ink felt kinda clunky at times when I first tried it) If you want to do TUIs with TypeScript/JavaScript, I’d recommend you give Vue TermUI a try. It also supports the Vue Router, so it’s easy to make a lot of pages and then navigate through them. The data show in the video is just mock data. So it still doesn’t use the actual API, though progress have gone quite well without many hiccups. The send friend request button, and the accept/reject challenge buttons do use the actual API, but they just throw an error because it tries to accept/reject a challenge that doesn’t actually exist, as it’s just mock data. The app doesn’t crash on error though, it displays the error message right below the button, that way the user can see what went wrong without having the whole app crash or any other unexpected behavior. What remains now is making some bots, that way I can make the whole “Playing a game” page, as having mock data for the WHOLE game state is not very… easy? I mean, I’ll have to do some bots anyway, so why not do them now instead of creating some weird mock functions hahah I also think that the icons on the authorization page feel weird. I dont know if maybe they are too big or if I should just change them to other ones. I also have to change the card after approval or denial instead of just showing the toast at the bottom, as it doesnt give feedback to the user Below is a small video of the TUI in action: (Disclaimer: Some AI was used, primarily to create the mock data so I could focus on the TUI itself)
Edit: I realized right after posting this devlog: 100 hours! This has taken me more time than what I expected and gone quite big at this point hahah Welp, the bots are done, and now I’ve tested the Discord integration. I made the bots using the js-chess-engine package. Why that instead of something like stockfish? it simply was way easier to do as it’s a full js/ts engine lol Though, that doesn’t mean that the stockfish engine wouldn’t be posible to integrate! as anyone can create bots, that also means that anyone could create a stockfish bot if they wanted to. In case you don’t know what Stockfish is: It’s a really powerful and popular chess engine written in C++. Also, while writing this devlog, I found this package , which could be used to make a stockfish bot really easily. Though the ELO of the stockfish bot is really high, so I don’t really regret choosing js-chess-engine as a simpler engine means people can at least win against it lol Here is a small video showing a match running on the discord bot. There are some small coordinates on the image so writing the SAN/LAN notation is easier, though it’s quire hard to see them on the video due to compression. While it has support for everything (friend requests, send challenges, accept challenges, etc), I kinda forgot to record the rest :P
And… This devlog is just to show the web dashboard, which I have forgotten to do a devlog for it all this time, which is why the logged time is so low lol I used the Next.js framework to build the web dashboard (well, the whole dashboard + welcome page and just the whole web thing). I also used the shadcn/ui components library, as I’m not that good making frontend stuff, so that helped a lot. The dashboard layout is actually a template you can find on the shadcn site, I love the huge amount of things they have I didn’t know what else to put as a welcome to the dashboard, so I left a little welcome message as seen at the beginning of the video And I also forgot to show (mostly because there wasn’t any) the notifications button, where you can find any incoming challenges and friend requests. The whole bot creation process works, at the end it gives you a token that you can use as if it were a user auth token, but you have all the scopes by default, so you can do anything you want with the account What remains to do on this web part is to be able to see the profile of other users, along with their recent matches. And also a web client so you can play without downloading the TUI client or needing to use the discord bot
The TUI is 100% done! (I think…) There is no longer any mock data and it works with the actual API. You can send and receive challenges and friend requests, and you can see/play your running matches. I think that, for the account management, I’ll remove email signups and only allow social OAuth2 (currently Google and Discord). As with email/password signups I need to handle email verification and password reset, and while Resend (what I use right now) is REALLY good and it’s free tier is great (3000 mails a month, 100 daily), if someone tries to spam the endpoints, it’s gonna eat up the limit. Though I might just put a rate limiter in place, and with Cloudflare Turnstile I already combat at least some botting, still thinking about it… I’ll probably start with the web client for now, which might be the last thing to do Below is a little video showing the TUI in action, while playing a match: (I took quite a bit of time thinking about the move I should make till I remembered I was just recording a test video lol)
Well, the web client is done!! I used react-chessboard and it’s a pretty good library. I didn’t add click-to-move pieces as it makes the logic a LOT more complex, so I didn’t want to do it for now I also used the API package from before, so we can use the websocket connection and listen for any changes. I also added it onto the matches page so any updates on the boards are reflected in real-time (which would probably look amazing if you have multiple automated matches running lol), and any new matches are added to the list without needing to refresh the page. I also want to add it onto the friends page, so it also updates in real-time I had to change the icons on the discord bot as I realized they were Chess.com’s icons, and they aren’t free to use, so I removed them and replaced them with a pack named Caliente , which look amazing. It’s the same one I use on the web client I think I should add a popup once the match is over as the current result feels quite plain. I also gotta add another page where you can spectate the match of other people, as the current one has too many logic already I prefer to duplicate it and remove the need of handling input and what not. I also haven’t added a profiles page yet, so that’s still on the TODO list hahah Below is a small video of me playing a match against a bot. Two disclaimers: I used AI to fix some issues I had with the CSS on the page, though it didn’t change anything other than fix some class names, and the whole logic was made by me. I played horribly against the bot, as the difficulty is set quite low lol Additional disclaimer: Ignore the -55s duration on one of the matches, it was an old bug but I’ve gotten lazy and haven’t fixed the match on the DB yet .-.
User page done! You can now see all of the matches and friends of other people, along with a small list of stats. I’m thinking about implementing the ELO system. While I previously said that I wouldn’t be able to moderate people artificially inflating it (by selfbotting), having it without a leaderboard wouldn’t really make it that enticing to abuse. And personally, if there isn’t a leaderboard, I don’t think moderating it would be that important, what would the user gain more than having a bigger number on their profile? Still thinking about it though I’m not sure about adding custom profile pictures or really any other user generated content. It would be nice to have, but it also involves moderation in order to prevent anything inappropriate from being uploaded (i mean, we all know how the internet works :/) Below is a small video showing the user page, along with the bot auto accepting any new friend requests :P
ELO system! let’s go!! At the end, I did add an ELO system. Well, it’s not really ELO, it’s Glicko . I used the glicko2-lite library, which is stateless unlike other glicko implementations I found. I wanted a stateless one because I’m saving the data on the DB anyways, so making it stateful would only make it use more resources (primarly RAM). You start with a rating of 1500. After every match your rating will go up/down depending on whether you win or lose. How much you win or lose depends on how many matches you have played (the first one are worth a bit more to get you to the optimal points), and depending on the rating of your oponent. If you win against someone with a bigger rating than yours, you’ll gain way more points than if you win agains someone around your rating or less. I also added a settings page so you can change your name and username, along with a page to change your password. Below is a small video showing how the ELO Glicko system works: What remains is just to also add the name/username change for bots and improve the docs. I also made a Stockfish bot which you can try to play against. (Keyword: try , because it’s probably almost impossible)
Well, that took way longer than expected. The docs are way more polished now! All endpoints have example responses so you know exactly what each one will return, along with a small description. HTTP endpoints that trigger a WebSocket event for any user (like friend requests, challenges, match moves, etc), mention it on their descriptions. I also added some headers to the PGN strings, as they were previously filled with “?“s. This mostly took this long due to a LOT of issues with the account deletion process, but it works perfectly now. When you delete your account, your user is replaced in all the matches you’ve played to @deleted_user . This is to keep the match data available even after any user deletes it. After that, your account is deleted from the DB. Due to how the DB is configured with cascade deletes, that will delete all other rows that reference the user (friendships, friend requests, pending challenges, etc.) except for matches, as they no longer reference the user that is being deleted. I’m am quite close to the ship, which I’m kinda nervous about. I want the project to be in the best state and as polished as possible, without any bugs (well, any known bugs lol). Which is mostly the reason this project as a whole has taken soo long :/ Below is a small video showing the docs with the example data. At the end is the delete account flow, which have lot’s of confirmations as it currently doesn’t send an email. I’m thinking it probably should send one lol See you in the next (and probably last) devlog! (I fixed my OBS settings, the video should look a bit better than the previous ones :P)
Hewo! Last devlog till ship here (i think) I didn’t think I’d add anything else, but you can now forfeit matches or ask the opponent for a draw! They just seemed like something that should exist on the shipped project… Each player can request only one draw per match, so you think before you do it. why did i do it like that? well, asking for a draw pauses the whole match, an neither player can do any moves until the draw request is answered. in order to prevent one of the users spamming draws, i simply limited to only one per match. also, ending the match in a draw doesn’t mean that your ELO isn’t affected, it is affected. depending on the elo of your opponent, you’ll lose/earn elo on a draw, just as you’d do on a stalemate. I also added a piece promotion selector. i forgot i made it so it always chose the queen by default, but in some matches that might not be wanted, so now you get a popup to select the piece you want to promote to well, i don’t really know if i’m missing any other things, as that was all that was i had on my TODO list, so i guess i’ll start setting up the prod environment below is a video showing the forfeit and draw flows, along with the promotion popup. don’t worry about the first match being a valid checkmate but the match continued being active, i already fixed that bug but it didn’t apply to already affected matches :P i also sped up (is that the correct way to say it?) and cutted out some parts of the video to prevent it from being 6 minutes of me playing the match lol
Well, I set up the domain + reverse proxy and all kind of problems arose. I changed the package so you only need to instantiate the class without any arguments to use the default server over at https://chessnow.angelcmh.com though you can still pass an optional baseUrl in case you selfhost your own instance at first nothing worked, but then i noticed that I had a port conflict on my VPS with two things trying to use the same port lol i also tried to improve SEO on the main page as much as I could, though im not an expert on that. i also added an official bots section so you can challenge some bots without having to look at any docs to find them shipping in some minutes!
Hewo! This devlog was unexpected. I prepared a small video/trailer so I had something to upload when shipping the project, and when I tried to upload it I realized that you can only upload images when shipping a project :/ So here is that video as it won’t go to waste. I tried my best, hope my voice doesn’t sound awkward, I’m not a native speaker Also, check out the shipped project! As I probably shipped it right after this devlog
aaaa, so… long time no see! also, super star!!! So, I’ve began doing some things that I’ve meant to do before, but completely forgot as I got quite busy… lol I fixed an error which made the TUI not work on Linux, it works now! It was an issue as I was building on NixOS, and the linker path was on my /nix/store folder instead of the usual /lib one. that means it also broke for me after an update lol You can now configure challenges! This needed to be implemented on all clients, hence why it took a little while lol Select whether you want to start with white, black or random. The opponent will be able to see which color you selected before accepting the challenge though! :P Also, meet unrankeds! You can now also mark a match as unranked so it doesn’t affect your ELO ratings at all . Take into account that there is decay though! so if you don’t play ranked for a while, your next match ELO diffs might be a little bit different Fun fact: The starting color option has been available on the API for a while already, even documented. so, if you did API calls directly, you could have selected a starting color and the opponent would not have been able to notice! as none of the clients showed it. except for the Discord bot… I think… or if you requested the match through the API too ;D
Ships:
This is Chess Now! A real-time chess API with challenges handling, matches, friends, and much more! The idea is for anyone to be able to make a custom client, bot or integration with the platform, thus it’s as open as it can possibly be while trying to also stay secure. One of the biggest parts of the proyect was doing that many clients, especially the TUI client. While I learned Vue doing the TUI client, I found it’s behaviour kinda… unintuitive in some way I can’t really explain. Though at the end I felt that Vue is better than React by a mile (now I only have to try out Svelte) I am proud of how well structured the API is, and while I’m sure it can be improved, the bases feel pretty solid. I’m also proud of how much I learned doing this. I mean, I tried a lot of things I’ve been meaning to try for some time already: Vue, Better Auth, Drizzle ORM, actually deploying a Next.js app, React mail + Resend, Elysia, and Fumadocs. And probably something else I already forgot about hehe Would I do something different if I started right now? Probably, but mostly just to try out even more things, which is the main reason why I do most of my projects. If you want to try out the project, you should probably just check the instance hosted at https://chessnow.angelcmh.com/ , create an account and play against a bot. You should also check out the docs, or the npm package over at https://www.npmjs.com/package/@chess-now/api if you are interested. Thanks for reading till the end, have a great day! ;P...
|
1793112810.9034045
|
1793199210.9034045
|
|
8007
|
Virgil Modular Audio Controller by @dapenguinguy | Virgil Modular Audio Controller by @dapenguinguy | Stardance...
|
dapenguinguy
|
1
|
18.46
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-09T21:50:11Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a modular audio controller (with 6 different PCB designs). This has motorized faders, power monitoring, 8 full color screens, wired and wireless networking, and POE. I designed this to develop my Virgil network protocol in the future. Right now, I am shipping to get funding for PCBs. If you want to see this project go far and do well, please rate it well!", "repo": "https://github.com/da-penguin-guy/Virgil-Controller", "demo": ""}]...
|
[{"post_id": 28586, "ts": "202 [{"post_id": 28586, "ts": "2026-07-14T22:35:32Z", "hours": 9.1997, "text": "A lot has changed In the time since my last devlog, I have redesigned every single PCB and upended the entire project topology. So nothing that out of the ordinary CAN Bus Previously I was planning on using SPI as the primary data transfer method between the controller and the modules. However, after doing some math, that wouldn’t work at like above 100khz because reasons. So, now i’m switching over to a protocol that’s actually designed for being a Bus. There is a PIO library that supports CAN with an external transceiver for everything but bootloading, so I still need to keep the SWD lines around. Infinite expandability Because CAN doesn’t need interrupt or CS pins, this allows for you to add as many modules as you want. All you’ll need to do is plug in more backplanes! Removed features The only feature I removed is POE. The power module connector has all the pins required to make it available, but I decided that it isn’t worth the space or time for this first prototype Well, I do actually still need CS pins I lied earlier. While it is true that CAN Bus does not need CS pins, the design still needs them. This is because SWD is not a bus protocol, and so needs multiplexing for true control. While SWD does have a multi-device mode, the RP2040 and 2350 uses it to control each core, meaning it won’t work with more than 1 device connected at once. However, this is still a good thing, because the SWD CS lines can be much slower than SPI CS (for my application). This means that I can use GPIO expanders for these lines, and even use them for other module insert detection and module identification. Funding update I got rejected because I didn’t include a BOM, now I’ve resubmitted with a full BOM. Hopefuly I’ll get approved soon! Oops, I went to get a rendering of a PCB and I realized a part was backwards. Here is the fixed PCB"}, {"post_id": 9614, "ts": "2026-06-16T00:41:43Z", "hours": 0.2647, "text": "I am now under review for funding! Note for the people reviewing this The $400 is only for the PCBs, and that’s only about half. The PCB total is $730, and I can afford to pay the remaining out of pocket. The PCBs themselves are only $430, but because I live in the US the shipping and tax and customs is $300. The $430 is including assembly and component cost. I am unable to assemble them myself because I have chronic hand tremors, making it impossible to place rp2040s and rp2350s. This won’t just be a fantastic learning opportunity for me, but it also has the potential to change the live sound industry. I have designed this to be a sales-ready product, and at scale it would be at least $100 cheaper than the competition. In addition, the virgil controller will be used to develop the virgil protocol. For more information, seem y projects readme. Thank you for your time and concideration"}, {"post_id": 5903, "ts": "2026-06-09T21:34:42Z", "hours": 3.0481, "text": "Devlog #2 I have finished work on my PCBs. For real this time. Probably. I am now to the point where I am at a practical deadend until I get the boards, so this may be my last devlog before my first ship. So, I should probably fill you in on what this project is, and why it matters This project is built like a modular controller, complete with hot swap motorized faders and networking. While building anything modular is hard, that is not the main point of this project. The main point is for it to be a devboard for the Virgil protocol. The Virgil protocol is a network protocol I am designing to make the live sound industry more standardized and less dominated by singular brands. For more information, go to the Virgil Controller github, in the project information."}, {"post_id": 5081, "ts": "2026-06-08T19:22:22Z", "hours": 0.5428, "text": "Virgil Controller Devlog #1 I can proudly say that I have actually made progress during this challenge! I have updated my controller PCB to use the rp2350 chip without a carrier board for cost reasons, complete with a pretty 45 degree angle The kicad wakatime program just… isn’t working, so I completed this in an astonishing 15 min. Now onto making the modules use the bare chip."}, {"post_id": 3945, "ts": "2026-06-07T02:21:44Z", "hours": 0.6244, "text": "Virgil Controller Devlog #-1 I wrote a devlog #0.5, but it just didn’t post. It doesn’t really matter, because I have made negative progress since then, therefore devlog -1 I’ve decided that instead of using rp2040 modules, I’m going to make the PCBs have the bare chips on them. Which means it saves me money, but I’m needing to go back and redo a lot of work. It’s getting pretty late, so I’m gonna commit my partial readme and continue in the morning. Here’s my existing mainboard, so that you can see the darling that I’m killing. I saw someone doing quote of the day, so I’m gonna do a subtle variation of that Project insight of the day: “Get good at killing your darlings” P.S. How are yall doing that fancy markdown formatting?"}, {"post_id": 3734, "ts": "2026-06-06T19:38:31Z", "hours": 0.4728, "text": "Love JLCPCB. Hate Shipping and customs"}, {"post_id": 3490, "ts": "2026-06-06T13:34:06Z", "hours": 3.7778, "text": "Completed enclosure 3D Model! After fighting with Onshape for several days, I finally completed the enclosure. The only downside is that a couple of the parts are impossible to 3d print, but that’s a future me problem. Time to order the PCBs"}, {"post_id": 2821, "ts": "2026-06-05T17:24:21Z", "hours": 0.2881, "text": "Completed module backplane"}]...
|
Title: Virgil Modular Audio Controller by @dapengu Title: Virgil Modular Audio Controller by @dapenguinguy | Stardance
Devlogs:
Completed module backplane
Completed enclosure 3D Model! After fighting with Onshape for several days, I finally completed the enclosure. The only downside is that a couple of the parts are impossible to 3d print, but that’s a future me problem. Time to order the PCBs
Love JLCPCB. Hate Shipping and customs
Virgil Controller Devlog #-1 I wrote a devlog #0.5, but it just didn’t post. It doesn’t really matter, because I have made negative progress since then, therefore devlog -1 I’ve decided that instead of using rp2040 modules, I’m going to make the PCBs have the bare chips on them. Which means it saves me money, but I’m needing to go back and redo a lot of work. It’s getting pretty late, so I’m gonna commit my partial readme and continue in the morning. Here’s my existing mainboard, so that you can see the darling that I’m killing. I saw someone doing quote of the day, so I’m gonna do a subtle variation of that Project insight of the day: “Get good at killing your darlings” P.S. How are yall doing that fancy markdown formatting?
Virgil Controller Devlog #1 I can proudly say that I have actually made progress during this challenge! I have updated my controller PCB to use the rp2350 chip without a carrier board for cost reasons, complete with a pretty 45 degree angle The kicad wakatime program just… isn’t working, so I completed this in an astonishing 15 min. Now onto making the modules use the bare chip.
Devlog #2 I have finished work on my PCBs. For real this time. Probably. I am now to the point where I am at a practical deadend until I get the boards, so this may be my last devlog before my first ship. So, I should probably fill you in on what this project is, and why it matters This project is built like a modular controller, complete with hot swap motorized faders and networking. While building anything modular is hard, that is not the main point of this project. The main point is for it to be a devboard for the Virgil protocol. The Virgil protocol is a network protocol I am designing to make the live sound industry more standardized and less dominated by singular brands. For more information, go to the Virgil Controller github, in the project information.
I am now under review for funding! Note for the people reviewing this The $400 is only for the PCBs, and that’s only about half. The PCB total is $730, and I can afford to pay the remaining out of pocket. The PCBs themselves are only $430, but because I live in the US the shipping and tax and customs is $300. The $430 is including assembly and component cost. I am unable to assemble them myself because I have chronic hand tremors, making it impossible to place rp2040s and rp2350s. This won’t just be a fantastic learning opportunity for me, but it also has the potential to change the live sound industry. I have designed this to be a sales-ready product, and at scale it would be at least $100 cheaper than the competition. In addition, the virgil controller will be used to develop the virgil protocol. For more information, seem y projects readme. Thank you for your time and concideration
A lot has changed In the time since my last devlog, I have redesigned every single PCB and upended the entire project topology. So nothing that out of the ordinary CAN Bus Previously I was planning on using SPI as the primary data transfer method between the controller and the modules. However, after doing some math, that wouldn’t work at like above 100khz because reasons. So, now i’m switching over to a protocol that’s actually designed for being a Bus. There is a PIO library that supports CAN with an external transceiver for everything but bootloading, so I still need to keep the SWD lines around. Infinite expandability Because CAN doesn’t need interrupt or CS pins, this allows for you to add as many modules as you want. All you’ll need to do is plug in more backplanes! Removed features The only feature I removed is POE. The power module connector has all the pins required to make it available, but I decided that it isn’t worth the space or time for this first prototype Well, I do actually still need CS pins I lied earlier. While it is true that CAN Bus does not need CS pins, the design still needs them. This is because SWD is not a bus protocol, and so needs multiplexing for true control. While SWD does have a multi-device mode, the RP2040 and 2350 uses it to control each core, meaning it won’t work with more than 1 device connected at once. However, this is still a good thing, because the SWD CS lines can be much slower than SPI CS (for my application). This means that I can use GPIO expanders for these lines, and even use them for other module insert detection and module identification. Funding update I got rejected because I didn’t include a BOM, now I’ve resubmitted with a full BOM. Hopefuly I’ll get approved soon! Oops, I went to get a rendering of a PCB and I realized a part was backwards. Here is the fixed PCB
Ships:
I created a modular audio controller (with 6 different PCB designs). This has motorized faders, power monitoring, 8 full color screens, wired and wireless networking, and POE. I designed this to develop my Virgil network protocol in the future. Right now, I am shipping to get funding for PCBs. If you want to see this project go far and do well, please rate it well!...
|
1793141238.2073112
|
1793227638.2073112
|
|
8061
|
Focus by @anay_ | Stardance
|
anay_
|
1
|
4.0
|
6
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T05:54:13Z", "hours": 3.0, "multiplier": 2.57, "payout": 6, "blessing": "neutral", "text": "I made Focus, a Mac menu bar app that helps you stay off distracting apps and websites. It can start focus sessions, block apps or sites, set daily app limits, and show how much time you spent on apps and websites today. The hardest part was making it work with Mac permissions and browser controls. I am proud that it is a real working app, not just a design. To test it, open the app, give it the permissions it asks for, add an app or website to block, start a focus session, and try opening that app or site.", "repo": "https://github.com/anaygoyal09/Focus", "demo": "https://github.com/anaygoyal09/Focus/releases/tag/v2.0.1"}]...
|
[{"post_id": 7821, "ts": "2026 [{"post_id": 7821, "ts": "2026-06-13T01:47:55Z", "hours": 1.0, "text": "Critical errors fixed which were related to the app working while in sandbox but had problems getting permissions after getting signed took some time to go about fix it."}, {"post_id": 3312, "ts": "2026-06-06T05:34:47Z", "hours": 2.0, "text": "I made changes to make it log websites too. Made UI more modern"}, {"post_id": 2975, "ts": "2026-06-05T21:51:53Z", "hours": 0.0, "text": "A simple focus that includes limits and it helps me stay on task, really helped me get off social media"}]...
|
Title: Focus by @anay_ | Stardance
Devlogs:
A sim Title: Focus by @anay_ | Stardance
Devlogs:
A simple focus that includes limits and it helps me stay on task, really helped me get off social media
I made changes to make it log websites too. Made UI more modern
Critical errors fixed which were related to the app working while in sandbox but had problems getting permissions after getting signed took some time to go about fix it.
Ships:
I made Focus, a Mac menu bar app that helps you stay off distracting apps and websites. It can start focus sessions, block apps or sites, set daily app limits, and show how much time you spent on apps and websites today. The hardest part was making it work with Mac permissions and browser controls. I am proud that it is a real working app, not just a design. To test it, open the app, give it the permissions it asks for, add an app or website to block, start a focus session, and try opening that app or site....
|
1792882040.9550064
|
1793746040.9550064
|
|
8170
|
Lethal Company Sim Cruiser (G25) by @BigSaltyBeans Lethal Company Sim Cruiser (G25) by @BigSaltyBeans | Stardance...
|
BigSaltyBeans
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T03:59:40Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "SimCruiser Ship! SimCruiser G25 is a Lethal Company mod that changes the Company Cruiser’s input logic to make it compatible with a Logitech G25 Sim Wheel. It’s been a journey but this mod is such a blast to use when playing with friends and still support tech like Cruiser jumps and interacting. Features: Adds input bindings for the G25 wheel Rewrites the Company Cruiser input system to make driving feel more realistic with the G25 Shifter changes between Drive, Reverse and Park Wheel is 1:1 with the cruiser Pedals accelerate and break You can install this Mod through Thunderstore or download the .dll directly. Have fun! Liam", "repo": "https://github.com/LRGuess/SimCruiser-G25", "demo": "https://youtu.be/XbiNcqWlCIg"}]...
|
[{"post_id": 12852, "ts": "202 [{"post_id": 12852, "ts": "2026-06-21T01:35:28Z", "hours": 0.7128, "text": "Devlog 5 After I got the steering working, I wanted to be able to use the G25’s shifter to change gears in the company cruiser. This required more expirimenting to figure out how the shifter is interpreted by unity’s input system. Investigating It turns out that every position on the shifter is assigned a button, and that button is considered pressed when the shifter is in that gear. Below are the button assignements I found: In 6 Gear Mode 1st Gear: Button 9 2nd Gear: Button 10 3rd Gear: Button 11 4th Gear: Button 12 5th Gear: Button 13 6th Gear: Button 14 Reverse: Button 15 In +/- Mode Forward: Button 9 Back: Button 10 I also took a look at how the player sets the cruiser’s gears, and it’s with a method called ShiftToGearAndSync(desiredGear) . So when changing gears this is the method I need to call. Implementation Getting the shifting working was pretty easy. First I created 2 new actions and bindings for the Drive and Reverse gears and bound then to the 3rd and 4th gears on the shifter. I chose those as it keep it centered and feels more natural. Then I added some code into the same method we edited for the steering that: Stores the current gear. Checks if the stick is in a position: If yes: Is the stick in the same position as it was last frame? If yes ignore If no set the cruiser’s gear to the new gear If no: Set the cruiser’s gear into park as no gear is selected. So in our case, what IRL is neutral is park, forward (or 3rd) is drive and back (or 4th) is reverse. Feels pretty epic when driving the cruiser! Next up: The mod is basically done, but there are a few things we can still do: Add bindings for things like the radio, wipers, etc Ship the final version in Thunderstore Cheers! Liam"}, {"post_id": 12688, "ts": "2026-06-20T18:43:30Z", "hours": 2.1686, "text": "Devlog 4 Finished re-writing the cruiser’s steering!Not too much to say, but still a pretty big update: The cruiser’s steering wheel is now 1:1 with the physical G25 in multiple ways. Originally the Company Cruiser was driven by holding down the A or D keys to steer. The wheel would gradually rotate in the direction you were holding and stop rotating but maintain the rotation on release. This logic obviously sucks when you want to use a sim wheel, because you want the CC’s wheel rotation to be a direct replica of the physical wheel’s rotation. This means the logic had to be redone, therefore a rewrite of the cruiser’s GetVehicleInput() needed to be done. Implementation Zeekerss original code for steering was this: float num = __instance.steeringWheelTurnSpeed; __instance.steeringInput = Mathf.Clamp(__instance.steeringInput + __instance.moveInputVector.x * num * Time.deltaTime, -3f, 3f); Modifing these lines was pretty straightforward: Remove num entirely as we done need the wheel’s turn speed Don’t multiply by Time.deltaTime as it’ll be direct Don’t add the old input values to the new one as we want 1:1 with the G25 In the end the code looked like this: __instance.steeringInput = Mathf.Clamp(__instance.moveInputVector.x * 3f, -3f, 3f); We need to multiply by 3 as we want the max to be 3 but the input can only reach a max value of 1. Animation This new wheel logic worked great except one problem: The G25 would be at 90deg at it’s max but the game would show it at 225deg. The solution to this was to adjust the anim’s clam values from +/- 1 to +/- 2.4. Why? Because we need to remove 1.4f from the max value, and for some reason the anim needs us to add it onto 1 instead of remove ¯ \\ _ (ツ)_/¯ Next Up: Going forward all that’s really left is using the G25’s shifter to change the cruiser’s gears from Park, Reverse and Drive! Cheers, Liam"}, {"post_id": 12295, "ts": "2026-06-20T02:01:25Z", "hours": 0.9897, "text": "Devlog 3 Tried driving the company cruiser with the wheel, and a few things need to be done: The CC’s steering needs to be turned 1:1 with the wheel’s input Acceleration and breaking needs to be rewritten to feel more realistic Published the input part of the mod onto Thunderstore tho to make testing easier. I’ll make a more interesting update once I start working that out! Cheers, Liam"}, {"post_id": 12045, "ts": "2026-06-19T17:21:31Z", "hours": 4.5825, "text": "Devlog 2 Finally finished the first and most cruicial part of the mod! The first step to this mod was to let Lethal Company’s input system receive bindings from the G25. Now this in theory should have been a fast and easy implementation. Here’s how it turned into a 4 hour journey: Writing base code I started off by writing the essential parts of the mod. This mod uses BenInEx and HarmonyLib to patch my custom code into Lethal Company, so I made the public BasicUnityPlugin class that applies all patches in the .GetExecutingAssembly() . This means that it’ll look at all the code in the built .dll and patch automatically instead of me specifying what classes I want to patch. The AddWheelBindings class This is the center of attention when it comes to the input patching. This class needs to do 3 things: Find the localPlayerController Get all InputActionAssets that affect the localPlayerController Add new bindings to the ActionAsset’s InputAction that needs it By fiddling around with the input system in another project, I found the name of the wheel to be <HID::G25 Racing Wheel> . Knowing the device name, I was ready to start patching the new inputs into the input assets. The class that we will be patching is the StartOfRound class as it handles a lot of the local player and game logic. First I found the local player through StartOfRound.Instance?.localPlayerController; , then found the player’s playerActions asset and assigned a var to that. Then I made a function that takes the InputActionAsset, finds the actions we want, such as the ‘move’ action, and applies a new binding to that action. For example, we can grab the ‘interact’ action with InputAction interact = actions.FindAction(\"Interact\"); and give it a new binding specifically for the G25: jump.AddBinding(\"<HID::G25 Racing Wheel>/button7\").WithInteraction(\"press\"); Weirdness Once I finished adding all the bindings to the right actions along with some null checks, I build the .dll and got to testing. Right off the bat nothing worked, but a quick change to what method we needed to patch… kind of fixed things? Something weird was going on: the bindings I’d made to the look action were working, but none of the other were. 3 hour long story short, Zeekerss made his PlayerControllerB read from two different instances of one InputActionAsset, so the bindings and actions across the two were the same but each one was being referanced in different spots. The camera worked right away because the line that read the camera’s input was: playerActions.Movement.Look.ReadValue<Vector2>() as opposed to all other controls read as such: InputSystem.actions.FindAction(\"Move\").ReadValue<Vector2>(); . The InputActionAsset I was patching was the one created in the player’s Awake() method, playerActions , and not the second global one.The only reason I found for Zeekerss to make two is that the mouse was being read by the first because the look input is not one that can be rebound in the settings menu. All the controls pulled from the second asset are controls that can be rebound in settings, meaning that the second one was the player’s local input settings when the first was the default. Fix All that needed to be done for the G25 controls to be read for all the actions was to also patch InputSystem.actions ’s asset. It took about 3 1/2 hours to figure this out, but at least it works now! Next up: Going forward we need to: Test the current system on the cruiser See what needs changes to feel more realistic Cheers! Liam"}, {"post_id": 11658, "ts": "2026-06-19T00:16:10Z", "hours": 1.3206, "text": "Devlog 1 Recently, and as summer’s been coming around, I’ve been playing more and more lethal company with the bros. Now I wouldn’t say we’re sweats or anything, but we’re pretty good and can get to 3000+ quotas without many resets. On thing that’s made that possible is the wonderful Company Cruiser! For anyone who’s driven the Company Cruiser before, you already know how hellish it can be. The gear changes, janky steering and funny physics make it truly an experience to manage. I’ve been driving this thing for a while now and would like to think that I’m quite proficient, but looking around my room got me thinking: What if I could use my Logitech steering wheel to drive the cruiser? Now of course the base game has no support for it and the input system used to drive the Cruiser is 1-0 based and not Vector based (W key accelerates at max when a pedal would be an axis), but having modded lethal before I was sure It’d be feasible. So I got cracking. Configuring the Wheel The Logitech G25 is a legacy wheel and is not supported in newer Logitech software. After much fiddling I figured out I needed to use a very old version of Logitech Gaming Software to get it to register properly on my computer. Bringing it into Unity To start I needed to learn how the wheel interacts in and gets registered by Unity, specifically Unity 2022.3.9f , the version Zeekerss used to build LC. I began by making a unity project in that version with the URP Template, as it already had a preconfigured controller using the new Input System. I also downloaded a unity project by Juandarn called SpaceVR that used the Logitech G25 to figure out how it configured the wheel in it’s input system. Here’s what I learnt: The G25 is interpreted as a joystick with the wheel being Left and Right (X), Accelerator being Y+, and the Brake being Y-. All the buttons are regular. The Dpad is also a joystick. Z axis is the accelerator pedal but inverted (???) RZ axis is the brake pedal but inverted (also ???) Trigger is just button 1 Slider is inverted Clutch pedal Looking at Lethal Company’s input system As the goal is to be able to drive the CC with the G25, it was also time to start looking at how Zeekerss configured the Input system for LC. I did this by using an asset ripper to reverse engineer Zeekerss LC build and turn it back into a Unity Project. So now that I have LC’s source code, it turns out it’s pretty simple and all the controls under one Action Map, so in the end I’ll need to add the G25’s axis configurations to the Actions themselves. I don’t think it’ll be too hard but for that I’ll need to start on some research related to interacting with a player’s input system through an LC mod patch. Next up: Programming basic mod for Lethal that adds the wheel’s axis to the base game’s player input actions. Looking into how the Company Cruiser interprets player inputs to see what needs to be reprogrammed. This will be quite the fun mod and journey, post a comment if you have any ideas or suggestions! Cheers, Liam"}]...
|
Title: Lethal Company Sim Cruiser (G25) by @BigSal Title: Lethal Company Sim Cruiser (G25) by @BigSaltyBeans | Stardance
Devlogs:
Devlog 1 Recently, and as summer’s been coming around, I’ve been playing more and more lethal company with the bros. Now I wouldn’t say we’re sweats or anything, but we’re pretty good and can get to 3000+ quotas without many resets. On thing that’s made that possible is the wonderful Company Cruiser! For anyone who’s driven the Company Cruiser before, you already know how hellish it can be. The gear changes, janky steering and funny physics make it truly an experience to manage. I’ve been driving this thing for a while now and would like to think that I’m quite proficient, but looking around my room got me thinking: What if I could use my Logitech steering wheel to drive the cruiser? Now of course the base game has no support for it and the input system used to drive the Cruiser is 1-0 based and not Vector based (W key accelerates at max when a pedal would be an axis), but having modded lethal before I was sure It’d be feasible. So I got cracking. Configuring the Wheel The Logitech G25 is a legacy wheel and is not supported in newer Logitech software. After much fiddling I figured out I needed to use a very old version of Logitech Gaming Software to get it to register properly on my computer. Bringing it into Unity To start I needed to learn how the wheel interacts in and gets registered by Unity, specifically Unity 2022.3.9f , the version Zeekerss used to build LC. I began by making a unity project in that version with the URP Template, as it already had a preconfigured controller using the new Input System. I also downloaded a unity project by Juandarn called SpaceVR that used the Logitech G25 to figure out how it configured the wheel in it’s input system. Here’s what I learnt: The G25 is interpreted as a joystick with the wheel being Left and Right (X), Accelerator being Y+, and the Brake being Y-. All the buttons are regular. The Dpad is also a joystick. Z axis is the accelerator pedal but inverted (???) RZ axis is the brake pedal but inverted (also ???) Trigger is just button 1 Slider is inverted Clutch pedal Looking at Lethal Company’s input system As the goal is to be able to drive the CC with the G25, it was also time to start looking at how Zeekerss configured the Input system for LC. I did this by using an asset ripper to reverse engineer Zeekerss LC build and turn it back into a Unity Project. So now that I have LC’s source code, it turns out it’s pretty simple and all the controls under one Action Map, so in the end I’ll need to add the G25’s axis configurations to the Actions themselves. I don’t think it’ll be too hard but for that I’ll need to start on some research related to interacting with a player’s input system through an LC mod patch. Next up: Programming basic mod for Lethal that adds the wheel’s axis to the base game’s player input actions. Looking into how the Company Cruiser interprets player inputs to see what needs to be reprogrammed. This will be quite the fun mod and journey, post a comment if you have any ideas or suggestions! Cheers, Liam
Devlog 2 Finally finished the first and most cruicial part of the mod! The first step to this mod was to let Lethal Company’s input system receive bindings from the G25. Now this in theory should have been a fast and easy implementation. Here’s how it turned into a 4 hour journey: Writing base code I started off by writing the essential parts of the mod. This mod uses BenInEx and HarmonyLib to patch my custom code into Lethal Company, so I made the public BasicUnityPlugin class that applies all patches in the .GetExecutingAssembly() . This means that it’ll look at all the code in the built .dll and patch automatically instead of me specifying what classes I want to patch. The AddWheelBindings class This is the center of attention when it comes to the input patching. This class needs to do 3 things: Find the localPlayerController Get all InputActionAssets that affect the localPlayerController Add new bindings to the ActionAsset’s InputAction that needs it By fiddling around with the input system in another project, I found the name of the wheel to be <HID::G25 Racing Wheel> . Knowing the device name, I was ready to start patching the new inputs into the input assets. The class that we will be patching is the StartOfRound class as it handles a lot of the local player and game logic. First I found the local player through StartOfRound.Instance?.localPlayerController; , then found the player’s playerActions asset and assigned a var to that. Then I made a function that takes the InputActionAsset, finds the actions we want, such as the ‘move’ action, and applies a new binding to that action. For example, we can grab the ‘interact’ action with InputAction interact = actions.FindAction("Interact"); and give it a new binding specifically for the G25: jump.AddBinding("<HID::G25 Racing Wheel>/button7").WithInteraction("press"); Weirdness Once I finished adding all the bindings to the right actions along with some null checks, I build the .dll and got to testing. Right off the bat nothing worked, but a quick change to what method we needed to patch… kind of fixed things? Something weird was going on: the bindings I’d made to the look action were working, but none of the other were. 3 hour long story short, Zeekerss made his PlayerControllerB read from two different instances of one InputActionAsset, so the bindings and actions across the two were the same but each one was being referanced in different spots. The camera worked right away because the line that read the camera’s input was: playerActions.Movement.Look.ReadValue<Vector2>() as opposed to all other controls read as such: InputSystem.actions.FindAction("Move").ReadValue<Vector2>(); . The InputActionAsset I was patching was the one created in the player’s Awake() method, playerActions , and not the second global one.The only reason I found for Zeekerss to make two is that the mouse was being read by the first because the look input is not one that can be rebound in the settings menu. All the controls pulled from the second asset are controls that can be rebound in settings, meaning that the second one was the player’s local input settings when the first was the default. Fix All that needed to be done for the G25 controls to be read for all the actions was to also patch InputSystem.actions ’s asset. It took about 3 1/2 hours to figure this out, but at least it works now! Next up: Going forward we need to: Test the current system on the cruiser See what needs changes to feel more realistic Cheers! Liam
Devlog 3 Tried driving the company cruiser with the wheel, and a few things need to be done: The CC’s steering needs to be turned 1:1 with the wheel’s input Acceleration and breaking needs to be rewritten to feel more realistic Published the input part of the mod onto Thunderstore tho to make testing easier. I’ll make a more interesting update once I start working that out! Cheers, Liam
Devlog 4 Finished re-writing the cruiser’s steering!Not too much to say, but still a pretty big update: The cruiser’s steering wheel is now 1:1 with the physical G25 in multiple ways. Originally the Company Cruiser was driven by holding down the A or D keys to steer. The wheel would gradually rotate in the direction you were holding and stop rotating but maintain the rotation on release. This logic obviously sucks when you want to use a sim wheel, because you want the CC’s wheel rotation to be a direct replica of the physical wheel’s rotation. This means the logic had to be redone, therefore a rewrite of the cruiser’s GetVehicleInput() needed to be done. Implementation Zeekerss original code for steering was this: float num = __instance.steeringWheelTurnSpeed; __instance.steeringInput = Mathf.Clamp(__instance.steeringInput + __instance.moveInputVector.x * num * Time.deltaTime, -3f, 3f); Modifing these lines was pretty straightforward: Remove num entirely as we done need the wheel’s turn speed Don’t multiply by Time.deltaTime as it’ll be direct Don’t add the old input values to the new one as we want 1:1 with the G25 In the end the code looked like this: __instance.steeringInput = Mathf.Clamp(__instance.moveInputVector.x * 3f, -3f, 3f); We need to multiply by 3 as we want the max to be 3 but the input can only reach a max value of 1. Animation This new wheel logic worked great except one problem: The G25 would be at 90deg at it’s max but the game would show it at 225deg. The solution to this was to adjust the anim’s clam values from +/- 1 to +/- 2.4. Why? Because we need to remove 1.4f from the max value, and for some reason the anim needs us to add it onto 1 instead of remove ¯ \ _ (ツ)_/¯ Next Up: Going forward all that’s really left is using the G25’s shifter to change the cruiser’s gears from Park, Reverse and Drive! Cheers, Liam
Devlog 5 After I got the steering working, I wanted to be able to use the G25’s shifter to change gears in the company cruiser. This required more expirimenting to figure out how the shifter is interpreted by unity’s input system. Investigating It turns out that every position on the shifter is assigned a button, and that button is considered pressed when the shifter is in that gear. Below are the button assignements I found: In 6 Gear Mode 1st Gear: Button 9 2nd Gear: Button 10 3rd Gear: Button 11 4th Gear: Button 12 5th Gear: Button 13 6th Gear: Button 14 Reverse: Button 15 In +/- Mode Forward: Button 9 Back: Button 10 I also took a look at how the player sets the cruiser’s gears, and it’s with a method called ShiftToGearAndSync(desiredGear) . So when changing gears this is the method I need to call. Implementation Getting the shifting working was pretty easy. First I created 2 new actions and bindings for the Drive and Reverse gears and bound then to the 3rd and 4th gears on the shifter. I chose those as it keep it centered and feels more natural. Then I added some code into the same method we edited for the steering that: Stores the current gear. Checks if the stick is in a position: If yes: Is the stick in the same position as it was last frame? If yes ignore If no set the cruiser’s gear to the new gear If no: Set the cruiser’s gear into park as no gear is selected. So in our case, what IRL is neutral is park, forward (or 3rd) is drive and back (or 4th) is reverse. Feels pretty epic when driving the cruiser! Next up: The mod is basically done, but there are a few things we can still do: Add bindings for things like the radio, wipers, etc Ship the final version in Thunderstore Cheers! Liam
Ships:
SimCruiser Ship! SimCruiser G25 is a Lethal Company mod that changes the Company Cruiser’s input logic to make it compatible with a Logitech G25 Sim Wheel. It’s been a journey but this mod is such a blast to use when playing with friends and still support tech like Cruiser jumps and interacting. Features: Adds input bindings for the G25 wheel Rewrites the Company Cruiser input system to make driving feel more realistic with the G25 Shifter changes between Drive, Reverse and Park Wheel is 1:1 with the cruiser Pedals accelerate and break You can install this Mod through Thunderstore or download the .dll directly. Have fun! Liam...
|
1793083763.725014
|
1793170163.725014
|
|
8187
|
Macropad by @zsm1 | Stardance
|
zsm1
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-09T22:47:09Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What I made I designed and built a custom mechanical macropad from the ground up using KiCad, Fusion 360, and custom firmware. The macropad features: 3×3 mechanical key matrix Rotary encoder for volume or other controls OLED display for status information 20 addressable RGB LEDs for underglow lighting Seeed Studio XIAO RP2040 microcontroller Custom PCB and enclosure The project combines electronics design, PCB layout, CAD modeling, and embedded programming into a single project! What I am most proud of I am proud that every major part of the device was custom designed rather than assembled from an existing kit. Seeing the schematic, PCB, enclosure, and firmware come together into a complete product was the most rewarding part of the project. This required me to learn electronic schematic design, PCB routing, CAD modeling, firmware development, aswell as designing for manufacturing (3d printing). Testing Currently this is only designed, not built yet. This post is for approval of the parts. However, it still represents a milestone of having fully designed all the aspects of this macropad! For now, there is no demo video available but the github contains renderings, firmware, and pcb schematics; everything you need to build it yourself.", "repo": "https://github.com/ZSmaster1/macropad", "demo": ""}]...
|
[{"post_id": 5935, "ts": "2026 [{"post_id": 5935, "ts": "2026-06-09T22:22:35Z", "hours": 0.6625, "text": "Completed the hackpad guide! I was going to use QMK but KMK seemed easier to use initally since I dont actually have the physical macropad yet. I also compiled everything onto a github repository for submission. https://github.com/ZSmaster1/macropad"}, {"post_id": 5292, "ts": "2026-06-09T00:44:40Z", "hours": 1.465, "text": "Finished designing the enclosure for the macropad in Fusion 360. To make sure everything fit correctly, I exported the PCB directly from KiCad and imported it into the CAD assembly as a reference. This made it much easier to design around the actual hardware instead of guessing dimensions, as well as aligning the gap on the bottom for the underglow effect. I found models for the switches, rotary encoder, OLED display, and Seeed Studio XIAO on GrabCAD, which ended up saving a lot of time. Having the real component geometry available meant I could check clearances, mounting positions, and connector access. I can finally see the macropad come together! The electronics, PCB, and enclosure all exist together in one assembly, now I just have to write the firmware which I am leaning towards using QMK due to its customization. Any feedback is appreciated!"}, {"post_id": 3940, "ts": "2026-06-07T02:08:51Z", "hours": 1.9939, "text": "Finished the PCB layout and made some final schematic updates. While making the PCB I realized I didn’t have any decoupling capacitors, and since I’m using 20 addressable LEDs, changing them all at once might cause voltage drops and other unexpected issues so I added one 100nf capacitor per 2 LEDs. The PCB layout took longer than expected. I had to learn about vias, ground planes, and different constraints. Routing everything on the 2 layer board took a while and a lot of trace reroutes. Looking at the 3d model of the PCB I can see the macropad slowly coming together. The next step is to design the case around the PCB in Fusion 360."}, {"post_id": 3690, "ts": "2026-06-06T18:53:16Z", "hours": 1.7578, "text": "Finished designing the full macropad schematic in KiCad. The design includes a 3×3 key matrix, a Seeed Studio XIAO microcontroller, rotary encoder, OLED display, and a chain of addressable RGB LEDs for underglow. A surprising amount of time went into learning KiCad itself. Organizing the schematic onto the sheet took longer than expected since I had to learn about nets, labels, power flags, etc. Furthermore I also had to learn about symbols, footprints and the ERC. Next is the PCB where I’ll route the traces and define the physical layout of the board."}]...
|
Title: Macropad by @zsm1 | Stardance
Devlogs:
Fin Title: Macropad by @zsm1 | Stardance
Devlogs:
Finished designing the full macropad schematic in KiCad. The design includes a 3×3 key matrix, a Seeed Studio XIAO microcontroller, rotary encoder, OLED display, and a chain of addressable RGB LEDs for underglow. A surprising amount of time went into learning KiCad itself. Organizing the schematic onto the sheet took longer than expected since I had to learn about nets, labels, power flags, etc. Furthermore I also had to learn about symbols, footprints and the ERC. Next is the PCB where I’ll route the traces and define the physical layout of the board.
Finished the PCB layout and made some final schematic updates. While making the PCB I realized I didn’t have any decoupling capacitors, and since I’m using 20 addressable LEDs, changing them all at once might cause voltage drops and other unexpected issues so I added one 100nf capacitor per 2 LEDs. The PCB layout took longer than expected. I had to learn about vias, ground planes, and different constraints. Routing everything on the 2 layer board took a while and a lot of trace reroutes. Looking at the 3d model of the PCB I can see the macropad slowly coming together. The next step is to design the case around the PCB in Fusion 360.
Finished designing the enclosure for the macropad in Fusion 360. To make sure everything fit correctly, I exported the PCB directly from KiCad and imported it into the CAD assembly as a reference. This made it much easier to design around the actual hardware instead of guessing dimensions, as well as aligning the gap on the bottom for the underglow effect. I found models for the switches, rotary encoder, OLED display, and Seeed Studio XIAO on GrabCAD, which ended up saving a lot of time. Having the real component geometry available meant I could check clearances, mounting positions, and connector access. I can finally see the macropad come together! The electronics, PCB, and enclosure all exist together in one assembly, now I just have to write the firmware which I am leaning towards using QMK due to its customization. Any feedback is appreciated!
Completed the hackpad guide! I was going to use QMK but KMK seemed easier to use initally since I dont actually have the physical macropad yet. I also compiled everything onto a github repository for submission. https://github.com/ZSmaster1/macropad
Ships:
What I made I designed and built a custom mechanical macropad from the ground up using KiCad, Fusion 360, and custom firmware. The macropad features: 3×3 mechanical key matrix Rotary encoder for volume or other controls OLED display for status information 20 addressable RGB LEDs for underglow lighting Seeed Studio XIAO RP2040 microcontroller Custom PCB and enclosure The project combines electronics design, PCB layout, CAD modeling, and embedded programming into a single project! What I am most proud of I am proud that every major part of the device was custom designed rather than assembled from an existing kit. Seeing the schematic, PCB, enclosure, and firmware come together into a complete product was the most rewarding part of the project. This required me to learn electronic schematic design, PCB routing, CAD modeling, firmware development, aswell as designing for manufacturing (3d printing). Testing Currently this is only designed, not built yet. This post is for approval of the parts. However, it still represents a milestone of having fully designed all the aspects of this macropad! For now, there is no demo video available but the github contains renderings, firmware, and pcb schematics; everything you need to build it yourself....
|
1793094934.129863
|
1793181334.129863
|
|
8245
|
BetterQR by @Dragon | Stardance
|
Dragon
|
1
|
65.93
|
1000
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T15:07:34Z", "hours": 64.0, "multiplier": 15.59, "payout": 1000, "blessing": "neutral", "text": "(check the bottom of the ship msg before voting pls) BetterQR v2.0.0 Release Hey Everyone! I am super excited to announce BetterQR v2.0.0 . This release brings a ton of cool new stuff and makes BetterQR even better for your projects. What’s New & Awesome: Micro QR Codes! 🎉 Now you can generate tiny, super-efficient Micro QR codes (M1-M4) for when space is tight. Perfect for small labels or embedded projects. PDF & EPS Output: Need high-quality QR codes for print? You can now export your QR codes as professional PDF and EPS files! Structured Append: Got a huge message? Split it across up to 16 linked QR codes that can be scanned one after another to get the full data. Super powerful for big data! Faster Than Ever: We’ve made PNG generation about 40% faster ! Your QR codes will render quicker, leaving you more time for hacking. Rock-Solid Reliability: We’ve fixed some tricky bugs that could cause QR codes to break, especially for really big ones. Plus, our testing is way better now, so everything is super stable. Better International Support: New Kanji mode and UTF-8 declarations for global projects. Why this matters for your projects: BetterQR v2.0.0 means you can create more advanced, more reliable, and more visually stunning QR codes for whatever you’re building. Whether it’s a game, a website, or a physical project, BetterQR has your back. Get the Update! It’s easy to upgrade: pip install betterqr --upgrade Information for the voters The Logo isn’t AI generated. This was made fully in Canva. No, This is not a vibecoded project. There are some big devlogs that are around ~9h, I wasn’t able to devlog them as where I live there were serveral power outages, making me not able to use the internet and not to devlog them. This has been tested by more than 100 people now. Was only tested on Windows unfortunately. The “zero qr dependencies” mean there are no dependencies that generate the QR code. The generation logic is fully made by me. Pillow is used for PNG outputs and other small export options. The landing page is half-ai.", "repo": "https://github.com/DevX-Dragon/betterqr", "demo": "https://github.com/DevX-Dragon/betterqr/releases/tag/v2.0.0"}]...
|
[{"post_id": 30235, "ts": "202 [{"post_id": 30235, "ts": "2026-07-17T17:32:38Z", "hours": 1.9294, "text": "Fixing Changes Got a review saying the readme is too Ai. So I just wrote a readme from scratch. Cut down the Ai stuff and followed the guide and made this. Also changed the project banner to the terminal preview command cause the reviewer said so."}, {"post_id": 29531, "ts": "2026-07-16T14:56:39Z", "hours": 2.3836, "text": "Final Devlog of v2.0.0 (hopefully) This is the final devlog that I’ll be posting for v2.0.0 of betterqr. Hopefully you guys will give me some more ideas and features for a future version. What I did. Repository Cleanup Did a clean full push to the /src and have no uncommited changes. Pushed the webiste thats going be hosted on Github Pages. Ran some tests. Merged the feat/v2.0.0 into main branch. PyPi Configs Changes some paths in links to adjust with the branch merge. Modified some automations. Docs Cooked up a release log. Did some changes to the README.md and DOCUMENTATION.md Whats Next? This what I have been working for around 50 hours. Lets See what happens. Im plannning to maintain this as much as I can."}, {"post_id": 28300, "ts": "2026-07-14T13:49:36Z", "hours": 5.1056, "text": "Grinding I forgot to devlog so this will be a big one lol. Im currently doing exams so I dont really have alot of time to think through new stuff. I mostly did some bug fixes , optimisation and working on the landing page. Bug Fixes Fixed some bugs related to the PDF output where sometime QR codes overlap and make an error. Fixed some bugs related to the command line. The frame generation does not work. Im actively working on it but Im not able to fix it yet. Optimisation Have been cutting down extra generation time with unnecssary checks. Have imporved alot in the generation time. This took the longest. Docs Edited the documentation.md with the new data. Edited the readme.md with new stuff. Working on a landing page for BetterQR. I also researched a little bit and asked for peoples opinion on this. Selected around 20 people to test this and give their honest review. Most feedbacks were great. Some requested for features and some found bugs."}, {"post_id": 27127, "ts": "2026-07-12T12:17:36Z", "hours": 3.2736, "text": "Session 5 More Benchmarking I have benchmarked more and repeatedly to get the accurate data. I used automated and manual tests. I found some people online who were down to help me benchmark it. For now the data isnt fully presentable. Will include in the next devlog or in the readme itself. New Brand I have decided on updating our logo. I designed a logo on Canva. I’ll probably use it as the official logo. I went for the purplish theme cause why not. The logo has a futuristic vibe to it ig. Better Landing Pages. Im currently working on a landing page for betterQR. The old one is fine but I didnt update it accordingly. So Im going to make a entirely new one. I have been looking for some inspo as well. Bug Fixing Did some little bug fixes and code cleanup"}, {"post_id": 26102, "ts": "2026-07-10T18:06:05Z", "hours": 2.0942, "text": "The tables does not work on the stardance devlogs, idk why look at the attached image for the formatted table Benchmarking This session focuses on benchmarking BetterQR with other popular libraries like segno and qrcode . How it Compares This is a rough comparison between BetterQR , qrcode , and segno . Feature BetterQR qrcode segno Micro QR ✅ M1–M4 ❌ ✅ Kanji Mode ✅ ❌ ✅ Structured Append ✅ ❌ ✅ Logo Embedding ✅ Built-in ❌ (Manual PIL) ❌ (Manual) Module Shapes ✅ 8 Shapes ⚠️ Limited ❌ Gradients ✅ ❌ ❌ Animated GIF ✅ 10 Effects ❌ ❌ Frames & Labels ✅ Built-in ❌ ❌ Structured Data Helpers (WiFi, vCard, …) ✅ ❌ ⚠️ Via plugin BetterQR ’s primary aim is not to aggressively beat other libraries, but to provide a highly capable, reliable, and user-friendly alternative packed with creative options out of the box. Performance Metrics Payload Performance Benchmarks (2.0.0-rc) All times are in milliseconds (ms). Lower is better. | Payload Category | Size / Type | BetterQR | Segno | Standard qrcode | BetterQR Status | | :— | :— | :—: | :—: | :—: | :— | | URL | Tiny / Short | 6.88 | 7.19 | 5.90 | 🟢 Beats Segno / Competitive | | Medium | Standard | 22.44 | 21.89 | 20.03 | 🟡 Ties Segno (~2.5% diff) | | Large | V40 / Dense | 106.63 | 98.94 | 98.96 | 🔴 Behind by ~8% | | Very Large | Max Capacity | 209.00 | 197.00 | 204.00 | 🟡 Highly Competitive (~6% diff) | | SVG (Large) | Vector | 86.63 | ~0.56 | — | 🟡 Meaningful fix (was 104.66) | | SVG (Very Large) | Vector | 174.19 | ~1.50 | — | 🟡 Meaningful fix (was 211.84) | Known Limitations / Project Honesty To build clear engineering trust, here are the current structural limitations of BetterQR compared to older ecosystem veterans: Dependency Overhead: Depends heavily on Pillow for its extensive visual layouts and shapes, unlike segno , which is zero-dependency. Large Matrix Vectorization: Pure PNG generation lags behind by ~6-8% on maximum matrix dimensions (like V40) due to mask scoring loops running entirely in pure Python. Vector Vectorization Limits: While our SVG generation times dropped significantly in the latest release, pure string-building layout engines like segno still massively outperform us on massive vector layouts. Format Boundaries: The legacy EPS writer does not support logo embedding. Spec Edge Cases: Kanji mode and Structured Append are fully validated for standard QR codes, but are not yet implemented for Micro QR variants. rMQR (Rectangular Micro QR) is currently unsupported."}, {"post_id": 25388, "ts": "2026-07-09T17:29:11Z", "hours": 2.5597, "text": "SES-3 This session focuses on bug fixing , CI/CD improvement and some research about new features. New Features Research I realized for the past 2 weeks I have not implemented new features, and only fixed bugs and did improvements. I researched a little and looked into other QR libraries and looked for the stuff that the other libraries lack. I decided on some new features like Kanji Mode, there are few but I wont mention them here. (research time isnt logged cause I forgot but it was like an hour) Bug Fixing Did some bug fixing with the logo embedding QR code again. Its the only QR code type that fails the most. This time I guarantee it wont fail again. CI/CD Improvements Finally I realized for my test workflows I use pyzbar which is a qr code decoding library. But it does not support microqr decoding. So I had to switch to another libray called zxingcpp which does support what pyzbar has with microqr decoding support as well. I took some help from some people online regarding the tests and they help me make some test scripts. I broke down the main test script into smaller parts so Its easier for me and the readers. Conclusion Thats it for this session. Its like 95% completed for shipping and logged 50 hours as well. Just some final new features (mentioned above) and some documentation work and It v2 will be released. Thank you for reading the entire thing. I hope you’ll like it and find BetterQR useful. New features / suggestions / complaints are accepted in the replies via a DM on slack. I need some honest feedback."}, {"post_id": 24825, "ts": "2026-07-08T17:11:15Z", "hours": 1.1514, "text": "Bug Patching (SES-2.1) This will be my last patch of the day. Bug Styled Micro QR codes render wrong: Both the PNG and SVG renderers assume the standard 3-finder layout when deciding what counts as a “finder square” (for shape/color overrides). Micro QR only has one finder (top-left), so modules near the top-right and bottom-left corners get incorrectly forced into squares / finder-color under custom styling. This isnt fully fixed, Im having some hard time figuring out whats the main core issue. It is somewhat fixed."}, {"post_id": 24778, "ts": "2026-07-08T15:58:08Z", "hours": 4.5525, "text": "Bug Patching (SES-1) Ran more tests and got feedback from ~15 people. Made them test the commands and try to find bugs. There were many bugs people were available to find. This is session focuses on fixing some of them Bugs that were fixed Micro QR silently corrupts data near capacity limits: In encoder.py , the capacity check treats every Micro QR data codeword as a full 8 bits — but for M1 and M3 symbols, the last data codeword is only a 4-bit nibble per spec. The checker accepts data that’s 4 bits too big, and the extra bits get silently truncated at render time. .logo() crashes every time: core.py builds a logo_info dict with a key \"padding\" , but matrix.py leads logo_info[\"padding_px\"] , instant KeyError the moment anyone calls .logo(...). Terminal --terminal-style compact output has padding bugs asymmetric left/right padding and a stray extra row, so piping it anywhere that cares about exact dimensions breaks. There are some more bugs that will be fixed in the next session."}, {"post_id": 23583, "ts": "2026-07-06T16:56:25Z", "hours": 9.6575, "text": "Mega Lock-In The 9 hours was logged in span of the last week. Didn`t get to devlog due to internet outage here in Sri Lanka. Bugs Fixed in core.py _hex_to_rgb 3-char hex crash :#000, #FFF, #F00 etc. caused invalid literal for int() with base 16: '' . Added expansion of 3-char to 6-char before parsing .logo() crash: 'QR' object has no attribute '_version_size'``logo() tried to compute size_px = int(self._version_size * ratio) but _version_size doesn’t exist on the QR object at call time (the matrix hasn’t been built yet). Fixed to compute size_px lazily inside _get_logo_info() from module_count × box_size × ratio. logo(border=True) crash: invalid literal for int() with base 16: 'Tr' The _logo_border attribute stores a bool, but was passed directly as border_color to embed_image() which called _hex_to_rgb(True) → _hex_to_rgb(\"True\") → crash. Fixed to pass \"#000000\" if self._logo_border else None. image_ops.py + animation.py — _hex_to_rgb None guard Added if not c: return (0, 0, 0) guard so passing None as a color never crashes. The _color() validator didn’t strip surrounding shell-added quotes from color strings like “#FF0000”, causing # to be split off the hex digits. Fixed to strip \" and ' before processing. Changes Corrected Micro QR capacity table (all 8 version/ECC combos with accurate numeric/alpha/byte limits) Fixed logo() parameter docs (border is bool, not int)- Fixed double ```bash` in installation section Corrected SMS encoding protocol note (sms: not smsto:) Docs Added a more detailed info about MicroQR codes to README.md and DOCUMENTATION.md - Made a landing site with help of Claude."}, {"post_id": 17661, "ts": "2026-06-28T15:25:06Z", "hours": 5.1989, "text": "Locking in Bug hunting has started. I have been looking for any bugs in the hidden corners and have found many of them. Like the embedded logo QR codes throw an error , microQR m4 type just crashes everything,etc. I also have used the library in actual code to test as well. Landing Page Used my front-end skills to to the best and locked in and designed a good looking website for BetterQR. Looks fine for now. Will do some changes later. Made it a single page website cause easier load for Github Pages. (v2 is not out, expect it earlier this week)"}, {"post_id": 16341, "ts": "2026-06-26T16:14:36Z", "hours": 1.6294, "text": "Prepping for shipping I initially planned to release this today, but realized something. The embedded logo thing and microqr is now failing on me. and Im lazy to fix this now so I’ll be fixingit tomorrow. Making a website So I thought why not make a website. So Im have been working on a small landing website with vanilla html and probably host it on GitHub Pages as well."}, {"post_id": 15743, "ts": "2026-06-25T16:49:22Z", "hours": 2.0969, "text": "Prepping to ship Doing stuff related to publishing the new version. Im noy going to be going in details cause Im at school"}, {"post_id": 13715, "ts": "2026-06-22T14:13:14Z", "hours": 2.4611, "text": "Fixing failed tests I have ran multiple CI/CD tests and have noted that most animations and data type qr codes fail. I think its mostly from wrong placements. CLI Redirect : Redirect data -> output when a helper flag is active. SMS Protocol : Use sms: not smsto: . _write_format_info function bugs The _write_format_info function as two major bugs. Top-Right : uses bit_idx=i in write_bit (which applies 14-i ) but should write ( fmt >> i ) & 1 (vbit). The bit indices are swapped. Bottom Left : Only writes 7 rows (missing row size-8 ) ad uses wrong bit indices. These are only like 1/4 of the bugs. These were the easiest to document so listed them here."}, {"post_id": 13175, "ts": "2026-06-21T15:42:56Z", "hours": 1.8564, "text": "Testing and Fixing After running the new CI/CD Tests most pass but some fail. I traced back the issues and fixed half of them. Some issues I found 1, Micro QR auto-version: _min_version doesn’t enforce mode compatibility (M1=numeric only, M2=no byte, etc.) and uses wrong mode-indicator bit count in the needed formula. 2. WiFi/Geo/SMS/Phone/Email/VCard: The helper objects need to be passed as str() to QR() — the test is likely calling them directly. The __str__ methods need to produce correct strings, and some may have format issues. 3. Animations: GIF decode — need to verify each frame. 4. small_border: border=1 means only 4px quiet zone which may confuse decoders. (i have been fixing them but not produce a result yet)"}, {"post_id": 12592, "ts": "2026-06-20T15:49:34Z", "hours": 1.1111, "text": "CI/CD Writing the test scripts from scratch cause the last CI/CD pipelines are kind of glitched. Used claude a little this time to structure it. More Debugging Trying to fix some bugs, scrolling through stack overlay rn (yes stack overflow and not ai, IM NOT A BOOMER trust)"}, {"post_id": 12544, "ts": "2026-06-20T14:27:13Z", "hours": 1.3228, "text": "Fixing time I have identified all of the bugs (hopefully) and marked everything that has to be fixed. Fixed Stuff Current bit-stream builder in build_matrix writes all bits including the full 8-bit last data CW, then starts ECC. For M1/M3, the correct order is: 10 data CW (80 bits) + 4-bit partial + 6 ECC CW (48 bits). The current code writes all 17 CW as bits sequentially which gives the WRONG bit order.So I fixed the bit placement in build_matrix for M1/M3 fixed encode_data to use zero padding for Micro QR and handle the M1/M3 last-4-bit rule. Need to be fixed I need to fix _apply_mask to use Micro QR mask conditions (indices 1,4,6,7 of standard) for micro QR, and add a separate _MICRO_MASK_CONDITIONS list. Need to fix the _min_version capacity checker, which has the same wrong cc_bits values"}, {"post_id": 11994, "ts": "2026-06-19T15:54:15Z", "hours": 2.2208, "text": "Debugging 2 Finding errors in tables.py As my last devlog I identified that there is some errors in matrix and table files. I started looking through the table data and found some errors. bs.append(mode, 4) — always writes a 4-bit mode indicator. But for Micro QR, mode indicators are 1–4 bits depending on the version, not always 4 bits The _data_placement_order function skips col 6 (standard QR timing column). For Micro QR, col 0 is the timing column that should be skipped. But since col 0 and row 0 are already marked as reserved via timing pattern placement, the i f not reserved[row][c] check already handles it. The col == 6 skip is only needed because in standard QR col 6 is a function column that isn’t individually reserved — but since we now properly reserve col 0 for Micro QR, it’s already handled. The issue is the function always skips col 6, which in Micro QR is a valid data column. The Micro QR format info table has duplicate dict keys, so versions M1-M3 silently get clobbered by M4’s values. I’m still going through the code to find the errors first, Then I’ll start to fix them one-by-one cause I’m tired of fixing one and get another 2 bugs out of nowhere."}, {"post_id": 11318, "ts": "2026-06-18T14:58:53Z", "hours": 0.8781, "text": "Debugging After introducing CI/CD Integrations and Test Scripts I have noticed all the generated QR codes fail or unreadable. Im currently tracking the issue behind this. And the main assumption is to something with the src/matrix.py or src/tables.py cause thats the main logic behind the validity. So im curretly digging through the code to find the bugs. I have fixed some of them but when i fix one bug two bug appears. 😭"}, {"post_id": 10678, "ts": "2026-06-17T15:17:02Z", "hours": 2.5147, "text": "Alot of progress today CI/CD Intergration. Implemented few tests that gets triggered during a push / pull request that tests if the generated QR codes are valid and working as intented. Results are sent to a private discord server via a webhook. ISO Complying Working on making the generated QR Codes fully compliant with the ISO Standards. (attached is a fail qr code LOL)"}, {"post_id": 9264, "ts": "2026-06-15T15:38:08Z", "hours": 1.4681, "text": "Made some main changes and reorganization. Made a separate file for all the helper classes Secure algorithm for sensitive data. Researched some more stuff"}, {"post_id": 9211, "ts": "2026-06-15T13:52:01Z", "hours": 2.0236, "text": "Working for the V2.0.0 I have successfully released the first version of it. So I have been working on adding some more features for the next version. MicroQR Support This is one of the most requested feature here. It is little tricky to make it work. But most logic for this has been programmed. SVG Optimization Drastically reduced SVG file size by merging modules into a single element. Security Added HMAC-SHA256 signing and bitwise XOR obfuscation to protect sensitive QR data. Safety Automatically detects low contrast between foreground and background. Includes auto_fix_contrast to force scannable colors."}, {"post_id": 7488, "ts": "2026-06-12T14:29:27Z", "hours": 2.3697, "text": "First Beta Release I did my first beta release to PyPI and tested out. It worked pretty well. Got some suggestions from Reddit as well. Writing Documentation , readme.md and improving the repo structure Wrote the entire documentation , reamd.md , changelog and contribution.md to improve the repo. First public release Release the first official version with some improvements. Currently working on adding microQR codes and security warnings for Crypto qr codes"}, {"post_id": 5720, "ts": "2026-06-09T16:52:32Z", "hours": 1.3011, "text": "First version release on pypi, run pip install betterqr to install. Gotta work on the readme and website now"}, {"post_id": 4947, "ts": "2026-06-08T16:03:47Z", "hours": 3.3081, "text": "Completed the base qr engine finally after hours of coding and debugging. Now it can generate basic qr codes with texts and links."}, {"post_id": 3592, "ts": "2026-06-06T16:20:00Z", "hours": 1.4939, "text": "Currently worked on the QR code engine that generates the QR code. Also did some CLI work to make it work. Created some GH workflows as well"}, {"post_id": 2795, "ts": "2026-06-05T16:42:30Z", "hours": 0.3283, "text": "Currently writing the core for the package. I have added the basic starter classes like the Wifi QR and contact QR"}]...
|
Title: BetterQR by @Dragon | Stardance
Devlogs:
C Title: BetterQR by @Dragon | Stardance
Devlogs:
Currently writing the core for the package. I have added the basic starter classes like the Wifi QR and contact QR
Currently worked on the QR code engine that generates the QR code. Also did some CLI work to make it work. Created some GH workflows as well
Completed the base qr engine finally after hours of coding and debugging. Now it can generate basic qr codes with texts and links.
First version release on pypi, run pip install betterqr to install. Gotta work on the readme and website now
First Beta Release I did my first beta release to PyPI and tested out. It worked pretty well. Got some suggestions from Reddit as well. Writing Documentation , readme.md and improving the repo structure Wrote the entire documentation , reamd.md , changelog and contribution.md to improve the repo. First public release Release the first official version with some improvements. Currently working on adding microQR codes and security warnings for Crypto qr codes
Working for the V2.0.0 I have successfully released the first version of it. So I have been working on adding some more features for the next version. MicroQR Support This is one of the most requested feature here. It is little tricky to make it work. But most logic for this has been programmed. SVG Optimization Drastically reduced SVG file size by merging modules into a single element. Security Added HMAC-SHA256 signing and bitwise XOR obfuscation to protect sensitive QR data. Safety Automatically detects low contrast between foreground and background. Includes auto_fix_contrast to force scannable colors.
Made some main changes and reorganization. Made a separate file for all the helper classes Secure algorithm for sensitive data. Researched some more stuff
Alot of progress today CI/CD Intergration. Implemented few tests that gets triggered during a push / pull request that tests if the generated QR codes are valid and working as intented. Results are sent to a private discord server via a webhook. ISO Complying Working on making the generated QR Codes fully compliant with the ISO Standards. (attached is a fail qr code LOL)
Debugging After introducing CI/CD Integrations and Test Scripts I have noticed all the generated QR codes fail or unreadable. Im currently tracking the issue behind this. And the main assumption is to something with the src/matrix.py or src/tables.py cause thats the main logic behind the validity. So im curretly digging through the code to find the bugs. I have fixed some of them but when i fix one bug two bug appears. 😭
Debugging 2 Finding errors in tables.py As my last devlog I identified that there is some errors in matrix and table files. I started looking through the table data and found some errors. bs.append(mode, 4) — always writes a 4-bit mode indicator. But for Micro QR, mode indicators are 1–4 bits depending on the version, not always 4 bits The _data_placement_order function skips col 6 (standard QR timing column). For Micro QR, col 0 is the timing column that should be skipped. But since col 0 and row 0 are already marked as reserved via timing pattern placement, the i f not reserved[row][c] check already handles it. The col == 6 skip is only needed because in standard QR col 6 is a function column that isn’t individually reserved — but since we now properly reserve col 0 for Micro QR, it’s already handled. The issue is the function always skips col 6, which in Micro QR is a valid data column. The Micro QR format info table has duplicate dict keys, so versions M1-M3 silently get clobbered by M4’s values. I’m still going through the code to find the errors first, Then I’ll start to fix them one-by-one cause I’m tired of fixing one and get another 2 bugs out of nowhere.
Fixing time I have identified all of the bugs (hopefully) and marked everything that has to be fixed. Fixed Stuff Current bit-stream builder in build_matrix writes all bits including the full 8-bit last data CW, then starts ECC. For M1/M3, the correct order is: 10 data CW (80 bits) + 4-bit partial + 6 ECC CW (48 bits). The current code writes all 17 CW as bits sequentially which gives the WRONG bit order.So I fixed the bit placement in build_matrix for M1/M3 fixed encode_data to use zero padding for Micro QR and handle the M1/M3 last-4-bit rule. Need to be fixed I need to fix _apply_mask to use Micro QR mask conditions (indices 1,4,6,7 of standard) for micro QR, and add a separate _MICRO_MASK_CONDITIONS list. Need to fix the _min_version capacity checker, which has the same wrong cc_bits values
CI/CD Writing the test scripts from scratch cause the last CI/CD pipelines are kind of glitched. Used claude a little this time to structure it. More Debugging Trying to fix some bugs, scrolling through stack overlay rn (yes stack overflow and not ai, IM NOT A BOOMER trust)
Testing and Fixing After running the new CI/CD Tests most pass but some fail. I traced back the issues and fixed half of them. Some issues I found 1, Micro QR auto-version: _min_version doesn’t enforce mode compatibility (M1=numeric only, M2=no byte, etc.) and uses wrong mode-indicator bit count in the needed formula. 2. WiFi/Geo/SMS/Phone/Email/VCard: The helper objects need to be passed as str() to QR() — the test is likely calling them directly. The __str__ methods need to produce correct strings, and some may have format issues. 3. Animations: GIF decode — need to verify each frame. 4. small_border: border=1 means only 4px quiet zone which may confuse decoders. (i have been fixing them but not produce a result yet)
Fixing failed tests I have ran multiple CI/CD tests and have noted that most animations and data type qr codes fail. I think its mostly from wrong placements. CLI Redirect : Redirect data -> output when a helper flag is active. SMS Protocol : Use sms: not smsto: . _write_format_info function bugs The _write_format_info function as two major bugs. Top-Right : uses bit_idx=i in write_bit (which applies 14-i ) but should write ( fmt >> i ) & 1 (vbit). The bit indices are swapped. Bottom Left : Only writes 7 rows (missing row size-8 ) ad uses wrong bit indices. These are only like 1/4 of the bugs. These were the easiest to document so listed them here.
Prepping to ship Doing stuff related to publishing the new version. Im noy going to be going in details cause Im at school
Prepping for shipping I initially planned to release this today, but realized something. The embedded logo thing and microqr is now failing on me. and Im lazy to fix this now so I’ll be fixingit tomorrow. Making a website So I thought why not make a website. So Im have been working on a small landing website with vanilla html and probably host it on GitHub Pages as well.
Locking in Bug hunting has started. I have been looking for any bugs in the hidden corners and have found many of them. Like the embedded logo QR codes throw an error , microQR m4 type just crashes everything,etc. I also have used the library in actual code to test as well. Landing Page Used my front-end skills to to the best and locked in and designed a good looking website for BetterQR. Looks fine for now. Will do some changes later. Made it a single page website cause easier load for Github Pages. (v2 is not out, expect it earlier this week)
Mega Lock-In The 9 hours was logged in span of the last week. Didn`t get to devlog due to internet outage here in Sri Lanka. Bugs Fixed in core.py _hex_to_rgb 3-char hex crash :#000, #FFF, #F00 etc. caused invalid literal for int() with base 16: '' . Added expansion of 3-char to 6-char before parsing .logo() crash: 'QR' object has no attribute '_version_size'``logo() tried to compute size_px = int(self._version_size * ratio) but _version_size doesn’t exist on the QR object at call time (the matrix hasn’t been built yet). Fixed to compute size_px lazily inside _get_logo_info() from module_count × box_size × ratio. logo(border=True) crash: invalid literal for int() with base 16: 'Tr' The _logo_border attribute stores a bool, but was passed directly as border_color to embed_image() which called _hex_to_rgb(True) → _hex_to_rgb("True") → crash. Fixed to pass "#000000" if self._logo_border else None. image_ops.py + animation.py — _hex_to_rgb None guard Added if not c: return (0, 0, 0) guard so passing None as a color never crashes. The _color() validator didn’t strip surrounding shell-added quotes from color strings like “#FF0000”, causing # to be split off the hex digits. Fixed to strip " and ' before processing. Changes Corrected Micro QR capacity table (all 8 version/ECC combos with accurate numeric/alpha/byte limits) Fixed logo() parameter docs (border is bool, not int)- Fixed double ```bash` in installation section Corrected SMS encoding protocol note (sms: not smsto:) Docs Added a more detailed info about MicroQR codes to README.md and DOCUMENTATION.md - Made a landing site with help of Claude.
Bug Patching (SES-1) Ran more tests and got feedback from ~15 people. Made them test the commands and try to find bugs. There were many bugs people were available to find. This is session focuses on fixing some of them Bugs that were fixed Micro QR silently corrupts data near capacity limits: In encoder.py , the capacity check treats every Micro QR data codeword as a full 8 bits — but for M1 and M3 symbols, the last data codeword is only a 4-bit nibble per spec. The checker accepts data that’s 4 bits too big, and the extra bits get silently truncated at render time. .logo() crashes every time: core.py builds a logo_info dict with a key "padding" , but matrix.py leads logo_info["padding_px"] , instant KeyError the moment anyone calls .logo(...). Terminal --terminal-style compact output has padding bugs asymmetric left/right padding and a stray extra row, so piping it anywhere that cares about exact dimensions breaks. There are some more bugs that will be fixed in the next session.
Bug Patching (SES-2.1) This will be my last patch of the day. Bug Styled Micro QR codes render wrong: Both the PNG and SVG renderers assume the standard 3-finder layout when deciding what counts as a “finder square” (for shape/color overrides). Micro QR only has one finder (top-left), so modules near the top-right and bottom-left corners get incorrectly forced into squares / finder-color under custom styling. This isnt fully fixed, Im having some hard time figuring out whats the main core issue. It is somewhat fixed.
SES-3 This session focuses on bug fixing , CI/CD improvement and some research about new features. New Features Research I realized for the past 2 weeks I have not implemented new features, and only fixed bugs and did improvements. I researched a little and looked into other QR libraries and looked for the stuff that the other libraries lack. I decided on some new features like Kanji Mode, there are few but I wont mention them here. (research time isnt logged cause I forgot but it was like an hour) Bug Fixing Did some bug fixing with the logo embedding QR code again. Its the only QR code type that fails the most. This time I guarantee it wont fail again. CI/CD Improvements Finally I realized for my test workflows I use pyzbar which is a qr code decoding library. But it does not support microqr decoding. So I had to switch to another libray called zxingcpp which does support what pyzbar has with microqr decoding support as well. I took some help from some people online regarding the tests and they help me make some test scripts. I broke down the main test script into smaller parts so Its easier for me and the readers. Conclusion Thats it for this session. Its like 95% completed for shipping and logged 50 hours as well. Just some final new features (mentioned above) and some documentation work and It v2 will be released. Thank you for reading the entire thing. I hope you’ll like it and find BetterQR useful. New features / suggestions / complaints are accepted in the replies via a DM on slack. I need some honest feedback.
The tables does not work on the stardance devlogs, idk why look at the attached image for the formatted table Benchmarking This session focuses on benchmarking BetterQR with other popular libraries like segno and qrcode . How it Compares This is a rough comparison between BetterQR , qrcode , and segno . Feature BetterQR qrcode segno Micro QR ✅ M1–M4 ❌ ✅ Kanji Mode ✅ ❌ ✅ Structured Append ✅ ❌ ✅ Logo Embedding ✅ Built-in ❌ (Manual PIL) ❌ (Manual) Module Shapes ✅ 8 Shapes ⚠️ Limited ❌ Gradients ✅ ❌ ❌ Animated GIF ✅ 10 Effects ❌ ❌ Frames & Labels ✅ Built-in ❌ ❌ Structured Data Helpers (WiFi, vCard, …) ✅ ❌ ⚠️ Via plugin BetterQR ’s primary aim is not to aggressively beat other libraries, but to provide a highly capable, reliable, and user-friendly alternative packed with creative options out of the box. Performance Metrics Payload Performance Benchmarks (2.0.0-rc) All times are in milliseconds (ms). Lower is better. | Payload Category | Size / Type | BetterQR | Segno | Standard qrcode | BetterQR Status | | :— | :— | :—: | :—: | :—: | :— | | URL | Tiny / Short | 6.88 | 7.19 | 5.90 | 🟢 Beats Segno / Competitive | | Medium | Standard | 22.44 | 21.89 | 20.03 | 🟡 Ties Segno (~2.5% diff) | | Large | V40 / Dense | 106.63 | 98.94 | 98.96 | 🔴 Behind by ~8% | | Very Large | Max Capacity | 209.00 | 197.00 | 204.00 | 🟡 Highly Competitive (~6% diff) | | SVG (Large) | Vector | 86.63 | ~0.56 | — | 🟡 Meaningful fix (was 104.66) | | SVG (Very Large) | Vector | 174.19 | ~1.50 | — | 🟡 Meaningful fix (was 211.84) | Known Limitations / Project Honesty To build clear engineering trust, here are the current structural limitations of BetterQR compared to older ecosystem veterans: Dependency Overhead: Depends heavily on Pillow for its extensive visual layouts and shapes, unlike segno , which is zero-dependency. Large Matrix Vectorization: Pure PNG generation lags behind by ~6-8% on maximum matrix dimensions (like V40) due to mask scoring loops running entirely in pure Python. Vector Vectorization Limits: While our SVG generation times dropped significantly in the latest release, pure string-building layout engines like segno still massively outperform us on massive vector layouts. Format Boundaries: The legacy EPS writer does not support logo embedding. Spec Edge Cases: Kanji mode and Structured Append are fully validated for standard QR codes, but are not yet implemented for Micro QR variants. rMQR (Rectangular Micro QR) is currently unsupported.
Session 5 More Benchmarking I have benchmarked more and repeatedly to get the accurate data. I used automated and manual tests. I found some people online who were down to help me benchmark it. For now the data isnt fully presentable. Will include in the next devlog or in the readme itself. New Brand I have decided on updating our logo. I designed a logo on Canva. I’ll probably use it as the official logo. I went for the purplish theme cause why not. The logo has a futuristic vibe to it ig. Better Landing Pages. Im currently working on a landing page for betterQR. The old one is fine but I didnt update it accordingly. So Im going to make a entirely new one. I have been looking for some inspo as well. Bug Fixing Did some little bug fixes and code cleanup
Grinding I forgot to devlog so this will be a big one lol. Im currently doing exams so I dont really have alot of time to think through new stuff. I mostly did some bug fixes , optimisation and working on the landing page. Bug Fixes Fixed some bugs related to the PDF output where sometime QR codes overlap and make an error. Fixed some bugs related to the command line. The frame generation does not work. Im actively working on it but Im not able to fix it yet. Optimisation Have been cutting down extra generation time with unnecssary checks. Have imporved alot in the generation time. This took the longest. Docs Edited the documentation.md with the new data. Edited the readme.md with new stuff. Working on a landing page for BetterQR. I also researched a little bit and asked for peoples opinion on this. Selected around 20 people to test this and give their honest review. Most feedbacks were great. Some requested for features and some found bugs.
Final Devlog of v2.0.0 (hopefully) This is the final devlog that I’ll be posting for v2.0.0 of betterqr. Hopefully you guys will give me some more ideas and features for a future version. What I did. Repository Cleanup Did a clean full push to the /src and have no uncommited changes. Pushed the webiste thats going be hosted on Github Pages. Ran some tests. Merged the feat/v2.0.0 into main branch. PyPi Configs Changes some paths in links to adjust with the branch merge. Modified some automations. Docs Cooked up a release log. Did some changes to the README.md and DOCUMENTATION.md Whats Next? This what I have been working for around 50 hours. Lets See what happens. Im plannning to maintain this as much as I can.
Fixing Changes Got a review saying the readme is too Ai. So I just wrote a readme from scratch. Cut down the Ai stuff and followed the guide and made this. Also changed the project banner to the terminal preview command cause the reviewer said so.
Ships:
(check the bottom of the ship msg before voting pls) BetterQR v2.0.0 Release Hey Everyone! I am super excited to announce BetterQR v2.0.0 . This release brings a ton of cool new stuff and makes BetterQR even better for your projects. What’s New & Awesome: Micro QR Codes! 🎉 Now you can generate tiny, super-efficient Micro QR codes (M1-M4) for when space is tight. Perfect for small labels or embedded projects. PDF & EPS Output: Need high-quality QR codes for print? You can now export your QR codes as professional PDF and EPS files! Structured Append: Got a huge message? Split it across up to 16 linked QR codes that can be scanned one after another to get the full data. Super powerful for big data! Faster Than Ever: We’ve made PNG generation about 40% faster ! Your QR codes will render quicker, leaving you more time for hacking. Rock-Solid Reliability: We’ve fixed some tricky bugs that could cause QR codes to break, especially for really big ones. Plus, our testing is way better now, so everything is super stable. Better International Support: New Kanji mode and UTF-8 declarations for global projects. Why this matters for your projects: BetterQR v2.0.0 means you can create more advanced, more reliable, and more visually stunning QR codes for whatever you’re building. Whether it’s a game, a website, or a physical project, BetterQR has your back. Get the Update! It’s easy to upgrade: pip install betterqr --upgrade Information for the voters The Logo isn’t AI generated. This was made fully in Canva. No, This is not a vibecoded project. There are some big devlogs that are around ~9h, I wasn’t able to devlog them as where I live there were serveral power outages, making me not able to use the internet and not to devlog them. This has been tested by more than 100 people now. Was only tested on Windows unfortunately. The “zero qr dependencies” mean there are no dependencies that generate the QR code. The generation logic is fully made by me. Pillow is used for PNG outputs and other small export options. The landing page is half-ai....
|
1792882136.3204722
|
1793746136.3204722
|
|
8279
|
Laser Pointer SVG Tracer by @thecatsmeow | Stardan Laser Pointer SVG Tracer by @thecatsmeow | Stardance...
|
thecatsmeow
|
1
|
12.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T21:10:45Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This project runs on an ESP8266 and hosts a web server where users can upload SVG files. The laser pointer then traces them out on the ground, or whatever surface it is sitting on. Since the laser pointer can draw out shapes from the file in real size if the file is prepared correctly, it could be useful for visualizing digital files. For example, if you really wanted to know what a parallelogram with a base of 30cm, a height of 20cm, and two 65-degree angles looks like, this could show you. I learned FreeCAD to design and 3D-print the mounts for the servos; I manually tuned the servos to get precise angles; and I made code for the ESP to accept an SVG file, parse it, and calculate where the servos needed to go to point to it. Overall, this project was a good learning experience, and I am glad to have done it even if a video can’t fully capture its depth.", "repo": "https://github.com/luke-p28/SVG-Tracer", "demo": ""}]...
|
[{"post_id": 18556, "ts": "202 [{"post_id": 18556, "ts": "2026-06-29T19:06:23Z", "hours": 12.0039, "text": "I got a bit caught up in making the project and neglected to write any devlogs, so here’s a summary. I started by designing the servo mounts for 3D printing, which took a while since I was learning FreeCAD and professional CAD in general as I went. My first 3D print was somewhat functional, but I hadn’t fully taken the servo wires into account, so I had to reposition the small gear. It also later turned out that the small gear wasn’t tall enough, so I also had to change that. Then, with some functional 3D printing, I turned to the code and started with a simple ESP web server that would save a file upload to a string. Once I got that, I made a simple SVG parser that would just take the points from the first polyline element and used trigonometry to determine where the servos should point based on 2D Cartesian coordinates. After further investigation of the servo mount, I also decreased some clearances and made the laser pointer mount thinner to allow it to bend. Next, with the full thing assembled, I had to do some minor debugging, including switching from atan to atan2. One of the servos also abruptly stopped working and refused to give any sort of accurate angles until I manually gave it a custom PWM range, so that was fun. After that, I did some experimentation in Illustrator and found that I could consistently get real-world units drawn by using a conversion of 0.353 mm/pt. My last two real features were adding a redo button that ran another trace with the previously uploaded file and breaking each edge into 20 smaller segments to allow a more accurate path between points."}]...
|
Title: Laser Pointer SVG Tracer by @thecatsmeow | Title: Laser Pointer SVG Tracer by @thecatsmeow | Stardance
Devlogs:
I got a bit caught up in making the project and neglected to write any devlogs, so here’s a summary. I started by designing the servo mounts for 3D printing, which took a while since I was learning FreeCAD and professional CAD in general as I went. My first 3D print was somewhat functional, but I hadn’t fully taken the servo wires into account, so I had to reposition the small gear. It also later turned out that the small gear wasn’t tall enough, so I also had to change that. Then, with some functional 3D printing, I turned to the code and started with a simple ESP web server that would save a file upload to a string. Once I got that, I made a simple SVG parser that would just take the points from the first polyline element and used trigonometry to determine where the servos should point based on 2D Cartesian coordinates. After further investigation of the servo mount, I also decreased some clearances and made the laser pointer mount thinner to allow it to bend. Next, with the full thing assembled, I had to do some minor debugging, including switching from atan to atan2. One of the servos also abruptly stopped working and refused to give any sort of accurate angles until I manually gave it a custom PWM range, so that was fun. After that, I did some experimentation in Illustrator and found that I could consistently get real-world units drawn by using a conversion of 0.353 mm/pt. My last two real features were adding a redo button that ran another trace with the previously uploaded file and breaking each edge into 20 smaller segments to allow a more accurate path between points.
Ships:
This project runs on an ESP8266 and hosts a web server where users can upload SVG files. The laser pointer then traces them out on the ground, or whatever surface it is sitting on. Since the laser pointer can draw out shapes from the file in real size if the file is prepared correctly, it could be useful for visualizing digital files. For example, if you really wanted to know what a parallelogram with a base of 30cm, a height of 20cm, and two 65-degree angles looks like, this could show you. I learned FreeCAD to design and 3D-print the mounts for the servos; I manually tuned the servos to get precise angles; and I made code for the ESP to accept an SVG file, parse it, and calculate where the servos needed to go to point to it. Overall, this project was a good learning experience, and I am glad to have done it even if a video can’t fully capture its depth....
|
1793076506.0633287
|
1793162906.0633287
|
|
8326
|
My awesome macropad! by @Stev0823 | Stardance
|
Stev0823
|
1
|
1.0
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T19:15:00Z", "hours": 1.0, "multiplier": 5.0, "payout": 2, "blessing": "neutral", "text": "This is a simple 3-key macropad built with a Seeed Studio XIAO RP2040 and Cherry MX compatible switches. It is designed as a compact beginner hackpad with a clean PCB layout and a custom case. The project focuses on the essential parts of a macropad: a small PCB, three programmable keys, and firmware that can be customized for shortcuts or macros.", "repo": "https://github.com/hzf0823/hackpad-steven", "demo": ""}]...
|
[{"post_id": 4434, "ts": "2026 [{"post_id": 4434, "ts": "2026-06-07T19:10:27Z", "hours": 0.6278, "text": "Stevenpad"}]...
|
Title: My awesome macropad! by @Stev0823 | Stardan Title: My awesome macropad! by @Stev0823 | Stardance
Devlogs:
Stevenpad
Ships:
This is a simple 3-key macropad built with a Seeed Studio XIAO RP2040 and Cherry MX compatible switches. It is designed as a compact beginner hackpad with a clean PCB layout and a custom case. The project focuses on the essential parts of a macropad: a small PCB, three programmable keys, and firmware that can be customized for shortcuts or macros....
|
1793123556.3512442
|
1793209956.3512442
|
|
8333
|
CoinCounter by @fast | Stardance
|
fast
|
1
|
65.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T18:28:50Z", "hours": 65.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Coin-Counter, an app that lets you upload a picture of your loose change or bills and counts them instantly. It supports USD, EUR, and PLN currencies. The hardest part of the entire project was easily the dataset, finding, cleaning, and combining images for all these different coins and banknotes was a massive headache. But after training the model on over 100k images for 30+ hours across multiple attempts, it actually works! The web app has a clean, responsive UI with interactive sliders to tweak detection sensitivity. You can run the entire project easily using Docker Compose, just make sure you have Git LFS installed on your system before cloning so the actual model file downloads correctly!", "repo": "https://github.com/Student-FastDev/Coin-Counter", "demo": "http://34.42.9.202:8080/"}]...
|
[{"post_id": 13256, "ts": "202 [{"post_id": 13256, "ts": "2026-06-21T18:22:02Z", "hours": 51.9564, "text": "Okay, it’s been a while… I’ve been struggling with this project for a long time. First, cleaning up a massive amount of data took ages. By the end, I had around 100k images in total! Then came the training… and honestly, ugh. Constant tweaks and trial-and-error almost drove me insane. The total training time is surely 100+ hours, considering all the restarts and reruns. But finally, I’ve got something like a working model, and that’s what I’m sharing now. I’ve also finished the frontend, and everything is finally available for you to try. It’s also open-source (though I couldn’t share the dataset due to uncertain sources and potential legal concerns). Any feedback is greatly appreciated!"}, {"post_id": 3393, "ts": "2026-06-06T09:18:34Z", "hours": 12.5683, "text": "So I’m building an app that counts money from a photo, but honestly, local training has been a total nightmare. Spent 12 hours straight just cleaning and stitching datasets together, only for training on my 3070 to go horribly because of VRAM limits forcing me to downscale everything. Looking at the test image, you can see it’s detecting something, but it completely misses the fine details and fails to classify them because it has zero concept of relative sizes. I’m pivoting to a Transformer-based model (RF-DETR) so it can actually look at the whole picture and compare coin sizes better. Renting a beefy GPU in the cloud to do the training.🙄"}]...
|
Title: CoinCounter by @fast | Stardance
Devlogs:
Title: CoinCounter by @fast | Stardance
Devlogs:
So I’m building an app that counts money from a photo, but honestly, local training has been a total nightmare. Spent 12 hours straight just cleaning and stitching datasets together, only for training on my 3070 to go horribly because of VRAM limits forcing me to downscale everything. Looking at the test image, you can see it’s detecting something, but it completely misses the fine details and fails to classify them because it has zero concept of relative sizes. I’m pivoting to a Transformer-based model (RF-DETR) so it can actually look at the whole picture and compare coin sizes better. Renting a beefy GPU in the cloud to do the training.🙄
Okay, it’s been a while… I’ve been struggling with this project for a long time. First, cleaning up a massive amount of data took ages. By the end, I had around 100k images in total! Then came the training… and honestly, ugh. Constant tweaks and trial-and-error almost drove me insane. The total training time is surely 100+ hours, considering all the restarts and reruns. But finally, I’ve got something like a working model, and that’s what I’m sharing now. I’ve also finished the frontend, and everything is finally available for you to try. It’s also open-source (though I couldn’t share the dataset due to uncertain sources and potential legal concerns). Any feedback is greatly appreciated!
Ships:
I built Coin-Counter, an app that lets you upload a picture of your loose change or bills and counts them instantly. It supports USD, EUR, and PLN currencies. The hardest part of the entire project was easily the dataset, finding, cleaning, and combining images for all these different coins and banknotes was a massive headache. But after training the model on over 100k images for 30+ hours across multiple attempts, it actually works! The web app has a clean, responsive UI with interactive sliders to tweak detection sensitivity. You can run the entire project easily using Docker Compose, just make sure you have Git LFS installed on your system before cloning so the actual model file downloads correctly!...
|
1793137671.5903797
|
1793224071.5903797
|
|
8351
|
Android SMS OTP extractor by @jss | Stardance
|
jss
|
1
|
6.0
|
66
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-06T20:47:38Z", "hours": 6.0, "multiplier": 10.69, "payout": 66, "blessing": "neutral", "text": "I made a local 2FA code extractor. It listens to incoming SMS messages for OTP’s, extracts them and copies them to clipboard automatically. I got this idea from being annoyed at Google’s implementation, which doesnt automatically copy them, like Apple does on iOS. Also with it auto copying 2fa codes, i dont need to grab my phone to get them always :) The documentation was the hardest part of this project, since I used AI to build the code. (which is pretty amazing now that i think about it). Procrastinating for this evening if I should ship this was also a challenge, but cant quit now (sunk cost fallacy). Thats also what i’m the most proud of myself for, actually shippin’ something. To test it, you can download one of the APKs on GitHub. I recommend the lite version for the best compatibility. Thank you!", "repo": "https://github.com/jssfi/sms-otp-extractor", "demo": "https://github.com/jssfi/sms-otp-extractor/releases/tag/1.5"}]...
|
[{"post_id": 3774, "ts": "2026 [{"post_id": 3774, "ts": "2026-06-06T20:28:58Z", "hours": 0.6581, "text": "Finishing touches for the repo, added some screnshots of the app and a rundown on setup and how quick it is ⚡⚡⚡"}, {"post_id": 3685, "ts": "2026-06-06T18:51:10Z", "hours": 3.3531, "text": "A busy day today! Big changelog with a bunch of changes to make the app better, faster, and more lightweight. Changelog: Revamped the app UI Added onboarding for permissions, plus a small demo animation SMS history now updates in real time, instead of needing an app restart Replaced the “OTP copied” notification with a toast Cleaned up the repo by removing the old test app and moving the real app to the repo root Added two app versions: Normal: same behavior as before, with model support Lite: heuristics-only, bringing the APK down to just 1.03 MB :O Added GitHub Actions for release APK builds and learnt about GitHub environments Drastically improved the kinds of messages codes can be extracted from, including some other languages than english Improved scoring accuracy"}, {"post_id": 2907, "ts": "2026-06-05T20:12:52Z", "hours": 2.2475, "text": "This evening has been spent on; Planning what to build and then deciding a SMS OTP extractor is what I want after having to take out my phone for no reason just to find the code there that I needed. Testing what could work, cause AICore apparently isn’t fully available (Prompt API) on that many devices (for example my S25 Ultra doesn’t have it) so i had to pivot to LiteRM-LM Building the test app to see if its fast enough to actually work, which it was, even with the LiteRM-LM model Building the actual SMS reading app that can actually find the OTP in some simple cases atleast. (this fast cause i use Codex for code, but manual debugging was needed :D) Now to find edge cases, UI improvements and overall consistency."}]...
|
Title: Android SMS OTP extractor by @jss | Stardan Title: Android SMS OTP extractor by @jss | Stardance
Devlogs:
This evening has been spent on; Planning what to build and then deciding a SMS OTP extractor is what I want after having to take out my phone for no reason just to find the code there that I needed. Testing what could work, cause AICore apparently isn’t fully available (Prompt API) on that many devices (for example my S25 Ultra doesn’t have it) so i had to pivot to LiteRM-LM Building the test app to see if its fast enough to actually work, which it was, even with the LiteRM-LM model Building the actual SMS reading app that can actually find the OTP in some simple cases atleast. (this fast cause i use Codex for code, but manual debugging was needed :D) Now to find edge cases, UI improvements and overall consistency.
A busy day today! Big changelog with a bunch of changes to make the app better, faster, and more lightweight. Changelog: Revamped the app UI Added onboarding for permissions, plus a small demo animation SMS history now updates in real time, instead of needing an app restart Replaced the “OTP copied” notification with a toast Cleaned up the repo by removing the old test app and moving the real app to the repo root Added two app versions: Normal: same behavior as before, with model support Lite: heuristics-only, bringing the APK down to just 1.03 MB :O Added GitHub Actions for release APK builds and learnt about GitHub environments Drastically improved the kinds of messages codes can be extracted from, including some other languages than english Improved scoring accuracy
Finishing touches for the repo, added some screnshots of the app and a rundown on setup and how quick it is ⚡⚡⚡
Ships:
I made a local 2FA code extractor. It listens to incoming SMS messages for OTP’s, extracts them and copies them to clipboard automatically. I got this idea from being annoyed at Google’s implementation, which doesnt automatically copy them, like Apple does on iOS. Also with it auto copying 2fa codes, i dont need to grab my phone to get them always :) The documentation was the hardest part of this project, since I used AI to build the code. (which is pretty amazing now that i think about it). Procrastinating for this evening if I should ship this was also a challenge, but cant quit now (sunk cost fallacy). Thats also what i’m the most proud of myself for, actually shippin’ something. To test it, you can download one of the APKs on GitHub. I recommend the lite version for the best compatibility. Thank you!...
|
1793065881.6714582
|
1793152281.6714582
|
|
8377
|
Nautica API by @xellu | Stardance
|
xellu
|
1
|
26.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T18:37:11Z", "hours": 26.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I’ve updated the Service Manager, including the dependency resolver. These changes include: New lifecycle hook “onSetup”, intended for setting up databases, etc. I’ve mostly added this to split “start servers” and “setup things” all being in onStart. This way the separation between those 2 tasks is clear and helps to eliminate certain race conditions. Toggle switches are now generated automatically Before you had to manually declare a key in a config in onInstall, and then read it in isEnabled, which was just extra boilerplate. So I automated the process in the Service class. “?”, “:after” and “:after?” parameters for dependencies Before this, the boot order was still fragile even with dependencies defined, because the ability to define a dependency, and make it start only AFTER your dependency is initialized wasn’t a thing. Now you can do this by simply appending “:after” to the dependency name. “?” at the end also makes the dependency optional. Few fixes relating to dependency resolution and boot orders HTTP API Got a decently big update as well.. The performance is now up ~70% from previous versions, finally surpassing FastAPI, I’ve achieved this adding an option to disable unnecessary messages from being logged. Which only goes to show how heavy the logging manager I use is, but I doubt I’ll be rewriting it, since the way it is now helps with DX. Response validation using “@HTTP.Responses(…)” and ReplyModels: Before you were able to only validate what’s coming in, but not what’s going out. The validator has a strict mode, which when enabled adds an extra layer of “security”. If strict mode is disabled, the responses are only used for OpenAPI docs generation. Tho the framework may still complain if you’re sending invalid responses. Nested object validation and Require.ListOf Static methods in Reply Since the framework is built on Starlette, you may need to use Starlette’s responses in some cases. OpenAPI Docs generation This was kinda a big thing on my list ever since I realized that I can automatically generate SDKs instead of having to write request calls manually. I also wanted to add a way to expose the docs with an endpoint, but I’m holding off on that. The Package registry & manager were introduced as well. The package registry it itself built on Nautica, and works with the package manager integrated into the Nautica’s CLI. Likewise I’ve started work on the Landing page & docs website for the framework, but I’m putting it off for a bit, because of finals. I’ve also fixed countless bugs, refactored things, and over all made many QoL changes, which helped to make the framework feel more polished. This might be a strange project, since I’m somewhat “reinventing the wheel”, but I really didn’t like the way FastAPI, Flask and other Python HTTP frameworks work. It basically handles ONLY the http part, which is fine, but in bigger projects YOU have to manage everything else around it. When I was building small apps it wasn’t that big of an issue, but it became pretty apparent in bigger projects. The complexity and boilerplate that comes with large projects isn’t something I can handle well, while also having to enforce my own conventions. I made Nautica to fix these issues, and I’d say I succeeded. The boilerplate that’s needed per route is minimal, compared to other frameworks; The package manager adds an intuitive way to add plugins (services, packages), and the service system itself does a lot of the heavy lifting for you, by automatically deciding on the boot order instead of you having to write do it explicitly using imports, etc. In conclusion, Nautica takes away some freedom and in exchange gives you structure, less boilerplate and tools to debug your code, which makes shipping apps easier and faster.", "repo": "https://github.com/xellu/nautica-api", "demo": "https://napm.xellu.xyz/"}]...
|
[{"post_id": 9382, "ts": "2026 [{"post_id": 9382, "ts": "2026-06-15T18:35:53Z", "hours": 0.2822, "text": "A showcase of what Nautica can actually do ~20% faster than FastAPI ( https://github.com/xellu/nautica-api/wiki/Performance-Benchmark ) See Nautica in action: https://napm.xellu.xyz/ ( https://github.com/xellu/nautica-package-manager ) A video demonstration:"}, {"post_id": 9251, "ts": "2026-06-15T15:12:52Z", "hours": 3.4914, "text": "I’ve released v3.2.2, the new things there include: OpenAPI Docs generator Changed expression for nested requirements from nested(...) to {...} Request schemas in errors can be hidden now Added descriptions for commands in help Renamed Reply.IsList() into .asList() Added import aliases for Requirement s in napi These are mostly QoL changes, I made formatting of certain things so it’d be easier to read, use, or to make sense linguistically. I also made it a little bit more secure by giving other developers an option to hide their request schemas in error messages. I’ve also included the new benchmark numbers in the README. OpenAPI Docs generator mostly works now, but it doesn’t expose the docs to /nautica:docs yet, I’m also considering making the endpoint the developer’s concern, and not the framework’s. Surprisingly it wasn’t as hard as i expected it to be, but some weird edge cases were definitely annoying to deal with. Anyways, alongside the updates to the framework itself, I’ve also now documented the new changes made since version 3.0.2 , so they’re now up to date with the latest release (that being 3.2.2). I know it took a while but i was more focused on releasing fixes and updates first. https://github.com/xellu/nautica-api/wiki https://github.com/xellu/nautica-api/compare/3.2.0...3.2.2"}, {"post_id": 7424, "ts": "2026-06-12T11:29:02Z", "hours": 2.5219, "text": "I’ve started work on OpenAPI Docs generator, I’d imagine it’ll take me a while to complete. Anyways I’ve released v3.2, see below for new changes Changelog Improved speed and latency New onSetup hook for services Auto Switch registration for services New Require.ListOf validator Validator support for nested objects Better dependency resolver More on these changes here: post 1 , post 2 And new, undocumented changes include: 7. Moving typeToString into models, from http api (didn’t really make sense to have it there) 8. Added static methods into Reply for starlette responses, these include: Reply.plainText , Reply.html , Reply.stream , Reply.file , Reply.redirect . Known Issues v3.2.0 ’s dependency resolver incorrectly handles the :after parameter, a fix is already available in the branch for version 3.2.1"}, {"post_id": 5590, "ts": "2026-06-09T13:20:22Z", "hours": 3.5031, "text": "I’ve added a few QoL features, those being: Reply Models Before, you could only verify whats coming IN, but not whats coming OUT of the server. Now, you can do that easily: from napi.http import HTTP , Reply , Require , ReplyModel , Error @HTTP.GET () @HTTP.Responses ( ReplyModel ( 200 , str ), ReplyModel ( 400 , Error ), strict = True ) @HTTP.Require () async def hello ( ctx ): if ctx . body . get ( \" hello \" ): raise Error ( 400 , \" No hello \" ) return \" Hello World! \" In this case, the request will go through without an issue, but if, for example, you returned anything other than a string: return 0 The request will fail automatically. This will also be useful for when I add OpenAPI generation, as the generator will have access to the responses. This behavior can be disabled, by setting strict to False. Nested object validation @HTTP.Require(body = {\"hello\": {\"world\": str}) <- This code used to be invalid before. I since added support for nested objects (no depth limit). Automatic Toggle Switch Registration Plugins used to register their own keys in the config, and then setup isEnabled method that would determine if the service should be started or not. To reduce the headache and boilerplate of this approach, Nautica now automatically creates a key with your service’s name under services in config.n3 . If you want your own logic in isEnabled , you can do so by overwriting the method. By doing so you’ll disable the automatic registration and the framework gives you the freedom to do it your way. If you want custom logic AND automatic registration, it can simply be combined by using super().isEnabled() . Require.ListOf(…) I’d say this is a highly useful addition. It does exactly what it sounds like: It checks if all the items in a list match a certain schema. Require . ListOf ( str ) List of just strings Require . ListOf ({ \" hello \" : str }) List of dictionaries Requrie . ListOf ( Require . AnyTypeOf ( str , int )) List of strings and integers"}, {"post_id": 5477, "ts": "2026-06-09T08:37:59Z", "hours": 2.5575, "text": "I’ve been optimizing the framework today, here’s what changed: 1. Massive performance boosts I managed to go from 2279 requests/sec to 3929 , which is 72% increase . After running new benchmarks, I’ve also surpassed FastAPI by ~24% (recorded 3154 requests/sec). I did this by minimizing the amount of logging that is done per request (can be configured). Because my log manager is fairly heavy, this helped a lot. 2. Better dependency resolver The dependency resolver I had for services was okay, but it lacked 2 important features: Optional dependencies and explicit order. The old system was simply: Service.Export(MyPlugin, depends_on=[\"HTTPRouter\"]) Which is fine for simple plugins, but you start doing more complex work, you’ll hit the limits fast. The new system now handles: ? at the end makes the dependency optional :after tells the dependency to start AFTER your plugin, not before. Essentially adds your plugin as the target’s dependency. 3. Split onStart Before, onStart handled both starting database and HTTP servers, bots. Because of this, I’ve decided to split the setup logic and startup logic into 2: onSetup and onStart 4. Other changes I also removed some legacy aliases for methods."}, {"post_id": 4899, "ts": "2026-06-08T14:01:14Z", "hours": 4.65, "text": "Spent almost 5 hours on a navbar, finally figured it out though. The open/close logic on hovering was a nightmare to do. In the end i settled for IDs and an event listener for mouseover . It’s probably one of the worse solutions, but I’m not gonna touch it since it works finally. I also changed the background to something that fits better."}, {"post_id": 4426, "ts": "2026-06-07T19:03:56Z", "hours": 3.8883, "text": "I’ve started work on a web for the framework. For now I only managed to set up the project and make the hero on the landing page, for which I took inspiration from payloadcms and rig.ai The landing page itself was hard to make, since I had to figure out how to structure the grid, and even now it’s not up to my standards."}, {"post_id": 4114, "ts": "2026-06-07T09:41:14Z", "hours": 2.2639, "text": "Nautica Package Registry is Live! napi install mongodb now downloads the package into project plugins and installs any PyPI dependencies automatically. 2 Packages are up already: MongoDB: Adapter for pymongo NAuth: A simple session manager (using Mongo) The registry itself runs on Nautica, with both packages installed https://github.com/xellu/nautica-package-manager https://napm.xellu.xyz/"}, {"post_id": 3635, "ts": "2026-06-06T17:32:12Z", "hours": 2.7833, "text": "Hello y’all. I’m making a framework for backend development, called Nautica. I’m also bundling a package manager, similar to npm/PyPI, to allow people to share their plugins. I’ve started working on this project before Stardance, but this sounds like a good opportunity to get feedback on it. Today’s update notes (v3.1.3): Fixed shell sleeping while in systemd mode Fixed file reading during http requests Fixed package manager connection issues Added commands to list http and websocket endpoints For anyone interested in the specifics, the HTTP part of the API is built on top Starlette. Unlike FastAPI, I made my own request validation system that gives you more freedom, though it may perform worse under load. From the benchmarks I’ve ran, my framework seems to be just a little faster than FastAPI (which is also based on Starlette): FastAPI: 2259 requests/second Nautica: 2271 requests/second ~0.53% faster Though these numbers are a bit dated, and may be off. I’m still working on the package manager, but I’ll post a showcase of that soon. For now, here’s a showcase of how Nautica itself works:"}]...
|
Title: Nautica API by @xellu | Stardance
Devlogs: Title: Nautica API by @xellu | Stardance
Devlogs:
Hello y’all. I’m making a framework for backend development, called Nautica. I’m also bundling a package manager, similar to npm/PyPI, to allow people to share their plugins. I’ve started working on this project before Stardance, but this sounds like a good opportunity to get feedback on it. Today’s update notes (v3.1.3): Fixed shell sleeping while in systemd mode Fixed file reading during http requests Fixed package manager connection issues Added commands to list http and websocket endpoints For anyone interested in the specifics, the HTTP part of the API is built on top Starlette. Unlike FastAPI, I made my own request validation system that gives you more freedom, though it may perform worse under load. From the benchmarks I’ve ran, my framework seems to be just a little faster than FastAPI (which is also based on Starlette): FastAPI: 2259 requests/second Nautica: 2271 requests/second ~0.53% faster Though these numbers are a bit dated, and may be off. I’m still working on the package manager, but I’ll post a showcase of that soon. For now, here’s a showcase of how Nautica itself works:
Nautica Package Registry is Live! napi install mongodb now downloads the package into project plugins and installs any PyPI dependencies automatically. 2 Packages are up already: MongoDB: Adapter for pymongo NAuth: A simple session manager (using Mongo) The registry itself runs on Nautica, with both packages installed https://github.com/xellu/nautica-package-manager https://napm.xellu.xyz/
I’ve started work on a web for the framework. For now I only managed to set up the project and make the hero on the landing page, for which I took inspiration from payloadcms and rig.ai The landing page itself was hard to make, since I had to figure out how to structure the grid, and even now it’s not up to my standards.
Spent almost 5 hours on a navbar, finally figured it out though. The open/close logic on hovering was a nightmare to do. In the end i settled for IDs and an event listener for mouseover . It’s probably one of the worse solutions, but I’m not gonna touch it since it works finally. I also changed the background to something that fits better.
I’ve been optimizing the framework today, here’s what changed: 1. Massive performance boosts I managed to go from 2279 requests/sec to 3929 , which is 72% increase . After running new benchmarks, I’ve also surpassed FastAPI by ~24% (recorded 3154 requests/sec). I did this by minimizing the amount of logging that is done per request (can be configured). Because my log manager is fairly heavy, this helped a lot. 2. Better dependency resolver The dependency resolver I had for services was okay, but it lacked 2 important features: Optional dependencies and explicit order. The old system was simply: Service.Export(MyPlugin, depends_on=["HTTPRouter"]) Which is fine for simple plugins, but you start doing more complex work, you’ll hit the limits fast. The new system now handles: ? at the end makes the dependency optional :after tells the dependency to start AFTER your plugin, not before. Essentially adds your plugin as the target’s dependency. 3. Split onStart Before, onStart handled both starting database and HTTP servers, bots. Because of this, I’ve decided to split the setup logic and startup logic into 2: onSetup and onStart 4. Other changes I also removed some legacy aliases for methods.
I’ve added a few QoL features, those being: Reply Models Before, you could only verify whats coming IN, but not whats coming OUT of the server. Now, you can do that easily: from napi.http import HTTP , Reply , Require , ReplyModel , Error @HTTP.GET () @HTTP.Responses ( ReplyModel ( 200 , str ), ReplyModel ( 400 , Error ), strict = True ) @HTTP.Require () async def hello ( ctx ): if ctx . body . get ( " hello " ): raise Error ( 400 , " No hello " ) return " Hello World! " In this case, the request will go through without an issue, but if, for example, you returned anything other than a string: return 0 The request will fail automatically. This will also be useful for when I add OpenAPI generation, as the generator will have access to the responses. This behavior can be disabled, by setting strict to False. Nested object validation @HTTP.Require(body = {"hello": {"world": str}) <- This code used to be invalid before. I since added support for nested objects (no depth limit). Automatic Toggle Switch Registration Plugins used to register their own keys in the config, and then setup isEnabled method that would determine if the service should be started or not. To reduce the headache and boilerplate of this approach, Nautica now automatically creates a key with your service’s name under services in config.n3 . If you want your own logic in isEnabled , you can do so by overwriting the method. By doing so you’ll disable the automatic registration and the framework gives you the freedom to do it your way. If you want custom logic AND automatic registration, it can simply be combined by using super().isEnabled() . Require.ListOf(…) I’d say this is a highly useful addition. It does exactly what it sounds like: It checks if all the items in a list match a certain schema. Require . ListOf ( str ) List of just strings Require . ListOf ({ " hello " : str }) List of dictionaries Requrie . ListOf ( Require . AnyTypeOf ( str , int )) List of strings and integers
I’ve started work on OpenAPI Docs generator, I’d imagine it’ll take me a while to complete. Anyways I’ve released v3.2, see below for new changes Changelog Improved speed and latency New onSetup hook for services Auto Switch registration for services New Require.ListOf validator Validator support for nested objects Better dependency resolver More on these changes here: post 1 , post 2 And new, undocumented changes include: 7. Moving typeToString into models, from http api (didn’t really make sense to have it there) 8. Added static methods into Reply for starlette responses, these include: Reply.plainText , Reply.html , Reply.stream , Reply.file , Reply.redirect . Known Issues v3.2.0 ’s dependency resolver incorrectly handles the :after parameter, a fix is already available in the branch for version 3.2.1
I’ve released v3.2.2, the new things there include: OpenAPI Docs generator Changed expression for nested requirements from nested(...) to {...} Request schemas in errors can be hidden now Added descriptions for commands in help Renamed Reply.IsList() into .asList() Added import aliases for Requirement s in napi These are mostly QoL changes, I made formatting of certain things so it’d be easier to read, use, or to make sense linguistically. I also made it a little bit more secure by giving other developers an option to hide their request schemas in error messages. I’ve also included the new benchmark numbers in the README. OpenAPI Docs generator mostly works now, but it doesn’t expose the docs to /nautica:docs yet, I’m also considering making the endpoint the developer’s concern, and not the framework’s. Surprisingly it wasn’t as hard as i expected it to be, but some weird edge cases were definitely annoying to deal with. Anyways, alongside the updates to the framework itself, I’ve also now documented the new changes made since version 3.0.2 , so they’re now up to date with the latest release (that being 3.2.2). I know it took a while but i was more focused on releasing fixes and updates first. https://github.com/xellu/nautica-api/wiki https://github.com/xellu/nautica-api/compare/3.2.0...3.2.2
A showcase of what Nautica can actually do ~20% faster than FastAPI ( https://github.com/xellu/nautica-api/wiki/Performance-Benchmark ) See Nautica in action: https://napm.xellu.xyz/ ( https://github.com/xellu/nautica-package-manager ) A video demonstration:
Ships:
I’ve updated the Service Manager, including the dependency resolver. These changes include: New lifecycle hook “onSetup”, intended for setting up databases, etc. I’ve mostly added this to split “start servers” and “setup things” all being in onStart. This way the separation between those 2 tasks is clear and helps to eliminate certain race conditions. Toggle switches are now generated automatically Before you had to manually declare a key in a config in onInstall, and then read it in isEnabled, which was just extra boilerplate. So I automated the process in the Service class. “?”, “:after” and “:after?” parameters for dependencies Before this, the boot order was still fragile even with dependencies defined, because the ability to define a dependency, and make it start only AFTER your dependency is initialized wasn’t a thing. Now you can do this by simply appending “:after” to the dependency name. “?” at the end also makes the dependency optional. Few fixes relating to dependency resolution and boot orders HTTP API Got a decently big update as well.. The performance is now up ~70% from previous versions, finally surpassing FastAPI, I’ve achieved this adding an option to disable unnecessary messages from being logged. Which only goes to show how heavy the logging manager I use is, but I doubt I’ll be rewriting it, since the way it is now helps with DX. Response validation using “@HTTP.Responses(…)” and ReplyModels: Before you were able to only validate what’s coming in, but not what’s going out. The validator has a strict mode, which when enabled adds an extra layer of “security”. If strict mode is disabled, the responses are only used for OpenAPI docs generation. Tho the framework may still complain if you’re sending invalid responses. Nested object validation and Require.ListOf Static methods in Reply Since the framework is built on Starlette, you may need to use Starlette’s responses in some cases. OpenAPI Docs generation This was kinda a big thing on my list ever since I realized that I can automatically generate SDKs instead of having to write request calls manually. I also wanted to add a way to expose the docs with an endpoint, but I’m holding off on that. The Package registry & manager were introduced as well. The package registry it itself built on Nautica, and works with the package manager integrated into the Nautica’s CLI. Likewise I’ve started work on the Landing page & docs website for the framework, but I’m putting it off for a bit, because of finals. I’ve also fixed countless bugs, refactored things, and over all made many QoL changes, which helped to make the framework feel more polished. This might be a strange project, since I’m somewhat “reinventing the wheel”, but I really didn’t like the way FastAPI, Flask and other Python HTTP frameworks work. It basically handles ONLY the http part, which is fine, but in bigger projects YOU have to manage everything else around it. When I was building small apps it wasn’t that big of an issue, but it became pretty apparent in bigger projects. The complexity and boilerplate that comes with large projects isn’t something I can handle well, while also having to enforce my own conventions. I made Nautica to fix these issues, and I’d say I succeeded. The boilerplate that’s needed per route is minimal, compared to other frameworks; The package manager adds an intuitive way to add plugins (services, packages), and the service system itself does a lot of the heavy lifting for you, by automatically deciding on the boot order instead of you having to write do it explicitly using imports, etc. In conclusion, Nautica takes away some freedom and in exchange gives you structure, less boilerplate and tools to debug your code, which makes shipping apps easier and faster....
|
1793127170.3516598
|
1793213570.3516598
|
|
8380
|
squareBoy by @Leo-mas | Stardance
|
Leo-mas
|
1
|
8.15
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-08T16:18:34Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "made a macropad! called niripad for my niri keybinds, however i dont have the parts :(", "repo": "https://github.com/LeoMaskell/macropad", "demo": ""}]...
|
[{"post_id": 11929, "ts": "202 [{"post_id": 11929, "ts": "2026-06-19T13:41:31Z", "hours": 3.8442, "text": "redesigned the case :)"}, {"post_id": 8861, "ts": "2026-06-14T19:09:55Z", "hours": 2.0489, "text": "rewired and cut the PCB! added fillets to edge.cuts added a silkscreen fixed switch spacing"}, {"post_id": 5697, "ts": "2026-06-09T16:15:09Z", "hours": 2.2558, "text": "finnished the final PCB!"}, {"post_id": 3666, "ts": "2026-06-06T18:25:25Z", "hours": 0.3911, "text": "made the basic starter project in cad will now redesign with all the other components"}]...
|
Title: squareBoy by @Leo-mas | Stardance
Devlogs: Title: squareBoy by @Leo-mas | Stardance
Devlogs:
made the basic starter project in cad will now redesign with all the other components
finnished the final PCB!
rewired and cut the PCB! added fillets to edge.cuts added a silkscreen fixed switch spacing
redesigned the case :)
Ships:
made a macropad! called niripad for my niri keybinds, however i dont have the parts :(...
|
1793105383.990096
|
1793191783.990096
|
|
8398
|
centaur by @chiron_dev8 | Stardance
|
chiron_dev8
|
1
|
17.12
|
28
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-05T17:05:56Z", "hours": 4.0, "multiplier": 6.73, "payout": 28, "blessing": "neutral", "text": "I have worked on the project for a while before Stardance started. Probably around 95% of my hours are unlogged. I have made a package manager for UNIX based systems (specifically for my custom Linux based operating system, ChironOS). It can install, uninstall and update packages, manage dependencies, sync install files to the latest versions and automatically remove all unused packages. My favourite part of the project was finally seeing all the functions working together. I will still be working on this for a long long time as there is a lot I can improve on. My next goal will be to make package scripts for the whole of Linux From Scratch and Beyond LFS as this will prove the reliability of my package manager. If you want to test this please make sure you are using Linux (It will probably work on BSD but I haven’t tested it. It probably won’t work on mac and it DEFINITELY WILL NOT WORK ON WINDOWS). Make sure to read the wiki for installation and usage instructions. peace", "repo": "https://github.com/Chiron8/centaur", "demo": "https://github.com/Chiron8/centaur/wiki/2.-Install"}]...
|
[{"post_id": 82609, "ts": "202 [{"post_id": 82609, "ts": "2026-10-25T12:29:51Z", "hours": 13.1214, "text": "During the last three months, I significantly improved Centaur’s package-management infrastructure. I streamlined package source handling by adding automatic tarball downloads, extraction, and checksum verification. I also redesigned installation around a bubblewrap sandbox, staging directories, and manifests, which replaces the insecure system() function and makes package installation and remova safer. Alongside these changes, I improved uninstall usability, added x86-64 binaries, maintained the beta release workflow, and shipped versions 1.1.1 through 1.3.1."}, {"post_id": 22953, "ts": "2026-07-05T16:59:24Z", "hours": 3.9061, "text": "Centaur v1.1 Release Notes In this release, I focused on improving the .centaur package format and fixing several usability issues from v1.0. What I changed 1. I redesigned the .centaur syntax into 3 clear sections I changed .centaur files so package data is now split into: [meta] [install] [uninstall] This replaces the old mixed format where metadata, install steps, and uninstall script generation were all blended together. 2. I made metadata explicit and easier to parse In v1.0, package metadata and dependency handling relied on ad-hoc placement (for example, dependency lines and markers like === ADD DEPENDENCIES ABOVE THIS LINE === ). In v1.1, I moved this into a structured metadata block, for example: name = \"writedoc\" version = \"2.3-p1\" dependencies = \"example\" This makes package definitions cleaner and far more consistent. 3. I separated install and uninstall logic I moved installation commands into [install] and uninstall commands into [uninstall] . Previously, uninstall behavior was created indirectly during install by writing uninstall commands into another file. Now I define uninstall behavior directly in the package script itself, which is simpler and easier to maintain. 4. I fixed parser/runtime snags from v1.0 I resolved several pain points in .centaur files, including: line length limit issues newline/formatting sensitivity (such as needing blank lines between commands) general script parsing/execution reliability issues Result With v1.1, I made .centaur scripts more structured, more readable, and more reliable. The new format is easier for me (and others) to write, maintain, and parse going forward."}, {"post_id": 2848, "ts": "2026-06-05T18:08:43Z", "hours": 0.2842, "text": "I’m currently working on improving how I go about parsing package metadata. Previously, package dependencies were declared at the top of the file, however this soon limited adding extra metadata such as “preservation” type which I will implement later. I will now be using [meta] tags with variables inside them to allow for more advanced configuration!"}]...
|
Title: centaur by @chiron_dev8 | Stardance
Devlog Title: centaur by @chiron_dev8 | Stardance
Devlogs:
I’m currently working on improving how I go about parsing package metadata. Previously, package dependencies were declared at the top of the file, however this soon limited adding extra metadata such as “preservation” type which I will implement later. I will now be using [meta] tags with variables inside them to allow for more advanced configuration!
Centaur v1.1 Release Notes In this release, I focused on improving the .centaur package format and fixing several usability issues from v1.0. What I changed 1. I redesigned the .centaur syntax into 3 clear sections I changed .centaur files so package data is now split into: [meta] [install] [uninstall] This replaces the old mixed format where metadata, install steps, and uninstall script generation were all blended together. 2. I made metadata explicit and easier to parse In v1.0, package metadata and dependency handling relied on ad-hoc placement (for example, dependency lines and markers like === ADD DEPENDENCIES ABOVE THIS LINE === ). In v1.1, I moved this into a structured metadata block, for example: name = "writedoc" version = "2.3-p1" dependencies = "example" This makes package definitions cleaner and far more consistent. 3. I separated install and uninstall logic I moved installation commands into [install] and uninstall commands into [uninstall] . Previously, uninstall behavior was created indirectly during install by writing uninstall commands into another file. Now I define uninstall behavior directly in the package script itself, which is simpler and easier to maintain. 4. I fixed parser/runtime snags from v1.0 I resolved several pain points in .centaur files, including: line length limit issues newline/formatting sensitivity (such as needing blank lines between commands) general script parsing/execution reliability issues Result With v1.1, I made .centaur scripts more structured, more readable, and more reliable. The new format is easier for me (and others) to write, maintain, and parse going forward.
During the last three months, I significantly improved Centaur’s package-management infrastructure. I streamlined package source handling by adding automatic tarball downloads, extraction, and checksum verification. I also redesigned installation around a bubblewrap sandbox, staging directories, and manifests, which replaces the insecure system() function and makes package installation and remova safer. Alongside these changes, I improved uninstall usability, added x86-64 binaries, maintained the beta release workflow, and shipped versions 1.1.1 through 1.3.1.
Ships:
I have worked on the project for a while before Stardance started. Probably around 95% of my hours are unlogged. I have made a package manager for UNIX based systems (specifically for my custom Linux based operating system, ChironOS). It can install, uninstall and update packages, manage dependencies, sync install files to the latest versions and automatically remove all unused packages. My favourite part of the project was finally seeing all the functions working together. I will still be working on this for a long long time as there is a lot I can improve on. My next goal will be to make package scripts for the whole of Linux From Scratch and Beyond LFS as this will prove the reliability of my package manager. If you want to test this please make sure you are using Linux (It will probably work on BSD but I haven’t tested it. It probably won’t work on mac and it DEFINITELY WILL NOT WORK ON WINDOWS). Make sure to read the wiki for installation and usage instructions. peace...
|
1793105637.960062
|
1793192037.960062
|
|
8419
|
My first slack bot! by @shivam9661446 | Stardance
|
shivam9661446
|
1
|
3.0
|
5
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-08T09:03:42Z", "hours": 3.0, "multiplier": 1.64, "payout": 5, "blessing": "neutral", "text": "I built Slacky-Whacky a Slack bot with a reluctant personality that’d rather not be helping you, but does anyway. The biggest challenge was wrapping my head around how Slack bots actually work under the hood: the event model, OAuth scopes, and getting the bot to respond correctly to messages. I’m proud of giving it a distinct personality that makes interactions feel a bit more entertaining than your average bot. To test it, just join the channel in the demo link and send it a slash command like /slacky-help and it’ll respond, albeit a bit begrudgingly.", "repo": "https://github.com/shivamsinghydv/slack-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0B92USKJBW"}]...
|
[{"post_id": 4756, "ts": "2026 [{"post_id": 4756, "ts": "2026-06-08T06:31:56Z", "hours": 0.335, "text": "Added more personality lines to the bot/ fixed bugs."}, {"post_id": 3683, "ts": "2026-06-06T18:50:19Z", "hours": 0.7236, "text": "Finished slack bot"}, {"post_id": 3621, "ts": "2026-06-06T17:09:02Z", "hours": 1.4161, "text": "Adding more commands and personality to slacky…"}, {"post_id": 2844, "ts": "2026-06-05T18:04:25Z", "hours": 0.2806, "text": "Slack bot"}]...
|
Title: My first slack bot! by @shivam9661446 | Sta Title: My first slack bot! by @shivam9661446 | Stardance
Devlogs:
Slack bot
Adding more commands and personality to slacky…
Finished slack bot
Added more personality lines to the bot/ fixed bugs.
Ships:
I built Slacky-Whacky a Slack bot with a reluctant personality that’d rather not be helping you, but does anyway. The biggest challenge was wrapping my head around how Slack bots actually work under the hood: the event model, OAuth scopes, and getting the bot to respond correctly to messages. I’m proud of giving it a distinct personality that makes interactions feel a bit more entertaining than your average bot. To test it, just join the channel in the demo link and send it a slash command like /slacky-help and it’ll respond, albeit a bit begrudgingly....
|
1793141388.2683504
|
1793227788.2683504
|
|
8435
|
The Stupid Games by @therealpedcrec456 | Stardance
|
therealpedcrec456
|
1
|
2.0
|
4
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-05T18:46:25Z", "hours": 2.0, "multiplier": 1.64, "payout": 4, "blessing": "neutral", "text": "Made a collection of three simple python games to test my abilities. Had a lot of fun making it, hope you like testing it! Any feedback is welcome!", "repo": "https://github.com/R4141-BR/Play-Stupid-games-Win-Stupid-Prizes", "demo": "https://github.com/R4141-BR/Play-Stupid-games-Win-Stupid-Prizes/releases/download/Stupidggames/STUPIDGAMESSTUPIDPRIZES.exe"}]...
|
[{"post_id": 2840, "ts": "2026 [{"post_id": 2840, "ts": "2026-06-05T18:00:17Z", "hours": 2.2847, "text": "Made by first work for Hack club, felling excited about it! Stupid games is just a collection of three “games” I made it with what I currently know. I hope you guys enjoy it!"}]...
|
Title: The Stupid Games by @therealpedcrec456 | St Title: The Stupid Games by @therealpedcrec456 | Stardance
Devlogs:
Made by first work for Hack club, felling excited about it! Stupid games is just a collection of three “games” I made it with what I currently know. I hope you guys enjoy it!
Ships:
Made a collection of three simple python games to test my abilities. Had a lot of fun making it, hope you like testing it! Any feedback is welcome!...
|
1793120133.053048
|
1793206533.053048
|
|
8446
|
Ask Dexter Morgan! by @neelayshukla | Stardance
|
neelayshukla
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-05T21:49:35Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I can’t believe that Doakes was the Bay Harbor Dexter Morgan", "repo": "https://github.com/XtremeGamer123/Ask-Dexter-Morgan", "demo": "https://xtremegamer000.itch.io/ask-dexter-morgan"}]...
|
[{"post_id": 2884, "ts": "2026 [{"post_id": 2884, "ts": "2026-06-05T19:42:16Z", "hours": 0.6331, "text": "finished the game made the joke won the prize"}]...
|
Title: Ask Dexter Morgan! by @neelayshukla | Stard Title: Ask Dexter Morgan! by @neelayshukla | Stardance
Devlogs:
finished the game made the joke won the prize
Ships:
I can’t believe that Doakes was the Bay Harbor Dexter Morgan...
|
1793138126.008805
|
1793224526.008805
|
|
8455
|
Wills Bot! by @Gooderswills | Stardance
|
Gooderswills
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T12:54:56Z", "hours": 0.0, "multiplier": 1.3, "payout": 0, "blessing": "neutral", "text": "I followed the slack bot tutorial, added some new commands and used javascript and ssh’d into a server for the first time. This is my first project", "repo": "https://github.com/Gooderswills/Wbot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0266FRGV"}]...
|
[{"post_id": 3708, "ts": "2026 [{"post_id": 3708, "ts": "2026-06-06T19:18:17Z", "hours": 0.3494, "text": "I followed the tutorial completely, got the bot on a nest server and now it is fully functional on slack, I also added another command to it and then updated the server with the new code reflected"}]...
|
Title: Wills Bot! by @Gooderswills | Stardance
De Title: Wills Bot! by @Gooderswills | Stardance
Devlogs:
I followed the tutorial completely, got the bot on a nest server and now it is fully functional on slack, I also added another command to it and then updated the server with the new code reflected
Ships:
I followed the slack bot tutorial, added some new commands and used javascript and ssh’d into a server for the first time. This is my first project...
|
1793105557.9240954
|
1793191957.9240954
|
|
8496
|
Stock ticker by @Royalblueshadow | Stardance
|
Royalblueshadow
|
1
|
16.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T20:42:56Z", "hours": 16.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a stocktracker that can show the price changes over a various timeline of vastly different stocks using the yahooquery api. It also shows the 5 best and worst performing stocks of the day with a button to show the details. I am very proud of what I implemented as I hand-coded everything. Currently it still faces one problem of an api limiter as scraping the yahooquery database limits drastically if a large dataset is called. That is why the dataset size can be set manually to adjust to these rate limitations. Feel free to try my project and write a stock symbol to get started ;D", "repo": "https://github.com/Royalblueshadow/Stock-Tracker", "demo": "https://stock-tracker-jxprylb6sjqnwkmav9cwq8.streamlit.app/"}]...
|
[{"post_id": 18619, "ts": "202 [{"post_id": 18619, "ts": "2026-06-29T20:23:14Z", "hours": 8.3983, "text": "Final Changes Over the last week I have implemented plenty new features and fixed as many occuring bugs as possible. Now I am at a point where I am happy to release a ship for my project for everybody to try. So lets talk about whats new: calculation of datasets Like popular stocktrackers I wanted to implement a way to track the best and worst performing stocks of the day to give the users an overview of which outliers there are in the market. Using a github S&P500.csv I scrape the symbols of the stocks and batch it to get specific Ticker objects that give me the price information of any given stock. Using this information I can calculate the current daily percentage change and compare it to the other stocks. Using a Panda Dataframe I order all my results and use the head and tail of the Dataframe to show a clickable button for the user to give more details on the performing stock. Bug fixes for this feature: Problems occured for the scraping of symbols of S&P500 since there can be symbols that yahooqueery doesn’t recognise. To fix this issue a dictionary and type check is implemented to only add actual data to the Dataframe. I have also added a detailed view of the amount of symbols skipped and a dataframe that shows which errors occured for them. Another Problem occured in the implementation of the buttons for the best and worst performing stocks. Cklicking the button didn’t update the shown stock. To fix this I dove into state_sessions in streamlit and used callback functions and keys to hopefully give you a bugfree experience Stylisation Lastly I have implemented the most important step for a good Software. I have customised the design of the website. Now the website renders in a fullscreen view. The primary Colors and button colors are matched according to the positive or negative price changes and the font is also adjusted for a cleaner view And now thank you for reading this long devlog, hopefully you can try my project and have fun with it ;D"}, {"post_id": 13327, "ts": "2026-06-21T20:35:48Z", "hours": 4.6939, "text": "What has changed since the last devlog Introduced a candlestick chart for every stock to gain more financial insight Added a toggle to change between the line and candlestick chart Introduced different time intervals to understand the pricing of the stock, instead of just the daily view Toggling options for the time intervals Added a more accurate price difference calculator based on the given time interval Improved the design of the website, with colors and alignments Shipped the webstie to this domain for you to try out: https://stock-tracker-jxprylb6sjqnwkmav9cwq8.streamlit.app/"}, {"post_id": 11198, "ts": "2026-06-18T10:12:06Z", "hours": 2.6894, "text": "Im building a stocktracker, that gives you the option to input any stock using the yahoo finance api and show the daily, weekly, monthly and yearly price information. In the future I would also like it to create an overview of the best and worst performing stocks and ones that are under their yearly average. Currently I have implemented the system using the streamlit and plotly libraries. By now I have implemented the input for the required stock, as well as the visual price graph of the day. This is done using the history of yfinance and adjusting the database to scrape for the closing price every minute. Furthermore the daily change (in Percent and real value) is calculated in comparision to the closing price of the last day"}]...
|
Title: Stock ticker by @Royalblueshadow | Stardanc Title: Stock ticker by @Royalblueshadow | Stardance
Devlogs:
Im building a stocktracker, that gives you the option to input any stock using the yahoo finance api and show the daily, weekly, monthly and yearly price information. In the future I would also like it to create an overview of the best and worst performing stocks and ones that are under their yearly average. Currently I have implemented the system using the streamlit and plotly libraries. By now I have implemented the input for the required stock, as well as the visual price graph of the day. This is done using the history of yfinance and adjusting the database to scrape for the closing price every minute. Furthermore the daily change (in Percent and real value) is calculated in comparision to the closing price of the last day
What has changed since the last devlog Introduced a candlestick chart for every stock to gain more financial insight Added a toggle to change between the line and candlestick chart Introduced different time intervals to understand the pricing of the stock, instead of just the daily view Toggling options for the time intervals Added a more accurate price difference calculator based on the given time interval Improved the design of the website, with colors and alignments Shipped the webstie to this domain for you to try out: https://stock-tracker-jxprylb6sjqnwkmav9cwq8.streamlit.app/
Final Changes Over the last week I have implemented plenty new features and fixed as many occuring bugs as possible. Now I am at a point where I am happy to release a ship for my project for everybody to try. So lets talk about whats new: calculation of datasets Like popular stocktrackers I wanted to implement a way to track the best and worst performing stocks of the day to give the users an overview of which outliers there are in the market. Using a github S&P500.csv I scrape the symbols of the stocks and batch it to get specific Ticker objects that give me the price information of any given stock. Using this information I can calculate the current daily percentage change and compare it to the other stocks. Using a Panda Dataframe I order all my results and use the head and tail of the Dataframe to show a clickable button for the user to give more details on the performing stock. Bug fixes for this feature: Problems occured for the scraping of symbols of S&P500 since there can be symbols that yahooqueery doesn’t recognise. To fix this issue a dictionary and type check is implemented to only add actual data to the Dataframe. I have also added a detailed view of the amount of symbols skipped and a dataframe that shows which errors occured for them. Another Problem occured in the implementation of the buttons for the best and worst performing stocks. Cklicking the button didn’t update the shown stock. To fix this I dove into state_sessions in streamlit and used callback functions and keys to hopefully give you a bugfree experience Stylisation Lastly I have implemented the most important step for a good Software. I have customised the design of the website. Now the website renders in a fullscreen view. The primary Colors and button colors are matched according to the positive or negative price changes and the font is also adjusted for a cleaner view And now thank you for reading this long devlog, hopefully you can try my project and have fun with it ;D
Ships:
I made a stocktracker that can show the price changes over a various timeline of vastly different stocks using the yahooquery api. It also shows the 5 best and worst performing stocks of the day with a button to show the details. I am very proud of what I implemented as I hand-coded everything. Currently it still faces one problem of an api limiter as scraping the yahooquery database limits drastically if a large dataset is called. That is why the dataset size can be set manually to adjust to these rate limitations. Feel free to try my project and write a stock symbol to get started ;D...
|
1793098057.0690541
|
1793184457.0690541
|
|
8503
|
My first slack bot! by @zombieking1555 | Stardance
|
zombieking1555
|
1
|
1.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T22:22:33Z", "hours": 1.0, "multiplier": 2.15, "payout": 1, "blessing": "neutral", "text": "I made my own Slack bot following the Stardance mission tutorial. This project, although beginner-level, was a challenge to me. It was my first time working with APIs, Hosting, and generally programming with JavaScript. I am proud of my custom Calendar command; it taught me a lot about working with APIs and allowed me to dip my toes past what was provided for me in the tutorial. My bot should be live using Nest and testable by anyone on Slack!", "repo": "https://github.com/zombieking1555/slack-zombot", "demo": "https://hackclub.enterprise.slack.com/archives/C0APH2MMHH7"}]...
|
[{"post_id": 4562, "ts": "2026 [{"post_id": 4562, "ts": "2026-06-07T22:07:19Z", "hours": 0.6578, "text": "First devlog for a project I’m working on - likely last for this project. I wanted to create this project to learn the flow of creating and shipping for the Stardance challenge. Almost everything I did here was entirely new to me: coding in JS, using API keys and tokens, and SSHing to host my bot on Nest. Luckily, I was able to figure out how to have my coding time properly logged to have enough to devlog. My 37 minutes reflect the time I spent tidying the project for shipment, not the 2 and a half hours spent figuring out how to parse a command into API parameters. This Slack bot was a lot of fun, looking forward to devlogging again on my next project."}]...
|
Title: My first slack bot! by @zombieking1555 | St Title: My first slack bot! by @zombieking1555 | Stardance
Devlogs:
First devlog for a project I’m working on - likely last for this project. I wanted to create this project to learn the flow of creating and shipping for the Stardance challenge. Almost everything I did here was entirely new to me: coding in JS, using API keys and tokens, and SSHing to host my bot on Nest. Luckily, I was able to figure out how to have my coding time properly logged to have enough to devlog. My 37 minutes reflect the time I spent tidying the project for shipment, not the 2 and a half hours spent figuring out how to parse a command into API parameters. This Slack bot was a lot of fun, looking forward to devlogging again on my next project.
Ships:
I made my own Slack bot following the Stardance mission tutorial. This project, although beginner-level, was a challenge to me. It was my first time working with APIs, Hosting, and generally programming with JavaScript. I am proud of my custom Calendar command; it taught me a lot about working with APIs and allowed me to dip my toes past what was provided for me in the tutorial. My bot should be live using Nest and testable by anyone on Slack!...
|
1793116417.1342006
|
1793202817.1342006
|
|
8530
|
3D models by @anay_ | Stardance
|
anay_
|
1
|
32.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T20:27:30Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So i have been learning autodesk fusion for the past weeks now and I decided to design models and then put them on github for everyone to see. I have attached a printables link which includes all the files I have. I am trying to get better by the day trying my best lol. All my models i have done so far which are ALL done in fusion 360: 2x4 Toy Block.stl Complex Glass Bottle.stl Day 3 PaperClip.stl DogBowl.stl DogBowlMetalPart.stl DogBowlRubberPart.stl DoorStop.stl Drawer.stl Glass Soda Bottle.stl HandleBar.stl Hex Nut.stl IceCubeTray.stl LightBulb.stl Saturn V Rocket.stl ScrewDriver.stl SnowFlake.stl Star.stl Starship.stl vase.stl", "repo": "https://github.com/anaygoyal09/3D-Fusion-Models", "demo": ""}]...
|
[{"post_id": 29246, "ts": "202 [{"post_id": 29246, "ts": "2026-07-16T01:08:42Z", "hours": 4.0, "text": "During this time, I made many changes. Fixed accuracy of the 747-400 (not really visible, but I can see them). These changes were mostly in the body and the wing accuracy. I also added the windows for the doors to make it more accurate. Underwing pylons: Not that hard, but I wanted to make them look good, so it took a bit of time. I made the outline of the pylon, extruded it, and then cut it so it comes to a point. Then I finished off with the fillets. The hardest part was the Engines. I had to create a cross-section sketch of the engine and then revolve it. After that i created tiny sketches of the back part of the engine and then created a shell to open up the engine opening. Adjusting the engine took a lot of time (cuz my blueprints are not the best) and then I had to create the connector. I did that by creating an airfoil and then creating the vertical sketch. Finished off by sweeping it. Then I created a new component, moved the engine to the right place and then created a new connected in the same way. It was always not turning out the best so i spent a lot of time fixing all of it to make it look better. It will take me almost 2-4 hrs to finish this airplane, I will fix the shape more, add the underbody and then the livery. I put an image of how the engine was not looking that good and a video on how i made it."}, {"post_id": 26989, "ts": "2026-07-12T03:42:30Z", "hours": 2.0, "text": "FINALLY FINISHED THE DETAILS!!! I added windows , the passenger windows, wing details, fuselage details, and appearances. I created sketches an then split the body, added the appearances. Seems simple but it can take quite a bit of time and making it look good is quite hard."}, {"post_id": 25733, "ts": "2026-07-10T05:24:51Z", "hours": 2.0, "text": "DONE I FINSHED THE WINGS IN THE 747!!! I created the airfoil and then created a plane at an angle and sweeped it. Seems easy enough but fusion kept throwing errors for some reason so it took much longer than i wanted. Also when i was trying loft to round the edges it wasnt working for some reason and kept saying it cant solve. Well im happy its working now so here it is!"}, {"post_id": 24159, "ts": "2026-07-07T15:24:25Z", "hours": 2.0, "text": "completed the 747 body! I first made a t-splines (Form) and made the base of the body and then I patched the edges (2nd Image). Then after that I made a sketch outlining the front and back of the fuselage. Then, I lofted the edges. I took most time on perfecting the edges of the form so its as realistic as possible."}, {"post_id": 23223, "ts": "2026-07-06T01:33:50Z", "hours": 0.0, "text": "made a boomerang just used a reference image and traced it not too big im going to start the 747 now"}, {"post_id": 22986, "ts": "2026-07-05T17:54:08Z", "hours": 4.0, "text": "Printed the A330-300! Took me way too long because I was splitting the body and I’m still new, so it wasn’t coming out exactly how I wanted at first. Also the print kept on failing and that took me quite a lot of time to fix. There are going to be 4 folders affiliated with my project: Colored, No Splitting the Body No Color, Without Split No Color, With Split While it was printing, I went about making a ninja star (image attached). Next, I’m probably either going to make a 747 model or a better version of the Saturn V rocket. If I do the 747, it will include significant design improvements, such as easier 3D print assembly and a custom display stand :)"}, {"post_id": 19703, "ts": "2026-07-01T03:04:37Z", "hours": 1.0, "text": "Modifications for printability, using split tool in slicers and then printing, Probably Im going to print one colored and one with indentation in the windows with no color. Model is fine in terms of the printability just need to split now."}, {"post_id": 18157, "ts": "2026-06-29T05:28:38Z", "hours": 4.0, "text": "IM DONE, finished the livery, engines, rounded edges made finishing edits. I will continue to make edits by splitting the object up so its printable!"}, {"post_id": 16513, "ts": "2026-06-26T21:22:31Z", "hours": 1.0, "text": "Finishing up the details added rudder details and tried rendering. I also added flap track beams into the model! Will add engines next I will see if i want to add wheels or not"}, {"post_id": 14895, "ts": "2026-06-24T05:53:50Z", "hours": 1.0, "text": "working more on the finer parts of the airplane"}, {"post_id": 14125, "ts": "2026-06-23T03:13:28Z", "hours": 1.0, "text": "working on fine details"}, {"post_id": 13551, "ts": "2026-06-22T05:41:41Z", "hours": 1.0, "text": "I am bit of a perfectionist so im taking a little more time than I should + I am new so yea worked on adding the wings of the a330!"}, {"post_id": 13411, "ts": "2026-06-21T23:20:30Z", "hours": 0.0, "text": "Started wings. Used an airfoil template to trace out the wing shape"}, {"post_id": 12358, "ts": "2026-06-20T05:07:20Z", "hours": 1.0, "text": "went about making the airplane body for an A330-300"}, {"post_id": 11539, "ts": "2026-06-18T20:45:44Z", "hours": 0.0, "text": "Completed outlet cover I didn’t know it would be that complicated lol. Was experimenting with constraints in fusion 360 so took a bit of time"}, {"post_id": 11097, "ts": "2026-06-18T04:32:06Z", "hours": 0.0, "text": "I 3d modeled a vase that involved revolving around pipes to create a cool design and then designed a fuesalage of an airplane."}, {"post_id": 10937, "ts": "2026-06-17T22:32:24Z", "hours": 0.0, "text": "Working on making a 3d model for an airplane so far I have completed the fuselage wings and other minor details will come after"}, {"post_id": 7777, "ts": "2026-06-13T00:05:06Z", "hours": 0.0, "text": "screwdriver and a drawer in fusion"}, {"post_id": 6964, "ts": "2026-06-11T17:56:09Z", "hours": 0.0, "text": "Dog Bowl"}, {"post_id": 6638, "ts": "2026-06-11T03:56:10Z", "hours": 0.0, "text": "Snowflake!"}, {"post_id": 6368, "ts": "2026-06-10T18:40:26Z", "hours": 0.0, "text": "Tried to model a phone case using a step file as a reference or a blueprint to create it"}, {"post_id": 5967, "ts": "2026-06-10T00:03:19Z", "hours": 0.0, "text": "vase in blender"}, {"post_id": 5829, "ts": "2026-06-09T19:27:06Z", "hours": 0.0, "text": "Light Bulb"}, {"post_id": 5763, "ts": "2026-06-09T17:43:28Z", "hours": 0.0, "text": "Made a doorstop and customizable handle bar in fusion"}, {"post_id": 5245, "ts": "2026-06-08T23:08:39Z", "hours": 0.0, "text": "Hex Nut in fusion"}, {"post_id": 5122, "ts": "2026-06-08T20:12:53Z", "hours": 0.0, "text": "Finished starship model"}, {"post_id": 4661, "ts": "2026-06-08T02:04:50Z", "hours": 1.0, "text": "Working on new starship model in fusion!"}, {"post_id": 4398, "ts": "2026-06-07T18:32:31Z", "hours": 0.0, "text": "Completed 3d model For Saturn V rocket"}, {"post_id": 4315, "ts": "2026-06-07T15:58:52Z", "hours": 0.0, "text": "Working on making a rocket Model"}, {"post_id": 3800, "ts": "2026-06-06T21:03:38Z", "hours": 0.0, "text": "IceCube tray I made"}]...
|
Title: 3D models by @anay_ | Stardance
Devlogs:
I Title: 3D models by @anay_ | Stardance
Devlogs:
IceCube tray I made
Working on making a rocket Model
Completed 3d model For Saturn V rocket
Working on new starship model in fusion!
Finished starship model
Hex Nut in fusion
Made a doorstop and customizable handle bar in fusion
Light Bulb
vase in blender
Tried to model a phone case using a step file as a reference or a blueprint to create it
Snowflake!
Dog Bowl
screwdriver and a drawer in fusion
Working on making a 3d model for an airplane so far I have completed the fuselage wings and other minor details will come after
I 3d modeled a vase that involved revolving around pipes to create a cool design and then designed a fuesalage of an airplane.
Completed outlet cover I didn’t know it would be that complicated lol. Was experimenting with constraints in fusion 360 so took a bit of time
went about making the airplane body for an A330-300
Started wings. Used an airfoil template to trace out the wing shape
I am bit of a perfectionist so im taking a little more time than I should + I am new so yea worked on adding the wings of the a330!
working on fine details
working more on the finer parts of the airplane
Finishing up the details added rudder details and tried rendering. I also added flap track beams into the model! Will add engines next I will see if i want to add wheels or not
IM DONE, finished the livery, engines, rounded edges made finishing edits. I will continue to make edits by splitting the object up so its printable!
Modifications for printability, using split tool in slicers and then printing, Probably Im going to print one colored and one with indentation in the windows with no color. Model is fine in terms of the printability just need to split now.
Printed the A330-300! Took me way too long because I was splitting the body and I’m still new, so it wasn’t coming out exactly how I wanted at first. Also the print kept on failing and that took me quite a lot of time to fix. There are going to be 4 folders affiliated with my project: Colored, No Splitting the Body No Color, Without Split No Color, With Split While it was printing, I went about making a ninja star (image attached). Next, I’m probably either going to make a 747 model or a better version of the Saturn V rocket. If I do the 747, it will include significant design improvements, such as easier 3D print assembly and a custom display stand :)
made a boomerang just used a reference image and traced it not too big im going to start the 747 now
completed the 747 body! I first made a t-splines (Form) and made the base of the body and then I patched the edges (2nd Image). Then after that I made a sketch outlining the front and back of the fuselage. Then, I lofted the edges. I took most time on perfecting the edges of the form so its as realistic as possible.
DONE I FINSHED THE WINGS IN THE 747!!! I created the airfoil and then created a plane at an angle and sweeped it. Seems easy enough but fusion kept throwing errors for some reason so it took much longer than i wanted. Also when i was trying loft to round the edges it wasnt working for some reason and kept saying it cant solve. Well im happy its working now so here it is!
FINALLY FINISHED THE DETAILS!!! I added windows , the passenger windows, wing details, fuselage details, and appearances. I created sketches an then split the body, added the appearances. Seems simple but it can take quite a bit of time and making it look good is quite hard.
During this time, I made many changes. Fixed accuracy of the 747-400 (not really visible, but I can see them). These changes were mostly in the body and the wing accuracy. I also added the windows for the doors to make it more accurate. Underwing pylons: Not that hard, but I wanted to make them look good, so it took a bit of time. I made the outline of the pylon, extruded it, and then cut it so it comes to a point. Then I finished off with the fillets. The hardest part was the Engines. I had to create a cross-section sketch of the engine and then revolve it. After that i created tiny sketches of the back part of the engine and then created a shell to open up the engine opening. Adjusting the engine took a lot of time (cuz my blueprints are not the best) and then I had to create the connector. I did that by creating an airfoil and then creating the vertical sketch. Finished off by sweeping it. Then I created a new component, moved the engine to the right place and then created a new connected in the same way. It was always not turning out the best so i spent a lot of time fixing all of it to make it look better. It will take me almost 2-4 hrs to finish this airplane, I will fix the shape more, add the underbody and then the livery. I put an image of how the engine was not looking that good and a video on how i made it.
Ships:
So i have been learning autodesk fusion for the past weeks now and I decided to design models and then put them on github for everyone to see. I have attached a printables link which includes all the files I have. I am trying to get better by the day trying my best lol. All my models i have done so far which are ALL done in fusion 360: 2x4 Toy Block.stl Complex Glass Bottle.stl Day 3 PaperClip.stl DogBowl.stl DogBowlMetalPart.stl DogBowlRubberPart.stl DoorStop.stl Drawer.stl Glass Soda Bottle.stl HandleBar.stl Hex Nut.stl IceCubeTray.stl LightBulb.stl Saturn V Rocket.stl ScrewDriver.stl SnowFlake.stl Star.stl Starship.stl vase.stl...
|
1792882069.5571966
|
1793746069.5571966
|
|
8541
|
EmPad by @Matej | Stardance
|
Matej
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T08:44:23Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My 4x3 numpad/keypad with a wheel for volume adjustment. Fully customizable controls after, with a temporary html configurator to paste in after for QMK key adjustment. Will hopefully polish up firmware when I obtain the actual keyboard and build it, but compiles and runes now.", "repo": "https://github.com/MatejPechoucek/hackpad", "demo": ""}]...
|
[{"post_id": 5798, "ts": "2026 [{"post_id": 5798, "ts": "2026-06-09T18:39:50Z", "hours": 10.1867, "text": "Hackpad Case + PCB and Firmware"}]...
|
Title: EmPad by @Matej | Stardance
Devlogs:
Hackp Title: EmPad by @Matej | Stardance
Devlogs:
Hackpad Case + PCB and Firmware
Ships:
My 4x3 numpad/keypad with a wheel for volume adjustment. Fully customizable controls after, with a temporary html configurator to paste in after for QMK key adjustment. Will hopefully polish up firmware when I obtain the actual keyboard and build it, but compiles and runes now....
|
1793130940.40142
|
1793217340.40142
|
|
8670
|
Rumble by @bad-indentation | Stardance
|
bad-indentation
|
1
|
5.0
|
26
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T01:08:07Z", "hours": 5.0, "multiplier": 4.97, "payout": 26, "blessing": "neutral", "text": "Rumble is a Rust CLI tool to solve Jumbles and anagrams. It is very fast (as one can expect from Rust) and easy to use. I am relatively new to Rust, and so this was a nice opportunity to finally create a full command-line project from start to finish and publish it on crates.io. Installation instructions are in the repo README. Please consider writing an issue if you find any bugs!", "repo": "https://github.com/bad-indentation/rumble", "demo": "https://crates.io/crates/rumble-cli"}]...
|
[{"post_id": 7806, "ts": "2026 [{"post_id": 7806, "ts": "2026-06-13T00:55:42Z", "hours": 1.2236, "text": "Finally published to crates.io."}, {"post_id": 4687, "ts": "2026-06-08T02:55:47Z", "hours": 0.8144, "text": "Serious refactor - DFS + pruning was actually not an efficient solution to the problem; simple character counting using HashMaps much faster."}, {"post_id": 4637, "ts": "2026-06-08T00:59:20Z", "hours": 3.1231, "text": "Finished first iteration of solver; working on optimizations. Successfully implemented depth-first search to generate all possible anagrams of the scrambled input. Used a pre-computed HashSet of valid prefixes to quickly prune any branches that wouldn’t lead to valid English words. Implemented CLI interface using Clap. Added –verbose flag for logging and –include-partial for words that do not use all available letters. Initial optimizations include removing words that could never be made using the available letters- that is, words that are too long or contain invalid letters. Further optimizations include using concurrency when reading the file and using smart pointers to avoid excessive cloning. Also considering the possibility of iterating over candidate WORDS and determining whether they are a valid solutions instead of using combinatorics."}]...
|
Title: Rumble by @bad-indentation | Stardance
Dev Title: Rumble by @bad-indentation | Stardance
Devlogs:
Finished first iteration of solver; working on optimizations. Successfully implemented depth-first search to generate all possible anagrams of the scrambled input. Used a pre-computed HashSet of valid prefixes to quickly prune any branches that wouldn’t lead to valid English words. Implemented CLI interface using Clap. Added –verbose flag for logging and –include-partial for words that do not use all available letters. Initial optimizations include removing words that could never be made using the available letters- that is, words that are too long or contain invalid letters. Further optimizations include using concurrency when reading the file and using smart pointers to avoid excessive cloning. Also considering the possibility of iterating over candidate WORDS and determining whether they are a valid solutions instead of using combinatorics.
Serious refactor - DFS + pruning was actually not an efficient solution to the problem; simple character counting using HashMaps much faster.
Finally published to crates.io.
Ships:
Rumble is a Rust CLI tool to solve Jumbles and anagrams. It is very fast (as one can expect from Rust) and easy to use. I am relatively new to Rust, and so this was a nice opportunity to finally create a full command-line project from start to finish and publish it on crates.io. Installation instructions are in the repo README. Please consider writing an issue if you find any bugs!...
|
1793051678.1974676
|
1793138078.1974676
|
|
8691
|
resea by @jithesh_sarvin | Stardance
|
|
1
|
17.27
|
165
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-09T13:28:04Z", "hours": 16.0, "multiplier": 10.69, "payout": 165, "blessing": "neutral", "text": "What did you make? Research Feed — a personalized research paper discovery app. FastAPI backend + Next.js frontend, lightweight crawler pipeline (arXiv + OpenAlex) that populates a SQLite DB, a recommender/feed engine, and a demo deployment so people can try the site. What was challenging? Making the whole pipeline robust end-to-end: deduplication, citation backfill, handling OpenAlex/semantic‑scholar rate limits, purifier rules so we don’t delete useful papers, and getting Next.js + API routing right behind nginx on the Nest host. Deployment constraints (Nest environment, no Docker initially) added friction too. What are you proud of? A working interactive demo with a live crawler and ≈570 papers, a usable frontend (feed, search, paper pages), an automated demo deploy flow (Docker/demo scripts + non‑Docker bootstrap), and fixes for tricky issues (routing, citation backfill, offsets, and safer purifier logic). What should people know so they can test your project? Open the demo: https://jithesh.hackclub.app Try these flows: browse Home feed, click Search, open a paper, open the PDF (external), save a paper to Library, and use the refresh button on the feed. API checks: /api/stats (paper count), /api/feed, /api/papers/:id return JSON. If the UI shows JSON, hard-refresh (Ctrl+Shift+R) — nginx was fixed so UI routes should render HTML. To repro crawler/DB behavior (server access): tail logs at /root/research-feed/logs and manage services with systemctl (research-feed-api, research-feed-frontend). Report any broken link, missing PDF, or pages that show raw JSON and I’ll fix it quickly. Want me to craft a one‑paragraph summary for the project page or the “What did you make” field?", "repo": "https://github.com/Lunarcolony/ReaSea", "demo": "https://jithesh.hackclub.app"}]...
|
[{"post_id": 12053, "ts": "202 [{"post_id": 12053, "ts": "2026-06-19T17:41:36Z", "hours": 0.3608, "text": "thank you for using this website. I updated the architecture for better recommendation"}, {"post_id": 6243, "ts": "2026-06-10T14:22:08Z", "hours": 0.905, "text": "added a new cashing system which helps save data locally in the browser so that each person gets a individualized feed in the demo website."}, {"post_id": 5575, "ts": "2026-06-09T12:41:30Z", "hours": 8.4961, "text": "devlog-4 • Crawlers: OpenAlex and arXiv jobs pull open-access papers (min 5 citations) while offsets are persisted in crawler_offsets.json so each topic resumes where it left off. • Canonical catalog: All crawled papers land in data/papers.db, ensuring every service references the same SQLite store even when multiple components run concurrently. • Enrichment: Each new row undergoes OpenAlex metadata backfill, DOI/arXiv linking, and topic/authorship tagging so everything downstream sees complete content. • Metrics + embeddings: classification.metrics computes trending/hybrid scores and embeddings.pipeline generates vector representations that let the feed rank novelty and relevance. • Purifier: db_purifier.py runs after enrichment, removing paywalled, duplicate, or incomplete papers while keeping PDF/ArXiv URLs up to date. • Feed cache: Once the catalog is clean, FeedCache stores session rows and shown IDs so the API can quickly respond without re-running heavy scoring on every request. • API: FastAPI’s /feed handler calls build_feed(db, refresh?, client_seen_ids) which builds a FeedContext containing seen IDs, soft/hard exclusions, and user-interest signals. • Feed logic: The engine pulls candidates via _select_from_query, applies feedback-weighted scores, injects high jitter on refresh, and enforces seen-paper penalties so every refresh reshuffles without repeating the exact same order. • Frontend: The YouTube-style carousel shows hero/trending/high-impact rows, pulls seen IDs from localStorage, calls api.getFeed(refresh, seenIds), and records events (click/save/dismiss) to teach the feed what must never reappear. • Feedback loop: User events plus the refresh button feed back into feed.build_feed() via soft/hard exclusions, ensuring fresh papers are promoted while clicked/saved items stay hidden forever."}, {"post_id": 5325, "ts": "2026-06-09T01:54:14Z", "hours": 2.1086, "text": "Smarter Fallback: If you have seen absolutely every paper in the catalog, the algorithm will now smoothly fall back to showing you the best papers you’ve already seen rather than giving you a completely blank screen. Clearer UI & Reset Button: I updated the frontend so if you ever somehow run out of papers again, it will proudly tell you “You’re all caught up!” and give you a button to Clear your read history so you can start over while the crawlers hunt for more."}, {"post_id": 5232, "ts": "2026-06-08T22:52:39Z", "hours": 2.0489, "text": "I have updated the program and intereface to look better, it now has custom themes better crawler and more"}, {"post_id": 3889, "ts": "2026-06-06T23:55:52Z", "hours": 2.9272, "text": "This is like Netflix, but for research papers. It crawls the internet to index research papers and classifies them by topic. Then, a feed-based ML algorithm filters and displays a personalized list based on the user’s activity."}]...
|
Title: resea by @jithesh_sarvin | Stardance
Devlo Title: resea by @jithesh_sarvin | Stardance
Devlogs:
This is like Netflix, but for research papers. It crawls the internet to index research papers and classifies them by topic. Then, a feed-based ML algorithm filters and displays a personalized list based on the user’s activity.
I have updated the program and intereface to look better, it now has custom themes better crawler and more
Smarter Fallback: If you have seen absolutely every paper in the catalog, the algorithm will now smoothly fall back to showing you the best papers you’ve already seen rather than giving you a completely blank screen. Clearer UI & Reset Button: I updated the frontend so if you ever somehow run out of papers again, it will proudly tell you “You’re all caught up!” and give you a button to Clear your read history so you can start over while the crawlers hunt for more.
devlog-4 • Crawlers: OpenAlex and arXiv jobs pull open-access papers (min 5 citations) while offsets are persisted in crawler_offsets.json so each topic resumes where it left off. • Canonical catalog: All crawled papers land in data/papers.db, ensuring every service references the same SQLite store even when multiple components run concurrently. • Enrichment: Each new row undergoes OpenAlex metadata backfill, DOI/arXiv linking, and topic/authorship tagging so everything downstream sees complete content. • Metrics + embeddings: classification.metrics computes trending/hybrid scores and embeddings.pipeline generates vector representations that let the feed rank novelty and relevance. • Purifier: db_purifier.py runs after enrichment, removing paywalled, duplicate, or incomplete papers while keeping PDF/ArXiv URLs up to date. • Feed cache: Once the catalog is clean, FeedCache stores session rows and shown IDs so the API can quickly respond without re-running heavy scoring on every request. • API: FastAPI’s /feed handler calls build_feed(db, refresh?, client_seen_ids) which builds a FeedContext containing seen IDs, soft/hard exclusions, and user-interest signals. • Feed logic: The engine pulls candidates via _select_from_query, applies feedback-weighted scores, injects high jitter on refresh, and enforces seen-paper penalties so every refresh reshuffles without repeating the exact same order. • Frontend: The YouTube-style carousel shows hero/trending/high-impact rows, pulls seen IDs from localStorage, calls api.getFeed(refresh, seenIds), and records events (click/save/dismiss) to teach the feed what must never reappear. • Feedback loop: User events plus the refresh button feed back into feed.build_feed() via soft/hard exclusions, ensuring fresh papers are promoted while clicked/saved items stay hidden forever.
added a new cashing system which helps save data locally in the browser so that each person gets a individualized feed in the demo website.
thank you for using this website. I updated the architecture for better recommendation
Ships:
What did you make? Research Feed — a personalized research paper discovery app. FastAPI backend + Next.js frontend, lightweight crawler pipeline (arXiv + OpenAlex) that populates a SQLite DB, a recommender/feed engine, and a demo deployment so people can try the site. What was challenging? Making the whole pipeline robust end-to-end: deduplication, citation backfill, handling OpenAlex/semantic‑scholar rate limits, purifier rules so we don’t delete useful papers, and getting Next.js + API routing right behind nginx on the Nest host. Deployment constraints (Nest environment, no Docker initially) added friction too. What are you proud of? A working interactive demo with a live crawler and ≈570 papers, a usable frontend (feed, search, paper pages), an automated demo deploy flow (Docker/demo scripts + non‑Docker bootstrap), and fixes for tricky issues (routing, citation backfill, offsets, and safer purifier logic). What should people know so they can test your project? Open the demo: https://jithesh.hackclub.app Try these flows: browse Home feed, click Search, open a paper, open the PDF (external), save a paper to Library, and use the refresh button on the feed. API checks: /api/stats (paper count), /api/feed, /api/papers/:id return JSON. If the UI shows JSON, hard-refresh (Ctrl+Shift+R) — nginx was fixed so UI routes should render HTML. To repro crawler/DB behavior (server access): tail logs at /root/research-feed/logs and manage services with systemctl (research-feed-api, research-feed-frontend). Report any broken link, missing PDF, or pages that show raw JSON and I’ll fix it quickly. Want me to craft a one‑paragraph summary for the project page or the “What did you make” field?...
|
1793091172.2641804
|
1793177572.2641804
|
|
8698
|
OrbitBot by @LilSaadt | Stardance
|
LilSaadt
|
1
|
1.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T18:58:53Z", "hours": 1.0, "multiplier": 2.94, "payout": 3, "blessing": "neutral", "text": "I built Orbit Bot, a Slack bot that pulls live NASA APOD images and adds space-themed features like facts, an oracle, and a launch animation. The main challenge was handling Slack Block Kit formatting and making sure external APIs like NASA didn’t break the bot when responses failed or were rate-limited. I’m most proud of the design and pushing through to complete the project, aswell as doing some extra error handling. To test it, just run the slash commands like /nasapic, /orbitfact, and /orbitlaunch inside Slack.", "repo": "https://github.com/FrenchV/OrbitBot", "demo": "https://hackclub.enterprise.slack.com/archives/C0B8TB0CZ34"}]...
|
[{"post_id": 3896, "ts": "2026 [{"post_id": 3896, "ts": "2026-06-07T00:08:57Z", "hours": 0.7211, "text": "Orbit Bot — Dev Log Built a simple Slack bot that pulls in space-related APIs and adds a bit of personality on top of them. What’s in so far The bot runs on Slack Bolt (Socket Mode) and is wired up with a handful of slash commands and one mention handler. /nasapic pulls the NASA Astronomy Picture of the Day and displays it with a formatted Slack block (image or video depending on the response type) /orbitfact returns a random space fact from a small built-in list /orbitoracle gives a randomized “cosmic answer” for fun decision making /orbitcatfact pulls live data from the Cat Fact API /orbitlaunch simulates a multi-stage launch sequence using timed message updates /orbitping checks responsiveness and returns latency /orbithelp lists all available commands in a clean help panel APIs used NASA APOD API (Astronomy Picture of the Day) Cat Fact API Both are pulled using Axios and handled with basic error fallback messages. Structure Everything is currently in a single file for simplicity. Commands are separated clearly and use Slack Block Kit for formatting. Environment variables handle tokens and API keys: Slack bot token Slack app token (Socket Mode) NASA API key What I learned / ran into Slack Block Kit formatting matters a lot more than expected, small mistakes can break whole messages Socket Mode makes local testing way easier than dealing with public endpoints Keeping responses short is important"}, {"post_id": 3705, "ts": "2026-06-06T19:15:53Z", "hours": 0.3392, "text": "Dev Log — Orbit Bot 🚀 So I am currently trying to build a small Slack bot called Orbit Bot that shows cool NASA space images and simple space commands, just a fun cozy vibe. I set it up in Slack, connected it to Node.js, and got it responding to basic test commands like /ping to check if it’s alive and learned how to call API’s like for cat images. I learned how bots listen to messages, how APIs send data, and how to fix things when nothing shows up (which happened a lot at first). Next steps are adding more space commands like planets, random facts, and maybe daily space images so the bot feels more alive and fun to use. (Also designing the bot aswell)"}]...
|
Title: OrbitBot by @LilSaadt | Stardance
Devlogs: Title: OrbitBot by @LilSaadt | Stardance
Devlogs:
Dev Log — Orbit Bot 🚀 So I am currently trying to build a small Slack bot called Orbit Bot that shows cool NASA space images and simple space commands, just a fun cozy vibe. I set it up in Slack, connected it to Node.js, and got it responding to basic test commands like /ping to check if it’s alive and learned how to call API’s like for cat images. I learned how bots listen to messages, how APIs send data, and how to fix things when nothing shows up (which happened a lot at first). Next steps are adding more space commands like planets, random facts, and maybe daily space images so the bot feels more alive and fun to use. (Also designing the bot aswell)
Orbit Bot — Dev Log Built a simple Slack bot that pulls in space-related APIs and adds a bit of personality on top of them. What’s in so far The bot runs on Slack Bolt (Socket Mode) and is wired up with a handful of slash commands and one mention handler. /nasapic pulls the NASA Astronomy Picture of the Day and displays it with a formatted Slack block (image or video depending on the response type) /orbitfact returns a random space fact from a small built-in list /orbitoracle gives a randomized “cosmic answer” for fun decision making /orbitcatfact pulls live data from the Cat Fact API /orbitlaunch simulates a multi-stage launch sequence using timed message updates /orbitping checks responsiveness and returns latency /orbithelp lists all available commands in a clean help panel APIs used NASA APOD API (Astronomy Picture of the Day) Cat Fact API Both are pulled using Axios and handled with basic error fallback messages. Structure Everything is currently in a single file for simplicity. Commands are separated clearly and use Slack Block Kit for formatting. Environment variables handle tokens and API keys: Slack bot token Slack app token (Socket Mode) NASA API key What I learned / ran into Slack Block Kit formatting matters a lot more than expected, small mistakes can break whole messages Socket Mode makes local testing way easier than dealing with public endpoints Keeping responses short is important
Ships:
I built Orbit Bot, a Slack bot that pulls live NASA APOD images and adds space-themed features like facts, an oracle, and a launch animation. The main challenge was handling Slack Block Kit formatting and making sure external APIs like NASA didn’t break the bot when responses failed or were rate-limited. I’m most proud of the design and pushing through to complete the project, aswell as doing some extra error handling. To test it, just run the slash commands like /nasapic, /orbitfact, and /orbitlaunch inside Slack....
|
1793098204.4073095
|
1793184604.4073095
|
|
8699
|
Whisper-API by @myroslavrepin | Stardance
|
myroslavrepin
|
1
|
13.82
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T02:55:16Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I wanted to transcribe my audio meetings into text, but everything I found was either paid or behind a subscription. So I thought, why should I pay for something I can build myself? So I did. The real challenge was getting the model to actually run on a Raspberry Pi 5. With only 4GB of RAM it choked badly at first. I fixed it by splitting the audio into chunks and transcribing them one at a time instead of loading the whole file into memory at once. Drop your audio, get your text back, fully self-hosted, running on a Pi.", "repo": "https://github.com/MyroslavRepin/whisper-api", "demo": "https://whisper.myroslavrepin.com/"}]...
|
[{"post_id": 37382, "ts": "202 [{"post_id": 37382, "ts": "2026-07-30T02:01:50Z", "hours": 0.8217, "text": "minor fixes and deployment"}, {"post_id": 18331, "ts": "2026-06-29T13:11:06Z", "hours": 3.6767, "text": "I was working on deployment and creating Vue.js dashboard"}, {"post_id": 9289, "ts": "2026-06-15T16:23:01Z", "hours": 0.7839, "text": "I was working on deploying to my PI 5 and testing its abilities (it did ended well). Also I added a to_email field."}, {"post_id": 8503, "ts": "2026-06-14T04:16:14Z", "hours": 1.0808, "text": "I finally stopped chasing perfections and shipped MVP. I mean like real MVP. I have almost no UI, but fully working transcription"}, {"post_id": 7812, "ts": "2026-06-13T01:14:46Z", "hours": 6.875, "text": "Just finished building MVP backend"}, {"post_id": 3290, "ts": "2026-06-06T04:36:46Z", "hours": 0.5197, "text": "Created base project portfolio"}]...
|
Title: Whisper-API by @myroslavrepin | Stardance
Title: Whisper-API by @myroslavrepin | Stardance
Devlogs:
Created base project portfolio
Just finished building MVP backend
I finally stopped chasing perfections and shipped MVP. I mean like real MVP. I have almost no UI, but fully working transcription
I was working on deploying to my PI 5 and testing its abilities (it did ended well). Also I added a to_email field.
I was working on deployment and creating Vue.js dashboard
minor fixes and deployment
Ships:
I wanted to transcribe my audio meetings into text, but everything I found was either paid or behind a subscription. So I thought, why should I pay for something I can build myself? So I did. The real challenge was getting the model to actually run on a Raspberry Pi 5. With only 4GB of RAM it choked badly at first. I fixed it by splitting the audio into chunks and transcribing them one at a time instead of loading the whole file into memory at once. Drop your audio, get your text back, fully self-hosted, running on a Pi....
|
1793105523.369539
|
1793191923.369539
|
|
8705
|
Seal Commands by @indiesealdev | Stardance
|
indiesealdev
|
1
|
2.0
|
12
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T07:47:52Z", "hours": 2.0, "multiplier": 4.96, "payout": 12, "blessing": "neutral", "text": "I made a Seal-Focused Slack Bot, it’s made to be a little bit silly, and be something special for seal lovers, this is version 1.0, I’m planning on releasing even more commands, but this is it for now, as I do want to move on to other projects! Something that was a little bit challenging was GIPHY’s API, the docs for JavaScript were really lackluster. Hope you like what I made :]!", "repo": "https://github.com/IndieSeal/SealSlackBot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BBDB2U3C6"}]...
|
[{"post_id": 11155, "ts": "202 [{"post_id": 11155, "ts": "2026-06-18T07:33:25Z", "hours": 1.0406, "text": "I´ve just finished my 3 required silly seal commands, and I´m planning on adding more later on! Feel free to join the channel and test them out :D"}, {"post_id": 11098, "ts": "2026-06-18T04:36:15Z", "hours": 1.3947, "text": "Current custom commands: -Seal Gif: Using GIPHY´s not well explained API, you can ask for a random seal gif!! -Seal Name: Receive a random seal specie´s name :] There´s also the usual ping and help, but they´re not that interesting."}]...
|
Title: Seal Commands by @indiesealdev | Stardance
Title: Seal Commands by @indiesealdev | Stardance
Devlogs:
Current custom commands: -Seal Gif: Using GIPHY´s not well explained API, you can ask for a random seal gif!! -Seal Name: Receive a random seal specie´s name :] There´s also the usual ping and help, but they´re not that interesting.
I´ve just finished my 3 required silly seal commands, and I´m planning on adding more later on! Feel free to join the channel and test them out :D
Ships:
I made a Seal-Focused Slack Bot, it’s made to be a little bit silly, and be something special for seal lovers, this is version 1.0, I’m planning on releasing even more commands, but this is it for now, as I do want to move on to other projects! Something that was a little bit challenging was GIPHY’s API, the docs for JavaScript were really lackluster. Hope you like what I made :]!...
|
1793137667.1082728
|
1793224067.1082728
|
|
8732
|
Total Football™ by @LilSaadt | Stardance
|
LilSaadt
|
1
|
4.0
|
54
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-04T22:31:00Z", "hours": 4.0, "multiplier": 12.59, "payout": 54, "blessing": "neutral", "text": "I created Total Football 27, a project with massive ambitions. Based off of the fifa 23 simulation career mode, i wanted to reverse engineer the entire system, than create a game out of it. Little did I know creating the bare basics (which is what this project represents) is INSANELY hard. However after a while of tinkering I finally made a semi decent game engine. I am most proud of building a complex football simulation system from scratch and experimenting with advanced AI concepts. Even though the project was not completed, it helped me improve my programming skills, problem-solving, and understanding of game development systems. PLEASE NOTE. Development has been discontinued due to lost data and other issues, so some features may not work correctly. Users should expect bugs and incomplete systems, but they can still explore the project and see the progress made during development.", "repo": "https://github.com/FrenchV/TotalFootball27_2.0", "demo": "https://total-football27-2-0.vercel.app/"}]...
|
[{"post_id": 41020, "ts": "202 [{"post_id": 41020, "ts": "2026-08-04T22:28:40Z", "hours": 0.3781, "text": "After many hours of development, I have decided to stop developing TF 27. Due to MANY ISSUES, missing progress, and development issues that affected the project, continuing would require rebuilding a large portion of the work from the beginning. This version represents the final buggy build of the project. It contains the remaining match engine before development stopped, but it is not considered a finished or polished release. Thank you for reading!"}, {"post_id": 19411, "ts": "2026-06-30T18:37:38Z", "hours": 0.7003, "text": "WORKING ON COMPLETING THE GAMELOOP! I dont wana leak too much but since ive got done a lot of tabs, in the next few days the gameloop should be finished, than its just polishing and making it work. Than finally making the game UI actually look good"}, {"post_id": 17947, "ts": "2026-06-28T22:10:29Z", "hours": 0.7872, "text": "really basic work on the actual webapp, and the match engine. SO MUCH MORE WORK TO DO. Currently trying to finish the team management, basic transfer logic, and overall game loop. Than we can start making it spicy."}, {"post_id": 13959, "ts": "2026-06-22T22:18:19Z", "hours": 1.1094, "text": "Well due to many issues with the platform and previous project ive had to make a very big switch to a different project i planned to start, really sad I couldn’t get to complete the original one, but Ive came back from vacation and got straight to work, enjoy the sneak peak, WAY more to come soon!"}, {"post_id": 5264, "ts": "2026-06-08T23:46:35Z", "hours": 1.0381, "text": "More regular scripting and work on the actual framework, here’s a lil sneak peak at future UI."}, {"post_id": 4476, "ts": "2026-06-07T20:07:26Z", "hours": 0.3092, "text": "New project I was working on, check this small menu concept! Currently building the bare bones, such as fps framework, drone framework, and other things like environment and maps, than Im going to put it all together into a small test game. (hopefully)"}]...
|
Title: Total Football™ by @LilSaadt | Stardance
D Title: Total Football™ by @LilSaadt | Stardance
Devlogs:
New project I was working on, check this small menu concept! Currently building the bare bones, such as fps framework, drone framework, and other things like environment and maps, than Im going to put it all together into a small test game. (hopefully)
More regular scripting and work on the actual framework, here’s a lil sneak peak at future UI.
Well due to many issues with the platform and previous project ive had to make a very big switch to a different project i planned to start, really sad I couldn’t get to complete the original one, but Ive came back from vacation and got straight to work, enjoy the sneak peak, WAY more to come soon!
really basic work on the actual webapp, and the match engine. SO MUCH MORE WORK TO DO. Currently trying to finish the team management, basic transfer logic, and overall game loop. Than we can start making it spicy.
WORKING ON COMPLETING THE GAMELOOP! I dont wana leak too much but since ive got done a lot of tabs, in the next few days the gameloop should be finished, than its just polishing and making it work. Than finally making the game UI actually look good
After many hours of development, I have decided to stop developing TF 27. Due to MANY ISSUES, missing progress, and development issues that affected the project, continuing would require rebuilding a large portion of the work from the beginning. This version represents the final buggy build of the project. It contains the remaining match engine before development stopped, but it is not considered a finished or polished release. Thank you for reading!
Ships:
I created Total Football 27, a project with massive ambitions. Based off of the fifa 23 simulation career mode, i wanted to reverse engineer the entire system, than create a game out of it. Little did I know creating the bare basics (which is what this project represents) is INSANELY hard. However after a while of tinkering I finally made a semi decent game engine. I am most proud of building a complex football simulation system from scratch and experimenting with advanced AI concepts. Even though the project was not completed, it helped me improve my programming skills, problem-solving, and understanding of game development systems. PLEASE NOTE. Development has been discontinued due to lost data and other issues, so some features may not work correctly. Users should expect bugs and incomplete systems, but they can still explore the project and see the progress made during development....
|
1793119659.8909924
|
1793206059.8909924
|
|
8801
|
Soundrise by @lenny8 | Stardance
|
lenny8
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-31T12:52:41Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A simple free Spotify Alarm App for IOS which wakes you up with a random song out of a album or a playlist. It was really difficult making a live acitivity and playing the downloaded mp3 instead of the regular ringtone", "repo": "https://github.com/lnny8/alarm", "demo": "https://raw.githubusercontent.com/lnny8/alarm/refs/heads/main/demo.txt"}]...
|
[{"post_id": 58840, "ts": "202 [{"post_id": 58840, "ts": "2026-08-31T12:51:51Z", "hours": 0.4753, "text": "Songs work now by being downloaded in a 30s format in a local folder by the deezer api"}, {"post_id": 4333, "ts": "2026-06-07T16:42:34Z", "hours": 0.8656, "text": "new better icon, new and more clear layout and UI, new section with “Next alarm in…” and display how many sleep cycles that are. Also adjusted some details in the playlist creation."}, {"post_id": 4173, "ts": "2026-06-07T12:09:50Z", "hours": 3.1519, "text": "Updated the majority of the UI, made a custom appIcon matching the name “Soundrise”, new playlist logic: You can import playlist from Spotify or just directly create them in the app. All the song snippets then get saved locally via the deezer api for a 30s preview so it can get played with the AlarmKit for IOS. Also added a new Volume Section with a Option for a gradually increasing volume."}, {"post_id": 3694, "ts": "2026-06-06T18:58:52Z", "hours": 2.4131, "text": "Simple working demo with the Apple Alarmkit and Spotify Integration - You can now make alarms, select the wakeup time, select songs from your top 50 most streamed songs when logged in with Spotify. Currently I programmed it in my native language, which I will change soon."}]...
|
Title: Soundrise by @lenny8 | Stardance
Devlogs:
Title: Soundrise by @lenny8 | Stardance
Devlogs:
Simple working demo with the Apple Alarmkit and Spotify Integration - You can now make alarms, select the wakeup time, select songs from your top 50 most streamed songs when logged in with Spotify. Currently I programmed it in my native language, which I will change soon.
Updated the majority of the UI, made a custom appIcon matching the name “Soundrise”, new playlist logic: You can import playlist from Spotify or just directly create them in the app. All the song snippets then get saved locally via the deezer api for a 30s preview so it can get played with the AlarmKit for IOS. Also added a new Volume Section with a Option for a gradually increasing volume.
new better icon, new and more clear layout and UI, new section with “Next alarm in…” and display how many sleep cycles that are. Also adjusted some details in the playlist creation.
Songs work now by being downloaded in a 30s format in a local folder by the deezer api
Ships:
A simple free Spotify Alarm App for IOS which wakes you up with a random song out of a album or a playlist. It was really difficult making a live acitivity and playing the downloaded mp3 instead of the regular ringtone...
|
1793094869.6897748
|
1793181269.6897748
|
|
8802
|
LoPose Cell Mapping by @yep | Stardance
|
yep
|
1
|
40.72
|
588
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-30T17:15:42Z", "hours": 37.0, "multiplier": 15.78, "payout": 588, "blessing": "neutral", "text": "Project Overview LoPose Tower Mapping is a project focused on mapping cellular tower data collected from phones to real-world tower locations. The goal is to collect cellular observations from Android devices, upload them to a database, and process those observations to estimate and match real tower positions. The project is currently experimental and mainly intended for private use. Project Structure The project is split into two main parts: Android app Go triangulation and tower-fitting tools Android App The Android app is the core data collector. It runs on a phone and gathers data about the currently connected cellular tower. This data is uploaded to a Supabase database and stored as observations. The app records data such as: connected cell ID network / area information GPS location GPS accuracy altitude vertical accuracy timing advance EARFCN PCI recorder time Currently, it collects and uploads data approximately every 5 seconds. Because of this, it can consume a significant amount of battery due to frequent GPS usage, cellular observation checks, background processing, and network uploads. APK Status The APK is not published. This is because the project is mainly for private use, and publishing it could introduce privacy risks due to the sensitive location and cellular data involved. For now, both the app and the database must be built and configured from the source code. Go Processing Tools The second part of the project is written in Go. These tools process the observations collected by the Android app and attempt to estimate real tower locations. The main approach uses 2D trilateration to approximate tower positions based on collected observations. There is also experimental 3D plane-intersection code for detecting towers in 3D space. However, it is not part of the main workflow because it generally performs worse than the 2D approach. Tower Matching After estimating tower locations, the Go tools attempt to match the calculated positions against a known tower-location database. This step connects collected observation data to real-world tower locations and computes more complete tower data, including estimated altitude, which is stored in a separate database. Current Limitations The project is still experimental and has several limitations: the APK is not publicly distributed the app can consume a high amount of battery the database must be configured manually tower matching is not always accurate the 3D approach exists but is not used in the main workflow the project handles sensitive location and cellular data altitude estimation is not always reliable and can sometimes be significantly inaccurate Things that were hard Things that I had hard were first setting up all the database exporting and transferring data, thinking and making all the ideas for how to use the 2D trilateration and 3D plane collision in the Go code. Adding the foreground service process in the Android app and making sure the TA updates on read also took some time, as well as creating the HTML converter for the point map in Go and all the steps to set up for the shipping of the project that require a very strict level of security and can leak personal data if I’m not careful in every move. Current Goal The current goal of LoPose mapping is to create a working private pipeline: phone observations → Supabase database → tower estimation → tower matching → complete tower location data The project is not intended to be a polished production application yet. It is an experimental system for tower mapping and location processing. This is also the first step in a two-part project aimed at developing location-finding methods for Android that do not rely on GPS, which is planned for future development.", "repo": "https://gitlab.com/yakla/LoPose", "demo": "https://yakla.gitlab.io/LoPose/"}]...
|
[{"post_id": 20251, "ts": "202 [{"post_id": 20251, "ts": "2026-07-01T19:55:07Z", "hours": 3.7203, "text": "Update on current status. firstly the project now will start slowly shifting to the second part of the location finding based on the towers found. this will be found in a different project in the name of lopose location estimation secondly updated the readme and some of my older devlogs for better looks and for improving in writing things in the readme format. i’m not very good at it so i hope to improve by doing it and make it looks better. lastly cleaned some of the code and improved other parts for shipment."}, {"post_id": 19111, "ts": "2026-06-30T10:57:34Z", "hours": 3.6836, "text": "Devlog — Preparing Stardance for Shipping Before shipping Stardance firstly I spent some time cleaning up the project and making it easier to understand . it include a readme and a git repo. before publishing this i needed to check nothing private is commited. with that i also added a README to the project so it will be easier how to set up things yourself. all and all i’m pretty proud of what i made. still i do have planes for more which i didn’t had time for. New features adding the 3d estimations in the future. currently most of them are wrong but some times they can actually work better then 2d. i did see in my debugger around 10 or more of the 146 which actually worked better then the 2d once and could be logged in the final estimation. for better scalability i want to add observation auto removal if around 7 observation of the same cell can’t find a real tower. this will just mean that if few observations were off you can try again until all of them will fit one."}, {"post_id": 18290, "ts": "2026-06-29T12:03:21Z", "hours": 4.4636, "text": "Demo website its not done but here i got a demo website to watch all the observations until now and the estimation. do note some of them are wrong because of the challenging conditions so i will use a verification method later for the perfect real tower location and data. https://yakla.gitlab.io/LoPose/"}, {"post_id": 16530, "ts": "2026-06-26T21:51:52Z", "hours": 1.9075, "text": "Solution was found!!! its a good day today . aperently ta can also be 150m sometimes :) it work the detection works almost perfectly in 2d. yay ! i found out there was a bug in android that i thought have been fixed but aperently not. so now it works wonderfly. well we got it : if you ask its around 30m from the target. and this is while tracking in a moving car. also sometime the 3d estimation works better but thats in rare cases. most of the time its not the most accurate."}, {"post_id": 15837, "ts": "2026-06-25T19:08:05Z", "hours": 6.6844, "text": "update on current Go code tower estimation been a while and a lot got done got some news good news and bad news the good news is that i finished with the 3d caculation and improve observation accaurcy. the bad news is that there is still something lacking making the location positioning almost the same and still not giving the right. at least not based on my knowlage but its has gotten better in some siturations. i still have hard time figuring things out but combining the 2d and 3d based on the terain does give a pretty good estimated location. i realy like the 3d aproach i went with. suprisingly its easier to understand how its works then the 2d one and didn’t add much compute (at least not if there are to much points found from plain colition which grows expenetialy seriously some got in the order of bilions. realy creazy stuff) anyway from now on ill try focusing more on the position estimation rather then the tower estimation, this will be more interesting for me after all the work on one thing and use some of the knowledge i got from estimating the towers. anyway having hard time finding a good picture for the progress so random go 3d positioning code down below :"}, {"post_id": 12733, "ts": "2026-06-20T20:22:39Z", "hours": 3.3836, "text": "Small update add height to observaions. well been a while since the last devlog. i needed a lot of thinking and planning for the 3d estimations so took me long enough. still didn’t get all the answers but i do got some updates. first i got few ideas i want to share. for the height there are few approaches but what i want to use will be based on my already existing 2d system. secondly i might try to find the height approximations of the tower based on flat 2d location estimation and using a location to height api and distance height correction its possible to find it with high accuracy using gradient descent . and thirdly i dont have any pictures to share so ill put a picture of a dog 🐶"}, {"post_id": 6316, "ts": "2026-06-10T17:06:08Z", "hours": 1.2122, "text": "Suspected issues after lots of observations got to 3 different issues with the current system first i need to account for ta deadzone which is surprisingly one of the most uncommon things which are near me. i need to account for the third dimension in the calculation i need to check for faulty observations of ta jumps it will take work but its feasible. looks like i have a very bumpy road ahead wish me luck😵💫. took me too much time to figure the first one out"}, {"post_id": 5770, "ts": "2026-06-09T17:53:40Z", "hours": 7.1014, "text": "improved database sync code and changed ui"}, {"post_id": 4781, "ts": "2026-06-08T08:33:54Z", "hours": 5.2897, "text": "organize app code and improved architecture"}, {"post_id": 3754, "ts": "2026-06-06T20:05:04Z", "hours": 3.0111, "text": "started using observations for the caculation. seems real world had more error then expected so change observation code to recored more and reduce the distance between each one"}, {"post_id": 2949, "ts": "2026-06-05T21:08:06Z", "hours": 0.6258, "text": "improving cell tower location finding algorithm"}]...
|
Title: LoPose Cell Mapping by @yep | Stardance
De Title: LoPose Cell Mapping by @yep | Stardance
Devlogs:
improving cell tower location finding algorithm
started using observations for the caculation. seems real world had more error then expected so change observation code to recored more and reduce the distance between each one
organize app code and improved architecture
improved database sync code and changed ui
Suspected issues after lots of observations got to 3 different issues with the current system first i need to account for ta deadzone which is surprisingly one of the most uncommon things which are near me. i need to account for the third dimension in the calculation i need to check for faulty observations of ta jumps it will take work but its feasible. looks like i have a very bumpy road ahead wish me luck😵💫. took me too much time to figure the first one out
Small update add height to observaions. well been a while since the last devlog. i needed a lot of thinking and planning for the 3d estimations so took me long enough. still didn’t get all the answers but i do got some updates. first i got few ideas i want to share. for the height there are few approaches but what i want to use will be based on my already existing 2d system. secondly i might try to find the height approximations of the tower based on flat 2d location estimation and using a location to height api and distance height correction its possible to find it with high accuracy using gradient descent . and thirdly i dont have any pictures to share so ill put a picture of a dog 🐶
update on current Go code tower estimation been a while and a lot got done got some news good news and bad news the good news is that i finished with the 3d caculation and improve observation accaurcy. the bad news is that there is still something lacking making the location positioning almost the same and still not giving the right. at least not based on my knowlage but its has gotten better in some siturations. i still have hard time figuring things out but combining the 2d and 3d based on the terain does give a pretty good estimated location. i realy like the 3d aproach i went with. suprisingly its easier to understand how its works then the 2d one and didn’t add much compute (at least not if there are to much points found from plain colition which grows expenetialy seriously some got in the order of bilions. realy creazy stuff) anyway from now on ill try focusing more on the position estimation rather then the tower estimation, this will be more interesting for me after all the work on one thing and use some of the knowledge i got from estimating the towers. anyway having hard time finding a good picture for the progress so random go 3d positioning code down below :
Solution was found!!! its a good day today . aperently ta can also be 150m sometimes :) it work the detection works almost perfectly in 2d. yay ! i found out there was a bug in android that i thought have been fixed but aperently not. so now it works wonderfly. well we got it : if you ask its around 30m from the target. and this is while tracking in a moving car. also sometime the 3d estimation works better but thats in rare cases. most of the time its not the most accurate.
Demo website its not done but here i got a demo website to watch all the observations until now and the estimation. do note some of them are wrong because of the challenging conditions so i will use a verification method later for the perfect real tower location and data. https://yakla.gitlab.io/LoPose/
Devlog — Preparing Stardance for Shipping Before shipping Stardance firstly I spent some time cleaning up the project and making it easier to understand . it include a readme and a git repo. before publishing this i needed to check nothing private is commited. with that i also added a README to the project so it will be easier how to set up things yourself. all and all i’m pretty proud of what i made. still i do have planes for more which i didn’t had time for. New features adding the 3d estimations in the future. currently most of them are wrong but some times they can actually work better then 2d. i did see in my debugger around 10 or more of the 146 which actually worked better then the 2d once and could be logged in the final estimation. for better scalability i want to add observation auto removal if around 7 observation of the same cell can’t find a real tower. this will just mean that if few observations were off you can try again until all of them will fit one.
Update on current status. firstly the project now will start slowly shifting to the second part of the location finding based on the towers found. this will be found in a different project in the name of lopose location estimation secondly updated the readme and some of my older devlogs for better looks and for improving in writing things in the readme format. i’m not very good at it so i hope to improve by doing it and make it looks better. lastly cleaned some of the code and improved other parts for shipment.
Ships:
Project Overview LoPose Tower Mapping is a project focused on mapping cellular tower data collected from phones to real-world tower locations. The goal is to collect cellular observations from Android devices, upload them to a database, and process those observations to estimate and match real tower positions. The project is currently experimental and mainly intended for private use. Project Structure The project is split into two main parts: Android app Go triangulation and tower-fitting tools Android App The Android app is the core data collector. It runs on a phone and gathers data about the currently connected cellular tower. This data is uploaded to a Supabase database and stored as observations. The app records data such as: connected cell ID network / area information GPS location GPS accuracy altitude vertical accuracy timing advance EARFCN PCI recorder time Currently, it collects and uploads data approximately every 5 seconds. Because of this, it can consume a significant amount of battery due to frequent GPS usage, cellular observation checks, background processing, and network uploads. APK Status The APK is not published. This is because the project is mainly for private use, and publishing it could introduce privacy risks due to the sensitive location and cellular data involved. For now, both the app and the database must be built and configured from the source code. Go Processing Tools The second part of the project is written in Go. These tools process the observations collected by the Android app and attempt to estimate real tower locations. The main approach uses 2D trilateration to approximate tower positions based on collected observations. There is also experimental 3D plane-intersection code for detecting towers in 3D space. However, it is not part of the main workflow because it generally performs worse than the 2D approach. Tower Matching After estimating tower locations, the Go tools attempt to match the calculated positions against a known tower-location database. This step connects collected observation data to real-world tower locations and computes more complete tower data, including estimated altitude, which is stored in a separate database. Current Limitations The project is still experimental and has several limitations: the APK is not publicly distributed the app can consume a high amount of battery the database must be configured manually tower matching is not always accurate the 3D approach exists but is not used in the main workflow the project handles sensitive location and cellular data altitude estimation is not always reliable and can sometimes be significantly inaccurate Things that were hard Things that I had hard were first setting up all the database exporting and transferring data, thinking and making all the ideas for how to use the 2D trilateration and 3D plane collision in the Go code. Adding the foreground service process in the Android app and making sure the TA updates on read also took some time, as well as creating the HTML converter for the point map in Go and all the steps to set up for the shipping of the project that require a very strict level of security and can leak personal data if I’m not careful in every move. Current Goal The current goal of LoPose mapping is to create a working private pipeline: phone observations → Supabase database → tower estimation → tower matching → complete tower location data The project is not intended to be a polished production application yet. It is an experimental system for tower mapping and location processing. This is also the first step in a two-part project aimed at developing location-finding methods for Android that do not rely on GPS, which is planned for future development....
|
1793112632.5437558
|
1793199032.5437558
|
|
8808
|
Graph Neural Networks Textbook by @Anvith | Starda Graph Neural Networks Textbook by @Anvith | Stardance...
|
Anvith
|
1
|
6.08
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-05T20:11:19Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Built a full interactive textbook on Graph Neural Networks — 27 chapters, 300 concepts, 37 p5.js MicroSims you can play with directly in the browser (watch message passing animate, tune GAT attention weights, step through WL color refinement live). 301k words, 746 equations, all with full math derivations and runnable PyTorch Geometric code. Hardest part: wiring a dependency-aware learning graph of 300 concepts so every chapter respects prerequisites, and building the MicroSims so they actually teach the intuition rather than just looking cool. Most proud of the MicroSims — especially the GCN message passing visualizer and the WL color refinement stepper. Abstract concepts that are genuinely hard to explain with equations alone become obvious when you can manipulate them.", "repo": "https://github.com/AnvithPothula/graph-neural-networks-textbook", "demo": "https://anvithpothula.github.io/graph-neural-networks-textbook/"}]...
|
[{"post_id": 79396, "ts": "202 [{"post_id": 79396, "ts": "2026-10-13T20:04:15Z", "hours": 1.1422, "text": "Fixed a few bugs"}, {"post_id": 3887, "ts": "2026-06-06T23:53:17Z", "hours": 0.9336, "text": "I finished writing my intelligent textbook on Graph Neural Networks (GNNs)."}, {"post_id": 2900, "ts": "2026-06-05T20:08:34Z", "hours": 4.3156, "text": "This is a comprehensive, interactive intelligent textbook on Graph Neural Networks designed for graduate and advanced undergraduate students in machine learning, data mining, and network science. Built with MkDocs Material, it covers the full arc of the field — from graph theory and classical graph algorithms through modern architectures including graph transformers, knowledge graph models, and LLM+GNN integration. Every chapter leads with a real-world motivating example, builds intuition before equations, provides full mathematical derivations, and includes complete runnable PyTorch Geometric code. 37 interactive MicroSims — p5.js simulations embedded directly in the browser — let you manipulate GNN internals hands-on: watch message passing animate across layers, tune attention weights in real time, and step through WL color refinement iteration by iteration. The textbook is structured around a dependency-aware learning graph of 300 concepts, ensuring prerequisite sequencing is respected across all 27 chapters. Quizzes, glossary terms, and FAQs cover every major concept, with exercises distributed across all six levels of Bloom’s Taxonomy."}]...
|
Title: Graph Neural Networks Textbook by @Anvith | Title: Graph Neural Networks Textbook by @Anvith | Stardance
Devlogs:
This is a comprehensive, interactive intelligent textbook on Graph Neural Networks designed for graduate and advanced undergraduate students in machine learning, data mining, and network science. Built with MkDocs Material, it covers the full arc of the field — from graph theory and classical graph algorithms through modern architectures including graph transformers, knowledge graph models, and LLM+GNN integration. Every chapter leads with a real-world motivating example, builds intuition before equations, provides full mathematical derivations, and includes complete runnable PyTorch Geometric code. 37 interactive MicroSims — p5.js simulations embedded directly in the browser — let you manipulate GNN internals hands-on: watch message passing animate across layers, tune attention weights in real time, and step through WL color refinement iteration by iteration. The textbook is structured around a dependency-aware learning graph of 300 concepts, ensuring prerequisite sequencing is respected across all 27 chapters. Quizzes, glossary terms, and FAQs cover every major concept, with exercises distributed across all six levels of Bloom’s Taxonomy.
I finished writing my intelligent textbook on Graph Neural Networks (GNNs).
Fixed a few bugs
Ships:
Built a full interactive textbook on Graph Neural Networks — 27 chapters, 300 concepts, 37 p5.js MicroSims you can play with directly in the browser (watch message passing animate, tune GAT attention weights, step through WL color refinement live). 301k words, 746 equations, all with full math derivations and runnable PyTorch Geometric code. Hardest part: wiring a dependency-aware learning graph of 300 concepts so every chapter respects prerequisites, and building the MicroSims so they actually teach the intuition rather than just looking cool. Most proud of the MicroSims — especially the GCN message passing visualizer and the WL color refinement stepper. Abstract concepts that are genuinely hard to explain with equations alone become obvious when you can manipulate them....
|
1793119812.2886868
|
1793206212.2886868
|
|
8812
|
marvschwamm.de by @mervin | Stardance
|
mervin
|
1
|
7.55
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T20:53:05Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made MY website as lection for me to learn java script and HTML. I made the style dark and I think purple looks good and fits the style so I made some text purple. the Website shows what I did in the last few weeks and now its there yet without a certificate so you can only visit it under http:// and not under https:// but I hope this wont annoy. I integrated a aboutme in the website so you can learn things about me and you can get to know me better! I’ll also show my current and my future projects on the website so you’ll always be up to date. you can visit it NOW under http://marvschwamm.de", "repo": "https://github.com/MarvSchwamm123/Website", "demo": "http://marvschwamm.de"}]...
|
[{"post_id": 4530, "ts": "2026 [{"post_id": 4530, "ts": "2026-06-07T21:29:01Z", "hours": 0.5461, "text": "just a navigator advice for my Website. First of all to load the languages you have to click on the settings Icon in the top right corner then tip on the globe and then choose your language then the text will be loaded right once you choosed your language you are ready to go and every time you load the website it will be your language"}, {"post_id": 4109, "ts": "2026-06-07T09:36:23Z", "hours": 0.2533, "text": "HAH FORHOT the Home button quickly added it before I ship it because Ill ship it in a few minutes so you can host the Website locally just write wsl: cd marvschwamm.de source .venv/bin/activate python3 main.py"}, {"post_id": 3815, "ts": "2026-06-06T21:28:03Z", "hours": 1.3092, "text": "I nearly finished the aboutme page with a lot of text and a bit of trouble wit hshowing the text. I rearranged the text showing so it has its own text.js so its better for people to understand."}, {"post_id": 3739, "ts": "2026-06-06T19:40:15Z", "hours": 2.4856, "text": "Im working on my about me page with the information aboutm e youll be able to find there hopefully on sunday. Im making the background be a turning earth ball. for the earth Im using https://unpkg.com/ [email protected] /build/three.module.js and for the country borders I took the information from https://github.com/subyfly/topojson/blob/master/world-countries.json?short_path=c9c2b74 to show countrie borders on the globe turning in the background. 21:40 06.06.2026"}, {"post_id": 2964, "ts": "2026-06-05T21:33:44Z", "hours": 2.7211, "text": "Im working on a draggable Settings window for Language and style."}]...
|
Title: marvschwamm.de by @mervin | Stardance
Devl Title: marvschwamm.de by @mervin | Stardance
Devlogs:
Im working on a draggable Settings window for Language and style.
Im working on my about me page with the information aboutm e youll be able to find there hopefully on sunday. Im making the background be a turning earth ball. for the earth Im using https://unpkg.com/ [email protected] /build/three.module.js and for the country borders I took the information from https://github.com/subyfly/topojson/blob/master/world-countries.json?short_path=c9c2b74 to show countrie borders on the globe turning in the background. 21:40 06.06.2026
I nearly finished the aboutme page with a lot of text and a bit of trouble wit hshowing the text. I rearranged the text showing so it has its own text.js so its better for people to understand.
HAH FORHOT the Home button quickly added it before I ship it because Ill ship it in a few minutes so you can host the Website locally just write wsl: cd marvschwamm.de source .venv/bin/activate python3 main.py
just a navigator advice for my Website. First of all to load the languages you have to click on the settings Icon in the top right corner then tip on the globe and then choose your language then the text will be loaded right once you choosed your language you are ready to go and every time you load the website it will be your language
Ships:
I made MY website as lection for me to learn java script and HTML. I made the style dark and I think purple looks good and fits the style so I made some text purple. the Website shows what I did in the last few weeks and now its there yet without a certificate so you can only visit it under http:// and not under https:// but I hope this wont annoy. I integrated a aboutme in the website so you can learn things about me and you can get to know me better! I’ll also show my current and my future projects on the website so you’ll always be up to date. you can visit it NOW under http://marvschwamm.de...
|
1793134331.4003735
|
1793220731.4003735
|