|
46553
|
CyIDE by @Cy | Stardance
|
Cy
|
1
|
13.0
|
71
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T23:42:25Z", "hours": 13.0, "multiplier": 5.49, "payout": 71, "blessing": "neutral", "text": "I have made CyIDE to make coding easier and without distractions. VS Code is fine but I didnt like the annoying popups (like wen you are typing something and it shows a list of what it could be, or all the ai stuff that is enabled at install) and I wanted my ide to be controlled by keyboard only (like neovim but easier). So I set off to make a very basic version of this for my game engine and have decided to branch it off into its own project. This IDE is extremely lightweight and flexible with the support of plugins. The hardest part was implementing plugins. Plugins can be as simple as drawing a image to a music player (that im working on now). It even supports language syntax highlighting by reading a json file and applying colors from the pallet picture (p.png) to those words. I made this project to reduce distractions by making it as barebones as possible and if there is anything that i need in a IDE i could just add it.", "repo": "https://github.com/Cybrock9000/CyIDE", "demo": "https://github.com/Cybrock9000/CyIDE/releases/tag/V1.1"}]...
|
[{"post_id": 53367, "ts": "202 [{"post_id": 53367, "ts": "2026-08-23T21:48:08Z", "hours": 3.6594, "text": "I have done some final touchups to this project as well and I am proud of how it has turned out"}, {"post_id": 46121, "ts": "2026-08-13T04:05:44Z", "hours": 2.6694, "text": "Today I have mostly done stuff that has to do with plugins and the side panel. You can now access some variables in the main IDE. With the side panel, I have added many things like: it shows how many and what plugins are running, shows the file name, type and how many lines it has and finally it shows the other files and folders in the same dir as the file you are editing."}, {"post_id": 45565, "ts": "2026-08-12T04:27:52Z", "hours": 6.6431, "text": "So I have decided to separate this project from the engine because I am actually make it into something better. Before when it was on the engine the IDE had a very confusing layout so that was the first thing I tackled. This Ide Is based on the idea where you can write the code normally or write a line and insert it anywhere. The IDE supports simple plugins too. The main focus of this IDE is to make it simple and have the focus be on keyboard only (there is some mouse support) to make coding faster. The IDE can now load multi-thousand line files because it only loads what you see and does not draw every line with a offset anymore. The IDE supports custom color pallets by placing colors on to a png and setting it in the IDEs settings. When the engine updates it will be with the latest version of this IDE too because the old one was unbearable. I think that is it for now. - Cy."}]...
|
Title: CyIDE by @Cy | Stardance
Devlogs:
So I hav Title: CyIDE by @Cy | Stardance
Devlogs:
So I have decided to separate this project from the engine because I am actually make it into something better. Before when it was on the engine the IDE had a very confusing layout so that was the first thing I tackled. This Ide Is based on the idea where you can write the code normally or write a line and insert it anywhere. The IDE supports simple plugins too. The main focus of this IDE is to make it simple and have the focus be on keyboard only (there is some mouse support) to make coding faster. The IDE can now load multi-thousand line files because it only loads what you see and does not draw every line with a offset anymore. The IDE supports custom color pallets by placing colors on to a png and setting it in the IDEs settings. When the engine updates it will be with the latest version of this IDE too because the old one was unbearable. I think that is it for now. - Cy.
Today I have mostly done stuff that has to do with plugins and the side panel. You can now access some variables in the main IDE. With the side panel, I have added many things like: it shows how many and what plugins are running, shows the file name, type and how many lines it has and finally it shows the other files and folders in the same dir as the file you are editing.
I have done some final touchups to this project as well and I am proud of how it has turned out
Ships:
I have made CyIDE to make coding easier and without distractions. VS Code is fine but I didnt like the annoying popups (like wen you are typing something and it shows a list of what it could be, or all the ai stuff that is enabled at install) and I wanted my ide to be controlled by keyboard only (like neovim but easier). So I set off to make a very basic version of this for my game engine and have decided to branch it off into its own project. This IDE is extremely lightweight and flexible with the support of plugins. The hardest part was implementing plugins. Plugins can be as simple as drawing a image to a music player (that im working on now). It even supports language syntax highlighting by reading a json file and applying colors from the pallet picture (p.png) to those words. I made this project to reduce distractions by making it as barebones as possible and if there is anything that i need in a IDE i could just add it....
|
1793497697.0792947
|
1793584097.0792947
|
|
53102
|
BasicChessStats.py by @TheChessSagittarius | Stard BasicChessStats.py by @TheChessSagittarius | Stardance...
|
TheChessSagittarius
|
1
|
2.0
|
14
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T23:29:38Z", "hours": 2.0, "multiplier": 7.92, "payout": 14, "blessing": "neutral", "text": "My first project as a relatively new coder is a simple python script that works to grab chess.com stats based on an inputted chess.com username which could then be narrowed down by each time control: bullet for short games, then blitz, and finally rapid for longer games. This involved using the JSON packages within the API data and navigating it through a python dictionary. As an avid chess enthusiast, I wanted to do something simple in code yet related to my favorite hobby!", "repo": "https://github.com/TheChessSagittarius/Basic-ChessStats.py", "demo": "https://github.com/TheChessSagittarius/Basic-ChessStats.py/releases/tag/v1.0.0"}]...
|
[{"post_id": 53293, "ts": "202 [{"post_id": 53293, "ts": "2026-08-23T19:07:05Z", "hours": 1.7944, "text": "Learning how to use API Keys, dictionaries, importing modules with python to view chess.com stats. Starting to see how I can link my hobby of chess with software code."}]...
|
Title: BasicChessStats.py by @TheChessSagittarius Title: BasicChessStats.py by @TheChessSagittarius | Stardance
Devlogs:
Learning how to use API Keys, dictionaries, importing modules with python to view chess.com stats. Starting to see how I can link my hobby of chess with software code.
Ships:
My first project as a relatively new coder is a simple python script that works to grab chess.com stats based on an inputted chess.com username which could then be narrowed down by each time control: bullet for short games, then blitz, and finally rapid for longer games. This involved using the JSON packages within the API data and navigating it through a python dictionary. As an avid chess enthusiast, I wanted to do something simple in code yet related to my favorite hobby!...
|
1793541156.0496106
|
1793627556.0496106
|
|
52548
|
NeuralNetworkFromScratch by @MattiaAle | Stardance
|
MattiaAle
|
1
|
8.4
|
12
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T23:21:55Z", "hours": 7.0, "multiplier": 1.72, "payout": 12, "blessing": "neutral", "text": "I made this Neural Network from Scratch in python learning all the math behind and some cool new functions", "repo": "https://github.com/MattiaAlessi/NNFS", "demo": "https://github.com/MattiaAlessi/NNFS/releases"}]...
|
[{"post_id": 63859, "ts": "202 [{"post_id": 63859, "ts": "2026-09-07T20:52:35Z", "hours": 1.3978, "text": "Finally finished the project. Shipping date, please upvote"}, {"post_id": 53417, "ts": "2026-08-23T23:10:48Z", "hours": 6.8908, "text": "This is the first version of my NNFS in python, I’m gonna add more activation functions etc…"}]...
|
Title: NeuralNetworkFromScratch by @MattiaAle | St Title: NeuralNetworkFromScratch by @MattiaAle | Stardance
Devlogs:
This is the first version of my NNFS in python, I’m gonna add more activation functions etc…
Finally finished the project. Shipping date, please upvote
Ships:
I made this Neural Network from Scratch in python learning all the math behind and some cool new functions...
|
1793476320.0528302
|
1793562720.0528302
|
|
52397
|
printing legion bot by @itis | Stardance
|
itis
|
1
|
6.84
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T23:02:17Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Slack bot for #printing-legion that pings printers that are near the location of the request. It is able to fetch stl/step files to find its bounding box dimensions to be filtered by custom per printer filters. I also got beta testers to test, which is where I got some of these ideas. I speedran making this, so somehow, I made everything in 6 hours even though I’ve never made a slack bot.", "repo": "https://github.com/Heinrich-XIAO/printing-legion-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BS5HBEA73"}]...
|
[{"post_id": 54183, "ts": "202 [{"post_id": 54183, "ts": "2026-08-25T01:52:35Z", "hours": 0.5269, "text": "It is now more reliable, though it’ll still go down when hackai goes down and slack just stop responding every once in a while. It is now more clear in the testing guidelines, and I have improved the reliability of the region checking. I have also removed the feature where it checks for duplicates, as spam isn’t much of a problem (for now) and it makes testing hard."}, {"post_id": 53948, "ts": "2026-08-24T17:30:21Z", "hours": 0.31, "text": "I updated the readme with the required changes, and I also fixed the bug where it would say (undefined) if the printer didn’t specify filament stock."}, {"post_id": 53365, "ts": "2026-08-23T21:46:54Z", "hours": 2.8606, "text": "After some feedback from some beta testers, i found that people want dimension filters, since most post companies only accept mail under a certain set of dimentions, and mail is much cheaper than parcel, especially internationally. I wired everything up to threejs and occt and the github api and got the bounding box. Now, there is also a /add-custom-filter command, allowing you to restrict it to any arbitrary set of filters."}, {"post_id": 52723, "ts": "2026-08-23T01:25:04Z", "hours": 0.6325, "text": "I got it running on the server, but since most of my time was spent over ssh, that wasn’t captured by hackatime, but anyhow, it runs on the server now, and I also got a bunch of willing beta testers who are also printing for printing legion."}, {"post_id": 52053, "ts": "2026-08-22T03:00:22Z", "hours": 1.2111, "text": "I got the database working, and the bot probably almost completely works. There is now a /add-as-printer command where you can specify the region where your receiving prints, and it will only include those. I also got eslint setup and refactored the whole codebase. Next, I need to make and upload all the assets like the icons and stuff and make good documentation. Also, I applied for a best server and I’m waiting for approval."}, {"post_id": 51781, "ts": "2026-08-21T16:54:53Z", "hours": 1.3131, "text": "The bot is now able to parse print requests into a json schema using the hack club ai api. Currently the api is down, but it still kinda works with stealth models since they’re free, so right now, i’m using stealth/ox-alpha. I will switch to gpt oss 120b soon for speeeeeed. next, i’ll setup a json db (ik, eww, but it’s easier and im lazy) to store the requests."}]...
|
Title: printing legion bot by @itis | Stardance
D Title: printing legion bot by @itis | Stardance
Devlogs:
The bot is now able to parse print requests into a json schema using the hack club ai api. Currently the api is down, but it still kinda works with stealth models since they’re free, so right now, i’m using stealth/ox-alpha. I will switch to gpt oss 120b soon for speeeeeed. next, i’ll setup a json db (ik, eww, but it’s easier and im lazy) to store the requests.
I got the database working, and the bot probably almost completely works. There is now a /add-as-printer command where you can specify the region where your receiving prints, and it will only include those. I also got eslint setup and refactored the whole codebase. Next, I need to make and upload all the assets like the icons and stuff and make good documentation. Also, I applied for a best server and I’m waiting for approval.
I got it running on the server, but since most of my time was spent over ssh, that wasn’t captured by hackatime, but anyhow, it runs on the server now, and I also got a bunch of willing beta testers who are also printing for printing legion.
After some feedback from some beta testers, i found that people want dimension filters, since most post companies only accept mail under a certain set of dimentions, and mail is much cheaper than parcel, especially internationally. I wired everything up to threejs and occt and the github api and got the bounding box. Now, there is also a /add-custom-filter command, allowing you to restrict it to any arbitrary set of filters.
I updated the readme with the required changes, and I also fixed the bug where it would say (undefined) if the printer didn’t specify filament stock.
It is now more reliable, though it’ll still go down when hackai goes down and slack just stop responding every once in a while. It is now more clear in the testing guidelines, and I have improved the reliability of the region checking. I have also removed the feature where it checks for duplicates, as spam isn’t much of a problem (for now) and it makes testing hard.
Ships:
I made a Slack bot for #printing-legion that pings printers that are near the location of the request. It is able to fetch stl/step files to find its bounding box dimensions to be filtered by custom per printer filters. I also got beta testers to test, which is where I got some of these ideas. I speedran making this, so somehow, I made everything in 6 hours even though I’ve never made a slack bot....
|
1793458369.410543
|
1793544769.410543
|
|
44374
|
Clipboard++ by @Eel | Stardance
|
Eel
|
3
|
59.0
|
513
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T22:57:31Z", "hours": 24.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Shipped Clipboard++ v1.5.1! This update introduces a cleaner Windows-style interface, a flatter clipboard list, improved Quick Paste readability, real product screenshots, and documented search benchmarks.", "repo": "https://github.com/Caleb-Guyer/ClipboardPlusPlus", "demo": "https://github.com/Caleb-Guyer/ClipboardPlusPlus/releases"}, {"ship_num": 2, "ts": "2026-08-13T15:12:07Z", "hours": 27.0, "multiplier": 15.19, "payout": 406, "blessing": "neutral", "text": "Since the last ship, Clipboard++ has gone through a pretty massive expansion, with the focus shifting from a simple clipboard manager into a much more complete productivity tool. The biggest changes started with the workflow system. I added reusable workflows with multiple transformation steps, keyboard shortcuts, additional paste formats, and import/export support. This was followed by a rules engine that can automatically organize clips based on things like source application, content type, language, URL domains, and regex matches. Rules can perform actions such as pinning clips, adding tags or collections, and triggering workflows. I then expanded temporary clipboard functionality with expiration timers, burn-after-paste, bulk controls, and smart-rule automation. The backup system has also grown alongside these features, with each database migration preserving more of the application’s data. The paste workflow received another major upgrade with the native Quick Paste overlay and a keyboard-first Paste Queue. Quick Paste supports filtering by recent, pinned, temporary, and source application clips, while the Paste Queue allows clips to be reordered, pasted individually with automatic advancement, or pasted as a complete queue. Named paste stacks and configurable separators make it especially useful for repetitive tasks. Search has also been completely reworked. Clipboard++ now uses SQLite FTS5 for much faster full-text searching, including phrases, exclusions, structured operators, suggestions, filter chips, and match highlighting. Searches can be saved locally as Smart Views and included in backups. Performance testing reached roughly 0.90 ms for 10,000 entries and 1.05 ms for 50,000 entries. Most recently, I focused on making clipboard data safer and more recoverable. Clipboard entries can now be edited directly with syntax preview, and every edit can be tracked through revision history with line-by-line diffs. Deleted clips go into a Recycle Bin where they can be restored, permanently deleted, or undone. Clips that expire or use burn-after-reading can also be recovered. Backups now preserve revisions and deleted items as well. Across these releases, the SQLite schema has progressed from v5 through v11 as the application gained more functionality. I’ve repeatedly tested migrations, backups, large clipboard histories, both Windows 11 themes, and native installers to make sure the growing feature set remains reliable. Clipboard++ has gone from a basic clipboard history application to a much more complete system for searching, transforming, organizing, automating, and recovering clipboard content. Thank you all so much for the support!!!", "repo": "https://github.com/Caleb-Guyer/ClipboardPlusPlus", "demo": "https://github.com/Caleb-Guyer/ClipboardPlusPlus/releases"}, {"ship_num": 3, "ts": "2026-08-06T16:59:12Z", "hours": 8.0, "multiplier": 12.58, "payout": 107, "blessing": "neutral", "text": "I built Clipboard++, a desktop clipboard manager designed to make copying and pasting much faster for programmers, students, and anyone who frequently reuses text or images. Windows’ built-in clipboard history is fairly limited, so I wanted to create something that makes organizing and finding previous clipboard items effortless. Along the way I added searchable clipboard history, favorites, image clipboard support with local OCR, automatic local clip naming, collections and tags, privacy controls, a command palette, bulk organization tools, customizable themes, and portable backup/restore. The biggest challenge was making all of the features work together while keeping the application responsive and reliable. I also spent a lot of time testing edge cases, preserving existing user data during updates, and making sure privacy-sensitive content could be excluded from history. I’m most proud that Clipboard++ has grown into something I would genuinely use every day. It has gone through multiple public releases, each adding meaningful quality-of-life improvements rather than just cosmetic changes. To test the project, download the Windows installer from the GitHub Releases page (or build it from source), launch Clipboard++, copy text or images as you normally would, and try searching, pinning, tagging, renaming, organizing, and restoring clipboard items. The project is completely local, so no account or internet connection is required after installation.", "repo": "https://github.com/Caleb-Guyer/ClipboardPlusPlus", "demo": "https://github.com/Caleb-Guyer/ClipboardPlusPlus/releases"}]...
|
[{"post_id": 53404, "ts": "202 [{"post_id": 53404, "ts": "2026-08-23T22:56:29Z", "hours": 3.23, "text": "Clipboard++ v1.5.1 is focused on making the app feel calmer and more at home on Windows. I replaced the card-heavy clipboard history with a flatter list, reduced the purple styling, improved typography and metadata readability, and gave Quick Paste the same cleaner visual treatment. Keyboard controls and existing workflows remain unchanged. I also rewrote the README around the actual product, added real screenshots, and documented the Power Search benchmark with its hardware, query, and testing method. Before publishing, I tested compact window sizes, ran all 66 active Rust tests, built both Windows installers, and verified the release through GitHub Actions."}, {"post_id": 47268, "ts": "2026-08-15T02:39:06Z", "hours": 11.4333, "text": "v1.5.0 is finally complete and published! This was a pretty major update for Clipboard++, adding a full editor for modifying captured images while keeping the original clips untouched. The biggest part of this update was adding a bunch of editing tools, including permanent redaction, blur, pixelation, highlighting, shapes, arrows, pen drawing, and text. I also added undo/redo and made the editor responsive for different Windows 11 layouts. You can now copy or export your edited result, or save it as an entirely new clip. I also added OCR for edited regions, including secure handling of the metadata needed for redactions. A big focus of this release was making sure the native rendering stays bounded for both performance and safety. Most importantly, the original image is never modified when making edits. I also spent a lot of time validating the release instead of just assuming everything worked. TypeScript and production builds passed, all 66 Rust tests passed, and both MSI and NSIS installers built successfully. I also went through desktop and compact visual QA and checked for console errors. The GitHub CI and release workflows were tested as well, and everything is now published."}, {"post_id": 46681, "ts": "2026-08-14T03:44:34Z", "hours": 8.8433, "text": "Clipboard++ v1.4.0 is now live. This release adds a full-resolution Image Workspace with non-destructive cropping, along with editable and searchable OCR with support for selecting installed Windows languages. Images can now be exported as PNG, JPEG, or WebP, and the workspace also provides image metadata, transparency information, and an option to reveal the file in File Explorer. I also added schema v13 and backup support for OCR metadata. Before releasing, I ran the full native test suite with all 63 tests passing, verified the production build, completed visual QA, and confirmed that the GitHub CI and release workflows passed. The main worktree is clean and v1.4.0 is tagged."}, {"post_id": 46060, "ts": "2026-08-13T00:19:49Z", "hours": 4.1522, "text": "Clipboard++ v1.3.0 is now complete and published! This update focused on making clipboard history much more powerful and recoverable. I added a full clipboard editor with syntax preview, along with revision history that shows line-by-line differences between versions. Clipboard entries can now also be sent to a Recycle Bin, where they can be restored, permanently deleted, or undone exactly. I also added a duplicate-and-edit workflow and made expired and burn-after-reading clips recoverable. The backup format was updated as well so revisions and deleted items are preserved during backups and restores. During visual QA, I found and fixed a stale-row transition issue that could cause the clipboard list to display outdated information after changes."}, {"post_id": 45457, "ts": "2026-08-11T22:42:54Z", "hours": 4.3333, "text": "Worked for this session on a major upgrade to Clipboard++’s search experience. v1.2.0 is now live with a much more powerful way to find clips across large histories. I added SQLite FTS5 Power Search, supporting phrases, exclusions, and structured search operators, along with search suggestions, removable filter chips, and match highlighting. I also added Smart Views, allowing useful searches to be saved and reused locally. Under the hood, this release includes the schema v11 migration plus backup and restore support for Smart Views. I also made additional responsive and light/dark Windows 11 UI improvements. One of the biggest things I wanted to verify was that the new search system would remain fast with large clipboard histories. Testing showed approximately 0.90 ms searches with 10,000 entries and 1.05 ms with 50,000 entries. Validation passed across CI and the release workflow, and v1.2.0 is now publicly released."}, {"post_id": 44969, "ts": "2026-08-11T02:31:15Z", "hours": 4.7819, "text": "Spent this session finishing and publishing Clipboard++ v1.1.0. The main focus was making the paste workflow much faster for users who prefer keyboard-driven interaction. I added a new Paste Queue that can be opened with Ctrl+Q, allowing clipboard entries to be reordered with Alt+↑ and Alt+↓, pasted individually with automatic advancement, or pasted as an entire queue. Separators can also be customized depending on how the queued content should be combined. I also added reusable named paste stacks, along with improvements to the favorite workflow and plain-text actions in Quick Paste. These features make Clipboard++ more useful for repetitive workflows where the same groups of clipboard items need to be pasted repeatedly. Under the hood, I updated the SQLite database to schema v10 and expanded the backup support to account for the new data. I also ran the full validation suite, including 53 Rust tests, TypeScript checks, production builds, visual QA, CI, and the GitHub release workflow."}, {"post_id": 44363, "ts": "2026-08-10T02:21:16Z", "hours": 6.205, "text": "This release adds one of the biggest features yet: a native Quick Paste overlay designed around keyboard-first searching and pasting. You can now quickly find clipboard entries without leaving what you’re doing, with filters for Recent, Pinned, Temporary, and source applications. I also added active-monitor positioning and full-library window restoration, so the UI behaves much more naturally across multiple monitors. Onboarding and accessibility got attention too, with a first-run guide and several accessibility improvements. Under the hood, Clipboard++ moved to SQLite schema v9, including integrity checks and recovery snapshots. I also tested the application with 5,000-entry clipboard histories to make sure the larger datasets remain manageable. Before publishing, I ran the full validation stack: 51 Rust tests, TypeScript checks, formatting, production frontend builds, visual QA, MSI packaging, and NSIS packaging."}, {"post_id": 42859, "ts": "2026-08-07T20:10:41Z", "hours": 1.4283, "text": "v0.9.0 is complete and published. This update was a pretty substantial one for Clipboard++. I added temporary clips with expiration timers, burn-after-paste, bulk controls, smart-rule automation, and backup support. I also updated the SQLite database to schema v8 to support the new functionality. A big part of this release was making sure everything actually held together after all the changes. All 46 Rust tests pass, TypeScript checks pass, and I visually verified both themes. I also built and tested both the MSI and NSIS installers."}, {"post_id": 42342, "ts": "2026-08-07T00:48:01Z", "hours": 1.4117, "text": "Clipboard++ v0.8.0 is finished and officially live! This update adds a much smarter rules system for automatically organizing clipboard content. Clipboard++ can now track the source application and apply priority-ordered rules with AND conditions. Rules can match clips by application, content type, language, URL domain, or regex. I also added automatic actions based on those rules, including pinning clips, adding them to collections, applying tags, and triggering workflows. The new Rule Manager lets you reorder rules, test them inline, and export/import portable rule presets. Rules are also included in local backups, and the SQLite database has been upgraded to schema v7. Before releasing, I ran 44 Rust tests, TypeScript checks, production builds, browser UI testing, and the full GitHub CI/release workflows. Both MSI and NSIS installers were successfully built and published."}, {"post_id": 42287, "ts": "2026-08-06T22:27:08Z", "hours": 0.7889, "text": "Clipboard++ v0.7.0 is now complete! This update focused on making repetitive clipboard tasks much faster with reusable workflow pipelines. I added support for favorite workflows with up to 12 transformation steps, bounded regex find/replace, keyboard shortcuts (Ctrl+Alt+1 through Ctrl+Alt+9) for instantly launching workflows and templates, new paste formats including plain text, Markdown quotes, and JSON strings, plus workflow import/export for sharing or backing up custom setups. I also upgraded the database to schema v6 so workflows are included in backups, and polished the workflow editor and quick-action integration to make everything feel more seamless. Before releasing, I verified the project with TypeScript checks, a production frontend build, 39 Rust tests, interactive UI testing in both light and dark themes, and native MSI/NSIS builds."}, {"post_id": 42225, "ts": "2026-08-06T20:51:45Z", "hours": 3.5886, "text": "Clipboard++ v0.6.0 is complete! This update focused on making the app much more powerful for everyday productivity. I added 14 built-in text and code transformations, reusable snippet templates with variables, and a new Ctrl+. shortcut that lets you instantly transform and paste clipboard content without leaving your workflow. I also updated the backup system to support templates, migrated the database to schema v5, and polished the Windows 11 dialogs in both dark and light mode for a more consistent experience."}, {"post_id": 42065, "ts": "2026-08-06T16:57:22Z", "hours": 0.9564, "text": "Clipboard++ v0.5.0 is now available! This update adds several productivity features, including a Ctrl+K command palette, direct paste with Ctrl+Enter, multi-select for organizing multiple clips at once, and portable JSON backup and restore. I also introduced sensitive-content detection with customizable privacy terms, updated the documentation, and spent time testing, polishing, and preparing the latest public release."}, {"post_id": 41758, "ts": "2026-08-06T04:46:53Z", "hours": 1.0292, "text": "Clipboard++ v0.4.0 is released! This update focuses on making clipboard history much easier to organize by adding automatic local clip naming, editable custom names, color-coded collections, reusable tags, and powerful search across names, tags, clipboard content, and OCR text. I also added repeated-clip management, ensured existing clipboard history is preserved during upgrades, and finished another round of testing, bug fixes, and packaging for the latest public release."}, {"post_id": 41723, "ts": "2026-08-06T03:41:14Z", "hours": 1.2422, "text": "Clipboard++ v0.3.0 is now live! This update adds image clipboard support with thumbnails, local Windows OCR for searchable text inside images, and one-click image copy-back. I also added image storage controls, pinned image protection, filtering, usage statistics, and more settings while polishing both the dark and light themes. I finished by testing everything, fixing bugs, and packaging a new public Windows release."}, {"post_id": 41692, "ts": "2026-08-06T02:15:55Z", "hours": 1.5281, "text": "Made a huge update to Clipboard++ today. I added a full Settings & Privacy page with configurable history limits, pause/resume clipboard capture, launch at startup, customizable global shortcuts, and password manager exclusions so sensitive data isn’t saved. I also added dark, light, and system themes, update checking, and improved reliability with SQLite migrations, automated tests, and CI. After testing the app at multiple window sizes, I fixed a light theme contrast issue and packaged everything into a proper Windows installer for the v0.2.0 release."}, {"post_id": 41648, "ts": "2026-08-06T00:31:49Z", "hours": 3.72, "text": "I finished the first working version of Clipboard++ today. The application can now save clipboard history, search through copied items, pin important snippets, and quickly copy them back when needed. I also spent time polishing the interface to make it feel clean, responsive, and easy to use. Next, I plan to add more advanced features and continue refining the overall experience."}]...
|
Title: Clipboard++ by @Eel | Stardance
Devlogs:
I Title: Clipboard++ by @Eel | Stardance
Devlogs:
I finished the first working version of Clipboard++ today. The application can now save clipboard history, search through copied items, pin important snippets, and quickly copy them back when needed. I also spent time polishing the interface to make it feel clean, responsive, and easy to use. Next, I plan to add more advanced features and continue refining the overall experience.
Made a huge update to Clipboard++ today. I added a full Settings & Privacy page with configurable history limits, pause/resume clipboard capture, launch at startup, customizable global shortcuts, and password manager exclusions so sensitive data isn’t saved. I also added dark, light, and system themes, update checking, and improved reliability with SQLite migrations, automated tests, and CI. After testing the app at multiple window sizes, I fixed a light theme contrast issue and packaged everything into a proper Windows installer for the v0.2.0 release.
Clipboard++ v0.3.0 is now live! This update adds image clipboard support with thumbnails, local Windows OCR for searchable text inside images, and one-click image copy-back. I also added image storage controls, pinned image protection, filtering, usage statistics, and more settings while polishing both the dark and light themes. I finished by testing everything, fixing bugs, and packaging a new public Windows release.
Clipboard++ v0.4.0 is released! This update focuses on making clipboard history much easier to organize by adding automatic local clip naming, editable custom names, color-coded collections, reusable tags, and powerful search across names, tags, clipboard content, and OCR text. I also added repeated-clip management, ensured existing clipboard history is preserved during upgrades, and finished another round of testing, bug fixes, and packaging for the latest public release.
Clipboard++ v0.5.0 is now available! This update adds several productivity features, including a Ctrl+K command palette, direct paste with Ctrl+Enter, multi-select for organizing multiple clips at once, and portable JSON backup and restore. I also introduced sensitive-content detection with customizable privacy terms, updated the documentation, and spent time testing, polishing, and preparing the latest public release.
Clipboard++ v0.6.0 is complete! This update focused on making the app much more powerful for everyday productivity. I added 14 built-in text and code transformations, reusable snippet templates with variables, and a new Ctrl+. shortcut that lets you instantly transform and paste clipboard content without leaving your workflow. I also updated the backup system to support templates, migrated the database to schema v5, and polished the Windows 11 dialogs in both dark and light mode for a more consistent experience.
Clipboard++ v0.7.0 is now complete! This update focused on making repetitive clipboard tasks much faster with reusable workflow pipelines. I added support for favorite workflows with up to 12 transformation steps, bounded regex find/replace, keyboard shortcuts (Ctrl+Alt+1 through Ctrl+Alt+9) for instantly launching workflows and templates, new paste formats including plain text, Markdown quotes, and JSON strings, plus workflow import/export for sharing or backing up custom setups. I also upgraded the database to schema v6 so workflows are included in backups, and polished the workflow editor and quick-action integration to make everything feel more seamless. Before releasing, I verified the project with TypeScript checks, a production frontend build, 39 Rust tests, interactive UI testing in both light and dark themes, and native MSI/NSIS builds.
Clipboard++ v0.8.0 is finished and officially live! This update adds a much smarter rules system for automatically organizing clipboard content. Clipboard++ can now track the source application and apply priority-ordered rules with AND conditions. Rules can match clips by application, content type, language, URL domain, or regex. I also added automatic actions based on those rules, including pinning clips, adding them to collections, applying tags, and triggering workflows. The new Rule Manager lets you reorder rules, test them inline, and export/import portable rule presets. Rules are also included in local backups, and the SQLite database has been upgraded to schema v7. Before releasing, I ran 44 Rust tests, TypeScript checks, production builds, browser UI testing, and the full GitHub CI/release workflows. Both MSI and NSIS installers were successfully built and published.
v0.9.0 is complete and published. This update was a pretty substantial one for Clipboard++. I added temporary clips with expiration timers, burn-after-paste, bulk controls, smart-rule automation, and backup support. I also updated the SQLite database to schema v8 to support the new functionality. A big part of this release was making sure everything actually held together after all the changes. All 46 Rust tests pass, TypeScript checks pass, and I visually verified both themes. I also built and tested both the MSI and NSIS installers.
This release adds one of the biggest features yet: a native Quick Paste overlay designed around keyboard-first searching and pasting. You can now quickly find clipboard entries without leaving what you’re doing, with filters for Recent, Pinned, Temporary, and source applications. I also added active-monitor positioning and full-library window restoration, so the UI behaves much more naturally across multiple monitors. Onboarding and accessibility got attention too, with a first-run guide and several accessibility improvements. Under the hood, Clipboard++ moved to SQLite schema v9, including integrity checks and recovery snapshots. I also tested the application with 5,000-entry clipboard histories to make sure the larger datasets remain manageable. Before publishing, I ran the full validation stack: 51 Rust tests, TypeScript checks, formatting, production frontend builds, visual QA, MSI packaging, and NSIS packaging.
Spent this session finishing and publishing Clipboard++ v1.1.0. The main focus was making the paste workflow much faster for users who prefer keyboard-driven interaction. I added a new Paste Queue that can be opened with Ctrl+Q, allowing clipboard entries to be reordered with Alt+↑ and Alt+↓, pasted individually with automatic advancement, or pasted as an entire queue. Separators can also be customized depending on how the queued content should be combined. I also added reusable named paste stacks, along with improvements to the favorite workflow and plain-text actions in Quick Paste. These features make Clipboard++ more useful for repetitive workflows where the same groups of clipboard items need to be pasted repeatedly. Under the hood, I updated the SQLite database to schema v10 and expanded the backup support to account for the new data. I also ran the full validation suite, including 53 Rust tests, TypeScript checks, production builds, visual QA, CI, and the GitHub release workflow.
Worked for this session on a major upgrade to Clipboard++’s search experience. v1.2.0 is now live with a much more powerful way to find clips across large histories. I added SQLite FTS5 Power Search, supporting phrases, exclusions, and structured search operators, along with search suggestions, removable filter chips, and match highlighting. I also added Smart Views, allowing useful searches to be saved and reused locally. Under the hood, this release includes the schema v11 migration plus backup and restore support for Smart Views. I also made additional responsive and light/dark Windows 11 UI improvements. One of the biggest things I wanted to verify was that the new search system would remain fast with large clipboard histories. Testing showed approximately 0.90 ms searches with 10,000 entries and 1.05 ms with 50,000 entries. Validation passed across CI and the release workflow, and v1.2.0 is now publicly released.
Clipboard++ v1.3.0 is now complete and published! This update focused on making clipboard history much more powerful and recoverable. I added a full clipboard editor with syntax preview, along with revision history that shows line-by-line differences between versions. Clipboard entries can now also be sent to a Recycle Bin, where they can be restored, permanently deleted, or undone exactly. I also added a duplicate-and-edit workflow and made expired and burn-after-reading clips recoverable. The backup format was updated as well so revisions and deleted items are preserved during backups and restores. During visual QA, I found and fixed a stale-row transition issue that could cause the clipboard list to display outdated information after changes.
Clipboard++ v1.4.0 is now live. This release adds a full-resolution Image Workspace with non-destructive cropping, along with editable and searchable OCR with support for selecting installed Windows languages. Images can now be exported as PNG, JPEG, or WebP, and the workspace also provides image metadata, transparency information, and an option to reveal the file in File Explorer. I also added schema v13 and backup support for OCR metadata. Before releasing, I ran the full native test suite with all 63 tests passing, verified the production build, completed visual QA, and confirmed that the GitHub CI and release workflows passed. The main worktree is clean and v1.4.0 is tagged.
v1.5.0 is finally complete and published! This was a pretty major update for Clipboard++, adding a full editor for modifying captured images while keeping the original clips untouched. The biggest part of this update was adding a bunch of editing tools, including permanent redaction, blur, pixelation, highlighting, shapes, arrows, pen drawing, and text. I also added undo/redo and made the editor responsive for different Windows 11 layouts. You can now copy or export your edited result, or save it as an entirely new clip. I also added OCR for edited regions, including secure handling of the metadata needed for redactions. A big focus of this release was making sure the native rendering stays bounded for both performance and safety. Most importantly, the original image is never modified when making edits. I also spent a lot of time validating the release instead of just assuming everything worked. TypeScript and production builds passed, all 66 Rust tests passed, and both MSI and NSIS installers built successfully. I also went through desktop and compact visual QA and checked for console errors. The GitHub CI and release workflows were tested as well, and everything is now published.
Clipboard++ v1.5.1 is focused on making the app feel calmer and more at home on Windows. I replaced the card-heavy clipboard history with a flatter list, reduced the purple styling, improved typography and metadata readability, and gave Quick Paste the same cleaner visual treatment. Keyboard controls and existing workflows remain unchanged. I also rewrote the README around the actual product, added real screenshots, and documented the Power Search benchmark with its hardware, query, and testing method. Before publishing, I tested compact window sizes, ran all 66 active Rust tests, built both Windows installers, and verified the release through GitHub Actions.
Ships:
I built Clipboard++, a desktop clipboard manager designed to make copying and pasting much faster for programmers, students, and anyone who frequently reuses text or images. Windows’ built-in clipboard history is fairly limited, so I wanted to create something that makes organizing and finding previous clipboard items effortless. Along the way I added searchable clipboard history, favorites, image clipboard support with local OCR, automatic local clip naming, collections and tags, privacy controls, a command palette, bulk organization tools, customizable themes, and portable backup/restore. The biggest challenge was making all of the features work together while keeping the application responsive and reliable. I also spent a lot of time testing edge cases, preserving existing user data during updates, and making sure privacy-sensitive content could be excluded from history. I’m most proud that Clipboard++ has grown into something I would genuinely use every day. It has gone through multiple public releases, each adding meaningful quality-of-life improvements rather than just cosmetic changes. To test the project, download the Windows installer from the GitHub Releases page (or build it from source), launch Clipboard++, copy text or images as you normally would, and try searching, pinning, tagging, renaming, organizing, and restoring clipboard items. The project is completely local, so no account or internet connection is required after installation.
Since the last ship, Clipboard++ has gone through a pretty massive expansion, with the focus shifting from a simple clipboard manager into a much more complete productivity tool. The biggest changes started with the workflow system. I added reusable workflows with multiple transformation steps, keyboard shortcuts, additional paste formats, and import/export support. This was followed by a rules engine that can automatically organize clips based on things like source application, content type, language, URL domains, and regex matches. Rules can perform actions such as pinning clips, adding tags or collections, and triggering workflows. I then expanded temporary clipboard functionality with expiration timers, burn-after-paste, bulk controls, and smart-rule automation. The backup system has also grown alongside these features, with each database migration preserving more of the application’s data. The paste workflow received another major upgrade with the native Quick Paste overlay and a keyboard-first Paste Queue. Quick Paste supports filtering by recent, pinned, temporary, and source application clips, while the Paste Queue allows clips to be reordered, pasted individually with automatic advancement, or pasted as a complete queue. Named paste stacks and configurable separators make it especially useful for repetitive tasks. Search has also been completely reworked. Clipboard++ now uses SQLite FTS5 for much faster full-text searching, including phrases, exclusions, structured operators, suggestions, filter chips, and match highlighting. Searches can be saved locally as Smart Views and included in backups. Performance testing reached roughly 0.90 ms for 10,000 entries and 1.05 ms for 50,000 entries. Most recently, I focused on making clipboard data safer and more recoverable. Clipboard entries can now be edited directly with syntax preview, and every edit can be tracked through revision history with line-by-line diffs. Deleted clips go into a Recycle Bin where they can be restored, permanently deleted, or undone. Clips that expire or use burn-after-reading can also be recovered. Backups now preserve revisions and deleted items as well. Across these releases, the SQLite schema has progressed from v5 through v11 as the application gained more functionality. I’ve repeatedly tested migrations, backups, large clipboard histories, both Windows 11 themes, and native installers to make sure the growing feature set remains reliable. Clipboard++ has gone from a basic clipboard history application to a much more complete system for searching, transforming, organizing, automating, and recovering clipboard content. Thank you all so much for the support!!!
Shipped Clipboard++ v1.5.1! This update introduces a cleaner Windows-style interface, a flatter clipboard list, improved Quick Paste readability, real product screenshots, and documented search benchmarks....
|
1792882055.198709
|
1793746055.198709
|
|
49780
|
potatonator by @Potatoeater0075 | Stardance
|
Potatoeater0075
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T22:56:26Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Potatonator is a Slack bot where users can adopt and manage their own virtual potato. Each potato has its own stats, level, experience points and coins. Users can explore to earn XP and coins, view their potato’s profile and discover random potato facts. The project uses a Node.js Slack bot alongside a Cloudflare Workers API and Cloudflare D1 database for storing player and potato data. It includes an XP and leveling system that allows potatoes to progress as they gain experience. The bot is hosted on Hack Club Nest and configured as a systemd service so it can run continously without relying on the user’s computer being online.", "repo": "https://github.com/potatoeater0075/potatonator", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354"}]...
|
[{"post_id": 48476, "ts": "202 [{"post_id": 48476, "ts": "2026-08-16T20:50:26Z", "hours": 0.3833, "text": "I added the /potatonator-explore command, which is the first real gameplay feature for Potatonator. The idea is that users can send their potato on a random adventure. Each adventure gives the potato XP and coins. I created a new /explore endpoint in the Cloudflare Worker and added several random events, such as finding treasure, discovering golden potatoes, finding coins, or fighting a carrot. At first, the API only returned the XP and coins without saving them. I then added a coins column to the D1 database and updated the endpoint so the rewards are permanently saved. There were a few small issues along the way, including accidentally trying to add the coins column twice, which resulted in a duplicate-column error. Since the first command had already worked, the second one wasn’t needed. After testing the API locally, I connected /explore to Slack and deployed the updated Cloudflare Worker. I also updated /potatonator-profile so it displays the coins earned from exploring."}, {"post_id": 48461, "ts": "2026-08-16T20:18:50Z", "hours": 0.3167, "text": "I added the /potatonator-profile command. The goal was to let users view the potato they adopted and all of its stats. First, I created a new /profile endpoint in the Cloudflare Worker. It takes the user’s Slack ID and searches the D1 database for their potato. I also connected the endpoint to index.ts so Cloudflare knows about the new route. There was a small issue where the /profile endpoint wasn’t appearing in the API documentation. Turns out VS Code hadn’t properly saved the changes, so after saving a few more times, it worked. I then tested the endpoint using PowerShell and confirmed that it could retrieve the saved potato. Finally, I connected the API to the Slack bot using Axios. The bot sends the user’s Slack ID to the API, which retrieves their potato from D1 and sends the information back to Slack. The command now displays: 🥔 Potato name Type Rarity ⚔️ Power 🥔 Crunch 🍀 Luck ⭐ Level ✨ XP After testing it in Slack, /potatonator-profile worked successfully. Potatonator now has both potato adoption and profiles, giving us the foundation for adding actual gameplay features next. 🥔"}, {"post_id": 48416, "ts": "2026-08-16T19:08:28Z", "hours": 1.0017, "text": "I started this project with the goal of making a Slack bot that could respond to custom slash commands. I wasn’t sure what the bot should actually do, so I decided to make it potato-themed and named it Potatonator. I started with basic commands like: /potatonator-ping /potatonator-help /potatonator-potatofact For the potato facts, I first learned about APIs and Axios, which lets the bot make requests to an API. I originally considered using an existing API, but decided to make my own potato API instead. I first ran the API locally, but realized that meant it wouldn’t work when my PC was turned off. I decided to move it to Cloudflare Workers, which gave me a permanent URL: https://potatonator-api.potatonator.workers.dev I then connected my Slack bot to this API. After that, I wanted Potatonator to become more like a game, so I created /potatonator-adopt. Users could permanently adopt a randomly generated potato with stats such as: Name Type Rarity Power Crunch Luck Level XP To save this information, I added a Cloudflare D1 database. There were a few mistakes along the way. I initially ran a command from the wrong folder, and later discovered that my local D1 database didn’t have the table even though the remote database did. I also had an issue where Axios treated the “already have a potato” response as an error. After fixing these, everything worked. Now /potatonator-adopt successfully creates a potato and remembers it even after the bot restarts. Next, I’m planning to add /potatonator-profile, which will let users view their potato and its stats."}, {"post_id": 48330, "ts": "2026-08-16T17:18:45Z", "hours": 0.3017, "text": "Created the bot on slack and then I added the code to vs code. I tested the first ping command which resulted in a success!"}]...
|
Title: potatonator by @Potatoeater0075 | Stardance Title: potatonator by @Potatoeater0075 | Stardance
Devlogs:
Created the bot on slack and then I added the code to vs code. I tested the first ping command which resulted in a success!
I started this project with the goal of making a Slack bot that could respond to custom slash commands. I wasn’t sure what the bot should actually do, so I decided to make it potato-themed and named it Potatonator. I started with basic commands like: /potatonator-ping /potatonator-help /potatonator-potatofact For the potato facts, I first learned about APIs and Axios, which lets the bot make requests to an API. I originally considered using an existing API, but decided to make my own potato API instead. I first ran the API locally, but realized that meant it wouldn’t work when my PC was turned off. I decided to move it to Cloudflare Workers, which gave me a permanent URL: https://potatonator-api.potatonator.workers.dev I then connected my Slack bot to this API. After that, I wanted Potatonator to become more like a game, so I created /potatonator-adopt. Users could permanently adopt a randomly generated potato with stats such as: Name Type Rarity Power Crunch Luck Level XP To save this information, I added a Cloudflare D1 database. There were a few mistakes along the way. I initially ran a command from the wrong folder, and later discovered that my local D1 database didn’t have the table even though the remote database did. I also had an issue where Axios treated the “already have a potato” response as an error. After fixing these, everything worked. Now /potatonator-adopt successfully creates a potato and remembers it even after the bot restarts. Next, I’m planning to add /potatonator-profile, which will let users view their potato and its stats.
I added the /potatonator-profile command. The goal was to let users view the potato they adopted and all of its stats. First, I created a new /profile endpoint in the Cloudflare Worker. It takes the user’s Slack ID and searches the D1 database for their potato. I also connected the endpoint to index.ts so Cloudflare knows about the new route. There was a small issue where the /profile endpoint wasn’t appearing in the API documentation. Turns out VS Code hadn’t properly saved the changes, so after saving a few more times, it worked. I then tested the endpoint using PowerShell and confirmed that it could retrieve the saved potato. Finally, I connected the API to the Slack bot using Axios. The bot sends the user’s Slack ID to the API, which retrieves their potato from D1 and sends the information back to Slack. The command now displays: 🥔 Potato name Type Rarity ⚔️ Power 🥔 Crunch 🍀 Luck ⭐ Level ✨ XP After testing it in Slack, /potatonator-profile worked successfully. Potatonator now has both potato adoption and profiles, giving us the foundation for adding actual gameplay features next. 🥔
I added the /potatonator-explore command, which is the first real gameplay feature for Potatonator. The idea is that users can send their potato on a random adventure. Each adventure gives the potato XP and coins. I created a new /explore endpoint in the Cloudflare Worker and added several random events, such as finding treasure, discovering golden potatoes, finding coins, or fighting a carrot. At first, the API only returned the XP and coins without saving them. I then added a coins column to the D1 database and updated the endpoint so the rewards are permanently saved. There were a few small issues along the way, including accidentally trying to add the coins column twice, which resulted in a duplicate-column error. Since the first command had already worked, the second one wasn’t needed. After testing the API locally, I connected /explore to Slack and deployed the updated Cloudflare Worker. I also updated /potatonator-profile so it displays the coins earned from exploring.
Ships:
Potatonator is a Slack bot where users can adopt and manage their own virtual potato. Each potato has its own stats, level, experience points and coins. Users can explore to earn XP and coins, view their potato’s profile and discover random potato facts. The project uses a Node.js Slack bot alongside a Cloudflare Workers API and Cloudflare D1 database for storing player and potato data. It includes an XP and leveling system that allows potatoes to progress as they gain experience. The bot is hosted on Hack Club Nest and configured as a systemd service so it can run continously without relying on the user’s computer being online....
|
1793458323.8353956
|
1793544723.8353956
|
|
52617
|
lightshell by @kerlo | Stardance
|
kerlo
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T22:45:37Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "lightshell My own UNIX shell written in C++. It’s fast and lightweight and I’m trying to implement every useful shell function that I need!", "repo": "https://github.com/Kerlooo/lightshell", "demo": "https://github.com/Kerlooo/lightshell/blob/main/main.cpp"}]...
|
[{"post_id": 53396, "ts": "202 [{"post_id": 53396, "ts": "2026-08-23T22:40:06Z", "hours": 0.5514, "text": "Project update Now I created my makefile to build the project with some optimizations compiler flags! I also updated README.md and created a function to delete the history commands."}, {"post_id": 52022, "ts": "2026-08-22T01:52:57Z", "hours": 1.6469, "text": "Hello everyone! After a long time, I finally started programming again! Today I wanted to try to create a shell because… why not? So I present to you lightshell, my own unix shell written in C++. The size of the compiled source is WAY LESS than 1MB and I’m working hard to understand all the C++ libraries that I need. Let me know if you’d like some new features!"}]...
|
Title: lightshell by @kerlo | Stardance
Devlogs:
Title: lightshell by @kerlo | Stardance
Devlogs:
Hello everyone! After a long time, I finally started programming again! Today I wanted to try to create a shell because… why not? So I present to you lightshell, my own unix shell written in C++. The size of the compiled source is WAY LESS than 1MB and I’m working hard to understand all the C++ libraries that I need. Let me know if you’d like some new features!
Project update Now I created my makefile to build the project with some optimizations compiler flags! I also updated README.md and created a function to delete the history commands.
Ships:
lightshell My own UNIX shell written in C++. It’s fast and lightweight and I’m trying to implement every useful shell function that I need!...
|
1793487046.7766056
|
1793573446.7766056
|
|
610
|
MARGE - Modular Advanced Raytracing & Graphics MARGE - Modular Advanced Raytracing & Graphics Engine by @markmris | Stardance...
|
markmris
|
2
|
31.0
|
482
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T22:21:26Z", "hours": 9.0, "multiplier": 16.75, "payout": 159, "blessing": "neutral", "text": "I improved and optimized my raytracing graphics engine. Images now render ~2x faster under default settings. Textures have been added, along with motion blur. I ran into issues like my first stack overflow error and nullpointers. To try the project, follow the instructions at the bottom of the README for the best experience.", "repo": "https://github.com/markmris/marge", "demo": "https://github.com/markmris/marge/releases/tag/v0.16.2"}, {"ship_num": 2, "ts": "2026-08-05T22:53:58Z", "hours": 22.0, "multiplier": 14.64, "payout": 323, "blessing": "neutral", "text": "I built a raytracing graphics engine in raw C++. The engine uses mathematical concepts involving vectors, quadratics, as well as scientific concepts like reflection and refraction. This was my first long-term project I actually committed to. I learned a lot about C++ and math in general. To try the project, follow the instructions at the bottom of the README.", "repo": "https://github.com/markmris/marge", "demo": "https://github.com/markmris/marge/releases/tag/v0.16.2"}]...
|
[{"post_id": 53380, "ts": "202 [{"post_id": 53380, "ts": "2026-08-23T22:12:27Z", "hours": 4.5031, "text": "These final hours have been excruciating. I encountered my first ever stack overflow (cannon event), I had trouble with null pointers, and somehow a function I made 2 weeks ago was broken but never showed its way through until today. But finally, I added textures! The 2 textures added are a checkerboard texture (as seen in the image below), and now you can upload any jpeg, png, or tga to the textures folder and they will be randomly applied to spheres. I added an earth texture and basketball texture. The image library was not me, it’s from an open source image library called stb_image. I would not have been able to make it myself. Also, I reorganized the project file structure because when I started my files were very non-conventional. Believe it or not, I got the file advice from The Cherno on YouTube. This is probably my final devlog for the summer. I learned a lot making this project and will continue it for the next few months to hopefully get it to where I want it to be."}, {"post_id": 49940, "ts": "2026-08-18T22:19:25Z", "hours": 3.9922, "text": "2 things done today: Fixed the black sphere bug. I realized the issue was generating the colors by using normal vectors, which return values between -1 and 1. Since negative values are clamped to 0 by the color module, I rendered black spheres. I fixed this by making a designated randomColor() function. I added Bounding Volume Hierarchies, or BVH for short. BVH creates a massive performance increase, just over doubling render speed (from 6:30 to 3:04). This feature was by far the hardest to implement and understand, but basically it chunks up objects in the world to be in groups of boxes, and instead of looping through each object in the scene for collision checks, we loop through bounding boxes (groups) first, eliminating the objects that were missed. There was lots of friction creating this feature, especially after implementing a new loop that mathematically, should make the renderer faster, but in reality it became ~2.6x slower? I scrapped that for now and I’ll revisit it later."}, {"post_id": 46630, "ts": "2026-08-14T00:57:35Z", "hours": 0.9831, "text": "Today I made motion blur and moving objects. The camera cannot move yet, but objects can now be given a current and moveto position. The lower the fps is and/or the further the points are from each other, the blurrier the object will be, since as of now, each object is “moving” at a constant speed that will get them from point A to B in 1 time unit. (Maybe I should call it ticks or something) Feel free to leave a fun name idea in the comments. One weird issue I ran into was the 2nd book skipped a few steps and used methods and variables that were never covered, so I had to ask AI for help. There’s also a bug that makes the sphere look black and the motion blur is the proper color so that will have to be fixed soon."}, {"post_id": 40898, "ts": "2026-08-04T18:29:28Z", "hours": 5.435, "text": "I made a lots of progress and learned a bunch in the past few hours! I added 2 big features: Custom Command Line Parsing and Random Scene Generation. I also ran into a lot of friction doing these. I first had to learn how to connect an enum to strings, which was pretty easy, but the hard part was making sure commands were secure and wouldn’t break under one mistype. The random scene generation was pretty hard too. The big part was calculating the center point every object revolved around and positioning them nicely. This made the renderer quite a bit slower, but it was worth it."}, {"post_id": 40148, "ts": "2026-08-03T15:32:59Z", "hours": 0.5725, "text": "Not much done this log. I just added defocus blur. This works by conceptually simulating a real camera with a virtual lens that grows and shrinks along with a focus distance. At the focus distance, objects are fully in focus. The further objects get from that distance, they decrease in focus linearly based on the size of the lens as well. Once again not much friction."}, {"post_id": 39767, "ts": "2026-08-02T23:06:59Z", "hours": 1.4736, "text": "Finished something huge today, a positionable/modifiable camera! Each image can now have a unique position for the camera, as well as a rotated camera. I also added FOV which makes the camera zoom in or out. (Default set to 90). One big thing I had to deal with was the cross products. The cross product of two vectors returns one vector perpendicular to both original vectors, which was required to calculate the direction the camera was facing. The order of calculation matters a lot because incorrect cross products flipped the image upside down, inversed rotation and position, etc."}, {"post_id": 39688, "ts": "2026-08-02T20:31:11Z", "hours": 0.3392, "text": "Didn’t do much this log. I just added some code to handle edge cases where light intersects glass or any dielectric at a 90 degree angle that screws up the pixel slightly. Not really much friction at all today. On the sphere t the left, I made it look hollow by placing another sphere inside the bigger one which makes light bend multiple times causing the hollow effect."}, {"post_id": 39216, "ts": "2026-08-02T01:19:31Z", "hours": 0.9275, "text": "Today I created another material, dielectrics. A dielectric is any material that bends or refracts light, for example, glass, water, diamonds, etc. Think of when you dip a pencil in water and it looks bent, that’s refraction. The sphere on the left is now a solid glass ball where light refracts in a way that flips it 180 degrees. I ran into an issue where I used multiplication instead of addition in the refraction code which made the refraction look warped and messy. (Forgot to screenshot it)"}, {"post_id": 37936, "ts": "2026-07-30T23:24:59Z", "hours": 0.5417, "text": "Today I made the fuzzy metal material. Metal surfaces now take a new fuzz parameter which modifies the reflectivity and makes it look like a shiny diffuse material the more fuzzy it is. In the screenshot I posted, the sphere on the left is non-fuzzy metal, the middle one is diffuse, and the right one is fuzzy metal."}, {"post_id": 35313, "ts": "2026-07-26T17:09:41Z", "hours": 1.4764, "text": "My renderer is starting to get pretty advanced now! I just finished making the metal/reflective material, as you can see in the photo. I also added gamma correction, which is just square rooting the color output so that the color accuracy and intensity is proper. One issue I ran into was figuring out a weird compiler quirk with override methods, how I wasn’t meant to use the override keyword when defining a function in the .cpp module, but you are supposed to use it only in the declaration in the .h header file."}, {"post_id": 34794, "ts": "2026-07-25T19:48:08Z", "hours": 1.2036, "text": "I fixed one big thing today! Shadow Acne. (Yes that’s what it’s called). This is an issue where a ray starts too close to its origin and accidentally hits itself, causing black freckles all over the image. (As seen in the first photo below). It seemed the only way to fix it was to increase pixel sampling, which is shooting multiple rays at each pixel that are all slightly offset and calculating the average of the colors hit, as seen in the second photo. The downside to this is that it makes the renderer MUCH slower. Image generation jumped from a few seconds to ~2 minutes. I also spent a decent amount of time getting a better understanding of the pipeline and rendering process. Here’s a rundown of how it works if you’re interested: Start by initializing the camera, image and viewport size, and defining the position of every object in the world. Loop through each pixel in the image. For each pixel looped through, loop through every object in the scene. Run each object’s respective “hit” function to calculate whether or not it was hit. If the object was hit, run the sampling process as explained above. If not, color the sky gradient. Obviously there’s much more to it but that’s too much to explain."}, {"post_id": 33207, "ts": "2026-07-22T22:10:48Z", "hours": 0.6583, "text": "Today I did some new vector math to generate diffuse materials. The idea is that a diffuse is a surface that is the same color all around it, and not this pixely, but it’s a work in progress. Not much friction today overall."}, {"post_id": 31415, "ts": "2026-07-19T19:21:13Z", "hours": 2.9711, "text": "Today I worked on antialiasing, the process of blending edge pixels with the background to give the image smoother surfaces and to look nicer. Unfortunately, this process makes the renderer a lot slower, meaning it will have to be heavily optimized over time. I also ran into a big issue where the rendered image was black. I found out that I messed up some arithmetic and also had a divide by zero error that didn’t show up."}, {"post_id": 22496, "ts": "2026-07-05T00:14:22Z", "hours": 3.9025, "text": "I finally have a decent graphics engine! Over the past while, I’ve been cleaning up and reorganizing the entire codebase so it’s much easier to work with and expand. Instead of having everything jumbled together, I’ve split the project into reusable modules and created a central header that keeps the code organized. The biggest improvement is how objects are handled. Before, adding another sphere or object required changing the rendering code itself. Now, I can simply add a new object to a list, and the engine automatically includes it the next time it renders the image. This makes building more complex worlds much faster and sets up a solid foundation for future features and shapes. This’ll hopefully someday turn into a game engine or open source graphics engine that will actually generate frames, so it can be used to make video games from scratch! Here’s the GitHub if you’re interested in following along: https://github.com/markmris/marge"}, {"post_id": 15722, "ts": "2026-06-25T16:11:09Z", "hours": 1.2989, "text": "Finally got a chance after exams to continue working on my graphics engine. I spent some time watching videos on vector math to better understand them and how they differ from regular scalars, coordinates, and lines. With my new knowledge I got to work on creating a surface normal, and now my sphere has a VERY ugly blend of colors that give it some visual depth. The concept of surface normals still doesn’t make that much sense to me, so I’m gonna spend more time watching videos and understanding them"}, {"post_id": 575, "ts": "2026-06-02T02:11:11Z", "hours": 0.4825, "text": "I’ve started rendering actual shapes now. The first shape I rendered is a sphere, though it looks like a circle (kind of like the Japanese flag) since it doesn’t have any depth yet. I also discovered and fixed a major bug making the viewport/window a square and the image a rectangle which distorted shapes and gradients."}, {"post_id": 149, "ts": "2026-05-31T23:26:33Z", "hours": 0.7561, "text": "I implemented raycasts to be used instead of manual color drawings and made a sky gradient. Ran into a bug with the vector math and moved around a few things to fix it, now it works, looks better, and renders faster!"}]...
|
Title: MARGE - Modular Advanced Raytracing & G Title: MARGE - Modular Advanced Raytracing & Graphics Engine by @markmris | Stardance
Devlogs:
I implemented raycasts to be used instead of manual color drawings and made a sky gradient. Ran into a bug with the vector math and moved around a few things to fix it, now it works, looks better, and renders faster!
I’ve started rendering actual shapes now. The first shape I rendered is a sphere, though it looks like a circle (kind of like the Japanese flag) since it doesn’t have any depth yet. I also discovered and fixed a major bug making the viewport/window a square and the image a rectangle which distorted shapes and gradients.
Finally got a chance after exams to continue working on my graphics engine. I spent some time watching videos on vector math to better understand them and how they differ from regular scalars, coordinates, and lines. With my new knowledge I got to work on creating a surface normal, and now my sphere has a VERY ugly blend of colors that give it some visual depth. The concept of surface normals still doesn’t make that much sense to me, so I’m gonna spend more time watching videos and understanding them
I finally have a decent graphics engine! Over the past while, I’ve been cleaning up and reorganizing the entire codebase so it’s much easier to work with and expand. Instead of having everything jumbled together, I’ve split the project into reusable modules and created a central header that keeps the code organized. The biggest improvement is how objects are handled. Before, adding another sphere or object required changing the rendering code itself. Now, I can simply add a new object to a list, and the engine automatically includes it the next time it renders the image. This makes building more complex worlds much faster and sets up a solid foundation for future features and shapes. This’ll hopefully someday turn into a game engine or open source graphics engine that will actually generate frames, so it can be used to make video games from scratch! Here’s the GitHub if you’re interested in following along: https://github.com/markmris/marge
Today I worked on antialiasing, the process of blending edge pixels with the background to give the image smoother surfaces and to look nicer. Unfortunately, this process makes the renderer a lot slower, meaning it will have to be heavily optimized over time. I also ran into a big issue where the rendered image was black. I found out that I messed up some arithmetic and also had a divide by zero error that didn’t show up.
Today I did some new vector math to generate diffuse materials. The idea is that a diffuse is a surface that is the same color all around it, and not this pixely, but it’s a work in progress. Not much friction today overall.
I fixed one big thing today! Shadow Acne. (Yes that’s what it’s called). This is an issue where a ray starts too close to its origin and accidentally hits itself, causing black freckles all over the image. (As seen in the first photo below). It seemed the only way to fix it was to increase pixel sampling, which is shooting multiple rays at each pixel that are all slightly offset and calculating the average of the colors hit, as seen in the second photo. The downside to this is that it makes the renderer MUCH slower. Image generation jumped from a few seconds to ~2 minutes. I also spent a decent amount of time getting a better understanding of the pipeline and rendering process. Here’s a rundown of how it works if you’re interested: Start by initializing the camera, image and viewport size, and defining the position of every object in the world. Loop through each pixel in the image. For each pixel looped through, loop through every object in the scene. Run each object’s respective “hit” function to calculate whether or not it was hit. If the object was hit, run the sampling process as explained above. If not, color the sky gradient. Obviously there’s much more to it but that’s too much to explain.
My renderer is starting to get pretty advanced now! I just finished making the metal/reflective material, as you can see in the photo. I also added gamma correction, which is just square rooting the color output so that the color accuracy and intensity is proper. One issue I ran into was figuring out a weird compiler quirk with override methods, how I wasn’t meant to use the override keyword when defining a function in the .cpp module, but you are supposed to use it only in the declaration in the .h header file.
Today I made the fuzzy metal material. Metal surfaces now take a new fuzz parameter which modifies the reflectivity and makes it look like a shiny diffuse material the more fuzzy it is. In the screenshot I posted, the sphere on the left is non-fuzzy metal, the middle one is diffuse, and the right one is fuzzy metal.
Today I created another material, dielectrics. A dielectric is any material that bends or refracts light, for example, glass, water, diamonds, etc. Think of when you dip a pencil in water and it looks bent, that’s refraction. The sphere on the left is now a solid glass ball where light refracts in a way that flips it 180 degrees. I ran into an issue where I used multiplication instead of addition in the refraction code which made the refraction look warped and messy. (Forgot to screenshot it)
Didn’t do much this log. I just added some code to handle edge cases where light intersects glass or any dielectric at a 90 degree angle that screws up the pixel slightly. Not really much friction at all today. On the sphere t the left, I made it look hollow by placing another sphere inside the bigger one which makes light bend multiple times causing the hollow effect.
Finished something huge today, a positionable/modifiable camera! Each image can now have a unique position for the camera, as well as a rotated camera. I also added FOV which makes the camera zoom in or out. (Default set to 90). One big thing I had to deal with was the cross products. The cross product of two vectors returns one vector perpendicular to both original vectors, which was required to calculate the direction the camera was facing. The order of calculation matters a lot because incorrect cross products flipped the image upside down, inversed rotation and position, etc.
Not much done this log. I just added defocus blur. This works by conceptually simulating a real camera with a virtual lens that grows and shrinks along with a focus distance. At the focus distance, objects are fully in focus. The further objects get from that distance, they decrease in focus linearly based on the size of the lens as well. Once again not much friction.
I made a lots of progress and learned a bunch in the past few hours! I added 2 big features: Custom Command Line Parsing and Random Scene Generation. I also ran into a lot of friction doing these. I first had to learn how to connect an enum to strings, which was pretty easy, but the hard part was making sure commands were secure and wouldn’t break under one mistype. The random scene generation was pretty hard too. The big part was calculating the center point every object revolved around and positioning them nicely. This made the renderer quite a bit slower, but it was worth it.
Today I made motion blur and moving objects. The camera cannot move yet, but objects can now be given a current and moveto position. The lower the fps is and/or the further the points are from each other, the blurrier the object will be, since as of now, each object is “moving” at a constant speed that will get them from point A to B in 1 time unit. (Maybe I should call it ticks or something) Feel free to leave a fun name idea in the comments. One weird issue I ran into was the 2nd book skipped a few steps and used methods and variables that were never covered, so I had to ask AI for help. There’s also a bug that makes the sphere look black and the motion blur is the proper color so that will have to be fixed soon.
2 things done today: Fixed the black sphere bug. I realized the issue was generating the colors by using normal vectors, which return values between -1 and 1. Since negative values are clamped to 0 by the color module, I rendered black spheres. I fixed this by making a designated randomColor() function. I added Bounding Volume Hierarchies, or BVH for short. BVH creates a massive performance increase, just over doubling render speed (from 6:30 to 3:04). This feature was by far the hardest to implement and understand, but basically it chunks up objects in the world to be in groups of boxes, and instead of looping through each object in the scene for collision checks, we loop through bounding boxes (groups) first, eliminating the objects that were missed. There was lots of friction creating this feature, especially after implementing a new loop that mathematically, should make the renderer faster, but in reality it became ~2.6x slower? I scrapped that for now and I’ll revisit it later.
These final hours have been excruciating. I encountered my first ever stack overflow (cannon event), I had trouble with null pointers, and somehow a function I made 2 weeks ago was broken but never showed its way through until today. But finally, I added textures! The 2 textures added are a checkerboard texture (as seen in the image below), and now you can upload any jpeg, png, or tga to the textures folder and they will be randomly applied to spheres. I added an earth texture and basketball texture. The image library was not me, it’s from an open source image library called stb_image. I would not have been able to make it myself. Also, I reorganized the project file structure because when I started my files were very non-conventional. Believe it or not, I got the file advice from The Cherno on YouTube. This is probably my final devlog for the summer. I learned a lot making this project and will continue it for the next few months to hopefully get it to where I want it to be.
Ships:
I built a raytracing graphics engine in raw C++. The engine uses mathematical concepts involving vectors, quadratics, as well as scientific concepts like reflection and refraction. This was my first long-term project I actually committed to. I learned a lot about C++ and math in general. To try the project, follow the instructions at the bottom of the README.
I improved and optimized my raytracing graphics engine. Images now render ~2x faster under default settings. Textures have been added, along with motion blur. I ran into issues like my first stack overflow error and nullpointers. To try the project, follow the instructions at the bottom of the README for the best experience....
|
1793523364.5556355
|
1793609764.5556355
|
|
32340
|
My own site! by @purlimurlikas | Stardance
|
purlimurlikas
|
1
|
21.79
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T21:34:58Z", "hours": 21.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a personal website about myself. It was very challenging to get the CSS right, because it really didn’t want to cooperate with me, and thats also why it took so long. I’m proud that I finally completed it. The website will help you get to know me better.", "repo": "https://github.com/purlimurlikas-maker/purli-s-personal-website", "demo": "https://purlimurlikas-maker.github.io/purli-s-personal-website/"}]...
|
[{"post_id": 65334, "ts": "202 [{"post_id": 65334, "ts": "2026-09-10T12:40:54Z", "hours": 0.7939, "text": "Just made a couple edits to the projects box, and fixed some sizes"}, {"post_id": 47948, "ts": "2026-08-16T06:51:46Z", "hours": 0.7944, "text": "my website really does not want to cooperate with me."}, {"post_id": 47871, "ts": "2026-08-16T03:53:50Z", "hours": 1.7769, "text": "I don’t actually mind these pictures shifting around but I do need to fix some other positions of pictures."}, {"post_id": 46732, "ts": "2026-08-14T06:16:02Z", "hours": 2.4667, "text": "I am trying to make the items shrink and get bigger depending on the window size."}, {"post_id": 37283, "ts": "2026-07-29T21:43:24Z", "hours": 4.4486, "text": "I have even more pictures, and my website will be done soon, but the items move depeding on how big the window is, I’m trying to figure out how to fix it, and if anyone can help, please let me know."}, {"post_id": 34820, "ts": "2026-07-25T20:35:35Z", "hours": 1.2467, "text": "I’m trying to figure out how to add gifs and how to make the navigation bar look more like buttons and not links."}, {"post_id": 34598, "ts": "2026-07-25T13:40:45Z", "hours": 4.1903, "text": "I added CSS, found a good colour palette, and now I have pictures :)."}, {"post_id": 33418, "ts": "2026-07-23T10:44:47Z", "hours": 0.5, "text": "I added more CSS, but I’m having troubles pushing my code to github."}, {"post_id": 33111, "ts": "2026-07-22T18:47:13Z", "hours": 0.6611, "text": "Fixed some mistakes and now I am trying to get the colour palette to look better and change some other things."}, {"post_id": 32954, "ts": "2026-07-22T13:17:57Z", "hours": 0.5275, "text": "Uhm, there are some things wrong in my code, but at least I am taking steps forward."}, {"post_id": 32911, "ts": "2026-07-22T11:43:02Z", "hours": 1.7839, "text": "I am adding more text to my website."}, {"post_id": 24842, "ts": "2026-07-08T17:48:00Z", "hours": 2.2178, "text": "I am working on the layout and information on my website, tried using AI to fix the layout, because all the text was on top of eachother, but AI messed everything up."}]...
|
Title: My own site! by @purlimurlikas | Stardance
Title: My own site! by @purlimurlikas | Stardance
Devlogs:
I am working on the layout and information on my website, tried using AI to fix the layout, because all the text was on top of eachother, but AI messed everything up.
I am adding more text to my website.
Uhm, there are some things wrong in my code, but at least I am taking steps forward.
Fixed some mistakes and now I am trying to get the colour palette to look better and change some other things.
I added more CSS, but I’m having troubles pushing my code to github.
I added CSS, found a good colour palette, and now I have pictures :).
I’m trying to figure out how to add gifs and how to make the navigation bar look more like buttons and not links.
I have even more pictures, and my website will be done soon, but the items move depeding on how big the window is, I’m trying to figure out how to fix it, and if anyone can help, please let me know.
I am trying to make the items shrink and get bigger depending on the window size.
I don’t actually mind these pictures shifting around but I do need to fix some other positions of pictures.
my website really does not want to cooperate with me.
Just made a couple edits to the projects box, and fixed some sizes
Ships:
I made a personal website about myself. It was very challenging to get the CSS right, because it really didn’t want to cooperate with me, and thats also why it took so long. I’m proud that I finally completed it. The website will help you get to know me better....
|
1793317927.2203395
|
1793404327.2203395
|
|
53439
|
slacky by @Kabeer-M | Stardance
|
Kabeer-M
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T20:38:36Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So hey I created this slack bot and named it slackyy. I don’t want it slacking off but it does. It pulls ISS location in real time, Astrononmy picture of the day and also tells a cat fact", "repo": "https://github.com/thedev-k/slackyy", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 53342, "ts": "202 [{"post_id": 53342, "ts": "2026-08-23T20:35:36Z", "hours": 0.2611, "text": "Created slackyy. I worked on the project before but didn’t get nest approval now I got it so here it is. Its working and there are many commands"}]...
|
Title: slacky by @Kabeer-M | Stardance
Devlogs:
C Title: slacky by @Kabeer-M | Stardance
Devlogs:
Created slackyy. I worked on the project before but didn’t get nest approval now I got it so here it is. Its working and there are many commands
Ships:
So hey I created this slack bot and named it slackyy. I don’t want it slacking off but it does. It pulls ISS location in real time, Astrononmy picture of the day and also tells a cat fact...
|
1793407746.914237
|
1793494146.914237
|
|
49434
|
Gravity Simulator by @AccidentalGenius | Stardance
|
AccidentalGenius
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T19:46:54Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a simple gravity simulator where the user can visualize the effects of gravity on a celestial body.", "repo": "https://github.com/AccidentallyGenius/GravitySimulator", "demo": "https://github.com/AccidentallyGenius/GravitySimulator/releases/tag/v1"}]...
|
[{"post_id": 48771, "ts": "202 [{"post_id": 48771, "ts": "2026-08-17T09:33:05Z", "hours": 4.0617, "text": "This is my first hackclub project, so I wanted to challenge myself a little bit by combining aspects from two of my high school classes, physics, and compsci. I made this whole thing in 2 sessions, so it’s a little rough around the edges."}]...
|
Title: Gravity Simulator by @AccidentalGenius | St Title: Gravity Simulator by @AccidentalGenius | Stardance
Devlogs:
This is my first hackclub project, so I wanted to challenge myself a little bit by combining aspects from two of my high school classes, physics, and compsci. I made this whole thing in 2 sessions, so it’s a little rough around the edges.
Ships:
This is a simple gravity simulator where the user can visualize the effects of gravity on a celestial body....
|
1793479908.4182374
|
1793566308.4182374
|
|
24732
|
CapyOS by @viivi | Stardance
|
viivi
|
2
|
11.0
|
24
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T18:51:40Z", "hours": 4.0, "multiplier": 5.52, "payout": 24, "blessing": "neutral", "text": "CapyOS This is just a silly project made just for fun! CapyOS is a capybara-themed web operating system. I followed WebOS 1 mission to build core features and for WebOS 2 I added 2 new apps, fixed full screen mode and made app menu scrollable. I also did some polishing for the UI and added “clear windows” -button. This was my first time building a website with pure html, javascript and css for a long time. I had a lot of fun designing while adding all those capybaras you will find when you test it! I accidentally used over 7hr with mission 1 because I had so much fun and I love to adjust small things little bit better. Also because this project was made just for fun, I didn’t have much pressure to make this “good” or “serious”. It’s still 100% (hopefully) working. Have fun while testing! More details in readme.", "repo": "https://github.com/ViLP357/WebOS-Stardance", "demo": "https://vilp357.github.io/WebOS-Stardance/"}, {"ship_num": 2, "ts": "2026-07-05T15:43:20Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Here is my project for WebOS 1: CapyOS. A capybara themed WebOs using HTML, JavaScript and CSS. Capybaras are cute chill guys. So why not to make a capybara themed WebOS? This isn’t supposed to be a very serious project. I took the right to make it kinda silly. But at the same time it’s an actual web app and you could go to play around with it right now (link: https://vilp357.github.io/WebOS-Stardance/ )! It’n not very complex yet, but I’ve planned to continue to WebOS 2 mission to finish what I’ve started (nothing is stopping me, hahaa). My own features: scrollable app menu (when it has more icons it’s actually scrollable). I don’t like my desktop being covered in icons, so this way icons will stay on the left side forever. fullscreen button. This one works best when there is only one window. Otherwise it might work, let’s say, in a different way. Before starting this project I was already familiar with HTML and CSS, but I wasn’t that familiar with plain JavaScript. I think that I learned most about coding webpages with JavaScript and I feel confident continuing to WebOS 2.", "repo": "https://github.com/ViLP357/WebOS-Stardance", "demo": "https://vilp357.github.io/WebOS-Stardance/"}]...
|
[{"post_id": 53271, "ts": "202 [{"post_id": 53271, "ts": "2026-08-23T18:38:17Z", "hours": 1.8197, "text": "#7 devlog Probably the last devlog for this project. CapyOS is now ready for shipping. Sorry for last devlog, I just wan’t to get these hours logged. The last feature I added was a timer. Its icon is, of course, caybara-themed."}, {"post_id": 43341, "ts": "2026-08-08T15:17:31Z", "hours": 2.4578, "text": "#6 devlog, webOS 2 Some updates A new app: a gallery for viewing cute capybara photos Full screen button works now, it aligns the window perfectly every time now. (It required actually only 2 new lines in to script!) A new scrollbar in the app menu with a green theme. I added extra icons so that the scrollbar can be tested"}, {"post_id": 22903, "ts": "2026-07-05T15:23:00Z", "hours": 0.4181, "text": "#5 devlog The final site (after webos 1). I’m going to ship it now!"}, {"post_id": 22275, "ts": "2026-07-04T17:36:45Z", "hours": 3.9961, "text": "#4 devlog I think I’ve completed part 5 now. I still have to finish readme and deploy this and the ship. This will actually be my first ship!! I’ve already planned things to do in WebOS 2 (and I actually started doing them). The new app I created in part 5 is link app because I often forget important websites and the app is a place to store links for those sites."}, {"post_id": 17881, "ts": "2026-06-28T20:22:06Z", "hours": 1.4325, "text": "#3 devlog Working on my WebOS. Today I completed part 3 which means that the welcome window is closeable and openable. I hope to finish WebOS 1 soon. Looking forward to make a new app next time :)"}, {"post_id": 16462, "ts": "2026-06-26T20:07:23Z", "hours": 1.0678, "text": "#2 devlog Part 2 done. I decided that my WebOS will be CapyOS so more of capybaras coming. I’m very happy with the navbar I made and I’ll update it later. I think it already looks really cool."}, {"post_id": 14528, "ts": "2026-06-23T17:50:38Z", "hours": 0.4672, "text": "#1 devlog Today I started making my own WebOS using the tutorial. There was nothing new to me but had fun with playing the elements. I don’t have any special plans for this project but hopefully I end making something (at least little bit) useful."}]...
|
Title: CapyOS by @viivi | Stardance
Devlogs:
#1 d Title: CapyOS by @viivi | Stardance
Devlogs:
#1 devlog Today I started making my own WebOS using the tutorial. There was nothing new to me but had fun with playing the elements. I don’t have any special plans for this project but hopefully I end making something (at least little bit) useful.
#2 devlog Part 2 done. I decided that my WebOS will be CapyOS so more of capybaras coming. I’m very happy with the navbar I made and I’ll update it later. I think it already looks really cool.
#3 devlog Working on my WebOS. Today I completed part 3 which means that the welcome window is closeable and openable. I hope to finish WebOS 1 soon. Looking forward to make a new app next time :)
#4 devlog I think I’ve completed part 5 now. I still have to finish readme and deploy this and the ship. This will actually be my first ship!! I’ve already planned things to do in WebOS 2 (and I actually started doing them). The new app I created in part 5 is link app because I often forget important websites and the app is a place to store links for those sites.
#5 devlog The final site (after webos 1). I’m going to ship it now!
#6 devlog, webOS 2 Some updates A new app: a gallery for viewing cute capybara photos Full screen button works now, it aligns the window perfectly every time now. (It required actually only 2 new lines in to script!) A new scrollbar in the app menu with a green theme. I added extra icons so that the scrollbar can be tested
#7 devlog Probably the last devlog for this project. CapyOS is now ready for shipping. Sorry for last devlog, I just wan’t to get these hours logged. The last feature I added was a timer. Its icon is, of course, caybara-themed.
Ships:
Here is my project for WebOS 1: CapyOS. A capybara themed WebOs using HTML, JavaScript and CSS. Capybaras are cute chill guys. So why not to make a capybara themed WebOS? This isn’t supposed to be a very serious project. I took the right to make it kinda silly. But at the same time it’s an actual web app and you could go to play around with it right now (link: https://vilp357.github.io/WebOS-Stardance/ )! It’n not very complex yet, but I’ve planned to continue to WebOS 2 mission to finish what I’ve started (nothing is stopping me, hahaa). My own features: scrollable app menu (when it has more icons it’s actually scrollable). I don’t like my desktop being covered in icons, so this way icons will stay on the left side forever. fullscreen button. This one works best when there is only one window. Otherwise it might work, let’s say, in a different way. Before starting this project I was already familiar with HTML and CSS, but I wasn’t that familiar with plain JavaScript. I think that I learned most about coding webpages with JavaScript and I feel confident continuing to WebOS 2.
CapyOS This is just a silly project made just for fun! CapyOS is a capybara-themed web operating system. I followed WebOS 1 mission to build core features and for WebOS 2 I added 2 new apps, fixed full screen mode and made app menu scrollable. I also did some polishing for the UI and added “clear windows” -button. This was my first time building a website with pure html, javascript and css for a long time. I had a lot of fun designing while adding all those capybaras you will find when you test it! I accidentally used over 7hr with mission 1 because I had so much fun and I love to adjust small things little bit better. Also because this project was made just for fun, I didn’t have much pressure to make this “good” or “serious”. It’s still 100% (hopefully) working. Have fun while testing! More details in readme....
|
1793544948.0115628
|
1793631348.0115628
|
|
52547
|
Python Cashier System by @M_Lasheen | Stardance
|
M_Lasheen
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T18:49:27Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Built a terminal cashier system in Python that takes product orders, validates inputs, applies a 15% discount, and prints an ASCII receipt. The hardest part was fixing the input validation loop — I kept crashing the program by putting input() outside the while loop and had to rewrite the whole function. Honestly most proud of the receipt formatting, seeing those = borders line up perfectly in the terminal was super satisfying. To test it, just run python Register.py in your terminal and follow the prompts.", "repo": "https://github.com/Lasheen7/Register", "demo": "https://github.com/Lasheen7/Register/raw/refs/heads/main/Cashier_Vid.mp4"}]...
|
[{"post_id": 53263, "ts": "202 [{"post_id": 53263, "ts": "2026-08-23T18:27:20Z", "hours": 3.555, "text": "Finally finished my cashier system after way too many hours of fighting with Python. The input validation absolutely broke me — I kept testing with random inputs like “thy” or “56” and the program would either crash or loop forever because I accidentally put the input() call outside the while loop. Had to rewrite the whole choose_product() function from scratch which was annoying but it actually works perfectly now.The ASCII receipt at the end was way more fun to build though. I added a 15% discount and got everything formatting properly in EGP. Seeing those = borders line up in the terminal after buying meat, rice, and salt was weirdly satisfying.Screen recording below shows the full flow including all the invalid input handling and the final receipt. Project is basically done and I’m way too tired to touch it again lol."}]...
|
Title: Python Cashier System by @M_Lasheen | Stard Title: Python Cashier System by @M_Lasheen | Stardance
Devlogs:
Finally finished my cashier system after way too many hours of fighting with Python. The input validation absolutely broke me — I kept testing with random inputs like “thy” or “56” and the program would either crash or loop forever because I accidentally put the input() call outside the while loop. Had to rewrite the whole choose_product() function from scratch which was annoying but it actually works perfectly now.The ASCII receipt at the end was way more fun to build though. I added a 15% discount and got everything formatting properly in EGP. Seeing those = borders line up in the terminal after buying meat, rice, and salt was weirdly satisfying.Screen recording below shows the full flow including all the invalid input handling and the final receipt. Project is basically done and I’m way too tired to touch it again lol.
Ships:
Built a terminal cashier system in Python that takes product orders, validates inputs, applies a 15% discount, and prints an ASCII receipt. The hardest part was fixing the input validation loop — I kept crashing the program by putting input() outside the while loop and had to rewrite the whole function. Honestly most proud of the receipt formatting, seeing those = borders line up perfectly in the terminal was super satisfying. To test it, just run python Register.py in your terminal and follow the prompts....
|
1793476316.7525914
|
1793562716.7525914
|
|
51566
|
jarvis by @mr_kn5196 | Stardance
|
mr_kn5196
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T18:48:12Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made my very own slack bot-jarvis , the coding was actually not tht hard , the hardest part was waiting for my nest application to get approved lol . i hope it works properly cause i have been waiting forever to finish this now i shd start studying for the phy test i have tmrw i still have few hrs left byeee", "repo": "https://github.com/Nitish5196/SlackBot-Jarvis", "demo": "https://app.slack.com/client/E09V59WQY1E/C0BS4BYMNV8?skip_today=1"}]...
|
[{"post_id": 50945, "ts": "202 [{"post_id": 50945, "ts": "2026-08-20T12:38:17Z", "hours": 0.3439, "text": "finally completed jarvis .😋😋"}, {"post_id": 50487, "ts": "2026-08-19T17:28:14Z", "hours": 1.6011, "text": "ERRORSSS ERRORSSSSSSS ERRORSSS AHHHHH"}]...
|
Title: jarvis by @mr_kn5196 | Stardance
Devlogs:
Title: jarvis by @mr_kn5196 | Stardance
Devlogs:
ERRORSSS ERRORSSSSSSS ERRORSSS AHHHHH
finally completed jarvis .😋😋
Ships:
i made my very own slack bot-jarvis , the coding was actually not tht hard , the hardest part was waiting for my nest application to get approved lol . i hope it works properly cause i have been waiting forever to finish this now i shd start studying for the phy test i have tmrw i still have few hrs left byeee...
|
1793508987.6279488
|
1793595387.6279488
|
|
51486
|
WebPersonal by @meroquixel | Stardance
|
meroquixel
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T18:20:05Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "It is my personal website. For now, it has some lack of information and decorated simply.", "repo": "https://github.com/umaar1104/WebPersonal", "demo": "https://umaar1104.github.io/WebPersonal/"}]...
|
[{"post_id": 53209, "ts": "202 [{"post_id": 53209, "ts": "2026-08-23T17:29:39Z", "hours": 2.5225, "text": "Big changes on colors and decoration. It is almost done."}, {"post_id": 52523, "ts": "2026-08-22T17:59:23Z", "hours": 1.0517, "text": "This is my starter personal website so far."}]...
|
Title: WebPersonal by @meroquixel | Stardance
Dev Title: WebPersonal by @meroquixel | Stardance
Devlogs:
This is my starter personal website so far.
Big changes on colors and decoration. It is almost done.
Ships:
It is my personal website. For now, it has some lack of information and decorated simply....
|
1793501532.1644301
|
1793587932.1644301
|
|
50366
|
TARS by @ravioli | Stardance
|
ravioli
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T18:09:30Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This project comes from my love for films and ai. Its a representation of one of the best robots on screen, this is a very basic framework, much more is to come", "repo": "https://github.com/ravioliiii665/TARS-Slack-Bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 53243, "ts": "202 [{"post_id": 53243, "ts": "2026-08-23T18:04:22Z", "hours": 0.7711, "text": "Finally made and shipped TARS, llm integration was a pain and still need to fine tune the responses, but this is a good start."}]...
|
Title: TARS by @ravioli | Stardance
Devlogs:
Fina Title: TARS by @ravioli | Stardance
Devlogs:
Finally made and shipped TARS, llm integration was a pain and still need to fine tune the responses, but this is a good start.
Ships:
This project comes from my love for films and ai. Its a representation of one of the best robots on screen, this is a very basic framework, much more is to come...
|
1793522916.6594727
|
1793609316.6594727
|
|
47476
|
weather-app by @Anishhh | Stardance
|
Anishhh
|
1
|
4.74
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T18:06:11Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a browser-based weather app built with plain HTML, CSS and JavaScript, using the free Open-Meteo API for live weather data. Users can search any city by name or allow browser geolocation to instantly see their local conditions like temp, sky description and wind speed. Once location is allow, the app calculates the closest cities from a curated list using the haversine distance formula and displays them as an animated, scrollable row of clickable chips for quick switching. The UI features a glassmorphic card design, a animated gradient background, and smooth hover and entrance transitions throughout, giving the interface a modern, polished feel despite its lightweight dependency-free codebase.", "repo": "https://github.com/damn-anish/weather-app/", "demo": "https://damn-anish.github.io/weather-app/"}]...
|
[{"post_id": 54655, "ts": "202 [{"post_id": 54655, "ts": "2026-08-25T18:05:33Z", "hours": 0.7419, "text": "Made changes in CSS since they flagged it as AI made, i worked on it and made a better “NON AI LOOKING” view. Hope you find it cool"}, {"post_id": 53236, "ts": "2026-08-23T17:57:20Z", "hours": 1.1889, "text": "hey guys, this is a simple but useful weather app that i made using html, java script and CSS for designs. It uses your current location for your umm weather updates and it also use api. I know it’s not a unique or like extra-ordinary thing but it’s great, hope you like it :D"}, {"post_id": 52933, "ts": "2026-08-23T09:43:32Z", "hours": 2.8181, "text": "Building a weather-app which uses your location and API to get real time weather forecast of your city. i know it’s not a very new or unique thing to build but still i tried to make it more user-friendly by providing the GET YOUR LOCATION button, still it is not a very unique concept yet i tried my best for the appearance hehe, hope you like it :D"}]...
|
Title: weather-app by @Anishhh | Stardance
Devlog Title: weather-app by @Anishhh | Stardance
Devlogs:
Building a weather-app which uses your location and API to get real time weather forecast of your city. i know it’s not a very new or unique thing to build but still i tried to make it more user-friendly by providing the GET YOUR LOCATION button, still it is not a very unique concept yet i tried my best for the appearance hehe, hope you like it :D
hey guys, this is a simple but useful weather app that i made using html, java script and CSS for designs. It uses your current location for your umm weather updates and it also use api. I know it’s not a unique or like extra-ordinary thing but it’s great, hope you like it :D
Made changes in CSS since they flagged it as AI made, i worked on it and made a better “NON AI LOOKING” view. Hope you find it cool
Ships:
This is a browser-based weather app built with plain HTML, CSS and JavaScript, using the free Open-Meteo API for live weather data. Users can search any city by name or allow browser geolocation to instantly see their local conditions like temp, sky description and wind speed. Once location is allow, the app calculates the closest cities from a curated list using the haversine distance formula and displays them as an animated, scrollable row of clickable chips for quick switching. The UI features a glassmorphic card design, a animated gradient background, and smooth hover and entrance transitions throughout, giving the interface a modern, polished feel despite its lightweight dependency-free codebase....
|
1793332602.3236835
|
1793419002.3236835
|
|
53253
|
space by @mr_kn5196 | Stardance
|
mr_kn5196
|
1
|
2.26
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:55:23Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made the NASA APOD , where you can select the date to see the Astronomy Picture Of the Day or you can click the Randomizer button if you’re too lazy to choose a date. the cool saturn V from the Appolo Program launches when you reload the page", "repo": "https://github.com/Nitish5196/Nasa-website", "demo": "https://nitish5196.github.io/Nasa-website/"}]...
|
[{"post_id": 53730, "ts": "202 [{"post_id": 53730, "ts": "2026-08-24T12:17:18Z", "hours": 0.2642, "text": "made a few changes"}, {"post_id": 53230, "ts": "2026-08-23T17:48:37Z", "hours": 0.2556, "text": "i think its done"}, {"post_id": 53179, "ts": "2026-08-23T16:50:05Z", "hours": 0.5442, "text": "errorss again"}, {"post_id": 53135, "ts": "2026-08-23T15:48:58Z", "hours": 0.7444, "text": "finally done with the guide, now i shd add my personal touch to it"}, {"post_id": 53030, "ts": "2026-08-23T12:42:02Z", "hours": 0.4683, "text": "hmm"}]...
|
Title: space by @mr_kn5196 | Stardance
Devlogs:
h Title: space by @mr_kn5196 | Stardance
Devlogs:
hmm
finally done with the guide, now i shd add my personal touch to it
errorss again
i think its done
made a few changes
Ships:
i made the NASA APOD , where you can select the date to see the Astronomy Picture Of the Day or you can click the Randomizer button if you’re too lazy to choose a date. the cool saturn V from the Appolo Program launches when you reload the page...
|
1793321630.4791658
|
1793408030.4791658
|
|
49988
|
Practice 2D Platformer by @RedstoneStar | Stardanc Practice 2D Platformer by @RedstoneStar | Stardance...
|
RedstoneStar
|
1
|
84.71
|
144
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:45:37Z", "hours": 42.0, "multiplier": 3.64, "payout": 144, "blessing": "neutral", "text": "This is my simple 2d platformer. Before making this project I knew very little about coding in Python so I wanted to work on this project to fix that. In the past I’ve used a bunch of YouTube tutorials to teach me how to code so this time I wanted to try something different. I created a custom Gemini gem that walked me step by step through creating the base game, then helped me add on improvements such as enemies and moving platforms. Key Features: Smooth platforming: Precise movement tracking keeps the character steady on moving platforms without slipping. Varied movement: Double jumps, wall slides, wall jumps, and a dash move to smash weak blocks. Animations: Squish-and-stretch effects when jumping and landing give the character extra feel. Smart enemies: Jumping enemies detect edges and turn around instead of walking off ledges. 10-levels: Includes built-in tutorial prompts to teach new moves as the player progresses. I know the game is really simple, and that is mostly on purpose; this was meant to be just a fun way to practice my Python skills. Hope you enjoy!", "repo": "https://github.com/RedstoneStar/Practice2DPlatformer", "demo": "https://redstonestar.github.io/Practice2DPlatformer/"}]...
|
[{"post_id": 63961, "ts": "202 [{"post_id": 63961, "ts": "2026-09-08T01:41:23Z", "hours": 27.6347, "text": "Devlog #6 After far more hours of debugging than I care to admit, I finally figured out why the springs didn’t launch the player when they walked through the spring. I eventually figured out it was an issue caused by how I was applying the upward momentum. Main changes in this update: Updated graphics. Slightly improved the performance by condensing some logic code Added a new flying enemy. Added 5 new levels. Improved the previous 10 levels to make them more interesting. Problems still needing to be fixed: The flying enemy is having graphical glitches with its charging animation."}, {"post_id": 61832, "ts": "2026-09-04T22:48:48Z", "hours": 15.0753, "text": "Devlog #5 for my simple 2D platformer Since I started this project I feel like I have gotten so much better at Python and because of that, I’ve spent the last couple of days rewriting pretty much all of the core mechanics of the platformer. Pretty much all of the code that Gemini helped me develop and then improve over time I have now recoded and as a result, the program runs so much smoother. Other changes: I fixed one bug where the player wouldn’t move with moving platforms, so now the player should (hopefully) move with the platform as well as be much less glitchy when mounting or dismounting it. I also added a few particles for when the player dashes and lands on objects. I’m still trying to figure out why the player doesn’t get launched when they walk over the springs, hopefully I’ll have that figured out by my next devlog."}, {"post_id": 53210, "ts": "2026-08-23T17:29:52Z", "hours": 11.5417, "text": "Final devlog of the simple 2D platformer! I improved the pixel art and revamped the levels. The first 3 levels are dedicated to teaching the player the controls. I also added support to deploy it online."}, {"post_id": 52514, "ts": "2026-08-22T17:36:28Z", "hours": 11.165, "text": "4th devlog for my simple platformer. I added a couple more levels, currently they are way to hard, I will have to revisit them in the future. On top of that I added a sprint feature to the player. I also spent some more time on the graphics."}, {"post_id": 50708, "ts": "2026-08-20T01:14:37Z", "hours": 7.9364, "text": "3rd devlog of this practice project! Added super simple enemies, a simple level creation option in the setting script, spikes, and better camera follow movement."}, {"post_id": 49974, "ts": "2026-08-19T00:00:03Z", "hours": 9.2581, "text": "Added a few improvements to the platformer game. The camera now scrolls along with the player; I added collectable coins and a coin counter, and made it so that the player respawns when they fall off the platform."}, {"post_id": 48554, "ts": "2026-08-17T00:16:03Z", "hours": 2.3539, "text": "Just finished my first practice platformer. It is super simple, which was intended. I didn’t want it to be anything complicated, just some simple python practice."}]...
|
Title: Practice 2D Platformer by @RedstoneStar | S Title: Practice 2D Platformer by @RedstoneStar | Stardance
Devlogs:
Just finished my first practice platformer. It is super simple, which was intended. I didn’t want it to be anything complicated, just some simple python practice.
Added a few improvements to the platformer game. The camera now scrolls along with the player; I added collectable coins and a coin counter, and made it so that the player respawns when they fall off the platform.
3rd devlog of this practice project! Added super simple enemies, a simple level creation option in the setting script, spikes, and better camera follow movement.
4th devlog for my simple platformer. I added a couple more levels, currently they are way to hard, I will have to revisit them in the future. On top of that I added a sprint feature to the player. I also spent some more time on the graphics.
Final devlog of the simple 2D platformer! I improved the pixel art and revamped the levels. The first 3 levels are dedicated to teaching the player the controls. I also added support to deploy it online.
Devlog #5 for my simple 2D platformer Since I started this project I feel like I have gotten so much better at Python and because of that, I’ve spent the last couple of days rewriting pretty much all of the core mechanics of the platformer. Pretty much all of the code that Gemini helped me develop and then improve over time I have now recoded and as a result, the program runs so much smoother. Other changes: I fixed one bug where the player wouldn’t move with moving platforms, so now the player should (hopefully) move with the platform as well as be much less glitchy when mounting or dismounting it. I also added a few particles for when the player dashes and lands on objects. I’m still trying to figure out why the player doesn’t get launched when they walk over the springs, hopefully I’ll have that figured out by my next devlog.
Devlog #6 After far more hours of debugging than I care to admit, I finally figured out why the springs didn’t launch the player when they walked through the spring. I eventually figured out it was an issue caused by how I was applying the upward momentum. Main changes in this update: Updated graphics. Slightly improved the performance by condensing some logic code Added a new flying enemy. Added 5 new levels. Improved the previous 10 levels to make them more interesting. Problems still needing to be fixed: The flying enemy is having graphical glitches with its charging animation.
Ships:
This is my simple 2d platformer. Before making this project I knew very little about coding in Python so I wanted to work on this project to fix that. In the past I’ve used a bunch of YouTube tutorials to teach me how to code so this time I wanted to try something different. I created a custom Gemini gem that walked me step by step through creating the base game, then helped me add on improvements such as enemies and moving platforms. Key Features: Smooth platforming: Precise movement tracking keeps the character steady on moving platforms without slipping. Varied movement: Double jumps, wall slides, wall jumps, and a dash move to smash weak blocks. Animations: Squish-and-stretch effects when jumping and landing give the character extra feel. Smart enemies: Jumping enemies detect edges and turn around instead of walking off ledges. 10-levels: Includes built-in tutorial prompts to teach new moves as the player progresses. I know the game is really simple, and that is mostly on purpose; this was meant to be just a fun way to practice my Python skills. Hope you enjoy!...
|
1792878437.9511604
|
1793742437.9511604
|
|
26499
|
Size Matters by @Gabriel_ | Stardance
|
Gabriel_
|
1
|
17.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:44:57Z", "hours": 17.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So i made a simple 2D plataformer where u need to shrink and grow your character, the most dificult parts was coming up with the idea but then the mechanics and other levels where very simple to make. I made a simpler game because im learning Godot and trying to make cool stuff. To play just go to the itch.io page and run it! If u want u can download it from the repo. I hope u enjoy it, thanks.", "repo": "https://github.com/Gplayer128/Size_Matters", "demo": "https://toasty-sandwich.itch.io/size-matters"}]...
|
[{"post_id": 53177, "ts": "202 [{"post_id": 53177, "ts": "2026-08-23T16:48:51Z", "hours": 13.0411, "text": "Another level and a pause menu"}, {"post_id": 47064, "ts": "2026-08-14T18:01:47Z", "hours": 3.3639, "text": "Secret level and an in game menu"}, {"post_id": 42761, "ts": "2026-08-07T17:14:32Z", "hours": 1.0456, "text": "Menus and stuff"}]...
|
Title: Size Matters by @Gabriel_ | Stardance
Devl Title: Size Matters by @Gabriel_ | Stardance
Devlogs:
Menus and stuff
Secret level and an in game menu
Another level and a pause menu
Ships:
So i made a simple 2D plataformer where u need to shrink and grow your character, the most dificult parts was coming up with the idea but then the mechanics and other levels where very simple to make. I made a simpler game because im learning Godot and trying to make cool stuff. To play just go to the itch.io page and run it! If u want u can download it from the repo. I hope u enjoy it, thanks....
|
1792875265.4038615
|
1793739265.4038615
|
|
28913
|
Hydromind-X by @Mrdark | Stardance
|
Mrdark
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:37:04Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "HydroMind-X is a smart water intelligence and continuous-auditing platform for sustainable data centers. It fuses live IoT sensor readings — temperature, humidity, water level, water flow and reservoir status — with weather forecasts to compute a single, easy-to-read Water Availability Index (WAI) from 0 to 100. Adjust the sliders above to simulate any environmental scenario and watch the index and the AI recommendations update instantly. As water becomes scarce, HydroMind-X automatically selects a more conservative cooling strategy, prioritizes critical workloads such as hospitals and emergency services, delays flexible tasks like model training, and maximizes recycled water use — then captures the whole decision as a downloadable audit report.", "repo": "https://github.com/anbu2203/Hydromind-x.com", "demo": ""}]...
|
[{"post_id": 53217, "ts": "202 [{"post_id": 53217, "ts": "2026-08-23T17:36:13Z", "hours": 1.0667, "text": "I completely thought of a new idea and built it"}]...
|
Title: Hydromind-X by @Mrdark | Stardance
Devlogs Title: Hydromind-X by @Mrdark | Stardance
Devlogs:
I completely thought of a new idea and built it
Ships:
HydroMind-X is a smart water intelligence and continuous-auditing platform for sustainable data centers. It fuses live IoT sensor readings — temperature, humidity, water level, water flow and reservoir status — with weather forecasts to compute a single, easy-to-read Water Availability Index (WAI) from 0 to 100. Adjust the sliders above to simulate any environmental scenario and watch the index and the AI recommendations update instantly. As water becomes scarce, HydroMind-X automatically selects a more conservative cooling strategy, prioritizes critical workloads such as hospitals and emergency services, delays flexible tasks like model training, and maximizes recycled water use — then captures the whole decision as a downloadable audit report....
|
1793404290.3438368
|
1793490690.3438368
|
|
53342
|
Git Finder by @RajanKC | Stardance
|
RajanKC
|
1
|
3.0
|
15
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:35:10Z", "hours": 3.0, "multiplier": 4.67, "payout": 15, "blessing": "neutral", "text": "Completed the project I made this project without any Ai Please rate this project good", "repo": "https://github.com/RajanKCKC/Git-Finer", "demo": "https://rajankckc.github.io/Git-Finer/"}]...
|
[{"post_id": 53204, "ts": "202 [{"post_id": 53204, "ts": "2026-08-23T17:17:52Z", "hours": 0.2556, "text": "Update README.md to include detailed project description, features, and usage instructions"}, {"post_id": 53171, "ts": "2026-08-23T16:45:08Z", "hours": 0.7875, "text": "Add main functionality for GitHub User Finder; implement user search and repository display"}, {"post_id": 53136, "ts": "2026-08-23T15:49:28Z", "hours": 1.3044, "text": "Update index.html title and structure; add initial style.css for layout and design"}, {"post_id": 53081, "ts": "2026-08-23T14:29:42Z", "hours": 0.9025, "text": "Add initial HTML structure for GitHub User Finder"}]...
|
Title: Git Finder by @RajanKC | Stardance
Devlogs Title: Git Finder by @RajanKC | Stardance
Devlogs:
Add initial HTML structure for GitHub User Finder
Update index.html title and structure; add initial style.css for layout and design
Add main functionality for GitHub User Finder; implement user search and repository display
Update README.md to include detailed project description, features, and usage instructions
Ships:
Completed the project I made this project without any Ai Please rate this project good...
|
1793328564.1331224
|
1793414964.1331224
|
|
34098
|
Rust 6502 by @Wirenux | Stardance
|
Wirenux
|
3
|
74.0
|
1354
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:19:09Z", "hours": 7.0, "multiplier": 18.98, "payout": 127, "blessing": "neutral", "text": "Rust 6502 A MOS 6502 emulator TUI with a lot of features Before reading this Ship you should take a look at Ship 1 & Ship 2 What did you add ? Here is a list of everything that I have added since the last Ship Features Breakpoints : press “F” to set a breakpoint at any address, the emulator halts the moment PC reaches it Watchpoints : same idea, but for memory Conditional Breakpoints : halt execution when a register (AC, XR, YR, SP) meets a comparison (!=, ==, >=, <=, >, <) against a target value Step Back : press “B” to rewind execution one instruction at a time, restoring the CPU and memory exactly as they were before Random Number Generator : a memory-mapped register at $BFF3 that returns a random byte from the host PC on every read, so ASM programs can have real random number Keybind Panel : a popup listing every keyboard shortcut and control, and removed the old footer keybind list to make room for it Demo Program Snake : updated to pull apple placement from the new RNG instead of the old pseudo random method ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What was challenging ? Wiring the conditional breakpoint into the run loop without breaking the existing breakpoint/watchpoint checks was harder than I though. Also getting a dropdown-style menu to choose the operator working in Ratatui was tought since there’s no native dropdown widget. So I ended up building a little spinner (▲ value ▼) that cycles through the operators instead ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What are you proud of ? I’m proud that my emulator now has real debugging tools like : breakpoints, watchpoints, conditional breakpoints, and step-back. What should people know so they can test your project ? A Nerd Font is recommended in your terminal for a better rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! Things to try Load snake_demo.bin and play :D Set a breakpoint on an address inside a demo program (check the keybind panel for the shortcut!) and watch execution halt exactly there Try a conditional breakpoint : for example, halt whenever XR == 0F and watch it stop right when the register hits that value Press “B” to step backward and rewind the CPU state instruction by instruction Press the keybind panel shortcut to see the full list of controls", "repo": "https://github.com/wirenux/Rust-6502", "demo": "https://crates.io/crates/rust6502"}, {"ship_num": 2, "ts": "2026-08-08T15:59:06Z", "hours": 28.0, "multiplier": 17.86, "payout": 504, "blessing": "neutral", "text": "=== Rust 6502 === A MOS 6502 emulator TUI with a lot of features ============================================ Before reading this Ship you should take a look at Ship #1 == What did you add ? == Here is a list of everything that I have added since the last Ship = Features = Serial Monitor : you connect to localhost:8080 using netcat. Useful for the Apple 1 OS or for debugging with text. The monitor can be used to display text but also to send text like a keyboard (useful for the Apple 1 OS) PS/2 Keyboard : a full PS/2 keyboard emulation (used in Snake) Use the UI with a Mouse: On the Home Menu and in the Emulator you can click on button, toggle, scroll, etc… Interrupt : IRQ & NMI Tips in the Settings Panel Modify speed with Hz & MHz (like a real 6502 chip) Reset Vector: The emulator will look at $FFFC & $FFFD to find the start address of the program (when the Force Address toggle is off) Set PC Address: keyboard shortcut to change the position of the PC (Program Counter) = Demo Program = Apple 1 OS (Wozmon) : I have modified the orginal Apple 1 code to fit my emulator, like Serial Monitor address, Keyboard etc… Snake : Just the Snake game ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ Keyboard Demo: Print every key press on the screen using a custom font Serial Monitor Demo: Show how the Serial Monitor works == What was challenging ? == The most challenging part of this 2nd ship was creating a Serial Monitor that works via a local port, and making a PS/2 Keyboard emulation. And of course, modifying the Apple 1 OS to make it work on this emulator ! (I was having a lot of bugs, so I rewrite a big part of the OS) ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ == What are you proud of ? == I am really proud of my self for the implementation of the Serial monitor that run on different CPU thread than the emulator itself and the fact that it work via the local network. And beyond everything the fact that my emulator can run : games, utility and the Apple 1 OS !!! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io. == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: ================== cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load snake_demo.bin to play at a classic game using the 32x32 screen and the PS/2 keyboard emulation Load wozmon.bin to use the Apple 1 OS ! You should see the documentation related to Wozmon : https://github.com/wirenux/Rust-6502/blob/main/AppleI.md Load keyboard_demo.bin to see every key you press show up on the 32x32 screen using a custom font The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!", "repo": "https://github.com/wirenux/Rust-6502", "demo": "https://crates.io/crates/rust6502"}, {"ship_num": 3, "ts": "2026-07-23T16:03:44Z", "hours": 39.0, "multiplier": 19.83, "payout": 723, "blessing": "neutral", "text": "=== Rust 6502 === A legendary 8-bit CPU right in your terminal! 🦀 ᕙ( •̀ ᗜ •́ )ᕗ == What did you make ? == I built a fully functional emulator for the MOS 6502 (the microprocessor that powered the Apple II, Commodre 64, and the NES) from scratch using Rust ! Instead of a standard graphical window, I built a Terminal User Interface (TUI) using Ratatui. Here is what’s inside: Full CPU Emulation: Execute 6502 machine code with live register (AC, XR, YR, SP) and status flag tracking Virtual Screen: A 32x32 memory-mapped display ($0200-$05FF) rendered right in the terminal using Unicode Half-Block and a custom 16-color palette Live Disassembler & Hex Viewer: Watch the RAM change in real-time and see the raw binary machine code translated back into readable assembly instructions on the fly Built-in File Browser: A visual menu with Nerd Font icons to navigate your system and load compiled .bin ROMs Available on crates.io : You can download it via Cargo == What was challenging ? == The Disassembler: Writing a disassembler that parses raw .bin files is tricky because they don’t have headers. I ran into a massive issue where my image data (using the color byte $0A) was being read by the disassembler as infinite ASL A (Shift Left) instructions! I had to engineer a way for the disassembler to properly halt when it hit a BRK instruction so it wouldn’t try to execute my pixel art. Terminal UI Architecture: Designing a dashboard (hex grids, scrolling stacks, changing colors) required a really solid state-management architecture to keep the UI smooth and responsive while the CPU loop spins at thousands of instructions per second. == What are you proud of ? == I am proud of using this project to learn Rust in a fun way! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io, meaning anyone can install and run my emulator with a single command == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load hackclub_logo_demo.bin to see the terminal render a 32x32 pixel art logo using 6502 assembly Load rainbow_demo.bin to watch a shifting color gradient animation directly manipulating video memory. Load helloworld_demo.bin to watch a centered Hello world message The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!", "repo": "https://github.com/wirenux/Rust-6502", "demo": "https://crates.io/crates/rust6502"}]...
|
[{"post_id": 53188, "ts": "202 [{"post_id": 53188, "ts": "2026-08-23T17:01:36Z", "hours": 1.3231, "text": "+ 1h20 So… this might be the last devlog for this project. I just released the v1.3.0 . And here is what I added since the last devlog : A RNG documentation Snake now use a real RNG I recorded the Asciinema .cast file Update the python tools to generate memory diagrams Update the Memory documentation So next step is the 3rd Ship"}, {"post_id": 52497, "ts": "2026-08-22T17:18:02Z", "hours": 1.6328, "text": "+ 1h35 ! This might be the last feature I add to Rust 6502. Since I ran out of idea and for me the project seem to be finished. Anyway, here are the things I added : A RNG address : $BFF3 . The program just read from it and get a random value via the Host computer ( 4feb4d8 ) A conditional breakpoint : A top bar in the Breakpoint popup to add a conditional breakpoint (like : If AC != 0F -> Break) ( 1b7bc81 )"}, {"post_id": 51750, "ts": "2026-08-21T16:03:37Z", "hours": 1.4139, "text": "+1h 25 min ! Since the last time I have added the keybind panel. Where there is… all the keybinds I also remove the keybind on the footer to only get Keybind “K”"}, {"post_id": 48226, "ts": "2026-08-16T15:08:41Z", "hours": 0.8658, "text": "Okay so… I have added the Breakpoint and the Watchpoint . When you set the breakpoint to $C00C the CPU will stop before running the instruction at $C00C. The watchpoint stop if a value at an address at been changed."}, {"post_id": 47602, "ts": "2026-08-15T16:26:45Z", "hours": 0.8536, "text": "I added the step-back function. It work by pressing “B”, it’s just rewinding the emulator up to 500 opcode. Only work when moving in step-by-step mode (with Enter)"}, {"post_id": 45822, "ts": "2026-08-12T15:29:34Z", "hours": 0.5942, "text": "v1.2.0 Here are the changes attached to this release : fix: a bug on windows, with ghost key press ( c3c6009 ) add: a Scroll bar on the file explorer ( 94b2abb )"}, {"post_id": 43337, "ts": "2026-08-08T15:14:19Z", "hours": 0.2753, "text": "YAY Now rust6502 Version 1.1.0 is released ! On github with all the demo file and on crates.io / cargo !"}, {"post_id": 43315, "ts": "2026-08-08T14:47:20Z", "hours": 2.8169, "text": "Here is what I have done in 2h 50 . First I wrote a lot of docs, for the keyboard, Serial Monitor, Wozmon etc… This was so boring . But at least now I will be ready to ship soon ! Second, I have fixed the Wozmon list content of address. Before when you was doing FF00.FFFF it was just showing the byte at $FF00 and the byte at $FFFF now it list all the byte between !"}, {"post_id": 43203, "ts": "2026-08-08T10:26:46Z", "hours": 0.2706, "text": "New little update ! I have created a Python tools to create memory map for my emulator docs !"}, {"post_id": 43187, "ts": "2026-08-08T09:47:21Z", "hours": 0.5125, "text": "Little update ! I have added tips in the settings menu. The change randomly using the UNIX Epoch value"}, {"post_id": 42870, "ts": "2026-08-07T20:34:53Z", "hours": 0.6192, "text": "Little update, I added a Program Counter (PC) input to move it in when running a program. I also added a cursor for the start input on the Home Screen !"}, {"post_id": 42844, "ts": "2026-08-07T19:42:37Z", "hours": 1.9044, "text": "After 1h50 I have added a Snake demo program that use the PS/2 keyboard !!! I also make a demo program to test the Serial Monitor using netcat nc"}, {"post_id": 42206, "ts": "2026-08-06T20:22:37Z", "hours": 3.5697, "text": "Wow, just WOW. I have added a serial monitor, and Apple 1 OS Serial Monitor Here is the way the monitor work, you load character to $BFE0 like this : lda #'A' sta $BFE0 Then you run the program in the emulator like normal, then you open another terminal and you connect to localhost port 8080 using netcat nc like this : nc 127.0.0.1 8080 And now if you already launch the program, when you connect to localhost ( 127.0.0.1 is localhost) you will see a A in your terminal ! You can also type in the serial monitor ! Here is a code that show the number of characters typed by using the pixels in the 32x32 screen ! start: ldx #$FF txs ldx #$00 main_loop: bit $BFE1 bpl main_loop lda $BFE0 sta $BFE0 lda #WHITE_COLOR sta $0200, x inx jmp main_loop Apple 1 This is a very damn big part. To be short, I have recreated the Apple 1 OS (Wozmon) created by Steve Wozniak. In short I took the code given in the Apple 1 User Manual, modify it to use the Serial Monitor and Keyboard, fix some issue with the prompt. I can even run the classic program from the manual to print all the available characters. With Wozmon you can also write and read data from the memory so you can show some pixel on the screen ! Here is the program running and the serial monitor."}, {"post_id": 41544, "ts": "2026-08-05T20:29:50Z", "hours": 4.6692, "text": "Okay soo….. it’s been 4 hours and 35 minutes . I have done so much and not that much at the same time (I know it’s weird ) I have added a demo program who print the pressed character ! I have spend 2 hours on a little bug but yeah now it’s working ! So with the program I drew all the key on a PS/2 keyboard . I also fixed some little inattention problem in my code. I also created a little python script to help me convert .png drawing into raw .inc value ! ( Did you find the secret phrase ?)"}, {"post_id": 40862, "ts": "2026-08-04T17:37:24Z", "hours": 0.6206, "text": "Now there is all the number & lower case letter (a-z) & and the Space bar icon !"}, {"post_id": 40720, "ts": "2026-08-04T13:13:58Z", "hours": 0.6008, "text": "I want to create a ASM program who print the pressed key to the screen, and for that I need to create the font/image for each key. There is ~100 key . So here is the first one !"}, {"post_id": 40191, "ts": "2026-08-03T16:23:25Z", "hours": 2.2289, "text": "Wow that was… difficult . But now there is a PS/2 keyboard Emulation ! The I/O port is map on $BFF0-$BBF2. The PS/2 keyboard work with 3 addresses $BFF0 : KBD_DATA $BFF1 : KBD_STATUS $BFF2 : KBD_ACK To activate to keyboard in the emulator you can press on the screen container and to exit it just click anywhere else ! (The number you can see in the memory viewer at $0000 is the code from different key !) Maybe next time I will create a program to see each letter"}, {"post_id": 39675, "ts": "2026-08-02T20:07:26Z", "hours": 1.4747, "text": "YAY ! Now there is mouse control on the home screen, this mean that you can click every where to change the focus and in the file explorer you can double-click to open a folder and double-click to open a file directly, you can also with a simple click enable or disable Force Address Mode"}, {"post_id": 38319, "ts": "2026-07-31T17:15:48Z", "hours": 8.67, "text": "Ok so… it’s been 8h40 . I have done a lot (I mean it’s logic it’s been 8h and 40 minutes) In time order I have done : Replace self.pc + 1 to self.pc.wrapping_add(1) so it’s like on the real 6502 if the current PC is $FFFF and you add 1 it will be $0000 . Added a panic hook, before when the program was crashing (for a bad ASM program by example) the terminal was still in RAW mode (so if you click, move the mouse etc… it will print a bunch of garbage number) but now it exit the raw mode in a clean way ! Remove unused import Change the start of the Stack Pointer to $1FFF Added a memory reset function Write a bunch of test programs Replace IPS (instruction per seconds) by Hz and MHz like in real life (so i’ve adapted the UI for the change) Now the disassembler disassemble the whole program (neat right ? ) using .len() . (yes before it was an hard-coded number Optimize the screen render method. Before I was refreshing the screen even if nothings has been changed, now i check if somethings have been changed to update the screen Added address of each “quarter” of the screen in the screen documentation Fixed foreground and background color of the Frequency selector (on the Home Screen) Write a program to test IRQ and NMI Keybinds the I and N key to IRQ and NMI Changed the Hello World program to be rainbow The emulator will look by it self to the reset vector ( $FFFC and $FFFD ) to set the PC at the correct address Added a force address toggle to… force the the start address When the force addr toggle is off you can’t modify the start Addr and it’s darker Every file or folder who start by a . (dot) is not shown in the file selector Moved the hackclub logo raw binary data to a .inc file Added a self crashing test program (Next time I might add a PS/2 keyboard emulation… )"}, {"post_id": 33529, "ts": "2026-07-23T15:42:24Z", "hours": 0.2847, "text": "Last devlogs before Ship #1 Wow 37h of work. I have made an Asciinema video, Youtube video and update the README.md Wish me luck !"}, {"post_id": 33447, "ts": "2026-07-23T12:32:34Z", "hours": 0.8183, "text": "I have been writing a LOT of documentation on how to create a 6502 ASM program, Screen documentation. And the project is now published in version 1.0.0 on Github and Cargo https://github.com/wirenux/Rust-6502 https://crates.io/crates/rust6502"}, {"post_id": 33416, "ts": "2026-07-23T10:42:45Z", "hours": 0.8144, "text": "I have added a new program called HackClub Logo First, I have draw the hackclub logo in aseprite with a 32x32 pixel file using my custom color palette. Second, I have created a simple python script who take a .png in input and output ASM raw data for the image (using my color palette). Third, I have create a simple ASM program to print the logo on the screen !"}, {"post_id": 33164, "ts": "2026-07-22T20:28:05Z", "hours": 0.3019, "text": "WOW 35H 🎉 I have added a file : DemoProgram.md to show all the demo program"}, {"post_id": 33159, "ts": "2026-07-22T20:10:35Z", "hours": 3.8867, "text": "WOW 4h 😅 I have done the full README.md, documentation about the screen, color palette and fix some little bugs."}, {"post_id": 32560, "ts": "2026-07-21T20:27:52Z", "hours": 0.6103, "text": "Little bug fix: Now when we select a file in the Home File Selector the filename appear in the Opcode container. I have also reorganize the tui.rs code !"}, {"post_id": 32540, "ts": "2026-07-21T19:47:40Z", "hours": 0.3697, "text": "WOW already 30 hours ?! 😅 I now have added the home logo ! I also changed the step for the speed selection on Home Menu from 500 to 100 for each step"}, {"post_id": 32522, "ts": "2026-07-21T19:16:08Z", "hours": 2.0906, "text": "Wow that was damn hard 😭. But the Home Menu is finally here 🎉. There is the logo (might change). The select file container with full navigation (folder, parent directory, file), Icon (require a Nerd Font) and Colors. The selected file path update in real time with the absolute path of the file. The start address automatically change if the file selected is a demo file (end with “_demo.bin”) to $C000. The start address it editable with Alpha numeric character (hexadecimal). And the emulation speed work ! There is control on the footer bar."}, {"post_id": 32416, "ts": "2026-07-21T16:21:09Z", "hours": 1.2358, "text": "New demo program… HelloWorld_demo ! Print Hello World ! centered on the screen all in pure 6502 Assembly. I also modified the way the disassembler work, now even if there is a BRK it will continue to read the file until the end. The ASM part was really really haaarrddd."}, {"post_id": 32338, "ts": "2026-07-21T13:23:35Z", "hours": 0.4014, "text": "Now if I press R I can reset the program. I also modify the footer bar"}, {"post_id": 32323, "ts": "2026-07-21T12:48:13Z", "hours": 0.5539, "text": "I have update the color from word to RGB value so if a different terminal theme is applied the color are the same. I also added a footer bar with the keybinds."}, {"post_id": 32296, "ts": "2026-07-21T11:32:52Z", "hours": 1.4164, "text": "New panel 🥁🥁🥁…. the ✨ SETTINGS ✨ ! In this panel there is a smaller version of the Logo and the settings to modify the speed of the CPU. There is also the link to the github repo and stardance project"}, {"post_id": 31921, "ts": "2026-07-20T18:22:48Z", "hours": 0.2858, "text": "Now the name of the file currently running is in the title. I also finished the rainbow program to fill the whole screen."}, {"post_id": 31910, "ts": "2026-07-20T18:01:58Z", "hours": 1.7158, "text": "New feature 🥁🥁🥁 ✨ THE SCREEN ✨ This was very very hard. The screen use the Unicode half-block character “▀”, to write to the screen you just need to send value like this : LDA #$02 ; load \"02\" into the accumulator STA $0200 ; store it at memory address $0200 (the 1st pixel) Here the 02 is the color RED. Here is the color palette: fn palette_color ( index : u8 ) -> Color { match index & 0x0F { 0 => Color :: Black , 1 => Color :: White , 2 => Color :: Red , 3 => Color :: Cyan , 4 => Color :: Magenta , 5 => Color :: Green , 6 => Color :: Blue , 7 => Color :: Yellow , 8 => Color :: Rgb ( 255 , 165 , 0 ), // Orange 9 => Color :: Rgb ( 153 , 76 , 0 ), // Brown 10 => Color :: DarkGray , 11 => Color :: Gray , 12 => Color :: LightRed , 13 => Color :: LightBlue , 14 => Color :: LightGreen , _ => Color :: Reset , // 15 transparent } } The color may vary between terminal theme. I also had created an ASM program to print a rainbow on the 1st quarter of the screen. I also added the feature that when a BRK instruction is hit the program turn to HALT mode (in the UI). I also added the indentation system to BEQ, BNE, BCC, BCS, BMI, BPL, BVC, BVS. I also added a new way of calculating the speed of the program."}, {"post_id": 31806, "ts": "2026-07-20T14:10:36Z", "hours": 0.4183, "text": "Choosing between a variety of logo (2 first screen shot are in Apple Terminal the last is in ghostty with a Catpuccin Mocha theme)"}, {"post_id": 31786, "ts": "2026-07-20T13:41:37Z", "hours": 0.9217, "text": "I have added a top bar in the memory container with the last part of the address (to be more easy to read). I also fixed all the scroll bar from scrolling outside the container and just see nothings"}, {"post_id": 31761, "ts": "2026-07-20T12:25:55Z", "hours": 0.3808, "text": "I have fixed the cursor in the Stack Container to scroll automaticly when needed and when running. I also optimised the code !"}, {"post_id": 31735, "ts": "2026-07-20T11:29:19Z", "hours": 1.0997, "text": "A lot has been going on ! I have added the Memory Viewer, Scroll bar to the Stack Viewer and Memory Viewer (work with the 🥁…. SCROLL WHEEL !). I also reduce the space taken by the opcode list so we can see the memory viewer !"}, {"post_id": 31230, "ts": "2026-07-19T13:48:00Z", "hours": 0.4708, "text": "I have added a Stack Viewer on the left ! The container scroll it self when the “cursor”/current position of the Stack Pointer (SP). I also have fix the text for the SP in the register container"}, {"post_id": 30873, "ts": "2026-07-18T20:31:08Z", "hours": 0.5025, "text": "I have tried to implement multi-threading but realize that it’s not worth it for a simple emulator like this one."}, {"post_id": 30853, "ts": "2026-07-18T20:00:15Z", "hours": 0.4039, "text": "I have clean the code a little bit 🧹 and added a RUN or PAUSED indicator :"}, {"post_id": 30789, "ts": "2026-07-18T17:52:51Z", "hours": 1.2636, "text": "The UI is going forward one step after another ! I have changed a some little like the place where is the Flag Container, now it’s on the left side. And I also have added a LOT a things like: Register Container (under the Flag Container) Now when there is a JMP (or any type or jump like RST, etc…) the code indent it self Up and Down key move the cursor 🥁…. ✨UP & DOWN ✨ New color for the ADDR in the Opcode container Things I have removed: BYTES section in the Opcode container because I don’t think it’s really useful"}, {"post_id": 30680, "ts": "2026-07-18T13:37:25Z", "hours": 0.2903, "text": "YAY now the Flags can be shown ! Green Bold when active and Dark Gray classic when not"}, {"post_id": 30669, "ts": "2026-07-18T13:18:54Z", "hours": 0.5522, "text": "I have made a program to disassemble the program so the code could be shown in the TUI. And it work !"}, {"post_id": 30661, "ts": "2026-07-18T12:46:07Z", "hours": 1.1003, "text": "I am now making the TUI part of this emulator ! I am using Ratatui to make the TUI. This mean I have to change all the printing part of my existing program"}, {"post_id": 30627, "ts": "2026-07-18T10:52:26Z", "hours": 0.465, "text": "YAY Now EVERY opcode and EVERY addressing mode are implemented 🎉 (wow 1478 lines of pure opcodes)"}, {"post_id": 30355, "ts": "2026-07-17T20:40:38Z", "hours": 0.2844, "text": "I have fix some little print in 3-4 instruction and the IRQ function"}, {"post_id": 30342, "ts": "2026-07-17T20:21:23Z", "hours": 1.0506, "text": "I’m being closer and closer of getting all opcode and all Addressing mode implemented Here are the list of opcode I have implemented and there Addressing Mode: ADC Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y AND Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y CMP Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y EOR Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y I also fixed the CLD instruction. I was doing a : cpu .sr | = ! CPU :: DECIMAL_FLAG ; but the right one was this: cpu .sr &= ! CPU :: DECIMAL_FLAG ;"}, {"post_id": 29763, "ts": "2026-07-16T21:06:40Z", "hours": 0.9353, "text": "New opcode time ! LDY ZeroPageX STA ZeroPageX AbsoluteY IndirectX IndirectY STX ZeroPageY Absolute STY ZeroPageX Absolute"}, {"post_id": 29468, "ts": "2026-07-16T13:13:24Z", "hours": 1.3792, "text": "Add interruption with NMI + IRQ. Add option to the user to start at a specific address"}, {"post_id": 29172, "ts": "2026-07-15T21:55:25Z", "hours": 0.4572, "text": "New opcode STA Absolute X"}, {"post_id": 29083, "ts": "2026-07-15T18:53:21Z", "hours": 0.73, "text": "I’ve just passed 40min to fix an interruption problem to final look back and see that my original code what working perfectly fine 😭 . I’ve also change my build tools to ca65 + ld65"}, {"post_id": 29035, "ts": "2026-07-15T18:04:18Z", "hours": 0.5122, "text": "YAY I have added a BUNCH of new Opcodes : BCS BCC BPL BIT with ZeroPage & Absolute BMI BVC BVS"}, {"post_id": 29003, "ts": "2026-07-15T17:27:28Z", "hours": 0.6717, "text": "New opcode TXS (transfer X to stack pointer) TSX (transfer stack pointer to X) ldx_absolute_Y lda_indirect_x lda_indirect_y ldx_zeropage_y New Addressing Mode: AbsoluteY ZeroPageY IndirectX IndirectY"}, {"post_id": 28387, "ts": "2026-07-14T16:45:14Z", "hours": 0.4636, "text": "✨ NEW OPCODE ✨ : PHP (Push Processor Status: push current value of all the flag to the stack) PLP (Pull Processor Status: pull current value of all the flag to the stack) But I have also add a memory dump with page (at the end of a program) to debug ! (1st screenshot) and i also add a fixed (address) memory viewer when running (2nd screenshot)"}, {"post_id": 28368, "ts": "2026-07-14T16:14:05Z", "hours": 0.3953, "text": "There now is 4 new opcode: ROR ROL ROR Memory ROL Memory"}, {"post_id": 28355, "ts": "2026-07-14T15:47:50Z", "hours": 0.7244, "text": "New Opcode : PLA (Pull Accumulator) PHA (Push Accumulator) ASL memory LSR memory"}, {"post_id": 27919, "ts": "2026-07-13T20:54:45Z", "hours": 0.3947, "text": "The now is new opcode ! : EOR ORA AND LDA (ZeroPageX) And some new AddressingMode : ZeroPageX AbsoluteX"}, {"post_id": 27728, "ts": "2026-07-13T15:22:17Z", "hours": 0.7697, "text": "Now there is a pop_stack function who return the top value of the stack (Last In First Out). I’ve also added those opcode : JSR RST And made this test code :"}, {"post_id": 27647, "ts": "2026-07-13T12:27:38Z", "hours": 1.7306, "text": "I’ve done a LOT of work. Added Opcodes: BEQ BNE SBC Immediate + Zeropage I’ve also done a lot of refractorisation. Code before : match opcode { 0x18 => { self .sr &= ! CPU :: CARRY_FLAG ; self .set_instr ( format! ( \"{:02X}\" , opcode ), \"CLC\" .to_string (), 2 ); }, // ... } VS now : match opcode { 0x18 => self .clc ( opcode ), // ... } So now every opcode have his own function !"}, {"post_id": 27367, "ts": "2026-07-12T21:19:13Z", "hours": 0.5197, "text": "I’ve added those instruction: ADC (Add with Carry) CLC (Clear Carry Flag) SEC (Set Carry Flag) I’ve also made this little ASM 6502 program to test those opcode .org $8000 START: SEC ; to test CLC LDA #$FF ; A = 255 CLC ; Clear Carry Flag before addition ADC #$02 ; 255 + 2 = 1, Carry is now 1 (0x01FF + 0x0002 = 0x0201) STA $20 ; Store Low Byte result (01) at $20 LDA #$00 ; Load 0 for the high byte ADC #$00 ; 0 + 0 + 1 (Carry from previous instruction) = 1 STA $21 ; Store High Byte result (01) at $21 ; SEC use SEC ; Carry = 1 LDA #$01 ; A = 1 ADC #$00 ; 1 + 0 + 1 (Carry) = 2 BRK And it work just fine !"}, {"post_id": 27343, "ts": "2026-07-12T20:41:04Z", "hours": 0.885, "text": "I’ve added a bunch of opcode like : STA, STX, STY (Zero Page, Absolute) LDX, LDY (Immediate, Zero Page, Absolute) JMP (Absolute), JMP (Indirect) (the screen shot is a new program that i’ve made and test on virtual 6502 and my project)"}, {"post_id": 27311, "ts": "2026-07-12T19:40:23Z", "hours": 0.3989, "text": "I’ve added a new UI and AddressingMode"}, {"post_id": 27261, "ts": "2026-07-12T17:42:19Z", "hours": 4.3097, "text": "Hi ! Right now in my project I have added : Bus with ram read & write function load from file function CPU All registry (a, x, y, sp, pc, sr) reset cpu function update Z & N flag function clock_tick with those opcode in it : BRK; DEY; TXA; TYA; TAY; LDA; TAX; INY; DEX; INX; NOP (1st screenshot is official emulator 2nd is mine)"}]...
|
Title: Rust 6502 by @Wirenux | Stardance
Devlogs: Title: Rust 6502 by @Wirenux | Stardance
Devlogs:
Hi ! Right now in my project I have added : Bus with ram read & write function load from file function CPU All registry (a, x, y, sp, pc, sr) reset cpu function update Z & N flag function clock_tick with those opcode in it : BRK; DEY; TXA; TYA; TAY; LDA; TAX; INY; DEX; INX; NOP (1st screenshot is official emulator 2nd is mine)
I’ve added a new UI and AddressingMode
I’ve added a bunch of opcode like : STA, STX, STY (Zero Page, Absolute) LDX, LDY (Immediate, Zero Page, Absolute) JMP (Absolute), JMP (Indirect) (the screen shot is a new program that i’ve made and test on virtual 6502 and my project)
I’ve added those instruction: ADC (Add with Carry) CLC (Clear Carry Flag) SEC (Set Carry Flag) I’ve also made this little ASM 6502 program to test those opcode .org $8000 START: SEC ; to test CLC LDA #$FF ; A = 255 CLC ; Clear Carry Flag before addition ADC #$02 ; 255 + 2 = 1, Carry is now 1 (0x01FF + 0x0002 = 0x0201) STA $20 ; Store Low Byte result (01) at $20 LDA #$00 ; Load 0 for the high byte ADC #$00 ; 0 + 0 + 1 (Carry from previous instruction) = 1 STA $21 ; Store High Byte result (01) at $21 ; SEC use SEC ; Carry = 1 LDA #$01 ; A = 1 ADC #$00 ; 1 + 0 + 1 (Carry) = 2 BRK And it work just fine !
I’ve done a LOT of work. Added Opcodes: BEQ BNE SBC Immediate + Zeropage I’ve also done a lot of refractorisation. Code before : match opcode { 0x18 => { self .sr &= ! CPU :: CARRY_FLAG ; self .set_instr ( format! ( "{:02X}" , opcode ), "CLC" .to_string (), 2 ); }, // ... } VS now : match opcode { 0x18 => self .clc ( opcode ), // ... } So now every opcode have his own function !
Now there is a pop_stack function who return the top value of the stack (Last In First Out). I’ve also added those opcode : JSR RST And made this test code :
The now is new opcode ! : EOR ORA AND LDA (ZeroPageX) And some new AddressingMode : ZeroPageX AbsoluteX
New Opcode : PLA (Pull Accumulator) PHA (Push Accumulator) ASL memory LSR memory
There now is 4 new opcode: ROR ROL ROR Memory ROL Memory
✨ NEW OPCODE ✨ : PHP (Push Processor Status: push current value of all the flag to the stack) PLP (Pull Processor Status: pull current value of all the flag to the stack) But I have also add a memory dump with page (at the end of a program) to debug ! (1st screenshot) and i also add a fixed (address) memory viewer when running (2nd screenshot)
New opcode TXS (transfer X to stack pointer) TSX (transfer stack pointer to X) ldx_absolute_Y lda_indirect_x lda_indirect_y ldx_zeropage_y New Addressing Mode: AbsoluteY ZeroPageY IndirectX IndirectY
YAY I have added a BUNCH of new Opcodes : BCS BCC BPL BIT with ZeroPage & Absolute BMI BVC BVS
I’ve just passed 40min to fix an interruption problem to final look back and see that my original code what working perfectly fine 😭 . I’ve also change my build tools to ca65 + ld65
New opcode STA Absolute X
Add interruption with NMI + IRQ. Add option to the user to start at a specific address
New opcode time ! LDY ZeroPageX STA ZeroPageX AbsoluteY IndirectX IndirectY STX ZeroPageY Absolute STY ZeroPageX Absolute
I’m being closer and closer of getting all opcode and all Addressing mode implemented Here are the list of opcode I have implemented and there Addressing Mode: ADC Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y AND Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y CMP Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y EOR Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y I also fixed the CLD instruction. I was doing a : cpu .sr | = ! CPU :: DECIMAL_FLAG ; but the right one was this: cpu .sr &= ! CPU :: DECIMAL_FLAG ;
I have fix some little print in 3-4 instruction and the IRQ function
YAY Now EVERY opcode and EVERY addressing mode are implemented 🎉 (wow 1478 lines of pure opcodes)
I am now making the TUI part of this emulator ! I am using Ratatui to make the TUI. This mean I have to change all the printing part of my existing program
I have made a program to disassemble the program so the code could be shown in the TUI. And it work !
YAY now the Flags can be shown ! Green Bold when active and Dark Gray classic when not
The UI is going forward one step after another ! I have changed a some little like the place where is the Flag Container, now it’s on the left side. And I also have added a LOT a things like: Register Container (under the Flag Container) Now when there is a JMP (or any type or jump like RST, etc…) the code indent it self Up and Down key move the cursor 🥁…. ✨UP & DOWN ✨ New color for the ADDR in the Opcode container Things I have removed: BYTES section in the Opcode container because I don’t think it’s really useful
I have clean the code a little bit 🧹 and added a RUN or PAUSED indicator :
I have tried to implement multi-threading but realize that it’s not worth it for a simple emulator like this one.
I have added a Stack Viewer on the left ! The container scroll it self when the “cursor”/current position of the Stack Pointer (SP). I also have fix the text for the SP in the register container
A lot has been going on ! I have added the Memory Viewer, Scroll bar to the Stack Viewer and Memory Viewer (work with the 🥁…. SCROLL WHEEL !). I also reduce the space taken by the opcode list so we can see the memory viewer !
I have fixed the cursor in the Stack Container to scroll automaticly when needed and when running. I also optimised the code !
I have added a top bar in the memory container with the last part of the address (to be more easy to read). I also fixed all the scroll bar from scrolling outside the container and just see nothings
Choosing between a variety of logo (2 first screen shot are in Apple Terminal the last is in ghostty with a Catpuccin Mocha theme)
New feature 🥁🥁🥁 ✨ THE SCREEN ✨ This was very very hard. The screen use the Unicode half-block character “▀”, to write to the screen you just need to send value like this : LDA #$02 ; load "02" into the accumulator STA $0200 ; store it at memory address $0200 (the 1st pixel) Here the 02 is the color RED. Here is the color palette: fn palette_color ( index : u8 ) -> Color { match index & 0x0F { 0 => Color :: Black , 1 => Color :: White , 2 => Color :: Red , 3 => Color :: Cyan , 4 => Color :: Magenta , 5 => Color :: Green , 6 => Color :: Blue , 7 => Color :: Yellow , 8 => Color :: Rgb ( 255 , 165 , 0 ), // Orange 9 => Color :: Rgb ( 153 , 76 , 0 ), // Brown 10 => Color :: DarkGray , 11 => Color :: Gray , 12 => Color :: LightRed , 13 => Color :: LightBlue , 14 => Color :: LightGreen , _ => Color :: Reset , // 15 transparent } } The color may vary between terminal theme. I also had created an ASM program to print a rainbow on the 1st quarter of the screen. I also added the feature that when a BRK instruction is hit the program turn to HALT mode (in the UI). I also added the indentation system to BEQ, BNE, BCC, BCS, BMI, BPL, BVC, BVS. I also added a new way of calculating the speed of the program.
Now the name of the file currently running is in the title. I also finished the rainbow program to fill the whole screen.
New panel 🥁🥁🥁…. the ✨ SETTINGS ✨ ! In this panel there is a smaller version of the Logo and the settings to modify the speed of the CPU. There is also the link to the github repo and stardance project
I have update the color from word to RGB value so if a different terminal theme is applied the color are the same. I also added a footer bar with the keybinds.
Now if I press R I can reset the program. I also modify the footer bar
New demo program… HelloWorld_demo ! Print Hello World ! centered on the screen all in pure 6502 Assembly. I also modified the way the disassembler work, now even if there is a BRK it will continue to read the file until the end. The ASM part was really really haaarrddd.
Wow that was damn hard 😭. But the Home Menu is finally here 🎉. There is the logo (might change). The select file container with full navigation (folder, parent directory, file), Icon (require a Nerd Font) and Colors. The selected file path update in real time with the absolute path of the file. The start address automatically change if the file selected is a demo file (end with “_demo.bin”) to $C000. The start address it editable with Alpha numeric character (hexadecimal). And the emulation speed work ! There is control on the footer bar.
WOW already 30 hours ?! 😅 I now have added the home logo ! I also changed the step for the speed selection on Home Menu from 500 to 100 for each step
Little bug fix: Now when we select a file in the Home File Selector the filename appear in the Opcode container. I have also reorganize the tui.rs code !
WOW 4h 😅 I have done the full README.md, documentation about the screen, color palette and fix some little bugs.
WOW 35H 🎉 I have added a file : DemoProgram.md to show all the demo program
I have added a new program called HackClub Logo First, I have draw the hackclub logo in aseprite with a 32x32 pixel file using my custom color palette. Second, I have created a simple python script who take a .png in input and output ASM raw data for the image (using my color palette). Third, I have create a simple ASM program to print the logo on the screen !
I have been writing a LOT of documentation on how to create a 6502 ASM program, Screen documentation. And the project is now published in version 1.0.0 on Github and Cargo https://github.com/wirenux/Rust-6502 https://crates.io/crates/rust6502
Last devlogs before Ship #1 Wow 37h of work. I have made an Asciinema video, Youtube video and update the README.md Wish me luck !
Ok so… it’s been 8h40 . I have done a lot (I mean it’s logic it’s been 8h and 40 minutes) In time order I have done : Replace self.pc + 1 to self.pc.wrapping_add(1) so it’s like on the real 6502 if the current PC is $FFFF and you add 1 it will be $0000 . Added a panic hook, before when the program was crashing (for a bad ASM program by example) the terminal was still in RAW mode (so if you click, move the mouse etc… it will print a bunch of garbage number) but now it exit the raw mode in a clean way ! Remove unused import Change the start of the Stack Pointer to $1FFF Added a memory reset function Write a bunch of test programs Replace IPS (instruction per seconds) by Hz and MHz like in real life (so i’ve adapted the UI for the change) Now the disassembler disassemble the whole program (neat right ? ) using .len() . (yes before it was an hard-coded number Optimize the screen render method. Before I was refreshing the screen even if nothings has been changed, now i check if somethings have been changed to update the screen Added address of each “quarter” of the screen in the screen documentation Fixed foreground and background color of the Frequency selector (on the Home Screen) Write a program to test IRQ and NMI Keybinds the I and N key to IRQ and NMI Changed the Hello World program to be rainbow The emulator will look by it self to the reset vector ( $FFFC and $FFFD ) to set the PC at the correct address Added a force address toggle to… force the the start address When the force addr toggle is off you can’t modify the start Addr and it’s darker Every file or folder who start by a . (dot) is not shown in the file selector Moved the hackclub logo raw binary data to a .inc file Added a self crashing test program (Next time I might add a PS/2 keyboard emulation… )
YAY ! Now there is mouse control on the home screen, this mean that you can click every where to change the focus and in the file explorer you can double-click to open a folder and double-click to open a file directly, you can also with a simple click enable or disable Force Address Mode
Wow that was… difficult . But now there is a PS/2 keyboard Emulation ! The I/O port is map on $BFF0-$BBF2. The PS/2 keyboard work with 3 addresses $BFF0 : KBD_DATA $BFF1 : KBD_STATUS $BFF2 : KBD_ACK To activate to keyboard in the emulator you can press on the screen container and to exit it just click anywhere else ! (The number you can see in the memory viewer at $0000 is the code from different key !) Maybe next time I will create a program to see each letter
I want to create a ASM program who print the pressed key to the screen, and for that I need to create the font/image for each key. There is ~100 key . So here is the first one !
Now there is all the number & lower case letter (a-z) & and the Space bar icon !
Okay soo….. it’s been 4 hours and 35 minutes . I have done so much and not that much at the same time (I know it’s weird ) I have added a demo program who print the pressed character ! I have spend 2 hours on a little bug but yeah now it’s working ! So with the program I drew all the key on a PS/2 keyboard . I also fixed some little inattention problem in my code. I also created a little python script to help me convert .png drawing into raw .inc value ! ( Did you find the secret phrase ?)
Wow, just WOW. I have added a serial monitor, and Apple 1 OS Serial Monitor Here is the way the monitor work, you load character to $BFE0 like this : lda #'A' sta $BFE0 Then you run the program in the emulator like normal, then you open another terminal and you connect to localhost port 8080 using netcat nc like this : nc 127.0.0.1 8080 And now if you already launch the program, when you connect to localhost ( 127.0.0.1 is localhost) you will see a A in your terminal ! You can also type in the serial monitor ! Here is a code that show the number of characters typed by using the pixels in the 32x32 screen ! start: ldx #$FF txs ldx #$00 main_loop: bit $BFE1 bpl main_loop lda $BFE0 sta $BFE0 lda #WHITE_COLOR sta $0200, x inx jmp main_loop Apple 1 This is a very damn big part. To be short, I have recreated the Apple 1 OS (Wozmon) created by Steve Wozniak. In short I took the code given in the Apple 1 User Manual, modify it to use the Serial Monitor and Keyboard, fix some issue with the prompt. I can even run the classic program from the manual to print all the available characters. With Wozmon you can also write and read data from the memory so you can show some pixel on the screen ! Here is the program running and the serial monitor.
After 1h50 I have added a Snake demo program that use the PS/2 keyboard !!! I also make a demo program to test the Serial Monitor using netcat nc
Little update, I added a Program Counter (PC) input to move it in when running a program. I also added a cursor for the start input on the Home Screen !
Little update ! I have added tips in the settings menu. The change randomly using the UNIX Epoch value
New little update ! I have created a Python tools to create memory map for my emulator docs !
Here is what I have done in 2h 50 . First I wrote a lot of docs, for the keyboard, Serial Monitor, Wozmon etc… This was so boring . But at least now I will be ready to ship soon ! Second, I have fixed the Wozmon list content of address. Before when you was doing FF00.FFFF it was just showing the byte at $FF00 and the byte at $FFFF now it list all the byte between !
YAY Now rust6502 Version 1.1.0 is released ! On github with all the demo file and on crates.io / cargo !
v1.2.0 Here are the changes attached to this release : fix: a bug on windows, with ghost key press ( c3c6009 ) add: a Scroll bar on the file explorer ( 94b2abb )
I added the step-back function. It work by pressing “B”, it’s just rewinding the emulator up to 500 opcode. Only work when moving in step-by-step mode (with Enter)
Okay so… I have added the Breakpoint and the Watchpoint . When you set the breakpoint to $C00C the CPU will stop before running the instruction at $C00C. The watchpoint stop if a value at an address at been changed.
+1h 25 min ! Since the last time I have added the keybind panel. Where there is… all the keybinds I also remove the keybind on the footer to only get Keybind “K”
+ 1h35 ! This might be the last feature I add to Rust 6502. Since I ran out of idea and for me the project seem to be finished. Anyway, here are the things I added : A RNG address : $BFF3 . The program just read from it and get a random value via the Host computer ( 4feb4d8 ) A conditional breakpoint : A top bar in the Breakpoint popup to add a conditional breakpoint (like : If AC != 0F -> Break) ( 1b7bc81 )
+ 1h20 So… this might be the last devlog for this project. I just released the v1.3.0 . And here is what I added since the last devlog : A RNG documentation Snake now use a real RNG I recorded the Asciinema .cast file Update the python tools to generate memory diagrams Update the Memory documentation So next step is the 3rd Ship
Ships:
=== Rust 6502 === A legendary 8-bit CPU right in your terminal! 🦀 ᕙ( •̀ ᗜ •́ )ᕗ == What did you make ? == I built a fully functional emulator for the MOS 6502 (the microprocessor that powered the Apple II, Commodre 64, and the NES) from scratch using Rust ! Instead of a standard graphical window, I built a Terminal User Interface (TUI) using Ratatui. Here is what’s inside: Full CPU Emulation: Execute 6502 machine code with live register (AC, XR, YR, SP) and status flag tracking Virtual Screen: A 32x32 memory-mapped display ($0200-$05FF) rendered right in the terminal using Unicode Half-Block and a custom 16-color palette Live Disassembler & Hex Viewer: Watch the RAM change in real-time and see the raw binary machine code translated back into readable assembly instructions on the fly Built-in File Browser: A visual menu with Nerd Font icons to navigate your system and load compiled .bin ROMs Available on crates.io : You can download it via Cargo == What was challenging ? == The Disassembler: Writing a disassembler that parses raw .bin files is tricky because they don’t have headers. I ran into a massive issue where my image data (using the color byte $0A) was being read by the disassembler as infinite ASL A (Shift Left) instructions! I had to engineer a way for the disassembler to properly halt when it hit a BRK instruction so it wouldn’t try to execute my pixel art. Terminal UI Architecture: Designing a dashboard (hex grids, scrolling stacks, changing colors) required a really solid state-management architecture to keep the UI smooth and responsive while the CPU loop spins at thousands of instructions per second. == What are you proud of ? == I am proud of using this project to learn Rust in a fun way! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io, meaning anyone can install and run my emulator with a single command == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load hackclub_logo_demo.bin to see the terminal render a 32x32 pixel art logo using 6502 assembly Load rainbow_demo.bin to watch a shifting color gradient animation directly manipulating video memory. Load helloworld_demo.bin to watch a centered Hello world message The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!
=== Rust 6502 === A MOS 6502 emulator TUI with a lot of features ============================================ Before reading this Ship you should take a look at Ship #1 == What did you add ? == Here is a list of everything that I have added since the last Ship = Features = Serial Monitor : you connect to localhost:8080 using netcat. Useful for the Apple 1 OS or for debugging with text. The monitor can be used to display text but also to send text like a keyboard (useful for the Apple 1 OS) PS/2 Keyboard : a full PS/2 keyboard emulation (used in Snake) Use the UI with a Mouse: On the Home Menu and in the Emulator you can click on button, toggle, scroll, etc… Interrupt : IRQ & NMI Tips in the Settings Panel Modify speed with Hz & MHz (like a real 6502 chip) Reset Vector: The emulator will look at $FFFC & $FFFD to find the start address of the program (when the Force Address toggle is off) Set PC Address: keyboard shortcut to change the position of the PC (Program Counter) = Demo Program = Apple 1 OS (Wozmon) : I have modified the orginal Apple 1 code to fit my emulator, like Serial Monitor address, Keyboard etc… Snake : Just the Snake game ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ Keyboard Demo: Print every key press on the screen using a custom font Serial Monitor Demo: Show how the Serial Monitor works == What was challenging ? == The most challenging part of this 2nd ship was creating a Serial Monitor that works via a local port, and making a PS/2 Keyboard emulation. And of course, modifying the Apple 1 OS to make it work on this emulator ! (I was having a lot of bugs, so I rewrite a big part of the OS) ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ == What are you proud of ? == I am really proud of my self for the implementation of the Serial monitor that run on different CPU thread than the emulator itself and the fact that it work via the local network. And beyond everything the fact that my emulator can run : games, utility and the Apple 1 OS !!! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io. == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: ================== cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load snake_demo.bin to play at a classic game using the 32x32 screen and the PS/2 keyboard emulation Load wozmon.bin to use the Apple 1 OS ! You should see the documentation related to Wozmon : https://github.com/wirenux/Rust-6502/blob/main/AppleI.md Load keyboard_demo.bin to see every key you press show up on the 32x32 screen using a custom font The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!
Rust 6502 A MOS 6502 emulator TUI with a lot of features Before reading this Ship you should take a look at Ship 1 & Ship 2 What did you add ? Here is a list of everything that I have added since the last Ship Features Breakpoints : press “F” to set a breakpoint at any address, the emulator halts the moment PC reaches it Watchpoints : same idea, but for memory Conditional Breakpoints : halt execution when a register (AC, XR, YR, SP) meets a comparison (!=, ==, >=, <=, >, <) against a target value Step Back : press “B” to rewind execution one instruction at a time, restoring the CPU and memory exactly as they were before Random Number Generator : a memory-mapped register at $BFF3 that returns a random byte from the host PC on every read, so ASM programs can have real random number Keybind Panel : a popup listing every keyboard shortcut and control, and removed the old footer keybind list to make room for it Demo Program Snake : updated to pull apple placement from the new RNG instead of the old pseudo random method ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What was challenging ? Wiring the conditional breakpoint into the run loop without breaking the existing breakpoint/watchpoint checks was harder than I though. Also getting a dropdown-style menu to choose the operator working in Ratatui was tought since there’s no native dropdown widget. So I ended up building a little spinner (▲ value ▼) that cycles through the operators instead ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What are you proud of ? I’m proud that my emulator now has real debugging tools like : breakpoints, watchpoints, conditional breakpoints, and step-back. What should people know so they can test your project ? A Nerd Font is recommended in your terminal for a better rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! Things to try Load snake_demo.bin and play :D Set a breakpoint on an address inside a demo program (check the keybind panel for the shortcut!) and watch execution halt exactly there Try a conditional breakpoint : for example, halt whenever XR == 0F and watch it stop right when the register hits that value Press “B” to step backward and rewind the CPU state instruction by instruction Press the keybind panel shortcut to see the full list of controls...
|
1793494175.413588
|
1793580575.413588
|
|
39315
|
City of the forgotten by @Ling | Stardance
|
Ling
|
1
|
149.7
|
305
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:17:44Z", "hours": 22.0, "multiplier": 13.63, "payout": 305, "blessing": "neutral", "text": "I made a Raylib Noir Adventue and point and click game My bigest Challenge Was by Far learning Raylib and code logic for collision", "repo": "https://github.com/Miyamoto-web/City-Of-the-Forgoten-Beta-", "demo": "https://miyamoto-web.itch.io/city-of-the-forgotten"}]...
|
[{"post_id": 84406, "ts": "202 [{"post_id": 84406, "ts": "2026-10-29T16:28:17Z", "hours": 8.1706, "text": "This devlog is just hours that i made the rest of the model on my old porject of making assets that now joined with the main pprojects"}, {"post_id": 83485, "ts": "2026-10-28T01:26:43Z", "hours": 5.6078, "text": "Devlog 2.2 i made more things for the game A coffee machine for the detective A Minibar A Radio -a tv Also i tried to make a rig for the 3d model of the charcter but it came out buggy (I will remake de 3d model of the charcter in the future)"}, {"post_id": 82267, "ts": "2026-10-24T12:47:00Z", "hours": 8.4553, "text": "Dev Log 2.1 I made a lot of new Models for the Ofice cenario Incluinding a Arquive a Ofice Chair a Sofa"}, {"post_id": 80704, "ts": "2026-10-18T15:52:08Z", "hours": 7.6203, "text": "Dev Log 2.0 I debugged the hud by replacing the Rich text label for a label I also made the hud reactable to your actions -## Also I fixed a bug in one of the main buttons of the main screen"}, {"post_id": 79674, "ts": "2026-10-15T01:10:40Z", "hours": 3.5631, "text": "Dev Log 1.9 Making cinematic cameras with collision shapes Fixing Ui text bugs Working on the visuals"}, {"post_id": 78746, "ts": "2026-10-11T14:15:16Z", "hours": 11.7417, "text": "Dev Log 1.8 Working Hud for the objectives Made by Creating global bool variables to mark if the objective is done Functional Terminal password puzle I used If states and == to Know if the player writed the wrong or the right password Also I added a system to make each objective that goes to the ui go to right tab"}, {"post_id": 76772, "ts": "2026-10-04T15:11:59Z", "hours": 14.4964, "text": "Dev Log 1.7 Button to exit the menu Finished move and intereact system I made the mechanic using nav agent and area 3d Stored Position when you change scenes I used Global Variant to make this system which saves the Player global position when you go to the menu and loads when you go bak to the game extends Node var player: CharacterBody3D var player_global: Vector3 var good_pos : bool func _ready() -> void: good_pos = false"}, {"post_id": 75274, "ts": "2026-09-29T16:46:44Z", "hours": 6.7075, "text": "Dev Log 1.6 -New and Better Point and Click -Ui visuals done"}, {"post_id": 72438, "ts": "2026-09-22T23:10:36Z", "hours": 10.0053, "text": "Dev Log 1.5 -New Ui and Hud -Trying to program the Hud -New Main Menu (again i realy need to get more creative for the game’s art)"}, {"post_id": 70389, "ts": "2026-09-19T02:57:56Z", "hours": 6.3439, "text": "New Dev log 1.4 -Making UI -Making Case Menu -Trying to learn UI desing"}, {"post_id": 69930, "ts": "2026-09-18T02:41:46Z", "hours": 3.5856, "text": "New Changes! -Making UI (Notes Case and Lore) -More Polished Point and Click Mechanic"}, {"post_id": 69409, "ts": "2026-09-17T00:18:21Z", "hours": 1.785, "text": "README"}, {"post_id": 68934, "ts": "2026-09-16T02:13:42Z", "hours": 0.4, "text": "Making README Currently explaning the creative process"}, {"post_id": 68405, "ts": "2026-09-15T02:08:07Z", "hours": 2.0369, "text": "Devlog 1.2 -New Script Point and Click Moviment -I used Rays, get.position and Lots of Variables -I realy need to configurate a decent Camera"}, {"post_id": 67714, "ts": "2026-09-13T22:21:53Z", "hours": 8.7006, "text": "New version on godot -Script for the moviment -Custom Made 3d Model (Made by me) -Third Person Camera -Version Text -A Prototipe Menu Ps: If you want to see the developement of the 3d model go to my other Project Modeling Assetsd for City of the Forgotten (My Project)"}, {"post_id": 66716, "ts": "2026-09-12T16:35:08Z", "hours": 1.2506, "text": "New Readme"}, {"post_id": 66637, "ts": "2026-09-12T14:21:00Z", "hours": 1.05, "text": "Finshed rig"}, {"post_id": 65707, "ts": "2026-09-11T01:20:15Z", "hours": 0.5839, "text": "Making rig"}, {"post_id": 65097, "ts": "2026-09-10T00:07:21Z", "hours": 9.3428, "text": "Character done making meta rig"}, {"post_id": 64214, "ts": "2026-09-08T13:37:08Z", "hours": 2.4339, "text": "I realy tried to make the web version work propely but i couldn’t make all the features in the game work in the web version i am realy sorry (next version will be on godot raylib is to messy)"}, {"post_id": 61916, "ts": "2026-09-05T02:46:41Z", "hours": 7.9033, "text": "Modeling protagonist coat"}, {"post_id": 58114, "ts": "2026-08-30T13:49:19Z", "hours": 2.9789, "text": "Finaly modeling the first part of the characther"}, {"post_id": 57726, "ts": "2026-08-29T23:59:45Z", "hours": 1.4169, "text": "Character Image reference editing (He is a noir detective ww2 vet)"}, {"post_id": 54142, "ts": "2026-08-24T23:40:12Z", "hours": 1.5181, "text": "Learning Blender"}, {"post_id": 53131, "ts": "2026-08-23T15:42:23Z", "hours": 0.4392, "text": "Final touch in the code"}, {"post_id": 48419, "ts": "2026-08-16T19:11:00Z", "hours": 8.6686, "text": "New models desk and terminal new texture for the ground and walls and hitboxs for the desk and walls"}, {"post_id": 42118, "ts": "2026-08-06T18:09:37Z", "hours": 5.5647, "text": "More modeling and fuctional hack mini game"}, {"post_id": 37375, "ts": "2026-07-30T01:24:44Z", "hours": 1.2122, "text": "Working itens!"}, {"post_id": 36762, "ts": "2026-07-29T01:01:24Z", "hours": 0.2667, "text": "more coding"}, {"post_id": 36105, "ts": "2026-07-27T23:53:07Z", "hours": 2.0636, "text": "working inventory system"}, {"post_id": 34847, "ts": "2026-07-25T21:35:54Z", "hours": 1.2464, "text": "Working Persona style menu"}, {"post_id": 34763, "ts": "2026-07-25T19:04:13Z", "hours": 1.2956, "text": "working point and click system!"}, {"post_id": 34633, "ts": "2026-07-25T15:00:59Z", "hours": 0.5706, "text": "working controls and music!"}, {"post_id": 34376, "ts": "2026-07-25T01:17:02Z", "hours": 0.4106, "text": "3d model in the game"}, {"post_id": 34276, "ts": "2026-07-24T20:55:19Z", "hours": 0.6428, "text": "working text"}]...
|
Title: City of the forgotten by @Ling | Stardance
Title: City of the forgotten by @Ling | Stardance
Devlogs:
working text
3d model in the game
working controls and music!
working point and click system!
Working Persona style menu
working inventory system
more coding
Working itens!
More modeling and fuctional hack mini game
New models desk and terminal new texture for the ground and walls and hitboxs for the desk and walls
Final touch in the code
Learning Blender
Character Image reference editing (He is a noir detective ww2 vet)
Finaly modeling the first part of the characther
Modeling protagonist coat
I realy tried to make the web version work propely but i couldn’t make all the features in the game work in the web version i am realy sorry (next version will be on godot raylib is to messy)
Character done making meta rig
Making rig
Finshed rig
New Readme
New version on godot -Script for the moviment -Custom Made 3d Model (Made by me) -Third Person Camera -Version Text -A Prototipe Menu Ps: If you want to see the developement of the 3d model go to my other Project Modeling Assetsd for City of the Forgotten (My Project)
Devlog 1.2 -New Script Point and Click Moviment -I used Rays, get.position and Lots of Variables -I realy need to configurate a decent Camera
Making README Currently explaning the creative process
README
New Changes! -Making UI (Notes Case and Lore) -More Polished Point and Click Mechanic
New Dev log 1.4 -Making UI -Making Case Menu -Trying to learn UI desing
Dev Log 1.5 -New Ui and Hud -Trying to program the Hud -New Main Menu (again i realy need to get more creative for the game’s art)
Dev Log 1.6 -New and Better Point and Click -Ui visuals done
Dev Log 1.7 Button to exit the menu Finished move and intereact system I made the mechanic using nav agent and area 3d Stored Position when you change scenes I used Global Variant to make this system which saves the Player global position when you go to the menu and loads when you go bak to the game extends Node var player: CharacterBody3D var player_global: Vector3 var good_pos : bool func _ready() -> void: good_pos = false
Dev Log 1.8 Working Hud for the objectives Made by Creating global bool variables to mark if the objective is done Functional Terminal password puzle I used If states and == to Know if the player writed the wrong or the right password Also I added a system to make each objective that goes to the ui go to right tab
Dev Log 1.9 Making cinematic cameras with collision shapes Fixing Ui text bugs Working on the visuals
Dev Log 2.0 I debugged the hud by replacing the Rich text label for a label I also made the hud reactable to your actions -## Also I fixed a bug in one of the main buttons of the main screen
Dev Log 2.1 I made a lot of new Models for the Ofice cenario Incluinding a Arquive a Ofice Chair a Sofa
Devlog 2.2 i made more things for the game A coffee machine for the detective A Minibar A Radio -a tv Also i tried to make a rig for the 3d model of the charcter but it came out buggy (I will remake de 3d model of the charcter in the future)
This devlog is just hours that i made the rest of the model on my old porject of making assets that now joined with the main pprojects
Ships:
I made a Raylib Noir Adventue and point and click game My bigest Challenge Was by Far learning Raylib and code logic for collision...
|
1793433059.7509758
|
1793519459.7509758
|
|
52775
|
Slackyy by @anura | Stardance
|
anura
|
1
|
2.33
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T16:50:35Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "made a slackbot jojo theme..", "repo": "https://github.com/anuragtamang095-coder/Slackbott", "demo": "https://hackclub.slack.com/archives/C0P5NE354/p1787538251404449"}]...
|
[{"post_id": 54505, "ts": "202 [{"post_id": 54505, "ts": "2026-08-25T15:09:10Z", "hours": 0.3308, "text": "Today doing css and half of it complete.. i think it will be completed by tomorrow the calculator maybe.."}, {"post_id": 53161, "ts": "2026-08-23T16:32:24Z", "hours": 1.1522, "text": "i feel i am gonna passout(x_X)"}, {"post_id": 52564, "ts": "2026-08-22T18:57:42Z", "hours": 0.8394, "text": "A very Bizzar-bot on the way.. just finished the index.js"}]...
|
Title: Slackyy by @anura | Stardance
Devlogs:
A v Title: Slackyy by @anura | Stardance
Devlogs:
A very Bizzar-bot on the way.. just finished the index.js
i feel i am gonna passout(x_X)
Today doing css and half of it complete.. i think it will be completed by tomorrow the calculator maybe..
Ships:
made a slackbot jojo theme.....
|
1793087883.1884265
|
1793951883.1884265
|
|
51160
|
Mee7 by @solxmn | Stardance
|
solxmn
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T16:46:34Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Mee7 Shipped mee7, a small Slack bot built with Node.js and Slack Bolt. This was definitely one of the easier projects I’ve worked on compared to some of my other recent ones, but I still had a lot of fun making it. The main challenge wasn’t really the bot itself, but getting everything working together properly. The most interesting part was handling APIs. mee7 uses several public APIs for things like cat facts, dog images, jokes, useless facts, and quotes, so I got to learn how to make requests to different endpoints and handle their responses inside a Slack bot. I also learned more about structuring a Node.js project around Slack Bolt and how to host the bot continuously with Nest. Overall, it was a simpler project than some of the others I’ve shipped, but it was still a really fun one to build. It gave me a better understanding of APIs and how they can be combined with other services to make something actually useful (or at least entertaining) inside Slack.", "repo": "https://github.com/Fraczdev/SlackBot-Mee7", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 50039, "ts": "202 [{"post_id": 50039, "ts": "2026-08-19T02:11:07Z", "hours": 0.3575, "text": "done with the commands (for now)! working with apis is really fun"}]...
|
Title: Mee7 by @solxmn | Stardance
Devlogs:
done Title: Mee7 by @solxmn | Stardance
Devlogs:
done with the commands (for now)! working with apis is really fun
Ships:
Mee7 Shipped mee7, a small Slack bot built with Node.js and Slack Bolt. This was definitely one of the easier projects I’ve worked on compared to some of my other recent ones, but I still had a lot of fun making it. The main challenge wasn’t really the bot itself, but getting everything working together properly. The most interesting part was handling APIs. mee7 uses several public APIs for things like cat facts, dog images, jokes, useless facts, and quotes, so I got to learn how to make requests to different endpoints and handle their responses inside a Slack bot. I also learned more about structuring a Node.js project around Slack Bolt and how to host the bot continuously with Nest. Overall, it was a simpler project than some of the others I’ve shipped, but it was still a really fun one to build. It gave me a better understanding of APIs and how they can be combined with other services to make something actually useful (or at least entertaining) inside Slack....
|
1793468996.2930121
|
1793555396.2930121
|
|
33038
|
Defied by @Sgattix | Stardance
|
Sgattix
|
1
|
37.62
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T16:36:14Z", "hours": 16.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Defied — a full-stack monorepo featuring a Next.js 15 marketing site, NestJS API server, Fumadocs documentation, shared auth (Better Auth + Stripe, that will be later on moved to zitadel), Prisma/MariaDB, and Payload CMS — all wired with Turborepo. Challenge: Getting Better Auth to work identically across both the Next.js web app and NestJS server without duplicating config, while keeping Prisma types in sync across packages. Proud of: not using AI, insuring a high quality communication while also maintaining control over app primitives using Defied DART and Defied Prism. To test: pnpm install pnpm dev Then open http://localhost:2029 .", "repo": "https://github.com/defied-labs/website", "demo": "https://defied.sgattix.online"}]...
|
[{"post_id": 74793, "ts": "202 [{"post_id": 74793, "ts": "2026-09-28T08:30:44Z", "hours": 21.6183, "text": "Hi everyone! I’ve been making good progress on Defied lately. Here’s an update on what I’ve been working on: Backend Magic-link auth is working, and I’ve added Zitadel as auth provider for a more ecosystem-like architecture. The auth handler now supports both email magic-links and Zitadel OIDC. Health endpoints: /health , /health/db , /health/auth , and /health/mail endpoints for monitoring Email verification: SMTP integration with verifyEmailConnection() for magic-link email verification Frontend Blog management: Integrated BlockNote and Nextra to build a fully-functional blog Landing page: Designed and built, showcasing Defied’s services and values Login page: Updated with modern design and auth flow I will soon implement syntax highlighting and LaTeX in the blog editor. Stay tuned"}, {"post_id": 53036, "ts": "2026-08-23T13:00:32Z", "hours": 4.4719, "text": "Hi guys, I decided to spend these 4 hours doing something that almost no one does these days: reviewing code by hand, zero-AI. I noticed some contradictions, something that didn’t quite reflect Defied’s values and status. So here’s the final, working, bulletproof, but most importantly meaningful version of Defied’s landing page. I will soon ship it, so wish me luck!"}, {"post_id": 43218, "ts": "2026-08-08T10:55:52Z", "hours": 11.6939, "text": "Hi guys, I’ve been quite busy lately with my life outside Stardance. However I still managed to put some effort on a new project: Defied. Defied is a software company that builds advanced digital products, combining software engineering, AI and design to create reliable, elegant and accessible tools. Here’s what I did so far: Backend Built basic magic-link auth that will be later moved to a Zitadel-based auth for a more ecosystem-like architecture Frontend Designed and built landing page Designed and built login page Just as a quick note, this is Defied’s landing page and service wrapper, not a service. For Defied services, check out Defied Prism (Which I will later post here, as a multi-framework, css modules and tailwindcss component library)."}]...
|
Title: Defied by @Sgattix | Stardance
Devlogs:
Hi Title: Defied by @Sgattix | Stardance
Devlogs:
Hi guys, I’ve been quite busy lately with my life outside Stardance. However I still managed to put some effort on a new project: Defied. Defied is a software company that builds advanced digital products, combining software engineering, AI and design to create reliable, elegant and accessible tools. Here’s what I did so far: Backend Built basic magic-link auth that will be later moved to a Zitadel-based auth for a more ecosystem-like architecture Frontend Designed and built landing page Designed and built login page Just as a quick note, this is Defied’s landing page and service wrapper, not a service. For Defied services, check out Defied Prism (Which I will later post here, as a multi-framework, css modules and tailwindcss component library).
Hi guys, I decided to spend these 4 hours doing something that almost no one does these days: reviewing code by hand, zero-AI. I noticed some contradictions, something that didn’t quite reflect Defied’s values and status. So here’s the final, working, bulletproof, but most importantly meaningful version of Defied’s landing page. I will soon ship it, so wish me luck!
Hi everyone! I’ve been making good progress on Defied lately. Here’s an update on what I’ve been working on: Backend Magic-link auth is working, and I’ve added Zitadel as auth provider for a more ecosystem-like architecture. The auth handler now supports both email magic-links and Zitadel OIDC. Health endpoints: /health , /health/db , /health/auth , and /health/mail endpoints for monitoring Email verification: SMTP integration with verifyEmailConnection() for magic-link email verification Frontend Blog management: Integrated BlockNote and Nextra to build a fully-functional blog Landing page: Designed and built, showcasing Defied’s services and values Login page: Updated with modern design and auth flow I will soon implement syntax highlighting and LaTeX in the blog editor. Stay tuned
Ships:
Defied — a full-stack monorepo featuring a Next.js 15 marketing site, NestJS API server, Fumadocs documentation, shared auth (Better Auth + Stripe, that will be later on moved to zitadel), Prisma/MariaDB, and Payload CMS — all wired with Turborepo. Challenge: Getting Better Auth to work identically across both the Next.js web app and NestJS server without duplicating config, while keeping Prisma types in sync across packages. Proud of: not using AI, insuring a high quality communication while also maintaining control over app primitives using Defied DART and Defied Prism. To test: pnpm install pnpm dev Then open http://localhost:2029 ....
|
1793544522.9445314
|
1793630922.9445314
|
|
51005
|
ARENA: Local Multiplayer Tic-Tac-Toe game by @jaya ARENA: Local Multiplayer Tic-Tac-Toe game by @jayanth_raveendra | Stardance...
|
jayanth_raveendra
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T16:35:14Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "ARENA is a real-time multiplayer game where your face is your login. No passwords, no typing—just split-second biometric verification computed directly on your device’s GPU. TECHNICAL HIGHLIGHTS: 🔹 Edge ML Biometrics: Uses face-api.js for zero-latency, client-side 128-d facial encoding. 🔹 Real-Time WebSockets: Live asynchronous matchmaking lobby and instant mid-game disconnect handling. 🔹 FIDE-Standard Elo: Mathematically calculates win probabilities and dynamically updates your global ranking. 🔹 Resilient Microservices: Fully containerized stack (FastAPI, Nginx, MySQL, MongoDB) with automated database retry loops. HOW TO DEMO: Because ARENA is a full-stack microservice architecture, it is too heavy for a free cloud host. My GitHub repository is the demo! To experience the magic on your own machine: Clone the repo and add the .env variables. Run \"docker compose up --build -d\" in your terminal. Go to localhost:5500 in your browser and register your face! (Want to play with friends on your Wi-Fi? The README has instructions on how to use ngrok to securely tunnel the Nginx proxy to their phones!)", "repo": "https://github.com/team-zero-latency/core-game-release", "demo": ""}]...
|
[{"post_id": 53160, "ts": "202 [{"post_id": 53160, "ts": "2026-08-23T16:31:20Z", "hours": 6.5375, "text": "What started as a basic software systems course project just got a massive 6-hour architectural overhaul. I wanted to build ARENA, an identity-verified multiplayer Tic-Tac-Toe game where your face is literally your password.Here is the breakdown of the sprint to get to v1.0.0:The Biometric Overhaul (Moving to the Edge) Originally, the facial recognition was a heavy, monolithic server-side pipeline. It was a dependency nightmare and crushed the server. I completely ripped it out and migrated to Edge ML using face-api.js. Now, the client browser computes 128-d facial encodings directly on the user’s GPU. Server load dropped to near-zero, and the latency is basically gone.The Microservice Migration I took the original god file and shattered it into a clean microservice architecture. Containerized the whole thing using Docker Compose. It now features a resilient Python backoff/retry loop so the FastAPI backend waits patiently for the databases to initialize before booting.The Local Network “Final Boss” This was the hardest part of the overhaul. I wanted users to connect via their phones on the same Wi-Fi. But Chrome strictly blocks webcam access on unencrypted HTTP connections unless it is localhost.The Fix: I set up an Nginx reverse proxy to route frontend and API traffic through a single port. Then, I wrote dynamic JavaScript routing and piped the whole thing through an ngrok tunnel. Now, I can spin up the containers, run the tunnel, and send friends a secure HTTPS link to play against me locally! It was a crazy 6 hours of fighting WebSocket race conditions and Nginx regex bugs, but ARENA is finally production-ready (I hope :) )."}]...
|
Title: ARENA: Local Multiplayer Tic-Tac-Toe game b Title: ARENA: Local Multiplayer Tic-Tac-Toe game by @jayanth_raveendra | Stardance
Devlogs:
What started as a basic software systems course project just got a massive 6-hour architectural overhaul. I wanted to build ARENA, an identity-verified multiplayer Tic-Tac-Toe game where your face is literally your password.Here is the breakdown of the sprint to get to v1.0.0:The Biometric Overhaul (Moving to the Edge) Originally, the facial recognition was a heavy, monolithic server-side pipeline. It was a dependency nightmare and crushed the server. I completely ripped it out and migrated to Edge ML using face-api.js. Now, the client browser computes 128-d facial encodings directly on the user’s GPU. Server load dropped to near-zero, and the latency is basically gone.The Microservice Migration I took the original god file and shattered it into a clean microservice architecture. Containerized the whole thing using Docker Compose. It now features a resilient Python backoff/retry loop so the FastAPI backend waits patiently for the databases to initialize before booting.The Local Network “Final Boss” This was the hardest part of the overhaul. I wanted users to connect via their phones on the same Wi-Fi. But Chrome strictly blocks webcam access on unencrypted HTTP connections unless it is localhost.The Fix: I set up an Nginx reverse proxy to route frontend and API traffic through a single port. Then, I wrote dynamic JavaScript routing and piped the whole thing through an ngrok tunnel. Now, I can spin up the containers, run the tunnel, and send friends a secure HTTPS link to play against me locally! It was a crazy 6 hours of fighting WebSocket race conditions and Nginx regex bugs, but ARENA is finally production-ready (I hope :) ).
Ships:
ARENA is a real-time multiplayer game where your face is your login. No passwords, no typing—just split-second biometric verification computed directly on your device’s GPU. TECHNICAL HIGHLIGHTS: 🔹 Edge ML Biometrics: Uses face-api.js for zero-latency, client-side 128-d facial encoding. 🔹 Real-Time WebSockets: Live asynchronous matchmaking lobby and instant mid-game disconnect handling. 🔹 FIDE-Standard Elo: Mathematically calculates win probabilities and dynamically updates your global ranking. 🔹 Resilient Microservices: Fully containerized stack (FastAPI, Nginx, MySQL, MongoDB) with automated database retry loops. HOW TO DEMO: Because ARENA is a full-stack microservice architecture, it is too heavy for a free cloud host. My GitHub repository is the demo! To experience the magic on your own machine: Clone the repo and add the .env variables. Run "docker compose up --build -d" in your terminal. Go to localhost:5500 in your browser and register your face! (Want to play with friends on your Wi-Fi? The README has instructions on how to use ngrok to securely tunnel the Nginx proxy to their phones!)...
|
1793451357.7671902
|
1793537757.7671902
|
|
52880
|
My own site! by @azhan_builds | Stardance
|
azhan_builds
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T16:28:45Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "There we go! I just finished my first personal site. Although it is very basic, it is something I built myself and I am proud of. This was not much of a challenge, but the road up ahead is not straight and I must be prepared for it. Anyways, that is all for now.", "repo": "https://github.com/azhan-builds/My-site", "demo": "https://azhan-builds.github.io/My-site/"}]...
|
[{"post_id": 53084, "ts": "202 [{"post_id": 53084, "ts": "2026-08-23T14:39:55Z", "hours": 1.0856, "text": "I just joined Hack Club and the Stardust program. I completed the first project that is my own personal site. This is just a start and I do agree that it is too basic, but I have a long way ahead and I believe I will get much better ahead."}]...
|
Title: My own site! by @azhan_builds | Stardance
Title: My own site! by @azhan_builds | Stardance
Devlogs:
I just joined Hack Club and the Stardust program. I completed the first project that is my own personal site. This is just a start and I do agree that it is too basic, but I have a long way ahead and I believe I will get much better ahead.
Ships:
There we go! I just finished my first personal site. Although it is very basic, it is something I built myself and I am proud of. This was not much of a challenge, but the road up ahead is not straight and I must be prepared for it. Anyways, that is all for now....
|
1793512321.0617886
|
1793598721.0617886
|
|
52716
|
Focus Blocker by @Zair | Stardance
|
Zair
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T16:07:34Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Rewrote Focus Blocker with 3 major QoL improvements: named presets (multiple blocklists for different contexts like study/gaming, not just one global list), a stats command showing total sessions and focus time, and an interactive setup wizard so you don’t have to manually edit text files. Also added a remove command for presets and a help command. The trickiest part was debugging subtle bash issues — a missing space inside [[ ]] that silently broke number validation every time, and a case statement where the wildcard pattern was catching commands before they could match their real cases. To test: run ./focus setup to configure it interactively, then ./focus to block a named preset, and ./focus stats to see your history.", "repo": "https://github.com/Shinigami-tech/focus-blocker", "demo": "https://github.com/user-attachments/assets/fbd07b9c-3d32-4064-aea8-f22b9eeacf02"}]...
|
[{"post_id": 52943, "ts": "202 [{"post_id": 52943, "ts": "2026-08-23T10:01:18Z", "hours": 0.3594, "text": "Added to the blocklist some websites (LinkedIn, Discord, Pinterest)"}]...
|
Title: Focus Blocker by @Zair | Stardance
Devlogs Title: Focus Blocker by @Zair | Stardance
Devlogs:
Added to the blocklist some websites (LinkedIn, Discord, Pinterest)
Ships:
Rewrote Focus Blocker with 3 major QoL improvements: named presets (multiple blocklists for different contexts like study/gaming, not just one global list), a stats command showing total sessions and focus time, and an interactive setup wizard so you don’t have to manually edit text files. Also added a remove command for presets and a help command. The trickiest part was debugging subtle bash issues — a missing space inside [[ ]] that silently broke number validation every time, and a case statement where the wildcard pattern was catching commands before they could match their real cases. To test: run ./focus setup to configure it interactively, then ./focus to block a named preset, and ./focus stats to see your history....
|
1793497769.6502154
|
1793584169.6502154
|
|
50739
|
My very own WebOS by @hikmat | Stardance
|
hikmat
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T16:03:38Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "During these 6 days I spent on the project I had so much fun learning and building my own WebOS difficulties were that I did not know how to code luckily I took the workshop guides to build this project which Im very proud of!", "repo": "https://github.com/hikmatgara/stardance.os", "demo": "https://stardance-os.vercel.app"}]...
|
[{"post_id": 53140, "ts": "202 [{"post_id": 53140, "ts": "2026-08-23T16:01:24Z", "hours": 0.2739, "text": "Im finalising this project I had so much fun learning and building at the same time I added my last 2 apps to the WebOS might comeback to this project in the future and re-ship."}, {"post_id": 51818, "ts": "2026-08-21T17:41:15Z", "hours": 0.8731, "text": "Added my first app “Diary” I actually started feeling Like Terry Davis after building this Webo, I will hopefully finish and ship the project tomorrow if nothing breaks down)"}, {"post_id": 50927, "ts": "2026-08-20T12:08:29Z", "hours": 1.1497, "text": "Updated the wallpaper to be visible on the demo URL, then restyled the close and open buttons and to finalize it by uploading everything to my GitHub Repo."}, {"post_id": 50547, "ts": "2026-08-19T19:00:54Z", "hours": 2.2658, "text": "I refined the code added a separate JS file and linked it to html file then I also changed the wallpaper of my WebOS, added buttons to open and close the welcome window and fixed the clock so now its live."}, {"post_id": 50190, "ts": "2026-08-19T10:05:17Z", "hours": 1.0831, "text": "restyled my WebOS, changed the wallpaper, added a top bar and added a live clock but for some reason it doesn’t update :( Will fix it soon!"}, {"post_id": 49729, "ts": "2026-08-18T17:16:01Z", "hours": 1.0633, "text": "I added a wallpaper and tinkered with borders, paddings and margins."}, {"post_id": 49516, "ts": "2026-08-18T12:04:34Z", "hours": 1.1044, "text": "I started learning how to code in html big thanks to hack club for this life changing opportunity and so far I started coding the webOS and its going smooth"}]...
|
Title: My very own WebOS by @hikmat | Stardance
D Title: My very own WebOS by @hikmat | Stardance
Devlogs:
I started learning how to code in html big thanks to hack club for this life changing opportunity and so far I started coding the webOS and its going smooth
I added a wallpaper and tinkered with borders, paddings and margins.
restyled my WebOS, changed the wallpaper, added a top bar and added a live clock but for some reason it doesn’t update :( Will fix it soon!
I refined the code added a separate JS file and linked it to html file then I also changed the wallpaper of my WebOS, added buttons to open and close the welcome window and fixed the clock so now its live.
Updated the wallpaper to be visible on the demo URL, then restyled the close and open buttons and to finalize it by uploading everything to my GitHub Repo.
Added my first app “Diary” I actually started feeling Like Terry Davis after building this Webo, I will hopefully finish and ship the project tomorrow if nothing breaks down)
Im finalising this project I had so much fun learning and building at the same time I added my last 2 apps to the WebOS might comeback to this project in the future and re-ship.
Ships:
During these 6 days I spent on the project I had so much fun learning and building my own WebOS difficulties were that I did not know how to code luckily I took the workshop guides to build this project which Im very proud of!...
|
1793324930.0969868
|
1793411330.0969868
|
|
37484
|
DanDB by @dan | Stardance
|
dan
|
1
|
24.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T15:43:04Z", "hours": 24.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "DanDB is a Python module designed primarily for creating, editing, and displaying tables. It also has a number of built-in functions useful for work relating to data analysis, and similar fields. It allows for more functions and abilities related to graphing than built-in Python could ever offer.", "repo": "https://github.com/Retro2D/DanDB", "demo": "https://pypi.org/project/DanDB/"}]...
|
[{"post_id": 53126, "ts": "202 [{"post_id": 53126, "ts": "2026-08-23T15:37:09Z", "hours": 0.8386, "text": "v0.0.3 released. Now you can download and import the project via pypi with “pip install DanDB”!"}, {"post_id": 52762, "ts": "2026-08-23T03:13:59Z", "hours": 3.3792, "text": "v0.0.1 has finally released! After many hours of debugging, building, and mostly slacking, the initial release of DanDB is now available. After a small amount of bug testing, I will release DanDB onto PyPi. Besides that, it is mostly done."}, {"post_id": 48601, "ts": "2026-08-17T01:54:26Z", "hours": 2.2278, "text": "I have restructured some of the modules, and fixed some key syntax/grammar mistakes. I also have now released the module onto Github: https://github.com/Retro2D/DanDB . This marks the pre-release for pre-alpha v0.0.1 (so a pre-prealpha kinda)."}, {"post_id": 45588, "ts": "2026-08-12T05:31:40Z", "hours": 0.9383, "text": "Got some JSON working. Currently planning on replacing the outdated raw table with a cleaner, nicer JSON look. Here is what the structure looks like: (First down is the name, second is the data structure for the row/column names and data)"}, {"post_id": 43074, "ts": "2026-08-08T04:35:37Z", "hours": 3.1303, "text": "I have completely revamped the raw data to actually fit what is being shown in the graph. Confused? Yeah, me too. Basically, previously the raw string was only capable of showing data on the first row of the list instead of all of them. Tables still functioned normally since they only relied on in-class variables instead of the raw data. However, it would be confusing for people to find and edit the string based on the raw data using that method. Besides this, I have fixed multiple bugs varying from small visual pains to the graph-breaking kinda stuff. On the next update, I will add support for JSON strings based on graphs. I will also add different kinds of graphing in later updates!"}, {"post_id": 42444, "ts": "2026-08-07T05:12:06Z", "hours": 2.8006, "text": "Many different bug fixes, currently rewriting the code to be both easier to read and more lightweight. Along with that, I added padding for long row names. Currently working on making the text at the top actually fit the chart."}, {"post_id": 35500, "ts": "2026-07-26T23:43:02Z", "hours": 1.6542, "text": "Word shortening is here! Now, the prettyprint function will be able to either lengthen or shorten values based on row word size. In this case, I shortened “hello world!” into “hello”. I also fixed a pretty big bug that inaccurately displayed data values for tables with two or more columns."}, {"post_id": 34214, "ts": "2026-07-24T18:48:52Z", "hours": 1.1581, "text": "It looks so much better now! Now added padding to lengthen shorter data entries. Currently working on the same but for shortening larger entries. Now it is starting to look like Microsoft Excel!"}, {"post_id": 33341, "ts": "2026-07-23T05:11:54Z", "hours": 2.1581, "text": "FINALLY, the columns are properly outputting. Yes, I still need to add better formatting, and yes, I need to add other types of graphs… but I have made some serious progress since last devlog!"}, {"post_id": 32123, "ts": "2026-07-21T02:11:48Z", "hours": 3.3094, "text": "Finally got multiple dimensions! May not sound like much, but this took hours of planning to do. You can also now print out very basic graphs with multiple dimensions."}, {"post_id": 31873, "ts": "2026-07-20T16:45:39Z", "hours": 0.4453, "text": "Got some pretty printing working! :D"}, {"post_id": 31850, "ts": "2026-07-20T15:49:25Z", "hours": 1.5611, "text": "Starting to work on this! I haven’t uploaded to Github yet, but it is able to create basic new table datatypes. Currently working on a pretty print function to give a nice, clean output!"}]...
|
Title: DanDB by @dan | Stardance
Devlogs:
Startin Title: DanDB by @dan | Stardance
Devlogs:
Starting to work on this! I haven’t uploaded to Github yet, but it is able to create basic new table datatypes. Currently working on a pretty print function to give a nice, clean output!
Got some pretty printing working! :D
Finally got multiple dimensions! May not sound like much, but this took hours of planning to do. You can also now print out very basic graphs with multiple dimensions.
FINALLY, the columns are properly outputting. Yes, I still need to add better formatting, and yes, I need to add other types of graphs… but I have made some serious progress since last devlog!
It looks so much better now! Now added padding to lengthen shorter data entries. Currently working on the same but for shortening larger entries. Now it is starting to look like Microsoft Excel!
Word shortening is here! Now, the prettyprint function will be able to either lengthen or shorten values based on row word size. In this case, I shortened “hello world!” into “hello”. I also fixed a pretty big bug that inaccurately displayed data values for tables with two or more columns.
Many different bug fixes, currently rewriting the code to be both easier to read and more lightweight. Along with that, I added padding for long row names. Currently working on making the text at the top actually fit the chart.
I have completely revamped the raw data to actually fit what is being shown in the graph. Confused? Yeah, me too. Basically, previously the raw string was only capable of showing data on the first row of the list instead of all of them. Tables still functioned normally since they only relied on in-class variables instead of the raw data. However, it would be confusing for people to find and edit the string based on the raw data using that method. Besides this, I have fixed multiple bugs varying from small visual pains to the graph-breaking kinda stuff. On the next update, I will add support for JSON strings based on graphs. I will also add different kinds of graphing in later updates!
Got some JSON working. Currently planning on replacing the outdated raw table with a cleaner, nicer JSON look. Here is what the structure looks like: (First down is the name, second is the data structure for the row/column names and data)
I have restructured some of the modules, and fixed some key syntax/grammar mistakes. I also have now released the module onto Github: https://github.com/Retro2D/DanDB . This marks the pre-release for pre-alpha v0.0.1 (so a pre-prealpha kinda).
v0.0.1 has finally released! After many hours of debugging, building, and mostly slacking, the initial release of DanDB is now available. After a small amount of bug testing, I will release DanDB onto PyPi. Besides that, it is mostly done.
v0.0.3 released. Now you can download and import the project via pypi with “pip install DanDB”!
Ships:
DanDB is a Python module designed primarily for creating, editing, and displaying tables. It also has a number of built-in functions useful for work relating to data analysis, and similar fields. It allows for more functions and abilities related to graphing than built-in Python could ever offer....
|
1793317897.1359813
|
1793404297.1359813
|
|
987
|
Oppurtunity OS by @dseshukumar2008 | Stardance
|
dseshukumar2008
|
1
|
219.84
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T15:28:16Z", "hours": 136.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built and refined OppurtunityOS , an AI powered career development platform designed to help students understand their skills, career paths, and can be more confident about the career . The platform includes the features such as Career Roadmaps, Project recommendations, AI Career coach, Resume Builder and Analyzer , Github Analyzer , Skill Gap Analysis , Career Explorer, and Analytics. One of the main challenges that I faced was handling API calls . I refined the interface , removed unnecessary features , and ensured final platform is deployed. I am proud of bringing the different career-development tools together into one working platform. To use the project , use the try project button to explore the deployed application , and see the source code to view the complete implementation and README.", "repo": "https://github.com/dseshukumar2008-hub/opportunityOS", "demo": "https://opportunity-os-rust.vercel.app/"}]...
|
[{"post_id": 69727, "ts": "202 [{"post_id": 69727, "ts": "2026-09-17T17:35:11Z", "hours": 9.6806, "text": "While working on OpportunityOS, I realized as the project grew , the CSS had become more complex , With repeated tailwind classes , different styling patterns, larger border radiuses. I decided to simplify the existing styling component by component, focusing on cleaner layouts, consistent colors, simpler borders and shadows, and more maintainable CSS while keeping the existing UI structure and functionality unchanged. I made changes and removed unnecessary repeated code."}, {"post_id": 64952, "ts": "2026-09-09T18:06:24Z", "hours": 11.1286, "text": "Fixed the local AI connection issue by routing frontend API requests through the vite proxy to the deployed backend . Debugged several issues including: -> offline fallback states -> Incorrect AI response handling -> stuck analysis / loading states scrolling and time stamp issues"}, {"post_id": 63536, "ts": "2026-09-07T13:33:53Z", "hours": 10.7625, "text": "Working on the project engine . The main page is taking step , but OppurtunityOS Copilot side panel still needs fixing - messages are not getting a proper response . Fixing the integration and working to get the proper response"}, {"post_id": 62056, "ts": "2026-09-05T09:06:42Z", "hours": 10.3364, "text": "Added the Career quiz to the Skill Arcade - a timed 10 question challenge designed to test challenge around coding and technology . Currently polishing the Skill arcade experience and getting oppurtunityOS closer to final submission."}, {"post_id": 60708, "ts": "2026-09-03T08:22:30Z", "hours": 11.0881, "text": "Build Tech Match for the Skill Arcade !!! A quick challenge where you match technologies with their correct categories and test your knowledge under time pressure."}, {"post_id": 58637, "ts": "2026-08-31T03:49:46Z", "hours": 10.4067, "text": "After spending time fixing the bugs - I decided to make finding bugs a game . So I added a new game to my skill arcade - bug hunter. The idea is simple , first the user have to select the programming language , and then have to select the toughness level , based on that there will be code snippets and options for that code snippets."}, {"post_id": 56740, "ts": "2026-08-28T16:48:24Z", "hours": 10.3039, "text": "After spending too much time fixing bugs , i got tired of debugging So instead of fixing another bug …. I tried to build something new . I implemented Skill Arcade in Opportunity OS - a small gamified section where users can test their skills through interactive games"}, {"post_id": 55130, "ts": "2026-08-26T16:22:11Z", "hours": 10.1347, "text": "I am continuing to manually refine and test the project feature by feature . I focused on debugging the Resume Analyzer , improving the error flow , and checking the complete analysis process . Still refining the project , making changes in the code , getting errors and fixing them ."}, {"post_id": 53102, "ts": "2026-08-23T15:17:00Z", "hours": 4.3336, "text": "finally OpportunityOS is deployed and it is live !!!"}, {"post_id": 52494, "ts": "2026-08-22T17:11:34Z", "hours": 9.8203, "text": "Recently I have been refining the career intelligence dashboard and improving the overall UI and user experience . I am also working on connecting the Analytics page with all the existing features , so users can get a complete view of their progress and activity across Opportunity OS . The focus is now on making the existing features feel more connected , polished , and product ready . Still Building … still improving !!!"}, {"post_id": 49693, "ts": "2026-08-18T16:16:04Z", "hours": 9.9183, "text": "Opportunity OS is getting closer to the finish line !!! The focus has now shifted from building features to make sure everything actually works as intended Currently working on : Fixing remaining bugs Testing complete user flows checking AI - powered features polishing UI Fixing navigation and state issues verifying existing features before release At this stage , it’s less about adding more and more features - and more about making the existing product reliable , consistent , and ready to ship . The final stretch is here ……."}, {"post_id": 38424, "ts": "2026-07-31T19:45:09Z", "hours": 10.7006, "text": "Opportunity OS has entered its final phase . Currently I am focusing on fixing the bugs , testing and ensuring every feature works before final release . The finish line is getting closer"}, {"post_id": 28867, "ts": "2026-07-15T12:57:36Z", "hours": 9.6481, "text": "continued refining the OpportunityOS onboarding experience by improving the overall UI, spacing, alignment, typography, and visual consistency across all onboarding steps. The focus wasn’t on adding new features but on creating a smoother, more intuitive, and premium experience that makes a great first impression. One step closer to a polished SaaS product!"}, {"post_id": 23475, "ts": "2026-07-06T14:05:30Z", "hours": 10.7319, "text": "I focused on improving the onboarding experience for OpportunityOS. I redesigned the Personal Details, Education, and Skills screens to create a cleaner and more premium user experience. I also introduced a new Career Interests step, allowing users to share their career goals so OpportunityOS can deliver more personalized opportunities and recommendations. The onboarding is becoming more intuitive, engaging, and aligned with the vision of building an AI-powered career platform for students"}, {"post_id": 15145, "ts": "2026-06-24T16:31:24Z", "hours": 8.7697, "text": "I focused on enhancing the Resume Builder in OpportunityOS. Improved the resume creation workflow, refined the live preview experience, strengthened Firebase data synchronization, and validated auto-save functionality for a smoother user experience. Also worked on ATS analysis improvements and overall stability to ensure users can build professional resumes seamlessly."}, {"post_id": 14465, "ts": "2026-06-23T16:26:54Z", "hours": 14.9064, "text": "Built the Career Explorer module in OpportunityOS to help users discover career paths based on their skills and profile. Added role-based career cards, skill gap insights, recommended projects, learning timelines, and roadmap generation for different career tracks. Currently focusing on improving matching accuracy, personalization, and overall user experience."}, {"post_id": 11928, "ts": "2026-06-19T13:37:55Z", "hours": 5.7172, "text": "Project Recommendation Engine in OpportunityOS. One problem I noticed is that many students know their dream role but have no idea what projects they should actually build. So I developed an AI-powered engine that analyzes a student’s target role and skill gaps, then recommends portfolio-worthy projects that can strengthen their profile and improve career readiness. Turning career goals into actionable projects, one recommendation at a time. user flow : user selects the specialization that he has choosen next user selects the target role Stay tuned for more updates !!!"}, {"post_id": 10024, "ts": "2026-06-16T16:13:40Z", "hours": 10.1594, "text": "After generating a personalized Career Roadmap, the next step is understanding what’s missing. The Skill Gap Analysis feature helps users compare their current skills with the skills required for their dream career. For example, if someone wants to become an AI Engineer, OpportunityOS can analyze their profile and show which skills they already have and which skills they still need to learn."}, {"post_id": 8533, "ts": "2026-06-14T06:06:49Z", "hours": 6.7772, "text": "Development Update: AI-Powered Career Roadmap in OpportunityOS One challenge students face is not knowing what to learn next after choosing a career path. Today, I worked on the Career Roadmap Module in OpportunityOS. How does it work : -> Lets users choose a target role (Software Engineer, AI Engineer, Full Stack Developer, etc.) -> Generates a structured learning roadmap Breaks the journey into clear phases and milestones -> Shows recommended learning resources for each phase -> Tracks roadmap progress over time Integrates with Skill Gap Analysis to recommend the next skills to learn Still improving the experience, but excited to see the roadmap becoming more interactive and personalized."}, {"post_id": 7300, "ts": "2026-06-12T05:14:32Z", "hours": 4.055, "text": "One of the biggest challenges students face is finding relevant opportunities scattered across multiple platforms. To solve this, I built the Opportunities Hub inside OpportunityOS , where students can discover internships, jobs, hackathons, scholarships, and competitions from a single platform."}, {"post_id": 4909, "ts": "2026-06-08T14:24:57Z", "hours": 3.5189, "text": "AI Resume Analysis is now live in OpportunityOS. One thing I’ve noticed is that many students apply for opportunities without knowing whether their resume is actually ATS-friendly or aligned with the role they’re targeting. To address this, I built an AI-powered Resume Analysis feature using Google Gemini, allowing users to upload a resume or analyze their OpportunityOS profile to receive ATS scoring, strengths and weaknesses analysis, missing skill detection, and personalized improvement suggestions. Stay tuned for more features !!!"}, {"post_id": 4726, "ts": "2026-06-08T05:04:03Z", "hours": 2.1067, "text": "Thinking a lot , I thought of building a OpportunityOS Copilot, a context-aware AI assistant built directly into the platform. Instead of acting like a generic chatbot, the Copilot is designed to understand a user’s profile, skills, career goals, resume insights, and opportunities data to provide personalized guidance. And Guess what the answer is insane !!!"}, {"post_id": 3598, "ts": "2026-06-06T16:25:34Z", "hours": 4.8642, "text": "Worked on OpportunityOS onboarding and authentication today. Implemented a first-time user onboarding flow that guides users through profile creation, skill selection, interests, and career goals setup after Google Sign In."}, {"post_id": 2781, "ts": "2026-06-05T16:10:58Z", "hours": 10.1692, "text": "Built and organized multiple settings components including Account Information, Password & Security, Notifications, Privacy, Integrations, Appearance, Data Storage, and Email Preferences. Next, I’ll connect these settings to live backend services and replace remaining placeholder functionality with real-time integrations. Stay tuned !!!!!"}, {"post_id": 1548, "ts": "2026-06-03T17:07:23Z", "hours": 4.4708, "text": "I worked on the login page of Oppurtunity OS . I added a branding section on the left side to highlight the main features of the platform . I also improved the login form layout and added google and github signin options to make the user interface look more good and efficient ."}, {"post_id": 935, "ts": "2026-06-02T18:06:06Z", "hours": 5.0983, "text": "I worked on the home page of Oppurtunity OS I improved the landing page design , navigation bar, overall layout . I also fixed alignment issues ."}, {"post_id": 228, "ts": "2026-06-01T10:39:24Z", "hours": 0.5008, "text": "I completed the foundation of OppurtunityOS, a platform designed to help students , discover the hackathons , internships , competitions and scholarships."}]...
|
Title: Oppurtunity OS by @dseshukumar2008 | Starda Title: Oppurtunity OS by @dseshukumar2008 | Stardance
Devlogs:
I completed the foundation of OppurtunityOS, a platform designed to help students , discover the hackathons , internships , competitions and scholarships.
I worked on the home page of Oppurtunity OS I improved the landing page design , navigation bar, overall layout . I also fixed alignment issues .
I worked on the login page of Oppurtunity OS . I added a branding section on the left side to highlight the main features of the platform . I also improved the login form layout and added google and github signin options to make the user interface look more good and efficient .
Built and organized multiple settings components including Account Information, Password & Security, Notifications, Privacy, Integrations, Appearance, Data Storage, and Email Preferences. Next, I’ll connect these settings to live backend services and replace remaining placeholder functionality with real-time integrations. Stay tuned !!!!!
Worked on OpportunityOS onboarding and authentication today. Implemented a first-time user onboarding flow that guides users through profile creation, skill selection, interests, and career goals setup after Google Sign In.
Thinking a lot , I thought of building a OpportunityOS Copilot, a context-aware AI assistant built directly into the platform. Instead of acting like a generic chatbot, the Copilot is designed to understand a user’s profile, skills, career goals, resume insights, and opportunities data to provide personalized guidance. And Guess what the answer is insane !!!
AI Resume Analysis is now live in OpportunityOS. One thing I’ve noticed is that many students apply for opportunities without knowing whether their resume is actually ATS-friendly or aligned with the role they’re targeting. To address this, I built an AI-powered Resume Analysis feature using Google Gemini, allowing users to upload a resume or analyze their OpportunityOS profile to receive ATS scoring, strengths and weaknesses analysis, missing skill detection, and personalized improvement suggestions. Stay tuned for more features !!!
One of the biggest challenges students face is finding relevant opportunities scattered across multiple platforms. To solve this, I built the Opportunities Hub inside OpportunityOS , where students can discover internships, jobs, hackathons, scholarships, and competitions from a single platform.
Development Update: AI-Powered Career Roadmap in OpportunityOS One challenge students face is not knowing what to learn next after choosing a career path. Today, I worked on the Career Roadmap Module in OpportunityOS. How does it work : -> Lets users choose a target role (Software Engineer, AI Engineer, Full Stack Developer, etc.) -> Generates a structured learning roadmap Breaks the journey into clear phases and milestones -> Shows recommended learning resources for each phase -> Tracks roadmap progress over time Integrates with Skill Gap Analysis to recommend the next skills to learn Still improving the experience, but excited to see the roadmap becoming more interactive and personalized.
After generating a personalized Career Roadmap, the next step is understanding what’s missing. The Skill Gap Analysis feature helps users compare their current skills with the skills required for their dream career. For example, if someone wants to become an AI Engineer, OpportunityOS can analyze their profile and show which skills they already have and which skills they still need to learn.
Project Recommendation Engine in OpportunityOS. One problem I noticed is that many students know their dream role but have no idea what projects they should actually build. So I developed an AI-powered engine that analyzes a student’s target role and skill gaps, then recommends portfolio-worthy projects that can strengthen their profile and improve career readiness. Turning career goals into actionable projects, one recommendation at a time. user flow : user selects the specialization that he has choosen next user selects the target role Stay tuned for more updates !!!
Built the Career Explorer module in OpportunityOS to help users discover career paths based on their skills and profile. Added role-based career cards, skill gap insights, recommended projects, learning timelines, and roadmap generation for different career tracks. Currently focusing on improving matching accuracy, personalization, and overall user experience.
I focused on enhancing the Resume Builder in OpportunityOS. Improved the resume creation workflow, refined the live preview experience, strengthened Firebase data synchronization, and validated auto-save functionality for a smoother user experience. Also worked on ATS analysis improvements and overall stability to ensure users can build professional resumes seamlessly.
I focused on improving the onboarding experience for OpportunityOS. I redesigned the Personal Details, Education, and Skills screens to create a cleaner and more premium user experience. I also introduced a new Career Interests step, allowing users to share their career goals so OpportunityOS can deliver more personalized opportunities and recommendations. The onboarding is becoming more intuitive, engaging, and aligned with the vision of building an AI-powered career platform for students
continued refining the OpportunityOS onboarding experience by improving the overall UI, spacing, alignment, typography, and visual consistency across all onboarding steps. The focus wasn’t on adding new features but on creating a smoother, more intuitive, and premium experience that makes a great first impression. One step closer to a polished SaaS product!
Opportunity OS has entered its final phase . Currently I am focusing on fixing the bugs , testing and ensuring every feature works before final release . The finish line is getting closer
Opportunity OS is getting closer to the finish line !!! The focus has now shifted from building features to make sure everything actually works as intended Currently working on : Fixing remaining bugs Testing complete user flows checking AI - powered features polishing UI Fixing navigation and state issues verifying existing features before release At this stage , it’s less about adding more and more features - and more about making the existing product reliable , consistent , and ready to ship . The final stretch is here …….
Recently I have been refining the career intelligence dashboard and improving the overall UI and user experience . I am also working on connecting the Analytics page with all the existing features , so users can get a complete view of their progress and activity across Opportunity OS . The focus is now on making the existing features feel more connected , polished , and product ready . Still Building … still improving !!!
finally OpportunityOS is deployed and it is live !!!
I am continuing to manually refine and test the project feature by feature . I focused on debugging the Resume Analyzer , improving the error flow , and checking the complete analysis process . Still refining the project , making changes in the code , getting errors and fixing them .
After spending too much time fixing bugs , i got tired of debugging So instead of fixing another bug …. I tried to build something new . I implemented Skill Arcade in Opportunity OS - a small gamified section where users can test their skills through interactive games
After spending time fixing the bugs - I decided to make finding bugs a game . So I added a new game to my skill arcade - bug hunter. The idea is simple , first the user have to select the programming language , and then have to select the toughness level , based on that there will be code snippets and options for that code snippets.
Build Tech Match for the Skill Arcade !!! A quick challenge where you match technologies with their correct categories and test your knowledge under time pressure.
Added the Career quiz to the Skill Arcade - a timed 10 question challenge designed to test challenge around coding and technology . Currently polishing the Skill arcade experience and getting oppurtunityOS closer to final submission.
Working on the project engine . The main page is taking step , but OppurtunityOS Copilot side panel still needs fixing - messages are not getting a proper response . Fixing the integration and working to get the proper response
Fixed the local AI connection issue by routing frontend API requests through the vite proxy to the deployed backend . Debugged several issues including: -> offline fallback states -> Incorrect AI response handling -> stuck analysis / loading states scrolling and time stamp issues
While working on OpportunityOS, I realized as the project grew , the CSS had become more complex , With repeated tailwind classes , different styling patterns, larger border radiuses. I decided to simplify the existing styling component by component, focusing on cleaner layouts, consistent colors, simpler borders and shadows, and more maintainable CSS while keeping the existing UI structure and functionality unchanged. I made changes and removed unnecessary repeated code.
Ships:
I built and refined OppurtunityOS , an AI powered career development platform designed to help students understand their skills, career paths, and can be more confident about the career . The platform includes the features such as Career Roadmaps, Project recommendations, AI Career coach, Resume Builder and Analyzer , Github Analyzer , Skill Gap Analysis , Career Explorer, and Analytics. One of the main challenges that I faced was handling API calls . I refined the interface , removed unnecessary features , and ensured final platform is deployed. I am proud of bringing the different career-development tools together into one working platform. To use the project , use the try project button to explore the deployed application , and see the source code to view the complete implementation and README....
|
1793472632.9168139
|
1793559032.9168139
|
|
53072
|
Personal Site by @polycarbohydrate | Stardance
|
polycarbohydrate
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T15:27:24Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my personal website. What is special about this is that I used Rust for everything. THere is HTML + CSS + JS for the base layer (to load the wasm and the animation css wheel). Sorry for the ugly looks, I will make it look much nicer when I have more time. I am still learning how to work with the Rust egui library to display good objects.", "repo": "", "demo": ""}]...
|
[{"post_id": 53085, "ts": "202 [{"post_id": 53085, "ts": "2026-08-23T14:42:54Z", "hours": 1.8778, "text": "I have rewrote my personal site in Rust! This is the first version of it (think of it as the skeleton), so it is pretty bare. I will make it look a lot nicer in the future! For the qualification of the personal site mission, there is HTML, CSS, and JS to load the webassembly."}]...
|
Title: Personal Site by @polycarbohydrate | Starda Title: Personal Site by @polycarbohydrate | Stardance
Devlogs:
I have rewrote my personal site in Rust! This is the first version of it (think of it as the skeleton), so it is pretty bare. I will make it look a lot nicer in the future! For the qualification of the personal site mission, there is HTML, CSS, and JS to load the webassembly.
Ships:
I made my personal website. What is special about this is that I used Rust for everything. THere is HTML + CSS + JS for the base layer (to load the wasm and the animation css wheel). Sorry for the ugly looks, I will make it look much nicer when I have more time. I am still learning how to work with the Rust egui library to display good objects....
|
1793537320.7862682
|
1793623720.7862682
|
|
30911
|
My own site! by @Mrdark | Stardance
|
Mrdark
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T15:24:48Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I am making first time a website . I dont even know how to code or smtg . It was a great learning path and I got to know how a website works , what is a domain , dns , SaaS , API , etc . Thanks to the stardance team", "repo": "https://github.com/anbu2203/persona/", "demo": "https://v0-anbumathi-chezhian-2203.vercel.app/"}]...
|
[{"post_id": 53109, "ts": "202 [{"post_id": 53109, "ts": "2026-08-23T15:21:52Z", "hours": 0.7344, "text": "My vibecoded website"}]...
|
Title: My own site! by @Mrdark | Stardance
Devlog Title: My own site! by @Mrdark | Stardance
Devlogs:
My vibecoded website
Ships:
I am making first time a website . I dont even know how to code or smtg . It was a great learning path and I got to know how a website works , what is a domain , dns , SaaS , API , etc . Thanks to the stardance team...
|
1793530542.8458622
|
1793616942.8458622
|
|
52685
|
Slack Bot#1 by @thapar_smayan | Stardance
|
thapar_smayan
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T14:57:59Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What I made I built Kaazmo (its my gamertag(; ) , a Slack bot that I made with Node.js and Slack Bolt. It has three commands: /kaazmo-ping to check if the bot is online, /kaazmo-help to show the available commands, and /kaazmo-joke to return a random joke. I also deployed it on a Nest server using systemd, so the bot keeps running after I disconnect from the server. What was challenging: The hardest part was getting the Slack tokens and Socket Mode connection working correctly, then setting everything up so the bot could run all the time on the server. I also had to figure out how to update the code through GitHub and deploy the changes to Nest. What I’m proud of I’m proud that I got the whole thing working and I can disconnect from Nest and the bot still responds in Slack. How to test it Open the Slack channel where the bot is installed and try: /kaazmo-ping — checks if the bot is working /kaazmo-help — shows the available commands /kaazmo-joke — gives you a random joke", "repo": "https://github.com/thaparsmayan2011-ctrl/stardance-slack-bot.git", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354"}]...
|
[{"post_id": 52235, "ts": "202 [{"post_id": 52235, "ts": "2026-08-22T10:26:52Z", "hours": 0.8108, "text": "I just set up my Slack bot using Node.js and Slack Bolt. I have added three commands, ping, help and joke. I have tested them in Slack, and published the working code to GitHub. I have also set up the token files. Now I’m going to deploy it on Nest so it can stay online 24/7(:"}]...
|
Title: Slack Bot#1 by @thapar_smayan | Stardance
Title: Slack Bot#1 by @thapar_smayan | Stardance
Devlogs:
I just set up my Slack bot using Node.js and Slack Bolt. I have added three commands, ping, help and joke. I have tested them in Slack, and published the working code to GitHub. I have also set up the token files. Now I’m going to deploy it on Nest so it can stay online 24/7(:
Ships:
What I made I built Kaazmo (its my gamertag(; ) , a Slack bot that I made with Node.js and Slack Bolt. It has three commands: /kaazmo-ping to check if the bot is online, /kaazmo-help to show the available commands, and /kaazmo-joke to return a random joke. I also deployed it on a Nest server using systemd, so the bot keeps running after I disconnect from the server. What was challenging: The hardest part was getting the Slack tokens and Socket Mode connection working correctly, then setting everything up so the bot could run all the time on the server. I also had to figure out how to update the code through GitHub and deploy the changes to Nest. What I’m proud of I’m proud that I got the whole thing working and I can disconnect from Nest and the bot still responds in Slack. How to test it Open the Slack channel where the bot is installed and try: /kaazmo-ping — checks if the bot is working /kaazmo-help — shows the available commands /kaazmo-joke — gives you a random joke...
|
1793490829.4566977
|
1793577229.4566977
|
|
18007
|
MorbidVisuals by @naver | Stardance
|
naver
|
2
|
15.0
|
239
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T13:50:26Z", "hours": 5.0, "multiplier": 13.87, "payout": 68, "blessing": "neutral", "text": "Updated the project to include a touch designer like blur mask using convex hull’s and gaussian blur also added a new drawing system that is a heck of a lot better than the old one", "repo": "https://github.com/20Cuneyt10/MorbidVisuals", "demo": "https://20cuneyt10.github.io/MorbidVisuals/"}, {"ship_num": 2, "ts": "2026-06-17T17:07:09Z", "hours": 10.0, "multiplier": 16.63, "payout": 171, "blessing": "neutral", "text": "I made a MediaPipe guide that gets the newly used tasks function instead of what nearly all other tutorials do (get the old function which isn’t supported anymore) wrote some scripts to use the 21 Hand Landmarks that we get through MediaPipe’s hand_landmark.task to write 4 scripts (from basic to complex)meddled with some math used a formula that i actually learned in school, turned the whole python scripts into one Web Assembly(with AI) html so i can offload the work onto the users pc then published it using githup pages in the making of this i ventured countless websites but main ones were googles original documents about the new .task function", "repo": "https://github.com/20Cuneyt10/MorbidVisuals", "demo": "https://20cuneyt10.github.io/MorbidVisuals/"}]...
|
[{"post_id": 53061, "ts": "202 [{"post_id": 53061, "ts": "2026-08-23T13:49:19Z", "hours": 1.135, "text": "Added the readme for the blur stuff and had AI help me on the WASM for the blur stuff all on the website with a flip camera keybind"}, {"post_id": 21154, "ts": "2026-07-02T23:18:22Z", "hours": 2.1069, "text": "Added a new drawing system took a bit to work it out but finally after switching to the normal python lists it was like a breeze. There are still some gimmicks i would like to fix in the near future, but as i just stated “in the near future”. Go to my GitHub to check this script or my other scripts about MediaPipe.👋"}, {"post_id": 20802, "ts": "2026-07-02T14:36:16Z", "hours": 1.6783, "text": "Working on new versions that utilize both hands. Also looking into other OpenCV functions like .GaussianBlur and .Canny. It took quite a bit to do the hand thing on the new .tasks() but after figuring that out it all went smoothly. Go check out my other code pieces about MediaPipe on my Github. 👋"}, {"post_id": 10636, "ts": "2026-06-17T14:23:48Z", "hours": 0.8308, "text": "Nearly finished with pushing the demo to the web .Not gonna lie I used AI to turn my code to WebAssembly for the demo since im not that good at html"}, {"post_id": 10591, "ts": "2026-06-17T12:34:29Z", "hours": 0.8283, "text": "Finished up the README looking up how to deploy this right now might use webassembly but ı dont know"}, {"post_id": 10565, "ts": "2026-06-17T11:19:03Z", "hours": 1.2558, "text": "Finishing up another script this one was a tad harder than the others because i decided to also rotate the square whilst making it bigger then added a square within the square using a formula that ı actually learned in school. Looking into how to actually deploy these (even tough this project and its repo has become a study more than a project)"}, {"post_id": 8682, "ts": "2026-06-14T12:49:44Z", "hours": 3.0156, "text": "Continuing the work on the new drawing system using visual input whilst also working on a sound level control script having some issues with it but nearly finished will push the full version to my github."}, {"post_id": 8349, "ts": "2026-06-13T21:32:08Z", "hours": 0.9811, "text": "Actively working on a new and improved drawing system that will use outside variables to draw on other places got it half working but still has some polishing to do and is nowhere near what i wanted to do may ask AI where i went wrong but im trying to use it as little as possible on this project didn’t add to README.md yet ,will try to add drawing polygons and arcs the next time."}, {"post_id": 8261, "ts": "2026-06-13T19:05:19Z", "hours": 1.66, "text": "Finished another script utilizing the results function even more and using it to draw lines and circles when pinched. Added to the repo and the README.md go check it out at my Github.👋"}, {"post_id": 8090, "ts": "2026-06-13T14:42:29Z", "hours": 1.73, "text": "Just finished the first python script and the README. about it. It’s a basic script for displaying hand landmarks in webcam footage. It is rather a simple script because I simply want to learn and test the waters before I sink too deep that I can’t swim back up .👋"}]...
|
Title: MorbidVisuals by @naver | Stardance
Devlog Title: MorbidVisuals by @naver | Stardance
Devlogs:
Just finished the first python script and the README. about it. It’s a basic script for displaying hand landmarks in webcam footage. It is rather a simple script because I simply want to learn and test the waters before I sink too deep that I can’t swim back up .👋
Finished another script utilizing the results function even more and using it to draw lines and circles when pinched. Added to the repo and the README.md go check it out at my Github.👋
Actively working on a new and improved drawing system that will use outside variables to draw on other places got it half working but still has some polishing to do and is nowhere near what i wanted to do may ask AI where i went wrong but im trying to use it as little as possible on this project didn’t add to README.md yet ,will try to add drawing polygons and arcs the next time.
Continuing the work on the new drawing system using visual input whilst also working on a sound level control script having some issues with it but nearly finished will push the full version to my github.
Finishing up another script this one was a tad harder than the others because i decided to also rotate the square whilst making it bigger then added a square within the square using a formula that ı actually learned in school. Looking into how to actually deploy these (even tough this project and its repo has become a study more than a project)
Finished up the README looking up how to deploy this right now might use webassembly but ı dont know
Nearly finished with pushing the demo to the web .Not gonna lie I used AI to turn my code to WebAssembly for the demo since im not that good at html
Working on new versions that utilize both hands. Also looking into other OpenCV functions like .GaussianBlur and .Canny. It took quite a bit to do the hand thing on the new .tasks() but after figuring that out it all went smoothly. Go check out my other code pieces about MediaPipe on my Github. 👋
Added a new drawing system took a bit to work it out but finally after switching to the normal python lists it was like a breeze. There are still some gimmicks i would like to fix in the near future, but as i just stated “in the near future”. Go to my GitHub to check this script or my other scripts about MediaPipe.👋
Added the readme for the blur stuff and had AI help me on the WASM for the blur stuff all on the website with a flip camera keybind
Ships:
I made a MediaPipe guide that gets the newly used tasks function instead of what nearly all other tutorials do (get the old function which isn’t supported anymore) wrote some scripts to use the 21 Hand Landmarks that we get through MediaPipe’s hand_landmark.task to write 4 scripts (from basic to complex)meddled with some math used a formula that i actually learned in school, turned the whole python scripts into one Web Assembly(with AI) html so i can offload the work onto the users pc then published it using githup pages in the making of this i ventured countless websites but main ones were googles original documents about the new .task function
Updated the project to include a touch designer like blur mask using convex hull’s and gaussian blur also added a new drawing system that is a heck of a lot better than the old one...
|
1793497799.9500766
|
1793584199.9500766
|
|
316
|
Mesa AI by @ng_qi_an | Stardance
|
ng_qi_an
|
1
|
56.0
|
917
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T13:44:58Z", "hours": 56.0, "multiplier": 16.82, "payout": 917, "blessing": "neutral", "text": "Finally, a ship!! 🚢 This project was really rushed, as my exams are coming, and I couldn’t finish much of it. Really hope to continue in the next event! But here is what Mesa AI does right now: 📋 Generate concise summary notes from lectures which you can edit yourself, in a Notion-style editor. 🤖 Comes with a agent (i like to call it sidekick) that can search your lecture notes, research on the web, and put all that together by editing directly into your notes. 🗹 Ships with a quiz function for reinforced learning as well Built with a flexible tab-interface, allowing you to make opened chats/quizzes larger, or on the side as you please. 📑 Subject-specific instructions keep notes & quizzes relevant to syllabus, instead of those generic AI study apps out there. 📚 And an organization system that splits notes into classes, and files into folders. Demo credentials: Email: [email protected] Password: test1234 I don’t recommend using this, since you’ll be skipping out on the actual tutorials and onboarding flow. Just use if you’re too lazy. Here are some improvements from the Flavourtown edition: Model flexiblity: No longer locked to just Gemini in the chat 👀 Custom Rag pipeline built from scratch: Files are uploaded in 10s, while chat context is no longer bloated. 🖼️ More supported files: PDFs, slides, word documents, images can all be uploaded. 🗲 Efficient notebooks design: The layout has been reconfigured, letting you resize the side panel, and move tabs anywhere you like. 🔍 Agent chat: Chat can now search through your files directly instead of being a wrapper ☁️ Editable notes: Notes are no longer read-only, and save your changes! Things I learned: How to upload files with streams, and making those streams editable. How to integrate a text-editor. How to make AI interact with the BlockNote editor, given they don’t have a direct AI extension for my use case. How to create a RAG system, from extracting, to chunking, to embedding and querying. How to add tools to the model, making it truly agentic. For more technical details & future plans, checkout the github! Full breakdown of tech stack is there. Show some love and try the demo too!", "repo": "https://github.com/ng-qi-an/mesa-ai", "demo": "https://mesa-ai.vercel.app"}]...
|
[{"post_id": 53049, "ts": "202 [{"post_id": 53049, "ts": "2026-08-23T13:19:48Z", "hours": 0.3097, "text": "Image embeddings!! Forgot to install hackatime on a new editor so all the time i spent here on here was wasted 💔 Notebook improvements 🖼️ Images from files are extracted and saved 🖹 The model is presented with a list of images to choose from, and can embed them directly into the notebook. 🗲 Generating notes are now single-step . The old generate title, subtitle, topics then generate notes is abolished and combined into a single request. This makes note generation almost instant! 📋 New bottom bar that shows notebook actions, along with a editor mode (toggle between editing and viewing). File uploads Files uploaded are now indexed reliably. Images are also extracted from files, as mentioned before. Other changes Topics has been removed temporarily. Quiz no longer has topic options as well. Notebook is no longer accessible on mobile The tutorial was cut short. 😢 Things I couldn’t do: Having to focus on exams, I couldn’t finish Mesa AI before stardance ends. Here are a list of things I’ll work to complete the next hackclub event: Mobile support for Notebooks Notebook topics that are procedurally generated Add flashcards Freshen up UI (little unpolished here and there) Add a marking mode (AI marks papers for you) Collaboration & sharing notebooks Code the dashboard page (as a consolation i included a mockup of what it would have been) Making topics on the class page actually work 📹 Check out the demo video and screenshots! (show some love for me missing like almost 4-5 hours of work here)"}, {"post_id": 43313, "ts": "2026-08-08T14:43:23Z", "hours": 3.0472, "text": "Upload improvements File uploads are more stable, and status updates resume between reloads Users can see what stage their file is at on the indexing progress Allows for file statuses to still work even if the file selector dialog box is closed and reopened."}, {"post_id": 39434, "ts": "2026-08-02T11:57:23Z", "hours": 10.0094, "text": "Agentic notes?!?! 👀 *i really need to post devlogs more often ;p) check out the demo first if you’re too lazy to read 🤓 Agent 🤖 : ⭐️ This is a crazy milestone, and I finally finished one of the biggest features i really wanted to bring to Mesa ai when i decided to continue it on stardance. The chat window can now edit, delete and move notebook content ! ✍️ You can ask the chat to summarise blocks, turn into different formats or even create tables ⚡️ 📖 Basically a mini notion + notebookLM but with a study agent Use this with your sources and the web to supercharge research ! 🔬 I have plans to make the chat be able to create flashcards, quizzes and future tools directly from the chat window along with history, so there wont be a need to make those manually anymore ✨ Editor : Chat agent cursor shows which block it’s interacting with (the white bar on the left) ⌨️ Diff editor to see what the agent changed 📋 Tool approvals so you can choose whether to accept it or not! ✅ While Blocknote provides some helpers for the AI extension, since i’m not using it as intended, I had to patch up alot of the implementation myself 😭 Chat : Finally allowed images to be pasted or dragged into the chat window 🖼️ Added cool tool UI for notebook edits too 🎶 Check out the new demo!!!! 🎥 (sorry if its abit dizzying i was playing with the zooms a little too much) Honestly, I never imagined I would be capable enough to create something like this, starting just about 6 months ago. 🥲 Gimme a follow too if u wanna see more of this project and find out when its done ❤️"}, {"post_id": 35216, "ts": "2026-07-26T14:32:20Z", "hours": 11.23, "text": "Usage limits! Went over the 10hr limit 😭 🙈 In this update, messages now count towards a single usage limit. The default is 3000 credits, which is equivalent to 3 million tokens of Gemini 3 Flash. 💸 Limits are enforced at the API level, and the chat level. Free models can still be used even when the limit is exhausted. 🔁 Limits reset every billing cycle, which is about 1 month from the same day. Built in mind to be extended with stripe in the future to be monetised. ❤️ This is a soft limit, so currently generating chats won’t stop halfway. 📋 Billing breakdown can be seen in the usage tab on account settings, will be extended in the future! Other than that, 🍝 The notebook chat API and main chat API were merged, fixing some of the spaghetti code building up. 📁 The main chat can now reference ALL files too! That’s right, ALL FILES. 🤓 Notebook chats are still limited to files only linked to the notebook. 📹 Check out the awesome demo & screenshot i forgot to include in the video. Chat generation kinda slow, just skip forward."}, {"post_id": 30674, "ts": "2026-07-18T13:24:33Z", "hours": 0.8264, "text": "Web search! Short devlog, but I added Perplexity Search as a tool to both standalone chat & notebook chat. 🔍 🐛 Took considerably longer cause I found some weird bug where thinking modes would become null on reload Check out the screenshot for the UI eyecandy! 🍭"}, {"post_id": 30606, "ts": "2026-07-18T09:57:26Z", "hours": 8.9583, "text": "Notebook & Chat updates! Been really busy and I forgot to log :( Notebooks ☁️ Notebooks now save ! Changes made to the editor persist between reloads. ➗ Math equations can be edited using Latex. You can now create custom physics formulas :) ✨ Brand new animation when generating that unintentionally looks like siri (it’s kinda laggy though) Chat 🤖Claude now works ⚒️ New UI to visualise the model’s tool calls 👀 Seeing which queries and sources the model pulls information from is now easier than ever 🌐 Plans to implement this for web search Check out this amazing demo below 📹 (might be a lil blurry cause of the file limit)"}, {"post_id": 27675, "ts": "2026-07-13T13:36:17Z", "hours": 6.6358, "text": "More UI overhauls!! I completely forgot to make devlogs 😭 Been really busy so far In this update, I introduced a notion style notebook editor, allowing users to edit their AI-generated notes. Along with that, I’ve polished up the library panel Chats and quizzes now open in a seperate tab Tabs can be dragged between the sidebar and the main panel, allowing for ultimate flexibility(check out the video!!!!) The main panel (notebook) can also be resized, making it more flexible on smaller devices like ipads. In my next devlog, I’ll work on making edited notes save, and polish up the quiz UI (it was rushed from flavourtown)"}, {"post_id": 19258, "ts": "2026-06-30T14:58:42Z", "hours": 5.4336, "text": "Facelift! Made some huge design changes to notebooks! The interface is now tabbed, and notebook content is finally editable like Notion. Still ironing out formatting for the new editor, so math is a little broken New library interface is resizable and supports dragging! (Took longer than usual cause alot of things had to be moved around ❤️. Enjoy the videos!!)"}, {"post_id": 9245, "ts": "2026-06-15T15:04:49Z", "hours": 1.2183, "text": "RAG pipeline! Finally migrated the old notebooks to a rag-based one. Most of the changes are backend, so theres not much to show :( Files (PDFs, slides, lecture notes) were directly used as sources for notebooks before. This was slow, inefficient, and wasted tokens. Now, files are converted to markdown on upload. This markdown is then processed, and broken down into chunks in the rag pipeline, making chat faster and more accurate! Additionally, chat uses the new AI gateway/Openrouter provider to ensure fallback and consistent speeds regardless of provider downtime (plagued the app during flavourtown) On preliminary testing, generation speeds jumped from 30s ttft to 10s ttft, with chat seeing the most improvements. The next update should improve UI and refine subject prompts (a lil too robotic rn)!"}, {"post_id": 1290, "ts": "2026-06-03T05:54:05Z", "hours": 3.4972, "text": "Added a model selector to the chat menu! Along with this, thinking modes were standardised across all models, and usages are now tabulated. I plan to add tools too, so the chat window can actually retrieve information from notebooks or materials uploaded."}, {"post_id": 222, "ts": "2026-06-01T10:14:52Z", "hours": 4.5847, "text": "Stardance!! 🌟 . Back story This project is a continuation from flavourtown ( https://flavortown.hackclub.com/projects/10428 ), initially to help students use AI to make studying faster. A short summary for those unfamiliar: Mesa AI would create summary notes, quizzes and chats in a interface called notebooks. It’s meant to be similar to Notebook LM, but actually make notes and offer more exam accurate (subject-based instructions) notes & quizzes. Unfortunately, I couldn’t finish Mesa AI in time (took almost 100 hours!). In Stardance, I aim to complete this project’s ambitious plans, and finally ship it. Here are the things I intend to change or add: Complete all the unfinished pages Migrate to a fully custom RAG engine Move towards openrouter and Vercel AI gateway after that gemini outage which plagued Mesa AI in most of flavourtown Move from a read-only summary notes to notes which you can actually edit, and Mesa AI will edit them with you (agentic studying) . All those changes would need me to fundementally rewrite how Mesa AI was built, and make this journey on Stardance even more interesting. Mesa AI could also evolve to not just be a notetaker, but a researcher and an entire online tutor too. . First Devlog To start off this rewrite, I’ve already made the custom RAG engine, which replaces Google’s file search API (too slow, unreliable, and locks me into using a Google API key). All files are indexed automatically by a combination of Jina (PDF to markdown) and Mistral (PDF to markdown too), along with OpenAI’s embedding models. A 20-word summary is then generated with Gemma 4 such that search queries are more relevant without relying on file name alone. To test this, I made a barebones boilerplate to simulate a real chat. (See the image!) Sorry I don’t have more pictures! This devlog was mainly backend. In my testing, indexing (turning the file into embeddings and the summary) takes about 20s, with subsequent messages regarding that file taking about 5-8s (search and retrieval). Really pleased with the accuracy though! Sadly i forgot to install hackatime on my mac so a few hours were lost when i was working outside :("}]...
|
Title: Mesa AI by @ng_qi_an | Stardance
Devlogs:
Title: Mesa AI by @ng_qi_an | Stardance
Devlogs:
Stardance!! 🌟 . Back story This project is a continuation from flavourtown ( https://flavortown.hackclub.com/projects/10428 ), initially to help students use AI to make studying faster. A short summary for those unfamiliar: Mesa AI would create summary notes, quizzes and chats in a interface called notebooks. It’s meant to be similar to Notebook LM, but actually make notes and offer more exam accurate (subject-based instructions) notes & quizzes. Unfortunately, I couldn’t finish Mesa AI in time (took almost 100 hours!). In Stardance, I aim to complete this project’s ambitious plans, and finally ship it. Here are the things I intend to change or add: Complete all the unfinished pages Migrate to a fully custom RAG engine Move towards openrouter and Vercel AI gateway after that gemini outage which plagued Mesa AI in most of flavourtown Move from a read-only summary notes to notes which you can actually edit, and Mesa AI will edit them with you (agentic studying) . All those changes would need me to fundementally rewrite how Mesa AI was built, and make this journey on Stardance even more interesting. Mesa AI could also evolve to not just be a notetaker, but a researcher and an entire online tutor too. . First Devlog To start off this rewrite, I’ve already made the custom RAG engine, which replaces Google’s file search API (too slow, unreliable, and locks me into using a Google API key). All files are indexed automatically by a combination of Jina (PDF to markdown) and Mistral (PDF to markdown too), along with OpenAI’s embedding models. A 20-word summary is then generated with Gemma 4 such that search queries are more relevant without relying on file name alone. To test this, I made a barebones boilerplate to simulate a real chat. (See the image!) Sorry I don’t have more pictures! This devlog was mainly backend. In my testing, indexing (turning the file into embeddings and the summary) takes about 20s, with subsequent messages regarding that file taking about 5-8s (search and retrieval). Really pleased with the accuracy though! Sadly i forgot to install hackatime on my mac so a few hours were lost when i was working outside :(
Added a model selector to the chat menu! Along with this, thinking modes were standardised across all models, and usages are now tabulated. I plan to add tools too, so the chat window can actually retrieve information from notebooks or materials uploaded.
RAG pipeline! Finally migrated the old notebooks to a rag-based one. Most of the changes are backend, so theres not much to show :( Files (PDFs, slides, lecture notes) were directly used as sources for notebooks before. This was slow, inefficient, and wasted tokens. Now, files are converted to markdown on upload. This markdown is then processed, and broken down into chunks in the rag pipeline, making chat faster and more accurate! Additionally, chat uses the new AI gateway/Openrouter provider to ensure fallback and consistent speeds regardless of provider downtime (plagued the app during flavourtown) On preliminary testing, generation speeds jumped from 30s ttft to 10s ttft, with chat seeing the most improvements. The next update should improve UI and refine subject prompts (a lil too robotic rn)!
Facelift! Made some huge design changes to notebooks! The interface is now tabbed, and notebook content is finally editable like Notion. Still ironing out formatting for the new editor, so math is a little broken New library interface is resizable and supports dragging! (Took longer than usual cause alot of things had to be moved around ❤️. Enjoy the videos!!)
More UI overhauls!! I completely forgot to make devlogs 😭 Been really busy so far In this update, I introduced a notion style notebook editor, allowing users to edit their AI-generated notes. Along with that, I’ve polished up the library panel Chats and quizzes now open in a seperate tab Tabs can be dragged between the sidebar and the main panel, allowing for ultimate flexibility(check out the video!!!!) The main panel (notebook) can also be resized, making it more flexible on smaller devices like ipads. In my next devlog, I’ll work on making edited notes save, and polish up the quiz UI (it was rushed from flavourtown)
Notebook & Chat updates! Been really busy and I forgot to log :( Notebooks ☁️ Notebooks now save ! Changes made to the editor persist between reloads. ➗ Math equations can be edited using Latex. You can now create custom physics formulas :) ✨ Brand new animation when generating that unintentionally looks like siri (it’s kinda laggy though) Chat 🤖Claude now works ⚒️ New UI to visualise the model’s tool calls 👀 Seeing which queries and sources the model pulls information from is now easier than ever 🌐 Plans to implement this for web search Check out this amazing demo below 📹 (might be a lil blurry cause of the file limit)
Web search! Short devlog, but I added Perplexity Search as a tool to both standalone chat & notebook chat. 🔍 🐛 Took considerably longer cause I found some weird bug where thinking modes would become null on reload Check out the screenshot for the UI eyecandy! 🍭
Usage limits! Went over the 10hr limit 😭 🙈 In this update, messages now count towards a single usage limit. The default is 3000 credits, which is equivalent to 3 million tokens of Gemini 3 Flash. 💸 Limits are enforced at the API level, and the chat level. Free models can still be used even when the limit is exhausted. 🔁 Limits reset every billing cycle, which is about 1 month from the same day. Built in mind to be extended with stripe in the future to be monetised. ❤️ This is a soft limit, so currently generating chats won’t stop halfway. 📋 Billing breakdown can be seen in the usage tab on account settings, will be extended in the future! Other than that, 🍝 The notebook chat API and main chat API were merged, fixing some of the spaghetti code building up. 📁 The main chat can now reference ALL files too! That’s right, ALL FILES. 🤓 Notebook chats are still limited to files only linked to the notebook. 📹 Check out the awesome demo & screenshot i forgot to include in the video. Chat generation kinda slow, just skip forward.
Agentic notes?!?! 👀 *i really need to post devlogs more often ;p) check out the demo first if you’re too lazy to read 🤓 Agent 🤖 : ⭐️ This is a crazy milestone, and I finally finished one of the biggest features i really wanted to bring to Mesa ai when i decided to continue it on stardance. The chat window can now edit, delete and move notebook content ! ✍️ You can ask the chat to summarise blocks, turn into different formats or even create tables ⚡️ 📖 Basically a mini notion + notebookLM but with a study agent Use this with your sources and the web to supercharge research ! 🔬 I have plans to make the chat be able to create flashcards, quizzes and future tools directly from the chat window along with history, so there wont be a need to make those manually anymore ✨ Editor : Chat agent cursor shows which block it’s interacting with (the white bar on the left) ⌨️ Diff editor to see what the agent changed 📋 Tool approvals so you can choose whether to accept it or not! ✅ While Blocknote provides some helpers for the AI extension, since i’m not using it as intended, I had to patch up alot of the implementation myself 😭 Chat : Finally allowed images to be pasted or dragged into the chat window 🖼️ Added cool tool UI for notebook edits too 🎶 Check out the new demo!!!! 🎥 (sorry if its abit dizzying i was playing with the zooms a little too much) Honestly, I never imagined I would be capable enough to create something like this, starting just about 6 months ago. 🥲 Gimme a follow too if u wanna see more of this project and find out when its done ❤️
Upload improvements File uploads are more stable, and status updates resume between reloads Users can see what stage their file is at on the indexing progress Allows for file statuses to still work even if the file selector dialog box is closed and reopened.
Image embeddings!! Forgot to install hackatime on a new editor so all the time i spent here on here was wasted 💔 Notebook improvements 🖼️ Images from files are extracted and saved 🖹 The model is presented with a list of images to choose from, and can embed them directly into the notebook. 🗲 Generating notes are now single-step . The old generate title, subtitle, topics then generate notes is abolished and combined into a single request. This makes note generation almost instant! 📋 New bottom bar that shows notebook actions, along with a editor mode (toggle between editing and viewing). File uploads Files uploaded are now indexed reliably. Images are also extracted from files, as mentioned before. Other changes Topics has been removed temporarily. Quiz no longer has topic options as well. Notebook is no longer accessible on mobile The tutorial was cut short. 😢 Things I couldn’t do: Having to focus on exams, I couldn’t finish Mesa AI before stardance ends. Here are a list of things I’ll work to complete the next hackclub event: Mobile support for Notebooks Notebook topics that are procedurally generated Add flashcards Freshen up UI (little unpolished here and there) Add a marking mode (AI marks papers for you) Collaboration & sharing notebooks Code the dashboard page (as a consolation i included a mockup of what it would have been) Making topics on the class page actually work 📹 Check out the demo video and screenshots! (show some love for me missing like almost 4-5 hours of work here)
Ships:
Finally, a ship!! 🚢 This project was really rushed, as my exams are coming, and I couldn’t finish much of it. Really hope to continue in the next event! But here is what Mesa AI does right now: 📋 Generate concise summary notes from lectures which you can edit yourself, in a Notion-style editor. 🤖 Comes with a agent (i like to call it sidekick) that can search your lecture notes, research on the web, and put all that together by editing directly into your notes. 🗹 Ships with a quiz function for reinforced learning as well Built with a flexible tab-interface, allowing you to make opened chats/quizzes larger, or on the side as you please. 📑 Subject-specific instructions keep notes & quizzes relevant to syllabus, instead of those generic AI study apps out there. 📚 And an organization system that splits notes into classes, and files into folders. Demo credentials: Email: [email protected] Password: test1234 I don’t recommend using this, since you’ll be skipping out on the actual tutorials and onboarding flow. Just use if you’re too lazy. Here are some improvements from the Flavourtown edition: Model flexiblity: No longer locked to just Gemini in the chat 👀 Custom Rag pipeline built from scratch: Files are uploaded in 10s, while chat context is no longer bloated. 🖼️ More supported files: PDFs, slides, word documents, images can all be uploaded. 🗲 Efficient notebooks design: The layout has been reconfigured, letting you resize the side panel, and move tabs anywhere you like. 🔍 Agent chat: Chat can now search through your files directly instead of being a wrapper ☁️ Editable notes: Notes are no longer read-only, and save your changes! Things I learned: How to upload files with streams, and making those streams editable. How to integrate a text-editor. How to make AI interact with the BlockNote editor, given they don’t have a direct AI extension for my use case. How to create a RAG system, from extracting, to chunking, to embedding and querying. How to add tools to the model, making it truly agentic. For more technical details & future plans, checkout the github! Full breakdown of tech stack is there. Show some love and try the demo too!...
|
1793533758.0391634
|
1793620158.0391634
|
|
42295
|
slack_agent by @vrajsanghavi | Stardance
|
vrajsanghavi
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T13:08:47Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "finally,my slack bot named v-tash is completed…. it has included many commands like this v-tash commands /v-tash-ping — is the bot alive /v-tash-roast [@name] — roast someone /v-tash-standup — fake standup generator /v-tash-vibe [topic] — vibe check poll /v-tash-quote — random dev quote /v-tash-decide A | B | C — pick for me /v-tash-ship [thing] — announce a ship use /v-tash-help for first time to get this… the hardest part of making this bot was nest ,seriously it takes much time to approve but anyways i got it….", "repo": "https://github.com/vraj2011/slack_agent", "demo": "https://app.slack.com/client/E09V59WQY1E/C083WK4RY2D"}]...
|
[{"post_id": 53032, "ts": "202 [{"post_id": 53032, "ts": "2026-08-23T12:51:25Z", "hours": 0.4367, "text": "finally,we have authenticated with nest ,now it works 24/7 ,test it out by typing /v-tash-help"}, {"post_id": 38394, "ts": "2026-07-31T19:00:31Z", "hours": 0.5997, "text": "we have done a slack bot..-1st achievement.."}]...
|
Title: slack_agent by @vrajsanghavi | Stardance
D Title: slack_agent by @vrajsanghavi | Stardance
Devlogs:
we have done a slack bot..-1st achievement..
finally,we have authenticated with nest ,now it works 24/7 ,test it out by typing /v-tash-help
Ships:
finally,my slack bot named v-tash is completed…. it has included many commands like this v-tash commands /v-tash-ping — is the bot alive /v-tash-roast [@name] — roast someone /v-tash-standup — fake standup generator /v-tash-vibe [topic] — vibe check poll /v-tash-quote — random dev quote /v-tash-decide A | B | C — pick for me /v-tash-ship [thing] — announce a ship use /v-tash-help for first time to get this… the hardest part of making this bot was nest ,seriously it takes much time to approve but anyways i got it…....
|
1792878786.3702478
|
1793742786.3702478
|
|
49739
|
webos server kinda by @D3RLORD3_OM | Stardance
|
D3RLORD3_OM
|
2
|
2.0
|
5
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T13:08:23Z", "hours": 1.0, "multiplier": 6.78, "payout": 5, "blessing": "neutral", "text": "for the webos2 mission i re-used the same ui that was previously used and i add the following new feature- 1.SOUND CLOUD TRACK/PLAYLIST ADDITION ABILITY this feature allows you to add and link of playlist/track from soundcloud and play it without even logging in and ofc no ads however it does not have next/previous controls sadly :[ but you can skip songs simply by controlling the time in the track and slide it to its end (does nnot work for previous :[ ) 2. A SIMPLE CODING APP this app allows anyone to code in html/css/java/pyton however it does not support debugging for any languages and it does not work properly with any language except “html” but it works with basic features i tried to make my os productive with this app specially for programmers 3. wpm tester this is a basic wpm tester added for funaside from all these new features it also includes all the old features which all are still functional the hard part was trying to include the soundcloud music but after 15mins i realized that its basically open source and got it to work!!!", "repo": "https://github.com/omguptaogwhitehathacker-svg/om-s-webos", "demo": "https://omguptaogwhitehathacker-svg.github.io/om-s-webos/"}, {"ship_num": 2, "ts": "2026-08-17T10:29:07Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I MADE AN WEBOS WITH THE HELP OF THE WEBOS1 JAM…… I HAVE ADDED VARIOUS FEATURES TO INCREASE ITS USABILITY, AS COMPARED TO THE ONE SHOWN IN THE COURSE SUCH AS TEXT EDITOR BASIC FILE SYSTEM MP3 UPLOADING MUSIC SYSTEM(WITH WORKING REACT BACKEND) CONTACT PAGE FOR SUPPORT A BREIF PROJECTS SECTION THIS PROJECT HAS BEEN ENTIRELT CODED INTO 2 FILES A DOCKERFILE AND AN INDEX.HTML(WITH SCRIPT RUNNING INSIDE OF IT) I ADDED GLASMORPHISM DESIGN TAKING INSPIRATION FROM MACOS THANK YOU HACKCLUB, STARDANCE ;]", "repo": "https://github.com/omguptaogwhitehathacker-svg/om-s-webos", "demo": "https://omguptaogwhitehathacker-svg.github.io/om-s-webos/"}]...
|
[{"post_id": 53040, "ts": "202 [{"post_id": 53040, "ts": "2026-08-23T13:03:30Z", "hours": 0.7533, "text": "for the webos2 mission i re-used the same ui that was previously used and i add the following new feature- 1.SOUND CLOUD TRACK/PLAYLIST ADDITION ABILITY this feature allows you to add and link of playlist/track from soundcloud and play it without even logging in and ofc no ads however it does not have next/previous controls sadly :[ but you can skip songs simply by controlling the time in the track and slide it to its end (does nnot work for previous :[ ) 2. A SIMPLE CODING APP this app allows anyone to code in html/css/java/pyton however it does not support debugging for any languages and it does not work properly with any language except “html” but it works with basic features i tried to make my os productive with this app specially for programmers 3. wpm tester this is a basic wpm tester added for funaside from all these new features it also includes all the old features which all are still functional"}, {"post_id": 48793, "ts": "2026-08-17T10:22:10Z", "hours": 0.3117, "text": "FIXED SOME ISSUES WITH THE MP3 MUSIC SYSTEM (IT WAS SHOWING RANDOM SYMBOLS INSTEAD OF THE PREVIOUS NAD NEXT BUTTONS) AND I ALSO ADDED AN BASIC CONTACT SECTION FOR SUPPORT"}, {"post_id": 48769, "ts": "2026-08-17T09:21:59Z", "hours": 0.2883, "text": "I managed to fix/add the music mp3 upload system…"}, {"post_id": 48311, "ts": "2026-08-16T16:55:35Z", "hours": 0.5561, "text": "yo made the Ui mostly I followed Thomas’s advice mine is completely different next im gonna add draggable windows and make the music system work"}]...
|
Title: webos server kinda by @D3RLORD3_OM | Starda Title: webos server kinda by @D3RLORD3_OM | Stardance
Devlogs:
yo made the Ui mostly I followed Thomas’s advice mine is completely different next im gonna add draggable windows and make the music system work
I managed to fix/add the music mp3 upload system…
FIXED SOME ISSUES WITH THE MP3 MUSIC SYSTEM (IT WAS SHOWING RANDOM SYMBOLS INSTEAD OF THE PREVIOUS NAD NEXT BUTTONS) AND I ALSO ADDED AN BASIC CONTACT SECTION FOR SUPPORT
for the webos2 mission i re-used the same ui that was previously used and i add the following new feature- 1.SOUND CLOUD TRACK/PLAYLIST ADDITION ABILITY this feature allows you to add and link of playlist/track from soundcloud and play it without even logging in and ofc no ads however it does not have next/previous controls sadly :[ but you can skip songs simply by controlling the time in the track and slide it to its end (does nnot work for previous :[ ) 2. A SIMPLE CODING APP this app allows anyone to code in html/css/java/pyton however it does not support debugging for any languages and it does not work properly with any language except “html” but it works with basic features i tried to make my os productive with this app specially for programmers 3. wpm tester this is a basic wpm tester added for funaside from all these new features it also includes all the old features which all are still functional
Ships:
I MADE AN WEBOS WITH THE HELP OF THE WEBOS1 JAM…… I HAVE ADDED VARIOUS FEATURES TO INCREASE ITS USABILITY, AS COMPARED TO THE ONE SHOWN IN THE COURSE SUCH AS TEXT EDITOR BASIC FILE SYSTEM MP3 UPLOADING MUSIC SYSTEM(WITH WORKING REACT BACKEND) CONTACT PAGE FOR SUPPORT A BREIF PROJECTS SECTION THIS PROJECT HAS BEEN ENTIRELT CODED INTO 2 FILES A DOCKERFILE AND AN INDEX.HTML(WITH SCRIPT RUNNING INSIDE OF IT) I ADDED GLASMORPHISM DESIGN TAKING INSPIRATION FROM MACOS THANK YOU HACKCLUB, STARDANCE ;]
for the webos2 mission i re-used the same ui that was previously used and i add the following new feature- 1.SOUND CLOUD TRACK/PLAYLIST ADDITION ABILITY this feature allows you to add and link of playlist/track from soundcloud and play it without even logging in and ofc no ads however it does not have next/previous controls sadly :[ but you can skip songs simply by controlling the time in the track and slide it to its end (does nnot work for previous :[ ) 2. A SIMPLE CODING APP this app allows anyone to code in html/css/java/pyton however it does not support debugging for any languages and it does not work properly with any language except “html” but it works with basic features i tried to make my os productive with this app specially for programmers 3. wpm tester this is a basic wpm tester added for funaside from all these new features it also includes all the old features which all are still functional the hard part was trying to include the soundcloud music but after 15mins i realized that its basically open source and got it to work!!!...
|
1793451370.890088
|
1793537770.890088
|
|
45509
|
Atomic-Habitizer by @AFJ | Stardance
|
AFJ
|
2
|
35.61
|
214
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T12:34:17Z", "hours": 22.0, "multiplier": 9.13, "payout": 203, "blessing": "neutral", "text": "What i made? I made Atomic Habitizer(I read the book Atomic Habits recently 😅). A simple habit tracking dashboard that help users build consistency through daily tracking and streaks. It includes weekly habit tracking, individual streaks for each habit, a maximum streak accross all habits, a dynamic progress ring, habit categories, quick presets, and local data storage. The Most challenging part One of them was making the streak system. The other was the Progress ring it was an html svg design i saw in reddit but never knew how it worked till i worked on JS. The version one which was my very first ship and was very simple and humble project. I got many suggestion from reviewers So Im proud that I reached here. For Testing, You should add a few habits and click the days in the weekly tracker to mark them complete. You can check whether the streaks and progress calculations are working. Then You can try to edit and delete the habit which will show my cute custiom popovers You can check the quick presets are working or not Note that the progress ring is based on current day’s habit completion and number of habits", "repo": "https://github.com/AfshinJamseed/Atomic-Habitiser/tree/v2", "demo": "https://afshinjamseed.github.io/Atomic-Habitiser/"}, {"ship_num": 2, "ts": "2026-08-08T10:09:29Z", "hours": 8.0, "multiplier": 1.34, "payout": 11, "blessing": "neutral", "text": "I made a Habit Tracker, which you can track your own habits for a diciplined life.", "repo": "https://github.com/AfshinJamseed/Atomic-Habitiser/tree/v2", "demo": "https://afshinjamseed.github.io/Atomic-Habitiser/"}]...
|
[{"post_id": 59550, "ts": "202 [{"post_id": 59550, "ts": "2026-09-01T13:10:19Z", "hours": 4.3025, "text": "V3 I styled the sidebar: It was very hard. I brought my cousin via live share and we worked together The ring mechanism was the most confusing. The design here is my idea 😁blah blah blah…"}, {"post_id": 59417, "ts": "2026-09-01T07:22:57Z", "hours": 1.0011, "text": "Starting the new version based on the reviews. Now i am trying to make the name and the app match. I got a design for a web dashboard a classic one from the internet and redisigned it using pen and paper to fit this project"}, {"post_id": 53561, "ts": "2026-08-24T04:57:15Z", "hours": 0.305, "text": "Added a video and an image in the readme"}, {"post_id": 53003, "ts": "2026-08-23T12:00:25Z", "hours": 0.5925, "text": "Readme was completed Project is now live this will be last devlog of v2 Try out the project: https://afshinjamseed.github.io/Atomic-Habitiser/"}, {"post_id": 52957, "ts": "2026-08-23T10:34:50Z", "hours": 1.8392, "text": "The Streak Calculation Was the hardest part. I asked Chat gpt for the logic. Now Moving on to Readme."}, {"post_id": 52876, "ts": "2026-08-23T07:54:30Z", "hours": 2.6378, "text": "Pop ups and Presets are now perfected. The preset are easy only pushing in-build objects into the array. But the popups poped me they were tuff finally after some research i got the perfect custom popup logics for me"}, {"post_id": 52556, "ts": "2026-08-22T18:39:20Z", "hours": 2.3389, "text": "Making custom popups 🎇🎇"}, {"post_id": 51790, "ts": "2026-08-21T17:06:55Z", "hours": 0.3128, "text": "Locked the upcomming days"}, {"post_id": 51774, "ts": "2026-08-21T16:44:17Z", "hours": 2.3067, "text": "Basic Functions are Made interactive. Took a lot of ⌚."}, {"post_id": 51572, "ts": "2026-08-21T10:51:02Z", "hours": 1.5481, "text": "JAVA SCRIPT ❌ BUG SCRIPT ✅ 😂"}, {"post_id": 51480, "ts": "2026-08-21T06:40:29Z", "hours": 4.2794, "text": "whoof that was was hard"}, {"post_id": 49715, "ts": "2026-08-18T17:01:28Z", "hours": 1.345, "text": "Made a almost perfect card"}, {"post_id": 49555, "ts": "2026-08-18T13:04:18Z", "hours": 1.4981, "text": "The last reviewers told me to improve the UI so full of improving it"}, {"post_id": 49066, "ts": "2026-08-17T17:39:19Z", "hours": 0.8528, "text": "Top Section Designing was done"}, {"post_id": 48822, "ts": "2026-08-17T11:20:20Z", "hours": 0.7856, "text": "Got a better design designing is my weakness"}, {"post_id": 48797, "ts": "2026-08-17T10:31:59Z", "hours": 1.4922, "text": "I am no trying out some designs for my new version of Atomic Habitizer Please comment if you can see any. I am bad at designing"}, {"post_id": 48753, "ts": "2026-08-17T08:58:18Z", "hours": 0.4544, "text": "The first version was just an prototype now i am starting 2nd version of this project"}, {"post_id": 43192, "ts": "2026-08-08T09:58:53Z", "hours": 7.9069, "text": "Ready To Ship"}]...
|
Title: Atomic-Habitizer by @AFJ | Stardance
Devlo Title: Atomic-Habitizer by @AFJ | Stardance
Devlogs:
Ready To Ship
The first version was just an prototype now i am starting 2nd version of this project
I am no trying out some designs for my new version of Atomic Habitizer Please comment if you can see any. I am bad at designing
Got a better design designing is my weakness
Top Section Designing was done
The last reviewers told me to improve the UI so full of improving it
Made a almost perfect card
whoof that was was hard
JAVA SCRIPT ❌ BUG SCRIPT ✅ 😂
Basic Functions are Made interactive. Took a lot of ⌚.
Locked the upcomming days
Making custom popups 🎇🎇
Pop ups and Presets are now perfected. The preset are easy only pushing in-build objects into the array. But the popups poped me they were tuff finally after some research i got the perfect custom popup logics for me
The Streak Calculation Was the hardest part. I asked Chat gpt for the logic. Now Moving on to Readme.
Readme was completed Project is now live this will be last devlog of v2 Try out the project: https://afshinjamseed.github.io/Atomic-Habitiser/
Added a video and an image in the readme
Starting the new version based on the reviews. Now i am trying to make the name and the app match. I got a design for a web dashboard a classic one from the internet and redisigned it using pen and paper to fit this project
V3 I styled the sidebar: It was very hard. I brought my cousin via live share and we worked together The ring mechanism was the most confusing. The design here is my idea 😁blah blah blah…
Ships:
I made a Habit Tracker, which you can track your own habits for a diciplined life.
What i made? I made Atomic Habitizer(I read the book Atomic Habits recently 😅). A simple habit tracking dashboard that help users build consistency through daily tracking and streaks. It includes weekly habit tracking, individual streaks for each habit, a maximum streak accross all habits, a dynamic progress ring, habit categories, quick presets, and local data storage. The Most challenging part One of them was making the streak system. The other was the Progress ring it was an html svg design i saw in reddit but never knew how it worked till i worked on JS. The version one which was my very first ship and was very simple and humble project. I got many suggestion from reviewers So Im proud that I reached here. For Testing, You should add a few habits and click the days in the weekly tracker to mark them complete. You can check whether the streaks and progress calculations are working. Then You can try to edit and delete the habit which will show my cute custiom popovers You can check the quick presets are working or not Note that the progress ring is based on current day’s habit completion and number of habits...
|
1792875227.0075614
|
1793739227.0075614
|
|
46442
|
My own site! by @muwaiz209 | Stardance
|
muwaiz209
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T12:28:18Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made just a cool website for fun. I don’t have that much access to a computer but I did it and It was my first time after 10 months doing this, So I needed to look in my code book for code snippets. I am proud that I atleast did this much of web progress testing and looking my project each time. If ppl did tell me to add some little things that I could add with my effort, it would have been good .", "repo": "https://github.com/Batman-Doom/my-site", "demo": "https://batman-doom.github.io/my-site/"}]...
|
[{"post_id": 52231, "ts": "202 [{"post_id": 52231, "ts": "2026-08-22T10:18:55Z", "hours": 1.8786, "text": "I am working on a very cool website, pls gimme any small suggestions"}]...
|
Title: My own site! by @muwaiz209 | Stardance
Dev Title: My own site! by @muwaiz209 | Stardance
Devlogs:
I am working on a very cool website, pls gimme any small suggestions
Ships:
I made just a cool website for fun. I don’t have that much access to a computer but I did it and It was my first time after 10 months doing this, So I needed to look in my code book for code snippets. I am proud that I atleast did this much of web progress testing and looking my project each time. If ppl did tell me to add some little things that I could add with my effort, it would have been good ....
|
1793480164.2966933
|
1793566564.2966933
|
|
47461
|
NASA Fact by @RajanKC | Stardance
|
RajanKC
|
2
|
5.99
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T12:16:58Z", "hours": 1.0, "multiplier": 1.2, "payout": 1, "blessing": "neutral", "text": "This is my first vite project Please rate this good", "repo": "https://github.com/RajanKCKC/Nasa", "demo": "https://nasa-ten-ecru.vercel.app/"}, {"ship_num": 2, "ts": "2026-08-17T14:49:40Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Ship", "repo": "https://github.com/RajanKCKC/Nasa", "demo": "https://nasa-ten-ecru.vercel.app/"}]...
|
[{"post_id": 56775, "ts": "202 [{"post_id": 56775, "ts": "2026-08-28T17:49:06Z", "hours": 0.9944, "text": "Update the Whole website Now there is no ai generated content"}, {"post_id": 50769, "ts": "2026-08-20T04:22:02Z", "hours": 0.6361, "text": "Rewrote Style.css"}, {"post_id": 49690, "ts": "2026-08-18T16:09:41Z", "hours": 0.3169, "text": "Update Auth"}, {"post_id": 48943, "ts": "2026-08-17T14:46:07Z", "hours": 1.2178, "text": "Added Readme"}, {"post_id": 48265, "ts": "2026-08-16T15:52:42Z", "hours": 0.8808, "text": "feat: implement NASA facts dashboard with loading state and fallback data"}, {"post_id": 47422, "ts": "2026-08-15T10:47:34Z", "hours": 0.7144, "text": "Integrate Supabase for authentication and data management Added .env.example for environment variable configuration. Updated .gitignore to exclude .env files. Refactored index.html for improved structure. Added Supabase dependencies in package.json and package-lock.json. Created supabase.js for Supabase client initialization. Implemented authentication flow in auth.js with sign-in and sign-up functionality. Developed dashboard.js to display user-specific content after authentication. Created home.js for the landing page with navigation to the auth page. Enhanced styling in style.css for a better user interface. Added NASA logo SVG asset for branding."}, {"post_id": 47022, "ts": "2026-08-14T16:46:10Z", "hours": 0.3492, "text": "feat: enhance main layout and styles for hero section, add login functionality"}, {"post_id": 46426, "ts": "2026-08-13T16:52:39Z", "hours": 0.6333, "text": "Initialize project with Vite, add basic structure and assets Created package.json with Vite as a development dependency and scripts for dev, build, and preview. Added favicon.svg for the application icon. Included icons.svg with various SVG symbols for UI components. Added hero image as an asset. Created JavaScript and Vite SVG assets for branding. Implemented a counter functionality in counter.js. Set up main.js to render the application structure and integrate the counter. Added style.css for basic styling of the application layout and components."}]...
|
Title: NASA Fact by @RajanKC | Stardance
Devlogs: Title: NASA Fact by @RajanKC | Stardance
Devlogs:
Initialize project with Vite, add basic structure and assets Created package.json with Vite as a development dependency and scripts for dev, build, and preview. Added favicon.svg for the application icon. Included icons.svg with various SVG symbols for UI components. Added hero image as an asset. Created JavaScript and Vite SVG assets for branding. Implemented a counter functionality in counter.js. Set up main.js to render the application structure and integrate the counter. Added style.css for basic styling of the application layout and components.
feat: enhance main layout and styles for hero section, add login functionality
Integrate Supabase for authentication and data management Added .env.example for environment variable configuration. Updated .gitignore to exclude .env files. Refactored index.html for improved structure. Added Supabase dependencies in package.json and package-lock.json. Created supabase.js for Supabase client initialization. Implemented authentication flow in auth.js with sign-in and sign-up functionality. Developed dashboard.js to display user-specific content after authentication. Created home.js for the landing page with navigation to the auth page. Enhanced styling in style.css for a better user interface. Added NASA logo SVG asset for branding.
feat: implement NASA facts dashboard with loading state and fallback data
Added Readme
Update Auth
Rewrote Style.css
Update the Whole website Now there is no ai generated content
Ships:
Ship
This is my first vite project Please rate this good...
|
1793487225.0875778
|
1793573625.0875778
|
|
50774
|
My first slack bot! by @Zair | Stardance
|
Zair
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T12:12:56Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Built a Slack bot with 5 slash commands: /zair-ping (latency check), /zair-help (list commands), /zair-catfact and /zair-joke (fetch from public APIs), and /zair-8ball (magic 8-ball). Deployed it on Hack Club Nest as a systemd service with auto-restart, so it stays online 24/7 even when my laptop is closed. The trickiest part was getting the systemd service and Slack Socket Mode auth working together, and registering new slash commands in the Slack app config after adding them to the code. To test: run any of the commands in the workspace where the bot is installed, e.g. /zair-8ball will this ship?", "repo": "https://github.com/Shinigami-tech/zair-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BT74QAY6T"}]...
|
[{"post_id": 53010, "ts": "202 [{"post_id": 53010, "ts": "2026-08-23T12:11:35Z", "hours": 0.4556, "text": "Deployed the bot 24/7 on Hack Club Nest using systemd, so it stays online even with my laptop closed. Added a logging middleware to track command usage and a new /zair-8ball command on top of ping/help/catfact/joke. Wrote a README documenting setup and deployment."}]...
|
Title: My first slack bot! by @Zair | Stardance
D Title: My first slack bot! by @Zair | Stardance
Devlogs:
Deployed the bot 24/7 on Hack Club Nest using systemd, so it stays online even with my laptop closed. Added a logging middleware to track command usage and a new /zair-8ball command on top of ping/help/catfact/joke. Wrote a README documenting setup and deployment.
Ships:
Built a Slack bot with 5 slash commands: /zair-ping (latency check), /zair-help (list commands), /zair-catfact and /zair-joke (fetch from public APIs), and /zair-8ball (magic 8-ball). Deployed it on Hack Club Nest as a systemd service with auto-restart, so it stays online 24/7 even when my laptop is closed. The trickiest part was getting the systemd service and Slack Socket Mode auth working together, and registering new slash commands in the Slack app config after adding them to the code. To test: run any of the commands in the workspace where the bot is installed, e.g. /zair-8ball will this ship?...
|
1793328698.1027951
|
1793415098.1027951
|
|
51827
|
My own site! by @ArmanMalik | Stardance
|
ArmanMalik
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T12:09:16Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "made this website as my personal portfolio and a place where I can show what I’m learning and building. I wanted something simple but still looked good and felt like my own. It has sections about me, the skills I’m learning, some of my projects, my goal of becoming a cloud engineer, and ways to contact me. I built the site with HTML, CSS, and JavaScript and added things like animations, a mobile menu, and a responsive layout so it works on phones too. This was also a chance for me to practice turning an idea into an actual website and getting it ready to be deployed publicly.", "repo": "https://github.com/Armaan246-svg/firstsite", "demo": "https://websitefirstn.netlify.app/"}]...
|
[{"post_id": 53007, "ts": "202 [{"post_id": 53007, "ts": "2026-08-23T12:07:41Z", "hours": 2.3825, "text": "I am basically working on my first project which is kind of boring in fact it is boring but i guess that counts as i am learning and next time i will come up with something big cause i am pretty skilled in python,flast and html."}]...
|
Title: My own site! by @ArmanMalik | Stardance
De Title: My own site! by @ArmanMalik | Stardance
Devlogs:
I am basically working on my first project which is kind of boring in fact it is boring but i guess that counts as i am learning and next time i will come up with something big cause i am pretty skilled in python,flast and html.
Ships:
made this website as my personal portfolio and a place where I can show what I’m learning and building. I wanted something simple but still looked good and felt like my own. It has sections about me, the skills I’m learning, some of my projects, my goal of becoming a cloud engineer, and ways to contact me. I built the site with HTML, CSS, and JavaScript and added things like animations, a mobile menu, and a responsive layout so it works on phones too. This was also a chance for me to practice turning an idea into an actual website and getting it ready to be deployed publicly....
|
1793537787.9322586
|
1793624187.9322586
|
|
52163
|
ThirdView by @shivakaushal | Stardance
|
shivakaushal
|
1
|
16.29
|
39
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T11:57:29Z", "hours": 6.0, "multiplier": 6.82, "payout": 39, "blessing": "neutral", "text": "I made ThirdView - you type a description of a scene and it jumps straight to that moment in a video, instead of scrubbing through the timeline forever. It runs fully in the browser using CLIP through Transformer.js, no uploads, no server. The hard part was getting an actual ML model to run smoothly with zero backend, plus CLIP wasn’t built for video, so figuring out how often to sample frames took a lot of trial and error. What we’re proud of is that it just works fully private, fully free, and it actually fixes something that annoys us every single time we watch something not together, without turning into some bloated overengineered app.", "repo": "https://github.com/ThisShivaKaushal/ThirdView-Max", "demo": ""}]...
|
[{"post_id": 71013, "ts": "202 [{"post_id": 71013, "ts": "2026-09-20T06:28:36Z", "hours": 0.9111, "text": "I have changed the UI, and some elements are hidden, because when we upload video then it appears. And now I’m going to write the logic(Javascript), i’m too fast because I have already made it, so basic things don’t take much time, but now i’m going to work on logic, and i also have to add some more features, so i think it usually takes 3-4 hours, and then the projects will get completed."}, {"post_id": 70990, "ts": "2026-09-20T05:14:27Z", "hours": 0.4422, "text": "HTML is completed, now I have to style it, and have to make the logic. Because our project is completely base on logic, so the javascript will be too long. Nd i also suffer sometimes with making logic, and let see what happen:D"}, {"post_id": 70487, "ts": "2026-09-19T08:41:14Z", "hours": 2.0139, "text": "Hey Everyone, I’m going to continue my ThirdView project again but this time, its name will be Thirdview Max, because it is the updated version, so. Now, you can also see the old version at github, which is at another repo. But Thirdview Max have more and extra feature then Thirdview, now it can give accurate result, but in past I said that it also have feature, by which you can just paste link, nd find the part. But because, i have to fetch the video in .mp4 first, which is difficult part, I tried, but i failed. That’s why I decided to skip this feature. and the main things, the Ui is going to completely change."}, {"post_id": 58121, "ts": "2026-08-30T13:56:28Z", "hours": 0.5769, "text": "#Devlog:6 of #Ship:2 I have made these files, but now my logic has hit a limitation because YouTube doesn’t allow frame extraction. To solve this, we are using a public API which helps a lot with YouTube search. I use yt-dlp to resolve the YouTube URL, specifically using an Invidious public API. I know it might get shut down sometimes by YouTube, but what can we do? I will use my own yt-dlp backend to get a CORS-friendly video stream. By doing this, we can access the YouTube video as a .mp4 file, which allows us to extract frames. Let’s see if it works perfectly or not. However, my own backend will work for only 7 days because it is an open-source project."}, {"post_id": 58009, "ts": "2026-08-30T10:54:52Z", "hours": 2.6042, "text": "#Devlog:5 of #Ship:2 I have made my UI, and now I have to write the logic. The best part is that I have messed up my style.css file. I want to improve it more, but I got confused with my colors. I gave names to the colors, but in the end, I could not understand my own color pattern or what I had decided to use each color for. By the way, I think the UI looks good. Now, let’s talk about the UI features: I have made the header sticky and also added a blur effect to it. Instead of taking YouTube’s color palette, I used a popular palette from coolors.co because I liked it at first sight. You can see the UI below."}, {"post_id": 57238, "ts": "2026-08-29T10:45:40Z", "hours": 0.9719, "text": "#Devlog:4 of #Ship:2 I have made the HTML, and now I’m working on the CSS. I am making the UI look good. By the way, I think I have done only 30-40% of the CSS, and I think I’ll try to complete it today. Then, I’ll start focusing on the logic, like JavaScript, because it is our main stuff. I’d take inspiration from YouTube, like using YouTube’s color palette, and the structure is like the old one."}, {"post_id": 57189, "ts": "2026-08-29T09:24:01Z", "hours": 0.2992, "text": "#Devlog:3 of #Ship:2 I have just put my real hosted website into maintenance mode. Normally, if I push code to GitHub, Vercel automatically hosts the new version. If someone visits suddenly during that time, they might think the website has a code error. That’s why I created a vercel.json file a week ago and now pushed it to GitHub. Now, I can continuously make changes for a while without any tension related to the main website, because it always shows that it is in maintenance."}, {"post_id": 57145, "ts": "2026-08-29T07:49:32Z", "hours": 0.5208, "text": "#Devlog:2 of #Ship:2 I have implemented two things: 1.Now you can paste the link of a YouTube video and it will help you find the timestamp. Although I have just created the HTML, this time I didn’t have an idea of how I will grab the frames. By the way, I think I’ll try to download the video in low quality, and then grab the frames. If anyone has any ideas, just let me know, or I’ll try to serch and understand an easier way. 2. I have implemented a new model (Audio Model). In the Shipwright review video, I saw that the reviewer typed “MrBeast saying ‘Red Light,’” and my website at that time was only able to search through visuals. But now it can walk through the vocal parts. It converts the video’s audio into text, and then it will match the query. But here’s an error: we can’t check the query’s exact result matching percentage, and it may create some problems. By the way, when you search, it has two options like @visual and @vocal . So when you select one, it only runs that one model. But if you have added say or said, then it also runs both things simultaneously. If you only put one thing, then it runs one model only, so it saves memory and works fast. But let’s suppose you didn’t select either one; then for accurate results, it runs both models."}, {"post_id": 57108, "ts": "2026-08-29T06:36:15Z", "hours": 0.7319, "text": "#Devlog:1 of #Ship:2 Hi guys, when I shipped my first project, 2-3 people said that I used AI. I really did use it, but in different ways, and now I am also feeling ashamed of myself. Why? Because that was my first project, and my manner of writing code is not good, I even dn’t like what I write myself. That’s why I used AI by giving it my own code and tellng it to make it professional, understandable, and much more. That was my mistake, but now after searching a lot, I understand it didn’t matter. So now I am going to write this project again with some more features, and mainly the UI, which looked very cheap (and I know people were also saying it is AI—by the way, I took color decisions from AI). But now, instead of asking any AI out of fear of making mistakes, that fear has gone, and I am going to design everything by myself. However, my JavaScript is a little bit weak, so I am gong to use AI for learning purposes, but now I will upload the raw code that I write. By the way, the new feature will contain a YouTube video link."}, {"post_id": 53602, "ts": "2026-08-24T07:22:10Z", "hours": 0.7489, "text": "Another new feature, I copied it from Github, because I have used it many time."}, {"post_id": 53591, "ts": "2026-08-24T06:28:53Z", "hours": 0.47, "text": "I built the Thirdview project, but after shipping it, I received requests to make the design more appealing. I didn’t love the original look either, so I am redesigning the UI and adding more color. By the way, I am also working on a new feature—see if you can guess what it is!"}, {"post_id": 52890, "ts": "2026-08-23T08:37:28Z", "hours": 0.9194, "text": "Guys, I was suffering from a problem. When my friends and I watch any movies or something else, mostly anime, then we surely find a scene where me and my boys melt. And when we meet physically, we have to tell each other about that. And this is the most time-consuming part. My one friend who doesn’t even know the episode, then how can we think he will remember the timestamp? That’s why, by the way, I’m also like my friend. That’s why I built this app. It means you just have to upload the videos and then tell about the scene, like, “the main character, who wears yellow clothes, is beating the man,” and you will get the timestamp without any problem. Now, my friends and I don’t have to waste more than 30 minutes for just a 10- to 15-second clip in a one-hour episode. Maybe we can get the correct timestamp in just two or three minutes. Hold a minute. If you are lucky, then you might get the correct timestamp randomly. But I know our and your luck are not that great. And it’s just HTML, CSS, and JavaScript. By the way, let me tell you how it is working. For this, you can read the README.md. For the trial, you can visit thirdview.vercel.app. By the way, for most people, it is just extra storage. But for me, this is my first project, such a great project I made. Bye-bye. Just visit the repo. Oh, and it completely works locally, means in the browser, but it’s not connected to the cloud. That’s why it may be slow. I have just host my project on Vercel, and I will ship this project today after making a show video."}, {"post_id": 52402, "ts": "2026-08-22T15:03:55Z", "hours": 4.8003, "text": "My first project is almost ready to ship! I can’t wait to show you guys. It’s just HTML, CSS, and JavaScript, but it solves a really annoying problem in our friend group. I’ll try to publish it tomorrow. Bye for now!"}]...
|
Title: ThirdView by @shivakaushal | Stardance
Dev Title: ThirdView by @shivakaushal | Stardance
Devlogs:
My first project is almost ready to ship! I can’t wait to show you guys. It’s just HTML, CSS, and JavaScript, but it solves a really annoying problem in our friend group. I’ll try to publish it tomorrow. Bye for now!
Guys, I was suffering from a problem. When my friends and I watch any movies or something else, mostly anime, then we surely find a scene where me and my boys melt. And when we meet physically, we have to tell each other about that. And this is the most time-consuming part. My one friend who doesn’t even know the episode, then how can we think he will remember the timestamp? That’s why, by the way, I’m also like my friend. That’s why I built this app. It means you just have to upload the videos and then tell about the scene, like, “the main character, who wears yellow clothes, is beating the man,” and you will get the timestamp without any problem. Now, my friends and I don’t have to waste more than 30 minutes for just a 10- to 15-second clip in a one-hour episode. Maybe we can get the correct timestamp in just two or three minutes. Hold a minute. If you are lucky, then you might get the correct timestamp randomly. But I know our and your luck are not that great. And it’s just HTML, CSS, and JavaScript. By the way, let me tell you how it is working. For this, you can read the README.md. For the trial, you can visit thirdview.vercel.app. By the way, for most people, it is just extra storage. But for me, this is my first project, such a great project I made. Bye-bye. Just visit the repo. Oh, and it completely works locally, means in the browser, but it’s not connected to the cloud. That’s why it may be slow. I have just host my project on Vercel, and I will ship this project today after making a show video.
I built the Thirdview project, but after shipping it, I received requests to make the design more appealing. I didn’t love the original look either, so I am redesigning the UI and adding more color. By the way, I am also working on a new feature—see if you can guess what it is!
Another new feature, I copied it from Github, because I have used it many time.
#Devlog:1 of #Ship:2 Hi guys, when I shipped my first project, 2-3 people said that I used AI. I really did use it, but in different ways, and now I am also feeling ashamed of myself. Why? Because that was my first project, and my manner of writing code is not good, I even dn’t like what I write myself. That’s why I used AI by giving it my own code and tellng it to make it professional, understandable, and much more. That was my mistake, but now after searching a lot, I understand it didn’t matter. So now I am going to write this project again with some more features, and mainly the UI, which looked very cheap (and I know people were also saying it is AI—by the way, I took color decisions from AI). But now, instead of asking any AI out of fear of making mistakes, that fear has gone, and I am going to design everything by myself. However, my JavaScript is a little bit weak, so I am gong to use AI for learning purposes, but now I will upload the raw code that I write. By the way, the new feature will contain a YouTube video link.
#Devlog:2 of #Ship:2 I have implemented two things: 1.Now you can paste the link of a YouTube video and it will help you find the timestamp. Although I have just created the HTML, this time I didn’t have an idea of how I will grab the frames. By the way, I think I’ll try to download the video in low quality, and then grab the frames. If anyone has any ideas, just let me know, or I’ll try to serch and understand an easier way. 2. I have implemented a new model (Audio Model). In the Shipwright review video, I saw that the reviewer typed “MrBeast saying ‘Red Light,’” and my website at that time was only able to search through visuals. But now it can walk through the vocal parts. It converts the video’s audio into text, and then it will match the query. But here’s an error: we can’t check the query’s exact result matching percentage, and it may create some problems. By the way, when you search, it has two options like @visual and @vocal . So when you select one, it only runs that one model. But if you have added say or said, then it also runs both things simultaneously. If you only put one thing, then it runs one model only, so it saves memory and works fast. But let’s suppose you didn’t select either one; then for accurate results, it runs both models.
#Devlog:3 of #Ship:2 I have just put my real hosted website into maintenance mode. Normally, if I push code to GitHub, Vercel automatically hosts the new version. If someone visits suddenly during that time, they might think the website has a code error. That’s why I created a vercel.json file a week ago and now pushed it to GitHub. Now, I can continuously make changes for a while without any tension related to the main website, because it always shows that it is in maintenance.
#Devlog:4 of #Ship:2 I have made the HTML, and now I’m working on the CSS. I am making the UI look good. By the way, I think I have done only 30-40% of the CSS, and I think I’ll try to complete it today. Then, I’ll start focusing on the logic, like JavaScript, because it is our main stuff. I’d take inspiration from YouTube, like using YouTube’s color palette, and the structure is like the old one.
#Devlog:5 of #Ship:2 I have made my UI, and now I have to write the logic. The best part is that I have messed up my style.css file. I want to improve it more, but I got confused with my colors. I gave names to the colors, but in the end, I could not understand my own color pattern or what I had decided to use each color for. By the way, I think the UI looks good. Now, let’s talk about the UI features: I have made the header sticky and also added a blur effect to it. Instead of taking YouTube’s color palette, I used a popular palette from coolors.co because I liked it at first sight. You can see the UI below.
#Devlog:6 of #Ship:2 I have made these files, but now my logic has hit a limitation because YouTube doesn’t allow frame extraction. To solve this, we are using a public API which helps a lot with YouTube search. I use yt-dlp to resolve the YouTube URL, specifically using an Invidious public API. I know it might get shut down sometimes by YouTube, but what can we do? I will use my own yt-dlp backend to get a CORS-friendly video stream. By doing this, we can access the YouTube video as a .mp4 file, which allows us to extract frames. Let’s see if it works perfectly or not. However, my own backend will work for only 7 days because it is an open-source project.
Hey Everyone, I’m going to continue my ThirdView project again but this time, its name will be Thirdview Max, because it is the updated version, so. Now, you can also see the old version at github, which is at another repo. But Thirdview Max have more and extra feature then Thirdview, now it can give accurate result, but in past I said that it also have feature, by which you can just paste link, nd find the part. But because, i have to fetch the video in .mp4 first, which is difficult part, I tried, but i failed. That’s why I decided to skip this feature. and the main things, the Ui is going to completely change.
HTML is completed, now I have to style it, and have to make the logic. Because our project is completely base on logic, so the javascript will be too long. Nd i also suffer sometimes with making logic, and let see what happen:D
I have changed the UI, and some elements are hidden, because when we upload video then it appears. And now I’m going to write the logic(Javascript), i’m too fast because I have already made it, so basic things don’t take much time, but now i’m going to work on logic, and i also have to add some more features, so i think it usually takes 3-4 hours, and then the projects will get completed.
Ships:
I made ThirdView - you type a description of a scene and it jumps straight to that moment in a video, instead of scrubbing through the timeline forever. It runs fully in the browser using CLIP through Transformer.js, no uploads, no server. The hard part was getting an actual ML model to run smoothly with zero backend, plus CLIP wasn’t built for video, so figuring out how often to sample frames took a lot of trial and error. What we’re proud of is that it just works fully private, fully free, and it actually fixes something that annoys us every single time we watch something not together, without turning into some bloated overengineered app....
|
1793407968.4340563
|
1793494368.4340563
|
|
44945
|
Short Frog Game by @jl1 | Stardance
|
jl1
|
1
|
10.0
|
44
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T11:57:08Z", "hours": 10.0, "multiplier": 4.51, "payout": 44, "blessing": "neutral", "text": "Finally finished my short platformer game about a frog who collets stars through sticking its tongue and swinging.", "repo": "https://github.com/psalmsfr/Short-Frog-Game", "demo": "https://sirvant.itch.io/short-frog-game"}]...
|
[{"post_id": 52915, "ts": "202 [{"post_id": 52915, "ts": "2026-08-23T09:17:41Z", "hours": 9.68, "text": "Just finished my game!"}]...
|
Title: Short Frog Game by @jl1 | Stardance
Devlog Title: Short Frog Game by @jl1 | Stardance
Devlogs:
Just finished my game!
Ships:
Finally finished my short platformer game about a frog who collets stars through sticking its tongue and swinging....
|
1793458270.8959603
|
1793544670.8959603
|
|
40484
|
RaidenScript by @RaidenTechnology | Stardance
|
RaidenTechnology
|
2
|
58.97
|
231
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T11:46:51Z", "hours": 31.0, "multiplier": 10.41, "payout": 104, "blessing": "neutral", "text": "RaidenScript v0.2 Update I wrote RaidenScript (RS) from scratch in C++20 as a small embeddable scripting language. In Ship #1 I had it running in three hosts. Since then I gave it a browser you can try it in, and I turned the Minecraft host into a real game running on a live server. I put the language in a browser. I compiled the C API to WebAssembly, served it from GitHub Pages, and wrote an editor with a Run button and four example programs: raidentechnology.github.io/raidenscript. I send nothing to a server; the page is the interpreter. I stopped treating the Minecraft host as a demo. I wrote 144 commits on it since the last devlog, and I keep the rules out of Java entirely: they sit in one .rai file the server loads at boot and reloads while players are online. I wrote a whole farming layer as script rules. Every crop got its own tool with its own level and rarity ladder, and I added tool enchants, XP bottles, an upgrade bench, and a 20 minute contest with medals and a shop of its own. I added pests. Twelve species, a spawn engine I tied to whatever crop is planted, a five-tier vacuum to kill them with, and a loot table I hooked into the same farming-luck stat every other system reads. I built a garden around it: 8 plots, a regeneration engine that rebuilds 13 farm patterns, 76 visitor NPCs I gave 53 signed skins, and a copper economy I priced off the live Bazaar API instead of numbers I made up. I added one host primitive, taslakModel, and let the script choose the model an item wears. Adding an item is now a script edit and nothing else. I fixed three bugs the live server found and no test of mine would have. An item-identity gate was cancelling every right click unconditionally, so the grappling hook silently never fired. The area hoe was catching its own synthetic event and moving the stack twice. And one wrong price in a shop table was failing the entire script at boot. Why did I do it like this? Because I think a language is judged by what runs on it, not by its grammar. The strongest thing I can say about my embedding API is that a 10,000 line ruleset runs on it every night, on a real server, with real players. Because I lose reviewers at the install wall. For Ship #1 I asked people to clone a repo and build it with MinGW. Now I ask for one click, and I am handing them the same interpreter, not a simplified twin. Because every rule I move out of Java is a rule I can change without a restart. I left no compile step in the script layer, so /rai reload changes the balance of a live game between two swings of a sword. Because item models were the last thing still forcing me into Java. I closed that hole, and I now keep the Java side as infrastructure only: it knows how to talk to the server and nothing about what the game is. Because I wanted the contest, the pests and the visitor queue to stress the C boundary. I pass numbers in the array and let strings travel beside it, and not one of these systems made me widen that contract. Because a bug a player hits at 2 AM is worth more to me than a bug I find in my own suite. All three above came from the server. Source (MIT): github.com/RaidenTechnology/raidenscript", "repo": "https://github.com/RaidenTechnology/raidenscript", "demo": "https://raidentechnology.github.io/raidenscript/"}, {"ship_num": 2, "ts": "2026-07-28T10:10:56Z", "hours": 7.0, "multiplier": 17.73, "payout": 127, "blessing": "neutral", "text": "RaidenScript v0.1 — an embeddable scripting language written from scratch in C++20. WHAT IT IS A small language (29 keywords) with Python’s readability and JavaScript’s runtime model, built to go inside another program and make it scriptable. The same interpreter runs in three hosts, and each one has a working demo in the repo: Terminal — native binary, “rai program.rai”, plus a REPL Browser — C API compiled to WebAssembly, running an animated store page JVM — C API through JNI, running a Paper Minecraft plugin The demo link is my shipped game STAR BREAKER: one of its weapons is not defined in the game at all, it is a RaidenScript file the game loads and runs through the WebAssembly build. WHAT IS IN IT Lexer, parser, resolver, tree-walking interpreter and REPL, all hand-written; no parser generator, no dependencies. 16 example programs that double as the regression suite, 20 C API checks, 7 WebAssembly checks, zero compiler warnings. A recursion-depth guard so a runaway script raises a catchable error instead of killing the host process — verified separately on native, wasm and the JVM. The cover image was computed pixel by pixel by a RaidenScript program (demo/kapak/kapak-ascii.rai) — no graphics library, in the program or in the language. HOW TO TRY IT git clone, then “make” (w64devkit/MinGW on Windows, gcc elsewhere), then “rai examples/01-temeller.rai”, or just “rai” for the REPL. The README is a full manual: language guide, standard library, embedding walkthrough. Known limits are written down there rather than hidden: an exception escaping a host function leaks stack, string += is quadratic, and a script returning a string to rs_call still yields 0. AI SPLIT The design of the language and its core — lexer, parser, resolver, interpreter, REPL, C API, string channel — is mine and was written by me. The host bindings, the demo apps, and this week’s seven interpreter bug fixes are AI-written from my designs and my audit. Logged hours are my editor time only. Source (MIT): github.com/RaidenTechnology/raidenscript", "repo": "https://github.com/RaidenTechnology/raidenscript", "demo": "https://raidentechnology.github.io/raidenscript/"}]...
|
[{"post_id": 53014, "ts": "202 [{"post_id": 53014, "ts": "2026-08-23T12:15:50Z", "hours": 20.9703, "text": "RaidenScript: the cover is a program, not a picture I gave the project a red and black cover, and I did it without opening an image editor. The cover generator is a RaidenScript program that prints a plain PPM to stdout, so I changed the palette in the script and ran it again: three radial glows, a faint grid, a vertical gradient on the bolt, and a 5x7 bitmap font that is data inside the file, not a system font. It computes 315,000 pixels in 43 seconds. That is my tree-walking interpreter doing arithmetic in a while loop, with no graphics library in the program and none in the language. My first render was wrong and I had to say so. The old cover put a turquoise bolt on a violet field, so the contrast came from hue. In red on red there is no hue left to lean on, and the bolt sank into the background. I cut the background glow to a third and pushed the bolt to a near-white core, so the contrast now comes from brightness. I cleaned the repository behind it. My README still linked to SPEC.md and WORKLOG.md after I deleted them, so anyone cloning it hit two dead links on the front page. I removed those links and rewrote the root README and two demo READMEs without tables. Why did I do it like this? Because a cover drawn in an image editor says nothing about my language, and a cover computed by it is the smallest honest benchmark I own. If the language cannot fill 315,000 pixels, I want to know that before someone else finds out. Because 43 seconds is a real number and I am not hiding it. It is fine for a cover I render once, and it is exactly why a bytecode VM sits on my roadmap instead of being marked done. Because a README that points at files I deleted is a promise I broke to whoever clones the repo, and that is the first thing a reviewer sees."}, {"post_id": 46568, "ts": "2026-08-13T21:53:11Z", "hours": 30.61, "text": "The loop that fixes the language is written in the language Since the last devlog the work split in two: a development loop that RaidenScript now drives itself, and a repository that finally stopped mixing the language with a game server. selfdev - the decision logic is a .rai file tools/selfdev.rai holds the loop’s rules: pick an area nobody touched last round, run the build, read the log, call the pass green or red, append its own entry to a round journal. Under it sits tools/rsdev.cpp, a sys.* host built on the same C API the browser game and the Minecraft plugin already use. The language had three hosts. The fourth one is its own toolchain. Pass 2 taught it what not to trust. tools/selfdev-build.cmd reported EXIT=0 for a run that failed to link. The cause is not in the language at all: exit /b inside a ( … ) » log 2>&1 block does not end a .cmd script, so control falls through to the final exit /b 0. A loop whose whole contract is “exit 0 means green” can commit on red - and it did once, on stale .o files. The rule now is read the log, not the exit code, and it is written in capitals at the top of SELFDEV-NOTES.md because I expect to forget it. What the passes actually fixed String building was quadratic. At 60,000 pieces: s += x took 1879 ms, s = s + x took 2382 ms, against a list.push + join baseline of 54 ms - 35x and 44x. Strings stay immutable (SPEC section 2), the fix is ownership: when the slot is the only owner, append in place. Both forms now run in about 25 ms. The indexed form d[k] += x was a separate code path and stayed quadratic after the first fix, so it took a second pass to catch. The measurement size was part of the test. At 24,000 pieces the s = s + x check passed green: 288 KB fits in L2 and quadratic copying looks cheap in cache. At 60,000 (720 KB) both went red. f-strings could not hold a quoted string inside an interpolation, although SPEC 9/3 said they could. f”{sys.read(“a.txt”)}” was a syntax error. The spec was right and the parser was wrong. A blank line in a CRLF file closed a block early. The lone \\r counted as content - the kind of bug that only shows up on someone else’s machine. Two C API bugs: rs_call could return an empty error message, and a nested rs_call corrupted the string channel of the outer primitive. The JVM bridge silently collapsed an int-returning host primitive to 0. Silent zeros are the worst class: the plugin keeps running and the numbers are simply wrong. 68 C API checks green, zero compiler warnings, sanitizer run clean. 29 keywords, still capped at 30. No C API signature changed. The branch split 227 commits had piled up unpushed and 216 of them were the Minecraft plugin demo. I reset main to origin, cherry-picked only the 13 language and tooling commits, and left the rest on its own branch. main is the language. Nothing else goes there. Most of the time logged on this project since the last devlog went into that plugin demo - the JVM binding exercised against a real server - and that branch is not on GitHub yet. The language fixes above came out of the unattended loop.I read every pass and hand-picked what entered main. The design, the spec and the original src/ are mine. Logged hours are my editor time only."}, {"post_id": 36295, "ts": "2026-07-28T09:44:35Z", "hours": 0.5578, "text": "Seven bugs, and the ones that were never reachable Last devlog promised a depth counter for the crash that hit all three hosts. I built it, then kept reading instead of building, and the audit found six more. THE COUNTER A script that recurses too deep does not raise an error. It kills the process. On a Minecraft server that means every player drops and the log has not one line about it - no Java exception, no hs_err file, exit code 127. The tempting fix is a bigger stack, but that only moves the wall: with -Xss16m the JVM dies at ~5000 frames instead of ~500, the same way. So the interpreter counts instead. Every script call goes through one function, and past the limit it raises an ordinary Error - catchable with try/catch, readable through rs_last_error. Picking the number mattered more than writing it. My notes said “4000”, my measurements said that was useless: native and wasm hit the wall near 1000 frames, a default JVM thread at ~500, because each script frame costs about 1.7 KB of native stack. A limit above the wall protects nobody. So: 800, and the JNI bridge drops it to 400 because it knows what stack it stands on. The counter also has to be restored no matter HOW a call exits - return, return signal, or exception. My restore lines covered two of those three paths; a destructor covers all three and cannot be forgotten. A CRASH ANY SCRIPT COULD TRIGGER \"a,b\".split(5) That was enough to kill the host. split assumed its argument was a string, dereferenced a checked cast without checking it, and got a null pointer. Eight builtins had the same line copied into them. In a standalone language that is a segfault. In an embedded one, any script author can take down the server with a typo. It is now a type error naming the method. OPERATORS THAT WERE NEVER REACHABLE The lexer produced tokens for & | ^ « ». The interpreter had the arithmetic for all five. Every test passed. But no rule in the parser ever read those tokens, so “flags & 4” got “expression expected, found ‘&’”, and the code in the other two layers had never once run. Three layers agreeing on a feature is not the same as three layers connected by it. The fix was four precedence levels, ordered like Python and C - no new keywords, so the language stays at 29 of 30. THE SMALL ONES throw Error(“amount missing”) reached the host as “”: the CLI path pulled out the message field, the embedding path did not. 2 ** 64 wrapped silently to 0. 1 « 64 was undefined behaviour - on x86 the CPU takes the shift count modulo 64, so it quietly evaluates to 1. And an exception thrown from a single-expression lambda left the interpreter in the lambda’s scope, so the catch block ran against the wrong variables. WHERE IT STANDS The C API suite is 20 checks now, five written for these bugs; the wasm suite 7; 11 examples still run; zero warnings. The guard is verified on native, wasm and JNI separately, and in each one the process was still alive after the limit was hit. Three problems stay open, in the README rather than hidden: an exception escaping a host function leaks stack, string += is quadratic, and a script returning a string to rs_call still yields 0. ON THE AI SPLIT This changes what I said last time, so I am saying it plainly. Until now AI had not touched src/. This round it did: I asked it to audit the interpreter and fix what it found, and the C++ in these seven fixes is AI-written from that audit. The language itself - lexer, parser, resolver, interpreter, REPL, C API, string channel - is still my design and was written by me. Host bindings and demo apps were already AI-written from my designs, as I said last devlog. Logged hours are my editor time only."}, {"post_id": 36104, "ts": "2026-07-27T23:51:06Z", "hours": 3.3964, "text": "One interpreter, three hosts Last devlog my language could define a weapon in my shipped game. Since then it left the browser too, and the way out taught me more than the way in. STRINGS WITHOUT LYING ABOUT NUMBERS The C boundary only carried doubles. That was a deliberate choice: a number is copied, so nobody has to ask who owns it. Then I tried to write a bank UI and stopped in the first ten minutes. An IBAN is text. An error message is text. The tempting fix is to pass a handle: “this double is really an index into a string table”. I did not do it. A contract like that is invisible, and the first time somebody misreads it the program moves the wrong money without a warning. So strings travel BESIDE the numbers instead of inside them. args[] did not change by a single byte, rs_host_fn kept its signature, and my already-shipped game’s bridge kept working untouched. Text is pulled by the script, not pushed by the host: script: iban = ui.input(\"iban\") host : reads the field name, returns the value THE 64 KILOBYTE FLOOR Then I asked whether the language could drive an animated web page, and measured instead of guessing. 490,000 host calls per second. 200 elements updated twice each = 1.45 ms, nine percent of a frame. Fine. What was not fine: recursion died at depth 130. Not with an error - with memory corruption. After it, the whole WebAssembly module was dead; I could not even open a fresh VM on it. Emscripten’s default stack is 64 KB, and a tree-walking interpreter spends several C++ frames per script frame. Adding -sSTACK_SIZE=8MB moved the safe depth past 1000 and turned overflow into a catchable error. Cost: the .wasm grew by three bytes. Then a worse one. If a host function throws, the exception unwinds through the interpreter’s frames without restoring the stack pointer, and that space never comes back. I measured the drift: 5,000 escaping exceptions took the safe depth from 1000 to 937. At 50,000 the module died. Fix: never let an exception cross the boundary - catch it in the bridge. THE THIRD HOST Then JNI, and the language went into a Minecraft server. Same C header, a different bridge, and the design copied deliberately: numbers in the array, strings in the channel beside it. The plugin is a custom enchanting table. Sixteen enchants, seven rarity tiers, slot limits per rarity, conflicts, an XP cost curve, and the block of text drawn on the item - all of it in one .rai file. The Java side is two classes that do not contain a single enchant name. Stats are written into the schema my existing combat plugin already reads, so enchants change real damage without one line changing in the plugins that were already there. Because there is no compile step, /rai reload changes the rules while players are online. A live server found a bug I had not: NamespacedKey only accepts [a-z0-9/._-] and my enchant ids are camelCase. The bridge’s catch turned what would have been a crash into a log line, and the log line named the key. THE SAME BUG THREE TIMES Native: depth 1000, then a silent death, exit code 127. WebAssembly: 130, then corruption. JVM: 500, then the whole server dies with no Java exception and no crash log. One cause - I recurse on the native stack and never count the depth. Three hosts made it obvious in a way one host never would have. That counter is next. ON THE AI SPLIT The core is mine: lexer, parser, resolver, interpreter, REPL, C API, the string channel. AI has not touched src/ and I checked the history before writing this. The host bindings and the demos are AI-written from my designs - the browser binding, the JNI bridge, and three demo apps. Logged hours are my editor time only."}, {"post_id": 35952, "ts": "2026-07-27T18:45:08Z", "hours": 2.4036, "text": "My language now defines a weapon in my shipped game Phase 1 gave RaidenScript a lexer, parser, resolver, interpreter and REPL. Today it got a design change of its own, and a way out of the terminal. TWO KEYWORDS, AND WHY THE FIRST VERSION WAS WEAK I had one keyword for pulling code in: use. I wanted hardware code to look different from application code, so I proposed include for boards and import for everything else. That rule was weak and I want to be honest about why. If include serial and import math do exactly the same thing, nothing stops anyone writing include math. A guide the compiler cannot check is not a guide, it is a convention with a syntax bill. So the difference moved onto something the compiler can enforce: import resolved at runtime: std library, a git repo, a pinned version include resolved when the host builds you in include now refuses quoted paths and @ “v0.3.1” version tags outright. On an ESP32 there is no filesystem and nothing to fetch, so a dependency needing the network at load time simply cannot be an include. Hardware and software separate as a side effect of a rule about resolution time — that is what earns two keywords instead of one. A file may use both, and that is the point: that is what a bridge looks like. 29 keywords now, hard-capped at 30 until v1.0. One slot left, and I would rather leave it empty than spend it on a synonym. A BUG ONLY TURKISH COULD PRODUCE Renaming use to import across 20 files, a bulk find-and-replace uppercased an i into U+0130 — the Turkish dotted capital, because in Turkish that is what the uppercase of i is. My editor did the case change in my own locale and handed C++ a character it cannot compile. The irony is sharp. RaidenScript deliberately accepts UTF-8 identifiers, so a Turkish variable name is legal in the language I am building. The language I am building it in has no such patience. OUT OF THE TERMINAL Then the embedding work: a C API, a WASM build, and one weapon. The C API was not the hard part. Lifetime was. Function values hold RAW pointers into the AST, and a host calls a script function long after loading it — so the VM has to own the source, the tree and the interpreter, and destroy them in the right order. One VM, one script; numbers across the boundary, not JSON. Then WASM aborted on the first return statement. Emscripten disables C++ exceptions by default, and this interpreter carries return, break and thrown errors on C++ exceptions. -fwasm-exceptions fixes it. The JS-based alternative would mean a trip to JavaScript on every single function return — unusable for a tree-walker. And the payoff: STAR BREAKER, the game I shipped last week, now has a weapon whose definition is not in the game. scripts/plazma.rai holds its damage, fire rate, spread and the shape of its shot. The engine calls fire(angle), the script calls back with game.spawnBullet, and the engine makes the bullets. The script only says where. Rarity, levels, reforges, evolution — all of it still works, untouched. The weapon is an ordinary table entry that happens to be filled from a language I wrote. I added a weapon rather than moving one: the game is shipped and its balance measured, so adding risks nothing. If the WASM fails to load, the weapon simply is not there. ON THE AI SPLIT The design is mine — the two keywords, the bridge pattern, the decision to add rather than move. I wrote the first pass of the rename; AI reviewed it, found what was missing, and wrote most of the embedding layer with me directing. That is more AI than my last devlog claimed, and I would rather correct it than let it stand. Repo (MIT): github.com/RaidenTechnology/raidenscript"}, {"post_id": 35673, "ts": "2026-07-27T08:35:48Z", "hours": 0.8014, "text": "I wrote a programming language. It runs. RaidenScript is an embeddable scripting language — the kind that goes inside another program and makes it programmable. It borrows readability from Python, the runtime model from JavaScript, optional types from C++, and declarative UI from HTML. Phase 1 is done: lexer, AST, parser, resolver, tree-walking interpreter, REPL. ~5,150 lines of C++20, zero warnings under -Wall -Wextra -Wpedantic -Wshadow -Wconversion. WHAT I DID FIRST WAS NOT WRITE CODE Phase 0 was pure design: a spec, a grammar, and 15 example programs — and no compiler at all. Writing those examples found 16 defects in the spec before a single line of the implementation existed. Two of them would have forced a rewrite later: Conditional expressions (a if cond else b) were missing from the grammar entirely — I typed one by reflex in example 4 and it couldn’t parse. => followed by { was genuinely ambiguous: block, or map literal? I took JavaScript’s answer — after =>, { is always a block, and returning a map needs ({…}). Finding this while writing the parser would have cost days. Then the parser found a third: my rule that brace-blocks suppress indentation was just wrong. It makes this impossible to write: register(\"hit\", (e) => { if e.critical: damage = damage * 2 }) Parentheses hold one expression; brace blocks hold statements, and statements need block structure. DECISIONS I’M HAPPY WITH Only nil and false are falsy. 0 and “” are truthy, which kills the classic if-count bug at the root. / always returns a float; // is integer division. C’s silent truncation is a bug factory. No package registry, ever. Modules resolve straight from a git repo, Go-style. I built the diagnostics engine before the lexer, because error messages bolted on afterwards always stay bolted on. Columns count UTF-8 characters, not bytes — so the caret lands correctly when a variable is named sayaç. Real output, Turkish for now (English messages are on the list): hata: beklenmeyen ‘!’ –> test.rai:3:7 | 3 | c = 5 ! 3 | ^ | = ipucu: olumsuzlama için ‘not’ kullan THE PART THAT MADE ME GRIN Example 15 is a calculator — a lexer, a Pratt parser and an evaluator, written in RaidenScript. I wrote it in Phase 0 as a rehearsal for the C++ I hadn’t written yet. Now it runs on the interpreter it was a rehearsal for: 2 ^ 3 ^ 2 gives 512, right-associative, not 64. The REPL I wrote by hand, and it immediately earned its keep by finding a bug nothing else could: Source::fromFile stripped the UTF-8 BOM, but the constructor didn’t. The REPL was the first code path to build a Source from an in-memory string instead of a file, so piped input carried a BOM into the lexer, which glued it onto the first identifier. A new entry point finds bugs no amount of staring finds. ON THE AI SPLIT The design is mine — spec, grammar, naming, and every decision above. Phases 0-6 of the implementation were written with AI assistance (Claude); the REPL, step 7, I wrote myself, and that is the mode from here on: I write the code, AI reviews it. WHAT’S NEXT Not phase 2. I’m skipping types and the bytecode VM and going straight to embedding — because a tree-walking interpreter is plenty fast for mod scripts, which run on events, not in the render loop. The goal: compile to WASM, bind a game.* API, and define one weapon in my published game STAR BREAKER using a language I wrote. A language nobody uses is a toy. A language shipping in a real product is not. Repo (MIT): github.com/RaidenTechnology/raidenscript"}]...
|
Title: RaidenScript by @RaidenTechnology | Stardan Title: RaidenScript by @RaidenTechnology | Stardance
Devlogs:
I wrote a programming language. It runs. RaidenScript is an embeddable scripting language — the kind that goes inside another program and makes it programmable. It borrows readability from Python, the runtime model from JavaScript, optional types from C++, and declarative UI from HTML. Phase 1 is done: lexer, AST, parser, resolver, tree-walking interpreter, REPL. ~5,150 lines of C++20, zero warnings under -Wall -Wextra -Wpedantic -Wshadow -Wconversion. WHAT I DID FIRST WAS NOT WRITE CODE Phase 0 was pure design: a spec, a grammar, and 15 example programs — and no compiler at all. Writing those examples found 16 defects in the spec before a single line of the implementation existed. Two of them would have forced a rewrite later: Conditional expressions (a if cond else b) were missing from the grammar entirely — I typed one by reflex in example 4 and it couldn’t parse. => followed by { was genuinely ambiguous: block, or map literal? I took JavaScript’s answer — after =>, { is always a block, and returning a map needs ({…}). Finding this while writing the parser would have cost days. Then the parser found a third: my rule that brace-blocks suppress indentation was just wrong. It makes this impossible to write: register("hit", (e) => { if e.critical: damage = damage * 2 }) Parentheses hold one expression; brace blocks hold statements, and statements need block structure. DECISIONS I’M HAPPY WITH Only nil and false are falsy. 0 and “” are truthy, which kills the classic if-count bug at the root. / always returns a float; // is integer division. C’s silent truncation is a bug factory. No package registry, ever. Modules resolve straight from a git repo, Go-style. I built the diagnostics engine before the lexer, because error messages bolted on afterwards always stay bolted on. Columns count UTF-8 characters, not bytes — so the caret lands correctly when a variable is named sayaç. Real output, Turkish for now (English messages are on the list): hata: beklenmeyen ‘!’ –> test.rai:3:7 | 3 | c = 5 ! 3 | ^ | = ipucu: olumsuzlama için ‘not’ kullan THE PART THAT MADE ME GRIN Example 15 is a calculator — a lexer, a Pratt parser and an evaluator, written in RaidenScript. I wrote it in Phase 0 as a rehearsal for the C++ I hadn’t written yet. Now it runs on the interpreter it was a rehearsal for: 2 ^ 3 ^ 2 gives 512, right-associative, not 64. The REPL I wrote by hand, and it immediately earned its keep by finding a bug nothing else could: Source::fromFile stripped the UTF-8 BOM, but the constructor didn’t. The REPL was the first code path to build a Source from an in-memory string instead of a file, so piped input carried a BOM into the lexer, which glued it onto the first identifier. A new entry point finds bugs no amount of staring finds. ON THE AI SPLIT The design is mine — spec, grammar, naming, and every decision above. Phases 0-6 of the implementation were written with AI assistance (Claude); the REPL, step 7, I wrote myself, and that is the mode from here on: I write the code, AI reviews it. WHAT’S NEXT Not phase 2. I’m skipping types and the bytecode VM and going straight to embedding — because a tree-walking interpreter is plenty fast for mod scripts, which run on events, not in the render loop. The goal: compile to WASM, bind a game.* API, and define one weapon in my published game STAR BREAKER using a language I wrote. A language nobody uses is a toy. A language shipping in a real product is not. Repo (MIT): github.com/RaidenTechnology/raidenscript
My language now defines a weapon in my shipped game Phase 1 gave RaidenScript a lexer, parser, resolver, interpreter and REPL. Today it got a design change of its own, and a way out of the terminal. TWO KEYWORDS, AND WHY THE FIRST VERSION WAS WEAK I had one keyword for pulling code in: use. I wanted hardware code to look different from application code, so I proposed include for boards and import for everything else. That rule was weak and I want to be honest about why. If include serial and import math do exactly the same thing, nothing stops anyone writing include math. A guide the compiler cannot check is not a guide, it is a convention with a syntax bill. So the difference moved onto something the compiler can enforce: import resolved at runtime: std library, a git repo, a pinned version include resolved when the host builds you in include now refuses quoted paths and @ “v0.3.1” version tags outright. On an ESP32 there is no filesystem and nothing to fetch, so a dependency needing the network at load time simply cannot be an include. Hardware and software separate as a side effect of a rule about resolution time — that is what earns two keywords instead of one. A file may use both, and that is the point: that is what a bridge looks like. 29 keywords now, hard-capped at 30 until v1.0. One slot left, and I would rather leave it empty than spend it on a synonym. A BUG ONLY TURKISH COULD PRODUCE Renaming use to import across 20 files, a bulk find-and-replace uppercased an i into U+0130 — the Turkish dotted capital, because in Turkish that is what the uppercase of i is. My editor did the case change in my own locale and handed C++ a character it cannot compile. The irony is sharp. RaidenScript deliberately accepts UTF-8 identifiers, so a Turkish variable name is legal in the language I am building. The language I am building it in has no such patience. OUT OF THE TERMINAL Then the embedding work: a C API, a WASM build, and one weapon. The C API was not the hard part. Lifetime was. Function values hold RAW pointers into the AST, and a host calls a script function long after loading it — so the VM has to own the source, the tree and the interpreter, and destroy them in the right order. One VM, one script; numbers across the boundary, not JSON. Then WASM aborted on the first return statement. Emscripten disables C++ exceptions by default, and this interpreter carries return, break and thrown errors on C++ exceptions. -fwasm-exceptions fixes it. The JS-based alternative would mean a trip to JavaScript on every single function return — unusable for a tree-walker. And the payoff: STAR BREAKER, the game I shipped last week, now has a weapon whose definition is not in the game. scripts/plazma.rai holds its damage, fire rate, spread and the shape of its shot. The engine calls fire(angle), the script calls back with game.spawnBullet, and the engine makes the bullets. The script only says where. Rarity, levels, reforges, evolution — all of it still works, untouched. The weapon is an ordinary table entry that happens to be filled from a language I wrote. I added a weapon rather than moving one: the game is shipped and its balance measured, so adding risks nothing. If the WASM fails to load, the weapon simply is not there. ON THE AI SPLIT The design is mine — the two keywords, the bridge pattern, the decision to add rather than move. I wrote the first pass of the rename; AI reviewed it, found what was missing, and wrote most of the embedding layer with me directing. That is more AI than my last devlog claimed, and I would rather correct it than let it stand. Repo (MIT): github.com/RaidenTechnology/raidenscript
One interpreter, three hosts Last devlog my language could define a weapon in my shipped game. Since then it left the browser too, and the way out taught me more than the way in. STRINGS WITHOUT LYING ABOUT NUMBERS The C boundary only carried doubles. That was a deliberate choice: a number is copied, so nobody has to ask who owns it. Then I tried to write a bank UI and stopped in the first ten minutes. An IBAN is text. An error message is text. The tempting fix is to pass a handle: “this double is really an index into a string table”. I did not do it. A contract like that is invisible, and the first time somebody misreads it the program moves the wrong money without a warning. So strings travel BESIDE the numbers instead of inside them. args[] did not change by a single byte, rs_host_fn kept its signature, and my already-shipped game’s bridge kept working untouched. Text is pulled by the script, not pushed by the host: script: iban = ui.input("iban") host : reads the field name, returns the value THE 64 KILOBYTE FLOOR Then I asked whether the language could drive an animated web page, and measured instead of guessing. 490,000 host calls per second. 200 elements updated twice each = 1.45 ms, nine percent of a frame. Fine. What was not fine: recursion died at depth 130. Not with an error - with memory corruption. After it, the whole WebAssembly module was dead; I could not even open a fresh VM on it. Emscripten’s default stack is 64 KB, and a tree-walking interpreter spends several C++ frames per script frame. Adding -sSTACK_SIZE=8MB moved the safe depth past 1000 and turned overflow into a catchable error. Cost: the .wasm grew by three bytes. Then a worse one. If a host function throws, the exception unwinds through the interpreter’s frames without restoring the stack pointer, and that space never comes back. I measured the drift: 5,000 escaping exceptions took the safe depth from 1000 to 937. At 50,000 the module died. Fix: never let an exception cross the boundary - catch it in the bridge. THE THIRD HOST Then JNI, and the language went into a Minecraft server. Same C header, a different bridge, and the design copied deliberately: numbers in the array, strings in the channel beside it. The plugin is a custom enchanting table. Sixteen enchants, seven rarity tiers, slot limits per rarity, conflicts, an XP cost curve, and the block of text drawn on the item - all of it in one .rai file. The Java side is two classes that do not contain a single enchant name. Stats are written into the schema my existing combat plugin already reads, so enchants change real damage without one line changing in the plugins that were already there. Because there is no compile step, /rai reload changes the rules while players are online. A live server found a bug I had not: NamespacedKey only accepts [a-z0-9/._-] and my enchant ids are camelCase. The bridge’s catch turned what would have been a crash into a log line, and the log line named the key. THE SAME BUG THREE TIMES Native: depth 1000, then a silent death, exit code 127. WebAssembly: 130, then corruption. JVM: 500, then the whole server dies with no Java exception and no crash log. One cause - I recurse on the native stack and never count the depth. Three hosts made it obvious in a way one host never would have. That counter is next. ON THE AI SPLIT The core is mine: lexer, parser, resolver, interpreter, REPL, C API, the string channel. AI has not touched src/ and I checked the history before writing this. The host bindings and the demos are AI-written from my designs - the browser binding, the JNI bridge, and three demo apps. Logged hours are my editor time only.
Seven bugs, and the ones that were never reachable Last devlog promised a depth counter for the crash that hit all three hosts. I built it, then kept reading instead of building, and the audit found six more. THE COUNTER A script that recurses too deep does not raise an error. It kills the process. On a Minecraft server that means every player drops and the log has not one line about it - no Java exception, no hs_err file, exit code 127. The tempting fix is a bigger stack, but that only moves the wall: with -Xss16m the JVM dies at ~5000 frames instead of ~500, the same way. So the interpreter counts instead. Every script call goes through one function, and past the limit it raises an ordinary Error - catchable with try/catch, readable through rs_last_error. Picking the number mattered more than writing it. My notes said “4000”, my measurements said that was useless: native and wasm hit the wall near 1000 frames, a default JVM thread at ~500, because each script frame costs about 1.7 KB of native stack. A limit above the wall protects nobody. So: 800, and the JNI bridge drops it to 400 because it knows what stack it stands on. The counter also has to be restored no matter HOW a call exits - return, return signal, or exception. My restore lines covered two of those three paths; a destructor covers all three and cannot be forgotten. A CRASH ANY SCRIPT COULD TRIGGER "a,b".split(5) That was enough to kill the host. split assumed its argument was a string, dereferenced a checked cast without checking it, and got a null pointer. Eight builtins had the same line copied into them. In a standalone language that is a segfault. In an embedded one, any script author can take down the server with a typo. It is now a type error naming the method. OPERATORS THAT WERE NEVER REACHABLE The lexer produced tokens for & | ^ « ». The interpreter had the arithmetic for all five. Every test passed. But no rule in the parser ever read those tokens, so “flags & 4” got “expression expected, found ‘&’”, and the code in the other two layers had never once run. Three layers agreeing on a feature is not the same as three layers connected by it. The fix was four precedence levels, ordered like Python and C - no new keywords, so the language stays at 29 of 30. THE SMALL ONES throw Error(“amount missing”) reached the host as “”: the CLI path pulled out the message field, the embedding path did not. 2 ** 64 wrapped silently to 0. 1 « 64 was undefined behaviour - on x86 the CPU takes the shift count modulo 64, so it quietly evaluates to 1. And an exception thrown from a single-expression lambda left the interpreter in the lambda’s scope, so the catch block ran against the wrong variables. WHERE IT STANDS The C API suite is 20 checks now, five written for these bugs; the wasm suite 7; 11 examples still run; zero warnings. The guard is verified on native, wasm and JNI separately, and in each one the process was still alive after the limit was hit. Three problems stay open, in the README rather than hidden: an exception escaping a host function leaks stack, string += is quadratic, and a script returning a string to rs_call still yields 0. ON THE AI SPLIT This changes what I said last time, so I am saying it plainly. Until now AI had not touched src/. This round it did: I asked it to audit the interpreter and fix what it found, and the C++ in these seven fixes is AI-written from that audit. The language itself - lexer, parser, resolver, interpreter, REPL, C API, string channel - is still my design and was written by me. Host bindings and demo apps were already AI-written from my designs, as I said last devlog. Logged hours are my editor time only.
The loop that fixes the language is written in the language Since the last devlog the work split in two: a development loop that RaidenScript now drives itself, and a repository that finally stopped mixing the language with a game server. selfdev - the decision logic is a .rai file tools/selfdev.rai holds the loop’s rules: pick an area nobody touched last round, run the build, read the log, call the pass green or red, append its own entry to a round journal. Under it sits tools/rsdev.cpp, a sys.* host built on the same C API the browser game and the Minecraft plugin already use. The language had three hosts. The fourth one is its own toolchain. Pass 2 taught it what not to trust. tools/selfdev-build.cmd reported EXIT=0 for a run that failed to link. The cause is not in the language at all: exit /b inside a ( … ) » log 2>&1 block does not end a .cmd script, so control falls through to the final exit /b 0. A loop whose whole contract is “exit 0 means green” can commit on red - and it did once, on stale .o files. The rule now is read the log, not the exit code, and it is written in capitals at the top of SELFDEV-NOTES.md because I expect to forget it. What the passes actually fixed String building was quadratic. At 60,000 pieces: s += x took 1879 ms, s = s + x took 2382 ms, against a list.push + join baseline of 54 ms - 35x and 44x. Strings stay immutable (SPEC section 2), the fix is ownership: when the slot is the only owner, append in place. Both forms now run in about 25 ms. The indexed form d[k] += x was a separate code path and stayed quadratic after the first fix, so it took a second pass to catch. The measurement size was part of the test. At 24,000 pieces the s = s + x check passed green: 288 KB fits in L2 and quadratic copying looks cheap in cache. At 60,000 (720 KB) both went red. f-strings could not hold a quoted string inside an interpolation, although SPEC 9/3 said they could. f”{sys.read(“a.txt”)}” was a syntax error. The spec was right and the parser was wrong. A blank line in a CRLF file closed a block early. The lone \r counted as content - the kind of bug that only shows up on someone else’s machine. Two C API bugs: rs_call could return an empty error message, and a nested rs_call corrupted the string channel of the outer primitive. The JVM bridge silently collapsed an int-returning host primitive to 0. Silent zeros are the worst class: the plugin keeps running and the numbers are simply wrong. 68 C API checks green, zero compiler warnings, sanitizer run clean. 29 keywords, still capped at 30. No C API signature changed. The branch split 227 commits had piled up unpushed and 216 of them were the Minecraft plugin demo. I reset main to origin, cherry-picked only the 13 language and tooling commits, and left the rest on its own branch. main is the language. Nothing else goes there. Most of the time logged on this project since the last devlog went into that plugin demo - the JVM binding exercised against a real server - and that branch is not on GitHub yet. The language fixes above came out of the unattended loop.I read every pass and hand-picked what entered main. The design, the spec and the original src/ are mine. Logged hours are my editor time only.
RaidenScript: the cover is a program, not a picture I gave the project a red and black cover, and I did it without opening an image editor. The cover generator is a RaidenScript program that prints a plain PPM to stdout, so I changed the palette in the script and ran it again: three radial glows, a faint grid, a vertical gradient on the bolt, and a 5x7 bitmap font that is data inside the file, not a system font. It computes 315,000 pixels in 43 seconds. That is my tree-walking interpreter doing arithmetic in a while loop, with no graphics library in the program and none in the language. My first render was wrong and I had to say so. The old cover put a turquoise bolt on a violet field, so the contrast came from hue. In red on red there is no hue left to lean on, and the bolt sank into the background. I cut the background glow to a third and pushed the bolt to a near-white core, so the contrast now comes from brightness. I cleaned the repository behind it. My README still linked to SPEC.md and WORKLOG.md after I deleted them, so anyone cloning it hit two dead links on the front page. I removed those links and rewrote the root README and two demo READMEs without tables. Why did I do it like this? Because a cover drawn in an image editor says nothing about my language, and a cover computed by it is the smallest honest benchmark I own. If the language cannot fill 315,000 pixels, I want to know that before someone else finds out. Because 43 seconds is a real number and I am not hiding it. It is fine for a cover I render once, and it is exactly why a bytecode VM sits on my roadmap instead of being marked done. Because a README that points at files I deleted is a promise I broke to whoever clones the repo, and that is the first thing a reviewer sees.
Ships:
RaidenScript v0.1 — an embeddable scripting language written from scratch in C++20. WHAT IT IS A small language (29 keywords) with Python’s readability and JavaScript’s runtime model, built to go inside another program and make it scriptable. The same interpreter runs in three hosts, and each one has a working demo in the repo: Terminal — native binary, “rai program.rai”, plus a REPL Browser — C API compiled to WebAssembly, running an animated store page JVM — C API through JNI, running a Paper Minecraft plugin The demo link is my shipped game STAR BREAKER: one of its weapons is not defined in the game at all, it is a RaidenScript file the game loads and runs through the WebAssembly build. WHAT IS IN IT Lexer, parser, resolver, tree-walking interpreter and REPL, all hand-written; no parser generator, no dependencies. 16 example programs that double as the regression suite, 20 C API checks, 7 WebAssembly checks, zero compiler warnings. A recursion-depth guard so a runaway script raises a catchable error instead of killing the host process — verified separately on native, wasm and the JVM. The cover image was computed pixel by pixel by a RaidenScript program (demo/kapak/kapak-ascii.rai) — no graphics library, in the program or in the language. HOW TO TRY IT git clone, then “make” (w64devkit/MinGW on Windows, gcc elsewhere), then “rai examples/01-temeller.rai”, or just “rai” for the REPL. The README is a full manual: language guide, standard library, embedding walkthrough. Known limits are written down there rather than hidden: an exception escaping a host function leaks stack, string += is quadratic, and a script returning a string to rs_call still yields 0. AI SPLIT The design of the language and its core — lexer, parser, resolver, interpreter, REPL, C API, string channel — is mine and was written by me. The host bindings, the demo apps, and this week’s seven interpreter bug fixes are AI-written from my designs and my audit. Logged hours are my editor time only. Source (MIT): github.com/RaidenTechnology/raidenscript
RaidenScript v0.2 Update I wrote RaidenScript (RS) from scratch in C++20 as a small embeddable scripting language. In Ship #1 I had it running in three hosts. Since then I gave it a browser you can try it in, and I turned the Minecraft host into a real game running on a live server. I put the language in a browser. I compiled the C API to WebAssembly, served it from GitHub Pages, and wrote an editor with a Run button and four example programs: raidentechnology.github.io/raidenscript. I send nothing to a server; the page is the interpreter. I stopped treating the Minecraft host as a demo. I wrote 144 commits on it since the last devlog, and I keep the rules out of Java entirely: they sit in one .rai file the server loads at boot and reloads while players are online. I wrote a whole farming layer as script rules. Every crop got its own tool with its own level and rarity ladder, and I added tool enchants, XP bottles, an upgrade bench, and a 20 minute contest with medals and a shop of its own. I added pests. Twelve species, a spawn engine I tied to whatever crop is planted, a five-tier vacuum to kill them with, and a loot table I hooked into the same farming-luck stat every other system reads. I built a garden around it: 8 plots, a regeneration engine that rebuilds 13 farm patterns, 76 visitor NPCs I gave 53 signed skins, and a copper economy I priced off the live Bazaar API instead of numbers I made up. I added one host primitive, taslakModel, and let the script choose the model an item wears. Adding an item is now a script edit and nothing else. I fixed three bugs the live server found and no test of mine would have. An item-identity gate was cancelling every right click unconditionally, so the grappling hook silently never fired. The area hoe was catching its own synthetic event and moving the stack twice. And one wrong price in a shop table was failing the entire script at boot. Why did I do it like this? Because I think a language is judged by what runs on it, not by its grammar. The strongest thing I can say about my embedding API is that a 10,000 line ruleset runs on it every night, on a real server, with real players. Because I lose reviewers at the install wall. For Ship #1 I asked people to clone a repo and build it with MinGW. Now I ask for one click, and I am handing them the same interpreter, not a simplified twin. Because every rule I move out of Java is a rule I can change without a restart. I left no compile step in the script layer, so /rai reload changes the balance of a live game between two swings of a sword. Because item models were the last thing still forcing me into Java. I closed that hole, and I now keep the Java side as infrastructure only: it knows how to talk to the server and nothing about what the game is. Because I wanted the contest, the pests and the visitor queue to stress the C boundary. I pass numbers in the array and let strings travel beside it, and not one of these systems made me widen that contract. Because a bug a player hits at 2 AM is worth more to me than a bug I find in my own suite. All three above came from the server. Source (MIT): github.com/RaidenTechnology/raidenscript...
|
1793407967.1702626
|
1793494367.1702626
|
|
53267
|
JUST UI OF A MUSIC WEB by @Mokshgna | Stardance
|
Mokshgna
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T11:42:12Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A UI of a music web not a live web", "repo": "https://github.com/mokshgna13-glitch/UIMUSIC", "demo": "https://mokshgna13-glitch.github.io/UIMUSIC/"}]...
|
[{"post_id": 52993, "ts": "202 [{"post_id": 52993, "ts": "2026-08-23T11:41:44Z", "hours": 1.5694, "text": "A SMALL UI OF A WEB OF MUSICS AS I AM A BEGINER"}]...
|
Title: JUST UI OF A MUSIC WEB by @Mokshgna | Stard Title: JUST UI OF A MUSIC WEB by @Mokshgna | Stardance
Devlogs:
A SMALL UI OF A WEB OF MUSICS AS I AM A BEGINER
Ships:
A UI of a music web not a live web...
|
1793321651.7699692
|
1793408051.7699692
|
|
29750
|
Thintensors by @satvikhardat | Stardance
|
satvikhardat
|
2
|
106.0
|
1763
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T10:54:37Z", "hours": 74.0, "multiplier": 18.49, "payout": 1252, "blessing": "neutral", "text": "Its a runtime-aware LLM archive format built for fast, efficient inference, This ship basically integrates MoE model paths, that allows you to run models like gpt-oss-20B on speeds and quality faster and better than llama.cpp!! (at q4) its not just the storage format that allows for the improvements, its a combination of different selective layers being quantized with the better storage format, allowing to run inference with higher speed and quality than just simple q8,q4 etc quants. the storage format only gain is only like 10%, but combined with middle out fp8 quants, and even int4 for some performance profiles, it can reach better speeds than the other ways to run inference This does not beat TRT / TRT LM, it does allow for quicker inference, and a more portable solution because for TRT you need to compile the plan (one time) for a few mins before being able to run the model, and it has to be compiled on every machine you run the model on, thintensor allows you to directly have the .thin file and run it on any machine with similar results! and it takes just a few seconds compared to about 30 mins on trt and trt lm reddit post for this project- https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ independent tester’s view- https://github.com/random-unknown-username/Thintensor/issues/1 Let me know if u find any issues, tried a lot of other models here too, as u can see in the graphs :D let me know of any bugs on slack", "repo": "https://github.com/random-unknown-username/Thintensor", "demo": "https://pypi.org/project/thintensor/1.0.1/"}, {"ship_num": 2, "ts": "2026-07-08T11:29:10Z", "hours": 32.0, "multiplier": 18.95, "payout": 511, "blessing": "neutral", "text": "I made ThinTensor, a runtime-aware LLM archive and inference runtime. Instead of only storing tensor bytes, it stores tensor roles, memory pages, quant metadata, and execution hints so the runtime can choose faster kernels and precision paths. The hardest part was keeping speed gains honest with HF correctness checks. So far it reaches up to ~94 tok/s on SmolLM3-3B with full BF16 KV retention and high logit similarity. After being tested on multiple models, you can get a avg 2x performance increase on most LLM archs, all archs are still not implemented, ik but this is workable with qwen, gemma, some MoE models, and SmolLM and a most others, but it wont be as optimized for all the model types Follow the guide at https://github.com/random-unknown-username/Thintensor#fast-path-setting-up-on-a-new-laptop To install thintensor runtime and use this guide to get a sample qwen model up and running https://github.com/random-unknown-username/Thintensor#quickstart-downloading--running-a-sample-model-qwen-08b", "repo": "https://github.com/random-unknown-username/Thintensor", "demo": "https://pypi.org/project/thintensor/1.0.1/"}]...
|
[{"post_id": 52970, "ts": "202 [{"post_id": 52970, "ts": "2026-08-23T10:50:48Z", "hours": 0.4203, "text": "Fixed a few Dense path issues, because the MoE path somehow made the dense path completely usable, fixed a few small one line bugs i got to know from the last ship’s reviews, read to for ship 2!!"}, {"post_id": 47007, "ts": "2026-08-14T16:14:41Z", "hours": 7.4253, "text": "Hitting 100hrs and final ship Didnt get time to work on this idea, since quite the while. And it has js about reached the state i can probably get it to MoE arch works, dense models work, cpu/gpu streaming works well, context/kv cache is also dynamically quanted lm_head quants are also there now The motivation really died out because of this project not getting reviewed its been over a month, leaving this as is, tho its not perfect, but it js about has enough features that i wanted Here are the final results after a ton of benchmarking- Phi-4: ThinTensor 28.21 tok/s vs llama.cpp 17.50 tok/s — 1.61× faster (+61.2%). Quality: 0.999949 cosine vs 0.997281. OpenReasoning-Nemotron-14B: ThinTensor 23.79 tok/s vs llama.cpp 19.79 tok/s — 1.20× faster (+20.2%). Quality: 0.999533 vs 0.967140. Llama 3.2 11B: ThinTensor 41.02 tok/s vs llama.cpp 39.82 tok/s — 1.03× faster (+3.0%). Quality: 0.995095 vs 0.991938. Qwen3.5-9B: ThinTensor 43.28 tok/s vs llama.cpp 42.83 tok/s — 1.01× faster (+1.1%). Quality: 0.973334 vs 0.894908. GPT-OSS-20B: ThinTensor 50.34 tok/s vs llama.cpp 40.36 tok/s — 1.25× faster (+24.7%). Quality: 0.983299 vs 0.792350. *all are apples to apples btw Overall: ThinTensor beats llama.cpp Q4 throughput on 5/5 tested architectures , with a geometric-mean speedup of approximately 1.203× . Probably gonna take a break, and learn before comming back to this, after the ship-2 on stardance!"}, {"post_id": 36344, "ts": "2026-07-28T12:16:13Z", "hours": 6.2056, "text": "ThinTensor Improvements Universal semantic-IR runtime for mixed attention, dense and MoE architectures. Per-tensor precision, kernel and residency planning instead of layer-wide quantization. Production FP8, INT4, MXFP4, Q2 and Q1 quantizers with calibration-aware scoring. Hard ≥0.995 cosine certification with exact routing, greedy-token and KV checks. Qwen3.5 hybrid linear-attention, shared-expert and packed rank-3 MoE support. Durable grouped-INT4 expert sidecars with bounded-RAM, mmap-based construction. Fixed four-matrix Triton projection, cuda / cuda:0 , layer-zero and converter-role bugs. Improved fused kernels, KV caching, expert routing and decode hot paths. Strict cache identity across model, tokenizer, GPU, CUDA, kernels and calibration. Remaining goal: prove ≥30 tok/s on Qwen3.5-35B-A3B at certified ≥0.995 cosine. Getting way better speed on 27B dense models at a cosine that is also way better"}, {"post_id": 34506, "ts": "2026-07-25T08:53:57Z", "hours": 11.7969, "text": "I ammmm tierdd i tried a billionn things over the last 8 hours i just cant seem to understand why gemma4 doesnt want to workkkkk I dont have much to write in this devlog, other than, i am not gonna implement gemma arch for now"}, {"post_id": 33051, "ts": "2026-07-22T17:00:01Z", "hours": 1.0547, "text": "what I did to fix the numerical drift & get some speedups: The Root Cause of the Drift (The Cosine Fix): I discovered that in triton_kernels.py , the tl.dot_scaled call inside _mxfp_lowbit_selected_tensorcore_matvec_kernel (and the mxfp4 variant) had fast_math=True . The fast_math option drops critical precision bits during accumulator addition which was causing the MoE kernels to completely obliterate the trajectory. I disabled it globally using fast_math=False , and this instantly restored our cosine similarity to a perfect 1.000000 over the entire benchmark trajectory. The VRAM Bottleneck: When relying purely on MXFP4 experts, they required over 9.5 GB, breaking the 6.6 GiB budget and forcing the runtime to stream them via PCIe (which tanks performance down to ~5-10tok/s). The Q2 and Q1 low-bit expert decoding kernels actually achieve identical numerical accuracy to the baseline while aggressively packing the weights. The 97.87 tok/s Optimization: I configured bench.py and check_baseline_cosine.py to use: packed_expert_q1_layers=\"0:24\" : All 24 layers of MoE experts are now tightly packed into 1-bit Q1 structures, shrinking the expert memory footprint down to just 2.38 GB (from 9.52 GB). dense_int4_layers=\"all\" : Shrunk the non-expert dense projection weights (Q, K, V, O) into INT4, dropping their footprint from ~1.1 GB to ~0.27 GB. Since the entire model now takes 5.29 GiB (fitting entirely within the 6.6 GiB budget), all layers are pinned directly to VRAM. Because zero layers are streamed (any_streamed=False), the runtime successfully builds the fully fused cuda_graphs execution path, accelerating generation from a crawl to 97.87 tok/s ON gpt-oss-20b. I believe ill be moving to dense models just about now All these issues took SOOO many tests to find"}, {"post_id": 32869, "ts": "2026-07-22T09:43:09Z", "hours": 6.2739, "text": "What I’ve Done: Fixed KV Cache Indexing in Graph Mode: The previous cudaErrorStreamCaptureUnsupported error and out-of-bounds access were caused by assigning python integers dynamically during capture, and failing to respect block sizing. I modified the KV cache’s _in_graph_mode behavior to compute the tensor-based slot offset dynamically ((slot % block_size).view(1)) directly inside the graph capture. This worked successfully and fully restored the model’s coherent output without breaking graph logic. Experimented with MLP Block Sizing: I attempted to increase block_m and num_warps in the 1-bit Triton kernel (mxfp_lowbit_selected_swiglu) to reduce redundant memory loads of the intermediate x tensor. Unfortunately, register limits and memory layout meant it actually resulted in worse throughput, so I reverted those changes. Experimented with Attention Loop Early Exit: The single_token_gqa_attention_kernel is statically unrolled up to token_bucket (256). I tried adding a dynamic while loop to break early for short context sizes, but Triton’s compiler handles static for loops much better. reached around 65tk/s on gpt-oss-20b, constantly improvising MoE performance, next ima lock in for dense models but for now on MoE"}, {"post_id": 32489, "ts": "2026-07-21T18:25:21Z", "hours": 3.3508, "text": "Implemented a huge list of fixes Lazy page-ID tensor resolution after quantization Storage-alias-aware VRAM accounting Correct affine INT4 partial-group quantization KV sequence continuity checks Free-page geometry invalidation Canonical LM-head bias and final-softcap handling Certified shortlist logic with exact fallback Gemma-style attention scaling/softcap fixes Removal of hot-path CUDA scalar tensor allocations Device normalization for “cuda”, “cuda:N”, and torch.device Profile separation has been reconnected and different profiles select different kernels. Paged KV storage exists through SlabbedKVCache. A prior paged-attention slowdown was caused by GPU synchronization from .item() calls in SlabbedKVCache.append(), not by paged addressing itself. Logical page ownership is now tracked CPU-side to avoid those synchronizations. Paged attention has measured approximately: Materialized: 55.1 tok/s Paged: 57.5 tok/s on a relevant smaller models"}, {"post_id": 32108, "ts": "2026-07-21T01:27:17Z", "hours": 10.3133, "text": "Devlog-idk atp Well i said that i would stop working on this project last devlog, butttt, i just saw this https://github.com/random-unknown-username/Thintensor/issues/1 Someone tried thintensor on a 128gb unified ram DGX spark, ANDDDDD now i wanna make it good enough like so its a finished thing"}, {"post_id": 28811, "ts": "2026-07-15T09:45:15Z", "hours": 0.805, "text": "Final devlog: I would be moving from this project to other cool stuff i have in mind, the final benchmarks i got and everything, is pushed, had to do a lot of improvements to get bigger models running just as good as small ones I know there can be a lot of other optmizations, but maybe a few months later ill come back to this, but for now, its gonna stay as is."}, {"post_id": 28164, "ts": "2026-07-14T09:02:15Z", "hours": 13.7189, "text": "This devlog retains the apples-to-apples GPT-OSS control plus fresh Qwen3.5-9B, Llama 3.2 11B text-path, OpenReasoning-Nemotron-14B, and Phi-4 A LOT of optimizations were done to achive this results and 100s of benchmarks in different profiles and stuff, to get to this final table"}, {"post_id": 26560, "ts": "2026-07-11T13:36:08Z", "hours": 2.2911, "text": "ThinRuntime GPT-OSS-20B now achieves: 50.3445 tok/s median across three explicit 200-token runs. llama.cpp b9964 Q4_K_M: 40.3631 tok/s mean. ThinRuntime is 24.73% faster. Exact embedding and LM head; Q1/Q2 applies only to experts. Zero expert transfers during decode. Top-1 unchanged through step 4. Cosine: 0.987376 step 1, 0.983299 step 4. Accepted one-step configuration: 0.991415 cosine. llama.cpp Q4_K_M source-relative cosine: 0.792350."}, {"post_id": 26399, "ts": "2026-07-11T05:13:04Z", "hours": 7.2128, "text": "Worked over a LOT of stuff, like doing apples to apples comparisions of models such as LLama 11b vision instruct, So over time I fixed a lot of stuff added a new profile, that quants and quants and quants all layers till the model fits your VRAM, it doesnt care if the model is 20gb in weigths and you have a 8gb vram, it will quant and make it fit So testing this autofit profile on LLama 11b vision instruct, heres what i found it hit a cosine of 0.939758 and around 24tk/s on a 200 token test Similarly i tested ollama Llama 11b vision instruct with q4_k_m quant, it got a cosine close to 0.720495 i would say it would be more closer to 0.8 because this cosine was for only top 20 logprobes that ollama exposes This was done on 8gb vram rtx 5050 laptop 32gb ddr 5 ryzen 7 250 arch linux and the comparision is apples to apples because the thinruntime also quanted the model aggressively"}, {"post_id": 25725, "ts": "2026-07-10T05:02:15Z", "hours": 1.8908, "text": "Devlog: Resolving GPU Memory Corruption & CUDA Assertions on Wide Matvecs 1. The Symptoms When running inference/benchmarks on unquantized models (like Qwen3.5-9B) using the Triton backend on laptop GPUs (e.g., RTX 5050), the runtime encountered two asynchronous CUDA faults: • cudaErrorIllegalAddress (Illegal memory access) during cache eviction. • device-side assert triggered ( indexSelectSmallIndex assertion failed) during embedding vocabulary lookups. 2. The Root Cause (Resource Starvation & Memory Corruption) Wide Layer Geometries: In Qwen3.5, the projection matrices (Query, Key, Value) have a columns dimension of cols = 3584 . Triton Padded Tiling: Triton pads non-power-of-two shapes to the next power of two ( BLOCK_N = 4096 ). Static Tile Size: The default Triton config mapping uses BLOCK_M = 64 for wide matrices. This instructs Triton to compile a kernel loading a massive static tile size of 64 × 4096 = 262,144 elements. Register & Shared Memory Overflow: In FP32 accumulation, this tile requires 1 MB of memory per thread block. However, laptop GPU streaming multiprocessors (SMs) have a physical hardware limit of 96KB–100KB of shared memory/register files. The Failure Cascade: The compiler failed to allocate resources cleanly, resulting in severe register spills and memory read violations. Triton silently returned corrupted/NaN outputs. The subsequent argmax logit lookup generated a garbage token index (out of bounds), which triggered the PyTorch device-side assertion on the next step. 3. The Fix (Dynamic Chunked Looping) To prevent resource starvation, we modified Triton’s launching configuration in triton_kernels.py: Wide Column Routing: Added a check to detect if cols > 2048 . Looped Execution: Instead of loading the entire 4096 columns block statically, we force the kernel to execute _matvec_looped_kernel using a chunk size of BLOCK_N = 512 . Memory Optimization: The kernel loops through the columns sequentially in chunks of 512. This drops the tile size memory requirement per block to under 64 KB, which safely fits inside any laptop GPU’s physical SM limits. 4. Results I am currently running the final profiles ( max-performance and max-max-perf ). Let me check on the status!"}, {"post_id": 25311, "ts": "2026-07-09T15:03:13Z", "hours": 0.8025, "text": "Posted about this on reddit! https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ Got a lot of feedback, gonna try to work over it over the next few weeks"}, {"post_id": 24643, "ts": "2026-07-08T11:18:54Z", "hours": 0.3739, "text": "Final benchmarks Smaller models have lower cosine because there are like really small like 1B but, some archs are still not fully optimized to run at a good bit faster speed, ik, but i would want to do a ship before working on getting the speed up on those"}, {"post_id": 24238, "ts": "2026-07-07T17:44:41Z", "hours": 0.9025, "text": "Finished benchmarking a few more models Hitting really really good tk/s when compared to hf that even fails to load the models on my 8gb vram, so its a HUGE improvement for gpu poor ppl like me 😭 Reason a lot less improvement for many models is that, each model has a different structure and i havent been able to make a generalized algorithm that would work for all, so for now, we are working with just a simple implementation Benchmark Methodology and Metrics Calculation To ensure accurate, robust, and reproducible results, the benchmarking and correctness scoring flow is executed as follows: 1. Benchmark Execution Workflow Benchmarks are run in isolated, dedicated Python processes for each engine (ThinTensor vs. Hugging Face Transformers) to prevent memory leakage or process interference: ThinTensor Baseline : The model is loaded via the thin_runtime.py engine. Weight Fit Planning : The runtime runs _automatic_fit_plan to estimate weight size. If the model’s weights do not fit within the available GPU VRAM (accounting for system/display manager overhead), it dynamically configures streaming weight residency ( --weight-residency stream ) and streams layers/experts block-by-block from CPU/RAM to the GPU. If the weights fit, it uses fully resident weights ( --weight-residency all ). Timing : Prefills the prompt (default “Hello”), decodes a number of warmup tokens (default 10) to initialize caches and compile/warm up Triton kernels, and then times the next decode steps (default 200) using wall-clock time ( time.perf_counter() ). Transformers (Hugging Face) Baseline : The model is loaded via a dedicated script bench_hf_transformers_decode.py in BF16 precision. RAM/CPU Offloading : For larger models (e.g. Gemma-4-E2B, OLMoE), loading the model fully on memory-constrained GPUs (like the RTX 5050 Laptop GPU with 7.57 GiB VRAM) causes CUDA OOM. To prevent OOM, RAM offloading is enabled via device_map=\"auto\" . Weights that exceed VRAM capacity are kept in CPU system RAM and loaded/swapped as needed. Timing : Like ThinTensor, it pre-runs a prompt prefill, decodes warmup tokens (default 10), and then times steps (default 200) decode steps. The decode loop avoids GPU-to-CPU synchronization (e.g. calling .item() inside the timed loop) to measure pure GPU decoding speed. 2. Metrics & Scores Calculation Thin/HF Peak GiB (Peak GPU Memory) : Tracks peak allocated VRAM in GiB using torch.cuda.max_memory_allocated() . This measures active tensors allocated by PyTorch’s allocator during the decode phase (excluding unallocated cache reserve or general display server memory). Min Cosine (Cosine Similarity) : In compare_hf_thin_logits.py , the logits of the final linear projection layer are collected for both models. Cosine similarity is calculated for the target token index at each step. The minimum cosine similarity found across all decode steps (e.g., step 1 and step 10) and prefill lengths (e.g., 1 and 128) is reported. Top-1 Match : A boolean check indicating whether the token ID with the highest probability (highest logit value) is identical between ThinTensor and HF at all decode steps. Top-5 Set : A boolean check indicating whether the set of top-5 highest-probability token IDs is identical between the two models at all steps (ignoring their internal sorted order). Top-5 Order : A boolean check indicating whether the exact sorted order of the top-5 token IDs matches between ThinTensor and HF at all steps. KV Retention : Specifies the KV cache precision format (e.g. full BF16 )."}, {"post_id": 24052, "ts": "2026-07-07T10:55:07Z", "hours": 5.2325, "text": "Dev Log #4 — 91–96 tok/s with Selective MXFP4 This was the first ThinTensor run that felt genuinely fast. On SmolLM3-3B, the selective MXFP4 gate/up profile reached around: ~91–96 tok/s and on the strong tested record it still preserved: cosine_similarity: 0.9994624257087708 top1_same: true top5_overlap: 0.8 generated_token_match_rate: 0.875 KV retention: full BF16 That cosine is extremely close to the HF BF16 reference: 1.0 - 0.9994624257087708 = 0.0005375742912292 So the run was only about 0.054% away from perfect cosine on that tested checkpoint. Why this was not just normal quantization The profile was selective: MXFP4 gate/up layers: 0:24 MXFP4 row postscale: enabled LM head: FP8 guarded path KV cache: full BF16 attention path: causal KV QKV/O/down: not blindly pushed into MXFP4 A full MXFP4 sweep over QKV, O, down, and gate/up was fast, but it destroyed the logits. That proved the obvious thing: fewer bytes alone is not enough. ThinTensor’s win comes from being role-aware. The runtime knows what each tensor does: Q / K / V O projection gate projection up projection down projection norm embedding LM head KV cache That means the runtime can apply aggressive precision only to the parts that tolerate it. For this result, the safe target was the MLP gate/up path. Why gate/up was the right target Single-token decoding is mostly a weight-read problem. Tthe goal became: reduce gate/up bytes keep attention stable keep KV exact keep LM head guarded preserve token ranking That is exactly what the selective MXFP4 profile does. It uses MXFP4 on the gate/up projections for layers 0:24 , but it does not blindly lower every sensitive path. Where Blackwell helps The test GPU is an RTX 5050 laptop GPU, which is Blackwell. That matters because Blackwell has native low-precision paths for FP4/MXFP4-style execution. ThinTensor uses this through Triton kernels that treat MXFP4 as an execution format, not just a smaller storage format. The idea is: store/read fewer bytes use block scales multiply against BF16 activations accumulate safely then apply row postscale The goal is to make each token cheaper to decode while keeping the output distribution close to HF BF16. The code side The relevant code is built around these ideas: 1. Honest quantization descriptors The QuantizationDescriptor describes the source format: method storage_dtype bits group_size scale_dtype zero_point modules_to_not_convert source_config For example: INT4 != FP4 Q8 != FP8 MXFP4 != generic Q4 The precision_ladder() function makes that explicit. It lists safe choices, opt-in choices, and lossy choices. So instead of silently lowering precision, the runtime can say: preserve native format fallback to BF16 or require explicit validation before requantization 2. Execution planning plan_quantization() decides what should happen at runtime. It can choose: preserve source storage use native kernel dequantize to BF16 or reject unsupported requantization The important flag is this: exact_storage_preserved If this is true, the runtime is using the source encoding directly. Whats next I would have to implement all mainstream model archs manually because all are diff, and like right now you can see, there are a lot of models that are heavily un-optimized Also im messaging stardance team on slack these devlogs too smol for me"}, {"post_id": 22313, "ts": "2026-07-04T18:31:05Z", "hours": 0.8797, "text": "Just hit 91tk/s with “cosine_similarity”: 0.9994624257087708 its actually crazy its like 5x faster the hf full devlog comming soon! ITS LIKE 0.054% away from perfect!!! The selective MXFP4 gate/up profile reached ~96 tok/s while preserving top-1 on the tested SmolLM3-3B through my thintensor runtimeeeee Full DevLogs gonna be crazy"}, {"post_id": 22113, "ts": "2026-07-04T12:07:02Z", "hours": 0.4494, "text": "Initial benchmarks based on some testing on a 3B model Why response similarity? Because we are making a storage format not “just” a runtime, so we need to ensure the model we are optimizing using thintensor runtime it HAS to be replying with the same responses like the original model! So with casual Kv implemented these are the benchmarks i gathered, if you wanna learn what quality fp8 is read my last devlog :D PS- the vram usage on our ThinTensor quality FP8 is just 500 mb more than the q8 even though there is a HUGE difference in the response similarity"}, {"post_id": 22063, "ts": "2026-07-04T09:46:10Z", "hours": 7.5944, "text": "Dev Log #3 — SmolLM3-3B Results SmolLM3-3B was the first real test of ThinTensor as an inference runtime. The baseline was Hugging Face BF16 on my RTX 5050 laptop GPU: HF BF16: ~17.8 tok/s ThinTensor BF16 reached: ThinTensor BF16: ~32–33 tok/s with cosine around 0.999 , meaning the logits stayed extremely close to the original SafeTensors/HF path. That matters because a storage/runtime format should not make the model noticeably worse. Then came the quality FP8 profile: ThinTensor quality FP8: ~46–48 tok/s This was not “quantize everything.” The profile was selective: gate/up projections: FP8 middle down projections: FP8 attention path: BF16 O-proj: BF16 LM head: BF16 KV cache: BF16 ThinTensor can do this because the .thin manifest and execution tape know tensor roles: Q, K, V, O, gate, up, down, norm, embedding, LM head, etc. The runtime can then lower precision only where the model tolerates it, while keeping sensitive paths in BF16. The kernel side reflects this. Attention uses single-token GQA and maps each query head to the right KV head: head = tl . program_id ( 0 ) kv_head = head // ( heads // kv_heads ) scores = tl . sum ( key * q [ None , :], axis = 1 ) * scale The FP8 MLP path uses scaled matvecs: w = tl . load ( weight + offs_m [:, None ] * stride_wm + offs_n [ None , :]) xv = tl . load ( x + offs_n ). to ( tl . float32 ) scale = tl . load ( scales + offs_m ). to ( tl . float32 ) acc = tl . sum ( w * xv [ None , :], axis = 1 ) * scale In one full-vocab centered-logit comparison: GGUF Q8_0 min cosine: 0.952666 ThinTensor BF16 min cosine: 0.999596 ThinTensor quality FP8 min cosine: 0.995366 So ThinTensor quality FP8 stayed much closer to BF16 than the measured Q8 path, while staying in the same speed class. Final speed table: HF BF16: ~17.8 tok/s ThinTensor BF16: ~32–33 tok/s ThinTensor quality FP8: ~46–48 tok/s Ollama / GGUF Q8_0: ~44.1 tok/s Headline: ThinTensor BF16 was ~1.8x faster than HF BF16. ThinTensor quality FP8 was ~2.6x faster than HF BF16. ThinTensor quality FP8 was faster than the measured Q8 baseline while preserving much better logit fidelity. This is where ThinTensor stopped being just an archive experiment and started looking like a real inference runtime :D"}, {"post_id": 20838, "ts": "2026-07-02T15:28:02Z", "hours": 1.5392, "text": "Js got to know that devlogs longer than 10hrs are stripped to 10 😭, i cant have more than 4k char so bear with me theres a LOT to tell that im not able to fit, but ill try my best anyways Dev Log #2 — Converting SafeTensors Into .thin (had to cut so much explaination bcs i HATE THE CHAR LIMIT, id add them in another devlog) The main conversion flow is: pub fn convert_hf ( options : ConvertHfOptions ) -> Result < ConvertHfResult > { let config : Value = serde_json :: from_reader ( File :: open ( options .hf_dir .join ( \"config.json\" )) ? ) ? ; let safetensor_paths = collect_safetensors ( & options .hf_dir ) ? ; let tensors = collect_tensors ( & safetensor_paths ) ? ; let layers = required_u32 ( & config , \"num_hidden_layers\" ) ? ; let model = build_model_spec ( & config , layers , & tensors , & options , & mut warnings ) ? ; let pages = build_pages ( & tensors , & config ) ? ; let execution_tape = build_execution_tape ( layers , & tensors , & mut warnings ) ? ; let manifest = Manifest { format : FORMAT_NAME .to_string (), version : FORMAT_VERSION , model , execution_tape , pages , memory_plan : build_memory_plan ( & config , & tensors ), }; write_archive_pages ( & options .out_path , & manifest , & archive_pages ) ? ; let archive = Archive :: open ( & options .out_path ) ? ; verify_archive ( & archive ) ? ; Ok ( ConvertHfResult { archive , warnings }) } The converter memory-maps each SafeTensors file read-only: let mmap = unsafe { Mmap :: map ( & file ) ? }; let safetensors = SafeTensors :: deserialize ( & mmap ) ? ; let base = mmap .as_ptr () as usize ; Then every tensor becomes a page candidate. The converter records where the tensor bytes live inside the mapped file: let data = tensor .data (); let offset = ( data .as_ptr () as usize ) .checked_sub ( base ) ? ; and stores: struct TensorPage { id : String , path : PathBuf , offset : u64 , size : u64 , checksum : [ u8 ; 32 ], dtype : String , shape : Vec < u64 > , } This avoids rebuilding every tensor in memory. The archive can later copy the original byte range directly: ArchivePageSource :: FileRange { path : tensor .path .clone (), offset : tensor .offset , } After collecting raw tensor data, the converter builds the model spec. It extracts or infers things like hidden size, layer count, attention heads, KV heads, head dimension, RoPE settings, vocab size, activation type, quantization config, and required runtime operators. One important field is attention type: let attention_kind = if kv_heads == heads { \"mha\" } else if kv_heads == 1 { \"mqa\" } else { \"gqa\" }; This matters because many modern decoder models use grouped-query attention. If the runtime only sees shapes but does not understand Q heads vs KV heads, causal attention can be wrong while still looking structurally valid. The converter also records required operators: let mut required_operators = vec! [ \"embedding\" .to_string (), \"rms_norm\" .to_string (), \"qkv_projection\" .to_string (), \"rope\" .to_string (), format! ( \"{attention_kind}_attention\" ), \"o_projection\" .to_string (), \"lm_head\" .to_string (), ]; For dense MLPs it adds: gated_activation down_projection For MoE models it records router and expert stages instead. the rest would be explained in another devlog, i hate the char limit (had to re-write like 10 times btw)"}, {"post_id": 20663, "ts": "2026-07-02T10:03:23Z", "hours": 14.5956, "text": "Dev Log #1 — Why ThinTensor Exists SafeTensors is already a very good format for what it was designed to do: store tensors safely. It keeps tensor metadata simple. For normal model distribution, that is enough. The problem starts when the tensor file becomes the runtime boundary. That is enough if another framework already knows the model class and execution graph. But for an inference runtime, especially one focused on single-token decode, those fields are not enough. The runtime needs to know what each tensor means . The .thin Format The first .thin archive is intentionally simple: .thin = fixed header + JSON manifest + page table + raw page data The Rust implementation defines the archive identity and header size directly: pub const MAGIC: &[u8; 8] = b\"THINv0\\0\\0\"; pub const HEADER_LEN: u32 = 88; The header stores the physical structure of the archive: pub struct Header { pub header_len: u32, pub version: u32, pub manifest_off: u64, pub manifest_len: u64, pub page_table_off: u64, pub page_count: u64, pub data_off: u64, pub archive_hash: [u8; 32], } This lets the loader open the file without guessing. It reads the header, jumps to the manifest, then reads the page table, then maps the raw page data. The manifest is JSON because the early format needed to stay inspectable. It contains the model-level information needed to reconstruct decode: architecture hidden size number of layers attention heads KV heads head dimension vocabulary size RoPE settings tensor names tensor shapes tensor dtypes tensor roles quantization metadata runtime/backend hints validation metadata The page table connects the manifest to real bytes inside the archive: pub struct PageTableRecord { pub page_id: String, pub offset: u64, pub stored_size: u64, pub raw_size: u64, pub flags: u32, pub checksum: [u8; 32], } A page record gives the runtime a verified byte range, not just a tensor name. This matters because pages can later be scheduled, streamed, cached, kept on CPU, moved to GPU, or assigned different execution policies. Packing and Verification The packer does not blindly write files into an archive. It validates the manifest first: let report = validate_manifest(&manifest); if !report.is_ok() { bail!(\"manifest invalid:\\n{}\", report.errors.join(\"\\n\")); } Then every page declared in the manifest must exist and match its declared size: if bytes.len() as u64 != page.size { bail!(\"page declared size does not match file size\"); } It also verifies the page checksum: let checksum = blake3::hash(&bytes); if checksum.as_bytes().as_slice() != expected.as_slice() { bail!(\"page checksum does not match manifest\"); } Only after validation does the writer emit the archive: write_header(&mut file, &header)?; file.write_all(&manifest_bytes)?; for record in &records { write_page_table_record(&mut file, record)?; } for page in pages { write_page_source(&mut file, page)?; } So the final file is structured as: [ header ] [ manifest JSON ] [ page table records ] [ raw page blobs ]"}]...
|
Title: Thintensors by @satvikhardat | Stardance
D Title: Thintensors by @satvikhardat | Stardance
Devlogs:
Dev Log #1 — Why ThinTensor Exists SafeTensors is already a very good format for what it was designed to do: store tensors safely. It keeps tensor metadata simple. For normal model distribution, that is enough. The problem starts when the tensor file becomes the runtime boundary. That is enough if another framework already knows the model class and execution graph. But for an inference runtime, especially one focused on single-token decode, those fields are not enough. The runtime needs to know what each tensor means . The .thin Format The first .thin archive is intentionally simple: .thin = fixed header + JSON manifest + page table + raw page data The Rust implementation defines the archive identity and header size directly: pub const MAGIC: &[u8; 8] = b"THINv0\0\0"; pub const HEADER_LEN: u32 = 88; The header stores the physical structure of the archive: pub struct Header { pub header_len: u32, pub version: u32, pub manifest_off: u64, pub manifest_len: u64, pub page_table_off: u64, pub page_count: u64, pub data_off: u64, pub archive_hash: [u8; 32], } This lets the loader open the file without guessing. It reads the header, jumps to the manifest, then reads the page table, then maps the raw page data. The manifest is JSON because the early format needed to stay inspectable. It contains the model-level information needed to reconstruct decode: architecture hidden size number of layers attention heads KV heads head dimension vocabulary size RoPE settings tensor names tensor shapes tensor dtypes tensor roles quantization metadata runtime/backend hints validation metadata The page table connects the manifest to real bytes inside the archive: pub struct PageTableRecord { pub page_id: String, pub offset: u64, pub stored_size: u64, pub raw_size: u64, pub flags: u32, pub checksum: [u8; 32], } A page record gives the runtime a verified byte range, not just a tensor name. This matters because pages can later be scheduled, streamed, cached, kept on CPU, moved to GPU, or assigned different execution policies. Packing and Verification The packer does not blindly write files into an archive. It validates the manifest first: let report = validate_manifest(&manifest); if !report.is_ok() { bail!("manifest invalid:\n{}", report.errors.join("\n")); } Then every page declared in the manifest must exist and match its declared size: if bytes.len() as u64 != page.size { bail!("page declared size does not match file size"); } It also verifies the page checksum: let checksum = blake3::hash(&bytes); if checksum.as_bytes().as_slice() != expected.as_slice() { bail!("page checksum does not match manifest"); } Only after validation does the writer emit the archive: write_header(&mut file, &header)?; file.write_all(&manifest_bytes)?; for record in &records { write_page_table_record(&mut file, record)?; } for page in pages { write_page_source(&mut file, page)?; } So the final file is structured as: [ header ] [ manifest JSON ] [ page table records ] [ raw page blobs ]
Js got to know that devlogs longer than 10hrs are stripped to 10 😭, i cant have more than 4k char so bear with me theres a LOT to tell that im not able to fit, but ill try my best anyways Dev Log #2 — Converting SafeTensors Into .thin (had to cut so much explaination bcs i HATE THE CHAR LIMIT, id add them in another devlog) The main conversion flow is: pub fn convert_hf ( options : ConvertHfOptions ) -> Result < ConvertHfResult > { let config : Value = serde_json :: from_reader ( File :: open ( options .hf_dir .join ( "config.json" )) ? ) ? ; let safetensor_paths = collect_safetensors ( & options .hf_dir ) ? ; let tensors = collect_tensors ( & safetensor_paths ) ? ; let layers = required_u32 ( & config , "num_hidden_layers" ) ? ; let model = build_model_spec ( & config , layers , & tensors , & options , & mut warnings ) ? ; let pages = build_pages ( & tensors , & config ) ? ; let execution_tape = build_execution_tape ( layers , & tensors , & mut warnings ) ? ; let manifest = Manifest { format : FORMAT_NAME .to_string (), version : FORMAT_VERSION , model , execution_tape , pages , memory_plan : build_memory_plan ( & config , & tensors ), }; write_archive_pages ( & options .out_path , & manifest , & archive_pages ) ? ; let archive = Archive :: open ( & options .out_path ) ? ; verify_archive ( & archive ) ? ; Ok ( ConvertHfResult { archive , warnings }) } The converter memory-maps each SafeTensors file read-only: let mmap = unsafe { Mmap :: map ( & file ) ? }; let safetensors = SafeTensors :: deserialize ( & mmap ) ? ; let base = mmap .as_ptr () as usize ; Then every tensor becomes a page candidate. The converter records where the tensor bytes live inside the mapped file: let data = tensor .data (); let offset = ( data .as_ptr () as usize ) .checked_sub ( base ) ? ; and stores: struct TensorPage { id : String , path : PathBuf , offset : u64 , size : u64 , checksum : [ u8 ; 32 ], dtype : String , shape : Vec < u64 > , } This avoids rebuilding every tensor in memory. The archive can later copy the original byte range directly: ArchivePageSource :: FileRange { path : tensor .path .clone (), offset : tensor .offset , } After collecting raw tensor data, the converter builds the model spec. It extracts or infers things like hidden size, layer count, attention heads, KV heads, head dimension, RoPE settings, vocab size, activation type, quantization config, and required runtime operators. One important field is attention type: let attention_kind = if kv_heads == heads { "mha" } else if kv_heads == 1 { "mqa" } else { "gqa" }; This matters because many modern decoder models use grouped-query attention. If the runtime only sees shapes but does not understand Q heads vs KV heads, causal attention can be wrong while still looking structurally valid. The converter also records required operators: let mut required_operators = vec! [ "embedding" .to_string (), "rms_norm" .to_string (), "qkv_projection" .to_string (), "rope" .to_string (), format! ( "{attention_kind}_attention" ), "o_projection" .to_string (), "lm_head" .to_string (), ]; For dense MLPs it adds: gated_activation down_projection For MoE models it records router and expert stages instead. the rest would be explained in another devlog, i hate the char limit (had to re-write like 10 times btw)
Dev Log #3 — SmolLM3-3B Results SmolLM3-3B was the first real test of ThinTensor as an inference runtime. The baseline was Hugging Face BF16 on my RTX 5050 laptop GPU: HF BF16: ~17.8 tok/s ThinTensor BF16 reached: ThinTensor BF16: ~32–33 tok/s with cosine around 0.999 , meaning the logits stayed extremely close to the original SafeTensors/HF path. That matters because a storage/runtime format should not make the model noticeably worse. Then came the quality FP8 profile: ThinTensor quality FP8: ~46–48 tok/s This was not “quantize everything.” The profile was selective: gate/up projections: FP8 middle down projections: FP8 attention path: BF16 O-proj: BF16 LM head: BF16 KV cache: BF16 ThinTensor can do this because the .thin manifest and execution tape know tensor roles: Q, K, V, O, gate, up, down, norm, embedding, LM head, etc. The runtime can then lower precision only where the model tolerates it, while keeping sensitive paths in BF16. The kernel side reflects this. Attention uses single-token GQA and maps each query head to the right KV head: head = tl . program_id ( 0 ) kv_head = head // ( heads // kv_heads ) scores = tl . sum ( key * q [ None , :], axis = 1 ) * scale The FP8 MLP path uses scaled matvecs: w = tl . load ( weight + offs_m [:, None ] * stride_wm + offs_n [ None , :]) xv = tl . load ( x + offs_n ). to ( tl . float32 ) scale = tl . load ( scales + offs_m ). to ( tl . float32 ) acc = tl . sum ( w * xv [ None , :], axis = 1 ) * scale In one full-vocab centered-logit comparison: GGUF Q8_0 min cosine: 0.952666 ThinTensor BF16 min cosine: 0.999596 ThinTensor quality FP8 min cosine: 0.995366 So ThinTensor quality FP8 stayed much closer to BF16 than the measured Q8 path, while staying in the same speed class. Final speed table: HF BF16: ~17.8 tok/s ThinTensor BF16: ~32–33 tok/s ThinTensor quality FP8: ~46–48 tok/s Ollama / GGUF Q8_0: ~44.1 tok/s Headline: ThinTensor BF16 was ~1.8x faster than HF BF16. ThinTensor quality FP8 was ~2.6x faster than HF BF16. ThinTensor quality FP8 was faster than the measured Q8 baseline while preserving much better logit fidelity. This is where ThinTensor stopped being just an archive experiment and started looking like a real inference runtime :D
Initial benchmarks based on some testing on a 3B model Why response similarity? Because we are making a storage format not “just” a runtime, so we need to ensure the model we are optimizing using thintensor runtime it HAS to be replying with the same responses like the original model! So with casual Kv implemented these are the benchmarks i gathered, if you wanna learn what quality fp8 is read my last devlog :D PS- the vram usage on our ThinTensor quality FP8 is just 500 mb more than the q8 even though there is a HUGE difference in the response similarity
Just hit 91tk/s with “cosine_similarity”: 0.9994624257087708 its actually crazy its like 5x faster the hf full devlog comming soon! ITS LIKE 0.054% away from perfect!!! The selective MXFP4 gate/up profile reached ~96 tok/s while preserving top-1 on the tested SmolLM3-3B through my thintensor runtimeeeee Full DevLogs gonna be crazy
Dev Log #4 — 91–96 tok/s with Selective MXFP4 This was the first ThinTensor run that felt genuinely fast. On SmolLM3-3B, the selective MXFP4 gate/up profile reached around: ~91–96 tok/s and on the strong tested record it still preserved: cosine_similarity: 0.9994624257087708 top1_same: true top5_overlap: 0.8 generated_token_match_rate: 0.875 KV retention: full BF16 That cosine is extremely close to the HF BF16 reference: 1.0 - 0.9994624257087708 = 0.0005375742912292 So the run was only about 0.054% away from perfect cosine on that tested checkpoint. Why this was not just normal quantization The profile was selective: MXFP4 gate/up layers: 0:24 MXFP4 row postscale: enabled LM head: FP8 guarded path KV cache: full BF16 attention path: causal KV QKV/O/down: not blindly pushed into MXFP4 A full MXFP4 sweep over QKV, O, down, and gate/up was fast, but it destroyed the logits. That proved the obvious thing: fewer bytes alone is not enough. ThinTensor’s win comes from being role-aware. The runtime knows what each tensor does: Q / K / V O projection gate projection up projection down projection norm embedding LM head KV cache That means the runtime can apply aggressive precision only to the parts that tolerate it. For this result, the safe target was the MLP gate/up path. Why gate/up was the right target Single-token decoding is mostly a weight-read problem. Tthe goal became: reduce gate/up bytes keep attention stable keep KV exact keep LM head guarded preserve token ranking That is exactly what the selective MXFP4 profile does. It uses MXFP4 on the gate/up projections for layers 0:24 , but it does not blindly lower every sensitive path. Where Blackwell helps The test GPU is an RTX 5050 laptop GPU, which is Blackwell. That matters because Blackwell has native low-precision paths for FP4/MXFP4-style execution. ThinTensor uses this through Triton kernels that treat MXFP4 as an execution format, not just a smaller storage format. The idea is: store/read fewer bytes use block scales multiply against BF16 activations accumulate safely then apply row postscale The goal is to make each token cheaper to decode while keeping the output distribution close to HF BF16. The code side The relevant code is built around these ideas: 1. Honest quantization descriptors The QuantizationDescriptor describes the source format: method storage_dtype bits group_size scale_dtype zero_point modules_to_not_convert source_config For example: INT4 != FP4 Q8 != FP8 MXFP4 != generic Q4 The precision_ladder() function makes that explicit. It lists safe choices, opt-in choices, and lossy choices. So instead of silently lowering precision, the runtime can say: preserve native format fallback to BF16 or require explicit validation before requantization 2. Execution planning plan_quantization() decides what should happen at runtime. It can choose: preserve source storage use native kernel dequantize to BF16 or reject unsupported requantization The important flag is this: exact_storage_preserved If this is true, the runtime is using the source encoding directly. Whats next I would have to implement all mainstream model archs manually because all are diff, and like right now you can see, there are a lot of models that are heavily un-optimized Also im messaging stardance team on slack these devlogs too smol for me
Finished benchmarking a few more models Hitting really really good tk/s when compared to hf that even fails to load the models on my 8gb vram, so its a HUGE improvement for gpu poor ppl like me 😭 Reason a lot less improvement for many models is that, each model has a different structure and i havent been able to make a generalized algorithm that would work for all, so for now, we are working with just a simple implementation Benchmark Methodology and Metrics Calculation To ensure accurate, robust, and reproducible results, the benchmarking and correctness scoring flow is executed as follows: 1. Benchmark Execution Workflow Benchmarks are run in isolated, dedicated Python processes for each engine (ThinTensor vs. Hugging Face Transformers) to prevent memory leakage or process interference: ThinTensor Baseline : The model is loaded via the thin_runtime.py engine. Weight Fit Planning : The runtime runs _automatic_fit_plan to estimate weight size. If the model’s weights do not fit within the available GPU VRAM (accounting for system/display manager overhead), it dynamically configures streaming weight residency ( --weight-residency stream ) and streams layers/experts block-by-block from CPU/RAM to the GPU. If the weights fit, it uses fully resident weights ( --weight-residency all ). Timing : Prefills the prompt (default “Hello”), decodes a number of warmup tokens (default 10) to initialize caches and compile/warm up Triton kernels, and then times the next decode steps (default 200) using wall-clock time ( time.perf_counter() ). Transformers (Hugging Face) Baseline : The model is loaded via a dedicated script bench_hf_transformers_decode.py in BF16 precision. RAM/CPU Offloading : For larger models (e.g. Gemma-4-E2B, OLMoE), loading the model fully on memory-constrained GPUs (like the RTX 5050 Laptop GPU with 7.57 GiB VRAM) causes CUDA OOM. To prevent OOM, RAM offloading is enabled via device_map="auto" . Weights that exceed VRAM capacity are kept in CPU system RAM and loaded/swapped as needed. Timing : Like ThinTensor, it pre-runs a prompt prefill, decodes warmup tokens (default 10), and then times steps (default 200) decode steps. The decode loop avoids GPU-to-CPU synchronization (e.g. calling .item() inside the timed loop) to measure pure GPU decoding speed. 2. Metrics & Scores Calculation Thin/HF Peak GiB (Peak GPU Memory) : Tracks peak allocated VRAM in GiB using torch.cuda.max_memory_allocated() . This measures active tensors allocated by PyTorch’s allocator during the decode phase (excluding unallocated cache reserve or general display server memory). Min Cosine (Cosine Similarity) : In compare_hf_thin_logits.py , the logits of the final linear projection layer are collected for both models. Cosine similarity is calculated for the target token index at each step. The minimum cosine similarity found across all decode steps (e.g., step 1 and step 10) and prefill lengths (e.g., 1 and 128) is reported. Top-1 Match : A boolean check indicating whether the token ID with the highest probability (highest logit value) is identical between ThinTensor and HF at all decode steps. Top-5 Set : A boolean check indicating whether the set of top-5 highest-probability token IDs is identical between the two models at all steps (ignoring their internal sorted order). Top-5 Order : A boolean check indicating whether the exact sorted order of the top-5 token IDs matches between ThinTensor and HF at all steps. KV Retention : Specifies the KV cache precision format (e.g. full BF16 ).
Final benchmarks Smaller models have lower cosine because there are like really small like 1B but, some archs are still not fully optimized to run at a good bit faster speed, ik, but i would want to do a ship before working on getting the speed up on those
Posted about this on reddit! https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ Got a lot of feedback, gonna try to work over it over the next few weeks
Devlog: Resolving GPU Memory Corruption & CUDA Assertions on Wide Matvecs 1. The Symptoms When running inference/benchmarks on unquantized models (like Qwen3.5-9B) using the Triton backend on laptop GPUs (e.g., RTX 5050), the runtime encountered two asynchronous CUDA faults: • cudaErrorIllegalAddress (Illegal memory access) during cache eviction. • device-side assert triggered ( indexSelectSmallIndex assertion failed) during embedding vocabulary lookups. 2. The Root Cause (Resource Starvation & Memory Corruption) Wide Layer Geometries: In Qwen3.5, the projection matrices (Query, Key, Value) have a columns dimension of cols = 3584 . Triton Padded Tiling: Triton pads non-power-of-two shapes to the next power of two ( BLOCK_N = 4096 ). Static Tile Size: The default Triton config mapping uses BLOCK_M = 64 for wide matrices. This instructs Triton to compile a kernel loading a massive static tile size of 64 × 4096 = 262,144 elements. Register & Shared Memory Overflow: In FP32 accumulation, this tile requires 1 MB of memory per thread block. However, laptop GPU streaming multiprocessors (SMs) have a physical hardware limit of 96KB–100KB of shared memory/register files. The Failure Cascade: The compiler failed to allocate resources cleanly, resulting in severe register spills and memory read violations. Triton silently returned corrupted/NaN outputs. The subsequent argmax logit lookup generated a garbage token index (out of bounds), which triggered the PyTorch device-side assertion on the next step. 3. The Fix (Dynamic Chunked Looping) To prevent resource starvation, we modified Triton’s launching configuration in triton_kernels.py: Wide Column Routing: Added a check to detect if cols > 2048 . Looped Execution: Instead of loading the entire 4096 columns block statically, we force the kernel to execute _matvec_looped_kernel using a chunk size of BLOCK_N = 512 . Memory Optimization: The kernel loops through the columns sequentially in chunks of 512. This drops the tile size memory requirement per block to under 64 KB, which safely fits inside any laptop GPU’s physical SM limits. 4. Results I am currently running the final profiles ( max-performance and max-max-perf ). Let me check on the status!
Worked over a LOT of stuff, like doing apples to apples comparisions of models such as LLama 11b vision instruct, So over time I fixed a lot of stuff added a new profile, that quants and quants and quants all layers till the model fits your VRAM, it doesnt care if the model is 20gb in weigths and you have a 8gb vram, it will quant and make it fit So testing this autofit profile on LLama 11b vision instruct, heres what i found it hit a cosine of 0.939758 and around 24tk/s on a 200 token test Similarly i tested ollama Llama 11b vision instruct with q4_k_m quant, it got a cosine close to 0.720495 i would say it would be more closer to 0.8 because this cosine was for only top 20 logprobes that ollama exposes This was done on 8gb vram rtx 5050 laptop 32gb ddr 5 ryzen 7 250 arch linux and the comparision is apples to apples because the thinruntime also quanted the model aggressively
ThinRuntime GPT-OSS-20B now achieves: 50.3445 tok/s median across three explicit 200-token runs. llama.cpp b9964 Q4_K_M: 40.3631 tok/s mean. ThinRuntime is 24.73% faster. Exact embedding and LM head; Q1/Q2 applies only to experts. Zero expert transfers during decode. Top-1 unchanged through step 4. Cosine: 0.987376 step 1, 0.983299 step 4. Accepted one-step configuration: 0.991415 cosine. llama.cpp Q4_K_M source-relative cosine: 0.792350.
This devlog retains the apples-to-apples GPT-OSS control plus fresh Qwen3.5-9B, Llama 3.2 11B text-path, OpenReasoning-Nemotron-14B, and Phi-4 A LOT of optimizations were done to achive this results and 100s of benchmarks in different profiles and stuff, to get to this final table
Final devlog: I would be moving from this project to other cool stuff i have in mind, the final benchmarks i got and everything, is pushed, had to do a lot of improvements to get bigger models running just as good as small ones I know there can be a lot of other optmizations, but maybe a few months later ill come back to this, but for now, its gonna stay as is.
Devlog-idk atp Well i said that i would stop working on this project last devlog, butttt, i just saw this https://github.com/random-unknown-username/Thintensor/issues/1 Someone tried thintensor on a 128gb unified ram DGX spark, ANDDDDD now i wanna make it good enough like so its a finished thing
Implemented a huge list of fixes Lazy page-ID tensor resolution after quantization Storage-alias-aware VRAM accounting Correct affine INT4 partial-group quantization KV sequence continuity checks Free-page geometry invalidation Canonical LM-head bias and final-softcap handling Certified shortlist logic with exact fallback Gemma-style attention scaling/softcap fixes Removal of hot-path CUDA scalar tensor allocations Device normalization for “cuda”, “cuda:N”, and torch.device Profile separation has been reconnected and different profiles select different kernels. Paged KV storage exists through SlabbedKVCache. A prior paged-attention slowdown was caused by GPU synchronization from .item() calls in SlabbedKVCache.append(), not by paged addressing itself. Logical page ownership is now tracked CPU-side to avoid those synchronizations. Paged attention has measured approximately: Materialized: 55.1 tok/s Paged: 57.5 tok/s on a relevant smaller models
What I’ve Done: Fixed KV Cache Indexing in Graph Mode: The previous cudaErrorStreamCaptureUnsupported error and out-of-bounds access were caused by assigning python integers dynamically during capture, and failing to respect block sizing. I modified the KV cache’s _in_graph_mode behavior to compute the tensor-based slot offset dynamically ((slot % block_size).view(1)) directly inside the graph capture. This worked successfully and fully restored the model’s coherent output without breaking graph logic. Experimented with MLP Block Sizing: I attempted to increase block_m and num_warps in the 1-bit Triton kernel (mxfp_lowbit_selected_swiglu) to reduce redundant memory loads of the intermediate x tensor. Unfortunately, register limits and memory layout meant it actually resulted in worse throughput, so I reverted those changes. Experimented with Attention Loop Early Exit: The single_token_gqa_attention_kernel is statically unrolled up to token_bucket (256). I tried adding a dynamic while loop to break early for short context sizes, but Triton’s compiler handles static for loops much better. reached around 65tk/s on gpt-oss-20b, constantly improvising MoE performance, next ima lock in for dense models but for now on MoE
what I did to fix the numerical drift & get some speedups: The Root Cause of the Drift (The Cosine Fix): I discovered that in triton_kernels.py , the tl.dot_scaled call inside _mxfp_lowbit_selected_tensorcore_matvec_kernel (and the mxfp4 variant) had fast_math=True . The fast_math option drops critical precision bits during accumulator addition which was causing the MoE kernels to completely obliterate the trajectory. I disabled it globally using fast_math=False , and this instantly restored our cosine similarity to a perfect 1.000000 over the entire benchmark trajectory. The VRAM Bottleneck: When relying purely on MXFP4 experts, they required over 9.5 GB, breaking the 6.6 GiB budget and forcing the runtime to stream them via PCIe (which tanks performance down to ~5-10tok/s). The Q2 and Q1 low-bit expert decoding kernels actually achieve identical numerical accuracy to the baseline while aggressively packing the weights. The 97.87 tok/s Optimization: I configured bench.py and check_baseline_cosine.py to use: packed_expert_q1_layers="0:24" : All 24 layers of MoE experts are now tightly packed into 1-bit Q1 structures, shrinking the expert memory footprint down to just 2.38 GB (from 9.52 GB). dense_int4_layers="all" : Shrunk the non-expert dense projection weights (Q, K, V, O) into INT4, dropping their footprint from ~1.1 GB to ~0.27 GB. Since the entire model now takes 5.29 GiB (fitting entirely within the 6.6 GiB budget), all layers are pinned directly to VRAM. Because zero layers are streamed (any_streamed=False), the runtime successfully builds the fully fused cuda_graphs execution path, accelerating generation from a crawl to 97.87 tok/s ON gpt-oss-20b. I believe ill be moving to dense models just about now All these issues took SOOO many tests to find
I ammmm tierdd i tried a billionn things over the last 8 hours i just cant seem to understand why gemma4 doesnt want to workkkkk I dont have much to write in this devlog, other than, i am not gonna implement gemma arch for now
ThinTensor Improvements Universal semantic-IR runtime for mixed attention, dense and MoE architectures. Per-tensor precision, kernel and residency planning instead of layer-wide quantization. Production FP8, INT4, MXFP4, Q2 and Q1 quantizers with calibration-aware scoring. Hard ≥0.995 cosine certification with exact routing, greedy-token and KV checks. Qwen3.5 hybrid linear-attention, shared-expert and packed rank-3 MoE support. Durable grouped-INT4 expert sidecars with bounded-RAM, mmap-based construction. Fixed four-matrix Triton projection, cuda / cuda:0 , layer-zero and converter-role bugs. Improved fused kernels, KV caching, expert routing and decode hot paths. Strict cache identity across model, tokenizer, GPU, CUDA, kernels and calibration. Remaining goal: prove ≥30 tok/s on Qwen3.5-35B-A3B at certified ≥0.995 cosine. Getting way better speed on 27B dense models at a cosine that is also way better
Hitting 100hrs and final ship Didnt get time to work on this idea, since quite the while. And it has js about reached the state i can probably get it to MoE arch works, dense models work, cpu/gpu streaming works well, context/kv cache is also dynamically quanted lm_head quants are also there now The motivation really died out because of this project not getting reviewed its been over a month, leaving this as is, tho its not perfect, but it js about has enough features that i wanted Here are the final results after a ton of benchmarking- Phi-4: ThinTensor 28.21 tok/s vs llama.cpp 17.50 tok/s — 1.61× faster (+61.2%). Quality: 0.999949 cosine vs 0.997281. OpenReasoning-Nemotron-14B: ThinTensor 23.79 tok/s vs llama.cpp 19.79 tok/s — 1.20× faster (+20.2%). Quality: 0.999533 vs 0.967140. Llama 3.2 11B: ThinTensor 41.02 tok/s vs llama.cpp 39.82 tok/s — 1.03× faster (+3.0%). Quality: 0.995095 vs 0.991938. Qwen3.5-9B: ThinTensor 43.28 tok/s vs llama.cpp 42.83 tok/s — 1.01× faster (+1.1%). Quality: 0.973334 vs 0.894908. GPT-OSS-20B: ThinTensor 50.34 tok/s vs llama.cpp 40.36 tok/s — 1.25× faster (+24.7%). Quality: 0.983299 vs 0.792350. *all are apples to apples btw Overall: ThinTensor beats llama.cpp Q4 throughput on 5/5 tested architectures , with a geometric-mean speedup of approximately 1.203× . Probably gonna take a break, and learn before comming back to this, after the ship-2 on stardance!
Fixed a few Dense path issues, because the MoE path somehow made the dense path completely usable, fixed a few small one line bugs i got to know from the last ship’s reviews, read to for ship 2!!
Ships:
I made ThinTensor, a runtime-aware LLM archive and inference runtime. Instead of only storing tensor bytes, it stores tensor roles, memory pages, quant metadata, and execution hints so the runtime can choose faster kernels and precision paths. The hardest part was keeping speed gains honest with HF correctness checks. So far it reaches up to ~94 tok/s on SmolLM3-3B with full BF16 KV retention and high logit similarity. After being tested on multiple models, you can get a avg 2x performance increase on most LLM archs, all archs are still not implemented, ik but this is workable with qwen, gemma, some MoE models, and SmolLM and a most others, but it wont be as optimized for all the model types Follow the guide at https://github.com/random-unknown-username/Thintensor#fast-path-setting-up-on-a-new-laptop To install thintensor runtime and use this guide to get a sample qwen model up and running https://github.com/random-unknown-username/Thintensor#quickstart-downloading--running-a-sample-model-qwen-08b
Its a runtime-aware LLM archive format built for fast, efficient inference, This ship basically integrates MoE model paths, that allows you to run models like gpt-oss-20B on speeds and quality faster and better than llama.cpp!! (at q4) its not just the storage format that allows for the improvements, its a combination of different selective layers being quantized with the better storage format, allowing to run inference with higher speed and quality than just simple q8,q4 etc quants. the storage format only gain is only like 10%, but combined with middle out fp8 quants, and even int4 for some performance profiles, it can reach better speeds than the other ways to run inference This does not beat TRT / TRT LM, it does allow for quicker inference, and a more portable solution because for TRT you need to compile the plan (one time) for a few mins before being able to run the model, and it has to be compiled on every machine you run the model on, thintensor allows you to directly have the .thin file and run it on any machine with similar results! and it takes just a few seconds compared to about 30 mins on trt and trt lm reddit post for this project- https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ independent tester’s view- https://github.com/random-unknown-username/Thintensor/issues/1 Let me know if u find any issues, tried a lot of other models here too, as u can see in the graphs :D let me know of any bugs on slack...
|
1792878673.5936122
|
1793742673.5936122
|