|
6600
|
slnap-bot by @JSnap | Stardance
|
JSnap
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-25T19:51:23Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "successfully made the “slnap-bot” (mix of slack and snap… get it? get it???) it can get a cat gif (/slnapbot-gifcat) it can get a cat pic(/slnapbot-catpic) and you can ping it (/slnapbot-ping) it uses catas (cat as a service) for the pics.", "repo": "https://github.com/JSnapXYZ/slnap-bot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0AS9G1FLAV"}]...
|
[{"post_id": 73723, "ts": "202 [{"post_id": 73723, "ts": "2026-09-25T19:46:54Z", "hours": 1.7225, "text": "successfully made the “slnap-bot” (mix of slack and snap… get it? get it???) it can get a cat gif (/slnapbot-gifcat) it can get a cat pic(/slnapbot-catpic) and you can ping it (/slnapbot-ping) it uses catas (cat as a service) for the pics."}]...
|
Title: slnap-bot by @JSnap | Stardance
Devlogs:
s Title: slnap-bot by @JSnap | Stardance
Devlogs:
successfully made the “slnap-bot” (mix of slack and snap… get it? get it???) it can get a cat gif (/slnapbot-gifcat) it can get a cat pic(/slnapbot-catpic) and you can ping it (/slnapbot-ping) it uses catas (cat as a service) for the pics.
Ships:
successfully made the “slnap-bot” (mix of slack and snap… get it? get it???) it can get a cat gif (/slnapbot-gifcat) it can get a cat pic(/slnapbot-catpic) and you can ping it (/slnapbot-ping) it uses catas (cat as a service) for the pics....
|
1793004798.7307167
|
1793091198.7307167
|
|
6601
|
First Time Creating A Slack Bot by @franco | Stard First Time Creating A Slack Bot by @franco | Stardance...
|
franco
|
1
|
0.31
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-04T15:12:18Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a simple slack bot with some basic commands /dsb-ping - Check bot latency /dsb-help - List all available commands /dsb-catfact - Get a random cat fact /dsb-joke - Get a random joke thought it was going to be easier like creating a discord bot so yeah it works mostly", "repo": "https://github.com/Franco-Senes/Stardance-Slackbot", "demo": "https://hackclub.enterprise.slack.com/archives/C0B92B08KC6"}]...
|
[{"post_id": 3792, "ts": "2026 [{"post_id": 3792, "ts": "2026-06-06T20:54:19Z", "hours": 0.3122, "text": "Updated the read me!"}, {"post_id": 2157, "ts": "2026-06-04T14:29:25Z", "hours": 0.3539, "text": "Coding the bot was the easy part but configurtating was hell."}]...
|
Title: First Time Creating A Slack Bot by @franco Title: First Time Creating A Slack Bot by @franco | Stardance
Devlogs:
Coding the bot was the easy part but configurtating was hell.
Updated the read me!
Ships:
I made a simple slack bot with some basic commands /dsb-ping - Check bot latency /dsb-help - List all available commands /dsb-catfact - Get a random cat fact /dsb-joke - Get a random joke thought it was going to be easier like creating a discord bot so yeah it works mostly...
|
1792979365.8477473
|
1793065765.8477473
|
|
6604
|
My awesome macropad! by @Arche | Stardance
|
Arche
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-25T21:25:16Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a 3x3 macropad which i can use to make my daily life easier and specially as a graphic designer make a few tasks whihc would otherwise take me multiple clicks so do, to now only a single button. As for my first project i was certain to use AI but i used much less than i expected and only when i ran into genuine issues like on how to set up the firmware software and other miniscule stuff. I am pretty proud of what i made, though i feel i could have made a better case as the display is kind of off center. Anyways glad to have taken part in making my first hardware project through this.", "repo": "https://github.com/Arche09/Macropad-Hackclub-", "demo": ""}]...
|
[{"post_id": 15911, "ts": "202 [{"post_id": 15911, "ts": "2026-06-25T21:18:05Z", "hours": 0.2836, "text": "Finally Finished the macropad, with all the code along wwith final touchups and my own custom twists."}, {"post_id": 11485, "ts": "2026-06-18T19:21:18Z", "hours": 1.1214, "text": "Well i had to remake the whole case because i started having problems with the dimensions and wasnt happy with it either. Though i wouldve liked my oled display to be centred i really am done with making the case again so i might leave it like this since after all this is my first project i cant expect it to be perfect."}, {"post_id": 7022, "ts": "2026-06-11T19:38:28Z", "hours": 0.5228, "text": "Devlog #2 - Connected all teh components, changed a few of them and now moving on to make the case for the pcb"}, {"post_id": 5216, "ts": "2026-06-08T22:30:03Z", "hours": 0.9681, "text": "I updated the hackpad to customise it for myself!"}]...
|
Title: My awesome macropad! by @Arche | Stardance
Title: My awesome macropad! by @Arche | Stardance
Devlogs:
I updated the hackpad to customise it for myself!
Devlog #2 - Connected all teh components, changed a few of them and now moving on to make the case for the pcb
Well i had to remake the whole case because i started having problems with the dimensions and wasnt happy with it either. Though i wouldve liked my oled display to be centred i really am done with making the case again so i might leave it like this since after all this is my first project i cant expect it to be perfect.
Finally Finished the macropad, with all the code along wwith final touchups and my own custom twists.
Ships:
I made a 3x3 macropad which i can use to make my daily life easier and specially as a graphic designer make a few tasks whihc would otherwise take me multiple clicks so do, to now only a single button. As for my first project i was certain to use AI but i used much less than i expected and only when i ran into genuine issues like on how to set up the firmware software and other miniscule stuff. I am pretty proud of what i made, though i feel i could have made a better case as the display is kind of off center. Anyways glad to have taken part in making my first hardware project through this....
|
1792993939.0200853
|
1793080339.0200853
|
|
6643
|
password generator by @sailor_lucas | Stardance
|
sailor_lucas
|
1
|
3.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-09T20:10:38Z", "hours": 3.0, "multiplier": 1.01, "payout": 3, "blessing": "neutral", "text": "i made a password generator to check and generate passwords", "repo": "https://github.com/lucasvaneijk/password-generator", "demo": "https://password-generator-checker-demo.netlify.app/"}]...
|
[{"post_id": 2697, "ts": "2026 [{"post_id": 2697, "ts": "2026-06-05T12:10:31Z", "hours": 2.6242, "text": "i made a simpel gui and some simpel code to work on i also added the directory"}]...
|
Title: password generator by @sailor_lucas | Stard Title: password generator by @sailor_lucas | Stardance
Devlogs:
i made a simpel gui and some simpel code to work on i also added the directory
Ships:
i made a password generator to check and generate passwords...
|
1792997534.8129563
|
1793083934.8129563
|
|
6647
|
Burden Index by @LumiLovesYou | Stardance
|
LumiLovesYou
|
1
|
11.0
|
12
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T18:51:04Z", "hours": 11.0, "multiplier": 1.07, "payout": 12, "blessing": "neutral", "text": "First ship! ~ 100% functionality, just not pretty looks. I wanted to get some feedback and see what people think of the app first to then improve those parts before focusing on how it appears.", "repo": "https://github.com/lumilovesyou/Burden-Index", "demo": "https://lumilovesyou.github.io/Burden-Index/"}]...
|
[{"post_id": 29663, "ts": "202 [{"post_id": 29663, "ts": "2026-07-16T18:48:12Z", "hours": 1.6219, "text": "Functionality should be finished! ~ Sub list items have been fixed as well as saving has been added for them. Functionality should be complete and now I just need feedback!"}, {"post_id": 21544, "ts": "2026-07-03T15:48:53Z", "hours": 2.7506, "text": "Lots of time, little improvements. ~ Unfocused typing now focuses on the text box, you can tab around to check/edit items, as well as I attempted to add proper sub items. It did not work."}, {"post_id": 7025, "ts": "2026-06-11T19:41:42Z", "hours": 1.5447, "text": "Deleting, saving, AND better buttons! ~ You can (finally) delete tasks from the list! Also, changes to the list will automatically be saved and persist between reloads! I’ve also added better button handling so if you hold your mouse down and drag it off the button before releasing it won’t go through with the action. Almost done with functionality meaning I can start making it look nice!"}, {"post_id": 6901, "ts": "2026-06-11T15:52:29Z", "hours": 2.3167, "text": "Moveable items! ~ I did not realise how much of a pain it was to make moveable list elements, but it’s done! You can now cleanly re-order elements in the list using their handlebars while still being able to do things like double-click to edit them."}, {"post_id": 2463, "ts": "2026-06-04T23:39:31Z", "hours": 1.0403, "text": "You can add new items! Yay! ~ Lots of fiddling with CSS and JS to get things to act correctly but it finally works! (Zero CSS has been put into making it actually look good though..)"}, {"post_id": 1848, "ts": "2026-06-04T01:57:56Z", "hours": 1.4894, "text": "Checkboxes! ~ Yes, this took an hour. Yes, I had to make a custom toggle with JS. Yes, I tried styling a regular input type and couldn’t get it to work. No, I don’t want to talk about it. >:{"}, {"post_id": 1641, "ts": "2026-06-03T19:26:44Z", "hours": 0.4725, "text": "Just started a new project! ~ Nothing fancy, though. It’s a completely-local task management/to-do list. So, pretty generic. I thought it’d make for a good project to practice more advanced HTML metadata and project-structuring."}]...
|
Title: Burden Index by @LumiLovesYou | Stardance
Title: Burden Index by @LumiLovesYou | Stardance
Devlogs:
Just started a new project! ~ Nothing fancy, though. It’s a completely-local task management/to-do list. So, pretty generic. I thought it’d make for a good project to practice more advanced HTML metadata and project-structuring.
Checkboxes! ~ Yes, this took an hour. Yes, I had to make a custom toggle with JS. Yes, I tried styling a regular input type and couldn’t get it to work. No, I don’t want to talk about it. >:{
You can add new items! Yay! ~ Lots of fiddling with CSS and JS to get things to act correctly but it finally works! (Zero CSS has been put into making it actually look good though..)
Moveable items! ~ I did not realise how much of a pain it was to make moveable list elements, but it’s done! You can now cleanly re-order elements in the list using their handlebars while still being able to do things like double-click to edit them.
Deleting, saving, AND better buttons! ~ You can (finally) delete tasks from the list! Also, changes to the list will automatically be saved and persist between reloads! I’ve also added better button handling so if you hold your mouse down and drag it off the button before releasing it won’t go through with the action. Almost done with functionality meaning I can start making it look nice!
Lots of time, little improvements. ~ Unfocused typing now focuses on the text box, you can tab around to check/edit items, as well as I attempted to add proper sub items. It did not work.
Functionality should be finished! ~ Sub list items have been fixed as well as saving has been added for them. Functionality should be complete and now I just need feedback!
Ships:
First ship! ~ 100% functionality, just not pretty looks. I wanted to get some feedback and see what people think of the app first to then improve those parts before focusing on how it appears....
|
1792997723.1566386
|
1793084123.1566386
|
|
6648
|
LUNATIK by @g_jeanvermeille | Stardance
|
g_jeanvermeille
|
1
|
15.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-29T17:06:09Z", "hours": 15.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built LUNATIK, a flight computer for our model rocket (Pico 2, CircuitPython) that fuses a barometer and accelerometer with a Kalman filter to detect apogee, logs to SD and streams LoRa telemetry. The hard part: we had one motor, so it had to work first try. I’m proud it did, calling apogee 0.45 s after the top while the motor’s charge fired 2.5 s later. To test without a rocket: python scripts/dashboard.py –simulate. Only coding hours were logged, not the hardware build.", "repo": "https://github.com/gabriel84-py/fus-e_code", "demo": ""}]...
|
[{"post_id": 75278, "ts": "202 [{"post_id": 75278, "ts": "2026-09-29T16:59:52Z", "hours": 0.4389, "text": "Documention for ship !"}, {"post_id": 75249, "ts": "2026-09-29T15:50:42Z", "hours": 0.3511, "text": "launching with avionics !!!"}, {"post_id": 70671, "ts": "2026-09-19T15:51:12Z", "hours": 11.8942, "text": "Launching LUNATIK (without electronics) and coding its flight computer to launch it in 1 week !!"}, {"post_id": 42061, "ts": "2026-08-06T16:53:48Z", "hours": 1.9433, "text": "Body of the rocket, some elctronics (PCB) and some code for the PCB !"}]...
|
Title: LUNATIK by @g_jeanvermeille | Stardance
De Title: LUNATIK by @g_jeanvermeille | Stardance
Devlogs:
Body of the rocket, some elctronics (PCB) and some code for the PCB !
Launching LUNATIK (without electronics) and coding its flight computer to launch it in 1 week !!
launching with avionics !!!
Documention for ship !
Ships:
I built LUNATIK, a flight computer for our model rocket (Pico 2, CircuitPython) that fuses a barometer and accelerometer with a Kalman filter to detect apogee, logs to SD and streams LoRa telemetry. The hard part: we had one motor, so it had to work first try. I’m proud it did, calling apogee 0.45 s after the top while the motor’s charge fired 2.5 s later. To test without a rocket: python scripts/dashboard.py –simulate. Only coding hours were logged, not the hardware build....
|
1793004446.4104111
|
1793090846.4104111
|
|
6658
|
Slack-ASM by @SeradedStripes | Stardance
|
SeradedStripes
|
1
|
40.0
|
562
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-04T18:50:51Z", "hours": 40.0, "multiplier": 13.9, "payout": 562, "blessing": "neutral", "text": "I made slack-asm! A slack bot written fully in x86_64 Assembly only. ARM support coming in the next ship. With 0.35MB ram usage and a peak of 0.52 CPU %, its a really really lightweight and fast slackbot. (The image below of ram and cpu usage may be slightly off from what I said here) Though it only has a small list of commands, it is very easy to add more to it!", "repo": "https://github.com/SeradedStripes/slack-asm", "demo": "https://hackclub.enterprise.slack.com/archives/C0B8BL6P3T3"}]...
|
[{"post_id": 61692, "ts": "202 [{"post_id": 61692, "ts": "2026-09-04T18:45:55Z", "hours": 0.7156, "text": "Finishing Touches So time to ship Basically finished up by: Doing example env Using a proper deploy workflow Add env reading support via CLI args Nuked docker compose And ofc, a bunch of readme updates"}, {"post_id": 28314, "ts": "2026-07-14T14:21:34Z", "hours": 1.7544, "text": "Updates Did a banner & Logo Add a pung command, it pings a certain user when you use it Added slash commands where the slash cmd msg is deleted instead of kept Fixed help cmd deleting slash cmd msg when it should not be"}, {"post_id": 27913, "ts": "2026-07-13T20:46:30Z", "hours": 1.2239, "text": "Updates Updated docker-compose Added pinging bot as a way to use its commands Auto reconnect ws after slack api decides to end it help cmd responds without threading due to slack api limitations Commands when pinging bot always responds in thread, even help cmd Added a meow cmd"}, {"post_id": 27407, "ts": "2026-07-12T23:16:02Z", "hours": 8.8964, "text": "Updates This Devlog took a while 😭 Anyway on to the changes.. Slack-asm help command Ability to respond in threads Roadmap updates Docker updates Minor help message updates Just check the commit messages 😭 Added Slack bot token handling and HTTP POST functionality Introduced load_bot_token function to extract the bot token from the environment buffer. Implemented slack_send_http_post function for making HTTP POST requests to Slack API with optional authorization. Updated slack_fetch_channel_ts to utilize the new bot token for API calls. Enhanced slash command handlers to send responses using slack_send_http_post . Added support for response URLs in slash command responses. Introduced memmem function for searching byte sequences in memory. Added debug logging for TLS operations to aid in troubleshooting. /slack-asm help now replies in a thread, though its not the correct thread The screeny below is from after i ram /slack-asm help What happened is it deleted the /slack-asm help msg and instead replied in my most recent other message"}, {"post_id": 22123, "ts": "2026-07-04T12:41:43Z", "hours": 2.9303, "text": "Updates We implemented a frick ton of tests sha256 hmac tests prf kdf tests tls record tests tls handshake tests tls connect tests aes cbc tests encrypted record tests x509 tests http tests rsa tests gcm tests"}, {"post_id": 21631, "ts": "2026-07-03T17:50:21Z", "hours": 1.6853, "text": "updates WE GOT WORKING SLASH COMMANDS (See screenshot below) Also fixed an indirect address displacement warning Fixed us not replying to the slack api with proper json Still not deployed Next up Messages that are visible to everyone It replying to certain phrases (maybe)"}, {"post_id": 21458, "ts": "2026-07-03T12:43:00Z", "hours": 5.3064, "text": "Updates FD might kill me We spent 2hrs fixing the first 3 bytes of keystream being wrong for the last block when we were calling the slack api. Implemented a ENV parser Yet another gitignore update Fixed parsing extensions wrong Reached 8.2K LOC"}, {"post_id": 20735, "ts": "2026-07-02T12:52:23Z", "hours": 1.1747, "text": "Updates/Status Report Changes for this devlog TLS alert Handling Updated content length from 32 to 64 bit for >4GB response bodies Status Report We have Full HTTPS working end-to-end This includes but not limited to: Full TLS 1.2 incl handshakes Full HTTP support TLS libraries: SHA-256 HMAC-SHA256 AES-128- CBC & GCM RSA support ECDHE key exchange They are implemented enough for TLS We have Linux syscalls We at 10161 lines of asm, 7.6k LOC, 1.2k Comments & 1.3K blanks What Next? We integrating this bad boy with slack api PS: ignore the bad request part in the image below"}, {"post_id": 19240, "ts": "2026-06-30T14:34:43Z", "hours": 3.335, "text": "Updates Padding fix HTTP versioning parsing implementation Chunked transfer encoding as https is horrible 2 commits i did were just random gitignore updates in between a massive 2k line addition commit Made an abbreviation YAGU or Yet another gitignore update Implemented P-256 elliptic curve primitives for ECDHE Key Exchange AES-128-GCM for TLS1.2 Tests for AES-128-GCM (they were horrible to do, purely because my GCM code was not working TLS code updates for aes128 & ecc Yes i am aware my gcm_tests below give horrible information to help lmao"}, {"post_id": 17549, "ts": "2026-06-28T11:40:19Z", "hours": 1.2286, "text": "Updates TLS Handshake fixes: Added server_ccs field to the tls_ctx struct Initialized server_ccs in tls_init Fixed PKCS#7 padding byte value in tls_send fixed big endian length field encoding in CCS header Removed CCS Peak Probably something I missed RSA Big integer rewrite Added STDERR & increased tls_ctx_buf Commented out test_harness call and added dump_keys stub Updated the Makefile Discovered i messed something up in compiled binary"}, {"post_id": 17004, "ts": "2026-06-27T16:17:17Z", "hours": 0.6667, "text": "Updates DNS resolution in pure assembly Fixed a bug where exit 255 was not in the RSA big_mod code, it was instead in the tls code for whatever reason We at like 5.4K LOC in Assembly now Thats it"}, {"post_id": 15053, "ts": "2026-06-24T13:29:51Z", "hours": 0.7378, "text": "Updates Removed the need of der file in the repo by hardcoding the value of the RSA-2048 test key Implemented Basic HTTP response parsing Began work on a very very basic dns resoultion system"}, {"post_id": 10506, "ts": "2026-06-17T08:05:55Z", "hours": 4.5422, "text": "Updates f952ca5 Added push rdp/ pop rbp to preserve rdp across sha256_transform updates rsa.asm RSA PKCS#1 RSA OAEP encoding Montgomery ladder modular exponentiation Big number helpers tls.asm New exports New externs More constants A bunch of file changes, see the actual commit for all of it test.asm Extend test_harness SHA256, HMAC-SHA256 test vectors KDF intermediate HMAC computation test PRF output comparison against known vector Key derivation: client/server write MAC keys, write keys, IVs Full TLS 1.2 handshake Some more i dont remember about Slack.asm Updated banner, added externs for new functions Cleaned up _start to call main then exit 2 Random commits just updating gitignore imbetween 38dad3c tls.asm Register clobber fix CCS read_seq MAC double-count fix Verify_data mismatch Removed debug writes Disconnect Comment test.asm ServerHello hash offset update PRF target address update Fix MAC length byte-order Seq number update Child ClientHello receive update socket.asm sys_send update Summary Frick me, most of this devlog what trying to fix one single bug. The hardest part of this devlog was fixing the stupid bugs i had."}, {"post_id": 6824, "ts": "2026-06-11T13:29:56Z", "hours": 1.0872, "text": "Updates Agents file and Contributing file X.509 certificate parsing & basic validity checking No longer include .der files (gitignore change) Updated Commenting, ie. made it more clearer and standardized it a bit. Updated Readme & Roadmap Code Now at 4.5k lines of assembly, 3.3k lines are actual code, 701 commenting lines. By the way its 3,300 lines exactly for the asm code lines"}, {"post_id": 5485, "ts": "2026-06-09T09:09:47Z", "hours": 1.6078, "text": "Updates Added AES-128-CBC encryption & decryption Implement pre_master_secret generation The line counts have increased Currently 3.7k lines of asm, (2.8k LOC) AES-128-CBC Notes: Most of my time was spent debugging it Thats it I think Oh Yeah and somehow all tests pass!"}, {"post_id": 3486, "ts": "2026-06-06T13:22:49Z", "hours": 0.8539, "text": "Updates Added Key derivation functions & its tests Added TLS 1.2 PRF implemnentation & its tests Sitting at 1759 lines of asm code now Still a bunch to go"}, {"post_id": 2722, "ts": "2026-06-05T13:40:16Z", "hours": 0.8997, "text": "Updates Stardance went off as I tried to post a devlog (this is redoing it) Added TLS 1.2 handshake & TLS record layer Finished RFC 4231 test cases"}, {"post_id": 2671, "ts": "2026-06-05T10:48:41Z", "hours": 0.85, "text": "Updates My wakatime broke Added SHA256 in pure asm Added hmac_sha256 in pure asm Fixed the sha256 error Comment out object files Readme & Roadmap polishing Update repo structure to now have code in src/"}, {"post_id": 2115, "ts": "2026-06-04T13:20:16Z", "hours": 0.6239, "text": "Updates Im sad from no md support in sd Added a makefile Thin TLS wrapper TLS stubs Test harness Dependabot for gh actions"}, {"post_id": 2081, "ts": "2026-06-04T12:26:21Z", "hours": 0.2942, "text": "Basic project repo setup & Skeleton of the app"}]...
|
Title: Slack-ASM by @SeradedStripes | Stardance
D Title: Slack-ASM by @SeradedStripes | Stardance
Devlogs:
Basic project repo setup & Skeleton of the app
Updates Im sad from no md support in sd Added a makefile Thin TLS wrapper TLS stubs Test harness Dependabot for gh actions
Updates My wakatime broke Added SHA256 in pure asm Added hmac_sha256 in pure asm Fixed the sha256 error Comment out object files Readme & Roadmap polishing Update repo structure to now have code in src/
Updates Stardance went off as I tried to post a devlog (this is redoing it) Added TLS 1.2 handshake & TLS record layer Finished RFC 4231 test cases
Updates Added Key derivation functions & its tests Added TLS 1.2 PRF implemnentation & its tests Sitting at 1759 lines of asm code now Still a bunch to go
Updates Added AES-128-CBC encryption & decryption Implement pre_master_secret generation The line counts have increased Currently 3.7k lines of asm, (2.8k LOC) AES-128-CBC Notes: Most of my time was spent debugging it Thats it I think Oh Yeah and somehow all tests pass!
Updates Agents file and Contributing file X.509 certificate parsing & basic validity checking No longer include .der files (gitignore change) Updated Commenting, ie. made it more clearer and standardized it a bit. Updated Readme & Roadmap Code Now at 4.5k lines of assembly, 3.3k lines are actual code, 701 commenting lines. By the way its 3,300 lines exactly for the asm code lines
Updates f952ca5 Added push rdp/ pop rbp to preserve rdp across sha256_transform updates rsa.asm RSA PKCS#1 RSA OAEP encoding Montgomery ladder modular exponentiation Big number helpers tls.asm New exports New externs More constants A bunch of file changes, see the actual commit for all of it test.asm Extend test_harness SHA256, HMAC-SHA256 test vectors KDF intermediate HMAC computation test PRF output comparison against known vector Key derivation: client/server write MAC keys, write keys, IVs Full TLS 1.2 handshake Some more i dont remember about Slack.asm Updated banner, added externs for new functions Cleaned up _start to call main then exit 2 Random commits just updating gitignore imbetween 38dad3c tls.asm Register clobber fix CCS read_seq MAC double-count fix Verify_data mismatch Removed debug writes Disconnect Comment test.asm ServerHello hash offset update PRF target address update Fix MAC length byte-order Seq number update Child ClientHello receive update socket.asm sys_send update Summary Frick me, most of this devlog what trying to fix one single bug. The hardest part of this devlog was fixing the stupid bugs i had.
Updates Removed the need of der file in the repo by hardcoding the value of the RSA-2048 test key Implemented Basic HTTP response parsing Began work on a very very basic dns resoultion system
Updates DNS resolution in pure assembly Fixed a bug where exit 255 was not in the RSA big_mod code, it was instead in the tls code for whatever reason We at like 5.4K LOC in Assembly now Thats it
Updates TLS Handshake fixes: Added server_ccs field to the tls_ctx struct Initialized server_ccs in tls_init Fixed PKCS#7 padding byte value in tls_send fixed big endian length field encoding in CCS header Removed CCS Peak Probably something I missed RSA Big integer rewrite Added STDERR & increased tls_ctx_buf Commented out test_harness call and added dump_keys stub Updated the Makefile Discovered i messed something up in compiled binary
Updates Padding fix HTTP versioning parsing implementation Chunked transfer encoding as https is horrible 2 commits i did were just random gitignore updates in between a massive 2k line addition commit Made an abbreviation YAGU or Yet another gitignore update Implemented P-256 elliptic curve primitives for ECDHE Key Exchange AES-128-GCM for TLS1.2 Tests for AES-128-GCM (they were horrible to do, purely because my GCM code was not working TLS code updates for aes128 & ecc Yes i am aware my gcm_tests below give horrible information to help lmao
Updates/Status Report Changes for this devlog TLS alert Handling Updated content length from 32 to 64 bit for >4GB response bodies Status Report We have Full HTTPS working end-to-end This includes but not limited to: Full TLS 1.2 incl handshakes Full HTTP support TLS libraries: SHA-256 HMAC-SHA256 AES-128- CBC & GCM RSA support ECDHE key exchange They are implemented enough for TLS We have Linux syscalls We at 10161 lines of asm, 7.6k LOC, 1.2k Comments & 1.3K blanks What Next? We integrating this bad boy with slack api PS: ignore the bad request part in the image below
Updates FD might kill me We spent 2hrs fixing the first 3 bytes of keystream being wrong for the last block when we were calling the slack api. Implemented a ENV parser Yet another gitignore update Fixed parsing extensions wrong Reached 8.2K LOC
updates WE GOT WORKING SLASH COMMANDS (See screenshot below) Also fixed an indirect address displacement warning Fixed us not replying to the slack api with proper json Still not deployed Next up Messages that are visible to everyone It replying to certain phrases (maybe)
Updates We implemented a frick ton of tests sha256 hmac tests prf kdf tests tls record tests tls handshake tests tls connect tests aes cbc tests encrypted record tests x509 tests http tests rsa tests gcm tests
Updates This Devlog took a while 😭 Anyway on to the changes.. Slack-asm help command Ability to respond in threads Roadmap updates Docker updates Minor help message updates Just check the commit messages 😭 Added Slack bot token handling and HTTP POST functionality Introduced load_bot_token function to extract the bot token from the environment buffer. Implemented slack_send_http_post function for making HTTP POST requests to Slack API with optional authorization. Updated slack_fetch_channel_ts to utilize the new bot token for API calls. Enhanced slash command handlers to send responses using slack_send_http_post . Added support for response URLs in slash command responses. Introduced memmem function for searching byte sequences in memory. Added debug logging for TLS operations to aid in troubleshooting. /slack-asm help now replies in a thread, though its not the correct thread The screeny below is from after i ram /slack-asm help What happened is it deleted the /slack-asm help msg and instead replied in my most recent other message
Updates Updated docker-compose Added pinging bot as a way to use its commands Auto reconnect ws after slack api decides to end it help cmd responds without threading due to slack api limitations Commands when pinging bot always responds in thread, even help cmd Added a meow cmd
Updates Did a banner & Logo Add a pung command, it pings a certain user when you use it Added slash commands where the slash cmd msg is deleted instead of kept Fixed help cmd deleting slash cmd msg when it should not be
Finishing Touches So time to ship Basically finished up by: Doing example env Using a proper deploy workflow Add env reading support via CLI args Nuked docker compose And ofc, a bunch of readme updates
Ships:
I made slack-asm! A slack bot written fully in x86_64 Assembly only. ARM support coming in the next ship. With 0.35MB ram usage and a peak of 0.52 CPU %, its a really really lightweight and fast slackbot. (The image below of ram and cpu usage may be slightly off from what I said here) Though it only has a small list of commands, it is very easy to add more to it!...
|
1792997275.0188718
|
1793083675.0188718
|
|
6665
|
Spotify Screen by @Matthew | Stardance
|
Matthew
|
1
|
12.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T03:49:20Z", "hours": 12.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Spotify player for my desk. It is kind of similar to the Spotify Car Thing, but a lot less advanced. I had many UI challenges, because this was my first lvgl project. I also had challenges of refreshing the authentication, it kept returning an HTML 400 error no matter what I did, but I eventually got it fixed. You do have to own an Arduino GIGA R1 and a Display Shield to go with it to test it, but I included a video of what it can do.", "repo": "https://github.com/matthew0112/spotifyScreen", "demo": ""}]...
|
[{"post_id": 9569, "ts": "2026 [{"post_id": 9569, "ts": "2026-06-15T22:53:07Z", "hours": 0.5494, "text": "I added documentation to get ready for shipping"}, {"post_id": 9536, "ts": "2026-06-15T22:15:29Z", "hours": 0.9539, "text": "I added Time Labels, made the progress somewhat smoother, and made it display all of the artists. It has gotten a lot simpler to add things, because It’s just small tweaks to the strong base I already have."}, {"post_id": 9415, "ts": "2026-06-15T19:28:57Z", "hours": 1.1864, "text": "I was able to add the repeat and shuffle buttons to my ui. They change color when active. Now I want to add the little text to say how much time is left"}, {"post_id": 9055, "ts": "2026-06-15T03:40:14Z", "hours": 4.7778, "text": "I got a UI working. I decided the album image was a little bit to complicated for me right now, so I have playback controls, seeking, and the title. I want to add the repeat and shuffle buttons"}, {"post_id": 7875, "ts": "2026-06-13T04:16:50Z", "hours": 1.7183, "text": "I got a basic lvgl ui working, the buttons work, however there is no seeking or getting what song is playing yet"}, {"post_id": 2548, "ts": "2026-06-05T02:52:10Z", "hours": 0.5444, "text": "I got a Connecting UI, when connecting to WiFi. I also rotated the screen to landscape. I’m currently exploring switching to lvgl for improved ui"}, {"post_id": 1890, "ts": "2026-06-04T03:27:08Z", "hours": 1.4294, "text": "I got a basic, temporary UI to test out the on click to pause"}, {"post_id": 1670, "ts": "2026-06-03T20:13:30Z", "hours": 0.3778, "text": "I got the Wifi Working"}]...
|
Title: Spotify Screen by @Matthew | Stardance
Dev Title: Spotify Screen by @Matthew | Stardance
Devlogs:
I got the Wifi Working
I got a basic, temporary UI to test out the on click to pause
I got a Connecting UI, when connecting to WiFi. I also rotated the screen to landscape. I’m currently exploring switching to lvgl for improved ui
I got a basic lvgl ui working, the buttons work, however there is no seeking or getting what song is playing yet
I got a UI working. I decided the album image was a little bit to complicated for me right now, so I have playback controls, seeking, and the title. I want to add the repeat and shuffle buttons
I was able to add the repeat and shuffle buttons to my ui. They change color when active. Now I want to add the little text to say how much time is left
I added Time Labels, made the progress somewhat smoother, and made it display all of the artists. It has gotten a lot simpler to add things, because It’s just small tweaks to the strong base I already have.
I added documentation to get ready for shipping
Ships:
I made a Spotify player for my desk. It is kind of similar to the Spotify Car Thing, but a lot less advanced. I had many UI challenges, because this was my first lvgl project. I also had challenges of refreshing the authentication, it kept returning an HTML 400 error no matter what I did, but I eventually got it fixed. You do have to own an Arduino GIGA R1 and a Display Shield to go with it to test it, but I included a video of what it can do....
|
1792975928.250991
|
1793062328.250991
|
|
6670
|
strandbeest by @euanripper2 | Stardance
|
euanripper2
|
1
|
4.3
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-03T19:40:07Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i lost sleep trying to get the joints right - once i built it exactly mirrored", "repo": "https://github.com/hackclub/beest", "demo": "https://beest.hackclub.com"}]...
|
[{"post_id": 2593, "ts": "2026 [{"post_id": 2593, "ts": "2026-06-05T06:13:04Z", "hours": 0.3031, "text": "After making one leg and running a motion study to verify the joints constrict it to the right path, i can now copy the legs, mirror them and build a frame to hold them together. You can see the strandbeest emerging!"}, {"post_id": 1648, "ts": "2026-06-03T19:36:01Z", "hours": 3.7797, "text": "Making the model"}]...
|
Title: strandbeest by @euanripper2 | Stardance
De Title: strandbeest by @euanripper2 | Stardance
Devlogs:
Making the model
After making one leg and running a motion study to verify the joints constrict it to the right path, i can now copy the legs, mirror them and build a frame to hold them together. You can see the strandbeest emerging!
Ships:
i lost sleep trying to get the joints right - once i built it exactly mirrored...
|
1792990564.526002
|
1793076964.526002
|
|
6677
|
Devaris(My first slackbot yay!!!) by @Maddox | Sta Devaris(My first slackbot yay!!!) by @Maddox | Stardance...
|
Maddox
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-04T10:43:34Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I have made my first slack bot as a stardance mission, this is one of the coolest things I have ever built, I am familiar with coding, but I was not ready for the real world where you make your projects actually functional like running it on a virtual machine so it never stops using git and github that was a challenging part but I definitely learnt something from it, although my project is not really useful in any way but my slack bot is up and running and that’s one thing I am really proud of!", "repo": "https://github.com/Ryan-code-pro/Devaris", "demo": "https://ryan-code-pro.github.io/Devaris/"}]...
|
[{"post_id": 2042, "ts": "2026 [{"post_id": 2042, "ts": "2026-06-04T10:18:01Z", "hours": 1.3589, "text": "I have made the basic slackbot it has 4 slash commands I have hosted it on the nest so that it doesn’t “slack off”…..haha get it. It is not really useful in any sense but it works! I am happy!"}]...
|
Title: Devaris(My first slackbot yay!!!) by @Maddo Title: Devaris(My first slackbot yay!!!) by @Maddox | Stardance
Devlogs:
I have made the basic slackbot it has 4 slash commands I have hosted it on the nest so that it doesn’t “slack off”…..haha get it. It is not really useful in any sense but it works! I am happy!
Ships:
I have made my first slack bot as a stardance mission, this is one of the coolest things I have ever built, I am familiar with coding, but I was not ready for the real world where you make your projects actually functional like running it on a virtual machine so it never stops using git and github that was a challenging part but I definitely learnt something from it, although my project is not really useful in any way but my slack bot is up and running and that’s one thing I am really proud of!...
|
1792976005.054506
|
1793062405.054506
|
|
6696
|
Unhinged delivery simulator by @dandanthepenguin | Unhinged delivery simulator by @dandanthepenguin | Stardance...
|
dandanthepenguin
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-26T00:30:01Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a game in godot. I am really bad at coding, but I like making games, so I used AI for the coding. The remote ip connection is untested, because I don’t have anyone to test it with but I will update it if it doesn’t work.", "repo": "https://github.com/WizardDrake/unhinged-delivery-simulator", "demo": "https://wizarddrake.github.io/unhinged-delivery-simulator/"}]...
|
[{"post_id": 16017, "ts": "202 [{"post_id": 16017, "ts": "2026-06-26T00:18:20Z", "hours": 0.3667, "text": "finished readme.md, added tons of stuff, changed theme."}, {"post_id": 11965, "ts": "2026-06-19T15:08:24Z", "hours": 0.5622, "text": "Npc cars are done. They now drive around perfectly and have no issues."}, {"post_id": 9565, "ts": "2026-06-15T22:47:41Z", "hours": 0.4606, "text": "making some basic features I made some basic features such as delivering packages, picking up packages, and some REALLY dumb npc cars that are really buggy. Things to improve for next update: working npc cars polish multiplayer?"}]...
|
Title: Unhinged delivery simulator by @dandanthepe Title: Unhinged delivery simulator by @dandanthepenguin | Stardance
Devlogs:
making some basic features I made some basic features such as delivering packages, picking up packages, and some REALLY dumb npc cars that are really buggy. Things to improve for next update: working npc cars polish multiplayer?
Npc cars are done. They now drive around perfectly and have no issues.
finished readme.md, added tons of stuff, changed theme.
Ships:
I made a game in godot. I am really bad at coding, but I like making games, so I used AI for the coding. The remote ip connection is untested, because I don’t have anyone to test it with but I will update it if it doesn’t work....
|
1792990563.6317625
|
1793076963.6317625
|
|
6702
|
Input Counter by @plazmaboltz | Stardance
|
plazmaboltz
|
1
|
2.0
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-30T22:51:25Z", "hours": 2.0, "multiplier": 1.28, "payout": 2, "blessing": "neutral", "text": "The input counter! It is a C# application that detects how many inputs you have made since active. It even has a reset button to reset the number back to 0. Pretty simple, but simple is sometimes good.", "repo": "https://github.com/PlazmaBoltz/InputCounter", "demo": "https://github.com/PlazmaBoltz/InputCounter/releases"}]...
|
[{"post_id": 1788, "ts": "2026 [{"post_id": 1788, "ts": "2026-06-04T00:05:52Z", "hours": 0.7844, "text": "The InputCounter is working! it tracks your inputs across all windows and has a little reset button incase you wanna go back to 0."}, {"post_id": 1750, "ts": "2026-06-03T22:48:44Z", "hours": 0.7194, "text": "Woah! I can see how many times I’ve pressed anything!"}]...
|
Title: Input Counter by @plazmaboltz | Stardance
Title: Input Counter by @plazmaboltz | Stardance
Devlogs:
Woah! I can see how many times I’ve pressed anything!
The InputCounter is working! it tracks your inputs across all windows and has a little reset button incase you wanna go back to 0.
Ships:
The input counter! It is a C# application that detects how many inputs you have made since active. It even has a reset button to reset the number back to 0. Pretty simple, but simple is sometimes good....
|
1792983283.5185306
|
1793069683.5185306
|
|
6711
|
College Compass by @amrutha | Stardance
|
amrutha
|
1
|
4.87
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-04T17:53:49Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a platform that includes as much information I could add to help younger students entering high school. College Compass was built to serve and support younger students as navigating through the waters of high school can be difficult. We hope to provide a resource that can help students find the right path for them.", "repo": "https://github.com/Amrutha-2028/college-compass", "demo": "https://college-compass-tan.vercel.app/"}]...
|
[{"post_id": 3242, "ts": "2026 [{"post_id": 3242, "ts": "2026-06-06T02:17:59Z", "hours": 3.8711, "text": "So I just completed adding a buncha content, I filled up the courses page, schedule guide and the app classes guide. Soon, I am going to fill it up with in details about extracurriculars and scholarships! Check it out by clicking on College Compass, there should be a demo url! Add comments about what else I can add, there are soo many things I could have left out"}, {"post_id": 1744, "ts": "2026-06-03T22:36:13Z", "hours": 0.7314, "text": "Took me some time, but I was able to get the main page going! I added some info about what my website does, linked it to the about us, got a maroon theme going and added a hero banner."}, {"post_id": 1710, "ts": "2026-06-03T21:26:34Z", "hours": 0.5742, "text": "Just completed adding the burger menu to the website! Now working on outlining each page."}]...
|
Title: College Compass by @amrutha | Stardance
De Title: College Compass by @amrutha | Stardance
Devlogs:
Just completed adding the burger menu to the website! Now working on outlining each page.
Took me some time, but I was able to get the main page going! I added some info about what my website does, linked it to the about us, got a maroon theme going and added a hero banner.
So I just completed adding a buncha content, I filled up the courses page, schedule guide and the app classes guide. Soon, I am going to fill it up with in details about extracurriculars and scholarships! Check it out by clicking on College Compass, there should be a demo url! Add comments about what else I can add, there are soo many things I could have left out
Ships:
I made a platform that includes as much information I could add to help younger students entering high school. College Compass was built to serve and support younger students as navigating through the waters of high school can be difficult. We hope to provide a resource that can help students find the right path for them....
|
1792982876.7034945
|
1793069276.7034945
|
|
6716
|
MacroByte by @Greg_ios | Stardance
|
Greg_ios
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-24T12:23:20Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A custom 3-key macropad, specifically engineered to streamline a programmer’s workflow. It automates repetitive shortcuts, controls IDE navigation, and executes Git commands at the press of a single button.", "repo": "https://github.com/travletothefurureprogramming/MacroByte", "demo": ""}]...
|
[{"post_id": 2759, "ts": "2026 [{"post_id": 2759, "ts": "2026-06-05T15:27:02Z", "hours": 0.4011, "text": "Design the final case and write the fimware"}, {"post_id": 2273, "ts": "2026-06-04T17:48:35Z", "hours": 2.3297, "text": "Design a new PCB"}, {"post_id": 2030, "ts": "2026-06-04T09:52:15Z", "hours": 0.2869, "text": "I have complete the PCB of MacroByte"}]...
|
Title: MacroByte by @Greg_ios | Stardance
Devlogs Title: MacroByte by @Greg_ios | Stardance
Devlogs:
I have complete the PCB of MacroByte
Design a new PCB
Design the final case and write the fimware
Ships:
A custom 3-key macropad, specifically engineered to streamline a programmer’s workflow. It automates repetitive shortcuts, controls IDE navigation, and executes Git commands at the press of a single button....
|
1792975922.3046775
|
1793062322.3046775
|
|
6717
|
Magic Deck Builder by @Joseph-T | Stardance
|
Joseph-T
|
1
|
13.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-08T01:03:55Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a site for making Magic The Gathering decks What’s Magic The Gathering? Magic the gathering is a card game where players make their own decks What did I make: I made a website that gives basic recommendations on what cards a user should use, based on the rest of their deck. Challenges: I big challenge was hosting the site in the end I had to move all the server side code for suggesting cards to client side so I could host it through GitHub pages How to use: Just start searching for cards to add to your deck, and the system will start to recommend cards. Features: Recommendation Filters & Search Quick Stats", "repo": "https://github.com/joseph-tighe/Magic-Deck-Creator", "demo": "https://joseph-tighe.github.io/Magic-Deck-Creator/"}]...
|
[{"post_id": 42999, "ts": "202 [{"post_id": 42999, "ts": "2026-08-08T00:50:32Z", "hours": 2.2425, "text": "Changes Made I worked on the algorithm for recommending land, and I ported my Express app to Github Pages. I also redid the UI Recommendation algorithm The algorithm just takes the ratio of required land, and compares that to the ratio of the land that is already in the deck and tries to match the two, it just works slightly better than before and accounts for more edge cases Github pages Github pages is fully static, meaning I had to trade out all my server side code for client side stuff, it doesn’t affect the user too much, but limits the app in the long run. But anyway you can actually use it now. Updated UI I just think it looks slightly better, and provides more feedback on the search, and gives slightly more info on the card. As I am sure you can tell front-end is not where I excel, but it is slightly better than before."}, {"post_id": 5087, "ts": "2026-06-08T19:30:28Z", "hours": 1.9144, "text": "Changes Made I just fixed a bunch of bugs before I decide to ship this. Fixed bugs Worked on fixing some basic bugs in the card recommendation, so that I could make it work better with wild Mana on cards, it took me 30 minutes to realize a variable should have had the let keyword instead of the var keyword. But now it works much better and is in a place to where I can start adding slightly more advanced recommendations."}, {"post_id": 4583, "ts": "2026-06-07T22:30:56Z", "hours": 2.2344, "text": "Changes Made Added a simple non-ai based card recommender for land, I also added a simple graph showing the land distribution. Started working on the backend for the AI recomendation. Land recommendations The land recommendations identifies the gap between the mana required and the mana owned, a proportion based system would be better."}, {"post_id": 3003, "ts": "2026-06-05T22:45:22Z", "hours": 1.3428, "text": "Changes Made I wrote a script to get data for training the AI Getting the data The app will use AI to help make recommendations on what cards are good for the app. The script I wrote scrapes the internet for complete decks and saves what cards they have into a JSON that can be used to train the AI later."}, {"post_id": 2952, "ts": "2026-06-05T21:11:13Z", "hours": 1.4106, "text": "Changes Made I added filtering to the search and started on the training for AI card prediction Filtering I added filtering so the user can more easily specify what card they are looking for. AI card prediction I wrote a few test scripts to figure out how I will train my AI to do it."}, {"post_id": 2851, "ts": "2026-06-05T18:11:11Z", "hours": 1.0747, "text": "Changes Made Made search more reliable and added simple loading animation Search The search would sometimes answer the query before the current one instead of the current one because that packet would be late. But that is no longer a problem."}, {"post_id": 2480, "ts": "2026-06-05T00:05:32Z", "hours": 1.2358, "text": "Changes Made Made a basic website and managed to get the search feature working Basic website The website is a really basic layout but should be fine for now. Search Search uses the Magic The Gathering API ( https://api.magicthegathering.io ). It queries every time the search bar changes."}, {"post_id": 1873, "ts": "2026-06-04T02:43:10Z", "hours": 1.5497, "text": "Changes Made I setup the project and started screwing with an API for getting basic information Tech Stack Node JS, Express, js, html, css, the api.magicthegathering.io API"}]...
|
Title: Magic Deck Builder by @Joseph-T | Stardance Title: Magic Deck Builder by @Joseph-T | Stardance
Devlogs:
Changes Made I setup the project and started screwing with an API for getting basic information Tech Stack Node JS, Express, js, html, css, the api.magicthegathering.io API
Changes Made Made a basic website and managed to get the search feature working Basic website The website is a really basic layout but should be fine for now. Search Search uses the Magic The Gathering API ( https://api.magicthegathering.io ). It queries every time the search bar changes.
Changes Made Made search more reliable and added simple loading animation Search The search would sometimes answer the query before the current one instead of the current one because that packet would be late. But that is no longer a problem.
Changes Made I added filtering to the search and started on the training for AI card prediction Filtering I added filtering so the user can more easily specify what card they are looking for. AI card prediction I wrote a few test scripts to figure out how I will train my AI to do it.
Changes Made I wrote a script to get data for training the AI Getting the data The app will use AI to help make recommendations on what cards are good for the app. The script I wrote scrapes the internet for complete decks and saves what cards they have into a JSON that can be used to train the AI later.
Changes Made Added a simple non-ai based card recommender for land, I also added a simple graph showing the land distribution. Started working on the backend for the AI recomendation. Land recommendations The land recommendations identifies the gap between the mana required and the mana owned, a proportion based system would be better.
Changes Made I just fixed a bunch of bugs before I decide to ship this. Fixed bugs Worked on fixing some basic bugs in the card recommendation, so that I could make it work better with wild Mana on cards, it took me 30 minutes to realize a variable should have had the let keyword instead of the var keyword. But now it works much better and is in a place to where I can start adding slightly more advanced recommendations.
Changes Made I worked on the algorithm for recommending land, and I ported my Express app to Github Pages. I also redid the UI Recommendation algorithm The algorithm just takes the ratio of required land, and compares that to the ratio of the land that is already in the deck and tries to match the two, it just works slightly better than before and accounts for more edge cases Github pages Github pages is fully static, meaning I had to trade out all my server side code for client side stuff, it doesn’t affect the user too much, but limits the app in the long run. But anyway you can actually use it now. Updated UI I just think it looks slightly better, and provides more feedback on the search, and gives slightly more info on the card. As I am sure you can tell front-end is not where I excel, but it is slightly better than before.
Ships:
I made a site for making Magic The Gathering decks What’s Magic The Gathering? Magic the gathering is a card game where players make their own decks What did I make: I made a website that gives basic recommendations on what cards a user should use, based on the rest of their deck. Challenges: I big challenge was hosting the site in the end I had to move all the server side code for suggesting cards to client side so I could host it through GitHub pages How to use: Just start searching for cards to add to your deck, and the system will start to recommend cards. Features: Recommendation Filters & Search Quick Stats...
|
1793054960.4778695
|
1793141360.4778695
|
|
6753
|
DNA Encoder by @nitishvankina | Stardance
|
nitishvankina
|
1
|
29.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-10T16:37:34Z", "hours": 29.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a site that could turn text into DNA bases.", "repo": "https://github.com/nitish-vankina/dnaencoder", "demo": "https://nitish-vankina.github.io/dnaencoder/"}]...
|
[{"post_id": 4330, "ts": "2026 [{"post_id": 4330, "ts": "2026-06-07T16:34:15Z", "hours": 10.7939, "text": "I made massive progress on my project (turning text into dna). Like I said in earlier posts, I think that DNA is the future. But we still need a way to turn our text into DNA bases. Thats why I am making this program. Before, my UI was just for show. But now I added JS files to make it actually functional. I created a radiation.js that could stimulate radiation damage, and used data from NASA."}, {"post_id": 3796, "ts": "2026-06-06T21:00:16Z", "hours": 2.28, "text": "Built out the full UI with four tabs — encode, decode, analyze, and trace. The analyze tab was the most interesting to build. Had to implement the SantaLucia 1998 nearest-neighbor thermodynamic model to estimate melting temperature. It uses ΔH and ΔS values for every possible base pair combination to predict how stable a strand is under heat. For short strands under 14 bases it falls back to the simpler Wallace rule. Also learned what GC content actually means — G and C form 3 hydrogen bonds when they pair, A and T only form 2. So a strand with good GC balance is physically stronger. The ideal range for synthesis is 40–60%."}, {"post_id": 3622, "ts": "2026-06-06T17:10:31Z", "hours": 14.0978, "text": "I have upgraded my UI greatly. I started looking into popular websites and tried using their purplish/bluish gradients on my website."}, {"post_id": 2885, "ts": "2026-06-05T19:44:31Z", "hours": 1.2806, "text": "Did you know that all of the data in the world could fit into 3 coffee mugs? If those mugs were made out of DNA Computers store data in binary code (0s and 1s), but DNA uses four chemical bases: A, C, T, and G. By writing a simple script, we can map binary pairs to DNA letters. Because DNA is so dense, it can store humanity’s entire digital footprint into the palm of your hand, while keeping it safe for thousands of years. I have began work on a script that can hopefully do this."}, {"post_id": 2170, "ts": "2026-06-04T14:52:43Z", "hours": 0.6611, "text": "I am working on a small script to turn binary into DNA bases. I want to learn how to make a UI soon."}]...
|
Title: DNA Encoder by @nitishvankina | Stardance
Title: DNA Encoder by @nitishvankina | Stardance
Devlogs:
I am working on a small script to turn binary into DNA bases. I want to learn how to make a UI soon.
Did you know that all of the data in the world could fit into 3 coffee mugs? If those mugs were made out of DNA Computers store data in binary code (0s and 1s), but DNA uses four chemical bases: A, C, T, and G. By writing a simple script, we can map binary pairs to DNA letters. Because DNA is so dense, it can store humanity’s entire digital footprint into the palm of your hand, while keeping it safe for thousands of years. I have began work on a script that can hopefully do this.
I have upgraded my UI greatly. I started looking into popular websites and tried using their purplish/bluish gradients on my website.
Built out the full UI with four tabs — encode, decode, analyze, and trace. The analyze tab was the most interesting to build. Had to implement the SantaLucia 1998 nearest-neighbor thermodynamic model to estimate melting temperature. It uses ΔH and ΔS values for every possible base pair combination to predict how stable a strand is under heat. For short strands under 14 bases it falls back to the simpler Wallace rule. Also learned what GC content actually means — G and C form 3 hydrogen bonds when they pair, A and T only form 2. So a strand with good GC balance is physically stronger. The ideal range for synthesis is 40–60%.
I made massive progress on my project (turning text into dna). Like I said in earlier posts, I think that DNA is the future. But we still need a way to turn our text into DNA bases. Thats why I am making this program. Before, my UI was just for show. But now I added JS files to make it actually functional. I created a radiation.js that could stimulate radiation damage, and used data from NASA.
Ships:
I made a site that could turn text into DNA bases....
|
1792875262.0809422
|
1793739262.0809422
|
|
6765
|
Flarial by @Bari | Stardance
|
Bari
|
1
|
6.12
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T17:12:43Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a utility modification for Minecraft: Bedrock Edition that greatly enhances the user’s survival and PvP experience! The biggest challenge was to handle all errors and crashes throughout the varying machines of my userbase. From handling multiple graphics APIs to support most devices to creating my own rendering engine, one thing that stood out was the cooperation from my team of about 13~ developers in helping me build this amazing project. You obviously need Minecraft: Bedrock Edition purchased and installed on your machine, it is then as simple as visiting https://flarial.xyz/ and hitting download.", "repo": "https://github.com/flarialmc/dll-oss", "demo": "https://flarial.xyz"}]...
|
[{"post_id": 33832, "ts": "202 [{"post_id": 33832, "ts": "2026-07-24T02:13:35Z", "hours": 1.1167, "text": "Flarial Client on Android is out now on PLAY STORE! This is the greatest achievement of my life; it’s currently sitting at a 100k downloads."}, {"post_id": 8173, "ts": "2026-06-13T16:54:51Z", "hours": 4.5617, "text": "Working on the latest and greatest, revamped ClickGUI for Flarial!"}]...
|
Title: Flarial by @Bari | Stardance
Devlogs:
Work Title: Flarial by @Bari | Stardance
Devlogs:
Working on the latest and greatest, revamped ClickGUI for Flarial!
Flarial Client on Android is out now on PLAY STORE! This is the greatest achievement of my life; it’s currently sitting at a 100k downloads.
Ships:
I made a utility modification for Minecraft: Bedrock Edition that greatly enhances the user’s survival and PvP experience! The biggest challenge was to handle all errors and crashes throughout the varying machines of my userbase. From handling multiple graphics APIs to support most devices to creating my own rendering engine, one thing that stood out was the cooperation from my team of about 13~ developers in helping me build this amazing project. You obviously need Minecraft: Bedrock Edition purchased and installed on your machine, it is then as simple as visiting https://flarial.xyz/ and hitting download....
|
1793051651.8577752
|
1793138051.8577752
|
|
6775
|
Manenti Macropad by @Manenti | Stardance
|
|
1
|
3.12
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-04T20:18:15Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a custom 3-key macropad for media control. The keyboard has three buttons: previous track, next track, and play/pause. I designed the PCB in KiCad, modeled the case and top plate in Autodesk Fusion 360, and wrote the firmware using KMK with CircuitPython. The most challenging part was designing the 3D case around the PCB, especially aligning the USB-C cutout, adjusting the wall height, and making the top and bottom pieces fit correctly. I also had to learn how to export the PCB as a STEP file and use it as a reference inside Fusion 360. I am proud that I built the whole project from the electronics to the mechanical case and firmware. This was my first time using Fusion 360, so finishing a working enclosure with a top plate, bottom case, USB cutout, and screw mounting points was a big achievement. To test the project, flash CircuitPython onto a compatible board such as the Seeed Studio XIAO RP2040, copy KMK to the CIRCUITPY drive, and place the code.py firmware file on the board. The switches are connected to pins D0, D1, and D2, and the LEDs are connected to D3. Once connected to a computer, the macropad should work as a USB keyboard and send media control commands.", "repo": "https://github.com/noname697/Amazing-Macropad", "demo": ""}]...
|
[{"post_id": 27309, "ts": "202 [{"post_id": 27309, "ts": "2026-07-12T19:32:51Z", "hours": 2.7664, "text": "Atualizações Added pilot holes for heat-set inserts to improve alignment during installation. Added pass-through screw holes to the top case for M3 screws. Added four mounting holes to the PCB aligned with the case pillars. Rewrite the README"}, {"post_id": 2473, "ts": "2026-06-04T23:53:08Z", "hours": 0.3522, "text": "Translating the Readme.md"}, {"post_id": 2353, "ts": "2026-06-04T20:04:13Z", "hours": 0.4636, "text": "Finishing the project"}]...
|
Title: Manenti Macropad by @Manenti | Stardance
D Title: Manenti Macropad by @Manenti | Stardance
Devlogs:
Finishing the project
Translating the Readme.md
Atualizações Added pilot holes for heat-set inserts to improve alignment during installation. Added pass-through screw holes to the top case for M3 screws. Added four mounting holes to the PCB aligned with the case pillars. Rewrite the README
Ships:
I made a custom 3-key macropad for media control. The keyboard has three buttons: previous track, next track, and play/pause. I designed the PCB in KiCad, modeled the case and top plate in Autodesk Fusion 360, and wrote the firmware using KMK with CircuitPython. The most challenging part was designing the 3D case around the PCB, especially aligning the USB-C cutout, adjusting the wall height, and making the top and bottom pieces fit correctly. I also had to learn how to export the PCB as a STEP file and use it as a reference inside Fusion 360. I am proud that I built the whole project from the electronics to the mechanical case and firmware. This was my first time using Fusion 360, so finishing a working enclosure with a top plate, bottom case, USB cutout, and screw mounting points was a big achievement. To test the project, flash CircuitPython onto a compatible board such as the Seeed Studio XIAO RP2040, copy KMK to the CIRCUITPY drive, and place the code.py firmware file on the board. The switches are connected to pins D0, D1, and D2, and the LEDs are connected to D3. Once connected to a computer, the macropad should work as a USB keyboard and send media control commands....
|
1792997710.7454205
|
1793084110.7454205
|
|
6779
|
Zeteroide by @LouisNotLuna | Stardance
|
LouisNotLuna
|
1
|
17.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T16:28:17Z", "hours": 17.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a simple meteorite shooter, to learn opengl and deepen my knowledge in zig. It is quite a basic game, but it helped to further my understanding.", "repo": "https://codeberg.org/LouisNotLuna/zeteroide", "demo": "https://youtu.be/Fz58MMCm2dk"}]...
|
[{"post_id": 9277, "ts": "2026 [{"post_id": 9277, "ts": "2026-06-15T16:03:54Z", "hours": 3.2778, "text": "I added a damage sound, lives and other stuff. Smoothing for positions, so we don’t get jumpy jumps from grid pos to grid pos. This way we get smooth animations. I also tidied up the code, made spawn rate and tick rate increase with play time. This project has taught me a lot of about graphics programming and opengl."}, {"post_id": 6486, "ts": "2026-06-10T22:07:37Z", "hours": 3.6086, "text": "I did the restructering, the game grid is now no longer stored allowing for more efficent and more efficent ticking. Ticking is now done globally and not per Slot. I also reintroduce some bugs :> that need fixing for the full code diff view github. Here is one of them:"}, {"post_id": 4554, "ts": "2026-06-07T22:00:31Z", "hours": 0.38, "text": "Implemented lives and death (window just closes for now). They are not yet rendering though. so you only get an image of lazygit today"}, {"post_id": 4250, "ts": "2026-06-07T14:30:31Z", "hours": 0.5539, "text": "Now we properly render the explosion texture, missing the meteorites makes them spawn in quicker. They finally disappear when hitting them bottom. No lives yet, that should be trivial to implement. Also added new sounds, for damage and hitting an meteorite"}, {"post_id": 3733, "ts": "2026-06-06T19:35:51Z", "hours": 1.0483, "text": "I got images working! It was a stupid mistake that renderdoc helped me solve. (Pro tip: if you have a projection matrix make sure to actually set it in the shader). It would be nice if I could make opengl hard error in such a case 🤔. As you can see it still not correctly rendered, but at least I see something."}, {"post_id": 3485, "ts": "2026-06-06T13:20:10Z", "hours": 2.3597, "text": "I am currently reworking the rendering pipeline, uhh and somehow a lot of stuff broke. Trying to figure out what I did wrong :dies:"}, {"post_id": 2883, "ts": "2026-06-05T19:39:30Z", "hours": 2.5653, "text": "I have been working on improving the codebase and added sound support, read up a lot on how SDL manages sound. And I needed to medal with nix flake dev env, because it was trying to use jack and didn’t see pipewire. The game doesn’t look much different, but here another screenshot."}, {"post_id": 2055, "ts": "2026-06-04T11:00:42Z", "hours": 2.3686, "text": "I got the basic game working, you can move around, shoot and destroy the meteroides. They don’t deal damage and just chill at the bottom when they reach it. I am not sure if I am happy with current system, as I use a 2d array of the size of the game. Maybe I will change that. Explosions are also working. That is the big red blob that you see, they appear shortly after you shoot a meteroide and disappear after a second. Overall very fun, next thing to add is gonna be a score and lives."}, {"post_id": 1987, "ts": "2026-06-04T07:52:50Z", "hours": 0.8536, "text": "I have been wanting to learn rendering for some time, I decided a good way was to create a little game with opengl and zig, as I am already knowledgeable about that language. The screenshot you see is the current game state, it has been very fun so far and I plan to do more. Doesn’t look to pretty yet, but I plan to work more on this. I have already learned a lot about opengl and rendering."}]...
|
Title: Zeteroide by @LouisNotLuna | Stardance
Dev Title: Zeteroide by @LouisNotLuna | Stardance
Devlogs:
I have been wanting to learn rendering for some time, I decided a good way was to create a little game with opengl and zig, as I am already knowledgeable about that language. The screenshot you see is the current game state, it has been very fun so far and I plan to do more. Doesn’t look to pretty yet, but I plan to work more on this. I have already learned a lot about opengl and rendering.
I got the basic game working, you can move around, shoot and destroy the meteroides. They don’t deal damage and just chill at the bottom when they reach it. I am not sure if I am happy with current system, as I use a 2d array of the size of the game. Maybe I will change that. Explosions are also working. That is the big red blob that you see, they appear shortly after you shoot a meteroide and disappear after a second. Overall very fun, next thing to add is gonna be a score and lives.
I have been working on improving the codebase and added sound support, read up a lot on how SDL manages sound. And I needed to medal with nix flake dev env, because it was trying to use jack and didn’t see pipewire. The game doesn’t look much different, but here another screenshot.
I am currently reworking the rendering pipeline, uhh and somehow a lot of stuff broke. Trying to figure out what I did wrong :dies:
I got images working! It was a stupid mistake that renderdoc helped me solve. (Pro tip: if you have a projection matrix make sure to actually set it in the shader). It would be nice if I could make opengl hard error in such a case 🤔. As you can see it still not correctly rendered, but at least I see something.
Now we properly render the explosion texture, missing the meteorites makes them spawn in quicker. They finally disappear when hitting them bottom. No lives yet, that should be trivial to implement. Also added new sounds, for damage and hitting an meteorite
Implemented lives and death (window just closes for now). They are not yet rendering though. so you only get an image of lazygit today
I did the restructering, the game grid is now no longer stored allowing for more efficent and more efficent ticking. Ticking is now done globally and not per Slot. I also reintroduce some bugs :> that need fixing for the full code diff view github. Here is one of them:
I added a damage sound, lives and other stuff. Smoothing for positions, so we don’t get jumpy jumps from grid pos to grid pos. This way we get smooth animations. I also tidied up the code, made spawn rate and tick rate increase with play time. This project has taught me a lot of about graphics programming and opengl.
Ships:
I made a simple meteorite shooter, to learn opengl and deepen my knowledge in zig. It is quite a basic game, but it helped to further my understanding....
|
1792979581.7057483
|
1793065981.7057483
|
|
6810
|
Macropad for onshape by @dogod | Stardance
|
dogod
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-15T06:33:08Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made both a complete PCB that can be made by anyone its under the GPL if you want to use it and also made a case that should work i don’t know i didn’t make any test prints so do it at your own risk", "repo": "https://github.com/dogod3814t/Onshape-Macropad", "demo": ""}]...
|
[{"post_id": 47325, "ts": "202 [{"post_id": 47325, "ts": "2026-08-15T06:31:23Z", "hours": 0.6256, "text": "Finished the case this should be way more time but i forgot to download the Wakatime extension so I didn’t get all my time marked down this would have ended up being like an additional 3 more hours so that sucks but at least it is finished."}, {"post_id": 34774, "ts": "2026-07-25T19:18:39Z", "hours": 2.475, "text": "Okay so i finished the PCB i was kinda slow cause i have been doing a lot this summer buts its ready now"}, {"post_id": 5696, "ts": "2026-06-09T16:12:19Z", "hours": 0.5594, "text": "I basically just designed a casing for the macropad internals. I have also been deciding on what type of button I should use as honestly both look good. But I should be done with the case I just need to make a port for a type c plug then I will begin work on the PCB which I thankfully have more experience with."}]...
|
Title: Macropad for onshape by @dogod | Stardance
Title: Macropad for onshape by @dogod | Stardance
Devlogs:
I basically just designed a casing for the macropad internals. I have also been deciding on what type of button I should use as honestly both look good. But I should be done with the case I just need to make a port for a type c plug then I will begin work on the PCB which I thankfully have more experience with.
Okay so i finished the PCB i was kinda slow cause i have been doing a lot this summer buts its ready now
Finished the case this should be way more time but i forgot to download the Wakatime extension so I didn’t get all my time marked down this would have ended up being like an additional 3 more hours so that sucks but at least it is finished.
Ships:
I made both a complete PCB that can be made by anyone its under the GPL if you want to use it and also made a case that should work i don’t know i didn’t make any test prints so do it at your own risk...
|
1792968904.9865468
|
1793055304.9865468
|
|
6811
|
Borealis by @onyxtheone | Stardance
|
onyxtheone
|
1
|
383.93
|
4072
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-25T20:46:18Z", "hours": 241.0, "multiplier": 19.2, "payout": 4072, "blessing": "neutral", "text": "I built BTBX (Bare Tiny(?) BASIC eXecutor), a self-contained BASIC interpreter that is the operating system. There’s no Linux, no DOS, nothing underneath it. It boots straight off a FAT12 floppy image via a two-stage bootloader (512-byte stage1 + 2KB stage2), flips the CPU into protected mode, sets up the A20 gate, and lands you directly in a BASIC REPL, all inside 640KB of conventional memory. From there it’s a real language: GOTO, GOSUB, FOR/NEXT, WHILE/WEND, IF/THEN/ELSE, multi-dimensional arrays, 32-bit integers plus x87 80-bit floats, string functions (LEFT$, MID$, CHR$, etc.), and a full FAT12 filesystem so you can actually SAVE, LOAD, and DIR your programs on the disk image. There’s also PEEK/POKE for raw memory access, BLOAD/SYS to load and jump into raw machine code, VGA graphics primitives, a PIT-driven BEEP, and — half-finished but present — a SAY command aiming for SAM-style formant speech synthesis. What was challenging? Everything below the interpreter, honestly. Getting the boot chain right (CHS and EDD disk reads, A20 enabling that doesn’t silently hang, jumping into protected mode without immediately triple-faulting) took far longer than any language feature. The BIOS-thunk approach for file I/O (calling back into 16-bit real mode from a 32-bit kernel just to talk to disk) was its own maze. The funniest recent challenge was building a browser demo on top of v86: getting PS/2 keyboard Shift state to survive contact with a web browser turned out to be nearly as hard as writing the A20 gate code itself :3. Real hardware (and QEMU) just work; browsers apparently have opinions about what a Shift key is allowed to do. What am I proud of? That it boots at all, genuinely. A homemade OS with a homemade language on top, running real math through the x87 FPU and reading/writing a real filesystem, in under 640KB, with zero borrowed runtime. Getting arrays, strings, and file I/O all coexisting cleanly in a from-scratch interpreter over ~240 hours feels like the actual milestone here, not any single feature. What should people know to test it? Use make && make run, that's the supported path, tested in QEMU, and it's where shift/symbols work correctly. The browser demo (v86-based) is explicitly beta. booting and typing work, but shift-modified keys are unreliable there due to browser/emulator keyboard quirks (a real physical keyboard emulator interaction gap, not a BASIC bug ^^). Don't judge the interpreter by the demo's keyboard weirdness. Try PRINT, FOR/NEXT loops, SAVE/LOAD/DIR to confirm the filesystem works, and BEEP for audio. SAY is a known work-in-progress ergo don't expect actual speech (yet). Check the source tree if you want to see the boot chain (boot/stage1.asm, boot/stage2.asm) separately from the interpreter (src/kernel/basic.c).", "repo": "https://github.com/onyx-the-one/borealis", "demo": "https://onyx-the-one.github.io/borealis"}]...
|
[{"post_id": 63409, "ts": "202 [{"post_id": 63409, "ts": "2026-09-07T07:11:12Z", "hours": 9.3, "text": "its been a week since my last devlog, i dont have much new to add because with school and other responsibilities i dont have much time for actuall progress on this project. still i accumulated some 9 hours (sorry gizzy) by doing small changed, linting, updating forgotten banners and version numbers and so on. EHCI/USB still fails on the same issues as before. i will be reverting to a superfloppy boot because right now i cant even get debug to write to the disk which is annoying. then once i get the usb driver with all its issues working (sometime next decade) i can give usb boot another shot."}, {"post_id": 58426, "ts": "2026-08-30T20:43:20Z", "hours": 6.0, "text": "i am (still) putting in work on the usb driver, this is proving to be very complicated especially because my hardware is not cooperating. im thinking about switching back to floppy-emulated mode which would be more practical for debugging but at the same time probably introduce new issues i dont even expect yet."}, {"post_id": 53934, "ts": "2026-08-24T17:11:33Z", "hours": 7.1178, "text": "the port resets work on the laptop now. the bit we were waiting on (port-enable-changed) was being acknowledged by the bios’s smm ghost before we ever saw it, so we stopped waiting on the status bit and just read the port state, which can’t be acked away. also fixed before it bit us: two devices answering address 0 at once (enumeration is per-port now, and every device gets a real address before the next port wakes up). the next failure was prettier: every OUT transfer works, every IN transfer dies. the stick takes its orders but can’t talk back. that’s the signature of the qtd buffer list, the one place real ich silicon is strict where qemu is forgiving, so all dma buffers are page-aligned now and the error reports name whichever endpoint stalled. also everyone gotta apreciate the blahaj!"}, {"post_id": 50969, "ts": "2026-08-20T13:23:36Z", "hours": 9.3333, "text": "the stick is a disk now, no bios involved: usb grew enumeration and bot/scsi, fat12 picks whichever backend came up. qemu took the whole chain first try. the laptop found the stick on port 0 and then refused to reset it (my fault), the 50ms delay was port-0x80 writes that only cost real time inside qemu, so there’s a pit-based clock now. plot twist from the log meanwhile: the bios path worked on the laptop, because the toggles that “didn’t help” had quietly moved the stick to floppy emulation, and that path survives the mode switch. so it (partially) boots by accident while we fix it on purpose. also caught in a self-audit: a stall burned a full second, and a short read could report success with half a sector. readme rewritten as i was told to by sw."}, {"post_id": 50492, "ts": "2026-08-19T17:32:16Z", "hours": 5.8606, "text": "im still working on getting a usb driver to work. ehci seems to work kinda but its a loop between giving false data, partial data and occasionally seemingly true data but then usb decides it doesnt like it and ideally fat12 fails durning cache load too, WHICH I FIXED LONG AGO BRUH. but it came back for some reason. so im trying timing, msd, stall handling everything. this may take another decade."}, {"post_id": 49913, "ts": "2026-08-18T21:34:01Z", "hours": 6.4844, "text": "debug spew is a file now. every checkpoint from the first instruction onward (entry asm, the real-mode thunk letters, all the [DEBUG] lines) lands in a buffer, and once the fs proves it can write, the buffer becomes LOG.TXT and the screen clears to the banner. the trick is the default: echo stays on until the file is safely written, so a boot that dies early still shows everything live. the fallback isn’t a code path, it’s just never getting to the quiet part. LOG=0 in CONFIG.TXT keeps the old wallpaper. and the log already caught its first bug: a missing [EZTG] tattled on a stale version entry.asm. debugging is too important to leave on the screen."}, {"post_id": 49489, "ts": "2026-08-18T11:03:57Z", "hours": 9.5697, "text": "the stick talks, and for the first time it’s talking to us, not the bios. this part was the transfer engine: queue heads and transfer descriptors, little linked-list structs the ehci controller fetches out of ram and executes on its own. a control transfer is three of them chained by hand (setup, data, status), data toggles set manually per stage because high-speed lets you. link the queue head into the async ring, poll the active bit, unlink, then ring the doorbell (an actual doorbell bit) so the controller formally forgets the whole thing before the structs get reused. first exchange: GET_DESCRIPTOR at address 0, and the stick answered with its vid/pid like a civilized device. qemu’s stick goes by 46f4:0001; the real one can introduce itself when the laptop’s back. next: scsi over bulk, and fat12 stops caring what a disk is. moral: usb devices are polite, they just want to be asked in struct form."}, {"post_id": 48764, "ts": "2026-08-17T09:14:22Z", "hours": 9.3231, "text": "the laptop’s bios has a party trick: as i described before, int 13h works fine until the cpu enters protected mode, then it never returns, not even for a no-transfer disk reset. bios toggles didn’t help, so borealis is growing a native usb driver. first part: find the ehci controller over pci, do the formal ownership handshake (there’s an actual semaphore register in config space where the os and the bios’s smm ghost take turns. set our bit, wait for theirs to clear, then kill every smi source so the ghost stops getting summoned), reset the controller, spin up an idle async schedule, scan the ports. no packets yet, just a controller that’s officially ours. dev loop is qemu with a stick image on an emulated ehci, boot still from floppy, so the laptop only has to show up for the one hardware-specific part. moral: if the firmware won’t share the hardware, take the hardware."}, {"post_id": 47754, "ts": "2026-08-15T21:50:44Z", "hours": 4.8914, "text": "instrumented the thunk to print a letter per step so a hang names its own murderer. result: Rer , then nothing. R entered real mode, e entered the EDD read, r was about to issue a disk reset, ah=00h, the simplest int 13h call there is, no transfer, and it never returned. if even a no-op reset hangs after the PM excursion, the bios’s whole disk service is dead post-protected-mode on this machine, full stop. so the fix is a native usb driver. helix talks EHCI directly, bios for boot and native for runtime, as it should be, but that’s pci + ownership handoff from the very SMM that broke us + enumeration + BOT/scsi, and you don’t bring that up blind, one teletype letter per reboot, right before losing the hardware. deferred until the laptop’s back on hand; qemu remains unaffected."}, {"post_id": 47202, "ts": "2026-08-14T23:22:02Z", "hours": 5.7114, "text": "working theory: the bios’s legacy usb support, and specifically system management mode. coil runs in pure real mode and its EDD reads work, the bios reads the stick happily at boot. but helix runs in protected mode, and calling the bios means dropping back through a thunk, and that round-trip is where it dies. on a machine this age legacy usb lives in SMM: the bios traps disk interrupts and does the transfer in a mode invisible to the os, assuming a clean real-mode cpu, and our PM excursion breaks that assumption. the tell: teletype (int 10h) works from the thunk, disk (int 13h) hangs. teletype doesn’t touch usb, disk does. photo is the bios setup screen, where i went hunting for a legacy usb toggle which i did not find ;3c"}, {"post_id": 46999, "ts": "2026-08-14T15:56:13Z", "hours": 4.2892, "text": "next wall, immediate: the machine hangs at fat_cache_load, the step where helix reads the FAT and root directory into RAM. in qemu this works instantly but on the laptop the disk read goes out and never comes back. no error, no status, no return. debug output narrows it to exactly the transfer call: everything before prints, everything after doesn’t."}, {"post_id": 46771, "ts": "2026-08-14T08:36:41Z", "hours": 5.2839, "text": "borealis booted on the laptop for the first time. not qemu but actual silicon, a core 2 duo, off a usb stick. coil came up, loaded helix, and the machine made it to the banner plus three debug lines, which is the whole chain working on real firmware: stage1 > stage2 > kernel > protected mode. CHS disk was already known broken cos this bios won’t talk cylinders/heads/sectors to a stick with no real geometry, fair enough — so coil booted over EDD, but helix’s disk layer still assumed CHS and the filesystem never came up. still: it boots, on real hardware. just doesnt get far enough to be useful (yet)."}, {"post_id": 45393, "ts": "2026-08-11T20:28:36Z", "hours": 1.4333, "text": "im still working on real hw boot issues. coil doesnt guess geometry anymore, it brutes it: the new stage2 tries every plausible CHS geometry against a buildtime checksum of the kernel’s first sector and prints the one that actually works. no more “trust the BIOS” and no more “reject the BIOS”, just prove it. on a sane machine it prints g(18.2) and boots like nothing happened. on the laptop it either prints its real geometry and boots, or prints G! plus what the BIOS claimed. either way i finally get an answer instead of a silent reset. in the meantime ill be working on some features like arrows, logging, etc. attached photo of my testing setup"}, {"post_id": 45321, "ts": "2026-08-11T18:14:12Z", "hours": 5.1247, "text": "boot splash is in and shipping on the image. CONFIG.TXT decides, SPLASH.BAS plays on boot, keypress skips. the hook was “just two lines” and then reality happened: config.c wasnt in the makefile, the loader was static, and the first boot loaded the splash then sat at the prompt waiting for me to type RUN myself. three one-line fixes later: coil letters, banner, aurora, prompt. also fixed make pack details. the machine has a boot vibe now next up is proper scrollback, logging, and arrow key support."}, {"post_id": 44866, "ts": "2026-08-10T22:05:04Z", "hours": 2.6764, "text": "the system has a config file now. CONFIG.TXT on the boot disk, key=value, one per line, read at boot. the fun part: the parser tolerates leading line numbers, so EDIT CONFIG.TXT just works with zero new editor code. the editor only speaks numbered lines, so i taught the config reader to ignore them instead (and officially, just use the numbered lines in there its not that hard, but you dont have to for it to work). SPLASH=0/1 is the first key, persistence is free because its a file on the FAT12 disk. the whole reader is ~75 lines, no allocation, no subsystem. config systems should be files, not frameworks ;3c"}, {"post_id": 44673, "ts": "2026-08-10T16:18:27Z", "hours": 4.6592, "text": "SCREEN 13 works, SCRTEST passes end to end, palette cycling is smooth, and as a bonus the fix also killed a stack-vs-bss collision that was waiting to happen. wrote AURORA.BAS to celebrate, it does a starfield and a sine curtain with the classic palette-cycling trick so it stays fast even interpreted. next up (probs): making it the boot splash, config.txt for persistence, then directories and much much more to be excited for!"}, {"post_id": 44301, "ts": "2026-08-09T23:25:07Z", "hours": 5.0344, "text": "ITS THE MEMORY MAP. gfx_is_active sits at 0xA12C0 which is past 0xA0000 aka inside the VGA framebuffer window. reads from there always return 0xFF in text mode, writes vanish into the void. the kernel bss grew past 640k and parked a variable in video memory. the “graphics thunk situation” was never the thunk. it was never even the graphics. one line in the linker script moves bss to 1MiB and everything works. i want to scream (affectionate). theres some more to be done before its usable in practice (because it never really was i guess) but SOON."}, {"post_id": 43938, "ts": "2026-08-09T12:00:21Z", "hours": 5.2647, "text": "spent the whole night inside the realmode thunk with a fine comb. it is NOT the thunk. SCREEN 0 actually switches modes fine, which makes SCREEN 13 doing nothing even weirder. also found out my kernel thinks graphics is already on before i ever turned it on?? the flag says 255. TWO HUNDRED FIFTY FIVE. its supposed to be 0 or 1. memory corruption somewhere (see kpan 7), or im losing my mind. probably both."}, {"post_id": 43586, "ts": "2026-08-08T22:43:36Z", "hours": 4.1406, "text": "boot is finally stable, primes count to a million, so i tried the graphics. SCREEN 13 does nothing. no error, no letters, no mode change. GCLS nothing, LINE nothing, RECT nothing. PALETTE works??? which makes no sense because palette is the one that should be hardest. starting to suspect the video thunk is broken. ive got no idea. but at least im honoring my promise to keep devlogs shorter."}, {"post_id": 43305, "ts": "2026-08-08T14:26:54Z", "hours": 10.0411, "text": "Fixed the boot (fr this time) the whole laptop reset thing turned out to be two bugs stacked on each other: the bootloader was trusting/rejecting BIOS geometry based on vibes, and the kernel entry point was jumping into a debug helper instead of _start , so the CPU executed one stray ret into the void and triple-faulted. coil now makes the BIOS prove its geometry against a build-time checksum before trusting it, and checksums the whole kernel before jumping in. Boot output is an actual diagnostic language now: gk = geometry truthful, gf = BIOS lied, C! = wrong bytes arrived, and nothing resets silently anymore. QEMU boots all the way to BASIC, audio included. Also cleaned up helix.c (boot debug spam now only speaks when something’s actually wrong, RIP “HELIX FAILIURE” typo), evicted BTBX from the prompt, it’s js => now, and am working the BASIC interpreter with a bit of a rewrite: dispatcher no longer depends on include order and prayer, dead duplicate file-I/O code confirmed gone, graphics.inc brace damage found and fixed. Laptop test tomorrow-ish, then the interpreter cleanup lands. see u next time!"}, {"post_id": 41616, "ts": "2026-08-05T22:41:53Z", "hours": 8.7858, "text": "hi people! this one’s a bit different. no new features, but a new name. the project is now called Borealis. the old name, BTBX, made sense when this was a tiny BASIC interpreter and nothing more, but it’s grown into a full bootloader, kernel, and proto-OS, and the name stopped fitting. the system now has three named layers: coil is the two-stage bootloader, helix is the kernel, and BOREALIS is the system as a whole. the names are deliberately scale-neutral. where the project goes from here shouldn’t be constrained by what it’s called. the rename itself was the easy part, the fallout was the real work. i went through every file updating references to the old name, plus the directory structure ( boot/ became coil/ , src/kernel/ became src/helix/ ), the build files, and the image name ( borealis.img now). outside the repo, i also had to update hackatime and stardance so everything points at the right thing. the README on github is fully rewritten to match (may not be pushed at this time), and there’s a note in it about the old name for continuity. technically nothing else changed. same code, same features, same open issues, this was purely an identity update. that’s all for now!"}, {"post_id": 38767, "ts": "2026-08-01T10:16:03Z", "hours": 12.6017, "text": "hi people! im trying to get BTBX to boot properly on an ASUS F5RL laptop. unfortunately, it still isn’t booting correctly, but I managed to narrow the problem down further. I previously ran into issues involving EDD, DH, and a few other parts of the boot process. right now I’m getting the error S1>S2Agk(18.1)Drk{c2,h0,s2}R , which makes it look like the BIOS may be reporting bogus CHS geometry in a way BTBX is not expecting. there’s no working result yet, but I’ll keep investigating the boot and disk-handling path. i hope to get it running soon."}, {"post_id": 34823, "ts": "2026-07-25T20:37:32Z", "hours": 5.6622, "text": "hi people! this time i worked on a v86-compatible version for the in-browser demo. it’s now possible to try the project directly in the browser, although there are still a few input-related issues, including with the shift key. the browser version is mainly there as a quick way to look at the project without setting anything up. for proper testing, though, i’d still recommend using a local environment—the demo is mostly for anyone too busy to set one up. pong does work in it though ^^"}, {"post_id": 33966, "ts": "2026-07-24T10:16:38Z", "hours": 10.9, "text": "hi people! recently i worked on adding proper graphics support to the project. instead of relying on text-mode attribute tricks, i went with direct pixel plotting, since it gives the system a much more flexible foundation for drawing things on screen. i added a new Mode 13h framebuffer API with functions for entering and leaving graphics mode, clearing the screen, plotting and reading individual pixels, drawing lines, rectangles, and circles, and changing the VGA palette. the implementation writes directly to the linear framebuffer at 0xA0000, with palette updates handled through the VGA DAC ports. on the BASIC side, there are now new statements for using these graphics features: SCREEN, GCLS, PSET, LINE, RECT, CIRCLE, and PALETTE. i also connected the new graphics code to the statement dispatcher and updated the built-in HELP text so the commands are documented. finally, i cleaned up the build setup by adding the new graphics source files and removing an old ‘-display curses’ option from the run command. this is a much more versatile approach than only the old text-based graphics, and it gives me a better base for anything visual i add later. that’s all for now!"}, {"post_id": 33368, "ts": "2026-07-23T07:14:31Z", "hours": 9.3667, "text": "hi people! i spent more time working on the graphics system. there still isn’t a finished result to show yet, but i’ve been continuing to work through the implementation and figuring out the pieces needed for proper pixel-based graphics support. it’s taking a bit more iteration than expected, but the goal is still to have a solid graphics foundation rather than rushing in something limited. hopefully i’ll have the completed version ready to show soon. see y’all later!"}, {"post_id": 32259, "ts": "2026-07-21T09:58:51Z", "hours": 13.1136, "text": "hi people! i started working toward graphics support this time. i’m moving away from text-mode tricks and looking at direct pixel plotting instead, since it should be much more flexible to build on later.it’s still a work in progress, but i should have something more complete to show next time. what pmo is that 10 hour limit so i cant just devlog once i have a feature, i have to do it in the middle of nothing an wasting 3 hours anyways. see y’all later!"}, {"post_id": 31938, "ts": "2026-07-20T19:04:38Z", "hours": 7.7667, "text": "hi people! this time i added a set of bitwise operations to the language: AND(x,y), OR(x,y), XOR(x,y), NOT(x), SHL(x,n), and SHR(x,n). these work on values converted to 32-bit integers, and the shift functions keep large shift counts predictable by masking them to 31. i also added HEX$(x) and BIN$(x) string functions for displaying numbers in hexadecimal and binary, without unnecessary leading zeroes. on top of that, the number parser now accepts hexadecimal and binary literals using &H… and &B…. finally, i updated the built-in HELP text so the new functions and literal formats are documented in the system itself. that’s all for now"}, {"post_id": 30166, "ts": "2026-07-17T15:01:06Z", "hours": 6.6506, "text": "hi people! this was mostly a behind-the-scenes work session rather than one with a major new feature to show off. i spent a lot of time working through the project, trying things out, and dealing with the smaller details that tend to take longer than expected. there isn’t one big result for this devlog, but the time was still useful for getting a clearer picture of what needs attention next and making progress on the work that supports the larger features. sometimes development is less about a big visible change and more about putting time into the parts that make future work smoother. that’s all for now!"}, {"post_id": 28528, "ts": "2026-07-14T20:47:26Z", "hours": 15.6667, "text": "hi guys! i took a short break from the project. first voluntarily to take care of my mental health, and then a bit longer than planned because i got sick. after returning, i tackled a smaller but useful feature: RTC support via the TIME command. the command can now work with the real-time clock, which means the system has proper support for reading and handling time instead of relying on a manually managed value. this was a fairly quick feature to work through, so it felt like a good way to get back into the project after the break. also, please excuse the old time shown in the photo, i hadn’t kept it up to date when I took it. that’s all, see you later"}, {"post_id": 22752, "ts": "2026-07-05T10:26:44Z", "hours": 10.2164, "text": "hi people! this time, i mostly worked on cleaning things up after restructuring the working tree, and i also fixed a few issues with the text editor. the biggest breakthrough was figuring out why the prime sieve computation kept failing. in the end, the problem had nothing to do with the math itself. instead, it came from the way the interpreter handled loops and writing to disk. those issues interacted in a way that caused the loop to stop after finding just one number. that problem is now fixed, and while tracking it down i also ran into several other bugs, which i fixed along the way. that’s all!"}, {"post_id": 22233, "ts": "2026-07-04T16:25:58Z", "hours": 9.3667, "text": "After my restructuring I was gonna ship the project but I just dont feel its finished enough so I wanted to add a few more features to make it a bit more standalone. Right now, you would in theory be able to use it on a computer without having to prepare programs on another computer because WE HAVE A TEXT EDITOR!!! finally. So you can write your BASIC and execute it, save the results and view them as much as you want!! There is a prime number sieve being edited on screen but it doesnt run yet because there are some issues in the way my BASIC is interpreted, some issue with loops or whatnot. Thats the next thing to work on."}, {"post_id": 20667, "ts": "2026-07-02T10:09:46Z", "hours": 10.5667, "text": "Nothing incredible, except scut work right now. I was made aware by codefactor that my code was too complex in parts (complexity of 771) and so I cleaned up the file tree so its nice and organized, and I am most way through splitting stmt(), but I was made aware my devlogs are too long so here you go."}, {"post_id": 19587, "ts": "2026-06-30T22:41:33Z", "hours": 8.1828, "text": "I started working on giving the system a voice. Yes, quite literally a dystopian, creepy voice synthetisation function. Originally I was only gonna do ‘BEEP freq, duration’ (which i managed in a good hour at most) but then I got invested in actual phoneme/allophone synthesys (Software Automatic Mouth style) and it turned into a lot more work. Sadly so far i’ve only ever gotten squeals out of it, or all quiet, so i am probably going to give up and do more important work like either a text editor or a directory support, or even a proper C compiler in-system (so far only precompiled binaries work)."}, {"post_id": 16830, "ts": "2026-06-27T10:18:01Z", "hours": 19.9, "text": "I took a small hiatus (climbing in the caucas mountains for my mental health). Anyways i’m back and I added binary loading and execution support (for example precompiled C or whatever). I works, no too visible on the screenshot but look at the screen border (it was flashing). Also sorry for the long devlog but i had some time logged, and logged more now, and somehow ended up with 18 hrs."}, {"post_id": 12181, "ts": "2026-06-19T21:57:01Z", "hours": 7.1, "text": "I have finally fixed the floppy boot including its FAT12 init. There were many, many problems, I was running around in circles but I finally fixed it. The last thing I did was rewrote the EDD stuff front and back, and I assume that fixed it. I, honestly, am not sure. But anyways, now both HDD and floppy boot work including FAT12 init and all functions of BASIC that I have implemented insofar."}, {"post_id": 11569, "ts": "2026-06-18T21:07:42Z", "hours": 6.9667, "text": "The floppy boot issue persists. I have moved past the FAT init failing visibly, but any read actions throw all zeros out. I came across the issue in the past, I feel like I am going in circles here,"}, {"post_id": 10455, "ts": "2026-06-17T05:52:29Z", "hours": 7.1333, "text": "At the moment I am still stuck on the same issue (floppy/HDD). I got the idea that the fs may be misconfigured so I am working a on that too. A lot of theories, and multiple issues i’ve fixed already, but on floppy FAT init still fails."}, {"post_id": 9805, "ts": "2026-06-16T07:38:30Z", "hours": 12.0872, "text": "I dont have any major update, I am stuck fixing a regression where FAT initialization fails exclusively on QEMU floppy boots, while HDDs work fine. I always fix one thing and something else breaks, like EDD probing panics, false failiures, reset storms and others. The end result is always the same, the boot takes a long time (timeouts) and no disk is available."}, {"post_id": 8817, "ts": "2026-06-14T17:30:00Z", "hours": 13.4017, "text": "I decided to put some work into booting in hard-drive (DL 0x80). That in itself wasn’t too big an issue, but it in turn made floppy boot (DL 0x00) nonfunctional. I went back and forth, fixing one, breaking the other, again and again. Right now there is some kind of silent failiure in floppy mode that causes it to take minutes to boot (I think its failing and retrying 3 times on every sector) and then it finds the root dir populated as all zeros. The issue is all the processes come back as successes when reading registers. So right now, only hard drive mode works, but this devlog is already wayyyy too long and I wouldnt want to lose all this time."}, {"post_id": 7914, "ts": "2026-06-13T06:12:33Z", "hours": 5.8778, "text": "And we have a complete functioning FAT12! Reading and writing have been working smoothly. The fs writing wasn’t even that hard to implement, and I also added a few more mathematicals to to once again appoach GWBASIC. We have direct hardware access (PEEK/POKE into ram, etc), arrays, nonblocking input (INKEY$) and I also added 2 string functions."}, {"post_id": 6919, "ts": "2026-06-11T16:23:48Z", "hours": 11.835, "text": "After countless fixes I have managed to get a functioning FAT12 filesystem working, including listing and loading files. Saving (writing) is not functional yet. The key issues were: CHS mismatch, BPB was wrong, broken multisector loading, and other. Next I will try to make writing possible."}, {"post_id": 5983, "ts": "2026-06-10T01:13:01Z", "hours": 6.7942, "text": "I’ve changed some kernel details, like that instead of straight crashing, it might tell you whats wrong before, design details, etc. I changed the approach to disk wiriting from straight dd to a python script that actually makes a mountable volume, and I am still working on getting filesystem working. There has been so so many issues ive been running into as the complexity of the system rises (and so does entropy, I guess). This will take an unprecedented amount of work to get even remotely to the level that is GWBASIC, much less what I aspired to (ISO/IEC 10279:1991)."}, {"post_id": 4220, "ts": "2026-06-07T13:34:33Z", "hours": 10.9408, "text": "I managed to implement longer variable names possible, a lof of trig/calc functions and overall perked up some details. Im heading towards Full BASIC instead of just Tiny BASIC but Im not sure how far I will go with this."}, {"post_id": 3710, "ts": "2026-06-06T19:20:05Z", "hours": 8.9439, "text": "Ive gotten to the point where it actually boots from floppy in QEMU (no hd working) AND to an extent BASIC works. Its not perfect yet but ill get there soon."}, {"post_id": 2998, "ts": "2026-06-05T22:31:16Z", "hours": 6.0936, "text": "What a poor choice this project. I wanna sleep so much and yet I cant fall asleep because I just have to get it running and it will definietly only be an hour or less."}, {"post_id": 2674, "ts": "2026-06-05T10:58:37Z", "hours": 9.0503, "text": "I changed the approach. Instead of just messing around in assembly, I will do most of it in C and assembly is only for the bootloader. Yes, bootloader. Simplest way to keep this as bare-metal and universal as possible was, in my opinion, to just write a kernel, grub, crosscompile for i868 (in distrobox because the toolchain doesnt run on my distro) and boot via QEMU. I got far enough that it compiles and builds into an ISO, but doesnt actaully even boot, instead bugs out in SeaBIOS. Seems I bit off more than I could chew."}, {"post_id": 1934, "ts": "2026-06-04T05:34:44Z", "hours": 7.0881, "text": "After an all-nighter i got it to assemble, but to call it functional would be a joke."}]...
|
Title: Borealis by @onyxtheone | Stardance
Devlog Title: Borealis by @onyxtheone | Stardance
Devlogs:
After an all-nighter i got it to assemble, but to call it functional would be a joke.
I changed the approach. Instead of just messing around in assembly, I will do most of it in C and assembly is only for the bootloader. Yes, bootloader. Simplest way to keep this as bare-metal and universal as possible was, in my opinion, to just write a kernel, grub, crosscompile for i868 (in distrobox because the toolchain doesnt run on my distro) and boot via QEMU. I got far enough that it compiles and builds into an ISO, but doesnt actaully even boot, instead bugs out in SeaBIOS. Seems I bit off more than I could chew.
What a poor choice this project. I wanna sleep so much and yet I cant fall asleep because I just have to get it running and it will definietly only be an hour or less.
Ive gotten to the point where it actually boots from floppy in QEMU (no hd working) AND to an extent BASIC works. Its not perfect yet but ill get there soon.
I managed to implement longer variable names possible, a lof of trig/calc functions and overall perked up some details. Im heading towards Full BASIC instead of just Tiny BASIC but Im not sure how far I will go with this.
I’ve changed some kernel details, like that instead of straight crashing, it might tell you whats wrong before, design details, etc. I changed the approach to disk wiriting from straight dd to a python script that actually makes a mountable volume, and I am still working on getting filesystem working. There has been so so many issues ive been running into as the complexity of the system rises (and so does entropy, I guess). This will take an unprecedented amount of work to get even remotely to the level that is GWBASIC, much less what I aspired to (ISO/IEC 10279:1991).
After countless fixes I have managed to get a functioning FAT12 filesystem working, including listing and loading files. Saving (writing) is not functional yet. The key issues were: CHS mismatch, BPB was wrong, broken multisector loading, and other. Next I will try to make writing possible.
And we have a complete functioning FAT12! Reading and writing have been working smoothly. The fs writing wasn’t even that hard to implement, and I also added a few more mathematicals to to once again appoach GWBASIC. We have direct hardware access (PEEK/POKE into ram, etc), arrays, nonblocking input (INKEY$) and I also added 2 string functions.
I decided to put some work into booting in hard-drive (DL 0x80). That in itself wasn’t too big an issue, but it in turn made floppy boot (DL 0x00) nonfunctional. I went back and forth, fixing one, breaking the other, again and again. Right now there is some kind of silent failiure in floppy mode that causes it to take minutes to boot (I think its failing and retrying 3 times on every sector) and then it finds the root dir populated as all zeros. The issue is all the processes come back as successes when reading registers. So right now, only hard drive mode works, but this devlog is already wayyyy too long and I wouldnt want to lose all this time.
I dont have any major update, I am stuck fixing a regression where FAT initialization fails exclusively on QEMU floppy boots, while HDDs work fine. I always fix one thing and something else breaks, like EDD probing panics, false failiures, reset storms and others. The end result is always the same, the boot takes a long time (timeouts) and no disk is available.
At the moment I am still stuck on the same issue (floppy/HDD). I got the idea that the fs may be misconfigured so I am working a on that too. A lot of theories, and multiple issues i’ve fixed already, but on floppy FAT init still fails.
The floppy boot issue persists. I have moved past the FAT init failing visibly, but any read actions throw all zeros out. I came across the issue in the past, I feel like I am going in circles here,
I have finally fixed the floppy boot including its FAT12 init. There were many, many problems, I was running around in circles but I finally fixed it. The last thing I did was rewrote the EDD stuff front and back, and I assume that fixed it. I, honestly, am not sure. But anyways, now both HDD and floppy boot work including FAT12 init and all functions of BASIC that I have implemented insofar.
I took a small hiatus (climbing in the caucas mountains for my mental health). Anyways i’m back and I added binary loading and execution support (for example precompiled C or whatever). I works, no too visible on the screenshot but look at the screen border (it was flashing). Also sorry for the long devlog but i had some time logged, and logged more now, and somehow ended up with 18 hrs.
I started working on giving the system a voice. Yes, quite literally a dystopian, creepy voice synthetisation function. Originally I was only gonna do ‘BEEP freq, duration’ (which i managed in a good hour at most) but then I got invested in actual phoneme/allophone synthesys (Software Automatic Mouth style) and it turned into a lot more work. Sadly so far i’ve only ever gotten squeals out of it, or all quiet, so i am probably going to give up and do more important work like either a text editor or a directory support, or even a proper C compiler in-system (so far only precompiled binaries work).
Nothing incredible, except scut work right now. I was made aware by codefactor that my code was too complex in parts (complexity of 771) and so I cleaned up the file tree so its nice and organized, and I am most way through splitting stmt(), but I was made aware my devlogs are too long so here you go.
After my restructuring I was gonna ship the project but I just dont feel its finished enough so I wanted to add a few more features to make it a bit more standalone. Right now, you would in theory be able to use it on a computer without having to prepare programs on another computer because WE HAVE A TEXT EDITOR!!! finally. So you can write your BASIC and execute it, save the results and view them as much as you want!! There is a prime number sieve being edited on screen but it doesnt run yet because there are some issues in the way my BASIC is interpreted, some issue with loops or whatnot. Thats the next thing to work on.
hi people! this time, i mostly worked on cleaning things up after restructuring the working tree, and i also fixed a few issues with the text editor. the biggest breakthrough was figuring out why the prime sieve computation kept failing. in the end, the problem had nothing to do with the math itself. instead, it came from the way the interpreter handled loops and writing to disk. those issues interacted in a way that caused the loop to stop after finding just one number. that problem is now fixed, and while tracking it down i also ran into several other bugs, which i fixed along the way. that’s all!
hi guys! i took a short break from the project. first voluntarily to take care of my mental health, and then a bit longer than planned because i got sick. after returning, i tackled a smaller but useful feature: RTC support via the TIME command. the command can now work with the real-time clock, which means the system has proper support for reading and handling time instead of relying on a manually managed value. this was a fairly quick feature to work through, so it felt like a good way to get back into the project after the break. also, please excuse the old time shown in the photo, i hadn’t kept it up to date when I took it. that’s all, see you later
hi people! this was mostly a behind-the-scenes work session rather than one with a major new feature to show off. i spent a lot of time working through the project, trying things out, and dealing with the smaller details that tend to take longer than expected. there isn’t one big result for this devlog, but the time was still useful for getting a clearer picture of what needs attention next and making progress on the work that supports the larger features. sometimes development is less about a big visible change and more about putting time into the parts that make future work smoother. that’s all for now!
hi people! this time i added a set of bitwise operations to the language: AND(x,y), OR(x,y), XOR(x,y), NOT(x), SHL(x,n), and SHR(x,n). these work on values converted to 32-bit integers, and the shift functions keep large shift counts predictable by masking them to 31. i also added HEX$(x) and BIN$(x) string functions for displaying numbers in hexadecimal and binary, without unnecessary leading zeroes. on top of that, the number parser now accepts hexadecimal and binary literals using &H… and &B…. finally, i updated the built-in HELP text so the new functions and literal formats are documented in the system itself. that’s all for now
hi people! i started working toward graphics support this time. i’m moving away from text-mode tricks and looking at direct pixel plotting instead, since it should be much more flexible to build on later.it’s still a work in progress, but i should have something more complete to show next time. what pmo is that 10 hour limit so i cant just devlog once i have a feature, i have to do it in the middle of nothing an wasting 3 hours anyways. see y’all later!
hi people! i spent more time working on the graphics system. there still isn’t a finished result to show yet, but i’ve been continuing to work through the implementation and figuring out the pieces needed for proper pixel-based graphics support. it’s taking a bit more iteration than expected, but the goal is still to have a solid graphics foundation rather than rushing in something limited. hopefully i’ll have the completed version ready to show soon. see y’all later!
hi people! recently i worked on adding proper graphics support to the project. instead of relying on text-mode attribute tricks, i went with direct pixel plotting, since it gives the system a much more flexible foundation for drawing things on screen. i added a new Mode 13h framebuffer API with functions for entering and leaving graphics mode, clearing the screen, plotting and reading individual pixels, drawing lines, rectangles, and circles, and changing the VGA palette. the implementation writes directly to the linear framebuffer at 0xA0000, with palette updates handled through the VGA DAC ports. on the BASIC side, there are now new statements for using these graphics features: SCREEN, GCLS, PSET, LINE, RECT, CIRCLE, and PALETTE. i also connected the new graphics code to the statement dispatcher and updated the built-in HELP text so the commands are documented. finally, i cleaned up the build setup by adding the new graphics source files and removing an old ‘-display curses’ option from the run command. this is a much more versatile approach than only the old text-based graphics, and it gives me a better base for anything visual i add later. that’s all for now!
hi people! this time i worked on a v86-compatible version for the in-browser demo. it’s now possible to try the project directly in the browser, although there are still a few input-related issues, including with the shift key. the browser version is mainly there as a quick way to look at the project without setting anything up. for proper testing, though, i’d still recommend using a local environment—the demo is mostly for anyone too busy to set one up. pong does work in it though ^^
hi people! im trying to get BTBX to boot properly on an ASUS F5RL laptop. unfortunately, it still isn’t booting correctly, but I managed to narrow the problem down further. I previously ran into issues involving EDD, DH, and a few other parts of the boot process. right now I’m getting the error S1>S2Agk(18.1)Drk{c2,h0,s2}R , which makes it look like the BIOS may be reporting bogus CHS geometry in a way BTBX is not expecting. there’s no working result yet, but I’ll keep investigating the boot and disk-handling path. i hope to get it running soon.
hi people! this one’s a bit different. no new features, but a new name. the project is now called Borealis. the old name, BTBX, made sense when this was a tiny BASIC interpreter and nothing more, but it’s grown into a full bootloader, kernel, and proto-OS, and the name stopped fitting. the system now has three named layers: coil is the two-stage bootloader, helix is the kernel, and BOREALIS is the system as a whole. the names are deliberately scale-neutral. where the project goes from here shouldn’t be constrained by what it’s called. the rename itself was the easy part, the fallout was the real work. i went through every file updating references to the old name, plus the directory structure ( boot/ became coil/ , src/kernel/ became src/helix/ ), the build files, and the image name ( borealis.img now). outside the repo, i also had to update hackatime and stardance so everything points at the right thing. the README on github is fully rewritten to match (may not be pushed at this time), and there’s a note in it about the old name for continuity. technically nothing else changed. same code, same features, same open issues, this was purely an identity update. that’s all for now!
Fixed the boot (fr this time) the whole laptop reset thing turned out to be two bugs stacked on each other: the bootloader was trusting/rejecting BIOS geometry based on vibes, and the kernel entry point was jumping into a debug helper instead of _start , so the CPU executed one stray ret into the void and triple-faulted. coil now makes the BIOS prove its geometry against a build-time checksum before trusting it, and checksums the whole kernel before jumping in. Boot output is an actual diagnostic language now: gk = geometry truthful, gf = BIOS lied, C! = wrong bytes arrived, and nothing resets silently anymore. QEMU boots all the way to BASIC, audio included. Also cleaned up helix.c (boot debug spam now only speaks when something’s actually wrong, RIP “HELIX FAILIURE” typo), evicted BTBX from the prompt, it’s js => now, and am working the BASIC interpreter with a bit of a rewrite: dispatcher no longer depends on include order and prayer, dead duplicate file-I/O code confirmed gone, graphics.inc brace damage found and fixed. Laptop test tomorrow-ish, then the interpreter cleanup lands. see u next time!
boot is finally stable, primes count to a million, so i tried the graphics. SCREEN 13 does nothing. no error, no letters, no mode change. GCLS nothing, LINE nothing, RECT nothing. PALETTE works??? which makes no sense because palette is the one that should be hardest. starting to suspect the video thunk is broken. ive got no idea. but at least im honoring my promise to keep devlogs shorter.
spent the whole night inside the realmode thunk with a fine comb. it is NOT the thunk. SCREEN 0 actually switches modes fine, which makes SCREEN 13 doing nothing even weirder. also found out my kernel thinks graphics is already on before i ever turned it on?? the flag says 255. TWO HUNDRED FIFTY FIVE. its supposed to be 0 or 1. memory corruption somewhere (see kpan 7), or im losing my mind. probably both.
ITS THE MEMORY MAP. gfx_is_active sits at 0xA12C0 which is past 0xA0000 aka inside the VGA framebuffer window. reads from there always return 0xFF in text mode, writes vanish into the void. the kernel bss grew past 640k and parked a variable in video memory. the “graphics thunk situation” was never the thunk. it was never even the graphics. one line in the linker script moves bss to 1MiB and everything works. i want to scream (affectionate). theres some more to be done before its usable in practice (because it never really was i guess) but SOON.
SCREEN 13 works, SCRTEST passes end to end, palette cycling is smooth, and as a bonus the fix also killed a stack-vs-bss collision that was waiting to happen. wrote AURORA.BAS to celebrate, it does a starfield and a sine curtain with the classic palette-cycling trick so it stays fast even interpreted. next up (probs): making it the boot splash, config.txt for persistence, then directories and much much more to be excited for!
the system has a config file now. CONFIG.TXT on the boot disk, key=value, one per line, read at boot. the fun part: the parser tolerates leading line numbers, so EDIT CONFIG.TXT just works with zero new editor code. the editor only speaks numbered lines, so i taught the config reader to ignore them instead (and officially, just use the numbered lines in there its not that hard, but you dont have to for it to work). SPLASH=0/1 is the first key, persistence is free because its a file on the FAT12 disk. the whole reader is ~75 lines, no allocation, no subsystem. config systems should be files, not frameworks ;3c
boot splash is in and shipping on the image. CONFIG.TXT decides, SPLASH.BAS plays on boot, keypress skips. the hook was “just two lines” and then reality happened: config.c wasnt in the makefile, the loader was static, and the first boot loaded the splash then sat at the prompt waiting for me to type RUN myself. three one-line fixes later: coil letters, banner, aurora, prompt. also fixed make pack details. the machine has a boot vibe now next up is proper scrollback, logging, and arrow key support.
im still working on real hw boot issues. coil doesnt guess geometry anymore, it brutes it: the new stage2 tries every plausible CHS geometry against a buildtime checksum of the kernel’s first sector and prints the one that actually works. no more “trust the BIOS” and no more “reject the BIOS”, just prove it. on a sane machine it prints g(18.2) and boots like nothing happened. on the laptop it either prints its real geometry and boots, or prints G! plus what the BIOS claimed. either way i finally get an answer instead of a silent reset. in the meantime ill be working on some features like arrows, logging, etc. attached photo of my testing setup
borealis booted on the laptop for the first time. not qemu but actual silicon, a core 2 duo, off a usb stick. coil came up, loaded helix, and the machine made it to the banner plus three debug lines, which is the whole chain working on real firmware: stage1 > stage2 > kernel > protected mode. CHS disk was already known broken cos this bios won’t talk cylinders/heads/sectors to a stick with no real geometry, fair enough — so coil booted over EDD, but helix’s disk layer still assumed CHS and the filesystem never came up. still: it boots, on real hardware. just doesnt get far enough to be useful (yet).
next wall, immediate: the machine hangs at fat_cache_load, the step where helix reads the FAT and root directory into RAM. in qemu this works instantly but on the laptop the disk read goes out and never comes back. no error, no status, no return. debug output narrows it to exactly the transfer call: everything before prints, everything after doesn’t.
working theory: the bios’s legacy usb support, and specifically system management mode. coil runs in pure real mode and its EDD reads work, the bios reads the stick happily at boot. but helix runs in protected mode, and calling the bios means dropping back through a thunk, and that round-trip is where it dies. on a machine this age legacy usb lives in SMM: the bios traps disk interrupts and does the transfer in a mode invisible to the os, assuming a clean real-mode cpu, and our PM excursion breaks that assumption. the tell: teletype (int 10h) works from the thunk, disk (int 13h) hangs. teletype doesn’t touch usb, disk does. photo is the bios setup screen, where i went hunting for a legacy usb toggle which i did not find ;3c
instrumented the thunk to print a letter per step so a hang names its own murderer. result: Rer , then nothing. R entered real mode, e entered the EDD read, r was about to issue a disk reset, ah=00h, the simplest int 13h call there is, no transfer, and it never returned. if even a no-op reset hangs after the PM excursion, the bios’s whole disk service is dead post-protected-mode on this machine, full stop. so the fix is a native usb driver. helix talks EHCI directly, bios for boot and native for runtime, as it should be, but that’s pci + ownership handoff from the very SMM that broke us + enumeration + BOT/scsi, and you don’t bring that up blind, one teletype letter per reboot, right before losing the hardware. deferred until the laptop’s back on hand; qemu remains unaffected.
the laptop’s bios has a party trick: as i described before, int 13h works fine until the cpu enters protected mode, then it never returns, not even for a no-transfer disk reset. bios toggles didn’t help, so borealis is growing a native usb driver. first part: find the ehci controller over pci, do the formal ownership handshake (there’s an actual semaphore register in config space where the os and the bios’s smm ghost take turns. set our bit, wait for theirs to clear, then kill every smi source so the ghost stops getting summoned), reset the controller, spin up an idle async schedule, scan the ports. no packets yet, just a controller that’s officially ours. dev loop is qemu with a stick image on an emulated ehci, boot still from floppy, so the laptop only has to show up for the one hardware-specific part. moral: if the firmware won’t share the hardware, take the hardware.
the stick talks, and for the first time it’s talking to us, not the bios. this part was the transfer engine: queue heads and transfer descriptors, little linked-list structs the ehci controller fetches out of ram and executes on its own. a control transfer is three of them chained by hand (setup, data, status), data toggles set manually per stage because high-speed lets you. link the queue head into the async ring, poll the active bit, unlink, then ring the doorbell (an actual doorbell bit) so the controller formally forgets the whole thing before the structs get reused. first exchange: GET_DESCRIPTOR at address 0, and the stick answered with its vid/pid like a civilized device. qemu’s stick goes by 46f4:0001; the real one can introduce itself when the laptop’s back. next: scsi over bulk, and fat12 stops caring what a disk is. moral: usb devices are polite, they just want to be asked in struct form.
debug spew is a file now. every checkpoint from the first instruction onward (entry asm, the real-mode thunk letters, all the [DEBUG] lines) lands in a buffer, and once the fs proves it can write, the buffer becomes LOG.TXT and the screen clears to the banner. the trick is the default: echo stays on until the file is safely written, so a boot that dies early still shows everything live. the fallback isn’t a code path, it’s just never getting to the quiet part. LOG=0 in CONFIG.TXT keeps the old wallpaper. and the log already caught its first bug: a missing [EZTG] tattled on a stale version entry.asm. debugging is too important to leave on the screen.
im still working on getting a usb driver to work. ehci seems to work kinda but its a loop between giving false data, partial data and occasionally seemingly true data but then usb decides it doesnt like it and ideally fat12 fails durning cache load too, WHICH I FIXED LONG AGO BRUH. but it came back for some reason. so im trying timing, msd, stall handling everything. this may take another decade.
the stick is a disk now, no bios involved: usb grew enumeration and bot/scsi, fat12 picks whichever backend came up. qemu took the whole chain first try. the laptop found the stick on port 0 and then refused to reset it (my fault), the 50ms delay was port-0x80 writes that only cost real time inside qemu, so there’s a pit-based clock now. plot twist from the log meanwhile: the bios path worked on the laptop, because the toggles that “didn’t help” had quietly moved the stick to floppy emulation, and that path survives the mode switch. so it (partially) boots by accident while we fix it on purpose. also caught in a self-audit: a stall burned a full second, and a short read could report success with half a sector. readme rewritten as i was told to by sw.
the port resets work on the laptop now. the bit we were waiting on (port-enable-changed) was being acknowledged by the bios’s smm ghost before we ever saw it, so we stopped waiting on the status bit and just read the port state, which can’t be acked away. also fixed before it bit us: two devices answering address 0 at once (enumeration is per-port now, and every device gets a real address before the next port wakes up). the next failure was prettier: every OUT transfer works, every IN transfer dies. the stick takes its orders but can’t talk back. that’s the signature of the qtd buffer list, the one place real ich silicon is strict where qemu is forgiving, so all dma buffers are page-aligned now and the error reports name whichever endpoint stalled. also everyone gotta apreciate the blahaj!
i am (still) putting in work on the usb driver, this is proving to be very complicated especially because my hardware is not cooperating. im thinking about switching back to floppy-emulated mode which would be more practical for debugging but at the same time probably introduce new issues i dont even expect yet.
its been a week since my last devlog, i dont have much new to add because with school and other responsibilities i dont have much time for actuall progress on this project. still i accumulated some 9 hours (sorry gizzy) by doing small changed, linting, updating forgotten banners and version numbers and so on. EHCI/USB still fails on the same issues as before. i will be reverting to a superfloppy boot because right now i cant even get debug to write to the disk which is annoying. then once i get the usb driver with all its issues working (sometime next decade) i can give usb boot another shot.
Ships:
I built BTBX (Bare Tiny(?) BASIC eXecutor), a self-contained BASIC interpreter that is the operating system. There’s no Linux, no DOS, nothing underneath it. It boots straight off a FAT12 floppy image via a two-stage bootloader (512-byte stage1 + 2KB stage2), flips the CPU into protected mode, sets up the A20 gate, and lands you directly in a BASIC REPL, all inside 640KB of conventional memory. From there it’s a real language: GOTO, GOSUB, FOR/NEXT, WHILE/WEND, IF/THEN/ELSE, multi-dimensional arrays, 32-bit integers plus x87 80-bit floats, string functions (LEFT$, MID$, CHR$, etc.), and a full FAT12 filesystem so you can actually SAVE, LOAD, and DIR your programs on the disk image. There’s also PEEK/POKE for raw memory access, BLOAD/SYS to load and jump into raw machine code, VGA graphics primitives, a PIT-driven BEEP, and — half-finished but present — a SAY command aiming for SAM-style formant speech synthesis. What was challenging? Everything below the interpreter, honestly. Getting the boot chain right (CHS and EDD disk reads, A20 enabling that doesn’t silently hang, jumping into protected mode without immediately triple-faulting) took far longer than any language feature. The BIOS-thunk approach for file I/O (calling back into 16-bit real mode from a 32-bit kernel just to talk to disk) was its own maze. The funniest recent challenge was building a browser demo on top of v86: getting PS/2 keyboard Shift state to survive contact with a web browser turned out to be nearly as hard as writing the A20 gate code itself :3. Real hardware (and QEMU) just work; browsers apparently have opinions about what a Shift key is allowed to do. What am I proud of? That it boots at all, genuinely. A homemade OS with a homemade language on top, running real math through the x87 FPU and reading/writing a real filesystem, in under 640KB, with zero borrowed runtime. Getting arrays, strings, and file I/O all coexisting cleanly in a from-scratch interpreter over ~240 hours feels like the actual milestone here, not any single feature. What should people know to test it? Use make && make run, that's the supported path, tested in QEMU, and it's where shift/symbols work correctly. The browser demo (v86-based) is explicitly beta. booting and typing work, but shift-modified keys are unreliable there due to browser/emulator keyboard quirks (a real physical keyboard emulator interaction gap, not a BASIC bug ^^). Don't judge the interpreter by the demo's keyboard weirdness. Try PRINT, FOR/NEXT loops, SAVE/LOAD/DIR to confirm the filesystem works, and BEEP for audio. SAY is a known work-in-progress ergo don't expect actual speech (yet). Check the source tree if you want to see the boot chain (boot/stage1.asm, boot/stage2.asm) separately from the interpreter (src/kernel/basic.c)....
|
1792878618.2847242
|
1793742618.2847242
|
|
6822
|
Buffet Patron Simulator by @ylu | Stardance
|
ylu
|
1
|
47.0
|
625
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T18:37:52Z", "hours": 47.0, "multiplier": 14.51, "payout": 625, "blessing": "neutral", "text": "I made a simulation game where you are at a buffet. You can put food on your plate and watch it realistically deform based on what’s underneath it. You can pour yourself a drink at the soda fountain and even mix drinks. This is technically my third Unity game, but it is the greatest in terms of originality and scope. I had little to no experience programming in C# for Unity before this. I’m proud of realizing some of my more technically challenging visions such as the food deformation and drink mixing. I’m also proud of learning how to model and paint foods and such in Blender. My project is fully playable on the web. The demo points to the itch.io page. A Windows executable is also available to download there.", "repo": "https://github.com/Why-Am/Buffet-Patron-Simulator", "demo": "https://yhlu.itch.io/buffet-patron-simulator"}]...
|
[{"post_id": 18467, "ts": "202 [{"post_id": 18467, "ts": "2026-06-29T17:06:12Z", "hours": 5.7625, "text": "New in Buffet Patron Simulator: Final Tweaks, a Video Trailer, and Ship Preparations In-Game Changes White UI text now has an outline for visibility New food item: chocolate cake slice ( watch me make it ) Changed the directional light from a realtime light to a mixed light (realtime + baked) so shadows would be higher quality on web Trailer I made a trailer for my game: https://youtu.be/KIWuaLkeX5Q ( watch me make it ) Updated README and Itch.io Page Finally, I updated my project’s README and Itch.io page for polish. Attached: frame from the trailer"}, {"post_id": 16030, "ts": "2026-06-26T01:06:25Z", "hours": 1.5383, "text": "Added some posters to my game"}, {"post_id": 15301, "ts": "2026-06-24T21:03:17Z", "hours": 3.9775, "text": "New in Buffet Patron Simulator: Realistic Sounds, Inspecting Drink Dispensers Adding sounds to the drink dispensers got me to rework the hold interactions. Now it uses the more sane method of checking key presses and releases (previously it just sent interact calls every frame a key was held). Anyways, with that alongside a new “liquid pouring” effect (which is just a moving cylinder), the dispensers are now more satisfying to use. Placing Food Placing food also gets a sound. So that not all foods sounded the same, I added a “weight” field to each food that determined the volume at which the sound would be played. Inspecting Your Food and Drink I added an inspect scene that’s basically just a copy-and-paste of the food placing scene but stripped down and with the glass present. It’s accessed by pressing i . Ship Soon? Next, I will focus on final optimizations and promotional materials (videos, images) to prepare to ship within a few days."}, {"post_id": 14012, "ts": "2026-06-23T00:03:49Z", "hours": 5.9614, "text": "New in Buffet Patron Simulator: Drinks You can mix drinks and the color of the glass’s contents changes accordingly. I also added the game’s first sounds - you should be able to hear them in the video - as well as 3 more foods: crab rangoon, General Tso’s chicken, and coconut shrimp. It was a challenge to get the glass to fill at a consistent rate, but I figured it out using a coroutine that restricts the rate of calls to add liquid (which occur every frame the E key is held). Next up is figuring out how to play a sound while it fills…"}, {"post_id": 11533, "ts": "2026-06-18T20:38:49Z", "hours": 2.7747, "text": "Added some scenery and lighting to my buffet game There are some tough tradeoffs to be made in terms of graphics, given that I want the game to look good but also be lean for the web. Skybox There aren’t actually any 3D buildings outside of the windows, it’s just a skybox I got from Polyhaven (a large repository of public domain 3D assets I found). I settled for a lower resolution version since it would have less impact on loading times. Lights The lights on the ceiling are baked area lights. The upside of that is a lower runtime cost. The downside is that it ignores moving objects like the player. Floor Then, thinking the room looked a little dull, I made a purple and yellow (green?) tile material for the floor. The texture is nice and small at only 128x128 px/156 bytes. I’ve been increasingly mindful of texture sizes as my game grows."}, {"post_id": 10238, "ts": "2026-06-16T21:22:18Z", "hours": 2.5369, "text": "Added eggs, baked beans, and green beans. I also made some other refinements, including making the displays easier to interact with by making their colliders bigger. Watch me model the foods: https://lapse.hackclub.com/timelapse/0VTNwczx4ETd"}, {"post_id": 9514, "ts": "2026-06-15T21:39:32Z", "hours": 6.2758, "text": "Since last devlog, I added burger ingredients and a settings menu. Here’s a time lapse of me making the models: https://lapse.hackclub.com/timelapse/OWkasEGkBTYV It’s also now playable enough that I decided to publish a web demo: https://yhlu.itch.io/buffet-patron-simulator"}, {"post_id": 7228, "ts": "2026-06-12T02:00:44Z", "hours": 6.4814, "text": "Since last devlog, there is now: a preliminary buffet scene with a first person movable character and interactive food displays new 3D models for the plate and the rice, made in Blender"}, {"post_id": 6013, "ts": "2026-06-10T02:35:20Z", "hours": 3.1494, "text": "Steak Added Also made some improvements to placing food. Modeling Issues It turns out that colorful textures on voxel models mess up when remeshing. The rice doesn’t have this problem because it’s grayscale. So I ended up trying sculpting and texture painting in Blender, and it was actually very intuitive. The steak in the video is made completely in Blender."}, {"post_id": 5307, "ts": "2026-06-09T01:18:55Z", "hours": 3.3122, "text": "A Pile of Rice New scene for placing food on a plate. Currently only rice available. It’s only now starting to dawn on me that this doesn’t really look like rice."}, {"post_id": 4497, "ts": "2026-06-07T20:35:00Z", "hours": 4.8922, "text": "I am working on making food pile up realistically using mesh deformation. The structural integrity is adjustable for different foods. Structural integrity is achieved in two ways: Only the bottom vertices are directly mapped onto the surface below; the rest are then moved relative to the bottom vertices. The amount a vertex moves is inversely related to its height. It could be tuned in terms of realism and optimization, but I’m currently happy with the result."}]...
|
Title: Buffet Patron Simulator by @ylu | Stardance Title: Buffet Patron Simulator by @ylu | Stardance
Devlogs:
I am working on making food pile up realistically using mesh deformation. The structural integrity is adjustable for different foods. Structural integrity is achieved in two ways: Only the bottom vertices are directly mapped onto the surface below; the rest are then moved relative to the bottom vertices. The amount a vertex moves is inversely related to its height. It could be tuned in terms of realism and optimization, but I’m currently happy with the result.
A Pile of Rice New scene for placing food on a plate. Currently only rice available. It’s only now starting to dawn on me that this doesn’t really look like rice.
Steak Added Also made some improvements to placing food. Modeling Issues It turns out that colorful textures on voxel models mess up when remeshing. The rice doesn’t have this problem because it’s grayscale. So I ended up trying sculpting and texture painting in Blender, and it was actually very intuitive. The steak in the video is made completely in Blender.
Since last devlog, there is now: a preliminary buffet scene with a first person movable character and interactive food displays new 3D models for the plate and the rice, made in Blender
Since last devlog, I added burger ingredients and a settings menu. Here’s a time lapse of me making the models: https://lapse.hackclub.com/timelapse/OWkasEGkBTYV It’s also now playable enough that I decided to publish a web demo: https://yhlu.itch.io/buffet-patron-simulator
Added eggs, baked beans, and green beans. I also made some other refinements, including making the displays easier to interact with by making their colliders bigger. Watch me model the foods: https://lapse.hackclub.com/timelapse/0VTNwczx4ETd
Added some scenery and lighting to my buffet game There are some tough tradeoffs to be made in terms of graphics, given that I want the game to look good but also be lean for the web. Skybox There aren’t actually any 3D buildings outside of the windows, it’s just a skybox I got from Polyhaven (a large repository of public domain 3D assets I found). I settled for a lower resolution version since it would have less impact on loading times. Lights The lights on the ceiling are baked area lights. The upside of that is a lower runtime cost. The downside is that it ignores moving objects like the player. Floor Then, thinking the room looked a little dull, I made a purple and yellow (green?) tile material for the floor. The texture is nice and small at only 128x128 px/156 bytes. I’ve been increasingly mindful of texture sizes as my game grows.
New in Buffet Patron Simulator: Drinks You can mix drinks and the color of the glass’s contents changes accordingly. I also added the game’s first sounds - you should be able to hear them in the video - as well as 3 more foods: crab rangoon, General Tso’s chicken, and coconut shrimp. It was a challenge to get the glass to fill at a consistent rate, but I figured it out using a coroutine that restricts the rate of calls to add liquid (which occur every frame the E key is held). Next up is figuring out how to play a sound while it fills…
New in Buffet Patron Simulator: Realistic Sounds, Inspecting Drink Dispensers Adding sounds to the drink dispensers got me to rework the hold interactions. Now it uses the more sane method of checking key presses and releases (previously it just sent interact calls every frame a key was held). Anyways, with that alongside a new “liquid pouring” effect (which is just a moving cylinder), the dispensers are now more satisfying to use. Placing Food Placing food also gets a sound. So that not all foods sounded the same, I added a “weight” field to each food that determined the volume at which the sound would be played. Inspecting Your Food and Drink I added an inspect scene that’s basically just a copy-and-paste of the food placing scene but stripped down and with the glass present. It’s accessed by pressing i . Ship Soon? Next, I will focus on final optimizations and promotional materials (videos, images) to prepare to ship within a few days.
Added some posters to my game
New in Buffet Patron Simulator: Final Tweaks, a Video Trailer, and Ship Preparations In-Game Changes White UI text now has an outline for visibility New food item: chocolate cake slice ( watch me make it ) Changed the directional light from a realtime light to a mixed light (realtime + baked) so shadows would be higher quality on web Trailer I made a trailer for my game: https://youtu.be/KIWuaLkeX5Q ( watch me make it ) Updated README and Itch.io Page Finally, I updated my project’s README and Itch.io page for polish. Attached: frame from the trailer
Ships:
I made a simulation game where you are at a buffet. You can put food on your plate and watch it realistically deform based on what’s underneath it. You can pour yourself a drink at the soda fountain and even mix drinks. This is technically my third Unity game, but it is the greatest in terms of originality and scope. I had little to no experience programming in C# for Unity before this. I’m proud of realizing some of my more technically challenging visions such as the food deformation and drink mixing. I’m also proud of learning how to model and paint foods and such in Blender. My project is fully playable on the web. The demo points to the itch.io page. A Windows executable is also available to download there....
|
1792975687.3821056
|
1793062087.3821056
|
|
6830
|
AI ascii art maker by @spawnedshoyo | Stardance
|
spawnedshoyo
|
1
|
17.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-06T22:42:10Z", "hours": 17.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built this ASCII Art Maker as a fun project to explore image processing and ASCII conversion. The tool lets you either generate images from text prompts using AI or upload your own images, then converts them to ASCII art. Feel free to suggest ideas for my next project! I’m always looking for new challenges and interesting things to build.", "repo": "https://github.com/RandomAiPerson/AsciiGenerator", "demo": "https://randomaiperson.github.io/AsciiGenerator/"}]...
|
[{"post_id": 23786, "ts": "202 [{"post_id": 23786, "ts": "2026-07-06T22:39:56Z", "hours": 16.6358, "text": "I built this ASCII Art Maker as a fun project to explore image processing and ASCII conversion. The tool lets you either generate images from text prompts using AI or upload your own images, then converts them to ASCII art. Feel free to suggest ideas for my next project! I’m always looking for new challenges and interesting things to build."}]...
|
Title: AI ascii art maker by @spawnedshoyo | Stard Title: AI ascii art maker by @spawnedshoyo | Stardance
Devlogs:
I built this ASCII Art Maker as a fun project to explore image processing and ASCII conversion. The tool lets you either generate images from text prompts using AI or upload your own images, then converts them to ASCII art. Feel free to suggest ideas for my next project! I’m always looking for new challenges and interesting things to build.
Ships:
I built this ASCII Art Maker as a fun project to explore image processing and ASCII conversion. The tool lets you either generate images from text prompts using AI or upload your own images, then converts them to ASCII art. Feel free to suggest ideas for my next project! I’m always looking for new challenges and interesting things to build....
|
1792972411.1342633
|
1793058811.1342633
|
|
6832
|
My first slack bot! by @hamzayasir9211 | Stardance
|
hamzayasir9211
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-06T22:15:45Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made my first ever slack bot. tbh every step seemed like a challenge but i made it to the end anyways it was fun making a bot of my own", "repo": "https://github.com/MuhammadHamzaYasir/api-bot", "demo": "https://drive.google.com/file/d/12CGFmHZzjKo2FQf19uWJ3U9rMLQyL159/view?usp=sharing"}]...
|
[{"post_id": 23260, "ts": "202 [{"post_id": 23260, "ts": "2026-07-06T03:19:48Z", "hours": 1.5958, "text": "just made my first ever bot, a slack bot cant wait to deploy it on nest my approval is pending.."}]...
|
Title: My first slack bot! by @hamzayasir9211 | St Title: My first slack bot! by @hamzayasir9211 | Stardance
Devlogs:
just made my first ever bot, a slack bot cant wait to deploy it on nest my approval is pending..
Ships:
i made my first ever slack bot. tbh every step seemed like a challenge but i made it to the end anyways it was fun making a bot of my own...
|
1792993906.4084897
|
1793080306.4084897
|
|
6840
|
Easy Ecosystem by @domst13 | Stardance
|
domst13
|
1
|
23.0
|
272
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T00:16:36Z", "hours": 23.0, "multiplier": 12.02, "payout": 272, "blessing": "neutral", "text": "I created a simple Python Ecosystem that I am calling Easy Ecosystem. It features two types of creatures, as well as food and water for both. My biggest challenge throughout this project was making the algorithms work correctly, as this is my first fully complete Python project. I not only learned a lot, but I am super proud of what I created. To test my project, you have to download and extract a zip file. I wish I could have web hosted it, but I experienced issues when trying to bundle it and make it accessible on the web. I hope you can check out my project, and enjoy!!", "repo": "https://github.com/dominicstange13/Ecosystem/", "demo": "https://github.com/dominicstange13/Easy-Ecosystem/releases/tag/v1.0.0"}]...
|
[{"post_id": 8420, "ts": "2026 [{"post_id": 8420, "ts": "2026-06-14T00:10:16Z", "hours": 0.3708, "text": "-Final balancing and making sure no bugs slipped past me -Time to ship baby!!"}, {"post_id": 7898, "ts": "2026-06-13T05:44:50Z", "hours": 2.1303, "text": "-Finished ALL sprites and incorporated them into the code meaning that the project is DONE -All that’s left is to finish up the repository and link everything then it’s shipping time!!! -Ik 0 people have seen any of these devlogs but lets friggin go guys WE did this"}, {"post_id": 7313, "ts": "2026-06-12T05:55:59Z", "hours": 3.9992, "text": "-FINISHED CODING -Started work on sprite drawings and stuff -Done any day now"}, {"post_id": 6641, "ts": "2026-06-11T04:01:03Z", "hours": 2.2789, "text": "-Worked on carnivore AI and did some bug fixing -I expect to be finished with the coding very soon so I can move on to art"}, {"post_id": 6044, "ts": "2026-06-10T04:49:31Z", "hours": 2.6753, "text": "GUYS WE ARE ALMOST DONE WITH THE CODE!!! -Finished herbivore code for plants and water, as well as all water code -Started creating carnivore and got most of the way through making it as it was relatively bug-free (thank God)"}, {"post_id": 5394, "ts": "2026-06-09T04:34:33Z", "hours": 3.7811, "text": "-(hopefully) finished plant tracking algorithm as well as plant spawning -added water spawning but not thirst (yet) -I probably won’t upload anything tomorrow because I’m getting my wisdom teeth removed but hopefully I’ll be back by Wednesday -I’m estimating I can finish the programming part of this project in another day or two but depending on bugs that could change"}, {"post_id": 4702, "ts": "2026-06-08T03:59:29Z", "hours": 2.5825, "text": "I started making the logic that would allow the herbivore to seek out plants and remove plants once eaten, then proceeded to battle with bugs for the next couple of hours Hopefully more progress tomorrow, this project is probably going to take a while because it has proven more difficult that I first imagined, but I’m gonna stick with it and persevere"}, {"post_id": 4384, "ts": "2026-06-07T18:18:08Z", "hours": 2.5878, "text": "Not much, worked on plant spawning and the herbivore calculations to find food"}, {"post_id": 2800, "ts": "2026-06-05T16:47:50Z", "hours": 1.5144, "text": "Added hunger display and made the herbivore move to grab plants"}, {"post_id": 1818, "ts": "2026-06-04T01:19:17Z", "hours": 0.7475, "text": "I created a food rect and animal rect and started experimenting with movement"}]...
|
Title: Easy Ecosystem by @domst13 | Stardance
Dev Title: Easy Ecosystem by @domst13 | Stardance
Devlogs:
I created a food rect and animal rect and started experimenting with movement
Added hunger display and made the herbivore move to grab plants
Not much, worked on plant spawning and the herbivore calculations to find food
I started making the logic that would allow the herbivore to seek out plants and remove plants once eaten, then proceeded to battle with bugs for the next couple of hours Hopefully more progress tomorrow, this project is probably going to take a while because it has proven more difficult that I first imagined, but I’m gonna stick with it and persevere
-(hopefully) finished plant tracking algorithm as well as plant spawning -added water spawning but not thirst (yet) -I probably won’t upload anything tomorrow because I’m getting my wisdom teeth removed but hopefully I’ll be back by Wednesday -I’m estimating I can finish the programming part of this project in another day or two but depending on bugs that could change
GUYS WE ARE ALMOST DONE WITH THE CODE!!! -Finished herbivore code for plants and water, as well as all water code -Started creating carnivore and got most of the way through making it as it was relatively bug-free (thank God)
-Worked on carnivore AI and did some bug fixing -I expect to be finished with the coding very soon so I can move on to art
-FINISHED CODING -Started work on sprite drawings and stuff -Done any day now
-Finished ALL sprites and incorporated them into the code meaning that the project is DONE -All that’s left is to finish up the repository and link everything then it’s shipping time!!! -Ik 0 people have seen any of these devlogs but lets friggin go guys WE did this
-Final balancing and making sure no bugs slipped past me -Time to ship baby!!
Ships:
I created a simple Python Ecosystem that I am calling Easy Ecosystem. It features two types of creatures, as well as food and water for both. My biggest challenge throughout this project was making the algorithms work correctly, as this is my first fully complete Python project. I not only learned a lot, but I am super proud of what I created. To test my project, you have to download and extract a zip file. I wish I could have web hosted it, but I experienced issues when trying to bundle it and make it accessible on the web. I hope you can check out my project, and enjoy!!...
|
1792990231.9040608
|
1793076631.9040608
|
|
6841
|
Snake! by @zahran | Stardance
|
zahran
|
1
|
5.0
|
79
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-30T20:35:29Z", "hours": 5.0, "multiplier": 13.26, "payout": 79, "blessing": "neutral", "text": "I started learning Java at the beginning of June, and to test my skills I recreated Snake in Java. You can control the snake using WASD/arrow keys, and reset the game using R. It features modifiers that let you adjust the snake’s speed and board size, and you can enable other modifiers as well. During development, I faced a lot of minor challenges caused by me writing something incorrectly and then battling with the bug for 5-10 minutes or so. Since it’s my first project made using Java, I tried to do most things on my own but I did reference a video if I got too stuck on one thing. However, I’m super proud of achieving this, for two main reasons: It’s my first project made in Java, and it’s actually usable and fun to play. It’s a functional game that people can play. This is especially important because I’m planning to make a platformer in C++ soon, so this was a nice warmup for game development. Anyway, I hope you enjoy my Snake game! :)", "repo": "https://github.com/HughMann635/SnakeGame", "demo": "https://github.com/HughMann635/SnakeGame/releases/tag/Initializing"}]...
|
[{"post_id": 19396, "ts": "202 [{"post_id": 19396, "ts": "2026-06-30T18:21:18Z", "hours": 0.4228, "text": "I just fixed two bugs/issues: Made it so you can no longer click a button while the game is running Fixed a bug where if you mashed two inputs in the same frame, your snake could crash (e.g. moving down and mashing the right and up inputs). I fixed this by adding a check to make sure you can only switch directions once per frame. How I did it: I made a boolean called hasMoved, set it to false, and made it check for if hasMoved was false. It also sets hasMoved to true after you change direction and sets it back to false at the end of the frame."}, {"post_id": 19338, "ts": "2026-06-30T16:53:18Z", "hours": 2.1356, "text": "It’s been a hot minute since I posted a devlog, but I think I’ve more or less finished the game. Here’s what I’ve added: Interactive buttons that let you toggle/change the snake’s speed, size of the board, and different modifiers such as disabled collisions and mines that spawn randomly on the map Fixed a bunch of pre-existing bugs (like with score tracking) and new bugs (working out the mines was so annoying holy) yeah that’s pretty much it I think. Next steps: I’ll look into making it resizable/of different dimensions. Honestly, I might not do this one because a lot of my positions/coordinates were hard coded so it might be a pain to rework, but I’ll think about it. I’ll fix any remaining bugs that I can catch. I know there’s one that crashes the snake if you try to mash two directions together. And last but not least, I’m gonna start preparing to ship!"}, {"post_id": 17227, "ts": "2026-06-27T22:53:23Z", "hours": 0.7336, "text": "Ok so I went and fixed all the bugs, there were a LOT of bugs. here’s a couple: Snake movement and apple generation were happening incorrectly; I use a system where different variables like appleX, appleY, and an array for x and y values of each snake segment are stored as values between 1 and the length of the board (boardDim). They’re then multiplied by the dimension of each cell(cellDim). I initially forgot to multiply by cellDim so the snake was moving at a 1 pixel/second speed and the apple was confined to the top left corner. The borders of the cells were not being generated I didn’t initialize the arrays that contain the positions for each of the snake’s segments, causing the game to not run at all initially Up and down controls were reversed; borders did not work If you mash 2 directions, you can crash: e.g. if you’re going up, then mash left and down, the program interprets your down input as the latest one and essentially pushes you into yourself There are probably some more I haven’t explored yet, but for now I’m gonna work on the main menu."}, {"post_id": 17195, "ts": "2026-06-27T22:05:51Z", "hours": 1.1186, "text": "This time I completed pretty much all the basic gameplay mechanics and the game should technically work once I fix up any bugs. However, there are still bugs: quite a few of them, actually, since I kinda just brute forced my way through this stage of development with code that I thought should work. Anyway, once I get any bugs that stop me from running the game sorted out, I’ll refine the bugs that are impacting gameplay (there are def gonna be a couple of bugs there too). Then I’ll probably get started on designing a main menu."}, {"post_id": 16553, "ts": "2026-06-26T22:31:46Z", "hours": 0.5861, "text": "I started learning Java at the beginning of June, and to test my skills I’ making a guided project in Java. I decided to recreate Snake, using the video attached in the README file to help guide me. I’ll try to use it as minimally as possible, but if I get stuck I’ll watch the video to learn where to go next. So far I’ve just set up files and classes/functions as mentioned in the video, and I also set up a couple of variables and some code for a few functions on my own. Next time I’ll work on gameplay aspects, then I’ll move on to coding a death screen completely on my own."}]...
|
Title: Snake! by @zahran | Stardance
Devlogs:
I s Title: Snake! by @zahran | Stardance
Devlogs:
I started learning Java at the beginning of June, and to test my skills I’ making a guided project in Java. I decided to recreate Snake, using the video attached in the README file to help guide me. I’ll try to use it as minimally as possible, but if I get stuck I’ll watch the video to learn where to go next. So far I’ve just set up files and classes/functions as mentioned in the video, and I also set up a couple of variables and some code for a few functions on my own. Next time I’ll work on gameplay aspects, then I’ll move on to coding a death screen completely on my own.
This time I completed pretty much all the basic gameplay mechanics and the game should technically work once I fix up any bugs. However, there are still bugs: quite a few of them, actually, since I kinda just brute forced my way through this stage of development with code that I thought should work. Anyway, once I get any bugs that stop me from running the game sorted out, I’ll refine the bugs that are impacting gameplay (there are def gonna be a couple of bugs there too). Then I’ll probably get started on designing a main menu.
Ok so I went and fixed all the bugs, there were a LOT of bugs. here’s a couple: Snake movement and apple generation were happening incorrectly; I use a system where different variables like appleX, appleY, and an array for x and y values of each snake segment are stored as values between 1 and the length of the board (boardDim). They’re then multiplied by the dimension of each cell(cellDim). I initially forgot to multiply by cellDim so the snake was moving at a 1 pixel/second speed and the apple was confined to the top left corner. The borders of the cells were not being generated I didn’t initialize the arrays that contain the positions for each of the snake’s segments, causing the game to not run at all initially Up and down controls were reversed; borders did not work If you mash 2 directions, you can crash: e.g. if you’re going up, then mash left and down, the program interprets your down input as the latest one and essentially pushes you into yourself There are probably some more I haven’t explored yet, but for now I’m gonna work on the main menu.
It’s been a hot minute since I posted a devlog, but I think I’ve more or less finished the game. Here’s what I’ve added: Interactive buttons that let you toggle/change the snake’s speed, size of the board, and different modifiers such as disabled collisions and mines that spawn randomly on the map Fixed a bunch of pre-existing bugs (like with score tracking) and new bugs (working out the mines was so annoying holy) yeah that’s pretty much it I think. Next steps: I’ll look into making it resizable/of different dimensions. Honestly, I might not do this one because a lot of my positions/coordinates were hard coded so it might be a pain to rework, but I’ll think about it. I’ll fix any remaining bugs that I can catch. I know there’s one that crashes the snake if you try to mash two directions together. And last but not least, I’m gonna start preparing to ship!
I just fixed two bugs/issues: Made it so you can no longer click a button while the game is running Fixed a bug where if you mashed two inputs in the same frame, your snake could crash (e.g. moving down and mashing the right and up inputs). I fixed this by adding a check to make sure you can only switch directions once per frame. How I did it: I made a boolean called hasMoved, set it to false, and made it check for if hasMoved was false. It also sets hasMoved to true after you change direction and sets it back to false at the end of the frame.
Ships:
I started learning Java at the beginning of June, and to test my skills I recreated Snake in Java. You can control the snake using WASD/arrow keys, and reset the game using R. It features modifiers that let you adjust the snake’s speed and board size, and you can enable other modifiers as well. During development, I faced a lot of minor challenges caused by me writing something incorrectly and then battling with the bug for 5-10 minutes or so. Since it’s my first project made using Java, I tried to do most things on my own but I did reference a video if I got too stuck on one thing. However, I’m super proud of achieving this, for two main reasons: It’s my first project made in Java, and it’s actually usable and fun to play. It’s a functional game that people can play. This is especially important because I’m planning to make a platformer in C++ soon, so this was a nice warmup for game development. Anyway, I hope you enjoy my Snake game! :)...
|
1792982978.435005
|
1793069378.435005
|
|
6857
|
CITY-41 by @BirotTheBrave | Stardance
|
BirotTheBrave
|
1
|
23.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-23T04:03:57Z", "hours": 23.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I intended to make a game, but ran out of spare time and worked on other projects instead. All I ended up making was a broken first level because i do not understand enemy ai, but the godot project is public and all i did was a save system, a mission system and the player movement", "repo": "https://github.com/birot-the-brave/CITY-41-GODOT", "demo": "https://github.com/birot-the-brave/CITY-41-GODOT/releases/tag/V0.001"}]...
|
[{"post_id": 45098, "ts": "202 [{"post_id": 45098, "ts": "2026-08-11T11:21:59Z", "hours": 7.7197, "text": "hello hi another devlog, not much visually to show BUUUUT… i have made a fair bit of progress, my player movement is a lot cleaner than it was, my mission system works great. and i am working on adding enemies at the moment. i originally planned for this to be an open world game but as this is a very early version, i might make it a linear level-to-level design, then when i remake the game in cryengine, ill make it open world properly c: right now i am trying to get all my main systems working, then i want to polish my level design for the first mission before moving onto the rest of the game. i plan for like half of the game to be done by the end of stardance :3 love y’all"}, {"post_id": 27062, "ts": "2026-07-12T08:36:36Z", "hours": 8.0361, "text": "big log this time lol, needa be more frequent with these. added weapons with their own stats and such (need to add projectile weapons still </3), a modular mission system which lets me easily change if a mission is linear or not, plus it’s tasks, description, if each step autosaves or not, etc. also implemented damage for the weapons, headshots deal more damage than body shots, and damage varies slightly with every shot. idk what else to log, right now i’m trying to get the tutorial area done, and basic enemy ai stuff done, then i’ll focus on my open world and mission structuring."}, {"post_id": 21443, "ts": "2026-07-03T12:16:28Z", "hours": 7.3194, "text": "first devlog! mainly just initial project setup for my game, brief summary is story-driven fast paced fps but blah blah. main stuff i did was setting up a save system, multiple save files in a file select menu, and basic movement/player camera."}]...
|
Title: CITY-41 by @BirotTheBrave | Stardance
Devl Title: CITY-41 by @BirotTheBrave | Stardance
Devlogs:
first devlog! mainly just initial project setup for my game, brief summary is story-driven fast paced fps but blah blah. main stuff i did was setting up a save system, multiple save files in a file select menu, and basic movement/player camera.
big log this time lol, needa be more frequent with these. added weapons with their own stats and such (need to add projectile weapons still </3), a modular mission system which lets me easily change if a mission is linear or not, plus it’s tasks, description, if each step autosaves or not, etc. also implemented damage for the weapons, headshots deal more damage than body shots, and damage varies slightly with every shot. idk what else to log, right now i’m trying to get the tutorial area done, and basic enemy ai stuff done, then i’ll focus on my open world and mission structuring.
hello hi another devlog, not much visually to show BUUUUT… i have made a fair bit of progress, my player movement is a lot cleaner than it was, my mission system works great. and i am working on adding enemies at the moment. i originally planned for this to be an open world game but as this is a very early version, i might make it a linear level-to-level design, then when i remake the game in cryengine, ill make it open world properly c: right now i am trying to get all my main systems working, then i want to polish my level design for the first mission before moving onto the rest of the game. i plan for like half of the game to be done by the end of stardance :3 love y’all
Ships:
I intended to make a game, but ran out of spare time and worked on other projects instead. All I ended up making was a broken first level because i do not understand enemy ai, but the godot project is public and all i did was a save system, a mission system and the player movement...
|
1793008187.366314
|
1793094587.366314
|
|
6861
|
Evolution Simulator by @charr2028 | Stardance
|
charr2028
|
1
|
11.0
|
66
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-10T16:39:39Z", "hours": 11.0, "multiplier": 5.97, "payout": 66, "blessing": "neutral", "text": "I have finally finished my evolution simulator! It is browser based and hosted on GitHub pages. I made it using Vanilla JavaScript, HTML, and CSS. The main issue I encountered was major population spikes that I could not for the life of me figure out, but in the end it turned out I was just seriously overcomplicating things lol! I thought it was some kind of bug, but all I needed to do was increase the breeding cooldown. I am very proud of this project, because the making of this was so smooth for one of my bigger projects! Sure there were bugs, but I was fairly easily able to fix most of them with some console logs and elbow grease. There were only a few that I needed some external help identifying, but ChatGPT quickly pointed out the faulty code. Once I knew where the problems were at I could fix them no problem. I’m also proud of how quickly I could whip up my HTML layout and CSS styling, and the movement animation and grid generation too. I thought they would be super hard to do, but then they worked, like, first try lol. I feel like everything is pretty obvious, but just in case… The slider adjusts the speed of the simulation. To regenerate the environment and reset the simulation, refresh the page. There are 5 important colors in the simulator: Red. This is for food sources. Light Blue. This is for water sources. Dark Blue. This is for male pixel creatures. Pink. This is for female pixel creatures. Green. This is for disease cells. (my beautiful plague children <3)", "repo": "https://github.com/P1x3l-W0lf/evolution_simulator", "demo": "https://p1x3l-w0lf.github.io/evolution_simulator/"}]...
|
[{"post_id": 6250, "ts": "2026 [{"post_id": 6250, "ts": "2026-06-10T14:38:36Z", "hours": 0.6667, "text": "I added the speed adjustment slider! Now you don’t have to be bored to tears watching the little pixels crawl around the grid lol! It was harder than I thought it would be. Apparently setInterval does not update the timeout without a bunch of intervention. Also, I got a picture with the disease pixels that I mentioned in my last devlog. Behold my green little plague children!"}, {"post_id": 6003, "ts": "2026-06-10T02:08:53Z", "hours": 4.5697, "text": "I made a lot of changes and forgot to post devlogs…. I also realized that I have been forgetting to update the github repo as I work… oopsies! 😅 ======= This one’s gonna be a long one! I tried making it so only the males could look for mates or produce offspring (Fun Fact: I made it so the males were the one’s who had the babies, just like seahorses!), I added a large breed timeout so that they couldn’t just breed again and again right away, and lots and lots of other ways to reduce the population spikes, but none of them really worked. So instead I introduced a way to quickly kill of large groups so that they wouldn’t fill the whole grid. Disease! ======= To kinda replicate what happens irl when populations of a species get too dense, I added a sickness that targets and kills any of the creatures it comes into contact with. I did not think to get a picture of them for some reason 🤦♀️ but they work very similar to the pixel creatures, except that there is no hunger or thirst factors, they are lime green, and I actually put the effort into giving them a function to assess the surrounding pixels and determine if there is something of interest in that area. If they find something they want to get closer to, namely creatures they want to contaminate, then they will start heading in that direction. ======= The disease helped keep the population lower, but it still let the creatures reproduce too quickly so I also put a cap on how high the population will get before going temporarily infertile. They were still hitting the threshold for infertility very quickly and the population rarely if ever got low enough to fully eliminate the disease. ======= I was kinda tired of wrestling with the crazy overbreeding bugs by now, so I moved on to some other bugs and fine tuning. I gave the creatures the ability to assess their surroundings, just like the disease cells, and get up close to food, water, and eligible mates instead of just completing their respective interactions from a long distance. In doing so I ended up scrapping my initial attempt at a “search” function so that I could optimize my code a bit. I screwed it up so bad that the creatures didn’t even spawn anymore! I tried fixing a few things, but could not for the life of me figure out how to fix the glaring frontend issues. I had ChatGPT take a look at my code, and it pointed out about a gazillion different errors it found. After fixing those up, I got the creatures back and my code working again. The population spikes were a bit better too because one of the errors it pointed out was that I was only checking whether the males’ breed timeout was finished, not the females’, so they could immediately breed with the next male they came across. Adding a cool down to the females helped a ton, plus I made the cooldown drop by 0.5 per second instead of 1 per second. I also added a visual representation of the stats into the HTML page so that users can see the population evolve instead of just taking my word for it lol. All I think it needs now is an option to speed up the simulation since it is pretty slow and can get very boring very quickly."}, {"post_id": 5002, "ts": "2026-06-08T17:29:15Z", "hours": 2.8483, "text": "Added a lot of features, discovered so many bugs ToT I made food and water sources, represented by the big red and blue squares, which the creatures will search for if their hunger or thirst levels get too low. If either of those levels hit zero, the creature dies and gets removed from the board. This introduced some errors because I had to remove the creature from the dictionary holding it, leaving a gap in my numerically organized keys. I tried solving this by adding the deleted key to a list of open keys that will be reused when creating new creatures instead of just randomly generating a new one. I’m still not sure if it worked though, because… The mating feature is so broken. I made it so that the creatures are either AFAB or AMAB, and they are color coded accordingly (pink for female, blue for male). I’m thinking about adding a third gender that can reproduce asexually, but that’s a task for future me lol. Right now they will immediately reproduce with any creature of the opposite gender within range if they’re above critical hunger and thirst levels. This is a problem because now they are making so many babies that they are freezing the window! I need to fix it so that I can properly debug the code and see if my fix for the death errors is actually working. Plus there is a whole wall of error messages in the console before it freezes up, so I need to decipher and fix those too. I’ve got my work cut out for me!"}, {"post_id": 2391, "ts": "2026-06-04T20:56:30Z", "hours": 1.9311, "text": "Added basic pixel creatures! I made them bright pink now instead of just plain white, but also might change that in the future. I created a JS creature class (OOP is so much easier in JS than Python!) so that I could make lots of creatures with less code and I added movement logic. Right now they pick a random direction to go in, and I have them looped so that they will keep going in that direction for a few steps before picking a new one. This prevents them from just moving back and forth and it also makes it look better to have them make a little progress before turning around. I added edge and object detection logic so that they don’t go off the grid and they won’t walk on each other. Now I need to add hunger, thirst, and death detection along with sources of water and food."}, {"post_id": 1849, "ts": "2026-06-04T01:59:11Z", "hours": 1.01, "text": "Started the project, already made a good amount of progress! I haven’t coded in a while so it took me a bit to remember some of the basic things, like using src in the HTML script tag instead of link or href lol (that one always trips me up if it’s been a while!). Other than small setbacks like that, it’s been almost concerningly bug free. I got my CSS settings to make a permanently dark mode grid layout, and I used JS to add 1600 div elements to a container div, creating a 40x40 grid of cells. The white cell is the beginnings of one of the pixel creatures. Right now it doesn’t do anything, but I’m about to start on the movement function to make it walk around the grid so it can eventually look for food, water, and other creature pixels. Wish me luck!"}]...
|
Title: Evolution Simulator by @charr2028 | Stardan Title: Evolution Simulator by @charr2028 | Stardance
Devlogs:
Started the project, already made a good amount of progress! I haven’t coded in a while so it took me a bit to remember some of the basic things, like using src in the HTML script tag instead of link or href lol (that one always trips me up if it’s been a while!). Other than small setbacks like that, it’s been almost concerningly bug free. I got my CSS settings to make a permanently dark mode grid layout, and I used JS to add 1600 div elements to a container div, creating a 40x40 grid of cells. The white cell is the beginnings of one of the pixel creatures. Right now it doesn’t do anything, but I’m about to start on the movement function to make it walk around the grid so it can eventually look for food, water, and other creature pixels. Wish me luck!
Added basic pixel creatures! I made them bright pink now instead of just plain white, but also might change that in the future. I created a JS creature class (OOP is so much easier in JS than Python!) so that I could make lots of creatures with less code and I added movement logic. Right now they pick a random direction to go in, and I have them looped so that they will keep going in that direction for a few steps before picking a new one. This prevents them from just moving back and forth and it also makes it look better to have them make a little progress before turning around. I added edge and object detection logic so that they don’t go off the grid and they won’t walk on each other. Now I need to add hunger, thirst, and death detection along with sources of water and food.
Added a lot of features, discovered so many bugs ToT I made food and water sources, represented by the big red and blue squares, which the creatures will search for if their hunger or thirst levels get too low. If either of those levels hit zero, the creature dies and gets removed from the board. This introduced some errors because I had to remove the creature from the dictionary holding it, leaving a gap in my numerically organized keys. I tried solving this by adding the deleted key to a list of open keys that will be reused when creating new creatures instead of just randomly generating a new one. I’m still not sure if it worked though, because… The mating feature is so broken. I made it so that the creatures are either AFAB or AMAB, and they are color coded accordingly (pink for female, blue for male). I’m thinking about adding a third gender that can reproduce asexually, but that’s a task for future me lol. Right now they will immediately reproduce with any creature of the opposite gender within range if they’re above critical hunger and thirst levels. This is a problem because now they are making so many babies that they are freezing the window! I need to fix it so that I can properly debug the code and see if my fix for the death errors is actually working. Plus there is a whole wall of error messages in the console before it freezes up, so I need to decipher and fix those too. I’ve got my work cut out for me!
I made a lot of changes and forgot to post devlogs…. I also realized that I have been forgetting to update the github repo as I work… oopsies! 😅 ======= This one’s gonna be a long one! I tried making it so only the males could look for mates or produce offspring (Fun Fact: I made it so the males were the one’s who had the babies, just like seahorses!), I added a large breed timeout so that they couldn’t just breed again and again right away, and lots and lots of other ways to reduce the population spikes, but none of them really worked. So instead I introduced a way to quickly kill of large groups so that they wouldn’t fill the whole grid. Disease! ======= To kinda replicate what happens irl when populations of a species get too dense, I added a sickness that targets and kills any of the creatures it comes into contact with. I did not think to get a picture of them for some reason 🤦♀️ but they work very similar to the pixel creatures, except that there is no hunger or thirst factors, they are lime green, and I actually put the effort into giving them a function to assess the surrounding pixels and determine if there is something of interest in that area. If they find something they want to get closer to, namely creatures they want to contaminate, then they will start heading in that direction. ======= The disease helped keep the population lower, but it still let the creatures reproduce too quickly so I also put a cap on how high the population will get before going temporarily infertile. They were still hitting the threshold for infertility very quickly and the population rarely if ever got low enough to fully eliminate the disease. ======= I was kinda tired of wrestling with the crazy overbreeding bugs by now, so I moved on to some other bugs and fine tuning. I gave the creatures the ability to assess their surroundings, just like the disease cells, and get up close to food, water, and eligible mates instead of just completing their respective interactions from a long distance. In doing so I ended up scrapping my initial attempt at a “search” function so that I could optimize my code a bit. I screwed it up so bad that the creatures didn’t even spawn anymore! I tried fixing a few things, but could not for the life of me figure out how to fix the glaring frontend issues. I had ChatGPT take a look at my code, and it pointed out about a gazillion different errors it found. After fixing those up, I got the creatures back and my code working again. The population spikes were a bit better too because one of the errors it pointed out was that I was only checking whether the males’ breed timeout was finished, not the females’, so they could immediately breed with the next male they came across. Adding a cool down to the females helped a ton, plus I made the cooldown drop by 0.5 per second instead of 1 per second. I also added a visual representation of the stats into the HTML page so that users can see the population evolve instead of just taking my word for it lol. All I think it needs now is an option to speed up the simulation since it is pretty slow and can get very boring very quickly.
I added the speed adjustment slider! Now you don’t have to be bored to tears watching the little pixels crawl around the grid lol! It was harder than I thought it would be. Apparently setInterval does not update the timeout without a bunch of intervention. Also, I got a picture with the disease pixels that I mentioned in my last devlog. Behold my green little plague children!
Ships:
I have finally finished my evolution simulator! It is browser based and hosted on GitHub pages. I made it using Vanilla JavaScript, HTML, and CSS. The main issue I encountered was major population spikes that I could not for the life of me figure out, but in the end it turned out I was just seriously overcomplicating things lol! I thought it was some kind of bug, but all I needed to do was increase the breeding cooldown. I am very proud of this project, because the making of this was so smooth for one of my bigger projects! Sure there were bugs, but I was fairly easily able to fix most of them with some console logs and elbow grease. There were only a few that I needed some external help identifying, but ChatGPT quickly pointed out the faulty code. Once I knew where the problems were at I could fix them no problem. I’m also proud of how quickly I could whip up my HTML layout and CSS styling, and the movement animation and grid generation too. I thought they would be super hard to do, but then they worked, like, first try lol. I feel like everything is pretty obvious, but just in case… The slider adjusts the speed of the simulation. To regenerate the environment and reset the simulation, refresh the page. There are 5 important colors in the simulator: Red. This is for food sources. Light Blue. This is for water sources. Dark Blue. This is for male pixel creatures. Pink. This is for female pixel creatures. Green. This is for disease cells. (my beautiful plague children <3)...
|
1792968875.721452
|
1793055275.721452
|
|
6915
|
Om Daily by @aahish_abbani | Stardance
|
aahish_abbani
|
1
|
22.0
|
194
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T19:12:17Z", "hours": 22.0, "multiplier": 10.27, "payout": 194, "blessing": "neutral", "text": "I made Om daily, a way to understand hindusim through little games, like duolingo but for religion. But its not jsut learning there are daily quotes of the Bhagavad Gita, a famous book of hinduism, and all 700 verses in the backend. This was my first ever mobile app make in react native with the expo framework and it was a challenge getting started, I didnt really understand how most of it worked like devlopement servers, stuff like that. But over time I learned a lot about how to actualyl code and use a backend. another thing, this was my first ever project with a backend so I used supabase as my backend and I learned how to do Oauth, store users information safely. The app itself is packed with so many features and going forward I really want to improve on it more and more!", "repo": "https://github.com/kinghightech/om-daily", "demo": "https://apps.apple.com/app/om-daily/id6778643150"}]...
|
[{"post_id": 20878, "ts": "202 [{"post_id": 20878, "ts": "2026-07-02T16:26:24Z", "hours": 13.0297, "text": "So I to be honest was so locked in on working on this i lowkey forgot ot keep up with the devlogs which is something going forward i need to fix! But good news i have got it up and running on the app store!!! so u can download it actually and test it out. it does require a sign up/sign unfortunately to save ur progress if you are fine with that I spent so much time and effort into this app and it would be great if i can get some good feedback!"}, {"post_id": 2536, "ts": "2026-06-05T02:20:43Z", "hours": 9.0192, "text": "I’m building Om Daily, a mobile app that helps people learn Hinduism through daily Bhagavad Gita verses, prayers, meanings, and simple lessons. It makes spiritual learning easy, beautiful, and consistent with features like verse saving, prayer translations, widgets, and daily wisdom reminders. Hey, I’m working on om Daily. Dharma Daily is an app. We used Expo, React Native, and a lot of TypeScript to make the app. I really wanted to focus on the app, making it feel premium. today i added another prayer to the app and designed the splash screen with canva!"}]...
|
Title: Om Daily by @aahish_abbani | Stardance
Dev Title: Om Daily by @aahish_abbani | Stardance
Devlogs:
I’m building Om Daily, a mobile app that helps people learn Hinduism through daily Bhagavad Gita verses, prayers, meanings, and simple lessons. It makes spiritual learning easy, beautiful, and consistent with features like verse saving, prayer translations, widgets, and daily wisdom reminders. Hey, I’m working on om Daily. Dharma Daily is an app. We used Expo, React Native, and a lot of TypeScript to make the app. I really wanted to focus on the app, making it feel premium. today i added another prayer to the app and designed the splash screen with canva!
So I to be honest was so locked in on working on this i lowkey forgot ot keep up with the devlogs which is something going forward i need to fix! But good news i have got it up and running on the app store!!! so u can download it actually and test it out. it does require a sign up/sign unfortunately to save ur progress if you are fine with that I spent so much time and effort into this app and it would be great if i can get some good feedback!
Ships:
I made Om daily, a way to understand hindusim through little games, like duolingo but for religion. But its not jsut learning there are daily quotes of the Bhagavad Gita, a famous book of hinduism, and all 700 verses in the backend. This was my first ever mobile app make in react native with the expo framework and it was a challenge getting started, I didnt really understand how most of it worked like devlopement servers, stuff like that. But over time I learned a lot about how to actualyl code and use a backend. another thing, this was my first ever project with a backend so I used supabase as my backend and I learned how to do Oauth, store users information safely. The app itself is packed with so many features and going forward I really want to improve on it more and more!...
|
1792882113.3175633
|
1793746113.3175633
|
|
6937
|
Knicks Light Switch Case by @LoginlikeLogan | Star Knicks Light Switch Case by @LoginlikeLogan | Stardance...
|
LoginlikeLogan
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T18:43:40Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a super fun knicks case that is fully 3d printable or if it works(idk), lasercuttable!", "repo": "https://github.com/Logdegret/Knicks-Light-Switch-Case", "demo": ""}]...
|
[{"post_id": 5238, "ts": "2026 [{"post_id": 5238, "ts": "2026-06-08T23:01:54Z", "hours": 2.8164, "text": "Finished building and 3d modleing the all star knicks light switch case!"}]...
|
Title: Knicks Light Switch Case by @LoginlikeLogan Title: Knicks Light Switch Case by @LoginlikeLogan | Stardance
Devlogs:
Finished building and 3d modleing the all star knicks light switch case!
Ships:
I made a super fun knicks case that is fully 3d printable or if it works(idk), lasercuttable!...
|
1792878477.8290584
|
1793742477.8290584
|
|
6950
|
Pulse by @ishaangulati | Stardance
|
ishaangulati
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T18:16:15Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Pulse is a social paper trading app built specifically for teens. The problem is simple: most people under 18 legally can’t open a brokerage account, and even for those who can, throwing real money at stocks before you understand what you’re doing is a terrible idea. But the existing alternatives, paper trading apps and stock simulators, are all built for adults and feel like spreadsheets. There’s no social element, no reason to come back, no one to compete with. Pulse fixes that by combining real-time paper trading with a social layer designed around how teens actually use apps. You get a virtual portfolio seeded with fake money and you trade real stocks at live market prices. Every buy, every sell, every position is tracked exactly like it would be in a real brokerage. You build intuition for how markets move, what volatility actually feels like, and how hard it is to time an exit, without ever risking a dollar. This update shipped the social infrastructure that makes all of that actually fun. You can follow other traders and watch their moves appear in your feed in real time. You can create a group with your friends, see eachother on a shared leaderboard, and compete on portfolio returns over time. You can put a face to your handle with a profile picture. And the whole UI got rebuilt from the ground up to feel faster and cleaner. The most challenging part was the social feed. The naive approach of re-fetching on every action felt laggy and broke the illusion that anything was live. So the feed runs on Firestore real-time listeners, meaning updates push to every client the moment they’re written. That introduced a new problem: follow and unfollow actions felt slow because they waited on the server before updating the UI. I switched to optimistic updates, where the UI changes immediately and then syncs in the background, with rollback logic if the write fails. Getting that rollback to behave correctly in edge cases, like a user rapidly tapping follow/unfollow, took way more debugging than I expected. The leaderboard had its own set of problems. Calculating portfolio returns client-side worked fine with two or three users in a group but got noticeably slow as groups got bigger. I moved the PnL calculation server-side and trigger a recalculation on every trade write instead. The client just reads the result. Much faster and the rankings update in real time without anyone doing math on their phone. Profile pictures had a sneaky issue too: users were uploading full-resolution photos straight from their camera roll and Firebase Storage costs scale with bytes stored and transferred. I added client-side image compression before the upload and hard cap everything at 200 KB. The quality is still totally fine and the cost difference is significant. What I’m most proud of is that this is a real shipped iOS app on the App Store with over 100 users that actual teenagers are using to learn investing. It’s not a demo, it’s not a prototype running on localhost. The live market data is real, the social features work, and the leaderboard updates when your friend makes a trade from across the country. Building something that functions at that level while also being genuinely fun to use is what I set out to do. To test it, download Pulse from the App Store on an iPhone, create an account, and you’ll start with a virtual portfolio. Place a few trades on any stock you recognize, then find another user to follow and watch their activity show up in your feed. If you want to test the group leaderboard, create a group and share the code. Check it out at tinyurl.com/pulseofficial", "repo": "https://github.com/ishaan-gulati/pulse_official", "demo": "https://apps.apple.com/us/app/pulse-social-paper-trading/id6760734269"}]...
|
[{"post_id": 11407, "ts": "202 [{"post_id": 11407, "ts": "2026-06-18T17:52:13Z", "hours": 6.8383, "text": "Pulse devlog, v1.1. Pulse just got a social layer. The big focus this update was making the app actually feel alive. Paper trading in isolation is fine for learning, but competing and building with friends is what makes it stick, so I spent this session wiring up the core social infrastructure. Friends & Following lets you find and follow other traders and see their activity in your feed in real time. Follow relationships are stored in Firestore with live listeners so updates come through instantly without polling. Groups lets you create a crew and compete on portfolio returns. Leaderboard rankings are calculated server-side on write so the client never has to do heavy math. Profile Pictures mean you can finally put a face to the handle. Images get compressed under 200 KB on the client before uploading to keep storage costs reasonable. UI Improvements include a full app redesign, a contrast pass across every screen, and a spacing system refactor that brought load time down around 18%. Up next: DMs, trade reactions, push notifications for follower activity, and a proper onboarding flow for new users. Check it out at tinyurl.com/pulseofficial"}]...
|
Title: Pulse by @ishaangulati | Stardance
Devlogs Title: Pulse by @ishaangulati | Stardance
Devlogs:
Pulse devlog, v1.1. Pulse just got a social layer. The big focus this update was making the app actually feel alive. Paper trading in isolation is fine for learning, but competing and building with friends is what makes it stick, so I spent this session wiring up the core social infrastructure. Friends & Following lets you find and follow other traders and see their activity in your feed in real time. Follow relationships are stored in Firestore with live listeners so updates come through instantly without polling. Groups lets you create a crew and compete on portfolio returns. Leaderboard rankings are calculated server-side on write so the client never has to do heavy math. Profile Pictures mean you can finally put a face to the handle. Images get compressed under 200 KB on the client before uploading to keep storage costs reasonable. UI Improvements include a full app redesign, a contrast pass across every screen, and a spacing system refactor that brought load time down around 18%. Up next: DMs, trade reactions, push notifications for follower activity, and a proper onboarding flow for new users. Check it out at tinyurl.com/pulseofficial
Ships:
Pulse is a social paper trading app built specifically for teens. The problem is simple: most people under 18 legally can’t open a brokerage account, and even for those who can, throwing real money at stocks before you understand what you’re doing is a terrible idea. But the existing alternatives, paper trading apps and stock simulators, are all built for adults and feel like spreadsheets. There’s no social element, no reason to come back, no one to compete with. Pulse fixes that by combining real-time paper trading with a social layer designed around how teens actually use apps. You get a virtual portfolio seeded with fake money and you trade real stocks at live market prices. Every buy, every sell, every position is tracked exactly like it would be in a real brokerage. You build intuition for how markets move, what volatility actually feels like, and how hard it is to time an exit, without ever risking a dollar. This update shipped the social infrastructure that makes all of that actually fun. You can follow other traders and watch their moves appear in your feed in real time. You can create a group with your friends, see eachother on a shared leaderboard, and compete on portfolio returns over time. You can put a face to your handle with a profile picture. And the whole UI got rebuilt from the ground up to feel faster and cleaner. The most challenging part was the social feed. The naive approach of re-fetching on every action felt laggy and broke the illusion that anything was live. So the feed runs on Firestore real-time listeners, meaning updates push to every client the moment they’re written. That introduced a new problem: follow and unfollow actions felt slow because they waited on the server before updating the UI. I switched to optimistic updates, where the UI changes immediately and then syncs in the background, with rollback logic if the write fails. Getting that rollback to behave correctly in edge cases, like a user rapidly tapping follow/unfollow, took way more debugging than I expected. The leaderboard had its own set of problems. Calculating portfolio returns client-side worked fine with two or three users in a group but got noticeably slow as groups got bigger. I moved the PnL calculation server-side and trigger a recalculation on every trade write instead. The client just reads the result. Much faster and the rankings update in real time without anyone doing math on their phone. Profile pictures had a sneaky issue too: users were uploading full-resolution photos straight from their camera roll and Firebase Storage costs scale with bytes stored and transferred. I added client-side image compression before the upload and hard cap everything at 200 KB. The quality is still totally fine and the cost difference is significant. What I’m most proud of is that this is a real shipped iOS app on the App Store with over 100 users that actual teenagers are using to learn investing. It’s not a demo, it’s not a prototype running on localhost. The live market data is real, the social features work, and the leaderboard updates when your friend makes a trade from across the country. Building something that functions at that level while also being genuinely fun to use is what I set out to do. To test it, download Pulse from the App Store on an iPhone, create an account, and you’ll start with a virtual portfolio. Place a few trades on any stock you recognize, then find another user to follow and watch their activity show up in your feed. If you want to test the group leaderboard, create a group and share the code. Check it out at tinyurl.com/pulseofficial...
|
1792990417.1369863
|
1793076817.1369863
|
|
6994
|
Hilopad by @ahclip89 | Stardance
|
ahclip89
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T19:29:27Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hilopad It has A 3x2 grid of mechanical switches A radial dial A 0.9” OLED panel A 2x8 LED matrix Render (Attached image) I made sure to include several peepholes to see the PCB. The Schemetic As you can see, the entire thing will be controlled by a Module-Seeeduino-XIAO. The 6 buttons and rotary switch are all routed through a 2x4 matrix. I also added a 2x8 RGB LED matrix, but I have not used it in the current firmware. In the future, I plan to make it an audio visualizer. Lastly, I have an OLED panel. It will display the current keyboard layout that is controlled by the encoder. (I only have 2 right now) The PCB This was my first time designing a PCB, so it is probably very messy. I rerouted it a couple of times due to errors in the schematic, and I learned a lot. Overall, I am very proud of it. I also had fun adding silkscreen art. The Case I designed the case in Fusion 360, which I had just taken a class for during my freshman year. I added holes for all the buttons and art, as well as some more for the fun of it. BOM 1 Seeed XIAO RP2040 7 through-hole 1N4148 Diodes 6 MX-Style switches 1 EC11 Rotary encoder 1 0.91 inch OLED display (pin order: GND-VCC-SCL-SDA) 6 DSA keycaps 16 SK6812 MINI-E LEDs 4 M3x16mm screws 4 M3x5mx4mm heatset inserts", "repo": "https://github.com/ahclip89/My-Hackpad", "demo": ""}]...
|
[{"post_id": 8283, "ts": "2026 [{"post_id": 8283, "ts": "2026-06-13T19:34:47Z", "hours": 3.0, "text": "Created the firmware and README I finished making the firmware for my keyboard as well as creating a render and submitting the GitHub repo with a README."}, {"post_id": 3230, "ts": "2026-06-06T01:55:11Z", "hours": 1.0, "text": "I Finished The Case For My Hackpad The case will have slots for all the buttons and lights, as well as a hole to see the mural and a vent-looking thing to peek at the diodes."}, {"post_id": 2562, "ts": "2026-06-05T03:50:19Z", "hours": 3.0, "text": "I finished the PCB design for my hackpad. It will have: a 2x3 button array a radial dial a 2x8 LED array I plan to use the LED array as an audio visualizer or volume percentage. The OLED will likely display the CPU’s temperature."}]...
|
Title: Hilopad by @ahclip89 | Stardance
Devlogs:
Title: Hilopad by @ahclip89 | Stardance
Devlogs:
I finished the PCB design for my hackpad. It will have: a 2x3 button array a radial dial a 2x8 LED array I plan to use the LED array as an audio visualizer or volume percentage. The OLED will likely display the CPU’s temperature.
I Finished The Case For My Hackpad The case will have slots for all the buttons and lights, as well as a hole to see the mural and a vent-looking thing to peek at the diodes.
Created the firmware and README I finished making the firmware for my keyboard as well as creating a render and submitting the GitHub repo with a README.
Ships:
Hilopad It has A 3x2 grid of mechanical switches A radial dial A 0.9” OLED panel A 2x8 LED matrix Render (Attached image) I made sure to include several peepholes to see the PCB. The Schemetic As you can see, the entire thing will be controlled by a Module-Seeeduino-XIAO. The 6 buttons and rotary switch are all routed through a 2x4 matrix. I also added a 2x8 RGB LED matrix, but I have not used it in the current firmware. In the future, I plan to make it an audio visualizer. Lastly, I have an OLED panel. It will display the current keyboard layout that is controlled by the encoder. (I only have 2 right now) The PCB This was my first time designing a PCB, so it is probably very messy. I rerouted it a couple of times due to errors in the schematic, and I learned a lot. Overall, I am very proud of it. I also had fun adding silkscreen art. The Case I designed the case in Fusion 360, which I had just taken a class for during my freshman year. I added holes for all the buttons and art, as well as some more for the fun of it. BOM 1 Seeed XIAO RP2040 7 through-hole 1N4148 Diodes 6 MX-Style switches 1 EC11 Rotary encoder 1 0.91 inch OLED display (pin order: GND-VCC-SCL-SDA) 6 DSA keycaps 16 SK6812 MINI-E LEDs 4 M3x16mm screws 4 M3x5mx4mm heatset inserts...
|
1793065777.9825199
|
1793152177.9825199
|
|
6996
|
Gesture Link by @Mokxsh_ | Stardance
|
|
1
|
16.11
|
172
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-07T13:09:37Z", "hours": 15.0, "multiplier": 16.62, "payout": 172, "blessing": "neutral", "text": "What did you make? I built Gesture Link, a wearable assistive communication system designed to help visually impaired, hearing impaired, and speech impaired individuals communicate more easily. The project consists of three devices: Visora, a pair of AI-powered smart glasses that can identify objects and colors; Glove A, which converts hand gestures into spoken phrases; and Glove B, which converts speech into tactile Braille using vibration motors. Together, they create a real-time communication bridge that works completely offline. What was the challenge? The main problem I wanted to solve was that many people with disabilities face communication barriers every day, and most existing solutions are either expensive, require internet access, or only address a single disability. I wanted to create a system that could help different groups communicate with each other directly. From a technical side, the biggest challenge was getting multiple hardware devices, sensors, computer vision models, speech processing systems, and haptic feedback mechanisms to work together reliably. Since everything runs locally, I also had to optimize the software to work efficiently on resource-constrained hardware. What are you proud of? I’m proud that I was able to take a real-world problem affecting billions of people and turn it into a complete working ecosystem rather than just a concept or a single prototype. Gesture Link combines computer vision, speech technology, wearable electronics, health monitoring, and haptic feedback into one integrated system designed to make communication more accessible. Over the past two months, I worked through numerous hardware and software challenges, from sensor integration and device communication to real-time processing, to bring all three modules together into a functional solution that can genuinely improve people’s daily lives. What should people know when testing your project? Gesture Link is primarily a hardware project, so it can’t be fully tested directly from the repository. To make it as reproducible as possible, I’ve included the source code, documentation, component lists, and circuit diagrams for all the modules so anyone interested can build and test it themselves. I’m also currently working on custom PCBs for the project and plan to open-source them soon, which will make the system much easier for others to build, modify, and improve.", "repo": "https://github.com/Mokxsh404/Gesture-Link/", "demo": ""}]...
|
[{"post_id": 14938, "ts": "202 [{"post_id": 14938, "ts": "2026-06-24T08:34:49Z", "hours": 0.7842, "text": "Devlog: Visora is Finally Done !!! After roughly 40 Hours spread across the last 7 days, Visora is finally working. I genuinely thought this would be one of the easier parts of Gesture Link . I was very very wrong. Visora is the vision module of the project. The goal is simple: use an ESP32-CAM, run object detection using YOLOv8, figure out what’s around the user, and then provide audio feedback. Sounds straightforward until you actually try building it. The biggest problem was that nothing wanted to work consistently. One minute OpenCV would connect to the camera stream perfectly: cap = cv2.VideoCapture(CAM_URL) The next minute it would just sit there refusing to open the stream. while not cap.isOpened(): print(\"Cannot open stream...\") I spent hours thinking my code was broken when it turned out to be network issues, camera settings, and random ESP32-CAM problems fighting each other. Then came YOLO. Getting the model itself running wasn’t too bad. Getting it to run smoothly with a live camera stream was another story. results = model(frame, device=device)[0] Sometimes detections worked. Sometimes they didn’t. Sometimes the frame processing would slow down enough to make the whole thing feel unusable. My favorite bug was when everything looked correct. lol The camera worked. The AI worked. The ESP32 worked. The code ran without errors. And yet nothing happened. After staring at the screen for far longer than I’d like to admit, the issue ended up being something completely unrelated to where I was looking. What makes this extra painful is that the final code looks so simple. You look at it and think: That’s it? But behind every line is probably an hour of me wondering why it wasn’t working. With Glove A converting sign language into speech, Glove B converting speech into Braille through vibration motors, and Visora finally working, Gesture Link is now fully complete. 7 days 40 hours Way too much debugging ** Gesture Link is Officially Done !!**"}, {"post_id": 10527, "ts": "2026-06-17T08:57:37Z", "hours": 0.325, "text": "#Devlog: Glove A Done! Finally wrapped up Glove A! I don’t think I’ve ever spent this much time continuously debugging a single part of a project before. Since yesterday, I’ve probably put in around 20 hours trying to get everything working properly. Every time I fixed one issue, another one appeared. It started with the flex sensors. Two of them suddenly became unresponsive and started giving completely unreliable readings. Since the whole glove depends on accurately detecting finger movements, that basically meant the gesture recognition stopped working. After a lot of testing and checking connections, I ended up replacing both sensors. Then the DFPlayer decided to stop working. Naturally, I assumed it was a code issue and spent way too long looking through my program trying to figure out what I had broken. Turns out the code wasn’t the problem at all. The SD card had somehow become corrupted, which meant none of the audio files could be read. So after replacing and setting up the SD card again, the audio finally came back. At that point I thought I was done. I wasn’t. The OLED display suddenly stopped working. After even more troubleshooting, I found a wiring issue along with an address conflict that was preventing the display from communicating properly. A few rewires, some code changes, and a lot of patience later, the screen finally came back to life. After all of that debugging, soldering, rewiring, replacing components, and questioning my life choices, I’m finally here. Glove A is designed to help people with speech impairments communicate more easily. The glove recognizes hand gestures and converts them into pre-compiled speech. For example, bending a specific finger can trigger a phrase like “Hello”, and the glove will immediately speak it through the onboard speaker. Different gesture combinations can be mapped to different words or sentences, allowing the user to communicate quickly without needing to type or press buttons. I’ve attached a video showing the glove working in real time. In the demonstration, the glove detects the gesture, processes the finger positions from the flex sensors, matches it with the corresponding phrase, and instantly plays the audio output. This project might look simple from the outside, but getting all the sensors, audio modules, display, and processing logic to work together reliably was a much bigger challenge than I expected. Seeing the glove finally recognize gestures and speak them out loud made all those hours of debugging worth it. With Glove A now complete and Glove B already working, Now it’s time to focus on Visora and bring the final part of the system together."}, {"post_id": 9808, "ts": "2026-06-16T07:45:13Z", "hours": 0.0, "text": "Devlog: Glove B Completed After weeks of development, testing, and debugging, I have finally completed Glove B of Gesture Link. In the video, Glove B is working successfully and responding exactly as intended. You may notice a buzzing sound in the recording. That sound comes from the vibration motors activating to transmit Braille characters. For this demonstration, the speech input “Hello, how are you?” was converted into Braille and sent directly to the glove. Each finger contains three vibration motors. Two fingers work together to form one Braille cell, while the other two fingers form a second Braille cell. By activating specific vibration patterns, the glove communicates Braille characters through touch, allowing information to be read without visual or audio output. This marks a major milestone for the project, as the complete speech-to-Braille pipeline is now functioning on Glove B. The system can capture speech, process the text, convert it into Braille patterns, and deliver the output through haptic feedback in real time."}, {"post_id": 9067, "ts": "2026-06-15T04:29:02Z", "hours": 0.0, "text": "pulled an all nighter :D worked on the VISORA code, it had some bugs took me a while to fix them. Also added a really nice UI to it."}, {"post_id": 4196, "ts": "2026-06-07T12:47:04Z", "hours": 14.5497, "text": "almost done with the repo!"}, {"post_id": 2089, "ts": "2026-06-04T12:45:14Z", "hours": 0.0, "text": "I am currently developing a colour recognition system using an ESP32-S3 Sense camera and Python. At this stage, the ESP32-S3 Sense is being used primarily to capture and stream camera data, while all image processing and colour recognition tasks are performed locally on my computer using Python. The system is designed to detect and classify colours in real time."}]...
|
Title: Gesture Link by @Mokxsh_ | Stardance
Devlo Title: Gesture Link by @Mokxsh_ | Stardance
Devlogs:
I am currently developing a colour recognition system using an ESP32-S3 Sense camera and Python. At this stage, the ESP32-S3 Sense is being used primarily to capture and stream camera data, while all image processing and colour recognition tasks are performed locally on my computer using Python. The system is designed to detect and classify colours in real time.
almost done with the repo!
pulled an all nighter :D worked on the VISORA code, it had some bugs took me a while to fix them. Also added a really nice UI to it.
Devlog: Glove B Completed After weeks of development, testing, and debugging, I have finally completed Glove B of Gesture Link. In the video, Glove B is working successfully and responding exactly as intended. You may notice a buzzing sound in the recording. That sound comes from the vibration motors activating to transmit Braille characters. For this demonstration, the speech input “Hello, how are you?” was converted into Braille and sent directly to the glove. Each finger contains three vibration motors. Two fingers work together to form one Braille cell, while the other two fingers form a second Braille cell. By activating specific vibration patterns, the glove communicates Braille characters through touch, allowing information to be read without visual or audio output. This marks a major milestone for the project, as the complete speech-to-Braille pipeline is now functioning on Glove B. The system can capture speech, process the text, convert it into Braille patterns, and deliver the output through haptic feedback in real time.
#Devlog: Glove A Done! Finally wrapped up Glove A! I don’t think I’ve ever spent this much time continuously debugging a single part of a project before. Since yesterday, I’ve probably put in around 20 hours trying to get everything working properly. Every time I fixed one issue, another one appeared. It started with the flex sensors. Two of them suddenly became unresponsive and started giving completely unreliable readings. Since the whole glove depends on accurately detecting finger movements, that basically meant the gesture recognition stopped working. After a lot of testing and checking connections, I ended up replacing both sensors. Then the DFPlayer decided to stop working. Naturally, I assumed it was a code issue and spent way too long looking through my program trying to figure out what I had broken. Turns out the code wasn’t the problem at all. The SD card had somehow become corrupted, which meant none of the audio files could be read. So after replacing and setting up the SD card again, the audio finally came back. At that point I thought I was done. I wasn’t. The OLED display suddenly stopped working. After even more troubleshooting, I found a wiring issue along with an address conflict that was preventing the display from communicating properly. A few rewires, some code changes, and a lot of patience later, the screen finally came back to life. After all of that debugging, soldering, rewiring, replacing components, and questioning my life choices, I’m finally here. Glove A is designed to help people with speech impairments communicate more easily. The glove recognizes hand gestures and converts them into pre-compiled speech. For example, bending a specific finger can trigger a phrase like “Hello”, and the glove will immediately speak it through the onboard speaker. Different gesture combinations can be mapped to different words or sentences, allowing the user to communicate quickly without needing to type or press buttons. I’ve attached a video showing the glove working in real time. In the demonstration, the glove detects the gesture, processes the finger positions from the flex sensors, matches it with the corresponding phrase, and instantly plays the audio output. This project might look simple from the outside, but getting all the sensors, audio modules, display, and processing logic to work together reliably was a much bigger challenge than I expected. Seeing the glove finally recognize gestures and speak them out loud made all those hours of debugging worth it. With Glove A now complete and Glove B already working, Now it’s time to focus on Visora and bring the final part of the system together.
Devlog: Visora is Finally Done !!! After roughly 40 Hours spread across the last 7 days, Visora is finally working. I genuinely thought this would be one of the easier parts of Gesture Link . I was very very wrong. Visora is the vision module of the project. The goal is simple: use an ESP32-CAM, run object detection using YOLOv8, figure out what’s around the user, and then provide audio feedback. Sounds straightforward until you actually try building it. The biggest problem was that nothing wanted to work consistently. One minute OpenCV would connect to the camera stream perfectly: cap = cv2.VideoCapture(CAM_URL) The next minute it would just sit there refusing to open the stream. while not cap.isOpened(): print("Cannot open stream...") I spent hours thinking my code was broken when it turned out to be network issues, camera settings, and random ESP32-CAM problems fighting each other. Then came YOLO. Getting the model itself running wasn’t too bad. Getting it to run smoothly with a live camera stream was another story. results = model(frame, device=device)[0] Sometimes detections worked. Sometimes they didn’t. Sometimes the frame processing would slow down enough to make the whole thing feel unusable. My favorite bug was when everything looked correct. lol The camera worked. The AI worked. The ESP32 worked. The code ran without errors. And yet nothing happened. After staring at the screen for far longer than I’d like to admit, the issue ended up being something completely unrelated to where I was looking. What makes this extra painful is that the final code looks so simple. You look at it and think: That’s it? But behind every line is probably an hour of me wondering why it wasn’t working. With Glove A converting sign language into speech, Glove B converting speech into Braille through vibration motors, and Visora finally working, Gesture Link is now fully complete. 7 days 40 hours Way too much debugging ** Gesture Link is Officially Done !!**
Ships:
What did you make? I built Gesture Link, a wearable assistive communication system designed to help visually impaired, hearing impaired, and speech impaired individuals communicate more easily. The project consists of three devices: Visora, a pair of AI-powered smart glasses that can identify objects and colors; Glove A, which converts hand gestures into spoken phrases; and Glove B, which converts speech into tactile Braille using vibration motors. Together, they create a real-time communication bridge that works completely offline. What was the challenge? The main problem I wanted to solve was that many people with disabilities face communication barriers every day, and most existing solutions are either expensive, require internet access, or only address a single disability. I wanted to create a system that could help different groups communicate with each other directly. From a technical side, the biggest challenge was getting multiple hardware devices, sensors, computer vision models, speech processing systems, and haptic feedback mechanisms to work together reliably. Since everything runs locally, I also had to optimize the software to work efficiently on resource-constrained hardware. What are you proud of? I’m proud that I was able to take a real-world problem affecting billions of people and turn it into a complete working ecosystem rather than just a concept or a single prototype. Gesture Link combines computer vision, speech technology, wearable electronics, health monitoring, and haptic feedback into one integrated system designed to make communication more accessible. Over the past two months, I worked through numerous hardware and software challenges, from sensor integration and device communication to real-time processing, to bring all three modules together into a functional solution that can genuinely improve people’s daily lives. What should people know when testing your project? Gesture Link is primarily a hardware project, so it can’t be fully tested directly from the repository. To make it as reproducible as possible, I’ve included the source code, documentation, component lists, and circuit diagrams for all the modules so anyone interested can build and test it themselves. I’m also currently working on custom PCBs for the project and plan to open-source them soon, which will make the system much easier for others to build, modify, and improve....
|
1792878534.3093243
|
1793742534.3093243
|
|
7025
|
fun game yay by @lazerkat | Stardance
|
lazerkat
|
1
|
2.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T04:25:49Z", "hours": 2.0, "multiplier": 1.11, "payout": 3, "blessing": "neutral", "text": "This is a really dumb game.. why did i make this?", "repo": "https://github.com/betelguesestudios/fun-game-yay", "demo": "https://betelguesestudios.github.io/fun-game-yay/"}]...
|
[{"post_id": 4593, "ts": "2026 [{"post_id": 4593, "ts": "2026-06-07T22:59:00Z", "hours": 0.7008, "text": "more logic ig"}, {"post_id": 2567, "ts": "2026-06-05T04:14:29Z", "hours": 0.9606, "text": "now when you click on the text a bit, it shows this"}, {"post_id": 2464, "ts": "2026-06-04T23:39:51Z", "hours": 0.4158, "text": "i made it hit the floor and bounce yaya"}, {"post_id": 1936, "ts": "2026-06-04T05:40:43Z", "hours": 0.3011, "text": "added a falling effect when you click the text! now to make it hit the bottom."}]...
|
Title: fun game yay by @lazerkat | Stardance
Devl Title: fun game yay by @lazerkat | Stardance
Devlogs:
added a falling effect when you click the text! now to make it hit the bottom.
i made it hit the floor and bounce yaya
now when you click on the text a bit, it shows this
more logic ig
Ships:
This is a really dumb game.. why did i make this?...
|
1793000879.7765973
|
1793087279.7765973
|
|
7040
|
Volleyscores api by @sqnder_ | Stardance
|
sqnder_
|
1
|
12.12
|
87
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-20T15:37:54Z", "hours": 9.0, "multiplier": 9.65, "payout": 87, "blessing": "neutral", "text": "volleyscores.be is the official source for Belgian volleyball data, but it doesn’t provide a public API. This project exposes that data through a modern REST API so developers can easily integrate it into their own applications without having to reverse engineer the website themselves. You can easily test it out on the swagger ui. First search for a club/team (examples in readme) then you can use that data to fetch data from that club/team.", "repo": "https://github.com/sqnder0/volleyscoresapi", "demo": "https://volleyapi.sqnder.dev/docs"}]...
|
[{"post_id": 36844, "ts": "202 [{"post_id": 36844, "ts": "2026-07-29T05:05:47Z", "hours": 2.4444, "text": "Been refactoring scraper.py to handle seasons properly. Fixed a bunch of parsing bugs in get_team(), added get_ranking(), and ripped out the /history/{season}/ URL hack in favor of just passing a se param. Now it figures out the current season from the date so I don’t have to manually update a constant every summer. Pretty happy with it."}, {"post_id": 16351, "ts": "2026-06-26T16:32:39Z", "hours": 0.6736, "text": "While working on my other project volleystats I stumbeled upon some bugs that needed to be fixed regarding the json output, dates and times that where in the wrong place. These 40 mins also account for debugging that I did on volleystats."}, {"post_id": 12586, "ts": "2026-06-20T15:35:17Z", "hours": 0.9131, "text": "Fought with dokploy not wanting to start my container after I changed the swagger docs a little. Dokploy now does what it needs to do for deployment and my docs are up to date! (Image of me fighting dokploy)"}, {"post_id": 11767, "ts": "2026-06-19T04:42:10Z", "hours": 0.5908, "text": "Added a get team route. MVP is now ready!"}, {"post_id": 11103, "ts": "2026-06-18T05:00:42Z", "hours": 0.7661, "text": "Just finished a get_club function! You can now parse a club with the api!"}, {"post_id": 10779, "ts": "2026-06-17T18:08:26Z", "hours": 2.1753, "text": "Found the secret already existing not documented and very not easily readable api! I inplemented better api endpoints and better responses that are better documented. Glad I found this, this will speed up development so much!"}, {"post_id": 9951, "ts": "2026-06-16T14:07:28Z", "hours": 1.9142, "text": "Yipiee I updated all models and the database connector, everything works now. Test runs where OK. So I can move on!"}, {"post_id": 9285, "ts": "2026-06-15T16:17:08Z", "hours": 1.8242, "text": "Omd just learned some SQLalchemy it’s amazing. Made my first ever database mapped class, other then django models. Hopefully this works when I finish all other classes. (Gif of me looking at my sqlachemy class)"}, {"post_id": 1956, "ts": "2026-06-04T06:24:42Z", "hours": 1.095, "text": "Finished a search query function. You can now search the volleyscores web page. Next i’m working on unittests."}]...
|
Title: Volleyscores api by @sqnder_ | Stardance
D Title: Volleyscores api by @sqnder_ | Stardance
Devlogs:
Finished a search query function. You can now search the volleyscores web page. Next i’m working on unittests.
Omd just learned some SQLalchemy it’s amazing. Made my first ever database mapped class, other then django models. Hopefully this works when I finish all other classes. (Gif of me looking at my sqlachemy class)
Yipiee I updated all models and the database connector, everything works now. Test runs where OK. So I can move on!
Found the secret already existing not documented and very not easily readable api! I inplemented better api endpoints and better responses that are better documented. Glad I found this, this will speed up development so much!
Just finished a get_club function! You can now parse a club with the api!
Added a get team route. MVP is now ready!
Fought with dokploy not wanting to start my container after I changed the swagger docs a little. Dokploy now does what it needs to do for deployment and my docs are up to date! (Image of me fighting dokploy)
While working on my other project volleystats I stumbeled upon some bugs that needed to be fixed regarding the json output, dates and times that where in the wrong place. These 40 mins also account for debugging that I did on volleystats.
Been refactoring scraper.py to handle seasons properly. Fixed a bunch of parsing bugs in get_team(), added get_ranking(), and ripped out the /history/{season}/ URL hack in favor of just passing a se param. Now it figures out the current season from the date so I don’t have to manually update a constant every summer. Pretty happy with it.
Ships:
volleyscores.be is the official source for Belgian volleyball data, but it doesn’t provide a public API. This project exposes that data through a modern REST API so developers can easily integrate it into their own applications without having to reverse engineer the website themselves. You can easily test it out on the swagger ui. First search for a club/team (examples in readme) then you can use that data to fetch data from that club/team....
|
1792975983.5107374
|
1793062383.5107374
|
|
7062
|
Personal Website by @mdpham | Stardance
|
mdpham
|
1
|
1.43
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-04T08:46:45Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a personal website showcasing all my contacts, projects and skills. Before making this, I set time restrictions on myself to see what I could do in a short time and now that I have finished it, I am really proud of how nice my website turned out!", "repo": "https://github.com/mdpham412/personal-website", "demo": "https://mdpham.pages.dev/"}]...
|
[{"post_id": 2022, "ts": "2026 [{"post_id": 2022, "ts": "2026-06-04T09:33:28Z", "hours": 0.4281, "text": "took me some time to figure out the css but i got a pretty nice looking moving background going"}, {"post_id": 2002, "ts": "2026-06-04T08:28:50Z", "hours": 0.6283, "text": "css is nicer than i thought"}]...
|
Title: Personal Website by @mdpham | Stardance
De Title: Personal Website by @mdpham | Stardance
Devlogs:
css is nicer than i thought
took me some time to figure out the css but i got a pretty nice looking moving background going
Ships:
I made a personal website showcasing all my contacts, projects and skills. Before making this, I set time restrictions on myself to see what I could do in a short time and now that I have finished it, I am really proud of how nice my website turned out!...
|
1792968785.8087597
|
1793055185.8087597
|
|
7067
|
Game Hub by @Christianlikes67_Bobbpheus | Stardanc Game Hub by @Christianlikes67_Bobbpheus | Stardance...
|
Christianlikes67_Bobbpheus
|
1
|
1.0
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T07:56:34Z", "hours": 1.0, "multiplier": 1.83, "payout": 2, "blessing": "neutral", "text": "I have made a Game Hub for all of my Lovable vibe coding projects that is have spent HOURS on, the most challenging parts were to fix ALL of the stupid bugs and errors i had to fix and all of the trouble AI made, i am VERY proud of my games cuz i have have spent my free time on it and yeah, and i hope y’all who play would love it and support my game!", "repo": "https://github.com/Christianlikes67/game-hub", "demo": "https://christianlikes67.github.io/game-hub/"}]...
|
[{"post_id": 4780, "ts": "2026 [{"post_id": 4780, "ts": "2026-06-08T08:33:51Z", "hours": 0.2622, "text": "I have made my site a bit better and still working on the glitch"}, {"post_id": 4764, "ts": "2026-06-08T07:22:07Z", "hours": 0.4328, "text": "im trying to get my site working it doesnt work"}, {"post_id": 1989, "ts": "2026-06-04T07:56:57Z", "hours": 0.4869, "text": "I’m working on a “Game Hub” with some of my Loavble games"}]...
|
Title: Game Hub by @Christianlikes67_Bobbpheus | S Title: Game Hub by @Christianlikes67_Bobbpheus | Stardance
Devlogs:
I’m working on a “Game Hub” with some of my Loavble games
im trying to get my site working it doesnt work
I have made my site a bit better and still working on the glitch
Ships:
I have made a Game Hub for all of my Lovable vibe coding projects that is have spent HOURS on, the most challenging parts were to fix ALL of the stupid bugs and errors i had to fix and all of the trouble AI made, i am VERY proud of my games cuz i have have spent my free time on it and yeah, and i hope y’all who play would love it and support my game!...
|
1792875236.6205106
|
1793739236.6205106
|
|
7084
|
ALL of the board games I like or Invented by @Nezr ALL of the board games I like or Invented by @Nezruceuil | Stardance...
|
Nezruceuil
|
1
|
151.0
|
1265
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-30T19:52:05Z", "hours": 151.0, "multiplier": 8.44, "payout": 1265, "blessing": "neutral", "text": "I coded a Game in which you can play all of my favorite board games and the games that I invented. I deepened my Godot coding knowledge by recreating complicated games like: Chess, Reversi, Go, Tafl and Shōgi. I really enjoyed doing this project and now you can enjoy it too! hey, if you write **Stardance** in the background texture you can get this amazing background ↓. ✨", "repo": "https://github.com/Nezruceuil/my-board-games", "demo": "https://nezruceuil.itch.io/cool-board-games"}]...
|
[{"post_id": 75686, "ts": "202 [{"post_id": 75686, "ts": "2026-09-30T19:11:44Z", "hours": 1.1744, "text": "Fixed Bugs and added new secrets panels."}, {"post_id": 71414, "ts": "2026-09-20T19:42:26Z", "hours": 9.54, "text": "Fixed bugs, improved my game, added recommendation, added a way to order the games however you want, added art for amazons game fire and added a Chess panel."}, {"post_id": 61656, "ts": "2026-09-04T17:57:46Z", "hours": 5.3467, "text": "Improve my board game, fixed bugs, added a texture for the walls, added a play time estimation for every games, added Amazons and added Gomoku."}, {"post_id": 58882, "ts": "2026-08-31T13:38:25Z", "hours": 1.7225, "text": "Fixed more bugs (tafl and text in wrong place.) and improved Castle War and added some art to it."}, {"post_id": 58076, "ts": "2026-08-30T12:49:31Z", "hours": 10.0364, "text": "Fixed Bugs (tafl,drawback chess,ect…), Added a Spring panel, Added Amazons and Added Castle War (my own strategy game)."}, {"post_id": 48101, "ts": "2026-08-16T12:03:28Z", "hours": 9.0517, "text": "fixed Bugs, added 2 new chess variants and Added 15 unique drawbacks to drawback chess!"}, {"post_id": 46333, "ts": "2026-08-13T14:07:53Z", "hours": 9.0744, "text": "Fixed bugs, added a Hazelnut fight ai (not entirely done) and added more drawbacks to drawback chess."}, {"post_id": 43342, "ts": "2026-08-08T15:20:23Z", "hours": 8.5814, "text": "Added better panel for the main page (added a Summer panel a Winter panel that you can get by being on the game at the right season. and a star dance panel that you can get by typing “Stardance”. (I drew all of the panels myself.)) , added a Save and Load function, change all of the text font to be better and added a script to see the panel (control/option space)."}, {"post_id": 40696, "ts": "2026-08-04T11:49:37Z", "hours": 1.2158, "text": "fixed bugs, improved design and added a delete drawings and arrows function win delete. (a lot of arrows + delete button = no more arrows)"}, {"post_id": 39671, "ts": "2026-08-02T20:01:01Z", "hours": 4.1125, "text": "added an arrow drawing ability and fixed bugs."}, {"post_id": 38699, "ts": "2026-08-01T06:56:05Z", "hours": 1.4872, "text": "added an explanation for every games and fixed bugs with the lines of action game."}, {"post_id": 38178, "ts": "2026-07-31T13:20:17Z", "hours": 1.7389, "text": "fixed a bug with chess and added lines of action!"}, {"post_id": 37562, "ts": "2026-07-30T11:46:29Z", "hours": 3.5211, "text": "fixed bugs and added Go!"}, {"post_id": 37224, "ts": "2026-07-29T19:30:53Z", "hours": 1.4664, "text": "finished making talf games (added the king suffocation mechanic) !"}, {"post_id": 36562, "ts": "2026-07-28T19:20:19Z", "hours": 3.0928, "text": "started added talf game( ≈ 85% done) still need to add the king capture feature"}, {"post_id": 35321, "ts": "2026-07-26T17:18:12Z", "hours": 1.8692, "text": "fixed bugs and added more chess variants"}, {"post_id": 35080, "ts": "2026-07-26T08:26:26Z", "hours": 4.0767, "text": "Fixed bugs and added Reversi!"}, {"post_id": 34274, "ts": "2026-07-24T20:51:45Z", "hours": 2.0453, "text": "added bigger tic tac toe and fixed bugs."}, {"post_id": 33662, "ts": "2026-07-23T19:17:40Z", "hours": 2.0328, "text": "added 4 player Chess, fixed bugs and added a boat for Chaturaji."}, {"post_id": 33528, "ts": "2026-07-23T15:39:08Z", "hours": 2.0022, "text": "added an explanation for every game."}, {"post_id": 33148, "ts": "2026-07-22T19:53:27Z", "hours": 4.4092, "text": "fixed bugs and added Chaturaji"}, {"post_id": 31461, "ts": "2026-07-19T20:45:54Z", "hours": 4.3989, "text": "fixed a bug with duck chess and added Shōgi."}, {"post_id": 30822, "ts": "2026-07-18T19:09:14Z", "hours": 6.975, "text": "added every variants( Atomic,Duck Chess,Fog Of War,Giveaway,King Of The Hill,Capture Anything,Torpedo,No Castling,Ghost Board,Sideways ) and added Connect 4"}, {"post_id": 30297, "ts": "2026-07-17T19:08:42Z", "hours": 7.4939, "text": "Started adding an AI for Hazelnut Fight, fixed bugs with castling in the chess games, added a page to play classic chess variants, and a page where you can see all the chess variants coming in the next devlog. I also added an autofill that checks for similarity to fill in variant names (for example: aTuMyk -> Atomic .)"}, {"post_id": 27888, "ts": "2026-07-13T20:03:40Z", "hours": 0.7567, "text": "added color pickers to the options menu."}, {"post_id": 27847, "ts": "2026-07-13T18:47:36Z", "hours": 1.3992, "text": "added a classic version to pieces fit!"}, {"post_id": 24673, "ts": "2026-07-08T12:50:10Z", "hours": 4.3453, "text": "Added ‘Pieces Fit,’ a game where everyone is given the same randomly generated custom piece and must place as many copies of it as possible without any of them attacking each other."}, {"post_id": 24151, "ts": "2026-07-07T15:08:03Z", "hours": 3.4447, "text": "fixed bugs with some drawbacks and added 5 more uniques drawbacks"}, {"post_id": 22245, "ts": "2026-07-04T16:41:55Z", "hours": 2.2403, "text": "added a resign button 5 more unique drawback and fixed bugs"}, {"post_id": 22065, "ts": "2026-07-04T09:47:55Z", "hours": 3.5369, "text": "added Drawback Chess with 15 drawbacks!"}, {"post_id": 20990, "ts": "2026-07-02T18:48:12Z", "hours": 3.8056, "text": "added draw to the chess games and a options menu (that doesn’t do anything yet)"}, {"post_id": 19446, "ts": "2026-06-30T19:25:45Z", "hours": 0.8839, "text": "added normal chess"}, {"post_id": 19383, "ts": "2026-06-30T17:58:23Z", "hours": 0.91, "text": "added a drawing ability , added color to see the last movement of your enemy and it now turn 180° every turn."}, {"post_id": 19112, "ts": "2026-06-30T11:00:58Z", "hours": 2.1864, "text": "added game mode and additional rule for pizza chess (for example this one makes all pieces looks like pizza ( Kings opening vs King Indian defense ) and you can’t even tell what is what piece)"}, {"post_id": 19057, "ts": "2026-06-30T07:37:39Z", "hours": 8.1514, "text": "added pizza chess (my own version of chess where the left knight is replace by a pizza)"}, {"post_id": 8544, "ts": "2026-06-14T06:27:46Z", "hours": 3.6144, "text": "added a new game with gambling (not real money!)"}, {"post_id": 3536, "ts": "2026-06-06T14:59:28Z", "hours": 1.145, "text": "added a indicator for the player turn and fixed a bug with the golden hazelnut. Added visual to hazelnut fight page in the menu."}, {"post_id": 3391, "ts": "2026-06-06T09:11:28Z", "hours": 0.5789, "text": "Finished the game ! and Fixed some bugs"}, {"post_id": 3377, "ts": "2026-06-06T08:32:40Z", "hours": 0.45, "text": "polished and added texture for this game!"}, {"post_id": 3355, "ts": "2026-06-06T07:38:18Z", "hours": 1.9031, "text": "added a settings for my games that work and finished the gameplay of the game !"}, {"post_id": 3315, "ts": "2026-06-06T05:39:18Z", "hours": 1.3564, "text": "fixed hiding, look around and added a win condition and a win screen!"}, {"post_id": 2792, "ts": "2026-06-05T16:34:28Z", "hours": 1.0958, "text": "added a Hazelnut limit for the inventory, added the possibility of hiding you hazelnuts and added the number of turns"}, {"post_id": 2319, "ts": "2026-06-04T19:05:43Z", "hours": 0.7481, "text": "added movement, look around button with how many hazelnuts you found on your position!"}, {"post_id": 2258, "ts": "2026-06-04T17:29:03Z", "hours": 0.6908, "text": "added a next player button, player turn and player with controlled position!"}, {"post_id": 2137, "ts": "2026-06-04T13:52:30Z", "hours": 0.6044, "text": "added a tile map with random tile (forest, plain or lake) for one of the game"}, {"post_id": 2037, "ts": "2026-06-04T10:08:21Z", "hours": 0.5872, "text": "Added the main page with buttons and a scroll bar"}]...
|
Title: ALL of the board games I like or Invented b Title: ALL of the board games I like or Invented by @Nezruceuil | Stardance
Devlogs:
Added the main page with buttons and a scroll bar
added a tile map with random tile (forest, plain or lake) for one of the game
added a next player button, player turn and player with controlled position!
added movement, look around button with how many hazelnuts you found on your position!
added a Hazelnut limit for the inventory, added the possibility of hiding you hazelnuts and added the number of turns
fixed hiding, look around and added a win condition and a win screen!
added a settings for my games that work and finished the gameplay of the game !
polished and added texture for this game!
Finished the game ! and Fixed some bugs
added a indicator for the player turn and fixed a bug with the golden hazelnut. Added visual to hazelnut fight page in the menu.
added a new game with gambling (not real money!)
added pizza chess (my own version of chess where the left knight is replace by a pizza)
added game mode and additional rule for pizza chess (for example this one makes all pieces looks like pizza ( Kings opening vs King Indian defense ) and you can’t even tell what is what piece)
added a drawing ability , added color to see the last movement of your enemy and it now turn 180° every turn.
added normal chess
added draw to the chess games and a options menu (that doesn’t do anything yet)
added Drawback Chess with 15 drawbacks!
added a resign button 5 more unique drawback and fixed bugs
fixed bugs with some drawbacks and added 5 more uniques drawbacks
Added ‘Pieces Fit,’ a game where everyone is given the same randomly generated custom piece and must place as many copies of it as possible without any of them attacking each other.
added a classic version to pieces fit!
added color pickers to the options menu.
Started adding an AI for Hazelnut Fight, fixed bugs with castling in the chess games, added a page to play classic chess variants, and a page where you can see all the chess variants coming in the next devlog. I also added an autofill that checks for similarity to fill in variant names (for example: aTuMyk -> Atomic .)
added every variants( Atomic,Duck Chess,Fog Of War,Giveaway,King Of The Hill,Capture Anything,Torpedo,No Castling,Ghost Board,Sideways ) and added Connect 4
fixed a bug with duck chess and added Shōgi.
fixed bugs and added Chaturaji
added an explanation for every game.
added 4 player Chess, fixed bugs and added a boat for Chaturaji.
added bigger tic tac toe and fixed bugs.
Fixed bugs and added Reversi!
fixed bugs and added more chess variants
started added talf game( ≈ 85% done) still need to add the king capture feature
finished making talf games (added the king suffocation mechanic) !
fixed bugs and added Go!
fixed a bug with chess and added lines of action!
added an explanation for every games and fixed bugs with the lines of action game.
added an arrow drawing ability and fixed bugs.
fixed bugs, improved design and added a delete drawings and arrows function win delete. (a lot of arrows + delete button = no more arrows)
Added better panel for the main page (added a Summer panel a Winter panel that you can get by being on the game at the right season. and a star dance panel that you can get by typing “Stardance”. (I drew all of the panels myself.)) , added a Save and Load function, change all of the text font to be better and added a script to see the panel (control/option space).
Fixed bugs, added a Hazelnut fight ai (not entirely done) and added more drawbacks to drawback chess.
fixed Bugs, added 2 new chess variants and Added 15 unique drawbacks to drawback chess!
Fixed Bugs (tafl,drawback chess,ect…), Added a Spring panel, Added Amazons and Added Castle War (my own strategy game).
Fixed more bugs (tafl and text in wrong place.) and improved Castle War and added some art to it.
Improve my board game, fixed bugs, added a texture for the walls, added a play time estimation for every games, added Amazons and added Gomoku.
Fixed bugs, improved my game, added recommendation, added a way to order the games however you want, added art for amazons game fire and added a Chess panel.
Fixed Bugs and added new secrets panels.
Ships:
I coded a Game in which you can play all of my favorite board games and the games that I invented. I deepened my Godot coding knowledge by recreating complicated games like: Chess, Reversi, Go, Tafl and Shōgi. I really enjoyed doing this project and now you can enjoy it too! hey, if you write **Stardance** in the background texture you can get this amazing background ↓. ✨...
|
1793004544.318552
|
1793090944.318552
|
|
7104
|
scary game by @mikhailnotfish | Stardance
|
mikhailnotfish
|
1
|
1.0
|
10
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T22:47:27Z", "hours": 1.0, "multiplier": 12.02, "payout": 10, "blessing": "neutral", "text": "scary game is out now for you to try! go get spooked i guess…", "repo": "https://github.com/mikhailnotfish/Scary-Game-Release/", "demo": "https://scary-game-finalrelease.netlify.app"}]...
|
[{"post_id": 3303, "ts": "2026 [{"post_id": 3303, "ts": "2026-06-06T05:06:15Z", "hours": 0.53, "text": "the scary game is done! go check it out now! this took me a bit over 5 hours (total) to make, including coding. i accedentally forgot to link unity to hackatime, so uhh it didnt track said 5 hours"}, {"post_id": 2020, "ts": "2026-06-04T09:27:48Z", "hours": 0.3511, "text": "here is an early screenshout of the game :] im working hard to get a playable version out to you guys asap!"}]...
|
Title: scary game by @mikhailnotfish | Stardance
Title: scary game by @mikhailnotfish | Stardance
Devlogs:
here is an early screenshout of the game :] im working hard to get a playable version out to you guys asap!
the scary game is done! go check it out now! this took me a bit over 5 hours (total) to make, including coding. i accedentally forgot to link unity to hackatime, so uhh it didnt track said 5 hours
Ships:
scary game is out now for you to try! go get spooked i guess…...
|
1792990546.492353
|
1793076946.492353
|
|
7112
|
MP3 player by @antekj_smalec | Stardance
|
antekj_smalec
|
1
|
19.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T13:47:32Z", "hours": 19.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a battery powered MP3 player using an esp32 and a PCM5102A digital to analogue converter. Songs are loaded onto the SD card and are read and displayed by the esp32 using a 0.96” OLED display and an SD card reader module. There is also capability for small simple games and apps such as snake or timers.", "repo": "https://github.com/antekjsmalec/ESP-MP3/", "demo": ""}]...
|
[{"post_id": 29486, "ts": "202 [{"post_id": 29486, "ts": "2026-07-16T13:42:14Z", "hours": 0.9081, "text": "Made a simple website and ironed out some bugs"}, {"post_id": 27672, "ts": "2026-07-13T13:26:55Z", "hours": 7.52, "text": "Finished making the software and spent the last week soldering everything together, bit messy but everything works. I will try to make a case for it but I don’t have a 3d printer so it may be made out of cardboard."}, {"post_id": 11228, "ts": "2026-06-18T11:42:02Z", "hours": 2.115, "text": "Bought a new SD card reader IC as my DIYed solution did not work. It came two days ago, still didn’t work. After some headaches got it to work."}, {"post_id": 7788, "ts": "2026-06-13T00:24:42Z", "hours": 2.0631, "text": "Parts finally arrived, been doing some testing of screen, buttons etc. Broke my sd card module but found a workaround by soldering pins to a MicroSD card to SD card adapter. Been working on file system and game/music selection."}, {"post_id": 5207, "ts": "2026-06-08T22:11:49Z", "hours": 1.6267, "text": "Made a little screen saver and simple menu, parts have cleared customs so they should be arriving within a few days."}, {"post_id": 4597, "ts": "2026-06-07T23:18:38Z", "hours": 2.5072, "text": "Wrote a little library to make writing code for games easier by making button inputs quicker to write and make drawing circles and rectangles easier. My parts have landed in my countries airport so I hope to have them soon."}, {"post_id": 2937, "ts": "2026-06-05T20:54:40Z", "hours": 0.7925, "text": "Still waiting for components, Wokwi simulator is causing some headaches."}, {"post_id": 2231, "ts": "2026-06-04T16:50:30Z", "hours": 0.7242, "text": "Connected a 0.96 OLED display. All virtual, still waiting for my components to arrive."}, {"post_id": 2087, "ts": "2026-06-04T12:37:31Z", "hours": 0.6331, "text": "Learning esp32 basics through PlatformIO, VSCode and wokwi simulator as I wait for my parts to arrive. I spent most my time setting up the wokwi simulator and made a simple LED flash."}]...
|
Title: MP3 player by @antekj_smalec | Stardance
D Title: MP3 player by @antekj_smalec | Stardance
Devlogs:
Learning esp32 basics through PlatformIO, VSCode and wokwi simulator as I wait for my parts to arrive. I spent most my time setting up the wokwi simulator and made a simple LED flash.
Connected a 0.96 OLED display. All virtual, still waiting for my components to arrive.
Still waiting for components, Wokwi simulator is causing some headaches.
Wrote a little library to make writing code for games easier by making button inputs quicker to write and make drawing circles and rectangles easier. My parts have landed in my countries airport so I hope to have them soon.
Made a little screen saver and simple menu, parts have cleared customs so they should be arriving within a few days.
Parts finally arrived, been doing some testing of screen, buttons etc. Broke my sd card module but found a workaround by soldering pins to a MicroSD card to SD card adapter. Been working on file system and game/music selection.
Bought a new SD card reader IC as my DIYed solution did not work. It came two days ago, still didn’t work. After some headaches got it to work.
Finished making the software and spent the last week soldering everything together, bit messy but everything works. I will try to make a case for it but I don’t have a 3d printer so it may be made out of cardboard.
Made a simple website and ironed out some bugs
Ships:
I made a battery powered MP3 player using an esp32 and a PCM5102A digital to analogue converter. Songs are loaded onto the SD card and are read and displayed by the esp32 using a 0.96” OLED display and an SD card reader module. There is also capability for small simple games and apps such as snake or timers....
|
1792972471.4202962
|
1793058871.4202962
|
|
7118
|
Starboard! by @world | Stardance
|
world
|
1
|
47.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T01:43:23Z", "hours": 47.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Starboard! I made this macro keyboard from scratch. This was my first time using KiCad and Fusion for a project! (And it took forever…) But it was a really fun project. Checkout the demo website using Three.js! I really can’t wait to see my keyboard irl", "repo": "https://github.com/deveworld/starboard", "demo": ""}]...
|
[{"post_id": 8138, "ts": "2026 [{"post_id": 8138, "ts": "2026-06-13T16:09:32Z", "hours": 10.5117, "text": "Starboard! Starboard is a compact 63×63 mm Hackpad macropad built entirely from kit parts with QMK firmware and a fully 3D-printed sandwich case. I designed the 2-layer PCB in KiCad and wrote a custom-matrix QMK keymap (six keys plus encoder press, encoder volume control, OLED status readout, and RGB underglow), then cross-checked the firmware pin map against the board netlist from three independent sources. Along the way I caught and fixed a stale prebuilt UF2 (a leftover 10 ms vs 30 ms bootmagic delay) by rebuilding deterministically from source, and confirmed every checklist dimension. Finally I packaged the repo to the required structure and pushed it public!"}, {"post_id": 5702, "ts": "2026-06-09T16:26:54Z", "hours": 5.8964, "text": "Full 3D Modeling It was way harder than my first thought… Many PCB correction… etc."}, {"post_id": 5509, "ts": "2026-06-09T09:49:13Z", "hours": 12.2217, "text": "I’m working on Fusion! But I think I need to fix some collision and clearance a bit. Does it look good?"}, {"post_id": 3420, "ts": "2026-06-06T11:04:16Z", "hours": 3.4808, "text": "PCB also done!!!"}, {"post_id": 3353, "ts": "2026-06-06T07:34:15Z", "hours": 14.6039, "text": "Schematic Done!"}]...
|
Title: Starboard! by @world | Stardance
Devlogs:
Title: Starboard! by @world | Stardance
Devlogs:
Schematic Done!
PCB also done!!!
I’m working on Fusion! But I think I need to fix some collision and clearance a bit. Does it look good?
Full 3D Modeling It was way harder than my first thought… Many PCB correction… etc.
Starboard! Starboard is a compact 63×63 mm Hackpad macropad built entirely from kit parts with QMK firmware and a fully 3D-printed sandwich case. I designed the 2-layer PCB in KiCad and wrote a custom-matrix QMK keymap (six keys plus encoder press, encoder volume control, OLED status readout, and RGB underglow), then cross-checked the firmware pin map against the board netlist from three independent sources. Along the way I caught and fixed a stale prebuilt UF2 (a leftover 10 ms vs 30 ms bootmagic delay) by rebuilding deterministically from source, and confirmed every checklist dimension. Finally I packaged the repo to the required structure and pushed it public!
Ships:
Starboard! I made this macro keyboard from scratch. This was my first time using KiCad and Fusion for a project! (And it took forever…) But it was a really fun project. Checkout the demo website using Three.js! I really can’t wait to see my keyboard irl...
|
1792997420.8204517
|
1793083820.8204517
|
|
7133
|
Timer'O by @toivoa070 | Stardance
|
toivoa070
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T03:31:05Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A simple and beginner-friendly Desktop Timer application built using Python, HTML, and CSS. This project allows users to start, pause, and reset a timer with a clean and minimal interface. I mainly am proud of this project because I always wanted an application like this I used to download three different apps for management of my daily task, timer for studying, current time to track the time I started studying from and daily tasks that I can tick out after completion and they would still be there for a long time. It is a demo of an ideal app that I’ve been searching for. What I found challenging was basically the python command in it. Thought there were tutorials for a simple analog clock it was still rather hard to convert that to what I have created and to combine it with html it was something new. I had to manage both frontend and the backend which was rather new for me.", "repo": "https://github.com/Nottoishenshu/Timer-o", "demo": "https://nottoishenshu.github.io/Timer-o/"}]...
|
[{"post_id": 10580, "ts": "202 [{"post_id": 10580, "ts": "2026-06-17T11:57:01Z", "hours": 1.1642, "text": "A simple and beginner-friendly Desktop Timer application built using Python, HTML, and CSS. This project allows users to start, pause, and reset a timer with a clean and minimal interface. It is created as a learning project while exploring Python and web development concepts. Also happens to be one of my first projects while learning python."}]...
|
Title: Timer'O by @toivoa070 | Stardance
Devl Title: Timer'O by @toivoa070 | Stardance
Devlogs:
A simple and beginner-friendly Desktop Timer application built using Python, HTML, and CSS. This project allows users to start, pause, and reset a timer with a clean and minimal interface. It is created as a learning project while exploring Python and web development concepts. Also happens to be one of my first projects while learning python.
Ships:
A simple and beginner-friendly Desktop Timer application built using Python, HTML, and CSS. This project allows users to start, pause, and reset a timer with a clean and minimal interface. I mainly am proud of this project because I always wanted an application like this I used to download three different apps for management of my daily task, timer for studying, current time to track the time I started studying from and daily tasks that I can tick out after completion and they would still be there for a long time. It is a demo of an ideal app that I’ve been searching for. What I found challenging was basically the python command in it. Thought there were tutorials for a simple analog clock it was still rather hard to convert that to what I have created and to combine it with html it was something new. I had to manage both frontend and the backend which was rather new for me....
|
1792993966.5419428
|
1793080366.5419428
|
|
7136
|
VORTEX AI ASSISTENT by @TXJ_PROGRAMER | Stardance
|
TXJ_PROGRAMER
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T07:32:10Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "VORTEX AI is a customizable AI assistant that supports text and voice conversations (Voice-to-Voice), multiple AI models, a web interface, and a command-line interface. It can answer questions, assist with coding, perform AI-powered tasks, and is designed to be expandable with features like commands, automation, and desktop integration.", "repo": "https://github.com/srinj-ai/VORTEX-AI-ASSISTENT", "demo": "https://vortex-ai-assistent-uw75.vercel.app/"}]...
|
[{"post_id": 14287, "ts": "202 [{"post_id": 14287, "ts": "2026-06-23T10:45:04Z", "hours": 0.3175, "text": "Dev Vlog #3— Ready to Ship Hey everyone, welcome back to another VORTEX update! After a lot of testing, bug fixing, and feature work. There are still a few things that need polishing, but the core experience is now in a much better state than before. New Features Open Website command is working Chat system improvements Better overall stability Various bug fixes and optimisations Continued progress on VTV (Voice-to-Voice) A lot of the work recently wasn’t very visible. Most of it was spent fixing issues, cleaning up code, and making existing features more reliable. There are still some bugs in the chat system, and a few AI models aren’t working correctly yet. VTV is also still under development byt its ready for release. Project Status: 🟢 Ready to Ship i will add some letter after ship XD"}, {"post_id": 12507, "ts": "2026-06-20T13:02:54Z", "hours": 0.3764, "text": "Dev Vlog #2 — Open Website Command 🚀 Hey everyone, welcome back to another VORTEX update! I added a feature that lets VORTEX open websites straight from chat. Instead of opening your browser and typing everything yourself, you can now just type something like open youtube or open google , and it just open it straight. New Features Added open <website> command Opens supported websites in your default browser Added support for: YouTube Google Gmail ChatGPT GitHub When you use the open command, VORTEX checks if the website is in its supported list. If it is, it’ll open it automatically and let you know. open github → https://github.com/srinj-ai/VORTEX-AI-ASSISTENT The feature is working pretty well so far, but it’s still early. Project Status: 🟡 Active Development *BTW, here’s a quick demo! *"}, {"post_id": 6142, "ts": "2026-06-10T10:20:01Z", "hours": 0.3219, "text": "Dev Vlog #1 — Building VTV Hey everyone, welcome to the first VORTEX DEVLOG!!! I’ve been working on one features for VORTEX so far: VTV (Voice-to-Voice) . I’ve also been fixing bugs and making the project more stable. The chat system works, but there are still a few bugs that pop up sometimes. Some AI models also aren’t working properly yet, but I’ve already found the issues and they’ll be fixed in future. :d Current Progress Speech recognition AI response processing Text-to-Speech generation Conversation handling Response optimization For VTV to feel natural, speech recognition, AI processing, and voice generation all need to be really fast. I’m also trying to make everything more stable so conversations don’t randomly break. Next, I’ll be working on: Project Status: 🟡 Active Development VTV isn’t finished yet, and there are still a few bugs , but I’m happy with how things are going."}]...
|
Title: VORTEX AI ASSISTENT by @TXJ_PROGRAMER | Sta Title: VORTEX AI ASSISTENT by @TXJ_PROGRAMER | Stardance
Devlogs:
Dev Vlog #1 — Building VTV Hey everyone, welcome to the first VORTEX DEVLOG!!! I’ve been working on one features for VORTEX so far: VTV (Voice-to-Voice) . I’ve also been fixing bugs and making the project more stable. The chat system works, but there are still a few bugs that pop up sometimes. Some AI models also aren’t working properly yet, but I’ve already found the issues and they’ll be fixed in future. :d Current Progress Speech recognition AI response processing Text-to-Speech generation Conversation handling Response optimization For VTV to feel natural, speech recognition, AI processing, and voice generation all need to be really fast. I’m also trying to make everything more stable so conversations don’t randomly break. Next, I’ll be working on: Project Status: 🟡 Active Development VTV isn’t finished yet, and there are still a few bugs , but I’m happy with how things are going.
Dev Vlog #2 — Open Website Command 🚀 Hey everyone, welcome back to another VORTEX update! I added a feature that lets VORTEX open websites straight from chat. Instead of opening your browser and typing everything yourself, you can now just type something like open youtube or open google , and it just open it straight. New Features Added open <website> command Opens supported websites in your default browser Added support for: YouTube Google Gmail ChatGPT GitHub When you use the open command, VORTEX checks if the website is in its supported list. If it is, it’ll open it automatically and let you know. open github → https://github.com/srinj-ai/VORTEX-AI-ASSISTENT The feature is working pretty well so far, but it’s still early. Project Status: 🟡 Active Development *BTW, here’s a quick demo! *
Dev Vlog #3— Ready to Ship Hey everyone, welcome back to another VORTEX update! After a lot of testing, bug fixing, and feature work. There are still a few things that need polishing, but the core experience is now in a much better state than before. New Features Open Website command is working Chat system improvements Better overall stability Various bug fixes and optimisations Continued progress on VTV (Voice-to-Voice) A lot of the work recently wasn’t very visible. Most of it was spent fixing issues, cleaning up code, and making existing features more reliable. There are still some bugs in the chat system, and a few AI models aren’t working correctly yet. VTV is also still under development byt its ready for release. Project Status: 🟢 Ready to Ship i will add some letter after ship XD
Ships:
VORTEX AI is a customizable AI assistant that supports text and voice conversations (Voice-to-Voice), multiple AI models, a web interface, and a command-line interface. It can answer questions, assist with coding, perform AI-powered tasks, and is designed to be expandable with features like commands, automation, and desktop integration....
|
1792979251.5554206
|
1793065651.5554206
|
|
7142
|
Spacer by @Systemic_speed | Stardance
|
Systemic_speed
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T14:12:56Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Spacer — Stardance ship Name: Spacer One-liner: I kept missing launches and solar storms, so I built one page that tracks all of it and lets me poke at it from Slack, Discord, my terminal, a desktop window, or the web. Field Value Demo https://spacer.systemic-speed.hackclub.app/ Code https://github.com/Gautham-rgb/Spacer README https://github.com/Gautham-rgb/Spacer/blob/main/README.md Stack Python · NiceGUI · discord.py · slack_sdk · Skyfield · Groq What it is: every front-end (web, Slack, Discord, CLI, desktop) just calls one get_events() . All the fetching and filtering live in one place, and everything else is basically a renderer. Live demo is deployed, so just click. Try it: https://spacer.systemic-speed.hackclub.app/ In the bot’s chat: !space weather , !space list probe_launch --limit 5 --name falcon , !space groq what is a coronal mass ejection? What it does pulls solar flare / K-index, launches, and flybys into one timeline same --limit / --name / --after / --before flags in chat, CLI, and the URL Groq assistant that remembers the conversation (in Slack, Discord, and web) desktop ping when something big is within the hour, optional webhook TTL cache so refreshes don’t hammer NOAA, plus a 63-test pytest suite Nerdy bits: dedup on (title, time) ; bots share one platform-neutral response so Slack/Discord never re-implement logic; pages render instantly and fetch in a side thread; long Groq answers get clamped so a big reply can’t fail to send. Data: NOAA SWPC, thespacedevs, JPL (DE421), Groq. Built for Stardance. Well, Happy Launching!!", "repo": "https://github.com/Gautham-rgb/Spacer", "demo": "https://app.slack.com/client/T0B9WS0J88P/C0BAFUQQCQ4"}]...
|
[{"post_id": 74477, "ts": "202 [{"post_id": 74477, "ts": "2026-09-27T13:57:13Z", "hours": 2.7111, "text": "Devlog 3: Spacer hey there, kinda caught up with exams, but I did get some hours in with this thing, and this is going to be the last devlog until ship (YAAYYYY), so here a few design decisions and some cool stuff WE GOT A LINK After trying to configure my nest container for like, 5 years, i finally got a link to use here it is , and the website is kinda AI generated (had to fit it in the schedule, thought the thing was gonna end on Sept 30 but now it is ending on Oct 31), but all in all, it was a good thing experimenting and learning about how people actually host websites We finally got slack and discord working so, after some tinkering (and some help form opencode) we finally got discord and slack channels for the bot to work in, just use !space in the slack and the discord channel, the links are on the website. we are removing the slack bot mission form this project since i want people to actually see this and say if it is good or not, i am removing the slack bot mission from my project, but at least you can see the website and the discord bot well, see ya at ship"}, {"post_id": 57900, "ts": "2026-08-30T07:16:24Z", "hours": 3.9772, "text": "Devlog 2: Spacer hey there, didn’t post for a long time, since i was focused on making Kerbal Gravity Program ( check it out ) so I didn’t have time for this, but now that it is shipped, i can have a little bit of rest and continue on my other projects for anyone new here, Spacer is a Slack/discord bot (yes i am getting it to discord) that can give you notifications like Rocket launches or CMEs that can destroy stuff, I will also get it into a cli, but that will wait for ship 2 What I did: Now, I got 3 main things up: the APIs and the way i am going to make the CLI/Bots A Nest container An understanding of Docker (I guess??) So, what I want is a docker container perpetually running with something like tmux stopping nest from stopping the processes in the container while i exit the nest container (TOOO many containers), but now i am currently fixing stuff with the code and the docker container, well, hope it can be fixed fast Next steps Now, I gotta: 1, figure out how to use tmux 2. how to prevent a certificate error that I keep getting no matter what well, see ya next time fellas ( going to be sometime until you guys can see an actual image )"}, {"post_id": 26513, "ts": "2026-07-11T11:13:57Z", "hours": 0.4983, "text": "Devlog 1: Spacer So, I’m working on Spacer—basically a CLI tool that doubles as a Slack/Discord bot for tracking space-related events. I didn’t post a devlog sooner because I was stuck in that “why is this not working” phase for way too long. But I finally got it to a point where I can see real results. I can now push data to webhooks via the CLI, though it was basically just a giant wall of text at first. Next up: fixing the layout so it actually looks like a professional app and not a terminal dump."}]...
|
Title: Spacer by @Systemic_speed | Stardance
Devl Title: Spacer by @Systemic_speed | Stardance
Devlogs:
Devlog 1: Spacer So, I’m working on Spacer—basically a CLI tool that doubles as a Slack/Discord bot for tracking space-related events. I didn’t post a devlog sooner because I was stuck in that “why is this not working” phase for way too long. But I finally got it to a point where I can see real results. I can now push data to webhooks via the CLI, though it was basically just a giant wall of text at first. Next up: fixing the layout so it actually looks like a professional app and not a terminal dump.
Devlog 2: Spacer hey there, didn’t post for a long time, since i was focused on making Kerbal Gravity Program ( check it out ) so I didn’t have time for this, but now that it is shipped, i can have a little bit of rest and continue on my other projects for anyone new here, Spacer is a Slack/discord bot (yes i am getting it to discord) that can give you notifications like Rocket launches or CMEs that can destroy stuff, I will also get it into a cli, but that will wait for ship 2 What I did: Now, I got 3 main things up: the APIs and the way i am going to make the CLI/Bots A Nest container An understanding of Docker (I guess??) So, what I want is a docker container perpetually running with something like tmux stopping nest from stopping the processes in the container while i exit the nest container (TOOO many containers), but now i am currently fixing stuff with the code and the docker container, well, hope it can be fixed fast Next steps Now, I gotta: 1, figure out how to use tmux 2. how to prevent a certificate error that I keep getting no matter what well, see ya next time fellas ( going to be sometime until you guys can see an actual image )
Devlog 3: Spacer hey there, kinda caught up with exams, but I did get some hours in with this thing, and this is going to be the last devlog until ship (YAAYYYY), so here a few design decisions and some cool stuff WE GOT A LINK After trying to configure my nest container for like, 5 years, i finally got a link to use here it is , and the website is kinda AI generated (had to fit it in the schedule, thought the thing was gonna end on Sept 30 but now it is ending on Oct 31), but all in all, it was a good thing experimenting and learning about how people actually host websites We finally got slack and discord working so, after some tinkering (and some help form opencode) we finally got discord and slack channels for the bot to work in, just use !space in the slack and the discord channel, the links are on the website. we are removing the slack bot mission form this project since i want people to actually see this and say if it is good or not, i am removing the slack bot mission from my project, but at least you can see the website and the discord bot well, see ya at ship
Ships:
Spacer — Stardance ship Name: Spacer One-liner: I kept missing launches and solar storms, so I built one page that tracks all of it and lets me poke at it from Slack, Discord, my terminal, a desktop window, or the web. Field Value Demo https://spacer.systemic-speed.hackclub.app/ Code https://github.com/Gautham-rgb/Spacer README https://github.com/Gautham-rgb/Spacer/blob/main/README.md Stack Python · NiceGUI · discord.py · slack_sdk · Skyfield · Groq What it is: every front-end (web, Slack, Discord, CLI, desktop) just calls one get_events() . All the fetching and filtering live in one place, and everything else is basically a renderer. Live demo is deployed, so just click. Try it: https://spacer.systemic-speed.hackclub.app/ In the bot’s chat: !space weather , !space list probe_launch --limit 5 --name falcon , !space groq what is a coronal mass ejection? What it does pulls solar flare / K-index, launches, and flybys into one timeline same --limit / --name / --after / --before flags in chat, CLI, and the URL Groq assistant that remembers the conversation (in Slack, Discord, and web) desktop ping when something big is within the hour, optional webhook TTL cache so refreshes don’t hammer NOAA, plus a 63-test pytest suite Nerdy bits: dedup on (title, time) ; bots share one platform-neutral response so Slack/Discord never re-implement logic; pages render instantly and fetch in a side thread; long Groq answers get clamped so a big reply can’t fail to send. Data: NOAA SWPC, thespacedevs, JPL (DE421), Groq. Built for Stardance. Well, Happy Launching!!...
|
1793004672.36774
|
1793091072.36774
|
|
7145
|
Personal Portfolio Site by @smjp | Stardance
|
smjp
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-11T07:19:30Z", "hours": 6.0, "multiplier": 3.85, "payout": 0, "blessing": "neutral", "text": "I built a personal portfolio website from scratch to display my academic profile, community service, extra-curricular achievements, and my overall personality. It is a lightweight, static site built entirely with semantic HTML5, custom CSS3 layouts, and core JavaScript. The single biggest obstacle was working with responsive design and media queries. Getting the layouts—especially text blocks and complex section wraps—to look natural and scale down elegantly on mobile devices required a significant amount of layout debugging and trial and error. I’m really proud of grasping cleaner design principles and stylesheet architecture. Figuring out how to use the CSS :root class to store a global color palette and building a unified common CSS layout that cleanly links across separate pages felt like a huge leap forward in making my code maintainable. The site is entirely static, responsive, and ready to view. To test it: Open the project directly via its deployed link. Toggle your browser’s Developer Tools (F12) to responsive/mobile view to see how the media query breakpoints fluidly restructure the navigation menu, sections, and flex elements for smaller screens!", "repo": "https://github.com/Spirit62/Portfolio", "demo": "https://spirit62.github.io/Portfolio/"}]...
|
[{"post_id": 6702, "ts": "2026 [{"post_id": 6702, "ts": "2026-06-11T07:15:13Z", "hours": 0.5847, "text": "Devlog 4- Finished the designs for every single page, made research connect to my research paper and added cool visual effects in my social media page Also, media queries took me a lot of time which makes it look extremely clean on smaller devices"}, {"post_id": 4913, "ts": "2026-06-08T14:35:11Z", "hours": 3.4422, "text": "Devlog3- I added a navigation bar for all pages which looks really neat and it took me a lot of time to add media queries to make the website have a good UI in mobile phones or tablets. This taught me a lot and I’m starting to realize AI cannot replace humans after all. I feel its the same as mathematics, we have AI to do the math for us but we dont rely on it blindly. Moreover, I made individual pages for the websites with the same template idea and I also finished up on the experience page. This is my first project and I am so excited to share the end result which I will post in Devlog4."}, {"post_id": 2656, "ts": "2026-06-05T10:11:05Z", "hours": 1.56, "text": "Devlog -2 Hi again, Here is the second page of my portfolio site it took me a long time to get a clean site lmk if you have any feedbacks or suggestions!!"}, {"post_id": 2540, "ts": "2026-06-05T02:32:31Z", "hours": 0.8078, "text": "Devlog1- Hi! I’m Sam for short; I really fell in love with web designing a month ago and after learning HTML and CSS, I am currently learning JavaScript, yet I fear that I will lose my designing abilities hence, I am working on this personal portfolio site where I finished this main page in about 15 minutes, I find the design clean but if you have any feedbacks lmk! :>"}]...
|
Title: Personal Portfolio Site by @smjp | Stardanc Title: Personal Portfolio Site by @smjp | Stardance
Devlogs:
Devlog1- Hi! I’m Sam for short; I really fell in love with web designing a month ago and after learning HTML and CSS, I am currently learning JavaScript, yet I fear that I will lose my designing abilities hence, I am working on this personal portfolio site where I finished this main page in about 15 minutes, I find the design clean but if you have any feedbacks lmk! :>
Devlog -2 Hi again, Here is the second page of my portfolio site it took me a long time to get a clean site lmk if you have any feedbacks or suggestions!!
Devlog3- I added a navigation bar for all pages which looks really neat and it took me a lot of time to add media queries to make the website have a good UI in mobile phones or tablets. This taught me a lot and I’m starting to realize AI cannot replace humans after all. I feel its the same as mathematics, we have AI to do the math for us but we dont rely on it blindly. Moreover, I made individual pages for the websites with the same template idea and I also finished up on the experience page. This is my first project and I am so excited to share the end result which I will post in Devlog4.
Devlog 4- Finished the designs for every single page, made research connect to my research paper and added cool visual effects in my social media page Also, media queries took me a lot of time which makes it look extremely clean on smaller devices
Ships:
I built a personal portfolio website from scratch to display my academic profile, community service, extra-curricular achievements, and my overall personality. It is a lightweight, static site built entirely with semantic HTML5, custom CSS3 layouts, and core JavaScript. The single biggest obstacle was working with responsive design and media queries. Getting the layouts—especially text blocks and complex section wraps—to look natural and scale down elegantly on mobile devices required a significant amount of layout debugging and trial and error. I’m really proud of grasping cleaner design principles and stylesheet architecture. Figuring out how to use the CSS :root class to store a global color palette and building a unified common CSS layout that cleanly links across separate pages felt like a huge leap forward in making my code maintainable. The site is entirely static, responsive, and ready to view. To test it: Open the project directly via its deployed link. Toggle your browser’s Developer Tools (F12) to responsive/mobile view to see how the media query breakpoints fluidly restructure the navigation menu, sections, and flex elements for smaller screens!...
|
1793000840.3067753
|
1793087240.3067753
|
|
7158
|
cool website for cool person by @ee | Stardance
|
ee
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-06T00:46:07Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hi! This was a really small, simple website I made for alexander/agv on the Slack! I had some challenges finding good cat photos, and finding good ideas on what to actually add to the project! I had a lot of fun just adding random stuff that seemed cool as well as celebrating alex! Besides that stuff, I think it was good to learn to make some basic HTML stuff and have fun doing it!", "repo": "https://github.com/Eobam/cool-new-site", "demo": "https://www.agvbday.online/"}]...
|
[{"post_id": 41653, "ts": "202 [{"post_id": 41653, "ts": "2026-08-06T00:42:46Z", "hours": 0.5081, "text": "I lowkey forgot what most of this time was, but I finished the README! It includes a technical rundown, features, and a conclusion. Hope y’all like it! and a final hbd wish to alex!"}, {"post_id": 4511, "ts": "2026-06-07T21:01:28Z", "hours": 0.4036, "text": "i added cool stuff that happened on the date (a lot of stuff about french 🇫🇷 people) CATS!!! 🐈 that’s mostly it, i did some styling as well I’m gonna put it up on the domain pretty soon. Cat wise (hehe) I put like 12 cats from reddit and that i found on the slack which are cute af no bugs actually, pretty smooth coding atm! I tried to add a fun fact thing but the CSS borked the whole site so i just home made one (which i think is cooler 😎)"}, {"post_id": 3425, "ts": "2026-06-06T11:09:12Z", "hours": 0.5803, "text": "oopsie forgot to devlog a bit earlier! I started by creating the README! so far it includes basically technical details, and some vague features. Then, I started creating the site! It has a happy bday title for the really cool person, some dancing cats, their first slack message and some stuff that happened on their birthday! I’m not 100% sure what I’m gonna add next, but I’ll probably make a banner, and maybe some art when i get back home?!"}]...
|
Title: cool website for cool person by @ee | Stard Title: cool website for cool person by @ee | Stardance
Devlogs:
oopsie forgot to devlog a bit earlier! I started by creating the README! so far it includes basically technical details, and some vague features. Then, I started creating the site! It has a happy bday title for the really cool person, some dancing cats, their first slack message and some stuff that happened on their birthday! I’m not 100% sure what I’m gonna add next, but I’ll probably make a banner, and maybe some art when i get back home?!
i added cool stuff that happened on the date (a lot of stuff about french 🇫🇷 people) CATS!!! 🐈 that’s mostly it, i did some styling as well I’m gonna put it up on the domain pretty soon. Cat wise (hehe) I put like 12 cats from reddit and that i found on the slack which are cute af no bugs actually, pretty smooth coding atm! I tried to add a fun fact thing but the CSS borked the whole site so i just home made one (which i think is cooler 😎)
I lowkey forgot what most of this time was, but I finished the README! It includes a technical rundown, features, and a conclusion. Hope y’all like it! and a final hbd wish to alex!
Ships:
Hi! This was a really small, simple website I made for alexander/agv on the Slack! I had some challenges finding good cat photos, and finding good ideas on what to actually add to the project! I had a lot of fun just adding random stuff that seemed cool as well as celebrating alex! Besides that stuff, I think it was good to learn to make some basic HTML stuff and have fun doing it!...
|
1792986958.5322206
|
1793073358.5322206
|
|
7165
|
Eve by @Light | Stardance
|
Light
|
1
|
294.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T20:53:22Z", "hours": 294.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Eve is a graphics engine written entirely in Vulkan , with the primary goal of learning Vulkan and C++ while simplifying their usage. Originally conceived as a simple, lightweight wrapper around Vulkan , Eve now includes: A Render Graph designed from scratch that leverages technologies such as memory aliasing (where multiple resources share the same memory space) and resource pooling (reusing resources across frames). It performs the core function of a Render Graph: by simply knowing how resources are utilized, it automatically issues the necessary synchronization barriers to the GPU. Developing the Render Graph was a grueling process, but it proved worthwhile in terms of both performance and the educational value of the experience. An ECS (Entity Component System) also designed from scratch, following the model of Unity’s DOTS ECS . Instead of scattering resources across VRAM—which slows down access due to constant memory jumps—game objects are organized into Archetypes. Components are distributed in contiguous memory batches, thereby minimizing cache misses. A rendering system that automates the insertion of transforms into buffers; these are subsequently processed into matrices via a compute shader and sent to the rendering shaders. It also features a material system that analyzes shader composition, looking for a struct named “Properties” that allows fields to be assigned by name from the C++ side. Support for the Slang shading language with a bindless system . Eve provides a file named Eve.slangh that simplifies and automates the retrieval of textures, buffers, and samplers from descriptors. Compute shader support is also included. An integrated, easy-to-use Input system inspired by Unity’s Input System , along with a lightweight UI wrapper that makes using Dear ImGui simpler and more intuitive. Eve also includes a demo featuring a gravitational simulation of thousands of entities orbiting a black hole, allowing various parameters to be adjusted in real-time.", "repo": "https://github.com/SonoUnBot09/Eve", "demo": "https://github.com/SonoUnBot09/Eve/releases/tag/v1.0.0"}]...
|
[{"post_id": 71422, "ts": "202 [{"post_id": 71422, "ts": "2026-09-20T19:52:09Z", "hours": 8.8461, "text": "DEVLOG 36 - Black Hole! Hi Stardance! Intro I’ve been working really hard lately, and I think I’ve reached a milestone with Eve that I honestly never expected to hit. The project is finally complete; now I just need to click that nice button to ship it. I’ve spent this time working on the README, improving the documentation, fixing bugs, and building a demo using Eve. Eve Demo The demo is a gravity simulation featuring hundreds of thousands of entities orbiting a black hole. You can tweak various parameters—such as time, the black hole’s gravitational pull, lighting, colors, meshes, and much more. If you’d like to test it out, you can find it in the GitHub releases; there’s a ready-to-use .exe, or the source code if you’re on Linux—or if you simply want to understand how Eve works or make some modifications yourself. Problems Encountered While building the demo, I ran into—and have since resolved—some very frustrating bugs, such as memory corruption in the ECS caused by the continuous creation and destruction of entities and their components. I also added UI text support and implemented the ability to register “stages” belonging to classes or structs that can be called by the engine."}, {"post_id": 70544, "ts": "2026-09-19T10:27:28Z", "hours": 8.0992, "text": "DEVLOG 35 - Documentation Hi Stardance! Intro I’ve finally finished writing the documentation for Eve—a rather tedious and repetitive process, but a necessary one. How The Docs Is Structured: Every part of the engine is documented; inside the docs folder, you’ll find instructions on how to launch the engine, along with subfolders for each component—graphics, input, window management, and so on. Next Last Steps: I still need to create the README and tidy up a few things in the project, as well as write instructions on how to configure Eve for use on one’s own PC… But after a whole summer, I’m finally close to shipping!"}, {"post_id": 69366, "ts": "2026-09-16T22:11:41Z", "hours": 2.8144, "text": "DEVLOG 34 - Icon, Windows & More Hi Stardance! Intro The release is getting close, so I’m tidying up a few final details; I’ve finally turned my attention to a slightly more relaxed and lighthearted part of the project. Engine Settings I added a method to start the engine that accepts configuration settings for how the app runs. You can also choose whether or not to enable VSync at runtime. Window Class I added a window management class that allows for various operations, such as toggling fullscreen mode and manually changing the resolution, position, title, etc. I also included a method to set the window icon using a PNG image. Eve’s Icon I also spent some time on Canva trying to create an icon—a logo—for Eve. After several attempts, I settled on the one in the attachment."}, {"post_id": 68288, "ts": "2026-09-14T21:13:02Z", "hours": 4.0392, "text": "DEVLOG 33 - Meshes & Fixes Hi Stardance! Intro We’re getting closer to the release build of Eve! I have to say that with this devlog, the engine is practically finished and ready for shipping; I just need to tweak a few final details and we’re all set… Meshes: In this devlog, I worked on the mesh system—fleshing it out and making it functional—and added standard meshes to Eve: a cube, a UV sphere, an icosphere, a plane, and a quad. Some Bugs Fixed While implementing this, the program kept crashing for no apparent reason; after two hours of debugging, I found the error in the Render Graph—caused by the order of Eve’s internal passes—which is now fixed. Internal Shaders Organization I also embedded the engine’s internal shaders directly into the executable, so there’s no need to remember to include them alongside the executable when creating an app. The video shows the same UI as the previous devlog—featuring controls for color, rotation, cube position, and direct light direction—but this time, you can change the meshes of the “thousand-odd” cubes at runtime using the standard Eve meshes listed above, via a simple UI dropdown menu."}, {"post_id": 67640, "ts": "2026-09-13T19:52:38Z", "hours": 7.8861, "text": "DEVLOG 32 - UI Support Hi Stardance, Intro I’ve been working on the UI lately, as I wanted to give the user a way to interact with the engine beyond just mouse and keyboard input. The UI in Eve I opted for Dear ImGui and created a lightweight wrapper that allows it to run within Eve. I stripped away some of the boilerplate code associated with the standard Begin and End calls, making it slightly simpler and safer to use than raw ImGui. I also added support for dockable windows. The video shows a scene with 1,000 cubes; thanks to the UI, you can modify their color, position, and rotation. You can also change the direction of the direct light. The code required by this UI is just five lines."}, {"post_id": 65309, "ts": "2026-09-10T11:36:28Z", "hours": 0.2975, "text": "DEVLOG 31 - It’s not my fault! Hi Stardance! Unlike the other devlogs, this one is very quick and simple. A Little Recap In devlog 29, I encountered some issues with RenderDoc, even though the app kept running fine and caused no problems outside of RenderDoc itself. What I Did After doing some online research, I discovered that RenderDoc has issues with AMD drivers, which can cause the app to crash. So, I decided to try AMD’s Radeon Developer Tools (a profiler similar to RenderDoc, designed specifically for AMD GPUs). No errors were reported and everything works perfectly, so the problem most likely lies in how AMD drivers interface with RenderDoc."}, {"post_id": 64811, "ts": "2026-09-09T14:20:04Z", "hours": 5.6439, "text": "DEVLOG 30 - Compute Shaders Hi Stardance! Intro I’ve finally implemented compute shaders—as the title suggests—alongside conducting some tests and reorganizing the project. Compute Shader Support I’ve added support for compute shaders, meaning they can now be used just like any other type of pass, whether graphics or transfer. Optimizations I’ve also utilized compute shaders internally within the engine to speed up matrix calculations; here are the results: With 100,000 entities using instanced rendering, I’m getting 800 FPS, up from the previous 250. With 1,000,000 entities using instanced rendering, I’m getting around 90 FPS, up from the previous 30. With 100,000 entities using independent draw calls, I’m getting around 90 FPS, up from the previous 30. I’d say the results speak for themselves, and I’m quite happy with these optimizations. As mentioned in the previous devlog, testing was performed on my PC, which is equipped with a Ryzen 5 5600X and an RX 6600. Swapchain & CMake I also made slight modifications to the swapchain recreation code to make it faster and reduce stuttering. Finally, I tidied up the CMakeLists file to make it more organized and prepare for the release. The video shows a scene with 1M entities rendered in real-time using instanced draw call at 90 FPS"}, {"post_id": 63615, "ts": "2026-09-07T15:19:57Z", "hours": 8.0778, "text": "DEVLOG 29 - 1M Entities! Hi Stardance! Intro Since the last day, I’ve been working alone and have run into several issues… Most of them have been resolved. Some Tests So I started running some tests to check the speed of my new rendering system, and with 100,000 entities drawn to the screen with a single draw call, I was getting 30 FPS. After parallelizing the code a bit and reducing the copies, the results are now better: 100,000 entities with single draw calls get 50-60 FPS. 100,000 entities with a single instanced draw call get 230-250 FPS. 1,000,000 entities with a single instanced draw call get 30 FPS. What Need To Be Optimized Actually, I could optimize even more and double these FPS, but the current problem is that I’m calculating the matrices on the CPU side, so I’m doing a lot of calculations that currently take up a good portion of the necessary CPU time, about 50%. The idea would be to move all the work to the GPU in the future with compute shaders, thus significantly reducing the CPU load. I’ll see if I can do this… Maybe in a while, when I add full support for compute shaders. (I have a Ryzen 5 5600 X and an RX 6600) Rendering System Time: Not counting the matrices, the rendering cycle along with the Render Graph takes about 2-2.5 ms, almost all of which is spent on the Render Graph. I have also fixed some problems with Swapchain Recreation when the window is minimized. Problems With RenderDoc Five of these eight hours have been pure frustration, as I don’t understand why, but the app crashes on RenderDoc. Normally, on my PC it starts and works, but on RenderDoc it crashes… I’ve tried every way to understand the problem, but unfortunately I haven’t been able to. I’ll also test on other PCs to better understand the problem. Unfortunately, I don’t have time on my side, so I’ve had to put the issue aside for now…"}, {"post_id": 61817, "ts": "2026-09-04T22:10:27Z", "hours": 10.2261, "text": "DEVLOG 28 - New Render System Hi Stardance! Intro I think this devlog is consistent with the next one I’m working on, since the work I’ve done in the last few hours isn’t quite finished, as there are still some bugs to resolve… Why a new render system? So far, I’ve been working on improving Eve’s rendering system. Instead of having to manually create buffers and the like, Eve has a completely automated system similar to the one used by Unity. For example, when you try to draw an object, you need things like object transformation matrices. If you then need more data, the limited size of push constants is no longer enough. Per Instance Params Eve, therefore, with its new rendering system, revolutionizes the way we write code, reduces bugs, and simplifies it. For each draw call sent to the GPU, the engine sends a buffer called InstanceParams to the GPU, which contains, for each drawing instance, its model matrix and its inverse. These matrices can then be retrieved using simple, custom functions ready for use in the shader. Per Render View Data For camera data, the process is similar. For each RenderView object, Eve allocates these objects on the GPU in a contiguous buffer from which the view, perspective, VP, and other matrices can be accessed. Custom Draw Info Data If you want to send custom data to the shader, each drawing function offers a pointer called DrawInfo that allows you to send data to the shader, which can then be accessed. If set to null, the shader will not send anything. GLM & A Flycam I also created a flycam and deprecated the Eve math package to use the glm one. Honestly, I want to focus on Eve and not the math, which is why I chose this option. Next Step: I still have some bugs to fix regarding making more than one draw call, but I’m working on it."}, {"post_id": 59920, "ts": "2026-09-01T23:02:30Z", "hours": 7.4931, "text": "DEVLOG 27 - Material System Intro After some code rewrites, such as the separation between shaders and materials, the materials system now works. It’s very similar to how it works in Unity. I’ve figured out how to set things like material properties (floats, integers, vectors, etc.) directly from C++ using their names, without manually binding code. How Vulkan Handle All Of This? In Vulkan, you can’t set a shader parameter directly with a name. You need to create a buffer on the GPU, specifically a UBO, typically used for materials, bind it using a descriptor, and then bind it on the CPU. All of this is hidden by Eve, making the code easier and faster to write. What It Does? Basically, once the shader is compiled, it’s analyzed and checked for a struct called Properties. If it exists, this struct will be used for the material properties. Each field within it will be settable directly from the CPU using its name. Eve, now knowing the size of the struct and the field offsets, creates a buffer for the materials (actually, one for each frame in flight) and uses it to write everything a material might need, thus allowing for very simple parameter setting. How To Use It: The material provides an ID via the GetPropertyUBOId function, which must always be retrieved at each frame since it is not the same from frame to frame. This ID can be sent to the shader via push constant, which then allows access to the material’s property UBO, which contains all the values set on the CPU side. A simple cube rotating on itself using the new Material System and simple direct lighting"}, {"post_id": 58517, "ts": "2026-08-30T23:07:29Z", "hours": 4.8986, "text": "DEVLOG 26 - Input System Hi Stardance! The New Input System Since I couldn’t interact much with the graphics engine at the moment, I chose to create an Input System that currently only supports keyboard and mouse. It has methods like IsKeyDown(...) , GetMouseState(...) , IsMouseUp(...) , and similar ones. It’s quite simple, but it allows you to interact with the world, for example by creating a camera or a moving player. The Cube For fun and to test a bit, I tried creating a scene with a slightly rotated cube with direct light, obviously using my Render Graph, which allows you to do all this in about 150 lines of code (CPU side) instead of having to manually write barriers, configure passes, and many other repetitive tasks. I’m still using glm for matrix math, but I’m trying to reach a more stable level with the Eve package."}, {"post_id": 57455, "ts": "2026-08-29T16:33:40Z", "hours": 7.1736, "text": "DEVLOG 25 - Eve is “Multi PC” Hi everyone! What’s changed since last time? More Device Supported As promised, Eve now uses Vulkan 1.2, so it can be used on multiple devices. Obviously, the device requires that, in addition to supporting Vulkan 1.2, it also supports some extensions that became core in Vulkan 1.3. Tests On Other PCs I then tried running the app on the only PC I had at home, but it crashed. I then tried updating the graphics driver, but that didn’t help; unfortunately, that PC is too old. I then asked a friend of mine to test the app. After fixing some issues, it started, but it would crash instantly. After hours of debugging, I found the problem: the problem was in resource allocation within the Render Graph, which only occurred with integrated GPUs (my heap selection algorithm for integrated GPUs was wrong). It’s now fixed. I also added my checks for failed Vulkan or VMA calls in places where they were missing, so now everything should work properly. Math Packet In Eve I also added a small mathematical component to Eve, including Vector2,3,4 ; Vector2Int,3Int,4Int ; Quaternion ; and Matrix4x4 . I must say that quaternions were difficult to understand at first, but once you understand how they work, it’s very easy to visualize them in your head. The first attachment shows Eve running on the PC of this friend of mine, whom I thank so much for his help, and the second image shows Eve running on my PC."}, {"post_id": 55554, "ts": "2026-08-27T14:10:22Z", "hours": 4.5942, "text": "DEVLOG 24 - Error Manager, Copies & More Intro Hi Stardance! Lately, I’ve been focusing mainly on improving error handling returned by Vulkan and fixing some code here and there. New Error Manager System I’ve created a system responsible for error handling so that when an error occurs, such as a failure to allocate memory due to fragmentation or any other critical error, the app places a text file with information about the error in a folder called logs (created on the fly if it doesn’t exist). Immediately afterward, an error message is displayed on the screen explaining what happened. When the user presses the OK button, the app closes in the pop-up by calling std::abort(); . Some Test On Other PCs I tried running Eve outside of my PC on two other PCs, but since they’re a bit older, they don’t have support for Vulkan 1.4, so the app can’t be started. Swapchain Improvements The code for creating the swapchain has been improved somewhat, making it more secure and robust. New Copy Support I’ve added support for buffer and texture copy operations between resources that aren’t the same type (one transient and one persistent). Next Step: I want to make Eve a little more portable, so in the next few hours I’ll try using Vulkan 1.2, trying not to mess with the code. If necessary, I might resort to using Vulkan 1.3; I’ll see…"}, {"post_id": 54816, "ts": "2026-08-25T23:26:03Z", "hours": 3.9353, "text": "DEVLOG 23 - Instanced Draw & Some Fixes Intro Devlog time!! In the last devlog, I had some issues with instanced drawing and reading a position buffer. What Was The Problem? I worked hard, but I managed to figure out where the problem was and fix it. (The problem was due to a for loop responsible for creating the address buffers. I was saving pointers outside the for loop with structs allocated inside the for loop; therefore, the pointers were pointing to corrupted memory or nothing.) Render Graph Fixes I fixed several things in the Render Graph that could cause future problems. I added small guards within the Render Graph so that if the user does something wrong, the application doesn’t crash unexpectedly. For example, previously, if the user set a texture to display that they’d never used (never involved in a transfer operation, never used as a graphic attachment), the program would crash. With these simple guards, everything is solved. Easier Resource Usage Declaration I’ve also added the ability to easily declare textures and buffers usage in the Graphics Pass class with dedicated methods like UseBufferReadOnlyVertex(...) , UseTextureVertex(...) , and others. The image shows a grid of 20x20 quad meshes drawn with a single draw call instead of 400 using instanced draw."}, {"post_id": 54096, "ts": "2026-08-24T21:43:20Z", "hours": 10.5117, "text": "DEVLOG 22 - ECS Bugs Fixed, Graphics Files Reorganized Hi Stardance! What I Did In this dev log, I fixed some of the last bugs the ECS code, so it now works and is very efficient. I ran several tests destroying, creating, and moving entities from one archtype to another, and everything works. I then worked on the project structure of the graphics part by fixing the graphics include files. What Went Wrong These updates mentioned so far have been successful. Two hours ago, I added a method in the graphics pass responsible for instanced drawing, so I took advantage of the opportunity to create a buffer to read the instance positions to see if it worked. I still don’t know why, but it doesn’t work. The application freezes, and sometimes the driver crashes (it scared me a little… :/ ). The Validation Layers don’t report anything wrong… So I need to figure out what’s wrong and fix it. The image shows some of the methods available after fixing the folders. The methods are in the Graphics class in the include folder."}, {"post_id": 51727, "ts": "2026-08-21T15:40:39Z", "hours": 10.1514, "text": "DEVLOG 21 - ECS Refactoring Intro Over the past ten hours, I’ve worked extensively on the ECS , making it more robust, easier to use, more secure, and more efficient. What’s changed: New Way To Record Entity Commands Entity Command Pools are still used, but they’re managed not by the user but by the Entity Manager. The old CreateCommandPool() method no longer exists. Now, to execute a command on entities, you make a request to the EntityManager , which takes the command and places it in an EntityCommandPool of its choosing. The EntityCommandPool is chosen based on the SystemId provided by the engine with methods like Start, Awake, Update, etc. This reduces complexity and allows for systems that can run natively in parallel on multiple threads. Improved Efficiency Internally, the Entity Manager has improved the way to compact batches after command execution, making it simpler and faster. Instead, iterating over all batches only iterates on the entities that are no longer valid, and those slots are refilled with the components of the valid entities at the end of the last batches. Batch creation and destruction is handled automatically by the EntityManager . New Way To Query Tables The way to find tables with certain requirements has improved; the old method required registering a query and then returning a “ticket” used to access the query results. The operation is now simpler and more unified: The EntityManager is asked for all tables that meet the QueryInfo structure requirements, such as the archtype. The EntityManager checks whether the query already exists; if it doesn’t, it calculates it on the fly and returns it. Queries Updated Only When Needed Queries are updated only when tables are created/destroyed; otherwise, they remain - static and aren’t updated, saving calculations . The next step will be to verify if everything works, since I haven’t tested anything yet because I’m forced to do this devlog due to the ten-hour time limit. :/ Sorry about the picture, it’s the same, I didn’t have time to do anything else"}, {"post_id": 48967, "ts": "2026-08-17T15:28:34Z", "hours": 5.8128, "text": "DEVLOG 20 - A Better Triangle Intro Hi Stardance! This triangle was created with Render Graph . The entire process is divided into two steps: the first draws the triangle on a user-selected image, and the second takes that image, samples it, and draws it on the swapchain so the triangle can be seen on screen. Clean and Simple API The beauty of this is evident in the photo (third attachment). You only need to write a few lines of code to achieve all this compared to the complexity and number of lines of code required by Vulkan. Render Graph thus creates all the resources needed for synchronization, such as barriers , and attempts to alias memory whenever possible. It also leverages Resource Pooling , so images aren’t destroyed and recreated at every frame. Instead, if they have identical requirements, they are reused, avoiding unnecessary Vulkan calls. MSAA Deprecated MSAA images have been deprecated because, from a desktop computer perspective, they aren’t worth using because they require a lot of computational resources. To achieve anti-aliasing, it’s best to use post-processing passes that use FXAA (Fast Approximate Anti-Aliasing) or TAA (Temporal Anti-Aliasing). There are probably some bugs still present in the Render Graph despite the many already fixed; I’ll work on them."}, {"post_id": 47136, "ts": "2026-08-14T20:10:25Z", "hours": 9.8778, "text": "DEVLOG 19 - Colors! Hi Stardance! I’ve made some progress and finally drew something on the screen! Improvements on the Swapchain Pass I’ve improved the Render Graph a bit by cleaning up old methods and making all the improvements discussed in the last devlog, such as improving the rendering code for the swapchain. Normally, you would set the 2D texture to display on the screen using the RenderGraph::SetPresentTexture(); In reality, this texture isn’t displayed directly on the screen but is first sampled and copied to the swapchain, so the Render Graph adds a hidden pass for this. When this texture hasn’t been assigned to any texture, the swapchain will be colored with the clear value set to black and sent to the screen. Push Constants Supported I’ve added the ability to use Vulkan Push Constants. Push Constants are data packets that can be sent to the GPU in parallel with the drawing command. Their size is very limited, 128 bytes, but their transfer speed is extremely fast. A hardware limitation is that the offset and size parameters must be multiples of four, so I used a struct called Words32 to dictate the 32-bit size and offset, not the 8-bit one. Furthermore, internally, the engine checks the state of the previous push constant for each push constant update, so as not to make unnecessary updates and to register the push constant command only when necessary, and only partially for the relevant bytes. Shaders Improvements I improved the shader code a bit by reducing the arguments needed to create a shader, and I also unified the layout; all shaders use the same VkPipelineLayout . The Problem and The Solution When I was writing the shaders to get these things on screen, I ran into errors telling me I was assigning a buffer descriptor to Descriptor Set 0 with binding 0, even though they’re actually textures. However, in the shader, I wasn’t requesting any of this, since the vertex data was written directly into the shader. After some research, I discovered that Slang shaders were creating bindings for these arrays outside the shader. To fix this, I simply moved the arrays into the vertex shader function, marking them with const. And note that all these images/videos use the swapchain pass, so this was all just a test. Now I’ll have to try declaring a real pass with Render Graph and try to draw something, hoping everything works correctly :/"}, {"post_id": 44624, "ts": "2026-08-10T14:56:52Z", "hours": 10.0239, "text": "DEVLOG 18 - More Refactoring Hi Stardance! I don’t know what to say about this devlog, since I’ve written a lot of code for my specific implementation… I’ll try to describe what I did without being too boring. Why I refactored again? As discussed in the previous devlog, I felt the code wasn’t “nice” or at least not very tidy, and honestly, I don’t like that very much, so I rewrote the Render Graph (partially) for the third time. Now, the Render Graph only manages single-frame resources, while all multi-frame resources are managed by a separate class called TransientResourcePool, which is therefore responsible for storing the resources. The Render Graph: A single frame responsibility The Render Graph is still responsible for memory aliasing and resource pooling, of course, as well as generating barriers and inserting the draw, copy, and, in the future, compute commands. (I still need to improve the code for compiling commands into the Command Buffers a bit.) Improvement in the searching of pooled resources Now, searching for resources to reuse is even faster, since resources are divided by their composition, for example. For textures, the parameters for this division are height, depth, width, samples, etc. This allows you to immediately find a resource if it’s available. More organization is the TransientResourcePool The TransientResourcePool is also responsible for permanently destroying unused resources for several frames. I had written the destruction code within the TransientResourcePool, but I thought maybe it wasn’t its responsibility, but rather an existing class called MemoryBin. The MemoryBin class was configured to work only for persistent resources, but now it handles the destruction of persistent and transient resources. What I need to fix: There’s a small problem in the code: Normally, when you want to destroy a resource, it’s queued and usually assigned a countdown. This countdown is a number that corresponds to the maximum frames in flight and decreases by one every frame. When this number reaches zero, the resource can be destroyed. This works perfectly, but when, for example, the swapchain needs to be recreated because the window size has changed, the GPU needs to be put into idle mode. This means that all in-flight frames have finished, and therefore all resources queued for destruction can and must be destroyed immediately, otherwise they would pile up. Otherwise, I think everything is perfect. I don’t think it will take me long to implement these little tricks, so I assume and hope :/ to start writing the code to display something on the screen soon. I’ll go back to my old, dear little triangle :)"}, {"post_id": 41971, "ts": "2026-08-06T14:41:01Z", "hours": 11.1292, "text": "DEVLOG 17 - Meshes & New Architecture Into See you again, Stardance. I’ve been implementing several things lately, as the title suggests, and I think we might soon have some geometry on the screen. Mesh System I’ve been working on meshes, creating everything needed to support mesh creation, editing, and destruction. Currently, if you create a mesh, you obviously create all the necessary buffers: one for vertex positions, one for normals, one for UVs, etc. So, for example, if I load position data and the buffer doesn’t exist, a new buffer is created and a CPU-GPU upload operation is performed. However, if the buffer exists and its size is greater than the new vertex size, the buffer isn’t reallocated to a smaller size but remains the same, reducing the number of vertices used for drawing. I’m not sure how useful this option is, but I plan to add an option to specify this in the future. Image Presentation Supported I’ve also been working on how to display an image on the screen. Currently, the Render Graph has a method that, given a texture’s Transient handle, sets that texture as the image to display on the screen. Internally, the Render Graph creates a draw pass at the end of all existing passes and then samples from the presentation texture set to draw on the swapchain. The code for all this might be a little rough at the moment; I’ll improve it later. The New Architecture For a while now, I’ve felt like the code was stepping on its own toes. I had a class called MemoryRegistry that was responsible for assigning slots to resources, allocating them, and managing their lifecycle. I didn’t like this, so I decided to rewrite much of it, splitting everything into multiple classes. Now I have a class called ResourceRegistry that provides resource IDs. A class called ResourceMapper that inserts resources into their respective global descriptors. A class called ResourceTracker that manages the resource lifecycle, their last use, which stage they were in, and similar information. Until recently, the MemoryRegistry managed both persistent and transient resources, which was a mess. I’ve decided that the MemoryRegistry should only manage persistent resources, while transient resources should be managed by a class called TransientResourcePool or something similar, which should be managed by the RenderGraph. That’s exactly what I’m working on. Some Stupid Bugs I overran the timeframe because I was partially testing the new code and encountered a stupid bug that made me lose time. (I was iterating an Array starting from the last element, but I forgot to subtract one from the size of the vector assigned to the for loop index, thus causing an out-of-memory access.) I think I’ll also rewrite a good portion of the RenderGraph first to adapt it to the new architecture. Advantages These changes will make developing new features faster and less cumbersome without having to adapt to an architecture that was poorly designed from the start. I swear that after I’ve done all this, I’ll render something to the screen, assuming there are no unforeseen issues ;)"}, {"post_id": 39763, "ts": "2026-08-02T22:53:53Z", "hours": 9.9536, "text": "DEVLOG 16 - Blank Window, Draw Calls & More The last ten hours have been very productive. As the devlog title suggests, I managed to get the classic black window, completed the code for draw calls, and also accomplished many other things. Draw Calls Commands I then completed the code for making draw calls with a simple mesh, integrating all the logic into the Render Graph. If you want to send any command to the GPU—a draw call, a copy, a dispatch, or anything else—it must necessarily go through the Render Graph. This allows me to have a central entity that can manage barriers and commands in a highly optimized, precise, and secure manner. When you want to draw something, you must declare a graphics pass. This pass has methods to execute the drawing commands, but it also has methods to set things like the texture depth/stencil to use, the target texture to draw on, etc. You can also have multiple color targets, as long as they have the same resolution. Blank Window Since I haven’t seen any tangible results on screen for a while, only code, I tried displaying a black window and then initializing the engine. The new context, window, and swapchain builders all work. The Resource Mapper, the class that manages the global descriptor set, also works. Testing the other classes will require a bit more work until I’ve got all the missing pieces, but it’s almost there. Persistent Resources Support Since creating a mesh also involves creating data and sending it to the GPU via buffers, I need a way to upload data from the CPU to the GPU. Mesh buffers are persistent, not transient. Currently, in the Render Graph code, I only had support for copying and uploading transient resources. From now on, this is also available for Persistent resources, as I’ve written the same code for them as well. I also implemented barrier generation for persistent resources so that synchronization is handled internally by the Render Graph, as with transient resources. New Resource Handles Up until now, each resource has been represented as a handle corresponding to an unsigned 32-bit number. From now on, resources are represented by two unsigned 32-bit numbers: one for the previously existing identification number and a generation number. By combining both numbers, each resource is unique, thus eliminating the possibility that if a resource is destroyed and recreated with the same ID, it could be mistaken for an older resource that no longer exists. Project Cleaning I finally cleaned up the project a bit and made it a bit more organized by dividing the files into more specific subfolders."}, {"post_id": 37211, "ts": "2026-07-29T19:14:02Z", "hours": 10.0533, "text": "DEVLOG 15 - Slang & Render Graph Reorganization So, I’ve been dividing the project into folders, making everything more organized, which wasn’t the case until now. The New Shader Language: Slang I saw that there was a more modern alternative to GLSL I could use, so I chose Slang. I created the code to create it in real time, and then I also changed the architecture of the Pipeline Builder a bit (the class responsible for creating Vulkan’s Pipeline and PipelineLayout objects). Vertex Fetch, Why Did I Choose It? I’ve been thinking for a while about forcing users of the engine to use Vertex Fetch. What is it? Well, normally when using a shader, before the Vertex Shader there’s a phase called Input Assembly that, based on the triangle indices, samples vertices from the vertex buffer, allowing them to be used directly in the Vertex Shader without manual sampling. However, this means that the layout of the vertex buffer must never change; if it were to change, you’d have to create another Pipeline object and bind it. Honestly, I don’t like this limitation very much. That’s why I removed this feature and adopted Vertex Fetch, which allows you to not specify a vertex layout, thus having as few Pipeline objects as possible. Obviously, you have to manually fetch the vertex from the respective buffer in the Vertex Shader, but frankly, it’s not a huge problem. Work In Progress On The Render Graph Another thing I’m implementing is commands that can be sent to the GPU via the Render Graph. So now you can draw, make GPU-GPU copies between buffers, between textures, and even between textures and buffers. Copies currently only support Transient resources; I’ll add the functionality for Persistent resources later. The same goes for using Compute Shaders. I’ve also added the ability to upload data from the CPU to the GPU, again for transient resources. For Persistent resources, I’ll also add this functionality later. I’m still writing the code for this, so I’m not finished yet, but I’m forced to devlog for the usual 10 hours of Stardance…"}, {"post_id": 34710, "ts": "2026-07-25T17:18:03Z", "hours": 9.9128, "text": "DEVLOG 14 - I Rewrote The Memory Aliasing Algorithm Intro Unfortunately, I don’t have anything exciting to say. I’m forced to do this devlog since I’ve reached ten hours since my last devlog, so I have to publish one, otherwise my hours wouldn’t count in full. I’ll try to share what I did, the problems I encountered, and how I solved them. The Problem I might sound crazy, but after working on the Render Graph for twenty hours, I rewrote it entirely from scratch. You might ask, why? The reason I did this was Vulkan itself. I discovered that, since I’d previously relied on VMA (Vulkan Memory Allocator) to manage memory, now that I was managing memory without it, there was something I’d overlooked: a parameter called Memory Type Index. The Memory Type Index indicates where to allocate memory. There could be a Memory Type Index for the GPU’s local memory, one for the Resizable BAR, etc. So, what’s the problem if all the Render Graph resources must live exclusively in the GPU’s local memory anyway? Wouldn’t it be enough to simply add a few lines of code and everything would be solved? Unfortunately, not because this index indicates in which memory to allocate that resource, but there’s also another parameter called Memory Type Bits, which is a bitmask that indicates in which Memory Type Indexes a resource can or cannot be allocated. All resources are allocated in the same Memory Type Index, but they may have different Memory Type Bits. This means, for example, that a texture without multi-samples cannot fit in the same memory space as a texture with multi-samples. This can also happen with the aspect mask, so a color texture and a depth texture might not fit in the same place. It could also happen with the format or tiling. The same goes for buffers, but these are more flexible than textures. The Solution My Memory Aliasing algorithm was designed without taking all this into account, so I chose to rewrite a large part of the Render Graph, trying to recycle some parts. Therefore, the Aliasing algorithm now operates on “Buckets,” which are in-memory containers containing resources that can fit in the same space. Without this distinction, memory aliasing wouldn’t be possible because a resource attempting to reuse memory used by previous resources must only check among resources with the same requirements, not among all resources. Therefore, it checks per bucket, not all existing resources. This has also made the code much cleaner and more organized."}, {"post_id": 32449, "ts": "2026-07-21T17:21:23Z", "hours": 10.0289, "text": "DEVLOG 13 - Memory Aliasing Recap In the last devlog, I explained what I did and why I was creating a Render Graph. I mentioned a concept called Memory Aliasing, but I explained it briefly. I’ve been working extensively on the Render Graph these past few hours to implement the Memory Aliasing algorithm. What is Memory Aliasing? Memory Aliasing involves having two or more resources use the same portions of memory, thus sharing that memory. For example, let’s take a texture we’ll call A. This texture is used as Depth in pass 1 and read in pass 2. Another texture, called B, is used in pass 3 and pass 4 (see photo). We could allocate both resources independently, but you can clearly see that the resources don’t overlap in the passes. Texture A begins its usage cycle in pass 1 and ends in pass 2, and immediately after, in pass 3, texture B is used for the first time. What we could do is have both textures occupy the same memory space to save VRAM. This is the concept of Memory Aliasing. Obviously, since the resources share the same memory space, barriers must be created to synchronize resource access, otherwise there would be a race condition (two threads operating in parallel on the same memory space, not just for read-only operations). Resource Pooling In addition to memory aliasing, I wanted to optimize another aspect that took me some time. In Vulkan, when you want to create resources, you use vkCreateImage and vkCreateBuffer. These functions create a handle without associating physical memory with these objects. Binding occurs later, after executing the memory aliasing algorithm, which determines which memory space to assign to a resource. This means that I have to create and destroy resource handles every frame, which apparently isn’t a light operation to perform on multiple resources. So I thought that if there was a possibility, I could reuse handles from previous frames by simply comparing whether the settings of the requested handle were the same as the one to be reused and then binding the memory. The Problem and the Solution This was the idea I had, but unfortunately it’s not feasible because Vulkan doesn’t allow memory binding to a resource more than once, so this approach wouldn’t have worked. After thinking for a while about how to solve this, I decided to include in the requirements for using old handles, in addition to the texture or buffer settings, the offset and stride of how they were bound in memory. This way, if the pass structure and usage hadn’t changed significantly during the user’s setup phase, the Memory Aliasing algorithm would always produce the same results, given the deterministic nature, making this all feasible. Finally, if the resources aren’t reused for an N number of consecutive frames, they are permanently destroyed."}, {"post_id": 30667, "ts": "2026-07-18T13:14:32Z", "hours": 9.9683, "text": "DEVLOG 12 - Render Graph, Code Refactoring A Little Recap In the last devlog, I mentioned I watched the 2017 GDC conference, where they explained how the Frostbite development team had created a Render Graph. But what is a Render Graph, and what is it used for? To answer this question, we must first understand how the GPU works. The Difference: CPU & GPU First, a GPU, unlike a CPU, performs all its operations in parallel. When we write code for the CPU, we say: do this operation, then this, then that, and so on. The CPU performs its operations synchronously, in sequential order. The GPU, however, doesn’t work that way. If we tell the GPU that we want to draw three objects, we can send it three draw calls, which we’ll call A, B, and C. These draw calls are sent in order, so first A, then B, and then C. The order in which the commands are sent doesn’t correspond to the order in which they are executed, because the GPU could execute the commands in this order: C, B, A, or B, A, C, or A, C, B, and so on. This is because, while operation A might be in progress, operation B might start executing, so both commands will use the same resources and therefore run into a race condition if both operations are not read-only. The Problem From this perspective, the GPU is very powerful because it tries to stay constantly busy, eliminating dead time. However, this greatly complicates things on the synchronization side. Let’s take two operations: operation A that writes an image and operation B that reads the image. How can we be sure that the GPU executes operation A first and not B? Who can assure us that the GPU, while executing A, doesn’t have to execute B? The answer to all these questions is no one. How Graphics APIs Handle All Of This In graphics APIs like OpenGL, all of this is hidden from the programmer, so they don’t have to worry about it. But in graphics APIs like Vulkan and DirectX 12, this is the programmer’s responsibility. The programmer must write a barrier and tell the GPU not to touch the image from operation B before A has finished. For a few barriers, this is feasible, but as soon as you write more complex applications, making the code sufficiently organized, non-repetitive, and fast to develop becomes very challenging. This is why the concept of a Render Graph exists. What A Render Graph Does A Render Graph allows the programmer to specify which steps the GPU should execute, which operations resources like images and textures will perform, and in what order. The Frame Graph looks at this graph constructed by the programmer at each frame and internally understands where barriers and sometimes semaphores are needed (if we’re working with multiple queues, that’s not the case for me). Another responsibility of the Frame Graph is to internally allocate and manage resources that only exist within a single frame, called transient resources. Finally, I’m implementing Memory Aliasing. This reduces the memory used by resources: for example, if resource A is used for the last time in pass 3 and resource B for the first time in pass 4, they can share the same physical memory, thus reducing the overall memory requirement. Bonus I’ve also restructured the texture creation methods, making them simpler and allowing for fewer specifications. The before and after is a good result… The same goes for 1D and 3D textures."}, {"post_id": 28272, "ts": "2026-07-14T12:58:23Z", "hours": 10.2439, "text": "DEVLOG 11 - BDA, Pipeline, Shaders In the last devlog, I explained how I wanted to structure my bindless descriptor set. With that approach, I had a buffer for each data type. This approach works, but it’s a bit cumbersome, so I switched to using Buffer Device Addresses (BDAs). The idea behind it is: Create buffers, around VRAM, placing the buffers within VRAM memory pools. Instead of saving the physical data inside the descriptor buffer, we can only save pointers to the buffers, so I’ll have a buffer of pointers to the buffers scattered across VRAM. Since the pointers take up 8 bytes, managing the buffer is very simple, as it will be very light. So, essentially, I separate the physical data of the buffers from the shader binding logic. Rather than using namespaces to hide the internal implementation, I chose to use Hadles, which are simply numbers that identify that resource. So I could have a BufferHandle, ImageHandle, SamplerHandle, PipelineHandle, and so on. I chose not to call the structure that manages all this with names that might be reminiscent of the Vulkan API, but instead called this system Resource Mapper. At the moment, I think I’ve done something wrong with the code: Since the buffers are simply exposed via a 32-bit index, internally the buffer index corresponds to the index of the vector in which the Vulkan buffer handles and all the allocation information are allocated. I think I’ve erred in saving the buffers in vector indices that don’t match their exposed handle index outside of Eve. This causes access to incorrect buffers or buffers that don’t even exist, causing UBs or crashes. I still need to verify this issue and, if it occurs, I’ll have to fix it. Furthermore, yesterday I added all the code responsible for creating the graphics pipeline and compiling the shaders. This code is still a bit rough and needs improvement. Furthermore, since I don’t want the user to have to manage synchronization outside of the engine, I’ve been thinking about how to structure a Render Graph. I saw Frostbite’s presentation at GDC 2017 where they explained how their Render Graph works and that gave me some insights."}, {"post_id": 25895, "ts": "2026-07-10T11:55:09Z", "hours": 11.2272, "text": "DEVLOG 10 - Working On The Vulkan Wrapper For now, I’m focused on creating a wrapper for Vulkan to make it simpler and less repetitive to use. I don’t want to create a wrapper that abstracts too much, thus losing control; instead, I’m creating a fairly thin wrapper. I’m currently restructured the Application class a bit and divided some of its parts into three “modules.” I’m structuring this using the Factory Pattern. I’ve created three Builders: one for the window and SDL initialization, one for creating a Vulkan context—VulkanInstace, PhysicalDevice, LogicalDevice, and the graphics queue—and the last one for building the swapchain. I chose this approach because I consider it flexible and I don’t want everything to fit into one huge monolith; I prefer having multiple modular classes. In addition to these more or less complete builders, I’m focusing on creating a system that can allow shaders to see and manipulate the data stored in VRAM. This is usually done with DescriptorSets, which have been the standard for years. They’re more or less like pointers to objects in VRAM so shaders can access them. In reality, they’re fat pointers because they contain other information besides the address. However, this approach is good but not optimal because it introduces CPU overhead. Since the draw calls may not share the same materials and therefore require different textures, a new DescriptorSet must be bound before each draw call, which, with many draw calls, incurs CPU overhead. What I’m doing to solve this problem is looking towards a more modern and efficient approach called Bindless. Basically, instead of having multiple small DescriptorSets, you have one huge global DescriptorSet that contains all the resources used by the application. So we could have a sort of array containing all the samplers, then another containing all the textures, another containing all the buffers of a specific type, etc. Then we just need to bind this DescriptorSet at the start of rendering, which will be used for the entire rendering process, and pass indices to the shader that will tell it which resources to use from the DescriptorSet. I’m a little slow in developing all this because I’ve never used Vulkan; in fact, I’m still learning. The second reason is that Vulkan is very complex and there’s a lot of boilerplate code. I still have to finish the ECS system since I don’t yet have a centralized approach for obtaining the IDs and GenerationIds of new entities, which are verified and therefore safely managed internally by the engine. But I think I’ll do it later since I’m a little tired of fiddling with entities and want to do something different for a while."}, {"post_id": 21085, "ts": "2026-07-02T21:28:10Z", "hours": 4.3578, "text": "DEVLOG 9 - 100K Entities After the last devlog, in which I rendered 1K entities, I tried increasing the number of entities to a 15x15x15 cube, or 3375 entities, and I saw the frame rate drop unexpectedly, 25 FPS. I was wondering if this was normal or not… Apparently, it wasn’t… I tried to figure out the problem, but it wasn’t easy. I tried using a tool called RenderDoc that lets you see what’s happening on the GPU, so all the calls, data passed to the GPU, buffers, textures, etc. That information also included the time, and the GPU indicated it was taking about 16 ms, which was quite strange. I started to suspect Vulkan’s validation layers. By disabling them, I got to 30 FPS or a little higher, I don’t remember exactly. Then I disabled ASan and set the swapchain to Immediate Mode so as not to be constrained by the screen refresh rate, and I got to about 100 FPS. Then I made several CPU-level optimizations at the code level by changing the way components are obtained from batches in my ECS system, specifically limiting those operations that can be avoided in the internal component iteration loop, and I got up to 140 fps. Finally, the thing that made me open my eyes and say WOW was compiling in Release and not Debug, the fps skyrocketed to around 2300… I couldn’t believe it either… After doing all this, I rendered 100,000 entities and my fps were stable at 90… Incredible! Finally, just for the sake of curiosity, I tested 1,000,000 entities and got 9 fps, which is good because it means the system scales linearly. This is what I’ve been doing for the last two hours. Before that, I spent some time revisiting my ECS code to make it more secure. For example, many of the Table and EntityManager methods now return references and not pointers. I’ve also made the ComponentRegistry class much more efficient by storing component information in contiguous arrays instead of lists, which therefore contain non-contiguous data. Next Steps: I need to implement a way to get verified IDs from the EntityManager, since currently the IDs are only manual and non-unique. And then I’ll need to refactor the rendering code again, making it more modular, since it’s currently all in a single class."}, {"post_id": 20319, "ts": "2026-07-01T21:44:13Z", "hours": 9.6286, "text": "DEVLOG 8 - 1K Entities I implemented several things: One of these is a manager that allows systems to register their functions so they can be called, for example, when Update, Start, LateUpdate, etc. I implemented Address Sanitizer in the project to detect leaks, overflows, or out-of-bounds reads, thus uncovering some bugs. I didn’t understand why, but ASan was having trouble integrating with the project; apparently, the shaderc library was causing problems because it had a different connotation than the project. I finally solved the problem by telling CMake to use the Release version of shaderc, not Debug. I created a test system called S_Test, which I used to verify that I could create and manage multiple entities (apparently, yes). After having several memory issues, which I resolved with the help of ASan, I also started creating a camera component so I could move freely in 3D space. I’ve improved the security of the code; Entity Command Pools now no longer need to be created by the programmer, but by the Entity Manager itself, which manages them. This minimizes the risk of freeing memory too early, resulting in cleaner code for the game. Furthermore, the EntityCommandInfo and QueryInfo classes can now be allocated on the stack rather than the heap, resulting in a more secure program. Finally, for fun, I wanted to try creating a thousand entities, also to see if the system was capable of it and if there were any problems. I have to say, I’m quite happy with the result. Next Step: I still have to improve several parts of the code to make it more secure and faster, such as the Component Registry."}, {"post_id": 18339, "ts": "2026-06-29T13:31:38Z", "hours": 6.0772, "text": "DEVLOG 7 - Code Reorganization I tried to reorganize the project so that the headers needed by users of the engine are visible, while the internal, and therefore unnecessary, ones are not. What do I mean? Let’s say we have a class called A. This class is used by the engine itself, but it can also be used by the developer, for example, to record commands or something similar. So the developer will include class A in their header or source files so it can be used. But there’s a problem: Header A could include other headers that aren’t necessarily needed by the developer using the engine, thus polluting the headers. How do I solve this problem? Since I haven’t used C++ for years, I’ve been researching the problem online for months and found the following solutions: Forward Declaration - This consists of declaring the required class in the header, in this case A, without using the include directive, which literally copies the headers included in the file containing the directive. This seems like a good method, but unfortunately the data can’t be variable by value, only by reference or pointer, since the compiler must know at compile time how much memory that specific object occupies. Pimpl Idiom - This involves enclosing or encapsulating the information needed for the internal functioning of A in a class or struct that is hidden from the developer using the engine. This method could work and is almost standard, but personally, I don’t really like the idea of having to create another structure to achieve this goal. It’s more of a workaround, since the language has significant limitations in this regard. C++20 Modules - Modules are a new way of programming in C++ because, among other things, they solve this problem. They also reduce compilation times and avoid separating the code into two separate files (.hpp and .cpp). I tried using them, and from a compiler perspective, they work great (I’m using Clang), but from a Clangd perspective, the situation is quite different: While the compiler support is fairly mature, Clangd still has several issues; in fact, it reported errors everywhere. I even tried modifying the .clangd file by adding various flags, but the situation didn’t improve. There are other methods, such as Fast Pimpl, but they aren’t as flexible. What I’m looking for is something flexible that generally works in all conditions and doesn’t introduce overhead, which Pimpl Idiom doesn’t. The final solution was to use namespaces . All the public headers that must be used by the developer using the engine are in the Eve/ namespace, while the internal headers that shouldn’t be used by the developer are in a namespace called Eve/Internal. If the developer uses these files, it’s their fault; they’re marked as internal to the engine and therefore shouldn’t be used. I also changed build system and switched to CMake as it is more widespread in the C++ community and this can also give an advantage in the engine configuration section for other users"}, {"post_id": 15067, "ts": "2026-06-24T14:08:55Z", "hours": 28.5411, "text": "DEVLOG 6 - Crash, Crash, Crash and…. Crash What I did After spending several hours designing my ECS architecture, I realized I could do better, so I basically started from scratch and, as I mentioned in the previous devlog, I chose to use Archtypes so everything would be extremely efficient. Maybe I’m a bit too obsessed with performance… The Problem Anyway, after finishing the entire system, I started the app and it crashed. After several hours of debugging with simple print(); I thought the problem was in the memory, but I couldn’t figure out where… I finally decided to use Address Sanitizer, a tool that alerts you to out-of-bounds writes or reads, which allowed me to pinpoint the problem. I had performed a nonsensical multiplication, so the memory pointer was pointing to the wrong place, specifically to the end of the allocated memory portion, causing the metadata to be overwritten. (Apparently, when allocating memory, the program itself allocates additional memory slices that store information about the allocated memory portion.) The problem was that the app didn’t always crash, only sometimes, and I didn’t understand why. But I finally managed to get it working… The Result At the moment, this is a single entity, and since I haven’t tested the rest of the code, such as the destruction logic and entity transitions from one archtype to another, there are likely other bugs waiting for me."}, {"post_id": 9873, "ts": "2026-06-16T10:28:19Z", "hours": 4.6411, "text": "DEVLOG 5 - The ECS Architecture Since I can now draw something on the screen, I’d say it’s time to start building the actual graphics engine. The first system I need to create for Eve is the management of game objects. There are two options: the first is to use the OOP programming paradigm and therefore manage game objects just like Unity does; the other, which is the one I chose, is to use the ECS (Entity, Component, System) architecture. To understand why I chose ECS, you need to understand how this architecture works. As I mentioned, the word ECS is an acronym for Entity, Component, and System, which represent the three pillars on which this architecture is based. In short, entities represent objects, the essence of the object; that object simply exists, and they are usually represented by a simple numeric ID. Components, on the other hand, represent pure data; therefore, each entity can have its own components and therefore its own data. Systems, on the other hand, are the part of the code that executes the logic. Let’s take the rendering system as an example. This will iterate over all entities that have mesh components, and a transform will take their data and send it to the GPU for rendering. This division of responsibilities ensures incredible efficiency, given how the CPU works, since the component data is stored contiguously in memory. This facilitates the work of a CPU component called the Hardware Prefetcher, which tries to predict which portion of RAM the CPU will use next, thus reducing cache misses. There are many ready-to-use libraries for this architecture, such as Flecs, EnTT, and others. I chose to try and create my own so I could learn and understand more. Currently, I’m using, broadly speaking, the same approach Unity uses with their ECS architecture, which is part of their Unity DOTS ecosystem. All entities in the game can be classified based on an ID called an Archtype, which identifies the type of entity being viewed based on its components. This way, you can have contiguous arrays and minimize cache misses, thus maximizing CPU efficiency. I’m still working on it, but I have to say it’s extremely interesting…"}, {"post_id": 8166, "ts": "2026-06-13T16:39:12Z", "hours": 4.5819, "text": "DEVLOG 4 - Textures! I finally managed to use textures; Vulkan has a bit of boilerplate in their configuration, especially with the descriptor sets. This was the part that slowed me down a bit. The code isn’t very tidy at the moment… For now, I’ve focused more on learning, so I haven’t written anything extremely tidy and readable. As I said, I’ve only learned the basics so far. Now that I feel more confident about the subject, I think I’ll start writing something. I’m thinking of a framework or something simple that allows you to draw geometry on the screen without having to write hundreds of lines of code directly with Vulkan. So, more generally, I think I’ll create a layer of abstraction while still trying to maintain excellent flexibility."}, {"post_id": 7178, "ts": "2026-06-11T23:53:28Z", "hours": 2.3814, "text": "DEVLOG 3 - First Cube!!! How satisfying, my first 3D object! Since previously all vertices were written manually in the shader, I opted to learn how to create buffers to load more complex 3D geometry onto the screen. I’m loading the resources directly into a specific portion of memory called Host Visible, where the CPU can also write, and the GPU’s reading isn’t as fast as it could be. If I instead allocate the memory in a portion of VRAM called Device Local, the GPU will be very fast at accessing the data, but the CPU, on the other hand, won’t be able to do anything with that memory. To modify it, you need to first allocate the data in an intermediate buffer called Staging Buffer, and then from there the data can go to Device Local memory (the GPU’s fast memory). I also added some transformations and rotations with GLM to rotate the cube, and this is the result, which is nice. I think I’ll try using Device Local memory by loading data to it, as discussed before, with a Staging Buffer and after that I think I’ll start experimenting with textures."}, {"post_id": 6502, "ts": "2026-06-10T22:34:52Z", "hours": 9.0367, "text": "DEVLOG 2 - Consolidation of things learned Well, What’s new? Just a square? It might not seem like much, but yes. I spent all these hours rewriting the entire code from scratch so I could understand where I had the most doubts and therefore review some concepts. Synchronization was and still is the most difficult concept to grasp; understanding how the semaphores and barriers are linked together wasn’t easy for me, and I must admit I still have some doubts about it, but certainly much less than before. Given the asynchronous nature of the graphics card, you can’t program operations that will be executed in order, unlike the CPU, and this is one of the graphics card’s strengths and weaknesses. You can parallelize many operations, but you have to be careful how they are linked together and synchronize them as correctly as possible. My next step, I think, will be to use buffers to give more complex geometry to the shaders, primarily for drawing 3D geometry. I also think I still have to delve deeper and better understand things like semaphores, timeline semaphores, and barriers, which are topics I feel I haven’t internalized as well as others."}, {"post_id": 5182, "ts": "2026-06-08T21:32:27Z", "hours": 11.6153, "text": "DEVLOG 1 - Hello Triangle!!! Finally, after several hours trying to understand how Vulkan works, watching and reading several tutorials, I got it, my first triangle, isn’t it cute?🫠🫠 I’ve figured out most of the things, but I think I need to delve a little deeper into the process of creating a pipeline with dynamic rendering and synchronization. These are the two topics that have been giving me the most trouble. I think the next step will be to re-explore the code and try to create something on my own, without a guided tutorial, to see if I’ve really understood the concepts."}]...
|
Title: Eve by @Light | Stardance
Devlogs:
DEVLOG Title: Eve by @Light | Stardance
Devlogs:
DEVLOG 1 - Hello Triangle!!! Finally, after several hours trying to understand how Vulkan works, watching and reading several tutorials, I got it, my first triangle, isn’t it cute?🫠🫠 I’ve figured out most of the things, but I think I need to delve a little deeper into the process of creating a pipeline with dynamic rendering and synchronization. These are the two topics that have been giving me the most trouble. I think the next step will be to re-explore the code and try to create something on my own, without a guided tutorial, to see if I’ve really understood the concepts.
DEVLOG 2 - Consolidation of things learned Well, What’s new? Just a square? It might not seem like much, but yes. I spent all these hours rewriting the entire code from scratch so I could understand where I had the most doubts and therefore review some concepts. Synchronization was and still is the most difficult concept to grasp; understanding how the semaphores and barriers are linked together wasn’t easy for me, and I must admit I still have some doubts about it, but certainly much less than before. Given the asynchronous nature of the graphics card, you can’t program operations that will be executed in order, unlike the CPU, and this is one of the graphics card’s strengths and weaknesses. You can parallelize many operations, but you have to be careful how they are linked together and synchronize them as correctly as possible. My next step, I think, will be to use buffers to give more complex geometry to the shaders, primarily for drawing 3D geometry. I also think I still have to delve deeper and better understand things like semaphores, timeline semaphores, and barriers, which are topics I feel I haven’t internalized as well as others.
DEVLOG 3 - First Cube!!! How satisfying, my first 3D object! Since previously all vertices were written manually in the shader, I opted to learn how to create buffers to load more complex 3D geometry onto the screen. I’m loading the resources directly into a specific portion of memory called Host Visible, where the CPU can also write, and the GPU’s reading isn’t as fast as it could be. If I instead allocate the memory in a portion of VRAM called Device Local, the GPU will be very fast at accessing the data, but the CPU, on the other hand, won’t be able to do anything with that memory. To modify it, you need to first allocate the data in an intermediate buffer called Staging Buffer, and then from there the data can go to Device Local memory (the GPU’s fast memory). I also added some transformations and rotations with GLM to rotate the cube, and this is the result, which is nice. I think I’ll try using Device Local memory by loading data to it, as discussed before, with a Staging Buffer and after that I think I’ll start experimenting with textures.
DEVLOG 4 - Textures! I finally managed to use textures; Vulkan has a bit of boilerplate in their configuration, especially with the descriptor sets. This was the part that slowed me down a bit. The code isn’t very tidy at the moment… For now, I’ve focused more on learning, so I haven’t written anything extremely tidy and readable. As I said, I’ve only learned the basics so far. Now that I feel more confident about the subject, I think I’ll start writing something. I’m thinking of a framework or something simple that allows you to draw geometry on the screen without having to write hundreds of lines of code directly with Vulkan. So, more generally, I think I’ll create a layer of abstraction while still trying to maintain excellent flexibility.
DEVLOG 5 - The ECS Architecture Since I can now draw something on the screen, I’d say it’s time to start building the actual graphics engine. The first system I need to create for Eve is the management of game objects. There are two options: the first is to use the OOP programming paradigm and therefore manage game objects just like Unity does; the other, which is the one I chose, is to use the ECS (Entity, Component, System) architecture. To understand why I chose ECS, you need to understand how this architecture works. As I mentioned, the word ECS is an acronym for Entity, Component, and System, which represent the three pillars on which this architecture is based. In short, entities represent objects, the essence of the object; that object simply exists, and they are usually represented by a simple numeric ID. Components, on the other hand, represent pure data; therefore, each entity can have its own components and therefore its own data. Systems, on the other hand, are the part of the code that executes the logic. Let’s take the rendering system as an example. This will iterate over all entities that have mesh components, and a transform will take their data and send it to the GPU for rendering. This division of responsibilities ensures incredible efficiency, given how the CPU works, since the component data is stored contiguously in memory. This facilitates the work of a CPU component called the Hardware Prefetcher, which tries to predict which portion of RAM the CPU will use next, thus reducing cache misses. There are many ready-to-use libraries for this architecture, such as Flecs, EnTT, and others. I chose to try and create my own so I could learn and understand more. Currently, I’m using, broadly speaking, the same approach Unity uses with their ECS architecture, which is part of their Unity DOTS ecosystem. All entities in the game can be classified based on an ID called an Archtype, which identifies the type of entity being viewed based on its components. This way, you can have contiguous arrays and minimize cache misses, thus maximizing CPU efficiency. I’m still working on it, but I have to say it’s extremely interesting…
DEVLOG 6 - Crash, Crash, Crash and…. Crash What I did After spending several hours designing my ECS architecture, I realized I could do better, so I basically started from scratch and, as I mentioned in the previous devlog, I chose to use Archtypes so everything would be extremely efficient. Maybe I’m a bit too obsessed with performance… The Problem Anyway, after finishing the entire system, I started the app and it crashed. After several hours of debugging with simple print(); I thought the problem was in the memory, but I couldn’t figure out where… I finally decided to use Address Sanitizer, a tool that alerts you to out-of-bounds writes or reads, which allowed me to pinpoint the problem. I had performed a nonsensical multiplication, so the memory pointer was pointing to the wrong place, specifically to the end of the allocated memory portion, causing the metadata to be overwritten. (Apparently, when allocating memory, the program itself allocates additional memory slices that store information about the allocated memory portion.) The problem was that the app didn’t always crash, only sometimes, and I didn’t understand why. But I finally managed to get it working… The Result At the moment, this is a single entity, and since I haven’t tested the rest of the code, such as the destruction logic and entity transitions from one archtype to another, there are likely other bugs waiting for me.
DEVLOG 7 - Code Reorganization I tried to reorganize the project so that the headers needed by users of the engine are visible, while the internal, and therefore unnecessary, ones are not. What do I mean? Let’s say we have a class called A. This class is used by the engine itself, but it can also be used by the developer, for example, to record commands or something similar. So the developer will include class A in their header or source files so it can be used. But there’s a problem: Header A could include other headers that aren’t necessarily needed by the developer using the engine, thus polluting the headers. How do I solve this problem? Since I haven’t used C++ for years, I’ve been researching the problem online for months and found the following solutions: Forward Declaration - This consists of declaring the required class in the header, in this case A, without using the include directive, which literally copies the headers included in the file containing the directive. This seems like a good method, but unfortunately the data can’t be variable by value, only by reference or pointer, since the compiler must know at compile time how much memory that specific object occupies. Pimpl Idiom - This involves enclosing or encapsulating the information needed for the internal functioning of A in a class or struct that is hidden from the developer using the engine. This method could work and is almost standard, but personally, I don’t really like the idea of having to create another structure to achieve this goal. It’s more of a workaround, since the language has significant limitations in this regard. C++20 Modules - Modules are a new way of programming in C++ because, among other things, they solve this problem. They also reduce compilation times and avoid separating the code into two separate files (.hpp and .cpp). I tried using them, and from a compiler perspective, they work great (I’m using Clang), but from a Clangd perspective, the situation is quite different: While the compiler support is fairly mature, Clangd still has several issues; in fact, it reported errors everywhere. I even tried modifying the .clangd file by adding various flags, but the situation didn’t improve. There are other methods, such as Fast Pimpl, but they aren’t as flexible. What I’m looking for is something flexible that generally works in all conditions and doesn’t introduce overhead, which Pimpl Idiom doesn’t. The final solution was to use namespaces . All the public headers that must be used by the developer using the engine are in the Eve/ namespace, while the internal headers that shouldn’t be used by the developer are in a namespace called Eve/Internal. If the developer uses these files, it’s their fault; they’re marked as internal to the engine and therefore shouldn’t be used. I also changed build system and switched to CMake as it is more widespread in the C++ community and this can also give an advantage in the engine configuration section for other users
DEVLOG 8 - 1K Entities I implemented several things: One of these is a manager that allows systems to register their functions so they can be called, for example, when Update, Start, LateUpdate, etc. I implemented Address Sanitizer in the project to detect leaks, overflows, or out-of-bounds reads, thus uncovering some bugs. I didn’t understand why, but ASan was having trouble integrating with the project; apparently, the shaderc library was causing problems because it had a different connotation than the project. I finally solved the problem by telling CMake to use the Release version of shaderc, not Debug. I created a test system called S_Test, which I used to verify that I could create and manage multiple entities (apparently, yes). After having several memory issues, which I resolved with the help of ASan, I also started creating a camera component so I could move freely in 3D space. I’ve improved the security of the code; Entity Command Pools now no longer need to be created by the programmer, but by the Entity Manager itself, which manages them. This minimizes the risk of freeing memory too early, resulting in cleaner code for the game. Furthermore, the EntityCommandInfo and QueryInfo classes can now be allocated on the stack rather than the heap, resulting in a more secure program. Finally, for fun, I wanted to try creating a thousand entities, also to see if the system was capable of it and if there were any problems. I have to say, I’m quite happy with the result. Next Step: I still have to improve several parts of the code to make it more secure and faster, such as the Component Registry.
DEVLOG 9 - 100K Entities After the last devlog, in which I rendered 1K entities, I tried increasing the number of entities to a 15x15x15 cube, or 3375 entities, and I saw the frame rate drop unexpectedly, 25 FPS. I was wondering if this was normal or not… Apparently, it wasn’t… I tried to figure out the problem, but it wasn’t easy. I tried using a tool called RenderDoc that lets you see what’s happening on the GPU, so all the calls, data passed to the GPU, buffers, textures, etc. That information also included the time, and the GPU indicated it was taking about 16 ms, which was quite strange. I started to suspect Vulkan’s validation layers. By disabling them, I got to 30 FPS or a little higher, I don’t remember exactly. Then I disabled ASan and set the swapchain to Immediate Mode so as not to be constrained by the screen refresh rate, and I got to about 100 FPS. Then I made several CPU-level optimizations at the code level by changing the way components are obtained from batches in my ECS system, specifically limiting those operations that can be avoided in the internal component iteration loop, and I got up to 140 fps. Finally, the thing that made me open my eyes and say WOW was compiling in Release and not Debug, the fps skyrocketed to around 2300… I couldn’t believe it either… After doing all this, I rendered 100,000 entities and my fps were stable at 90… Incredible! Finally, just for the sake of curiosity, I tested 1,000,000 entities and got 9 fps, which is good because it means the system scales linearly. This is what I’ve been doing for the last two hours. Before that, I spent some time revisiting my ECS code to make it more secure. For example, many of the Table and EntityManager methods now return references and not pointers. I’ve also made the ComponentRegistry class much more efficient by storing component information in contiguous arrays instead of lists, which therefore contain non-contiguous data. Next Steps: I need to implement a way to get verified IDs from the EntityManager, since currently the IDs are only manual and non-unique. And then I’ll need to refactor the rendering code again, making it more modular, since it’s currently all in a single class.
DEVLOG 10 - Working On The Vulkan Wrapper For now, I’m focused on creating a wrapper for Vulkan to make it simpler and less repetitive to use. I don’t want to create a wrapper that abstracts too much, thus losing control; instead, I’m creating a fairly thin wrapper. I’m currently restructured the Application class a bit and divided some of its parts into three “modules.” I’m structuring this using the Factory Pattern. I’ve created three Builders: one for the window and SDL initialization, one for creating a Vulkan context—VulkanInstace, PhysicalDevice, LogicalDevice, and the graphics queue—and the last one for building the swapchain. I chose this approach because I consider it flexible and I don’t want everything to fit into one huge monolith; I prefer having multiple modular classes. In addition to these more or less complete builders, I’m focusing on creating a system that can allow shaders to see and manipulate the data stored in VRAM. This is usually done with DescriptorSets, which have been the standard for years. They’re more or less like pointers to objects in VRAM so shaders can access them. In reality, they’re fat pointers because they contain other information besides the address. However, this approach is good but not optimal because it introduces CPU overhead. Since the draw calls may not share the same materials and therefore require different textures, a new DescriptorSet must be bound before each draw call, which, with many draw calls, incurs CPU overhead. What I’m doing to solve this problem is looking towards a more modern and efficient approach called Bindless. Basically, instead of having multiple small DescriptorSets, you have one huge global DescriptorSet that contains all the resources used by the application. So we could have a sort of array containing all the samplers, then another containing all the textures, another containing all the buffers of a specific type, etc. Then we just need to bind this DescriptorSet at the start of rendering, which will be used for the entire rendering process, and pass indices to the shader that will tell it which resources to use from the DescriptorSet. I’m a little slow in developing all this because I’ve never used Vulkan; in fact, I’m still learning. The second reason is that Vulkan is very complex and there’s a lot of boilerplate code. I still have to finish the ECS system since I don’t yet have a centralized approach for obtaining the IDs and GenerationIds of new entities, which are verified and therefore safely managed internally by the engine. But I think I’ll do it later since I’m a little tired of fiddling with entities and want to do something different for a while.
DEVLOG 11 - BDA, Pipeline, Shaders In the last devlog, I explained how I wanted to structure my bindless descriptor set. With that approach, I had a buffer for each data type. This approach works, but it’s a bit cumbersome, so I switched to using Buffer Device Addresses (BDAs). The idea behind it is: Create buffers, around VRAM, placing the buffers within VRAM memory pools. Instead of saving the physical data inside the descriptor buffer, we can only save pointers to the buffers, so I’ll have a buffer of pointers to the buffers scattered across VRAM. Since the pointers take up 8 bytes, managing the buffer is very simple, as it will be very light. So, essentially, I separate the physical data of the buffers from the shader binding logic. Rather than using namespaces to hide the internal implementation, I chose to use Hadles, which are simply numbers that identify that resource. So I could have a BufferHandle, ImageHandle, SamplerHandle, PipelineHandle, and so on. I chose not to call the structure that manages all this with names that might be reminiscent of the Vulkan API, but instead called this system Resource Mapper. At the moment, I think I’ve done something wrong with the code: Since the buffers are simply exposed via a 32-bit index, internally the buffer index corresponds to the index of the vector in which the Vulkan buffer handles and all the allocation information are allocated. I think I’ve erred in saving the buffers in vector indices that don’t match their exposed handle index outside of Eve. This causes access to incorrect buffers or buffers that don’t even exist, causing UBs or crashes. I still need to verify this issue and, if it occurs, I’ll have to fix it. Furthermore, yesterday I added all the code responsible for creating the graphics pipeline and compiling the shaders. This code is still a bit rough and needs improvement. Furthermore, since I don’t want the user to have to manage synchronization outside of the engine, I’ve been thinking about how to structure a Render Graph. I saw Frostbite’s presentation at GDC 2017 where they explained how their Render Graph works and that gave me some insights.
DEVLOG 12 - Render Graph, Code Refactoring A Little Recap In the last devlog, I mentioned I watched the 2017 GDC conference, where they explained how the Frostbite development team had created a Render Graph. But what is a Render Graph, and what is it used for? To answer this question, we must first understand how the GPU works. The Difference: CPU & GPU First, a GPU, unlike a CPU, performs all its operations in parallel. When we write code for the CPU, we say: do this operation, then this, then that, and so on. The CPU performs its operations synchronously, in sequential order. The GPU, however, doesn’t work that way. If we tell the GPU that we want to draw three objects, we can send it three draw calls, which we’ll call A, B, and C. These draw calls are sent in order, so first A, then B, and then C. The order in which the commands are sent doesn’t correspond to the order in which they are executed, because the GPU could execute the commands in this order: C, B, A, or B, A, C, or A, C, B, and so on. This is because, while operation A might be in progress, operation B might start executing, so both commands will use the same resources and therefore run into a race condition if both operations are not read-only. The Problem From this perspective, the GPU is very powerful because it tries to stay constantly busy, eliminating dead time. However, this greatly complicates things on the synchronization side. Let’s take two operations: operation A that writes an image and operation B that reads the image. How can we be sure that the GPU executes operation A first and not B? Who can assure us that the GPU, while executing A, doesn’t have to execute B? The answer to all these questions is no one. How Graphics APIs Handle All Of This In graphics APIs like OpenGL, all of this is hidden from the programmer, so they don’t have to worry about it. But in graphics APIs like Vulkan and DirectX 12, this is the programmer’s responsibility. The programmer must write a barrier and tell the GPU not to touch the image from operation B before A has finished. For a few barriers, this is feasible, but as soon as you write more complex applications, making the code sufficiently organized, non-repetitive, and fast to develop becomes very challenging. This is why the concept of a Render Graph exists. What A Render Graph Does A Render Graph allows the programmer to specify which steps the GPU should execute, which operations resources like images and textures will perform, and in what order. The Frame Graph looks at this graph constructed by the programmer at each frame and internally understands where barriers and sometimes semaphores are needed (if we’re working with multiple queues, that’s not the case for me). Another responsibility of the Frame Graph is to internally allocate and manage resources that only exist within a single frame, called transient resources. Finally, I’m implementing Memory Aliasing. This reduces the memory used by resources: for example, if resource A is used for the last time in pass 3 and resource B for the first time in pass 4, they can share the same physical memory, thus reducing the overall memory requirement. Bonus I’ve also restructured the texture creation methods, making them simpler and allowing for fewer specifications. The before and after is a good result… The same goes for 1D and 3D textures.
DEVLOG 13 - Memory Aliasing Recap In the last devlog, I explained what I did and why I was creating a Render Graph. I mentioned a concept called Memory Aliasing, but I explained it briefly. I’ve been working extensively on the Render Graph these past few hours to implement the Memory Aliasing algorithm. What is Memory Aliasing? Memory Aliasing involves having two or more resources use the same portions of memory, thus sharing that memory. For example, let’s take a texture we’ll call A. This texture is used as Depth in pass 1 and read in pass 2. Another texture, called B, is used in pass 3 and pass 4 (see photo). We could allocate both resources independently, but you can clearly see that the resources don’t overlap in the passes. Texture A begins its usage cycle in pass 1 and ends in pass 2, and immediately after, in pass 3, texture B is used for the first time. What we could do is have both textures occupy the same memory space to save VRAM. This is the concept of Memory Aliasing. Obviously, since the resources share the same memory space, barriers must be created to synchronize resource access, otherwise there would be a race condition (two threads operating in parallel on the same memory space, not just for read-only operations). Resource Pooling In addition to memory aliasing, I wanted to optimize another aspect that took me some time. In Vulkan, when you want to create resources, you use vkCreateImage and vkCreateBuffer. These functions create a handle without associating physical memory with these objects. Binding occurs later, after executing the memory aliasing algorithm, which determines which memory space to assign to a resource. This means that I have to create and destroy resource handles every frame, which apparently isn’t a light operation to perform on multiple resources. So I thought that if there was a possibility, I could reuse handles from previous frames by simply comparing whether the settings of the requested handle were the same as the one to be reused and then binding the memory. The Problem and the Solution This was the idea I had, but unfortunately it’s not feasible because Vulkan doesn’t allow memory binding to a resource more than once, so this approach wouldn’t have worked. After thinking for a while about how to solve this, I decided to include in the requirements for using old handles, in addition to the texture or buffer settings, the offset and stride of how they were bound in memory. This way, if the pass structure and usage hadn’t changed significantly during the user’s setup phase, the Memory Aliasing algorithm would always produce the same results, given the deterministic nature, making this all feasible. Finally, if the resources aren’t reused for an N number of consecutive frames, they are permanently destroyed.
DEVLOG 14 - I Rewrote The Memory Aliasing Algorithm Intro Unfortunately, I don’t have anything exciting to say. I’m forced to do this devlog since I’ve reached ten hours since my last devlog, so I have to publish one, otherwise my hours wouldn’t count in full. I’ll try to share what I did, the problems I encountered, and how I solved them. The Problem I might sound crazy, but after working on the Render Graph for twenty hours, I rewrote it entirely from scratch. You might ask, why? The reason I did this was Vulkan itself. I discovered that, since I’d previously relied on VMA (Vulkan Memory Allocator) to manage memory, now that I was managing memory without it, there was something I’d overlooked: a parameter called Memory Type Index. The Memory Type Index indicates where to allocate memory. There could be a Memory Type Index for the GPU’s local memory, one for the Resizable BAR, etc. So, what’s the problem if all the Render Graph resources must live exclusively in the GPU’s local memory anyway? Wouldn’t it be enough to simply add a few lines of code and everything would be solved? Unfortunately, not because this index indicates in which memory to allocate that resource, but there’s also another parameter called Memory Type Bits, which is a bitmask that indicates in which Memory Type Indexes a resource can or cannot be allocated. All resources are allocated in the same Memory Type Index, but they may have different Memory Type Bits. This means, for example, that a texture without multi-samples cannot fit in the same memory space as a texture with multi-samples. This can also happen with the aspect mask, so a color texture and a depth texture might not fit in the same place. It could also happen with the format or tiling. The same goes for buffers, but these are more flexible than textures. The Solution My Memory Aliasing algorithm was designed without taking all this into account, so I chose to rewrite a large part of the Render Graph, trying to recycle some parts. Therefore, the Aliasing algorithm now operates on “Buckets,” which are in-memory containers containing resources that can fit in the same space. Without this distinction, memory aliasing wouldn’t be possible because a resource attempting to reuse memory used by previous resources must only check among resources with the same requirements, not among all resources. Therefore, it checks per bucket, not all existing resources. This has also made the code much cleaner and more organized.
DEVLOG 15 - Slang & Render Graph Reorganization So, I’ve been dividing the project into folders, making everything more organized, which wasn’t the case until now. The New Shader Language: Slang I saw that there was a more modern alternative to GLSL I could use, so I chose Slang. I created the code to create it in real time, and then I also changed the architecture of the Pipeline Builder a bit (the class responsible for creating Vulkan’s Pipeline and PipelineLayout objects). Vertex Fetch, Why Did I Choose It? I’ve been thinking for a while about forcing users of the engine to use Vertex Fetch. What is it? Well, normally when using a shader, before the Vertex Shader there’s a phase called Input Assembly that, based on the triangle indices, samples vertices from the vertex buffer, allowing them to be used directly in the Vertex Shader without manual sampling. However, this means that the layout of the vertex buffer must never change; if it were to change, you’d have to create another Pipeline object and bind it. Honestly, I don’t like this limitation very much. That’s why I removed this feature and adopted Vertex Fetch, which allows you to not specify a vertex layout, thus having as few Pipeline objects as possible. Obviously, you have to manually fetch the vertex from the respective buffer in the Vertex Shader, but frankly, it’s not a huge problem. Work In Progress On The Render Graph Another thing I’m implementing is commands that can be sent to the GPU via the Render Graph. So now you can draw, make GPU-GPU copies between buffers, between textures, and even between textures and buffers. Copies currently only support Transient resources; I’ll add the functionality for Persistent resources later. The same goes for using Compute Shaders. I’ve also added the ability to upload data from the CPU to the GPU, again for transient resources. For Persistent resources, I’ll also add this functionality later. I’m still writing the code for this, so I’m not finished yet, but I’m forced to devlog for the usual 10 hours of Stardance…
DEVLOG 16 - Blank Window, Draw Calls & More The last ten hours have been very productive. As the devlog title suggests, I managed to get the classic black window, completed the code for draw calls, and also accomplished many other things. Draw Calls Commands I then completed the code for making draw calls with a simple mesh, integrating all the logic into the Render Graph. If you want to send any command to the GPU—a draw call, a copy, a dispatch, or anything else—it must necessarily go through the Render Graph. This allows me to have a central entity that can manage barriers and commands in a highly optimized, precise, and secure manner. When you want to draw something, you must declare a graphics pass. This pass has methods to execute the drawing commands, but it also has methods to set things like the texture depth/stencil to use, the target texture to draw on, etc. You can also have multiple color targets, as long as they have the same resolution. Blank Window Since I haven’t seen any tangible results on screen for a while, only code, I tried displaying a black window and then initializing the engine. The new context, window, and swapchain builders all work. The Resource Mapper, the class that manages the global descriptor set, also works. Testing the other classes will require a bit more work until I’ve got all the missing pieces, but it’s almost there. Persistent Resources Support Since creating a mesh also involves creating data and sending it to the GPU via buffers, I need a way to upload data from the CPU to the GPU. Mesh buffers are persistent, not transient. Currently, in the Render Graph code, I only had support for copying and uploading transient resources. From now on, this is also available for Persistent resources, as I’ve written the same code for them as well. I also implemented barrier generation for persistent resources so that synchronization is handled internally by the Render Graph, as with transient resources. New Resource Handles Up until now, each resource has been represented as a handle corresponding to an unsigned 32-bit number. From now on, resources are represented by two unsigned 32-bit numbers: one for the previously existing identification number and a generation number. By combining both numbers, each resource is unique, thus eliminating the possibility that if a resource is destroyed and recreated with the same ID, it could be mistaken for an older resource that no longer exists. Project Cleaning I finally cleaned up the project a bit and made it a bit more organized by dividing the files into more specific subfolders.
DEVLOG 17 - Meshes & New Architecture Into See you again, Stardance. I’ve been implementing several things lately, as the title suggests, and I think we might soon have some geometry on the screen. Mesh System I’ve been working on meshes, creating everything needed to support mesh creation, editing, and destruction. Currently, if you create a mesh, you obviously create all the necessary buffers: one for vertex positions, one for normals, one for UVs, etc. So, for example, if I load position data and the buffer doesn’t exist, a new buffer is created and a CPU-GPU upload operation is performed. However, if the buffer exists and its size is greater than the new vertex size, the buffer isn’t reallocated to a smaller size but remains the same, reducing the number of vertices used for drawing. I’m not sure how useful this option is, but I plan to add an option to specify this in the future. Image Presentation Supported I’ve also been working on how to display an image on the screen. Currently, the Render Graph has a method that, given a texture’s Transient handle, sets that texture as the image to display on the screen. Internally, the Render Graph creates a draw pass at the end of all existing passes and then samples from the presentation texture set to draw on the swapchain. The code for all this might be a little rough at the moment; I’ll improve it later. The New Architecture For a while now, I’ve felt like the code was stepping on its own toes. I had a class called MemoryRegistry that was responsible for assigning slots to resources, allocating them, and managing their lifecycle. I didn’t like this, so I decided to rewrite much of it, splitting everything into multiple classes. Now I have a class called ResourceRegistry that provides resource IDs. A class called ResourceMapper that inserts resources into their respective global descriptors. A class called ResourceTracker that manages the resource lifecycle, their last use, which stage they were in, and similar information. Until recently, the MemoryRegistry managed both persistent and transient resources, which was a mess. I’ve decided that the MemoryRegistry should only manage persistent resources, while transient resources should be managed by a class called TransientResourcePool or something similar, which should be managed by the RenderGraph. That’s exactly what I’m working on. Some Stupid Bugs I overran the timeframe because I was partially testing the new code and encountered a stupid bug that made me lose time. (I was iterating an Array starting from the last element, but I forgot to subtract one from the size of the vector assigned to the for loop index, thus causing an out-of-memory access.) I think I’ll also rewrite a good portion of the RenderGraph first to adapt it to the new architecture. Advantages These changes will make developing new features faster and less cumbersome without having to adapt to an architecture that was poorly designed from the start. I swear that after I’ve done all this, I’ll render something to the screen, assuming there are no unforeseen issues ;)
DEVLOG 18 - More Refactoring Hi Stardance! I don’t know what to say about this devlog, since I’ve written a lot of code for my specific implementation… I’ll try to describe what I did without being too boring. Why I refactored again? As discussed in the previous devlog, I felt the code wasn’t “nice” or at least not very tidy, and honestly, I don’t like that very much, so I rewrote the Render Graph (partially) for the third time. Now, the Render Graph only manages single-frame resources, while all multi-frame resources are managed by a separate class called TransientResourcePool, which is therefore responsible for storing the resources. The Render Graph: A single frame responsibility The Render Graph is still responsible for memory aliasing and resource pooling, of course, as well as generating barriers and inserting the draw, copy, and, in the future, compute commands. (I still need to improve the code for compiling commands into the Command Buffers a bit.) Improvement in the searching of pooled resources Now, searching for resources to reuse is even faster, since resources are divided by their composition, for example. For textures, the parameters for this division are height, depth, width, samples, etc. This allows you to immediately find a resource if it’s available. More organization is the TransientResourcePool The TransientResourcePool is also responsible for permanently destroying unused resources for several frames. I had written the destruction code within the TransientResourcePool, but I thought maybe it wasn’t its responsibility, but rather an existing class called MemoryBin. The MemoryBin class was configured to work only for persistent resources, but now it handles the destruction of persistent and transient resources. What I need to fix: There’s a small problem in the code: Normally, when you want to destroy a resource, it’s queued and usually assigned a countdown. This countdown is a number that corresponds to the maximum frames in flight and decreases by one every frame. When this number reaches zero, the resource can be destroyed. This works perfectly, but when, for example, the swapchain needs to be recreated because the window size has changed, the GPU needs to be put into idle mode. This means that all in-flight frames have finished, and therefore all resources queued for destruction can and must be destroyed immediately, otherwise they would pile up. Otherwise, I think everything is perfect. I don’t think it will take me long to implement these little tricks, so I assume and hope :/ to start writing the code to display something on the screen soon. I’ll go back to my old, dear little triangle :)
DEVLOG 19 - Colors! Hi Stardance! I’ve made some progress and finally drew something on the screen! Improvements on the Swapchain Pass I’ve improved the Render Graph a bit by cleaning up old methods and making all the improvements discussed in the last devlog, such as improving the rendering code for the swapchain. Normally, you would set the 2D texture to display on the screen using the RenderGraph::SetPresentTexture(); In reality, this texture isn’t displayed directly on the screen but is first sampled and copied to the swapchain, so the Render Graph adds a hidden pass for this. When this texture hasn’t been assigned to any texture, the swapchain will be colored with the clear value set to black and sent to the screen. Push Constants Supported I’ve added the ability to use Vulkan Push Constants. Push Constants are data packets that can be sent to the GPU in parallel with the drawing command. Their size is very limited, 128 bytes, but their transfer speed is extremely fast. A hardware limitation is that the offset and size parameters must be multiples of four, so I used a struct called Words32 to dictate the 32-bit size and offset, not the 8-bit one. Furthermore, internally, the engine checks the state of the previous push constant for each push constant update, so as not to make unnecessary updates and to register the push constant command only when necessary, and only partially for the relevant bytes. Shaders Improvements I improved the shader code a bit by reducing the arguments needed to create a shader, and I also unified the layout; all shaders use the same VkPipelineLayout . The Problem and The Solution When I was writing the shaders to get these things on screen, I ran into errors telling me I was assigning a buffer descriptor to Descriptor Set 0 with binding 0, even though they’re actually textures. However, in the shader, I wasn’t requesting any of this, since the vertex data was written directly into the shader. After some research, I discovered that Slang shaders were creating bindings for these arrays outside the shader. To fix this, I simply moved the arrays into the vertex shader function, marking them with const. And note that all these images/videos use the swapchain pass, so this was all just a test. Now I’ll have to try declaring a real pass with Render Graph and try to draw something, hoping everything works correctly :/
DEVLOG 20 - A Better Triangle Intro Hi Stardance! This triangle was created with Render Graph . The entire process is divided into two steps: the first draws the triangle on a user-selected image, and the second takes that image, samples it, and draws it on the swapchain so the triangle can be seen on screen. Clean and Simple API The beauty of this is evident in the photo (third attachment). You only need to write a few lines of code to achieve all this compared to the complexity and number of lines of code required by Vulkan. Render Graph thus creates all the resources needed for synchronization, such as barriers , and attempts to alias memory whenever possible. It also leverages Resource Pooling , so images aren’t destroyed and recreated at every frame. Instead, if they have identical requirements, they are reused, avoiding unnecessary Vulkan calls. MSAA Deprecated MSAA images have been deprecated because, from a desktop computer perspective, they aren’t worth using because they require a lot of computational resources. To achieve anti-aliasing, it’s best to use post-processing passes that use FXAA (Fast Approximate Anti-Aliasing) or TAA (Temporal Anti-Aliasing). There are probably some bugs still present in the Render Graph despite the many already fixed; I’ll work on them.
DEVLOG 21 - ECS Refactoring Intro Over the past ten hours, I’ve worked extensively on the ECS , making it more robust, easier to use, more secure, and more efficient. What’s changed: New Way To Record Entity Commands Entity Command Pools are still used, but they’re managed not by the user but by the Entity Manager. The old CreateCommandPool() method no longer exists. Now, to execute a command on entities, you make a request to the EntityManager , which takes the command and places it in an EntityCommandPool of its choosing. The EntityCommandPool is chosen based on the SystemId provided by the engine with methods like Start, Awake, Update, etc. This reduces complexity and allows for systems that can run natively in parallel on multiple threads. Improved Efficiency Internally, the Entity Manager has improved the way to compact batches after command execution, making it simpler and faster. Instead, iterating over all batches only iterates on the entities that are no longer valid, and those slots are refilled with the components of the valid entities at the end of the last batches. Batch creation and destruction is handled automatically by the EntityManager . New Way To Query Tables The way to find tables with certain requirements has improved; the old method required registering a query and then returning a “ticket” used to access the query results. The operation is now simpler and more unified: The EntityManager is asked for all tables that meet the QueryInfo structure requirements, such as the archtype. The EntityManager checks whether the query already exists; if it doesn’t, it calculates it on the fly and returns it. Queries Updated Only When Needed Queries are updated only when tables are created/destroyed; otherwise, they remain - static and aren’t updated, saving calculations . The next step will be to verify if everything works, since I haven’t tested anything yet because I’m forced to do this devlog due to the ten-hour time limit. :/ Sorry about the picture, it’s the same, I didn’t have time to do anything else
DEVLOG 22 - ECS Bugs Fixed, Graphics Files Reorganized Hi Stardance! What I Did In this dev log, I fixed some of the last bugs the ECS code, so it now works and is very efficient. I ran several tests destroying, creating, and moving entities from one archtype to another, and everything works. I then worked on the project structure of the graphics part by fixing the graphics include files. What Went Wrong These updates mentioned so far have been successful. Two hours ago, I added a method in the graphics pass responsible for instanced drawing, so I took advantage of the opportunity to create a buffer to read the instance positions to see if it worked. I still don’t know why, but it doesn’t work. The application freezes, and sometimes the driver crashes (it scared me a little… :/ ). The Validation Layers don’t report anything wrong… So I need to figure out what’s wrong and fix it. The image shows some of the methods available after fixing the folders. The methods are in the Graphics class in the include folder.
DEVLOG 23 - Instanced Draw & Some Fixes Intro Devlog time!! In the last devlog, I had some issues with instanced drawing and reading a position buffer. What Was The Problem? I worked hard, but I managed to figure out where the problem was and fix it. (The problem was due to a for loop responsible for creating the address buffers. I was saving pointers outside the for loop with structs allocated inside the for loop; therefore, the pointers were pointing to corrupted memory or nothing.) Render Graph Fixes I fixed several things in the Render Graph that could cause future problems. I added small guards within the Render Graph so that if the user does something wrong, the application doesn’t crash unexpectedly. For example, previously, if the user set a texture to display that they’d never used (never involved in a transfer operation, never used as a graphic attachment), the program would crash. With these simple guards, everything is solved. Easier Resource Usage Declaration I’ve also added the ability to easily declare textures and buffers usage in the Graphics Pass class with dedicated methods like UseBufferReadOnlyVertex(...) , UseTextureVertex(...) , and others. The image shows a grid of 20x20 quad meshes drawn with a single draw call instead of 400 using instanced draw.
DEVLOG 24 - Error Manager, Copies & More Intro Hi Stardance! Lately, I’ve been focusing mainly on improving error handling returned by Vulkan and fixing some code here and there. New Error Manager System I’ve created a system responsible for error handling so that when an error occurs, such as a failure to allocate memory due to fragmentation or any other critical error, the app places a text file with information about the error in a folder called logs (created on the fly if it doesn’t exist). Immediately afterward, an error message is displayed on the screen explaining what happened. When the user presses the OK button, the app closes in the pop-up by calling std::abort(); . Some Test On Other PCs I tried running Eve outside of my PC on two other PCs, but since they’re a bit older, they don’t have support for Vulkan 1.4, so the app can’t be started. Swapchain Improvements The code for creating the swapchain has been improved somewhat, making it more secure and robust. New Copy Support I’ve added support for buffer and texture copy operations between resources that aren’t the same type (one transient and one persistent). Next Step: I want to make Eve a little more portable, so in the next few hours I’ll try using Vulkan 1.2, trying not to mess with the code. If necessary, I might resort to using Vulkan 1.3; I’ll see…
DEVLOG 25 - Eve is “Multi PC” Hi everyone! What’s changed since last time? More Device Supported As promised, Eve now uses Vulkan 1.2, so it can be used on multiple devices. Obviously, the device requires that, in addition to supporting Vulkan 1.2, it also supports some extensions that became core in Vulkan 1.3. Tests On Other PCs I then tried running the app on the only PC I had at home, but it crashed. I then tried updating the graphics driver, but that didn’t help; unfortunately, that PC is too old. I then asked a friend of mine to test the app. After fixing some issues, it started, but it would crash instantly. After hours of debugging, I found the problem: the problem was in resource allocation within the Render Graph, which only occurred with integrated GPUs (my heap selection algorithm for integrated GPUs was wrong). It’s now fixed. I also added my checks for failed Vulkan or VMA calls in places where they were missing, so now everything should work properly. Math Packet In Eve I also added a small mathematical component to Eve, including Vector2,3,4 ; Vector2Int,3Int,4Int ; Quaternion ; and Matrix4x4 . I must say that quaternions were difficult to understand at first, but once you understand how they work, it’s very easy to visualize them in your head. The first attachment shows Eve running on the PC of this friend of mine, whom I thank so much for his help, and the second image shows Eve running on my PC.
DEVLOG 26 - Input System Hi Stardance! The New Input System Since I couldn’t interact much with the graphics engine at the moment, I chose to create an Input System that currently only supports keyboard and mouse. It has methods like IsKeyDown(...) , GetMouseState(...) , IsMouseUp(...) , and similar ones. It’s quite simple, but it allows you to interact with the world, for example by creating a camera or a moving player. The Cube For fun and to test a bit, I tried creating a scene with a slightly rotated cube with direct light, obviously using my Render Graph, which allows you to do all this in about 150 lines of code (CPU side) instead of having to manually write barriers, configure passes, and many other repetitive tasks. I’m still using glm for matrix math, but I’m trying to reach a more stable level with the Eve package.
DEVLOG 27 - Material System Intro After some code rewrites, such as the separation between shaders and materials, the materials system now works. It’s very similar to how it works in Unity. I’ve figured out how to set things like material properties (floats, integers, vectors, etc.) directly from C++ using their names, without manually binding code. How Vulkan Handle All Of This? In Vulkan, you can’t set a shader parameter directly with a name. You need to create a buffer on the GPU, specifically a UBO, typically used for materials, bind it using a descriptor, and then bind it on the CPU. All of this is hidden by Eve, making the code easier and faster to write. What It Does? Basically, once the shader is compiled, it’s analyzed and checked for a struct called Properties. If it exists, this struct will be used for the material properties. Each field within it will be settable directly from the CPU using its name. Eve, now knowing the size of the struct and the field offsets, creates a buffer for the materials (actually, one for each frame in flight) and uses it to write everything a material might need, thus allowing for very simple parameter setting. How To Use It: The material provides an ID via the GetPropertyUBOId function, which must always be retrieved at each frame since it is not the same from frame to frame. This ID can be sent to the shader via push constant, which then allows access to the material’s property UBO, which contains all the values set on the CPU side. A simple cube rotating on itself using the new Material System and simple direct lighting
DEVLOG 28 - New Render System Hi Stardance! Intro I think this devlog is consistent with the next one I’m working on, since the work I’ve done in the last few hours isn’t quite finished, as there are still some bugs to resolve… Why a new render system? So far, I’ve been working on improving Eve’s rendering system. Instead of having to manually create buffers and the like, Eve has a completely automated system similar to the one used by Unity. For example, when you try to draw an object, you need things like object transformation matrices. If you then need more data, the limited size of push constants is no longer enough. Per Instance Params Eve, therefore, with its new rendering system, revolutionizes the way we write code, reduces bugs, and simplifies it. For each draw call sent to the GPU, the engine sends a buffer called InstanceParams to the GPU, which contains, for each drawing instance, its model matrix and its inverse. These matrices can then be retrieved using simple, custom functions ready for use in the shader. Per Render View Data For camera data, the process is similar. For each RenderView object, Eve allocates these objects on the GPU in a contiguous buffer from which the view, perspective, VP, and other matrices can be accessed. Custom Draw Info Data If you want to send custom data to the shader, each drawing function offers a pointer called DrawInfo that allows you to send data to the shader, which can then be accessed. If set to null, the shader will not send anything. GLM & A Flycam I also created a flycam and deprecated the Eve math package to use the glm one. Honestly, I want to focus on Eve and not the math, which is why I chose this option. Next Step: I still have some bugs to fix regarding making more than one draw call, but I’m working on it.
DEVLOG 29 - 1M Entities! Hi Stardance! Intro Since the last day, I’ve been working alone and have run into several issues… Most of them have been resolved. Some Tests So I started running some tests to check the speed of my new rendering system, and with 100,000 entities drawn to the screen with a single draw call, I was getting 30 FPS. After parallelizing the code a bit and reducing the copies, the results are now better: 100,000 entities with single draw calls get 50-60 FPS. 100,000 entities with a single instanced draw call get 230-250 FPS. 1,000,000 entities with a single instanced draw call get 30 FPS. What Need To Be Optimized Actually, I could optimize even more and double these FPS, but the current problem is that I’m calculating the matrices on the CPU side, so I’m doing a lot of calculations that currently take up a good portion of the necessary CPU time, about 50%. The idea would be to move all the work to the GPU in the future with compute shaders, thus significantly reducing the CPU load. I’ll see if I can do this… Maybe in a while, when I add full support for compute shaders. (I have a Ryzen 5 5600 X and an RX 6600) Rendering System Time: Not counting the matrices, the rendering cycle along with the Render Graph takes about 2-2.5 ms, almost all of which is spent on the Render Graph. I have also fixed some problems with Swapchain Recreation when the window is minimized. Problems With RenderDoc Five of these eight hours have been pure frustration, as I don’t understand why, but the app crashes on RenderDoc. Normally, on my PC it starts and works, but on RenderDoc it crashes… I’ve tried every way to understand the problem, but unfortunately I haven’t been able to. I’ll also test on other PCs to better understand the problem. Unfortunately, I don’t have time on my side, so I’ve had to put the issue aside for now…
DEVLOG 30 - Compute Shaders Hi Stardance! Intro I’ve finally implemented compute shaders—as the title suggests—alongside conducting some tests and reorganizing the project. Compute Shader Support I’ve added support for compute shaders, meaning they can now be used just like any other type of pass, whether graphics or transfer. Optimizations I’ve also utilized compute shaders internally within the engine to speed up matrix calculations; here are the results: With 100,000 entities using instanced rendering, I’m getting 800 FPS, up from the previous 250. With 1,000,000 entities using instanced rendering, I’m getting around 90 FPS, up from the previous 30. With 100,000 entities using independent draw calls, I’m getting around 90 FPS, up from the previous 30. I’d say the results speak for themselves, and I’m quite happy with these optimizations. As mentioned in the previous devlog, testing was performed on my PC, which is equipped with a Ryzen 5 5600X and an RX 6600. Swapchain & CMake I also made slight modifications to the swapchain recreation code to make it faster and reduce stuttering. Finally, I tidied up the CMakeLists file to make it more organized and prepare for the release. The video shows a scene with 1M entities rendered in real-time using instanced draw call at 90 FPS
DEVLOG 31 - It’s not my fault! Hi Stardance! Unlike the other devlogs, this one is very quick and simple. A Little Recap In devlog 29, I encountered some issues with RenderDoc, even though the app kept running fine and caused no problems outside of RenderDoc itself. What I Did After doing some online research, I discovered that RenderDoc has issues with AMD drivers, which can cause the app to crash. So, I decided to try AMD’s Radeon Developer Tools (a profiler similar to RenderDoc, designed specifically for AMD GPUs). No errors were reported and everything works perfectly, so the problem most likely lies in how AMD drivers interface with RenderDoc.
DEVLOG 32 - UI Support Hi Stardance, Intro I’ve been working on the UI lately, as I wanted to give the user a way to interact with the engine beyond just mouse and keyboard input. The UI in Eve I opted for Dear ImGui and created a lightweight wrapper that allows it to run within Eve. I stripped away some of the boilerplate code associated with the standard Begin and End calls, making it slightly simpler and safer to use than raw ImGui. I also added support for dockable windows. The video shows a scene with 1,000 cubes; thanks to the UI, you can modify their color, position, and rotation. You can also change the direction of the direct light. The code required by this UI is just five lines.
DEVLOG 33 - Meshes & Fixes Hi Stardance! Intro We’re getting closer to the release build of Eve! I have to say that with this devlog, the engine is practically finished and ready for shipping; I just need to tweak a few final details and we’re all set… Meshes: In this devlog, I worked on the mesh system—fleshing it out and making it functional—and added standard meshes to Eve: a cube, a UV sphere, an icosphere, a plane, and a quad. Some Bugs Fixed While implementing this, the program kept crashing for no apparent reason; after two hours of debugging, I found the error in the Render Graph—caused by the order of Eve’s internal passes—which is now fixed. Internal Shaders Organization I also embedded the engine’s internal shaders directly into the executable, so there’s no need to remember to include them alongside the executable when creating an app. The video shows the same UI as the previous devlog—featuring controls for color, rotation, cube position, and direct light direction—but this time, you can change the meshes of the “thousand-odd” cubes at runtime using the standard Eve meshes listed above, via a simple UI dropdown menu.
DEVLOG 34 - Icon, Windows & More Hi Stardance! Intro The release is getting close, so I’m tidying up a few final details; I’ve finally turned my attention to a slightly more relaxed and lighthearted part of the project. Engine Settings I added a method to start the engine that accepts configuration settings for how the app runs. You can also choose whether or not to enable VSync at runtime. Window Class I added a window management class that allows for various operations, such as toggling fullscreen mode and manually changing the resolution, position, title, etc. I also included a method to set the window icon using a PNG image. Eve’s Icon I also spent some time on Canva trying to create an icon—a logo—for Eve. After several attempts, I settled on the one in the attachment.
DEVLOG 35 - Documentation Hi Stardance! Intro I’ve finally finished writing the documentation for Eve—a rather tedious and repetitive process, but a necessary one. How The Docs Is Structured: Every part of the engine is documented; inside the docs folder, you’ll find instructions on how to launch the engine, along with subfolders for each component—graphics, input, window management, and so on. Next Last Steps: I still need to create the README and tidy up a few things in the project, as well as write instructions on how to configure Eve for use on one’s own PC… But after a whole summer, I’m finally close to shipping!
DEVLOG 36 - Black Hole! Hi Stardance! Intro I’ve been working really hard lately, and I think I’ve reached a milestone with Eve that I honestly never expected to hit. The project is finally complete; now I just need to click that nice button to ship it. I’ve spent this time working on the README, improving the documentation, fixing bugs, and building a demo using Eve. Eve Demo The demo is a gravity simulation featuring hundreds of thousands of entities orbiting a black hole. You can tweak various parameters—such as time, the black hole’s gravitational pull, lighting, colors, meshes, and much more. If you’d like to test it out, you can find it in the GitHub releases; there’s a ready-to-use .exe, or the source code if you’re on Linux—or if you simply want to understand how Eve works or make some modifications yourself. Problems Encountered While building the demo, I ran into—and have since resolved—some very frustrating bugs, such as memory corruption in the ECS caused by the continuous creation and destruction of entities and their components. I also added UI text support and implemented the ability to register “stages” belonging to classes or structs that can be called by the engine.
Ships:
Eve is a graphics engine written entirely in Vulkan , with the primary goal of learning Vulkan and C++ while simplifying their usage. Originally conceived as a simple, lightweight wrapper around Vulkan , Eve now includes: A Render Graph designed from scratch that leverages technologies such as memory aliasing (where multiple resources share the same memory space) and resource pooling (reusing resources across frames). It performs the core function of a Render Graph: by simply knowing how resources are utilized, it automatically issues the necessary synchronization barriers to the GPU. Developing the Render Graph was a grueling process, but it proved worthwhile in terms of both performance and the educational value of the experience. An ECS (Entity Component System) also designed from scratch, following the model of Unity’s DOTS ECS . Instead of scattering resources across VRAM—which slows down access due to constant memory jumps—game objects are organized into Archetypes. Components are distributed in contiguous memory batches, thereby minimizing cache misses. A rendering system that automates the insertion of transforms into buffers; these are subsequently processed into matrices via a compute shader and sent to the rendering shaders. It also features a material system that analyzes shader composition, looking for a struct named “Properties” that allows fields to be assigned by name from the C++ side. Support for the Slang shading language with a bindless system . Eve provides a file named Eve.slangh that simplifies and automates the retrieval of textures, buffers, and samplers from descriptors. Compute shader support is also included. An integrated, easy-to-use Input system inspired by Unity’s Input System , along with a lightweight UI wrapper that makes using Dear ImGui simpler and more intuitive. Eve also includes a demo featuring a gravitational simulation of thousands of entities orbiting a black hole, allowing various parameters to be adjusted in real-time....
|
1793008124.1295273
|
1793094524.1295273
|
|
7178
|
WAS-CLI by @S_U_Wasi | Stardance
|
S_U_Wasi
|
1
|
5.66
|
30
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-28T06:42:59Z", "hours": 4.0, "multiplier": 8.07, "payout": 30, "blessing": "neutral", "text": "I have developed was-cli. It is a version control and time-machine like feature for documents. It’s core work (but not limited) is to save documents version (edits) in a very smart way. It only saves the edit, so, whenever a user tries to get back the previous document, was only takes that part of the document to it’s previous form (This reduces the problem of saving copies of document and reduces storage issues). Currently was support any text formate. Features: was save- save the current document version was watch- this command will make was to constantly look for new edit in the assigned document and save it automatically. was differ: To see what exactly changes and where between versions was status- Shows the current status of the document and more (In total 10 different features). To use WAS perfectly, user must use terminal command exactly how it was programmed. All commands can be view at the README of the source code and also by typing “was –help” in the terminal if WAS was previously installed. Since this is a beta release, I have released it inside my GitHub. Anyone can download it with a single command available in the README. It is fully written in python . So, there is some video demo of WAS in use also available directly inside README.", "repo": "https://github.com/MDSUWasi/was-cli", "demo": "https://pypi.org/project/was-cli/"}]...
|
[{"post_id": 19215, "ts": "202 [{"post_id": 19215, "ts": "2026-06-30T14:09:43Z", "hours": 1.655, "text": "I have manually revised the source code, fixed some bugs , simplified the source."}, {"post_id": 17423, "ts": "2026-06-28T06:10:58Z", "hours": 1.2119, "text": "Development of WAS (Beta) is completed Now, WAS can save versions of documents, differentiate them, check status with previous and current documents and way more. The log feature can show all versions at once. All features list are available in my README https://github.com/MDSUWasi/was-cli/blob/master/README.md and also the in screenshot below-"}, {"post_id": 17024, "ts": "2026-06-27T17:05:28Z", "hours": 0.7008, "text": "The development of initial WAS is completed. Now, just download WAS in PC, Use terminal to setup (For first time and during watch feature) and start using the document time machine. The technical development is complete. Now some little more work remains in documentation, final source check up etc."}, {"post_id": 15545, "ts": "2026-06-25T08:36:01Z", "hours": 0.9889, "text": "Today ‘WAS’ got it’s new update. Updates: Automatic Version saving. Moving documents in any version just by a single command. Checking if the current document is saved in WAS or not. Added ‘differ’ command to check the difference between document versions. Upcoming Updates: In the next update I will check for security issues and fix those. And also decide whether “WAS” will get a GUI or Not."}, {"post_id": 15122, "ts": "2026-06-24T16:00:02Z", "hours": 0.3542, "text": "Initial Structure Completed. Current update: WAS can keep the data of change and save by version name. Next Update: Next update will enable auto track and change versions."}, {"post_id": 14137, "ts": "2026-06-23T03:41:11Z", "hours": 0.4406, "text": "“WAS” is a time machine for documents. The main reason of creating this is to solve my own problems. When I was coding git helped me to go back in code’s time and saved me from future mistakes. Inspiring from this I want same feature for documents too. I created it to solve my own study documents problem. Imaginary Example: In organic chemistry there are many different equations for same product. Here, WAS will help me to go back to any easier equation I wrote previously before writing the complex/ error equation."}]...
|
Title: WAS-CLI by @S_U_Wasi | Stardance
Devlogs:
Title: WAS-CLI by @S_U_Wasi | Stardance
Devlogs:
“WAS” is a time machine for documents. The main reason of creating this is to solve my own problems. When I was coding git helped me to go back in code’s time and saved me from future mistakes. Inspiring from this I want same feature for documents too. I created it to solve my own study documents problem. Imaginary Example: In organic chemistry there are many different equations for same product. Here, WAS will help me to go back to any easier equation I wrote previously before writing the complex/ error equation.
Initial Structure Completed. Current update: WAS can keep the data of change and save by version name. Next Update: Next update will enable auto track and change versions.
Today ‘WAS’ got it’s new update. Updates: Automatic Version saving. Moving documents in any version just by a single command. Checking if the current document is saved in WAS or not. Added ‘differ’ command to check the difference between document versions. Upcoming Updates: In the next update I will check for security issues and fix those. And also decide whether “WAS” will get a GUI or Not.
The development of initial WAS is completed. Now, just download WAS in PC, Use terminal to setup (For first time and during watch feature) and start using the document time machine. The technical development is complete. Now some little more work remains in documentation, final source check up etc.
Development of WAS (Beta) is completed Now, WAS can save versions of documents, differentiate them, check status with previous and current documents and way more. The log feature can show all versions at once. All features list are available in my README https://github.com/MDSUWasi/was-cli/blob/master/README.md and also the in screenshot below-
I have manually revised the source code, fixed some bugs , simplified the source.
Ships:
I have developed was-cli. It is a version control and time-machine like feature for documents. It’s core work (but not limited) is to save documents version (edits) in a very smart way. It only saves the edit, so, whenever a user tries to get back the previous document, was only takes that part of the document to it’s previous form (This reduces the problem of saving copies of document and reduces storage issues). Currently was support any text formate. Features: was save- save the current document version was watch- this command will make was to constantly look for new edit in the assigned document and save it automatically. was differ: To see what exactly changes and where between versions was status- Shows the current status of the document and more (In total 10 different features). To use WAS perfectly, user must use terminal command exactly how it was programmed. All commands can be view at the README of the source code and also by typing “was –help” in the terminal if WAS was previously installed. Since this is a beta release, I have released it inside my GitHub. Anyone can download it with a single command available in the README. It is fully written in python . So, there is some video demo of WAS in use also available directly inside README....
|
1792972503.026395
|
1793058903.026395
|
|
7181
|
Echo by @Churu | Stardance
|
Churu
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-10T06:54:37Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Jarvis 2.0 (Echo) is a desktop AI assistant/software built to automate tasks, launch apps, process commands, and act as a customizable personal assistant. The biggest challenge was connecting different systems together cleanly while keeping everything fast and organized. I’m most proud that it feels like a real product instead of separate scripts. To test it, install dependencies, run the app, and try the built-in commands/features listed in the README.", "repo": "https://github.com/jasersans1-create/Echo", "demo": "https://github.com/jasersans1-create/Echo/releases/tag/v1.0.0"}]...
|
[{"post_id": 5465, "ts": "2026 [{"post_id": 5465, "ts": "2026-06-09T08:11:16Z", "hours": 0.0, "text": "Echo is a simple but powerful Slack bot built to make communication inside a team feel smoother, faster, and less messy. It is designed with the idea that a good bot should not just sit there and reply, but should actually help people get things done without making them waste time on small repetitive tasks. Echo focuses on making everyday workspace interaction easier by responding quickly, keeping things organized, and acting like a helpful digital teammate inside Slack. The project reflects a practical and modern approach to automation, where the goal is not to make something flashy for no reason, but to build something genuinely useful, clean, and easy to work with. What makes Echo special is that it is meant to feel natural in a team environment — simple enough for anyone to use, but still smart enough to be helpful in real workflows. It shows a clear interest in building tools that save time, improve productivity, and make collaboration feel more effortless. Overall, Echo is a thoughtful first step into building real-world assistant software, and it has the foundation to grow into a very capable and reliable workspace companion. It opens apps and websited on command, even though yet it is only configured for Apps like Browsers, Games, Terminal, Useful apps like VS Code it is a very useful assistant, coming along with two modes - GUI and CLI This is GUI , CLI is just normal terminal where you can speak In my Arch i have set it as an automatic startup app in background so it doesnt show and whenever i press the hotkey that i have used for it i.e “Ctrl + Space” it turns on and as soon as i speak the name it recognises and opens the app for me"}]...
|
Title: Echo by @Churu | Stardance
Devlogs:
Echo i Title: Echo by @Churu | Stardance
Devlogs:
Echo is a simple but powerful Slack bot built to make communication inside a team feel smoother, faster, and less messy. It is designed with the idea that a good bot should not just sit there and reply, but should actually help people get things done without making them waste time on small repetitive tasks. Echo focuses on making everyday workspace interaction easier by responding quickly, keeping things organized, and acting like a helpful digital teammate inside Slack. The project reflects a practical and modern approach to automation, where the goal is not to make something flashy for no reason, but to build something genuinely useful, clean, and easy to work with. What makes Echo special is that it is meant to feel natural in a team environment — simple enough for anyone to use, but still smart enough to be helpful in real workflows. It shows a clear interest in building tools that save time, improve productivity, and make collaboration feel more effortless. Overall, Echo is a thoughtful first step into building real-world assistant software, and it has the foundation to grow into a very capable and reliable workspace companion. It opens apps and websited on command, even though yet it is only configured for Apps like Browsers, Games, Terminal, Useful apps like VS Code it is a very useful assistant, coming along with two modes - GUI and CLI This is GUI , CLI is just normal terminal where you can speak In my Arch i have set it as an automatic startup app in background so it doesnt show and whenever i press the hotkey that i have used for it i.e “Ctrl + Space” it turns on and as soon as i speak the name it recognises and opens the app for me
Ships:
Jarvis 2.0 (Echo) is a desktop AI assistant/software built to automate tasks, launch apps, process commands, and act as a customizable personal assistant. The biggest challenge was connecting different systems together cleanly while keeping everything fast and organized. I’m most proud that it feels like a real product instead of separate scripts. To test it, install dependencies, run the app, and try the built-in commands/features listed in the README....
|
1792878560.5766773
|
1793742560.5766773
|
|
7189
|
website by @Nanditha | Stardance
|
Nanditha
|
1
|
11.1
|
11
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-05T06:43:51Z", "hours": 10.0, "multiplier": 1.11, "payout": 11, "blessing": "neutral", "text": "I made a personal portfolio website to showcase my skills. I built it using HTML and CSS. I also added animation to make the website more interesting. The most challenging part was creating the animations and making sure they worked smoothly without affecting the layout of the website. I also had to fix several small issues with positioning and images while testing the website in the browser. Some images were not appearing because I had issues with the file paths and image locations. I had to check my folder structure, fix the image paths, and test the website several times until the images displayed properly. This helped me understand how files and relative paths work in a website. I am proud that I built the website myself and turned my ideas into a working project. I am especially proud of the animations and the overall design because they make the website feel more dynamic. I also learned how to use Git, GitHub, and GitHub Pages while working on this project. The project is a website, so no installation is required. Open the Demo URL in a browser and explore the different sections of the portfolio. Try the hover effects, and animations. The website is designed to work directly in a web browser.", "repo": "https://github.com/Nanditha-ux/hackclub", "demo": "https://nanditha-ux.github.io/hackclub/"}]...
|
[{"post_id": 77623, "ts": "202 [{"post_id": 77623, "ts": "2026-10-07T17:48:26Z", "hours": 1.0992, "text": "Changed the website concept to an underwater world instead of a regular portfolio layout. Added a welcome section with: “Hello!”“I’m Nanditha” “Welcome to my world” “Explore and discover more about me. ”Added fish swimming across the underwater section. Added bubbles that move upward. Added jellyfish with a simple floating animation. Added seaweed to make the underwater environment feel more natural. Changed the navigation into shells for About, Projects, Skills, and Contact. Made the shells scroll to their respective sections when clicked. Added smooth scrolling between sections."}, {"post_id": 76955, "ts": "2026-10-05T06:11:40Z", "hours": 9.9158, "text": "Day 1 — Project Idea 💡 I decided to build my own personal portfolio website to showcase my skills, projects, and learning journey as a student developer. I wanted the website to be simple, clean, and easy to navigate. Day 2 — Planning 🎯 I planned the main sections of the website: Home About Me Skills Projects Education Contact I also decided to use HTML, CSS, and JavaScript for the project. Day 3 — Building the Website I started creating the website in VS Code. I built the basic structure using HTML and then used CSS to design the different sections. I worked on the layout, spacing, fonts, buttons, and overall appearance of the website. Day 4 — Adding Animation I wanted my portfolio website to feel more dynamic instead of being completely static. So, I added animations to different sections of the website. I experimented with CSS animations and transitions to make elements appear smoothly.While working on the animations, I learned how small visual effects can improve the overall user experience without making the website complicated. I also tested the animations several times to make sure they were smooth and didn’t affect the usability of the website. Day 5 — Testing & Improvements I opened the website in my browser and tested it several times. I fixed some layout issues and made improvements to the design. I also checked how the website looks at different screen sizes. Day 6 — GitHub & Deployment I created a GitHub repository for the project and connected it with my VS Code project. I committed and pushed my changes to GitHub and worked on deploying the website using GitHub Pages. What I Learned : Through this project, I learned: How to structure a website with HTML How to style a website using CSS How to use Git and GitHub How to deploy a website using GitHub Pages How to debug and improve my own project"}]...
|
Title: website by @Nanditha | Stardance
Devlogs:
Title: website by @Nanditha | Stardance
Devlogs:
Day 1 — Project Idea 💡 I decided to build my own personal portfolio website to showcase my skills, projects, and learning journey as a student developer. I wanted the website to be simple, clean, and easy to navigate. Day 2 — Planning 🎯 I planned the main sections of the website: Home About Me Skills Projects Education Contact I also decided to use HTML, CSS, and JavaScript for the project. Day 3 — Building the Website I started creating the website in VS Code. I built the basic structure using HTML and then used CSS to design the different sections. I worked on the layout, spacing, fonts, buttons, and overall appearance of the website. Day 4 — Adding Animation I wanted my portfolio website to feel more dynamic instead of being completely static. So, I added animations to different sections of the website. I experimented with CSS animations and transitions to make elements appear smoothly.While working on the animations, I learned how small visual effects can improve the overall user experience without making the website complicated. I also tested the animations several times to make sure they were smooth and didn’t affect the usability of the website. Day 5 — Testing & Improvements I opened the website in my browser and tested it several times. I fixed some layout issues and made improvements to the design. I also checked how the website looks at different screen sizes. Day 6 — GitHub & Deployment I created a GitHub repository for the project and connected it with my VS Code project. I committed and pushed my changes to GitHub and worked on deploying the website using GitHub Pages. What I Learned : Through this project, I learned: How to structure a website with HTML How to style a website using CSS How to use Git and GitHub How to deploy a website using GitHub Pages How to debug and improve my own project
Changed the website concept to an underwater world instead of a regular portfolio layout. Added a welcome section with: “Hello!”“I’m Nanditha” “Welcome to my world” “Explore and discover more about me. ”Added fish swimming across the underwater section. Added bubbles that move upward. Added jellyfish with a simple floating animation. Added seaweed to make the underwater environment feel more natural. Changed the navigation into shells for About, Projects, Skills, and Contact. Made the shells scroll to their respective sections when clicked. Added smooth scrolling between sections.
Ships:
I made a personal portfolio website to showcase my skills. I built it using HTML and CSS. I also added animation to make the website more interesting. The most challenging part was creating the animations and making sure they worked smoothly without affecting the layout of the website. I also had to fix several small issues with positioning and images while testing the website in the browser. Some images were not appearing because I had issues with the file paths and image locations. I had to check my folder structure, fix the image paths, and test the website several times until the images displayed properly. This helped me understand how files and relative paths work in a website. I am proud that I built the website myself and turned my ideas into a working project. I am especially proud of the animations and the overall design because they make the website feel more dynamic. I also learned how to use Git, GitHub, and GitHub Pages while working on this project. The project is a website, so no installation is required. Open the Demo URL in a browser and explore the different sections of the portfolio. Try the hover effects, and animations. The website is designed to work directly in a web browser....
|
1793008188.920013
|
1793094588.920013
|