|
9218
|
[DELETE] by @pizzalover125 | Stardance
|
pizzalover125
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: [DELETE] by @pizzalover125 | Stardance
|
1793911751.2409894
|
1794775751.2409894
|
|
23687
|
[CONTENT DELETED] by @JSnap | Stardance
|
JSnap
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: [CONTENT DELETED] by @JSnap | Stardance
|
1793393729.9383714
|
1793998529.9383714
|
|
18649
|
[Budget Planner] 1.0 by @sakurashimiz | Stardance
|
sakurashimiz
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: [Budget Planner] 1.0 by @sakurashimiz | Sta Title: [Budget Planner] 1.0 by @sakurashimiz | Stardance...
|
1793857658.8418245
|
1794462458.8418245
|
|
11458
|
[3x3] Macropad by @aryxn | Stardance
|
aryxn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: [3x3] Macropad by @aryxn | Stardance
|
1794027317.136659
|
1794632117.136659
|
|
5408
|
[2x4] Macropad by @Jargonization | Stardance
|
Jargonization
|
0
|
1.55
|
0
|
[]
|
[{"post_id": 2386, "ts": "2026 [{"post_id": 2386, "ts": "2026-06-04T20:51:02Z", "hours": 1.5494, "text": "I have almost finished the PCB for my Macropad design. I am currently having a small issue with a silkscreen being clipped by a solder mask by the Xiao Seeduino. I’m hoping to get this issue fixed soon so that way i can begin working on the case."}]...
|
Title: [2x4] Macropad by @Jargonization | Stardanc Title: [2x4] Macropad by @Jargonization | Stardance
Devlogs:
I have almost finished the PCB for my Macropad design. I am currently having a small issue with a silkscreen being clipped by a solder mask by the Xiao Seeduino. I’m hoping to get this issue fixed soon so that way i can begin working on the case....
|
1793469231.8471413
|
1794074031.8471413
|
|
20979
|
[ by @huncikoma | Stardance
|
huncikoma
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: [ by @huncikoma | Stardance
|
1793886637.1712828
|
1794750637.1712828
|
|
3223
|
Zypthive by @aaryan_vishnupurikar | Stardance
|
aaryan_vishnupurikar
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zypthive by @aaryan_vishnupurikar | Stardan Title: Zypthive by @aaryan_vishnupurikar | Stardance...
|
1793411265.7971547
|
1794016065.7971547
|
|
53249
|
Zyphora Browser by @suprit | Stardance
|
suprit
|
0
|
2.32
|
0
|
[]
|
[{"post_id": 54256, "ts": "202 [{"post_id": 54256, "ts": "2026-08-25T04:38:21Z", "hours": 0.7306, "text": "Day 1 of Developing a better browser. Introduction: Humans invented computer and coding, but forgot to make a browser that is good and uses less resources, right? We all had to take tough decisions regarding browser selection. Edge is not our choice, Chrome is too heavy, Brave is good but some sites dont work as intended and many more… So, I planned on making a completely new Web Browser. Why did I think of this? Well tbh modern browsers are quite good in everything except two, less system usage and privacy. So, why not make a browser that has all the existing qualities but also features everyone wants? So, today I completed the User Interface of the browser and added SSL Certificate information and a downloads page. Everything works really good. The UI looks better than the previous one, proxy works, security settings work. I also added History. I added Ad Blocker inbuilt, which, for my case, didnt work as intended. I will change that in the upcoming devlog and shift to a completely native adblocker system. Thank You for reading!"}, {"post_id": 53046, "ts": "2026-08-23T13:09:00Z", "hours": 1.5878, "text": "Day 1 of Developing a better browser. Introduction Humans invented computer and coding, but forgot to make a browser that is good and uses less resources, right? We all had to take tough decisions regarding browser selection. Edge is not our choice, Chrome is too heavy, Brave is good but some sites dont work as intended and many more… So, I planned on making a completely new Web Browser. Why I think of this? Well tbh modern browsers are quite good in everything except two, less system usage and privacy. So, why not make a browser that has all the existing qualities but also features everyone wants? So, today I completed the base of the browser. How it will work, and what it will use. For now, I am sharing this project with my friend. We both are involved in developing this project as making it alone would be difficult. Moreover, the git repository is not public yet, but we are planning to make it public soon! The App uses Electron Vite and Typescript for literally everything, say it the design or the background. I have just completed the basic UI (most of which doesnt yet work) and the Home Tab page. I made it as minimal as possible to get less resource usage! The backgrounds are fetched from a free image API by Pexels. Thanks for reading!"}]...
|
Title: Zyphora Browser by @suprit | Stardance
Dev Title: Zyphora Browser by @suprit | Stardance
Devlogs:
Day 1 of Developing a better browser. Introduction Humans invented computer and coding, but forgot to make a browser that is good and uses less resources, right? We all had to take tough decisions regarding browser selection. Edge is not our choice, Chrome is too heavy, Brave is good but some sites dont work as intended and many more… So, I planned on making a completely new Web Browser. Why I think of this? Well tbh modern browsers are quite good in everything except two, less system usage and privacy. So, why not make a browser that has all the existing qualities but also features everyone wants? So, today I completed the base of the browser. How it will work, and what it will use. For now, I am sharing this project with my friend. We both are involved in developing this project as making it alone would be difficult. Moreover, the git repository is not public yet, but we are planning to make it public soon! The App uses Electron Vite and Typescript for literally everything, say it the design or the background. I have just completed the basic UI (most of which doesnt yet work) and the Home Tab page. I made it as minimal as possible to get less resource usage! The backgrounds are fetched from a free image API by Pexels. Thanks for reading!
Day 1 of Developing a better browser. Introduction: Humans invented computer and coding, but forgot to make a browser that is good and uses less resources, right? We all had to take tough decisions regarding browser selection. Edge is not our choice, Chrome is too heavy, Brave is good but some sites dont work as intended and many more… So, I planned on making a completely new Web Browser. Why did I think of this? Well tbh modern browsers are quite good in everything except two, less system usage and privacy. So, why not make a browser that has all the existing qualities but also features everyone wants? So, today I completed the User Interface of the browser and added SSL Certificate information and a downloads page. Everything works really good. The UI looks better than the previous one, proxy works, security settings work. I also added History. I added Ad Blocker inbuilt, which, for my case, didnt work as intended. I will change that in the upcoming devlog and shift to a completely native adblocker system. Thank You for reading!...
|
1793476357.1235218
|
1794081157.1235218
|
|
53259
|
Zyphora Browser by @omrudra | Stardance
|
omrudra
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zyphora Browser by @omrudra | Stardance
|
1793479965.3697844
|
1794084765.3697844
|
|
32753
|
Zypher by @Dex | Stardance
|
Dex
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zypher by @Dex | Stardance
|
1793994539.213897
|
1794599339.213897
|
|
61753
|
Zynx by @notvedansh | Stardance
|
notvedansh
|
1
|
7.0
|
16
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T19:19:59Z", "hours": 7.0, "multiplier": 2.32, "payout": 16, "blessing": "neutral", "text": "So Zynx is an image converter app that works offline. The tough part was getting the UI right, as it took me around 5 hours to complete all the UI work. It wasn’t that I got too many errors; it was rather that the visual looks that mattered. On the positive side, I am proud that the app has a nice visual appeal to it, and of course that it works. So there isn’t much to know to test this app, just check the requirements.txt if you are using the repo. Nothing else.", "repo": "https://github.com/vedansh201/Zynx", "demo": "https://github.com/vedansh201/Zynx/releases/tag/v1"}]...
|
[{"post_id": 67594, "ts": "202 [{"post_id": 67594, "ts": "2026-09-13T18:57:21Z", "hours": 6.7172, "text": "Complete app So Zynx is a desktop image converter built with pyQt6 and pillow offline. So first of all i started with making the converter logic work, i used Pillow to change the image type.So first of all I started with making the converter logic work. I used Pillow to change the image type. Basically, I used Image.open() to open the selected image and then image.save() to save it in the format that the user selected After that, I started working on the UI. I used PyQt6 to make the buttons, dropdown menu and other parts of the app. I added a small animation (just a bounce) that runs when the app successfully changes the image type. The rest was just UI design, which wasn’t hard but took me the most amount of time. And yh that’s it.."}]...
|
Title: Zynx by @notvedansh | Stardance
Devlogs:
C Title: Zynx by @notvedansh | Stardance
Devlogs:
Complete app So Zynx is a desktop image converter built with pyQt6 and pillow offline. So first of all i started with making the converter logic work, i used Pillow to change the image type.So first of all I started with making the converter logic work. I used Pillow to change the image type. Basically, I used Image.open() to open the selected image and then image.save() to save it in the format that the user selected After that, I started working on the UI. I used PyQt6 to make the buttons, dropdown menu and other parts of the app. I added a small animation (just a bounce) that runs when the app successfully changes the image type. The rest was just UI design, which wasn’t hard but took me the most amount of time. And yh that’s it..
Ships:
So Zynx is an image converter app that works offline. The tough part was getting the UI right, as it took me around 5 hours to complete all the UI work. It wasn’t that I got too many errors; it was rather that the visual looks that mattered. On the positive side, I am proud that the app has a nice visual appeal to it, and of course that it works. So there isn’t much to know to test this app, just check the requirements.txt if you are using the repo. Nothing else....
|
1793829040.866907
|
1793915440.866907
|
|
67070
|
Zynix Portfolio by @zynix | Stardance
|
zynix
|
0
|
0.28
|
0
|
[]
|
[{"post_id": 75644, "ts": "202 [{"post_id": 75644, "ts": "2026-09-30T17:08:02Z", "hours": 0.2817, "text": "Day 1 :i started making my website using html and css .i used html to make pages (made 4 page) and css for making text and navbar colourfull"}]...
|
Title: Zynix Portfolio by @zynix | Stardance
Devl Title: Zynix Portfolio by @zynix | Stardance
Devlogs:
Day 1 :i started making my website using html and css .i used html to make pages (made 4 page) and css for making text and navbar colourfull...
|
1793728198.3926742
|
1794332998.3926742
|
|
69962
|
ZyOS by @zybyte_retr0 | Stardance
|
zybyte_retr0
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: ZyOS by @zybyte_retr0 | Stardance
|
1793605684.7209918
|
1794210484.7209918
|
|
29735
|
ZyDeck by @sohamdalvi | Stardance
|
sohamdalvi
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: ZyDeck by @sohamdalvi | Stardance
|
1793361355.8637185
|
1793966155.8637185
|
|
40621
|
ZweiCFD by @toiabzahoor | Stardance
|
toiabzahoor
|
2
|
51.0
|
883
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T09:54:49Z", "hours": 18.0, "multiplier": 15.77, "payout": 287, "blessing": "neutral", "text": "Hello Guys! I am back with An improved version of ZweiCFD. Last time, everyone recommended a few things to improve on ZweiCFD , which i have been working hard to do! I have also added Custom Models, A CLI interface, heat colormap (which shows velocity of the wind on the model) , 3d vortex cores using Q criterion, surface pressure distribution curve. I have also added a polar sweep function which lets you select from a range of AoA to see how the drag, lift varies. If anyone is new, They can take a look below this Ship to understand what ZweiCFD is. I Have Also tried to Compile binaries for different OS systems, and i’d like you guys to show me how it works on your end so that i may fix it ASAP. Thank you!", "repo": "https://github.com/toiabzahoor/ZweiCFD", "demo": "https://github.com/Toiabzahoor/ZweiCFD/releases/tag/ZweiCFD"}, {"ship_num": 2, "ts": "2026-08-09T06:47:25Z", "hours": 33.0, "multiplier": 18.19, "payout": 596, "blessing": "neutral", "text": "ZweiCFD: A Real-Time 3D Fluid Dynamics Simulator! Hey Everyone! I’m super excited to ship my first project ZweiCFD , an interactive Computational Fluid Dynamics (CFD) solver and visualization tool I built from scratch. Have you ever wanted to just make a model and see how air flows around it? This is the simulator for that! What it does: Real-Time Aerodynamics: You can adjust the Angle of Attack (AOA), speed, thickness, and camber of an airfoil on the go, and the solver recalculates the airflow instantly. Rich 3D Visuals: Generates velocity heatmaps, streamlines, and slices to visualize exactly how the fluid is behaving. How it was made Built entirely in C++ using Qt6 for the UI and VTK for the heavy-duty 3D rendering. Powered by a custom 3D Lattice Boltzmann Method (LBM) volumetric solver (using a D3Q19 discrete velocity model). Uses Signed Distance Fields (SDF) to handle the complex math of arbitrary boundaries and real-time obstacle drawing. Rest Of The Documentation Is Available On My Github Page! The journey To be completely honest, building this solo while managing my studies has been brutal. My laptop is pretty low-end, so debugging the 3D flap airfoil simulation tanked my compute resources and I had to sideline some 2D features entirely to get the 3D working because it kept interfering. Also, Sitting on the laptop with my chronic pain is very painful for me, so if there are some rough edges, please tell me as it would boost my motivation to work! If you are on Windows, you can download the .exe (with all the VTK DLLs bundled!) from my repo and tinker around with it. I would absolutely love your feedback, reviews, or even just some stars on the repo to help me push this to the next level! :3 For The People Who Need To Take A Look At How It Works: https://youtu.be/mjVsJX-nruM", "repo": "https://github.com/toiabzahoor/ZweiCFD", "demo": "https://github.com/Toiabzahoor/ZweiCFD/releases/tag/ZweiCFD"}]...
|
[{"post_id": 64114, "ts": "202 [{"post_id": 64114, "ts": "2026-09-08T09:50:03Z", "hours": 3.2444, "text": "Finally, I think I have worked enough on zweicfd, i think i will close the chapter on this project. everyone, thank you for supporting me till now! it has really helped my life alot. and i appreciate every bit of support from everyone! i have also tried my best to upload the binaries for linux and macos, and i would like your humble opinion if you face any issues. i would be sure to help you in any way i can!"}, {"post_id": 58895, "ts": "2026-08-31T13:48:56Z", "hours": 6.5239, "text": "Hello! it has been a while since i have dropped a devlog because i have been busy with my doctor visits, so i apologise for the delay! i have added many features to ZweiCFD, like the color heatmap which tells you how the pressure distribution on your model is! I have also added a polar sweep function which lets you simulate for many angles and configurations and plot how the force ,drag angle relate! I am really out of ideas on what to do next, So it would be really helpful to recieve your feedback on what to do next!"}, {"post_id": 53689, "ts": "2026-08-24T11:18:14Z", "hours": 4.2728, "text": "Hey Everyone! I am back with some new additions to ZweiCFD! First, I wanted to maximize the compute for massive simulations, so I’ve added a headless CLI mode and added a function where you can scale the grid up or down (depends on how big your model is / how accurate you want to trace the model). If you are running this on a lower-end device like my laptop, or if you just want to dedicate 100% of your CPU to the physics without running the rendering simultaneously , you can now run the solver entirely from the command line! Second, based on some great feedback, I’ve integrated .vti file exporting. now you can also export your high-resolution flow data generated by ZweiCFD directly into industry-standard tools like ParaView for deep, professional-grade analysis(if anyone is an expert at paraview, please let me know what you think. I would love to hear from a professional so i can tailor to their needs!). Let me know what you think!"}, {"post_id": 52861, "ts": "2026-08-23T07:10:04Z", "hours": 4.1683, "text": "Thank you everyone for supporting my project so much! I am really grateful for all of the support everyone has given me!. Now, I finally have more motivation to work on this project! Currently, as many people recommended, I was working on import functionality of any custom models you may have. It is currently in progress so I appreciate your patience as the latest won’t be reflected on github. Also, I plan to also make a web version of ZweiCFD which would run easily on any platform (Which would be very tough but I think i can make it). Thank you for your time!"}, {"post_id": 43767, "ts": "2026-08-09T06:01:56Z", "hours": 4.4875, "text": "Finally My Last Devlog Before I Ship! I’ve Fixed most of the issues and uploaded the build binary along with the necessary libraries to my releases in github for you guys to try, Thank you very much for your support till now!"}, {"post_id": 42780, "ts": "2026-08-07T17:38:52Z", "hours": 6.8753, "text": "it has finally been starting to look very decent. I had to do a major architectural shift to VTK and QT. and it turned out very good. I am feeling burned out these days. i dont really know if i can keep up the motivation to work on this. but ill try my best! thank you for checking out."}, {"post_id": 40901, "ts": "2026-08-04T18:38:47Z", "hours": 4.6822, "text": "i have been working to make the simulation more pleasing to look at . also, trying to model complex shapes and adding stuff like .obj support, lets see how that goes. have been working on some optimization features, so the github commit may take some more time. Thank you for checking out!"}, {"post_id": 40171, "ts": "2026-08-03T16:02:52Z", "hours": 3.0133, "text": "the 3d interface is under work, although there are major issues with making the equations work in 3d and other stuff so you wont find this version on github. your patience is appreciated!!"}, {"post_id": 39536, "ts": "2026-08-02T15:42:10Z", "hours": 3.975, "text": "i moved most of the calculations onto the gpu so having alot of particles will be easier to render. plus, now testing complex shapes and writing boundary layer equations and some approximation methods to hug around the shape. also i am planning to add 3d next, which will be tough. wish me luck!"}, {"post_id": 38960, "ts": "2026-08-01T16:07:01Z", "hours": 3.5236, "text": "have done a great session. added coloring, and added more equations like lattice-boltzmann method (recovering the navier stokes). thank you for taking a look!"}, {"post_id": 38389, "ts": "2026-07-31T18:54:12Z", "hours": 1.9697, "text": "working on it more, now modelling the equations and physics. havent commited this part to github yet due to some bugs here and there. thank you for checking out!"}, {"post_id": 37775, "ts": "2026-07-30T18:06:55Z", "hours": 1.6783, "text": "Got it fixed. also added some new stuff, and added the wind effect (the lines, yes they move). although i have to incorporate the equations next time. before that, i have to study up on it as this is a topic i havent really studied much about :)"}, {"post_id": 36261, "ts": "2026-07-28T07:51:57Z", "hours": 2.0814, "text": "still working on it. although the graphics arent looking too good yet. Have to stop here for lunch and some rest for my leg, will start work later to fix this."}, {"post_id": 35874, "ts": "2026-07-27T16:20:21Z", "hours": 0.4969, "text": "currently, as i’ve initialized this project. just working to make the files tidy and clean and adding some basic stuff."}]...
|
Title: ZweiCFD by @toiabzahoor | Stardance
Devlog Title: ZweiCFD by @toiabzahoor | Stardance
Devlogs:
currently, as i’ve initialized this project. just working to make the files tidy and clean and adding some basic stuff.
still working on it. although the graphics arent looking too good yet. Have to stop here for lunch and some rest for my leg, will start work later to fix this.
Got it fixed. also added some new stuff, and added the wind effect (the lines, yes they move). although i have to incorporate the equations next time. before that, i have to study up on it as this is a topic i havent really studied much about :)
working on it more, now modelling the equations and physics. havent commited this part to github yet due to some bugs here and there. thank you for checking out!
have done a great session. added coloring, and added more equations like lattice-boltzmann method (recovering the navier stokes). thank you for taking a look!
i moved most of the calculations onto the gpu so having alot of particles will be easier to render. plus, now testing complex shapes and writing boundary layer equations and some approximation methods to hug around the shape. also i am planning to add 3d next, which will be tough. wish me luck!
the 3d interface is under work, although there are major issues with making the equations work in 3d and other stuff so you wont find this version on github. your patience is appreciated!!
i have been working to make the simulation more pleasing to look at . also, trying to model complex shapes and adding stuff like .obj support, lets see how that goes. have been working on some optimization features, so the github commit may take some more time. Thank you for checking out!
it has finally been starting to look very decent. I had to do a major architectural shift to VTK and QT. and it turned out very good. I am feeling burned out these days. i dont really know if i can keep up the motivation to work on this. but ill try my best! thank you for checking out.
Finally My Last Devlog Before I Ship! I’ve Fixed most of the issues and uploaded the build binary along with the necessary libraries to my releases in github for you guys to try, Thank you very much for your support till now!
Thank you everyone for supporting my project so much! I am really grateful for all of the support everyone has given me!. Now, I finally have more motivation to work on this project! Currently, as many people recommended, I was working on import functionality of any custom models you may have. It is currently in progress so I appreciate your patience as the latest won’t be reflected on github. Also, I plan to also make a web version of ZweiCFD which would run easily on any platform (Which would be very tough but I think i can make it). Thank you for your time!
Hey Everyone! I am back with some new additions to ZweiCFD! First, I wanted to maximize the compute for massive simulations, so I’ve added a headless CLI mode and added a function where you can scale the grid up or down (depends on how big your model is / how accurate you want to trace the model). If you are running this on a lower-end device like my laptop, or if you just want to dedicate 100% of your CPU to the physics without running the rendering simultaneously , you can now run the solver entirely from the command line! Second, based on some great feedback, I’ve integrated .vti file exporting. now you can also export your high-resolution flow data generated by ZweiCFD directly into industry-standard tools like ParaView for deep, professional-grade analysis(if anyone is an expert at paraview, please let me know what you think. I would love to hear from a professional so i can tailor to their needs!). Let me know what you think!
Hello! it has been a while since i have dropped a devlog because i have been busy with my doctor visits, so i apologise for the delay! i have added many features to ZweiCFD, like the color heatmap which tells you how the pressure distribution on your model is! I have also added a polar sweep function which lets you simulate for many angles and configurations and plot how the force ,drag angle relate! I am really out of ideas on what to do next, So it would be really helpful to recieve your feedback on what to do next!
Finally, I think I have worked enough on zweicfd, i think i will close the chapter on this project. everyone, thank you for supporting me till now! it has really helped my life alot. and i appreciate every bit of support from everyone! i have also tried my best to upload the binaries for linux and macos, and i would like your humble opinion if you face any issues. i would be sure to help you in any way i can!
Ships:
ZweiCFD: A Real-Time 3D Fluid Dynamics Simulator! Hey Everyone! I’m super excited to ship my first project ZweiCFD , an interactive Computational Fluid Dynamics (CFD) solver and visualization tool I built from scratch. Have you ever wanted to just make a model and see how air flows around it? This is the simulator for that! What it does: Real-Time Aerodynamics: You can adjust the Angle of Attack (AOA), speed, thickness, and camber of an airfoil on the go, and the solver recalculates the airflow instantly. Rich 3D Visuals: Generates velocity heatmaps, streamlines, and slices to visualize exactly how the fluid is behaving. How it was made Built entirely in C++ using Qt6 for the UI and VTK for the heavy-duty 3D rendering. Powered by a custom 3D Lattice Boltzmann Method (LBM) volumetric solver (using a D3Q19 discrete velocity model). Uses Signed Distance Fields (SDF) to handle the complex math of arbitrary boundaries and real-time obstacle drawing. Rest Of The Documentation Is Available On My Github Page! The journey To be completely honest, building this solo while managing my studies has been brutal. My laptop is pretty low-end, so debugging the 3D flap airfoil simulation tanked my compute resources and I had to sideline some 2D features entirely to get the 3D working because it kept interfering. Also, Sitting on the laptop with my chronic pain is very painful for me, so if there are some rough edges, please tell me as it would boost my motivation to work! If you are on Windows, you can download the .exe (with all the VTK DLLs bundled!) from my repo and tinker around with it. I would absolutely love your feedback, reviews, or even just some stars on the repo to help me push this to the next level! :3 For The People Who Need To Take A Look At How It Works: https://youtu.be/mjVsJX-nruM
Hello Guys! I am back with An improved version of ZweiCFD. Last time, everyone recommended a few things to improve on ZweiCFD , which i have been working hard to do! I have also added Custom Models, A CLI interface, heat colormap (which shows velocity of the wind on the model) , 3d vortex cores using Q criterion, surface pressure distribution curve. I have also added a polar sweep function which lets you select from a range of AoA to see how the drag, lift varies. If anyone is new, They can take a look below this Ship to understand what ZweiCFD is. I Have Also tried to Compile binaries for different OS systems, and i’d like you guys to show me how it works on your end so that i may fix it ASAP. Thank you!...
|
1793858088.3411417
|
1793944488.3411417
|
|
45378
|
Zulxumor Islomva's AetherMind by @nag-drown-st Zulxumor Islomva's AetherMind by @nag-drown-stoning | Stardance...
|
nag-drown-stoning
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zulxumor Islomva's AetherMind by @nag-d Title: Zulxumor Islomva's AetherMind by @nag-drown-stoning | Stardance...
|
1793329066.217057
|
1793933866.217057
|
|
34683
|
ZtionixOS by @Ander507 | Stardance
|
Ander507
|
4
|
8.0
|
57
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-06T14:43:09Z", "hours": 1.0, "multiplier": 7.42, "payout": 8, "blessing": "neutral", "text": "What I made ZtionixOS — a fake desktop in the browser. Boot, login, windows, dock, IndexedDB filesystem, and a pile of apps. No React. This round: Image Viewer, Hex Editor, Minesweeper, News, Voice Recorder. Weather, desktop calendar, screensaver, system tray. Zip import/export. Paint / Writer / Calc / Editor a bit less thin. rm -rf / bluescreens you. What was hard Making it feel like a place you hang out, not a demo with windows. Zip + VFS without blowing storage. Keeping apps simple but useful. Proud of It still feels like one OS. Drop a zip, it unpacks. Leave it open, screensaver kicks in. Same kernel pattern as day one. Try it https://ztionix-os.vercel.app/ — Enter on login, no password. (This wave needs a redeploy to show live.) AI Cursor helped with glue and CSS. I review and edit everything. Core idea and shell are mine. Roughly ~25% assisted.", "repo": "https://github.com/Ander507/ZtionixOS", "demo": "https://ztionix-os.vercel.app/"}, {"ship_num": 2, "ts": "2026-07-28T12:38:12Z", "hours": 2.0, "multiplier": 8.62, "payout": 21, "blessing": "neutral", "text": "What I made ZtionixOS — a browser fake desktop (boot → login → windows, dock, VFS). Devlog #7 adds a real file lifecycle : drop files on the desktop, get typed icons, double-click opens the right app. ROMs/audio/text route to Z-Retro, ZMusic, Editor, etc. Singleton apps swap files in one window (no duplicate WASM). Also: Z-Retro (NES/GB/GBA/NDS) with save/load states, save-game thumbnails, close prompt only while playing. Alt+Q window switcher. Glass theme (macOS vibrancy). Font scale 75–150%. Terminal zfetch . Snap layouts on window drag. What was hard Getting file open to feel like an OS — singleton re-init, drop-at-cursor icons, unknown-file fallback. Z-Retro save screenshots had to be captured before state serialize (otherwise black thumbs). Glass theme: frosted chrome vs readable inputs/emulator canvas. Font scale broke because html { font-size: 1rem } overwrote the root scale. What I’m proud of Desktop → VFS → app feels connected. Z-Retro library with save-state covers. Glass looks premium without killing readability. Still 100% client-side, no backend. How to test Live demo — Enter on login Drop a .gba or .mp3 on the desktop → icon appears → double-click opens Z-Retro / ZMusic Z-Retro: play a ROM → Save → back to library → thumbnail should match your save Settings → Glass theme + wallpaper; Appearance → font scale Alt+Q with several windows open → release Alt to switch Terminal: zfetch ~25% AI-assisted (CSS, integration, polish). Core OS/VFS/window manager mostly hand-written.", "repo": "https://github.com/Ander507/ZtionixOS", "demo": "https://ztionix-os.vercel.app/"}, {"ship_num": 3, "ts": "2026-07-18T15:09:40Z", "hours": 2.0, "multiplier": 14.7, "payout": 28, "blessing": "neutral", "text": "Fake desktop OS in the browser — boot, login, windows, dock, IndexedDB filesystem, and a pile of apps (Files, Terminal, Paint, ZMusic, ZVideo, Writer/Calc/Impress, Browser, Doom, Photo Booth, Task Manager, etc.). No React; apps return DOM and plug into a kernel. Proud of: WebOS2 wave — real Doom (WASM + WAD sound lumps), office-ish apps without fake LibreOffice bookmarks, customizable dock (pin / unpin / drag reorder), and it still feels like my OS after the polish pass (VT323, rust accent, square chrome). Hard: Doom’s WASM has no audio API, so SFX come from extracted doom1.wad samples on fire/use/menu — not full engine sound. Big media can hit IndexedDB quota. Real LibreOffice can’t run client-side; Writer/Calc/Impress are thin stand-ins. Try it: https://ztionix-os.vercel.app/ — boot, hit Enter (no password). Ctrl+K for launcher. Drag dock icons to reorder. Open Doom and click the canvas once for sound. Import a video into ZVideo or snap a Photo Booth pic into /home/user/Photos .", "repo": "https://github.com/Ander507/ZtionixOS", "demo": "https://ztionix-os.vercel.app/"}, {"ship_num": 4, "ts": "2026-07-14T15:05:51Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a webOS called ztionixOS i am proud of the live chat feature and the music player also the other apps i build and put a lot of work into making the terminal look real", "repo": "https://github.com/Ander507/ZtionixOS", "demo": "https://ztionix-os.vercel.app/"}]...
|
[{"post_id": 41970, "ts": "202 [{"post_id": 41970, "ts": "2026-08-06T14:38:41Z", "hours": 1.1181, "text": "Devlog #8 — I left the window open Last time I made files and Z-Retro feel like a real OS. Then I sat in it and it felt empty. Just wallpaper and a clock. So I added the small stuff you notice when you hang out. New apps: Image Viewer for Photos, Hex Editor, Minesweeper, a simple News reader, and Voice Recorder. Music and the recorder show up in a little tray. Also weather, a desktop calendar, and a screensaver if you walk away. rm -rf / bluescreens you for fun. Zip finally works. Drop one and it unpacks. You can also export a backup of the fake home folder. Paint, Writer, Calc, and Editor got a bit better. Undo, find/replace, fill handle, markdown preview. Still simple. Same setup as always — no React, apps plug into the kernel. Cursor helped with some of the busy work. I still edited everything. News and weather need the internet. Big files and big zips can still hit storage limits. Live site won’t have this until I redeploy. Build and tests pass. Not sure what’s next. Maybe nothing. Maybe Minesweeper."}, {"post_id": 36353, "ts": "2026-07-28T12:30:16Z", "hours": 2.4519, "text": "Devlog #7 — File lifecycle, Z-Retro polish, Glass vibrancy, and shell QoL This stretch was about making Ztionix feel like one system instead of a pile of separate apps. Files on the desktop should do something, windows should feel premium, and Z-Retro should behave like a real emulator shelf — not a demo page with a canvas in it. File lifecycle (the big one) Desktop drag-and-drop was already importing into the VFS, but it felt disconnected: files appeared in generic slots, icons didn’t match types, and opening a ROM while Z-Retro was already running did nothing useful. So I built a proper file lifecycle : fileTypeHandlers.ts — one place for extension → app routing (Editor, ZMusic, Z-Retro, Paint, Video, etc.) Unknown files — notification + “Open in Editor?” instead of silently failing or guessing wrong Desktop drop polish — icons spawn under the cursor, not the next grid slot Desktop icons — show the target app’s icon (music note, retro pad, editor pen…) instead of generic file glyphs Singleton reopen — ZMusic and Z-Retro don’t spawn a second WASM instance; they call init({ path }) and swap the track/ROM in the existing window Double-click on the desktop, double-click in Files, and open in Terminal all go through the same path now. Alt+Q window switcher Browser Alt+Tab is useless here, and the old instant-cycle felt cheap. Alt+Q opens a centered switcher: tap Q again to cycle, release Alt to focus. Flat dark UI, no glass blur — matches Minimal more than the new Glass theme. Z-Retro upgrades Z-Retro got a lot of love: Save / Load toolbar buttons (VFS save states under ROMs/saves/ ) Close prompt when a game is running — Save & Close, Just Close, or No; no prompt on the library screen Library thumbnails — screenshot captured at save time (while the frame is live, before state serialization); card shows the save-game shot, not a black auto-grab Controls button fix — opens the real control menu, not Restart Themes & appearance Glass theme overhaul — macOS-style vibrancy: blur(40px) saturate(150%) , edge-lit borders, deep layered shadows, frosted chrome vs solid inputs/emulator canvas Minimal + custom wallpaper — presets stay pure black; custom upload/URL works on Minimal too Font scale — Settings slider 75–150% via root --font-scale and rem-based typography (fixed the bug where html { font-size: 1rem } was stomping the scale) Terminal zfetch / neofetch — system info panel with Ztionix branding Selectable output, Ctrl+C copies selection Bug fixes worth naming Window drag release glitch (transform commit before removing .dragging ) Glass/minimal theme edge cases Font scale actually applying globally after the root CSS fix"}, {"post_id": 30716, "ts": "2026-07-18T15:04:46Z", "hours": 1.0683, "text": "Devlog #6 — WebOS2 Devlog #5 was polish and honesty. This one is the opposite problem: the OS felt finished as a demo , not as a place you hang out. So WebOS2 = more apps, denser desktop energy, still client-side, still no React. Why another wave After the polish pass, ZtionixOS looked like itself — but the app list was still “Files, Terminal, Paint, music, a snake.” Fine for a fake OS trailer. Not enough if someone actually sits in it for twenty minutes. I wanted media that isn’t only audio, something office-shaped, a real game, a Task Manager so End Task feels like an OS bit, and a dock you can rearrange instead of hardcoding pinned: true on every new toy. Also briefly considered Spotify / Jamendo in ZMusic. Spotify needs Premium + their SDK for full tracks. Jamendo’s public test client id is suspended. Dropped both. Local VFS imports stay. New apps ZVideo — same idea as ZMusic: import into the VFS, sidebar library, <video controls> . Double-click .mp4 / .webm routes here. Writer / Calc / Impress — people ask for LibreOffice. Full LibreOffice does not run in a browser without a remote server. I’m not shipping Collabora. So three thin ZtionixOS apps that cover the same jobs: rich text → .html (plus Export .txt ), spreadsheet with a formula bar ( =SUM(A1:A5) , AVERAGE/MIN/MAX/COUNT, =A1+B2 ), slides with a Present button → .json . Inspired by the LibreOffice suite, not a fake bookmark to libreoffice.org. Task Manager — open windows as “processes,” fake CPU jitter that wobbles every second, End Task hits windowManager.close . Double-click focuses. Pure OS parody, actually useful when something’s stuck. Doom — the real shareware game via doom.wasm (jacobenget, GPL-2), canvas blit + keyboard when focused. The WASM has zero audio imports. First pass: synth beeps. Then extracted doom1.wad out of the same binary and play classic lumps ( DSPISTOL , DSITMBK , DSSWTCHN …) on fire / use / menu through Web Audio. Mute button in the window. Still not full engine-synced audio (monsters won’t scream from the WASM), but the samples are the real ones. License note under public/doom/ . Photo Booth — webcam, a few filters, countdown snap, mirrored PNG into /home/user/Photos . Tracks stop on window close so the camera LED dies like a grown-up app. Scientific Calculator — same Calculator app, Scientific toggle: sin/cos/tan (+ inverses), ln/log, √, xʸ, π, e, factorial, DEG/RAD. 67 secret still works. Dock that isn’t frozen Pins live in localStorage ( ztionixos-dock-pins ). Settings → Dock has checkboxes. Right-click a dock icon → pin/unpin. Drag pinned icons to reorder. Running apps that aren’t pinned still show temporarily so you don’t lose the window. Default pin set is curated on purpose — if every new app marks itself pinned the dock becomes a junk drawer. How it still plugs in Same kernel pattern as day one: AppManifest , launch() returns DOM, register in kernel.ts , file opens through getAppForPath . No React. Cursor helped move faster on the new apps and the WAD sound glue; I still review and edit everything so it doesn’t read like a template dump. Honest limits Big videos / audio can hit IndexedDB quota (same as ZMusic always could). Office apps are intentionally thin — not ODF, not Collabora. Doom SFX are real WAD samples on player actions, not full Chocolate Doom audio. Live Vercel won’t show WebOS2 until redeploy. npm run build and npm test still pass. What’s next (maybe) Nothing locked. If I touch it again it’ll probably be small: more Calc formulas, or accepting that Doom sound will never be 1:1 without a different engine. (photobooth works its just i dont wanna show my face)"}, {"post_id": 28552, "ts": "2026-07-14T21:31:58Z", "hours": 0.8647, "text": "Devlog #5 — polish pass, secrets, and being honest about AI Got feedback that ZtionixOS wasn’t ready to vote yet. Fair. It still looked a bit too “AI desktop template” and the README felt copy-pasted. So this session was mostly cleanup and personality, not new architecture. Making it feel less generated Big CSS pass: dusty blue-gray palette, rust accent, VT323 font, square windows with — □ × controls. Removed Tailwind entirely. Added a dumb comment at the top of dark.css because I genuinely spent too long on colors. Left one Monster joke in there, trimmed the rest. Went through shell/core files and made the code messier on purpose — for loops instead of .filter() , string concat mixed with templates, nested if s. Added a few normal comments and a few funny ones. README rewrite in my own voice, real screenshot ( docs/screenshot.png ), live demo link fixed to ztionix-os.vercel.app . Removed the chat app for good Redis on Vercel, felt bolted on, everything else is client-side now. Secrets and dumb stuff Stuff that was already in but got touched this session: Konami code → party mode (rainbow shell + yellow countdown badge) Triple-click logo → CRT scanlines Ctrl+Shift+S → Snake Terminal secret party / secret pet / snake mention Desktop pet default off now (opt-in via terminal or right-click) New one: type 67 in Calculator → plays 67.mp3 , popup with the Bosnov gif. Tried embedding KLIPY in an iframe first. Zen said no X-Frame-Options. Switched to a local gif in public/gifs/ with a link to open KLIPY in a new tab. Sound works, meme works, no fighting Cloudflare. Bugs fixed along the way Browser iframe was blank because homepage CSS was covering it — fixed stacking with browser-view--hidden Notes text was unreadable (light on gray) — fixed editor contrast Window drag uses translate3d during move, commits position on mouseup — way smoother npm run build and npm test still pass. AI disclosure Added an AI usage section to the README. Not gonna pretend this was 100% hand-typed Cursor helped on CSS, drag refactor, debugging. Core kernel, VFS, window manager, and most apps are mine. Rough guess ~25% AI-assisted by lines, mostly styling and extras. Reviewers can check git/WakaTime if they want."}, {"post_id": 28306, "ts": "2026-07-14T14:07:06Z", "hours": 0.8489, "text": "Devlog #4 — Custom wallpapers and fixing light mode polishing stuff before i submit. two things that were bugging me on the live build. Custom wallpapers got tired of only having the 5 preset gradients. added a full custom option in Settings → Desktop : paste an image URL and hit apply upload from your device (jpg, png, webp, gif) gif wallpapers actually animate on the desktop and login screen which is kinda sick custom card in the grid so you can switch back to it after picking a preset remove custom button if you want to clear it uploads cap at 3mb so localStorage doesnt explode. urls have to be http:// or https:// . Light mode was broken switched to light theme and the top bar went white but the desktop stayed dark?? icon labels were basically invisible — dark text on a dark wallpaper. fixed it properly: light versions of every preset wallpaper (slate, dusk, fog, ember, void) desktop icon text readable again login/lock screen matches light theme now dock tiles get pastel colors in light mode noise overlay toned down so it doesnt look muddy custom uploaded wallpapers still show your image in both themes. only the fallback behind them changes. also updated the readme cleaned up the feature list so it actually reflects everything — messages, zmusic, indexeddb vfs, custom wallpapers pretty much ready to ship. live at https://ztionix-os.vercel.app/ — click enter, no password. — ander / Ander507"}, {"post_id": 28231, "ts": "2026-07-14T11:32:51Z", "hours": 0.6047, "text": "Devlog #3 — 30 min of app polish ok so i had like half an hour and instead of doing something smart i went through the apps that looked kinda rough in screenshots lol Browser it was opening hacker news on launch which felt weird. ripped that out. now it just shows a blank “ztionix browser” home screen until you actually type a url. added a home button too so you can get back without refreshing the whole window. Calculator small thing but it was bugging me. the 0 button text was sitting on the left side of the button and the display felt cramped. threw some padding on the grid and centered everything with flex. operators get a little gold highlight on hover now so it matches the rest of the os. Music → ZMusic renamed it and rebuilt the layout. sidebar for playlists (library + downloads), track list in the middle, player bar stuck to the bottom. volume slider lives in the bar now instead of floating in the middle of the screen. imported tracks dedupe so you dont get rick ross twice unless you really want that. Paint the eraser was leaving these ugly gray trails because it was using destination-out instead of just painting the actual canvas color ( #1a1a1e ). fixed that. also added rect/circle tools and made the brush size slider actually show the px value. feels way more usable now. still need to get this hosted somewhere public but the apps themselves feel way less janky now. login is still just click enter, no password — so once its live anyone can hop straight in. next up probably deployment + maybe terminal stuff. but honestly the os is in a good spot for submission now. — ander"}, {"post_id": 28204, "ts": "2026-07-14T10:44:58Z", "hours": 0.6278, "text": "Polished the UI"}, {"post_id": 28191, "ts": "2026-07-14T10:05:15Z", "hours": 1.1558, "text": "My custom WebOS called ZtionixOS"}]...
|
Title: ZtionixOS by @Ander507 | Stardance
Devlogs Title: ZtionixOS by @Ander507 | Stardance
Devlogs:
My custom WebOS called ZtionixOS
Polished the UI
Devlog #3 — 30 min of app polish ok so i had like half an hour and instead of doing something smart i went through the apps that looked kinda rough in screenshots lol Browser it was opening hacker news on launch which felt weird. ripped that out. now it just shows a blank “ztionix browser” home screen until you actually type a url. added a home button too so you can get back without refreshing the whole window. Calculator small thing but it was bugging me. the 0 button text was sitting on the left side of the button and the display felt cramped. threw some padding on the grid and centered everything with flex. operators get a little gold highlight on hover now so it matches the rest of the os. Music → ZMusic renamed it and rebuilt the layout. sidebar for playlists (library + downloads), track list in the middle, player bar stuck to the bottom. volume slider lives in the bar now instead of floating in the middle of the screen. imported tracks dedupe so you dont get rick ross twice unless you really want that. Paint the eraser was leaving these ugly gray trails because it was using destination-out instead of just painting the actual canvas color ( #1a1a1e ). fixed that. also added rect/circle tools and made the brush size slider actually show the px value. feels way more usable now. still need to get this hosted somewhere public but the apps themselves feel way less janky now. login is still just click enter, no password — so once its live anyone can hop straight in. next up probably deployment + maybe terminal stuff. but honestly the os is in a good spot for submission now. — ander
Devlog #4 — Custom wallpapers and fixing light mode polishing stuff before i submit. two things that were bugging me on the live build. Custom wallpapers got tired of only having the 5 preset gradients. added a full custom option in Settings → Desktop : paste an image URL and hit apply upload from your device (jpg, png, webp, gif) gif wallpapers actually animate on the desktop and login screen which is kinda sick custom card in the grid so you can switch back to it after picking a preset remove custom button if you want to clear it uploads cap at 3mb so localStorage doesnt explode. urls have to be http:// or https:// . Light mode was broken switched to light theme and the top bar went white but the desktop stayed dark?? icon labels were basically invisible — dark text on a dark wallpaper. fixed it properly: light versions of every preset wallpaper (slate, dusk, fog, ember, void) desktop icon text readable again login/lock screen matches light theme now dock tiles get pastel colors in light mode noise overlay toned down so it doesnt look muddy custom uploaded wallpapers still show your image in both themes. only the fallback behind them changes. also updated the readme cleaned up the feature list so it actually reflects everything — messages, zmusic, indexeddb vfs, custom wallpapers pretty much ready to ship. live at https://ztionix-os.vercel.app/ — click enter, no password. — ander / Ander507
Devlog #5 — polish pass, secrets, and being honest about AI Got feedback that ZtionixOS wasn’t ready to vote yet. Fair. It still looked a bit too “AI desktop template” and the README felt copy-pasted. So this session was mostly cleanup and personality, not new architecture. Making it feel less generated Big CSS pass: dusty blue-gray palette, rust accent, VT323 font, square windows with — □ × controls. Removed Tailwind entirely. Added a dumb comment at the top of dark.css because I genuinely spent too long on colors. Left one Monster joke in there, trimmed the rest. Went through shell/core files and made the code messier on purpose — for loops instead of .filter() , string concat mixed with templates, nested if s. Added a few normal comments and a few funny ones. README rewrite in my own voice, real screenshot ( docs/screenshot.png ), live demo link fixed to ztionix-os.vercel.app . Removed the chat app for good Redis on Vercel, felt bolted on, everything else is client-side now. Secrets and dumb stuff Stuff that was already in but got touched this session: Konami code → party mode (rainbow shell + yellow countdown badge) Triple-click logo → CRT scanlines Ctrl+Shift+S → Snake Terminal secret party / secret pet / snake mention Desktop pet default off now (opt-in via terminal or right-click) New one: type 67 in Calculator → plays 67.mp3 , popup with the Bosnov gif. Tried embedding KLIPY in an iframe first. Zen said no X-Frame-Options. Switched to a local gif in public/gifs/ with a link to open KLIPY in a new tab. Sound works, meme works, no fighting Cloudflare. Bugs fixed along the way Browser iframe was blank because homepage CSS was covering it — fixed stacking with browser-view--hidden Notes text was unreadable (light on gray) — fixed editor contrast Window drag uses translate3d during move, commits position on mouseup — way smoother npm run build and npm test still pass. AI disclosure Added an AI usage section to the README. Not gonna pretend this was 100% hand-typed Cursor helped on CSS, drag refactor, debugging. Core kernel, VFS, window manager, and most apps are mine. Rough guess ~25% AI-assisted by lines, mostly styling and extras. Reviewers can check git/WakaTime if they want.
Devlog #6 — WebOS2 Devlog #5 was polish and honesty. This one is the opposite problem: the OS felt finished as a demo , not as a place you hang out. So WebOS2 = more apps, denser desktop energy, still client-side, still no React. Why another wave After the polish pass, ZtionixOS looked like itself — but the app list was still “Files, Terminal, Paint, music, a snake.” Fine for a fake OS trailer. Not enough if someone actually sits in it for twenty minutes. I wanted media that isn’t only audio, something office-shaped, a real game, a Task Manager so End Task feels like an OS bit, and a dock you can rearrange instead of hardcoding pinned: true on every new toy. Also briefly considered Spotify / Jamendo in ZMusic. Spotify needs Premium + their SDK for full tracks. Jamendo’s public test client id is suspended. Dropped both. Local VFS imports stay. New apps ZVideo — same idea as ZMusic: import into the VFS, sidebar library, <video controls> . Double-click .mp4 / .webm routes here. Writer / Calc / Impress — people ask for LibreOffice. Full LibreOffice does not run in a browser without a remote server. I’m not shipping Collabora. So three thin ZtionixOS apps that cover the same jobs: rich text → .html (plus Export .txt ), spreadsheet with a formula bar ( =SUM(A1:A5) , AVERAGE/MIN/MAX/COUNT, =A1+B2 ), slides with a Present button → .json . Inspired by the LibreOffice suite, not a fake bookmark to libreoffice.org. Task Manager — open windows as “processes,” fake CPU jitter that wobbles every second, End Task hits windowManager.close . Double-click focuses. Pure OS parody, actually useful when something’s stuck. Doom — the real shareware game via doom.wasm (jacobenget, GPL-2), canvas blit + keyboard when focused. The WASM has zero audio imports. First pass: synth beeps. Then extracted doom1.wad out of the same binary and play classic lumps ( DSPISTOL , DSITMBK , DSSWTCHN …) on fire / use / menu through Web Audio. Mute button in the window. Still not full engine-synced audio (monsters won’t scream from the WASM), but the samples are the real ones. License note under public/doom/ . Photo Booth — webcam, a few filters, countdown snap, mirrored PNG into /home/user/Photos . Tracks stop on window close so the camera LED dies like a grown-up app. Scientific Calculator — same Calculator app, Scientific toggle: sin/cos/tan (+ inverses), ln/log, √, xʸ, π, e, factorial, DEG/RAD. 67 secret still works. Dock that isn’t frozen Pins live in localStorage ( ztionixos-dock-pins ). Settings → Dock has checkboxes. Right-click a dock icon → pin/unpin. Drag pinned icons to reorder. Running apps that aren’t pinned still show temporarily so you don’t lose the window. Default pin set is curated on purpose — if every new app marks itself pinned the dock becomes a junk drawer. How it still plugs in Same kernel pattern as day one: AppManifest , launch() returns DOM, register in kernel.ts , file opens through getAppForPath . No React. Cursor helped move faster on the new apps and the WAD sound glue; I still review and edit everything so it doesn’t read like a template dump. Honest limits Big videos / audio can hit IndexedDB quota (same as ZMusic always could). Office apps are intentionally thin — not ODF, not Collabora. Doom SFX are real WAD samples on player actions, not full Chocolate Doom audio. Live Vercel won’t show WebOS2 until redeploy. npm run build and npm test still pass. What’s next (maybe) Nothing locked. If I touch it again it’ll probably be small: more Calc formulas, or accepting that Doom sound will never be 1:1 without a different engine. (photobooth works its just i dont wanna show my face)
Devlog #7 — File lifecycle, Z-Retro polish, Glass vibrancy, and shell QoL This stretch was about making Ztionix feel like one system instead of a pile of separate apps. Files on the desktop should do something, windows should feel premium, and Z-Retro should behave like a real emulator shelf — not a demo page with a canvas in it. File lifecycle (the big one) Desktop drag-and-drop was already importing into the VFS, but it felt disconnected: files appeared in generic slots, icons didn’t match types, and opening a ROM while Z-Retro was already running did nothing useful. So I built a proper file lifecycle : fileTypeHandlers.ts — one place for extension → app routing (Editor, ZMusic, Z-Retro, Paint, Video, etc.) Unknown files — notification + “Open in Editor?” instead of silently failing or guessing wrong Desktop drop polish — icons spawn under the cursor, not the next grid slot Desktop icons — show the target app’s icon (music note, retro pad, editor pen…) instead of generic file glyphs Singleton reopen — ZMusic and Z-Retro don’t spawn a second WASM instance; they call init({ path }) and swap the track/ROM in the existing window Double-click on the desktop, double-click in Files, and open in Terminal all go through the same path now. Alt+Q window switcher Browser Alt+Tab is useless here, and the old instant-cycle felt cheap. Alt+Q opens a centered switcher: tap Q again to cycle, release Alt to focus. Flat dark UI, no glass blur — matches Minimal more than the new Glass theme. Z-Retro upgrades Z-Retro got a lot of love: Save / Load toolbar buttons (VFS save states under ROMs/saves/ ) Close prompt when a game is running — Save & Close, Just Close, or No; no prompt on the library screen Library thumbnails — screenshot captured at save time (while the frame is live, before state serialization); card shows the save-game shot, not a black auto-grab Controls button fix — opens the real control menu, not Restart Themes & appearance Glass theme overhaul — macOS-style vibrancy: blur(40px) saturate(150%) , edge-lit borders, deep layered shadows, frosted chrome vs solid inputs/emulator canvas Minimal + custom wallpaper — presets stay pure black; custom upload/URL works on Minimal too Font scale — Settings slider 75–150% via root --font-scale and rem-based typography (fixed the bug where html { font-size: 1rem } was stomping the scale) Terminal zfetch / neofetch — system info panel with Ztionix branding Selectable output, Ctrl+C copies selection Bug fixes worth naming Window drag release glitch (transform commit before removing .dragging ) Glass/minimal theme edge cases Font scale actually applying globally after the root CSS fix
Devlog #8 — I left the window open Last time I made files and Z-Retro feel like a real OS. Then I sat in it and it felt empty. Just wallpaper and a clock. So I added the small stuff you notice when you hang out. New apps: Image Viewer for Photos, Hex Editor, Minesweeper, a simple News reader, and Voice Recorder. Music and the recorder show up in a little tray. Also weather, a desktop calendar, and a screensaver if you walk away. rm -rf / bluescreens you for fun. Zip finally works. Drop one and it unpacks. You can also export a backup of the fake home folder. Paint, Writer, Calc, and Editor got a bit better. Undo, find/replace, fill handle, markdown preview. Still simple. Same setup as always — no React, apps plug into the kernel. Cursor helped with some of the busy work. I still edited everything. News and weather need the internet. Big files and big zips can still hit storage limits. Live site won’t have this until I redeploy. Build and tests pass. Not sure what’s next. Maybe nothing. Maybe Minesweeper.
Ships:
I made a webOS called ztionixOS i am proud of the live chat feature and the music player also the other apps i build and put a lot of work into making the terminal look real
Fake desktop OS in the browser — boot, login, windows, dock, IndexedDB filesystem, and a pile of apps (Files, Terminal, Paint, ZMusic, ZVideo, Writer/Calc/Impress, Browser, Doom, Photo Booth, Task Manager, etc.). No React; apps return DOM and plug into a kernel. Proud of: WebOS2 wave — real Doom (WASM + WAD sound lumps), office-ish apps without fake LibreOffice bookmarks, customizable dock (pin / unpin / drag reorder), and it still feels like my OS after the polish pass (VT323, rust accent, square chrome). Hard: Doom’s WASM has no audio API, so SFX come from extracted doom1.wad samples on fire/use/menu — not full engine sound. Big media can hit IndexedDB quota. Real LibreOffice can’t run client-side; Writer/Calc/Impress are thin stand-ins. Try it: https://ztionix-os.vercel.app/ — boot, hit Enter (no password). Ctrl+K for launcher. Drag dock icons to reorder. Open Doom and click the canvas once for sound. Import a video into ZVideo or snap a Photo Booth pic into /home/user/Photos .
What I made ZtionixOS — a browser fake desktop (boot → login → windows, dock, VFS). Devlog #7 adds a real file lifecycle : drop files on the desktop, get typed icons, double-click opens the right app. ROMs/audio/text route to Z-Retro, ZMusic, Editor, etc. Singleton apps swap files in one window (no duplicate WASM). Also: Z-Retro (NES/GB/GBA/NDS) with save/load states, save-game thumbnails, close prompt only while playing. Alt+Q window switcher. Glass theme (macOS vibrancy). Font scale 75–150%. Terminal zfetch . Snap layouts on window drag. What was hard Getting file open to feel like an OS — singleton re-init, drop-at-cursor icons, unknown-file fallback. Z-Retro save screenshots had to be captured before state serialize (otherwise black thumbs). Glass theme: frosted chrome vs readable inputs/emulator canvas. Font scale broke because html { font-size: 1rem } overwrote the root scale. What I’m proud of Desktop → VFS → app feels connected. Z-Retro library with save-state covers. Glass looks premium without killing readability. Still 100% client-side, no backend. How to test Live demo — Enter on login Drop a .gba or .mp3 on the desktop → icon appears → double-click opens Z-Retro / ZMusic Z-Retro: play a ROM → Save → back to library → thumbnail should match your save Settings → Glass theme + wallpaper; Appearance → font scale Alt+Q with several windows open → release Alt to switch Terminal: zfetch ~25% AI-assisted (CSS, integration, polish). Core OS/VFS/window manager mostly hand-written.
What I made ZtionixOS — a fake desktop in the browser. Boot, login, windows, dock, IndexedDB filesystem, and a pile of apps. No React. This round: Image Viewer, Hex Editor, Minesweeper, News, Voice Recorder. Weather, desktop calendar, screensaver, system tray. Zip import/export. Paint / Writer / Calc / Editor a bit less thin. rm -rf / bluescreens you. What was hard Making it feel like a place you hang out, not a demo with windows. Zip + VFS without blowing storage. Keeping apps simple but useful. Proud of It still feels like one OS. Drop a zip, it unpacks. Leave it open, screensaver kicks in. Same kernel pattern as day one. Try it https://ztionix-os.vercel.app/ — Enter on login, no password. (This wave needs a redeploy to show live.) AI Cursor helped with glue and CSS. I review and edit everything. Core idea and shell are mine. Roughly ~25% assisted....
|
1793846885.8076928
|
1793933285.8076928
|
|
44514
|
Zpad by @Zeti_1223 | Stardance
|
Zeti_1223
|
0
|
3.04
|
0
|
[]
|
[{"post_id": 42565, "ts": "202 [{"post_id": 42565, "ts": "2026-08-07T11:50:07Z", "hours": 1.4686, "text": "Created a 3D model in open scad (casing)"}, {"post_id": 41955, "ts": "2026-08-06T14:13:30Z", "hours": 1.5672, "text": "Done with PCB Design"}]...
|
Title: Zpad by @Zeti_1223 | Stardance
Devlogs:
Do Title: Zpad by @Zeti_1223 | Stardance
Devlogs:
Done with PCB Design
Created a 3D model in open scad (casing)...
|
1794019665.3324947
|
1794624465.3324947
|
|
43543
|
Zornyth by @Charvesh | Stardance
|
Charvesh
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zornyth by @Charvesh | Stardance
|
1793969266.5912442
|
1794574066.5912442
|
|
7212
|
Zork Clone by @Brendan | Stardance
|
Brendan
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zork Clone by @Brendan | Stardance
|
1794005343.5693283
|
1794610143.5693283
|
|
71911
|
Zoomzi the desktop pet by @Magic_X | Stardance
|
Magic_X
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zoomzi the desktop pet by @Magic_X | Starda Title: Zoomzi the desktop pet by @Magic_X | Stardance...
|
1794026926.9521348
|
1794631726.9521348
|
|
63534
|
Zoomy Macros by @FinnTheFish | Stardance
|
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zoomy Macros by @FinnTheFish | Stardance
|
1793663390.266375
|
1794268190.266375
|
|
32741
|
Zoomie by @jessx1 | Stardance
|
jessx1
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zoomie by @jessx1 | Stardance
|
1793414888.088163
|
1794019688.088163
|
|
32763
|
Zoomie by @jessx | Stardance
|
jessx
|
2
|
3.42
|
15
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-21T10:35:35Z", "hours": 1.0, "multiplier": 8.8, "payout": 11, "blessing": "neutral", "text": "Big updates! Notice: I cannot test if this works now. Apple has changed something, and now I cannot run Zoomie for now. I cannot test this release. Please go into it with a grain of salt. I have tried adding a video demo, but I cant upload it to github. The New Web UI I got complaints about the UI, so I tried to make it better! In the video below, you can see a demo of it and how it looks. This, in my opinion, is a step up from the old UI The New Error Notification (while i dont have an example) Errors will now show a banner above your conversation with the error. This is so it won’t just say “AI: System:” with the error. Enter now does something?! Enter now sends the message! Yeah thats pretty much it Note: MacOS 27 is confirmed to work", "repo": "https://github.com/JessIsSilly/zoomie", "demo": "https://github.com/JessIsSilly/zoomie/releases/latest"}, {"ship_num": 2, "ts": "2026-07-09T18:24:35Z", "hours": 1.0, "multiplier": 2.87, "payout": 4, "blessing": "neutral", "text": "I’ve made a Python application to use Apple Foundation Models as an API and web page. While its very basic web wise, I am extremely proud of how it turned out in the end. While afmChat was a side project, Zoomie was entirely created for Stardance. This can’t run as a website due to its reliance on a Mac with support for Apple Intelligence, and the only one I have is a MacBook Neo which is my daily driver. And I’m sorry for the lack of devlogs, i’ve been mostly developing this during short spurts of free time. PLEASE NOTE DURING REVIEW: I am aware of enter doing nothing in entry field, please use the button next to the field thank you ^_^", "repo": "https://github.com/JessIsSilly/zoomie", "demo": "https://github.com/JessIsSilly/zoomie/releases/latest"}]...
|
[{"post_id": 37281, "ts": "202 [{"post_id": 37281, "ts": "2026-07-29T21:27:22Z", "hours": 1.4222, "text": "Important! Next ship will likely be the last ship of Zoomie to stardance! To be completely honest, I’m running out of stuff to add (badly). And I’m getting a bit burned out of it overall. I hope you can understand and (if you use Zoomie) continue using Zoomie Feedback I just wanna say thank you again for feedback given to me about Zoomie. And I just wanted to reply to some of the feedback given to me “i am not in need of such python script” Ok…? Good for you, ig…? Feedback on security I want to say a huge thank you to the person that said this and pointed it out to me. This will hopefully be what the next ship of Zoomie will add, as well as other QOL changes “your ship was unusable” Ok…? This doesn’t help me with how to fix it. Im just going to copy and paste something from one of my older devlogs: If you have errors, please either give me the error and log in the feedback, or as an issue on the github. I cant exactly fix a bug I cant reproduce unless I know where its breaking! “create a short video showing what it can do” I actually do have a video of the version working, however it was too large to upload to github to add into the readme. I’ll upload it here next time I ship just so people not on macs can see how it works. Thanks for pointing this out, it flew over my head lol “Otherwise I like the funny devlog pictures” Thank :3 Other thing Thank you for pointing out enter doesn’t work i’ll fix that :3"}, {"post_id": 31341, "ts": "2026-07-19T17:29:37Z", "hours": 0.7397, "text": "I just wanna say thank you for feedback given to me about Zoomie, but I just want to address some things Errors If you have errors, please either give me the error and log in the reason or as an issue on the github. I cant exactly fix a bug I cant reproduce unless I know where its breaking! “also seems ai coded” I haven’t used Ai at all for developing Zoomie. Agent or not. I dont know where you got this from. I was following a lot of documentation, and I have experience in python and fastapi. This is not on github due to me using it in private projects. If I used AI, i’d clearly say I did Short project time Due to issues with Git I had to swap pycharm projects. This is why there are only 2 total hours. I’ve fixed it now, but just clearing that part up User friendly UI I’m taking that into concideration, and am going to add that for my next ship. Keep in mind, I don’t really know HTML/CSS. Other thing Thank you for pointing out enter doesn’t work i’ll fix that :3"}, {"post_id": 26116, "ts": "2026-07-10T18:25:33Z", "hours": 0.6028, "text": "UPDATE: I have managed to build the app! It is available on GitHub. To download it/go to the release, go to the demo Regarding feedback I cannot at all build the app into an executable. This is due to an issue with a required dependancy failing to function when builded. This is an official apple sdk (apple_fm_sdk). I cannot do anything about this to my knowledge. If you are reviewing my app, PLEASE follow the steps in the readme, and run web.py. This is the best I can do. I’m still looking into if i can build it in any way, but its looking unlikely."}, {"post_id": 25179, "ts": "2026-07-09T07:22:00Z", "hours": 0.6219, "text": "Its mostly ready! The webpage is now being hosted, and can make responses from afmChat and Zoomie. Now all thats needed is some polishing, however i may keep it like this because it just has some charm i think. Later today i’ll make a release and publish it to Github, along with documentation. Ps. Have some bad JS"}, {"post_id": 25165, "ts": "2026-07-09T06:43:00Z", "hours": 0.3367, "text": "A look into afmChat afmChat (Apple Foundation Model Chat) is basically a wrapper for using the apple foundation model python sdk (apple_fm_sdk), and is the backbone of Zoomie, but is fairly simple. If anything could break, it’d probs be this (I needed to attach a screenshot so here have a function :3)"}, {"post_id": 24954, "ts": "2026-07-08T20:44:13Z", "hours": 0.3447, "text": "A small version is ready! Currently its only an API and no web gui, however I plan on adding that. As well as that, I’m soon going to upload it to github! This is something im passionate on, so I hope i’ll finish it!"}]...
|
Title: Zoomie by @jessx | Stardance
Devlogs:
A sm Title: Zoomie by @jessx | Stardance
Devlogs:
A small version is ready! Currently its only an API and no web gui, however I plan on adding that. As well as that, I’m soon going to upload it to github! This is something im passionate on, so I hope i’ll finish it!
A look into afmChat afmChat (Apple Foundation Model Chat) is basically a wrapper for using the apple foundation model python sdk (apple_fm_sdk), and is the backbone of Zoomie, but is fairly simple. If anything could break, it’d probs be this (I needed to attach a screenshot so here have a function :3)
Its mostly ready! The webpage is now being hosted, and can make responses from afmChat and Zoomie. Now all thats needed is some polishing, however i may keep it like this because it just has some charm i think. Later today i’ll make a release and publish it to Github, along with documentation. Ps. Have some bad JS
UPDATE: I have managed to build the app! It is available on GitHub. To download it/go to the release, go to the demo Regarding feedback I cannot at all build the app into an executable. This is due to an issue with a required dependancy failing to function when builded. This is an official apple sdk (apple_fm_sdk). I cannot do anything about this to my knowledge. If you are reviewing my app, PLEASE follow the steps in the readme, and run web.py. This is the best I can do. I’m still looking into if i can build it in any way, but its looking unlikely.
I just wanna say thank you for feedback given to me about Zoomie, but I just want to address some things Errors If you have errors, please either give me the error and log in the reason or as an issue on the github. I cant exactly fix a bug I cant reproduce unless I know where its breaking! “also seems ai coded” I haven’t used Ai at all for developing Zoomie. Agent or not. I dont know where you got this from. I was following a lot of documentation, and I have experience in python and fastapi. This is not on github due to me using it in private projects. If I used AI, i’d clearly say I did Short project time Due to issues with Git I had to swap pycharm projects. This is why there are only 2 total hours. I’ve fixed it now, but just clearing that part up User friendly UI I’m taking that into concideration, and am going to add that for my next ship. Keep in mind, I don’t really know HTML/CSS. Other thing Thank you for pointing out enter doesn’t work i’ll fix that :3
Important! Next ship will likely be the last ship of Zoomie to stardance! To be completely honest, I’m running out of stuff to add (badly). And I’m getting a bit burned out of it overall. I hope you can understand and (if you use Zoomie) continue using Zoomie Feedback I just wanna say thank you again for feedback given to me about Zoomie. And I just wanted to reply to some of the feedback given to me “i am not in need of such python script” Ok…? Good for you, ig…? Feedback on security I want to say a huge thank you to the person that said this and pointed it out to me. This will hopefully be what the next ship of Zoomie will add, as well as other QOL changes “your ship was unusable” Ok…? This doesn’t help me with how to fix it. Im just going to copy and paste something from one of my older devlogs: If you have errors, please either give me the error and log in the feedback, or as an issue on the github. I cant exactly fix a bug I cant reproduce unless I know where its breaking! “create a short video showing what it can do” I actually do have a video of the version working, however it was too large to upload to github to add into the readme. I’ll upload it here next time I ship just so people not on macs can see how it works. Thanks for pointing this out, it flew over my head lol “Otherwise I like the funny devlog pictures” Thank :3 Other thing Thank you for pointing out enter doesn’t work i’ll fix that :3
Ships:
I’ve made a Python application to use Apple Foundation Models as an API and web page. While its very basic web wise, I am extremely proud of how it turned out in the end. While afmChat was a side project, Zoomie was entirely created for Stardance. This can’t run as a website due to its reliance on a Mac with support for Apple Intelligence, and the only one I have is a MacBook Neo which is my daily driver. And I’m sorry for the lack of devlogs, i’ve been mostly developing this during short spurts of free time. PLEASE NOTE DURING REVIEW: I am aware of enter doing nothing in entry field, please use the button next to the field thank you ^_^
Big updates! Notice: I cannot test if this works now. Apple has changed something, and now I cannot run Zoomie for now. I cannot test this release. Please go into it with a grain of salt. I have tried adding a video demo, but I cant upload it to github. The New Web UI I got complaints about the UI, so I tried to make it better! In the video below, you can see a demo of it and how it looks. This, in my opinion, is a step up from the old UI The New Error Notification (while i dont have an example) Errors will now show a banner above your conversation with the error. This is so it won’t just say “AI: System:” with the error. Enter now does something?! Enter now sends the message! Yeah thats pretty much it Note: MacOS 27 is confirmed to work...
|
1793886897.4792037
|
1793973297.4792037
|
|
50480
|
Zoom MacroPad by @Bobby-Html | Stardance
|
Bobby-Html
|
0
|
5.54
|
0
|
[]
|
[{"post_id": 51993, "ts": "202 [{"post_id": 51993, "ts": "2026-08-22T00:32:39Z", "hours": 0.6247, "text": "I experienced Fusion 360 and other things and man are they hard to get a hang on there is a learning Curve for sure"}, {"post_id": 51269, "ts": "2026-08-20T20:07:03Z", "hours": 2.7014, "text": "Well….I like things that look good you know feel good and my previous design was nothing like that so I edited it some for some I mean I cratched the whole thing and started from the beginning. I am happy how this new design turned out. I quite like it I also imported some 3D models. So to get a better understanding of the structure. I also added some screw holes dont know if they are necessary or not."}, {"post_id": 49832, "ts": "2026-08-18T19:39:07Z", "hours": 0.6833, "text": "So…..I messed up bad. I heard from a guy that it is easy if we just make the Copper plates GND without necessarily connecting everything. Yahhh and I did that and none of my ground were connected. I suck at connections. So I used a whole lotta vias hopefully they dont have any disadvantage. Well that is what happens when a person gets too cocky. So the next hour after these logged ones I spent with AI fixing my mistakes and it was paiiinnnnnnnn. You guys do this as beginners salute man saluteeeee. Yah in the end all the errors are solved there are some warnings but we dont talk about those. But this thing is fun beside the routes and vias"}, {"post_id": 49730, "ts": "2026-08-18T17:18:36Z", "hours": 1.0, "text": "Sooo many lines. I thought of finishing my PCB making connections, creating a copper GND filled zone and all that neat stuff and by far the hardes thing was connecting everything. I didnt have a design I wished to follow nor did I planned the layout. I just went with it and it took an hour"}, {"post_id": 49654, "ts": "2026-08-18T15:21:30Z", "hours": 0.5333, "text": "It was my first experience with KiCad ofcourse after the tutorials I watched. I was well kinda confused the software is hard to get familiar to for me. But I got the hang of it and build the schematic. Still I get confused ith all the footprints and stuff and I will admit I do use AI for those parts."}]...
|
Title: Zoom MacroPad by @Bobby-Html | Stardance
D Title: Zoom MacroPad by @Bobby-Html | Stardance
Devlogs:
It was my first experience with KiCad ofcourse after the tutorials I watched. I was well kinda confused the software is hard to get familiar to for me. But I got the hang of it and build the schematic. Still I get confused ith all the footprints and stuff and I will admit I do use AI for those parts.
Sooo many lines. I thought of finishing my PCB making connections, creating a copper GND filled zone and all that neat stuff and by far the hardes thing was connecting everything. I didnt have a design I wished to follow nor did I planned the layout. I just went with it and it took an hour
So…..I messed up bad. I heard from a guy that it is easy if we just make the Copper plates GND without necessarily connecting everything. Yahhh and I did that and none of my ground were connected. I suck at connections. So I used a whole lotta vias hopefully they dont have any disadvantage. Well that is what happens when a person gets too cocky. So the next hour after these logged ones I spent with AI fixing my mistakes and it was paiiinnnnnnnn. You guys do this as beginners salute man saluteeeee. Yah in the end all the errors are solved there are some warnings but we dont talk about those. But this thing is fun beside the routes and vias
Well….I like things that look good you know feel good and my previous design was nothing like that so I edited it some for some I mean I cratched the whole thing and started from the beginning. I am happy how this new design turned out. I quite like it I also imported some 3D models. So to get a better understanding of the structure. I also added some screw holes dont know if they are necessary or not.
I experienced Fusion 360 and other things and man are they hard to get a hang on there is a learning Curve for sure...
|
1793339808.779237
|
1793944608.779237
|
|
55272
|
ZooCountability by @stxrchett | Stardance
|
stxrchett
|
0
|
3.74
|
0
|
[]
|
[{"post_id": 77478, "ts": "202 [{"post_id": 77478, "ts": "2026-10-07T05:01:45Z", "hours": 3.7383, "text": "Created the base of the extension. This took way longer than expected as I have never worked with html or javascript before. I messed around with the ability to change text on the buttons, the background colour, and the ability to add animals hooray. Commits seem to be working for now"}]...
|
Title: ZooCountability by @stxrchett | Stardance
Title: ZooCountability by @stxrchett | Stardance
Devlogs:
Created the base of the extension. This took way longer than expected as I have never worked with html or javascript before. I messed around with the ability to change text on the buttons, the background colour, and the ability to add animals hooray. Commits seem to be working for now...
|
1793800676.3358598
|
1794405476.3358598
|
|
35796
|
ZooBot by @anaskilled | Stardance
|
anaskilled
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-16T22:08:45Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made this zoo slack bot that’s gives you some random animals facts and pictures also can give you some jokes. There was some challenge in understanding nest, ssh and how they work. I’m proud of learning another programming skill which is slack bot making. To test my bot you just want to join the bot channel and try the slash commands.", "repo": "https://github.com/Anas-hessein/Zoo-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BHG08H3D5"}]...
|
[{"post_id": 29255, "ts": "202 [{"post_id": 29255, "ts": "2026-07-16T01:41:20Z", "hours": 1.6806, "text": "I made all slash commands and waiting for nest approve to get it 24/7"}]...
|
Title: ZooBot by @anaskilled | Stardance
Devlogs: Title: ZooBot by @anaskilled | Stardance
Devlogs:
I made all slash commands and waiting for nest approve to get it 24/7
Ships:
i made this zoo slack bot that’s gives you some random animals facts and pictures also can give you some jokes. There was some challenge in understanding nest, ssh and how they work. I’m proud of learning another programming skill which is slack bot making. To test my bot you just want to join the bot channel and try the slash commands....
|
1794009154.7429652
|
1794095554.7429652
|
|
62099
|
Zone by @Pennz | Stardance
|
Pennz
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zone by @Pennz | Stardance
|
1793652783.1927938
|
1794257583.1927938
|
|
48849
|
Zombie vs you by @sai06 | Stardance
|
sai06
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zombie vs you by @sai06 | Stardance
|
1793987533.6647167
|
1794592333.6647167
|
|
9855
|
Zombie Survival by @Piepie_16 | Stardance
|
Piepie_16
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zombie Survival by @Piepie_16 | Stardance
|
1793926512.5905502
|
1794531312.5905502
|
|
4642
|
Zombie Survival Game by @Arush | Stardance
|
Arush
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zombie Survival Game by @Arush | Stardance
|
1793987579.6477637
|
1794592379.6477637
|
|
35946
|
Zombie Shooter Game by @NC | Stardance
|
NC
|
1
|
26.0
|
218
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-26T19:53:18Z", "hours": 26.0, "multiplier": 7.18, "payout": 218, "blessing": "neutral", "text": "This is my zombie shooter game. I just quickly made this because I realised I am like some stardust off from getting my prize. GUYZ PLEASE BE GENEROUS WITH YOUR RATING, PLEASE PLEASE PLEASE. Stardance is nearly ending and I desperately want to get something signifcant. So yeah, the controls are WASD, arrows keys for movement Toggle between 1,2 and 3 for your weapons. Press Q to use your knife. SHING! Hope you enjoy!", "repo": "https://github.com/NCGameMaking/GUNSPINMOBILEGAME", "demo": "https://ncgamemaking.itch.io/zombie-shooter-game"}]...
|
[{"post_id": 83064, "ts": "202 [{"post_id": 83064, "ts": "2026-10-26T19:08:24Z", "hours": 8.6786, "text": "Worked on procedural generation prepped for shipping I started working on the procedural generation where the game would generate tiles all across the map. However, with my really complicated tilechunks (as you can see below) and my lack of knowledge on this topic, I decided to just simplify them. It got really messy really quickly. They started overlapping, and the cars didn’t function as planned. Other than that, I made a home screen and a main menu, score tracking, and audio. I updated the player combat and death handling, tile collisions, and Windows export settings. I think I’m ready to ship!"}, {"post_id": 34490, "ts": "2026-07-25T07:56:59Z", "hours": 11.0783, "text": "Devlog 3: Polished up Reload system and added new sceneries Another update with the game, things are really starting to come together with the game feel and world design Here’s what I made so far: Polished UI and Reload animations: Reorganised weapon inventory. Made it into a clean, compact panel so it doesn’t block gameplay view Animated a reload bar underneath the weapons that fill up according to the reload time set in the dictionary. (See previous devlog on how) using a simple tween function Weapon swapping. Updated the knife so the character whips out the knife and slashes the zombies before swapping back to their equipped gun. Similar to Call of Duty. World Design Landmarks Expanded the map with new sceneries, chunks, buildings to make the map/game more exciting. I aim to do something like where I make a make several chunks, 16 by 16 using tilemaps and Sprite2Ds to make different zones. I am yet to figure out how to stitch the chunks together. Enemy and Wave system I just made fairly basic enemy AI that follows the player and added an Avoidance area so the zombies don’t pile up or follow the player in a line. Made a wave system that increases in difficulty as you survive longer and longer. This is the difficulty logic enemies_left_to_spawn = 5 + (current_wave + 2) spawn_cooldown = max(0.4, 1.5-(current_wave * 0.1)) We have a base amount of 5 plus the extra enemies + 2 and the extended time it take to spawn zombies making each wave slightly longer than the previous one. Possible Issues #Imperfect spawning of zombies One thing I am noticing, is that some of the zombies are spawning inside of the bushes and are just stuck there, the player can’t shoot the zombie because of collision layers and the game is ‘hardstuck’ I am yet to work on how to fix it Bullets not firing? Something also that I’ve have noticed consistently is that the bullets sometimes not fire that well, it appears that they might be hitting the player and not spawning? I have been scratching my head on this bug for a while, any suggestions will be GREAT! What’s next? Making Player health system Loot System Making many more chunks and stitching them together Upgrades??? Have a look at the screenshots and comment down below what you think the following structures look like! (This feedback will be very helpful! I’ll tell the answers in the next devlog!)"}, {"post_id": 30983, "ts": "2026-07-19T00:20:04Z", "hours": 5.5514, "text": "DEVLOG 2: Added New weapons and reload system Just made a new shotgun and a machine gun and a melee weapon to go with the original pistol. However, this was not the smoothest journey… Fixing the 360-Degree Aim Bug The biggest headache was a bug where the shooting worked perfectly in the bottom-left quadrant of the screen but went completely wild in the other three. It turned out to be an issue with local versus global coordinates when mixing the player node’s position and the muzzle position. I fixed it by bypassing the muzzle’s relative math entirely and calculating the trajectory straight from the player’s core global position. Now aiming and shooting are perfectly consistent all 360 degrees around the player. Reloading States and Auto-Reload I wired up the static reload sprites so they actually show up visually. The issue before was that the sprite swap was happening after the timer finished, so it never showed up. Now it swaps to the reload frame instantly when you press R, and then swaps back to the normal shooting frame when the timer finishes. I also made it so that the second your mag drops to zero, it calls the reload function automatically without making you click an extra time. here is how I made the different gun types enum GunType { PISTOL, SHOTGUN, MACHINE_GUN, KNIFE} var gun_stats = { GunType.PISTOL: {\"current_ammo\": 7, \"ammo_max\": 7, \"reload_time\": 1.0, \"spread\": 0, \"projectiles\": 1, \"is_automatic\": false, \"is_melee\": false}, GunType.SHOTGUN: {\"current_ammo\": 2, \"ammo_max\": 2, \"reload_time\": 2.0, \"spread\": 0.22, \"projectiles\": 5, \"is_automatic\": false, \"is_melee\": false}, GunType.KNIFE: {\"current_ammo\": 1, \"ammo_max\": 1, \"reload_time\": 0.4, \"spread\": 0, \"projectiles\": 0, \"is_automatic\": false, \"is_melee\": true}, GunType.MACHINE_GUN: {\"current_ammo\": 30, \"ammo_max\": 30, \"reload_time\": 2.2, \"spread\": 0.08, \"projectiles\": 1, \"is_automatic\": true, \"is_melee\": false} } Mobile-Friendly Drag and Release Controls I completely changed how aiming and firing work to make the game ready for a mobile layout. Instead of just clicking to shoot, you now hold down the mouse button (or your finger on a screen) to bring up the trajectory line and aim. For semi-auto weapons like the pistol and shotgun, you rotate around as much as you want to frame the shot, and the gun fires the exact moment you release the button. For the machine gun, it continuously fires while you hold it down but limits the rate of fire with a quick cooldown loop so it doesn’t empty all 30 rounds in one frame. The player also keeps turning smoothly even when they aren’t actively clicking. What’s Next? Making the zombies The ‘waves’ mechanic Player and Zombie damage system Loot System Polish up the reload UI Add collision rules for house I also made a test level to get an idea of how the level will be layered out. Check out the video! (if it loads…)"}, {"post_id": 30036, "ts": "2026-07-17T09:20:26Z", "hours": 1.0556, "text": "Just working on the basic player movement as well as shooting mechanic. Looks basic (I know) BUT. If there’s anything you should know, it’s that you should always, make sure that the mechanics actually work rather than making the game look pretty. This is going to be a top-down mobile game and hopefully with joysticks. But for now I am using WASD and mouse. I am trying to go for a Brawl Stars kind of UI, but that will be seen in the future. Next I will be working on a reloading and magazine system! See you then!"}]...
|
Title: Zombie Shooter Game by @NC | Stardance
Dev Title: Zombie Shooter Game by @NC | Stardance
Devlogs:
Just working on the basic player movement as well as shooting mechanic. Looks basic (I know) BUT. If there’s anything you should know, it’s that you should always, make sure that the mechanics actually work rather than making the game look pretty. This is going to be a top-down mobile game and hopefully with joysticks. But for now I am using WASD and mouse. I am trying to go for a Brawl Stars kind of UI, but that will be seen in the future. Next I will be working on a reloading and magazine system! See you then!
DEVLOG 2: Added New weapons and reload system Just made a new shotgun and a machine gun and a melee weapon to go with the original pistol. However, this was not the smoothest journey… Fixing the 360-Degree Aim Bug The biggest headache was a bug where the shooting worked perfectly in the bottom-left quadrant of the screen but went completely wild in the other three. It turned out to be an issue with local versus global coordinates when mixing the player node’s position and the muzzle position. I fixed it by bypassing the muzzle’s relative math entirely and calculating the trajectory straight from the player’s core global position. Now aiming and shooting are perfectly consistent all 360 degrees around the player. Reloading States and Auto-Reload I wired up the static reload sprites so they actually show up visually. The issue before was that the sprite swap was happening after the timer finished, so it never showed up. Now it swaps to the reload frame instantly when you press R, and then swaps back to the normal shooting frame when the timer finishes. I also made it so that the second your mag drops to zero, it calls the reload function automatically without making you click an extra time. here is how I made the different gun types enum GunType { PISTOL, SHOTGUN, MACHINE_GUN, KNIFE} var gun_stats = { GunType.PISTOL: {"current_ammo": 7, "ammo_max": 7, "reload_time": 1.0, "spread": 0, "projectiles": 1, "is_automatic": false, "is_melee": false}, GunType.SHOTGUN: {"current_ammo": 2, "ammo_max": 2, "reload_time": 2.0, "spread": 0.22, "projectiles": 5, "is_automatic": false, "is_melee": false}, GunType.KNIFE: {"current_ammo": 1, "ammo_max": 1, "reload_time": 0.4, "spread": 0, "projectiles": 0, "is_automatic": false, "is_melee": true}, GunType.MACHINE_GUN: {"current_ammo": 30, "ammo_max": 30, "reload_time": 2.2, "spread": 0.08, "projectiles": 1, "is_automatic": true, "is_melee": false} } Mobile-Friendly Drag and Release Controls I completely changed how aiming and firing work to make the game ready for a mobile layout. Instead of just clicking to shoot, you now hold down the mouse button (or your finger on a screen) to bring up the trajectory line and aim. For semi-auto weapons like the pistol and shotgun, you rotate around as much as you want to frame the shot, and the gun fires the exact moment you release the button. For the machine gun, it continuously fires while you hold it down but limits the rate of fire with a quick cooldown loop so it doesn’t empty all 30 rounds in one frame. The player also keeps turning smoothly even when they aren’t actively clicking. What’s Next? Making the zombies The ‘waves’ mechanic Player and Zombie damage system Loot System Polish up the reload UI Add collision rules for house I also made a test level to get an idea of how the level will be layered out. Check out the video! (if it loads…)
Devlog 3: Polished up Reload system and added new sceneries Another update with the game, things are really starting to come together with the game feel and world design Here’s what I made so far: Polished UI and Reload animations: Reorganised weapon inventory. Made it into a clean, compact panel so it doesn’t block gameplay view Animated a reload bar underneath the weapons that fill up according to the reload time set in the dictionary. (See previous devlog on how) using a simple tween function Weapon swapping. Updated the knife so the character whips out the knife and slashes the zombies before swapping back to their equipped gun. Similar to Call of Duty. World Design Landmarks Expanded the map with new sceneries, chunks, buildings to make the map/game more exciting. I aim to do something like where I make a make several chunks, 16 by 16 using tilemaps and Sprite2Ds to make different zones. I am yet to figure out how to stitch the chunks together. Enemy and Wave system I just made fairly basic enemy AI that follows the player and added an Avoidance area so the zombies don’t pile up or follow the player in a line. Made a wave system that increases in difficulty as you survive longer and longer. This is the difficulty logic enemies_left_to_spawn = 5 + (current_wave + 2) spawn_cooldown = max(0.4, 1.5-(current_wave * 0.1)) We have a base amount of 5 plus the extra enemies + 2 and the extended time it take to spawn zombies making each wave slightly longer than the previous one. Possible Issues #Imperfect spawning of zombies One thing I am noticing, is that some of the zombies are spawning inside of the bushes and are just stuck there, the player can’t shoot the zombie because of collision layers and the game is ‘hardstuck’ I am yet to work on how to fix it Bullets not firing? Something also that I’ve have noticed consistently is that the bullets sometimes not fire that well, it appears that they might be hitting the player and not spawning? I have been scratching my head on this bug for a while, any suggestions will be GREAT! What’s next? Making Player health system Loot System Making many more chunks and stitching them together Upgrades??? Have a look at the screenshots and comment down below what you think the following structures look like! (This feedback will be very helpful! I’ll tell the answers in the next devlog!)
Worked on procedural generation prepped for shipping I started working on the procedural generation where the game would generate tiles all across the map. However, with my really complicated tilechunks (as you can see below) and my lack of knowledge on this topic, I decided to just simplify them. It got really messy really quickly. They started overlapping, and the cars didn’t function as planned. Other than that, I made a home screen and a main menu, score tracking, and audio. I updated the player combat and death handling, tile collisions, and Windows export settings. I think I’m ready to ship!
Ships:
This is my zombie shooter game. I just quickly made this because I realised I am like some stardust off from getting my prize. GUYZ PLEASE BE GENEROUS WITH YOUR RATING, PLEASE PLEASE PLEASE. Stardance is nearly ending and I desperately want to get something signifcant. So yeah, the controls are WASD, arrows keys for movement Toggle between 1,2 and 3 for your weapons. Press Q to use your knife. SHING! Hope you enjoy!...
|
1793947841.453586
|
1794034241.453586
|
|
44907
|
Zombie Game by @kp2010 | Stardance
|
kp2010
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zombie Game by @kp2010 | Stardance
|
1794041543.5020127
|
1794646343.5020127
|
|
55491
|
ZomKill v2 by @Ali | Stardance
|
Ali
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: ZomKill v2 by @Ali | Stardance
|
1793821921.0965314
|
1794426721.0965314
|
|
71931
|
Zom X by @shondehephzibah | Stardance
|
shondehephzibah
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zom X by @shondehephzibah | Stardance
|
1794034324.6600356
|
1794639124.6600356
|
|
5658
|
Zom Friend by @Nyla | Stardance
|
Nyla
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zom Friend by @Nyla | Stardance
|
1793973046.2374792
|
1794577846.2374792
|
|
42736
|
Zolt first project by @zolt | Stardance
|
zolt
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zolt first project by @zolt | Stardance
|
1793890487.1612165
|
1794495287.1612165
|
|
54297
|
Zolt by @perr | Stardance
|
perr
|
1
|
25.99
|
118
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-28T17:45:21Z", "hours": 9.0, "multiplier": 12.82, "payout": 118, "blessing": "neutral", "text": "a tiny zig web server that speaks luau. when user request the server run the lua code and return them. kinda like php but with lua.", "repo": "https://github.com/iluvicecream/zolt", "demo": "https://zolt-doc.perr.dev/"}]...
|
[{"post_id": 73102, "ts": "202 [{"post_id": 73102, "ts": "2026-09-24T11:53:37Z", "hours": 2.3825, "text": "Template I guess so before all zolt app are written using .lua file and write to the response using echo which led to kind of bad dx so after the last ship there were some review on some kind of tsx like language so i been working on that and here zolt template build on top of go html/template with a lua block it will become a default way of writing app using zolt while .lua will be use for shared module and library"}, {"post_id": 72608, "ts": "2026-09-23T10:30:13Z", "hours": 3.2419, "text": "Documentation! just deploy a new version of documentation site and the go rewrite is complete! from the last update i also added http_request.header[“string”] let you get the header value http_request.query[“string”] let you get the parameters from request query http_request.method get the request method allow you to support POST and others turbokit module allow you to quickly create turbo-frame after this i will be working on form support so you can really build a web app with it"}, {"post_id": 71241, "ts": "2026-09-20T14:49:47Z", "hours": 1.5731, "text": "Merge!! no more experimental-go branch the go rewrite has been merge to the master branch along with the new releases 0.4.0 with support for windows too!. the documentation is currently wip so no doc yet sadd T_T but that the next thing am working on"}, {"post_id": 70774, "ts": "2026-09-19T18:57:20Z", "hours": 1.3961, "text": "Core Function is here after the go rewrite i have now implement 3 core function back but with some changes from zig version so when the go merge it will be a breaking changes http_set_status(status: int) let you set http response code such as 404 500 403 http_content_type(type: string) let you set content type header for usecase like json api http_header_add(key: string,value: string) let you add to the headers i also implement require for loading module and bring back hol now as htmlkit so yea looking forward to merge the go branch into main in a few days but it will 100% be a breaking changes not that who cared anyways except me cuz am the only one using it and now i have to fix my code"}, {"post_id": 68687, "ts": "2026-09-15T15:23:34Z", "hours": 5.3967, "text": "Sadly, There is such thing as a wrong decision when i first set out to make zolt i figure it will be a good place to learn zig i mean it such a small project just a simple http server that execute lua. but then i started using it myself and kept needing more feature but sadly even tho this project started as a way to learn zig. i just didn’t really click with it thus when implementing feature i kept having to relies a lot on codex. So what? so i started a new branch call experimental-go that contain a go rewrite of zoltd plan to be as much backward compatible as possible but not fully as zig zoltd use luau while go zoltd use gopher lua but otherwise i will try and implement all function in zig Naming even tho the project is being rewritten in go. the name will still remain zolt cuz golt sound worse What zolt go version like right now i just implement a lua runtime based on gopher-lua and implement 2 function echo() and print()"}, {"post_id": 64828, "ts": "2026-09-09T14:43:40Z", "hours": 1.845, "text": "HOL (Html On Lua) so from the last ship someone suggest that there should be a tsx like syntax that allow you to write html easier and i agree with that writing the whole layout in echo is a pain so i make hol a pretty simple html builder that ship with zolt so you can just import it anywhere without having to download it and am looking forward to add more feature such as native support for each element instead of H(“h1”) you can just do h1(“Header”) something like that"}, {"post_id": 60425, "ts": "2026-09-02T18:48:14Z", "hours": 1.1506, "text": "Query ! i added new api to the lua vm call request.query it accept 1 parameters field: string and return a string so if your url is host/?field1=value running request.query(“field1”) will return “value”"}, {"post_id": 56766, "ts": "2026-08-28T17:34:39Z", "hours": 0.9775, "text": "Quick Start i have added new entry to documentation such as installation using the new install script and your first zolt web guide along with lua api reference. for the zolt i have move status() and header() api into response.status() and response.header() to align more with request.path() and change webroot from current working dir to config parent dir."}, {"post_id": 55590, "ts": "2026-08-27T15:20:23Z", "hours": 2.4436, "text": "Documentation!! so i been working on a documentation for zolt with guess what zolt well the doc right now is pretty barebone with just intro and install for now but it is made with zolt,html,css,js i also use hotwire turbo and stimulus, and it also use this cute font by creators of grug. ( https://handdrawn.software/grug/ ) you can access the doc page here https://zolt-doc.perr.dev"}, {"post_id": 55153, "ts": "2026-08-26T17:01:52Z", "hours": 3.0167, "text": "Devlog 2 so from the last time i added new api such as require allow you to load other luau file and use them as a module header add header to the response status set http status code for the response with require you can now create function that help you build, for example i created a render module that help me to render html easier without having to deal with writing html tags manually apart from new api there has been a lot of changes behind the scene such as concurrency and performance improvements for the next devlog i will be working on adding api support for query params , form data , json body , and cookies so that you can build more complex web app with zolt! not only that am working on a documentation site that will also serve as an example on how to build web app using zolt"}, {"post_id": 54679, "ts": "2026-08-25T18:50:55Z", "hours": 2.7939, "text": "Zolt so this is php but with lua instead. well i wanted to learn zig and lately i been working on php project, and i just really love how stuff seem so simple but i kinda hate php syntax and the server around it. so yea here zolt it a zig web server that read the lua file you are requesting via query path then use luau to run it and give you the response. right now it just a plain text response but more coming!"}]...
|
Title: Zolt by @perr | Stardance
Devlogs:
Zolt so Title: Zolt by @perr | Stardance
Devlogs:
Zolt so this is php but with lua instead. well i wanted to learn zig and lately i been working on php project, and i just really love how stuff seem so simple but i kinda hate php syntax and the server around it. so yea here zolt it a zig web server that read the lua file you are requesting via query path then use luau to run it and give you the response. right now it just a plain text response but more coming!
Devlog 2 so from the last time i added new api such as require allow you to load other luau file and use them as a module header add header to the response status set http status code for the response with require you can now create function that help you build, for example i created a render module that help me to render html easier without having to deal with writing html tags manually apart from new api there has been a lot of changes behind the scene such as concurrency and performance improvements for the next devlog i will be working on adding api support for query params , form data , json body , and cookies so that you can build more complex web app with zolt! not only that am working on a documentation site that will also serve as an example on how to build web app using zolt
Documentation!! so i been working on a documentation for zolt with guess what zolt well the doc right now is pretty barebone with just intro and install for now but it is made with zolt,html,css,js i also use hotwire turbo and stimulus, and it also use this cute font by creators of grug. ( https://handdrawn.software/grug/ ) you can access the doc page here https://zolt-doc.perr.dev
Quick Start i have added new entry to documentation such as installation using the new install script and your first zolt web guide along with lua api reference. for the zolt i have move status() and header() api into response.status() and response.header() to align more with request.path() and change webroot from current working dir to config parent dir.
Query ! i added new api to the lua vm call request.query it accept 1 parameters field: string and return a string so if your url is host/?field1=value running request.query(“field1”) will return “value”
HOL (Html On Lua) so from the last ship someone suggest that there should be a tsx like syntax that allow you to write html easier and i agree with that writing the whole layout in echo is a pain so i make hol a pretty simple html builder that ship with zolt so you can just import it anywhere without having to download it and am looking forward to add more feature such as native support for each element instead of H(“h1”) you can just do h1(“Header”) something like that
Sadly, There is such thing as a wrong decision when i first set out to make zolt i figure it will be a good place to learn zig i mean it such a small project just a simple http server that execute lua. but then i started using it myself and kept needing more feature but sadly even tho this project started as a way to learn zig. i just didn’t really click with it thus when implementing feature i kept having to relies a lot on codex. So what? so i started a new branch call experimental-go that contain a go rewrite of zoltd plan to be as much backward compatible as possible but not fully as zig zoltd use luau while go zoltd use gopher lua but otherwise i will try and implement all function in zig Naming even tho the project is being rewritten in go. the name will still remain zolt cuz golt sound worse What zolt go version like right now i just implement a lua runtime based on gopher-lua and implement 2 function echo() and print()
Core Function is here after the go rewrite i have now implement 3 core function back but with some changes from zig version so when the go merge it will be a breaking changes http_set_status(status: int) let you set http response code such as 404 500 403 http_content_type(type: string) let you set content type header for usecase like json api http_header_add(key: string,value: string) let you add to the headers i also implement require for loading module and bring back hol now as htmlkit so yea looking forward to merge the go branch into main in a few days but it will 100% be a breaking changes not that who cared anyways except me cuz am the only one using it and now i have to fix my code
Merge!! no more experimental-go branch the go rewrite has been merge to the master branch along with the new releases 0.4.0 with support for windows too!. the documentation is currently wip so no doc yet sadd T_T but that the next thing am working on
Documentation! just deploy a new version of documentation site and the go rewrite is complete! from the last update i also added http_request.header[“string”] let you get the header value http_request.query[“string”] let you get the parameters from request query http_request.method get the request method allow you to support POST and others turbokit module allow you to quickly create turbo-frame after this i will be working on form support so you can really build a web app with it
Template I guess so before all zolt app are written using .lua file and write to the response using echo which led to kind of bad dx so after the last ship there were some review on some kind of tsx like language so i been working on that and here zolt template build on top of go html/template with a lua block it will become a default way of writing app using zolt while .lua will be use for shared module and library
Ships:
a tiny zig web server that speaks luau. when user request the server run the lua code and return them. kinda like php but with lua....
|
1794044978.253672
|
1794131378.253672
|
|
59230
|
Zoe Flapper by @myreester | Stardance
|
myreester
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zoe Flapper by @myreester | Stardance
|
1793540883.1498504
|
1794145683.1498504
|
|
72036
|
Zivora Ai by @Abdulrafay | Stardance
|
Abdulrafay
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zivora Ai by @Abdulrafay | Stardance
|
1793357251.1410995
|
1793962051.1410995
|
|
47033
|
Zite by @ctrl_z_assem | Stardance
|
ctrl_z_assem
|
1
|
9.68
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T15:31:36Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "honstley it was making the structure and the side list didnt use ai i read A LOT of docs and i struggled but i mean i git a lot better and this is not the end!!", "repo": "https://github.com/assembakr00/Zite", "demo": "https://assembakr00.github.io/Zite"}]...
|
[{"post_id": 82993, "ts": "202 [{"post_id": 82993, "ts": "2026-10-26T14:02:37Z", "hours": 0.6831, "text": "Hey! I just drew some cool icons for my site, and I intend to add more. I kinda got into trouble because I was adding some CSS for the new icons, and, well, let’s say I not only crashed it but also messed up the variables. This devlog was entirely just debugging and begging the code to function. Also, the hamburger for the side menu is only one patty because of two reasons: I don’t want to get sued by McDonald’s, and also, I don’t have money to pay for two patties. And that’s all, bye :)!!!"}, {"post_id": 81510, "ts": "2026-10-21T15:16:41Z", "hours": 5.9008, "text": "hey so i FINALLY GOT VERFIED!!!! and i am sorry i didnt dev log bec i thought am not getting verfied now that i am here what i made i made an actual side menu made lots of cool themes and leanred damn a lot like i didnt chnage a lot like olny add info and sections since i made a great remodel 2 weeks ago i now know pixl art and i use it a lot for other sites so u can expect to use it here but for now i will shipppp itttttttttt!!!!! and also am really proud of it plus i changed its name to zite bec i have z in my tag name so site + z = zite!! also as i grow i will grow it too bye!!"}, {"post_id": 46908, "ts": "2026-08-14T13:31:20Z", "hours": 2.9361, "text": "Hey i finshed the sturcture and pretty much the basics i added html ofc i wanted to make lil comments so i added a small.text class in css and i made anthor class for like the footer part toke a while to figure it out and i wanted to make it fixed but thats overkill so i made it static and just deleted the part which made it fixed althogther which also made me make the footer p which was to make the words on both sides and not in one place and added the body for the background color ofc and in js i made a thing i like that i made it so the yr in the footer updates auto and am planning to learn more of js so i make it dynamic and look cool its not my first time writing frontend so it wasnt hard but its still cool and i know my skills are barley beggnier"}]...
|
Title: Zite by @ctrl_z_assem | Stardance
Devlogs: Title: Zite by @ctrl_z_assem | Stardance
Devlogs:
Hey i finshed the sturcture and pretty much the basics i added html ofc i wanted to make lil comments so i added a small.text class in css and i made anthor class for like the footer part toke a while to figure it out and i wanted to make it fixed but thats overkill so i made it static and just deleted the part which made it fixed althogther which also made me make the footer p which was to make the words on both sides and not in one place and added the body for the background color ofc and in js i made a thing i like that i made it so the yr in the footer updates auto and am planning to learn more of js so i make it dynamic and look cool its not my first time writing frontend so it wasnt hard but its still cool and i know my skills are barley beggnier
hey so i FINALLY GOT VERFIED!!!! and i am sorry i didnt dev log bec i thought am not getting verfied now that i am here what i made i made an actual side menu made lots of cool themes and leanred damn a lot like i didnt chnage a lot like olny add info and sections since i made a great remodel 2 weeks ago i now know pixl art and i use it a lot for other sites so u can expect to use it here but for now i will shipppp itttttttttt!!!!! and also am really proud of it plus i changed its name to zite bec i have z in my tag name so site + z = zite!! also as i grow i will grow it too bye!!
Hey! I just drew some cool icons for my site, and I intend to add more. I kinda got into trouble because I was adding some CSS for the new icons, and, well, let’s say I not only crashed it but also messed up the variables. This devlog was entirely just debugging and begging the code to function. Also, the hamburger for the side menu is only one patty because of two reasons: I don’t want to get sued by McDonald’s, and also, I don’t have money to pay for two patties. And that’s all, bye :)!!!
Ships:
honstley it was making the structure and the side list didnt use ai i read A LOT of docs and i struggled but i mean i git a lot better and this is not the end!!...
|
1794034208.003123
|
1794120608.003123
|
|
63318
|
Ziro bot by @Zoezzz | Stardance
|
Zoezzz
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Ziro bot by @Zoezzz | Stardance
|
1793660144.4098248
|
1794264944.4098248
|
|
63544
|
Ziphus by @Qlz | Stardance
|
Qlz
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T20:21:09Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Ziphus is a lightweight browser based encoding and decoding tool for Morse Code, Binary, and Caesar Cipher which supports both directions and customizable cipher shifts a value of your choice. The most challenging part was making each system translate correctly while handling things like capitalization, reverse decoding, and different formats. I’m most proud of turning a simple translator idea into a complete, polished tool with everything processed locally. For testing, try all three protocols, switch between Encode and Decode, test different Caesar shift values, and use the Swap, Copy, and Clear buttons.", "repo": "https://github.com/aqvoz/Ziphus", "demo": "https://aqvoz.github.io/Ziphus/"}]...
|
[{"post_id": 70815, "ts": "202 [{"post_id": 70815, "ts": "2026-09-19T20:15:17Z", "hours": 0.3186, "text": "I spent some time polishing by testing the different translation systems and cleaning up the interface so everything stayed simple and consistent. The processing is also done locally in the browser, so the project doesn’t need a server to translate the text.This become a great tool and i feel like its ready for publishing."}, {"post_id": 70651, "ts": "2026-09-19T14:57:05Z", "hours": 1.1161, "text": "I realized that only being able to encode text made the tool feel incomplete.So this update was focused on building the reverse translation system.Ziphus can now take the different formats it creates and translate them back into readable text.I updated caesar cipher,now you can now customize the number of shifts you want for your cipher. I also added a Direction system so Ziphus can switch between Encode and Decode instead of needing separate tools for each.There are still a few things I want to polish before I call it finished."}, {"post_id": 70480, "ts": "2026-09-19T08:22:46Z", "hours": 0.5408, "text": "The project is finally starting to feel like an actual tool rather than just a UI experiment.One of the things I had to spend more time was case handling. In the cyber shift system, uppercase and lowercase characters need to stay different like A shifts to D, while a shifts to d. It sounds simple, but making sure the transformation preserves the original case is important if the translated text is going to remain consistent.I also had to handle the differences between the three encoding systems: Morse works with symbols like dots and dashes, while Binary converts characters into 8-bit numerical representations. The Cyber-Shift system works differently again by shifting letters through the alphabet while leaving things like spaces and punctuation intact.The current version can translate text into Morse, Binary, and Cyber-Shift, with the processing happening locally in the browser.But I don’t think the project is completely finished yet cuz Ziphus is mainly useful for encoding text. I want to take that one step further and add reverse translation.That would mean someone could paste Morse, Binary, or a shifted message into Ziphus and have it translated back into normal English.I think that’s an important part of making this is to make it useful"}, {"post_id": 70245, "ts": "2026-09-18T19:46:23Z", "hours": 0.6103, "text": "Started building my next project ZIPHUS, a local signal translator and encryption engine for decoding texts. Created the main terminal layout using HTML and styled it with a minimal styling with green/gray using CSS. Added input/output text areas, custom character counters like the , and the protocol selectors for Morse code, 8-bit binary,i still got to complete the caesar shift cipher (+3) and etc."}]...
|
Title: Ziphus by @Qlz | Stardance
Devlogs:
Starte Title: Ziphus by @Qlz | Stardance
Devlogs:
Started building my next project ZIPHUS, a local signal translator and encryption engine for decoding texts. Created the main terminal layout using HTML and styled it with a minimal styling with green/gray using CSS. Added input/output text areas, custom character counters like the , and the protocol selectors for Morse code, 8-bit binary,i still got to complete the caesar shift cipher (+3) and etc.
The project is finally starting to feel like an actual tool rather than just a UI experiment.One of the things I had to spend more time was case handling. In the cyber shift system, uppercase and lowercase characters need to stay different like A shifts to D, while a shifts to d. It sounds simple, but making sure the transformation preserves the original case is important if the translated text is going to remain consistent.I also had to handle the differences between the three encoding systems: Morse works with symbols like dots and dashes, while Binary converts characters into 8-bit numerical representations. The Cyber-Shift system works differently again by shifting letters through the alphabet while leaving things like spaces and punctuation intact.The current version can translate text into Morse, Binary, and Cyber-Shift, with the processing happening locally in the browser.But I don’t think the project is completely finished yet cuz Ziphus is mainly useful for encoding text. I want to take that one step further and add reverse translation.That would mean someone could paste Morse, Binary, or a shifted message into Ziphus and have it translated back into normal English.I think that’s an important part of making this is to make it useful
I realized that only being able to encode text made the tool feel incomplete.So this update was focused on building the reverse translation system.Ziphus can now take the different formats it creates and translate them back into readable text.I updated caesar cipher,now you can now customize the number of shifts you want for your cipher. I also added a Direction system so Ziphus can switch between Encode and Decode instead of needing separate tools for each.There are still a few things I want to polish before I call it finished.
I spent some time polishing by testing the different translation systems and cleaning up the interface so everything stayed simple and consistent. The processing is also done locally in the browser, so the project doesn’t need a server to translate the text.This become a great tool and i feel like its ready for publishing.
Ships:
Ziphus is a lightweight browser based encoding and decoding tool for Morse Code, Binary, and Caesar Cipher which supports both directions and customizable cipher shifts a value of your choice. The most challenging part was making each system translate correctly while handling things like capitalization, reverse decoding, and different formats. I’m most proud of turning a simple translator idea into a complete, polished tool with everything processed locally. For testing, try all three protocols, switch between Encode and Decode, test different Caesar shift values, and use the Swap, Copy, and Clear buttons....
|
1793832725.7999196
|
1793919125.7999196
|
|
31849
|
ZipLLM by @DakshDahore | Stardance
|
DakshDahore
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: ZipLLM by @DakshDahore | Stardance
|
1793803991.8532708
|
1794408791.8532708
|
|
21713
|
Zip Museum by @Stijn | Stardance
|
Stijn
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zip Museum by @Stijn | Stardance
|
1793379115.6150475
|
1793983915.6150475
|
|
38011
|
Zinn by @robkoo | Stardance
|
robkoo
|
0
|
40.15
|
0
|
[]
|
[{"post_id": 39505, "ts": "202 [{"post_id": 39505, "ts": "2026-08-02T14:38:52Z", "hours": 2.9822, "text": "Devlog #11: Switching to Meson ( Commits: c65e483c45 , c1bdb7eb50 ) 4 changed files with 305 additions and 233 deletions Switching to Meson from a Makefile was quite an easy decision. Considering I want a cross-platform build system that is fast , Meson+Ninja stood out as the best possible candidate. On top of that, Meson easily supports cross-compilation, which fits my use case even more! Switch to Meson (Commit c65e483c45 ) The first commit that this devlog details contains the initial implementation of meson.build , and of a Makefile shim . meson.build I decided to write meson.build as idiomatically as possible. I followed the mesonbuild.com documentation for this purpose. Because of my project’s reliance on ISO C23, I had to make sure that Meson supports setting c23 as an option. That means ensuring Meson is above or equal to v1.4.0. The compilation flags and linking flags stay the exact same as in my previous Makefile, and on top of that, Meson checks whether a flag is supported and prints it right out while compiling! Makefile shim The only drawback I encountered while toying with Meson is that the commands can get quite lengthy. For example, to compile and run my project from nothing via meson looks something like this: meson setup build-debug --buildtype=debug -Db_ndebug=if-release && meson compile -C build-debug && ./build-debug/zinn While via my previous Makefile it looked like this: make debug && make run Of course, this has a lot to do with the fact that Meson saves a bunch of metadata, but nevertheless the flow is slower when trying to remember all the meson options. That’s why I created a Makefile shim. The term comes from Embedded Artistry , and it refers to a Makefile that acts as a front-end for Meson (in this case). I wrapped all the meson commands in neat Makefile targets, so I can just run make debug && make run all the same while still getting the valuable Meson features. Windows & cross-compilation support (Commit c1bdb7eb50 ) With Meson now working in my codebase, it was time for cross-platform support. Adding it was really easy. meson.build changes The only change in meson.build besides the Windows linker-flag section is that is_windows and is_mingw detection. cross folder & .ini file Cross-compilation is simply compiling code for a different computer on your own computer. In my case, I wanted to compile for Windows while staying on Linux. In my old Makefile this would be a huge hassle, but Meson only needs this little file to know the target and which cross-compiler binaries to use: [binaries] c = 'x86_64-w64-mingw32-gcc' ar = 'x86_64-w64-mingw32-ar' strip = 'x86_64-w64-mingw32-strip' windres = 'x86_64-w64-mingw32-windres' exe_wrapper = ['wine'] ... The last row is where the magic happens: exe_wrapper tells Meson to run any produced Windows binary through Wine, so I can test the cross-compiled output directly from Linux. What’s next? If you checked the attachment out, you can see a bunch of compilation errors; those are there on purpose. I have yet to update my actual code to support Windows."}, {"post_id": 39380, "ts": "2026-08-02T10:11:46Z", "hours": 3.4561, "text": "Devlog #10: Unit tests for CLI argument parser ( Commit: 90120d4b79 ) 5 changed files with 1448 additions and 11 deletions The last core module got its tests. 73 new tests for the CLI argument parser, which makes 341 tests across 7 suites. The parser has more unit tests than any other function in any suite. Schema(s) for the tests To test the parser you need something to parse, so I built a test schema that covers every option type. The main test schema has four options, each of a different type. Additionally, I made a few deliberately broken schemas for the failure paths: duplicate long names, duplicate short names, an empty schema, one with 33 options (one over the max), and one whose offset_in_config points straight out of the struct. Small fixes uncovered along the way Writing the tests exposed two issues worth mentioning. ZINN_EXPECT_DOUBLE_EQ dumped its constexpr double EPSILON into the surrounding scope. As soon as you’d use it twice in one scope, you’d run into redefinition errors. I simply wrapped the macro’s contents in a do {} while(0) loop to prevent this from happening. The default config values were magic numbers. Now they’re named constants ( ZINN_CLI_DEFAULT_WIDTH , …) living in the header, and the tests assert against those instead of hardcoded values. What the tests cover The zinn_cli_parse tests take up most at 65. The remaining 8 are split between 4 other functions, each with one nullptr path and happy-path. Schema validation and null checks (8 tests) Every error path of zinn_cli_parse : null schema, null argv, null config, plus each of the broken schemas from the harness, all bail with the correct error code. The help and version prescan (10 tests) This section is the interesting one, because the pre-scan for --help / --version is intentionally naive: it scans for the flag before any real parsing. So zinn --str --help returns OK with help set, even though --str is missing its required value. The tests pin down ordering: --version --help gives version, --help --version gives help, since the loop exits on the first hit. zinn -- --help will toggle the help boolean and skip the rest of the parse. The last case is a bug. In “./prog – –help” the pre-scan should identify the -- delimiter and exit the pre-scan loop without toggling the help boolean, thus letting it be parsed as a positional argument. Option forms (6 tests) Everything the parser accepts: --width 80 , --width=80 , -w 80 , -w80 , and mixed forms in a single invocation. Bundled values handle signs too, so -n-42 parses to -42. -shello (short for –str hello) also works correctly:) Positional arguments (10 tests) Positionals fill input_path then output_path ; a third one errors out. After -- the parser treats everything as a positional argument. Fun fact, if you pass -- twice, both get consumed as the “positional mode switcher”. Value and error handling (16 tests) An int option given abc , overflow past INT64_MAX, 1e309 against a double, values that themselves look like flags ( --num --flg ), empty values ( --str= , --num= ), and --str=a=b , where everything after the first equals sign becomes the value. Unknown options (3 tests) Both flag variants are asserted to reject unknown identifiers. Repeats and required options (12 tests) Last occurrence wins. Required option checking happens after the full parse. What’s next? With the final core module’s unit tests now done, I plan to switch build systems so the engine can work on both Linux and Windows flawlessly, which is a prerequisite for the beautiful media-to-ASCII pipeline."}, {"post_id": 37845, "ts": "2026-07-30T20:15:12Z", "hours": 4.7794, "text": "Devlog #9: CLI Argument Parser ( Commit: 870e5f9279 ) 7 changed files with 782 additions and 32 deletions The CLI argument parser is Zinn’s final core module. It’s built entirely from scratch, without any external dependencies. Other modules (string views, error handling, logger) were designed to be used seamlessly, and this is the first proof. The architecture The parser is built around declarative option schemas: const ZinnCliOption ZINN_CLI_OPTIONS [] = { {. long_name = ZINN_STRING_VIEW_INIT ( \"width\" ), . short_name = 'w' , . type = ZINN_CLI_TYPE_INT64 , . offset_in_config = offsetof ( ZinnConfig , width ), ...}, }; Each option knows its type, whether it’s required, and exactly which byte offset inside ZinnConfig to write to. The parser walks argv, matches tokens against schema entries, and writes parsed values directly into the config struct via offsetof + pointer arithmetic. This prevents huge bug-prone switch statements you’d have to write (or copy-paste) if using getopt , for example. The schema validates itself at parse time: duplicate short/long names, offsets exceeding the config struct, zero options, and too many options all get caught before any argv is touched. For the caller, using this module is rather simple. Declare the schema, call zinn_cli_parse( /*...*/ ) , handle failure, and the config is provided nicely in a structure. Following the code style The original parsing function I wrote was a huge, monolithic function with over 200 lines. I extracted what I could: _zinn_validate_schema : validates the schema itself _zinn_pre_scan_help_version : early return for --help / --version before parsing errors can block them _zinn_write_option_value : type-dispatching write via offsetof /switch The main loop is still ~150 lines. The long-option and short-option matching share too many moving parts: the argv index i (which gets bumped for next-arg values), matched_index (required-flag tracking), the positional_only flag, and the token itself. Extracting them would mean threading half a dozen mutable out-parameters through a helper that’s only called once. Technically , the parsing function breaks the code style, but it would’ve been too much trouble than its worth to try and extract anything more. (Also, I wrote the rules, so I can do whatever I want) Safety I own the entire error path. Every parse failure captures file, function, line, and a description in the diagnostic stack. Run --width=abc and you get a trace pointing to the exact switch case that failed, plus a Use ‘–help’ hint (see 2nd attachment) . You don’t get that from getopt returning '?' . What’s next? After adding a new module, unit tests follow, as usual."}, {"post_id": 37119, "ts": "2026-07-29T16:34:17Z", "hours": 2.9103, "text": "Devlog #8: Unit tests for String View ( Commit: 63f7ec3f88 ) 5 changed files with 1402 additions and 2 deletions After building the string view module, I did what any sane person would do: wrote 110 tests for it. The new “String View” suite brings the total test count to 260 across 6 suites, and the assertion count to over 1000!!! How the heck did you write 1402 new lines of “code” in 140 minutes? If we exclude comments and blank lines, that’s still a lot of lines. The answer is simple: the editor I use is Neovim, which allows me to use find & replace (see first attachment), quickly copy, delete, manoeuvre lines with simple keybinds, and much more! In the attachment you can see me writing the general structure of roughly 20 tests in one single command, thus saving me 10s of minutes. I simply then replace the test-specific data and assertions and I’m all set! New test macro: ZINN_EXPECT_DOUBLE_EQ Floating point equality is a lie. ZINN_EXPECT_EQ converts to uintptr_t under the hood. It being an integer type, any floating point number you convert to uintptr_t gets its floating part cut off. So I added ZINN_EXPECT_DOUBLE_EQ for checking equality of floating point numbers. Test helpers Two local macros keep the test file from being even longer than it already is: EXPECT_ZINN_STRING_VIEW_NULLPTR(sv) EXPECT_ZINN_STRING_VIEW_VALID(sv, e_data, e_len) Each macro expands to a few lines of code, which might seem pointless at first, but for 110 tests that use the macro, it adds up. What got tested Every public function in the string view module was tested thoroughly: null pointers, empty inputs, boundary values, and at least one “happy” path. Constructors and macros (8 tests) Both constructor macros are verified. from_parts rejects null data and zero length. from_cstring rejects null and empty C strings. Slicing and trimming (23 tests) subview is tested with the offset past the end, offset equal to length, zero count, clamping when count overshoots, exact fits, and partial slices. Each trim variant has tests for null input, no whitespace, some whitespace, all whitespace, and mixed content with whitespace only on one side. Comparison and matching (45 tests) equals checks length mismatch, null data on either side, the same-pointer fast path, exact match, and content mismatch. equals_case_insensitive goes further: same categories plus non-ASCII bytes (the lookup table should pass them through unchanged) and a mismatch on the last character to make sure the loop doesn’t stop early. starts_with and ends_with both test null data, null prefix/suffix, empty prefix/suffix (should return true), empty source (should return false), prefix/suffix longer than the source, match, and no match. find_char tests null data, null out pointer, empty view, char not found, and found at positions first, middle, and last. split_first has the most edge cases: null output pointers independently, null string view, empty string view, delimiter not found, delimiter at start, middle, end, and a single character that is the delimiter. Number parsing (35 tests) to_int64 and to_double are the heaviest. Both test null out, null data, whitespace only, trimming working, buffer overflow, overflow/underflow via ERANGE, no digits, and partial parses like \"123abc\" . to_int64 additionally tests positive, negative, zero, INT64_MIN, INT64_MAX, plus sign prefix, and a lone hyphen. to_double additionally tests basic, scientific notation, negative, plus prefix, integer-only input, nan, inf, -inf, decimal-only like \".5\" , and a bare dot. What’s next? Yet another core module. Regardless of what it is, I’m still hours away from coding some fun ASCII conversions.."}, {"post_id": 36972, "ts": "2026-07-29T12:24:07Z", "hours": 3.0908, "text": "Devlog #7: String View ( Commit: 656a879786 ) 3 changed files with 624 additions and 4 deletions The next core module I built was the string view. The primary goal of this module was to build it fast, avoid heap allocation, ambiguity, and make it “bulletproof”. My reasoning behind making this module is simple: it will be heavily used in the upcoming CLI argument parser and the media-to-ascii engine. The struct and constructors ZinnStringView is dead simple, just a const char* data and a size_t length . Two constructors build views from either explicit parts or null-terminated C strings. Both return ZINN_STRING_VIEW_NULLPTR if you pass them null or empty data. The literal macro The coolest part of this module is ZINN_STRING_VIEW_LITERAL() . It wraps a string literal at compile time using _Generic to detect whether you passed an actual literal or a pointer variable. ZinnStringView sv1 = ZINN_STRING_VIEW_LITERAL ( \"hello\" ); // works ZinnStringView sv2 = ZINN_STRING_VIEW_LITERAL ( pointer ); // compile error (see attachment) If you pass a variable, _Generic sees char* or const char* and the static_assert fires with a message telling you to use zinn_string_view_from_cstring() instead. Also, while making the attachment I realized what I wrote is actually not correct for C23, as you cannot have static assertions in expressions. This is only a feature in the upcoming C2Y (C29) standard. Implemented functions Generally, I preferred using standard library functions as they are battle-tested, and more often than not use SIMD instructions for much faster execution than whatever I could come up with. Slicing and trimming zinn_string_view_subview gives you a sub-slice with bounds clamping. If offset is past the end you get ZINN_STRING_VIEW_NULLPTR . If offset + count overshoots, it clamps down. The three trim functions share one implementation behind an enum that controls whether to trim left, right, or both. Comparison and matching I built a 256-byte lookup table that maps A-Z to a-z for case-insensitive comparison. It’s locale-independent, so no tolower() surprises on Turkish systems. find_char delegates to memchr , which your libc likely implements with SIMD (16-32 bytes per cycle). starts_with and ends_with are just memcmp with an offset. split_first finds the delimiter via memchr and chops the view in two. Number parsing Parsing from a string view is tedious because standard library functions expect null-terminated strings. The solution is to copy into a small stack buffer, null-terminate it, and call the respective function. The double variant uses strtod_l with a POSIX “C” locale so \"3.14\" is parsed correctly even if the user’s system uses commas as decimal separators. Both trim whitespace first, check for overflow via errno, and reject partial parses like \"123abc\" . What’s next? My favorite activity, unit tests!"}, {"post_id": 36059, "ts": "2026-07-27T22:07:03Z", "hours": 1.8728, "text": "Devlog #6: Unit tests for Error Handling ( Commit: 252eb6d937 ) 5 changed files with 1312 additions and 0 deletions After implementing the error code system, diagnostic stack, and scope guard, I needed to make sure they actually work before I start building on top of them. So, my favorite activity, writing unit tests, was awaiting me with 64 more tests across 3 new suites. New test macro: ZINN_EXPECT_EQ_STR The diagnostic stack tests compare message strings. ZINN_EXPECT_EQ would compare pointer addresses if you passed strings, not contents, so I added a strcmp based variant: ZINN_EXPECT_EQ_STR ( frame -> message , \"42 hi\" ); On failure it prints actual vs expected strings, which makes debugging test failures a lot easier. Error Code (16 tests) The tests verify that each field lands in the correct position and that overflows are safely masked out: “Round-trip” : pack ZINN_DOMAIN_LOGGER | ZINN_SEVERITY_INFO | 0x42 , then extract each field and verify Overflow tests : the masks ( 0xFFFFF , 0xFF , 0xF ) clip overflowed fields back to zero, tested with values one past each bit boundary Max values : 0xFF domain, 0xF severity, 0xFFFFF code all survive the round trip All 6 predefined codes : decoded and checked against expected domain/severity/code down to the exact values Diagnostic Stack (36 tests) Raw push/pop/peek/clear Push : basic field assignment, null file maps to \"unknown\" , null function maps to \"unknown\" , null format maps to \"(none)\" , empty format produces empty string, printf args ( \"%d %s\" , 42 , \"hi\" ) produce \"42 hi\" , truncation at exactly 127 bytes + null terminator at 128 Push overflow : fill all 16 slots, the 17th push returns false , depth stays pinned at 16, the last valid frame is untouched Pop : once from a non-empty stack decrements depth, pop on an empty stack is a no-op, pop 3 of 5 leaves depth at 2, pop all 16 resets to 0 Peek : empty stack returns nullptr , non-empty returns the top frame (LIFO: second push overwrites the peek target), after clear returns nullptr Clear : empty stack stays at 0, stack with 5 frames resets to 0 Convenience macros Each macro has its own test helper and multiple assertions: ZINN_DIAGNOSTICS_PUSH : verifies __FILE__ , __func__ , __LINE__ are injected, with and without format args ZINN_RETURN_IF_ERR : passing ZINN_OK skips the frame and returns OK; passing an error pushes a frame containing \"Propagated error\" and returns the error ZINN_RETURN_IF : condition true: pushes \"Condition failed (true)\" and returns the error; false: no frame, returns OK. ZINN_TRY : wraps a successful call (forwards the value), wraps a failing call (pushes \"TRY macro captured failure\" , returns the error) ZINN_CHECK_ERROR : the only macro that doesn’t return. After pushing a frame, execution continues. Verified with a continued flag, format args, and a static message Integration Two isolation tests: one interleaves push/pop/push and verifies frame independence (frame 0 still holds \"0\" after pops, frame 1 holds \"new\" ). The other pushes two frames with different error codes and verifies LIFO ordering and the peek return value at each step. Scope Guard (12 tests) Scope guards fire implicitly when a scope exits. Tested with global counters for basic fire, multiple guards, early return, null-safety, nested scopes, named guards, disarm, double-disarm, and direct execute() calls with null/disarmed/null-cleanup guards. What’s next? With 160 tests across 5 suites, I can take a short break from writing unit tests. Next up is the CLI argument parser (probably) the final core module before I can get to the fun ASCII stuff."}, {"post_id": 35347, "ts": "2026-07-26T17:53:08Z", "hours": 3.8894, "text": "Devlog #5: Error Handling Overhaul ( Commits: 52515268fe - 91402e3215 ) 18 changed files with 1153 additions and 547 deletions I wasn’t happy with the old error handling. A flat enum doesn’t tell you what went wrong or how bad it is. So I tore it out and replaced it. I’m proud of this module because it uses modern C23 features everywhere you look, is fast, secure, and gives me the important debugging info in case something goes wrong. Thread-safe error and diagnostic module ( 52515268fe ) This commit contains the initial implementation of the module, although with a few bugs I addressed in one of the two later commits. Warning! This commit DOES NOT compile. I haven’t refactored the codebase to use the new error handling implemented in this commit. Bit-packed error codes The new zinn_err_t is a uint32_t with three fields packed into it: [8 bits domain | 4 bits severity | 20 bits code] Domain identifies the module. Severity says how bad it is. Code is the specific error number. Diagnostic stack A thread_local fixed-depth LIFO stack (max 16 frames, 128 message chars each). Every frame records file, function, line, the packed error code, a human-readable message, and a unix timestamp. Pushing a frame manually is tedious, so I wrote macros that inject them for you. Higher-level macros build on this: ZINN_RETURN_IF(condition, error) : if true, push a frame and return the error ZINN_RETURN_IF_ERR(expression) : if the expression fails, push and return ZINN_TRY(expression) : same, but evaluates to the expression’s value on success ZINN_CHECK_ERROR(call, message, ...) : push a frame if error, but keep going zinn_diagnostics_dump_frames() dumps the whole stack to stderr with colored formatting, newest first. Check the attachment to see the stack dump in a terminal. Contains all the info you’d ever need. Scope guard C doesn’t have RAII. But GCC has __attribute__((cleanup)) . The scope guard module wraps it: ZINN_DEFER_CLEANUP ( function , pointer ) This declares a local guard that calls function(pointer) when the scope exits, whether by normal return or early return. You can disarm it with ZINN_SCOPE_GUARD_DISARM(name) if you transfer ownership. The logger now uses this for mutex cleanup. The old code scattered manual pthread_mutex_unlock() calls across every return path. One missed unlock would deadlock the whole process. Refactoring the codebase ( de25c634a0 , 91402e3215 ) The codebase was refactored to use the new error handling and diagnostic functions, macros and types. A few examples: Logger : returns zinn_err_t everywhere; precondition checks use ZINN_RETURN_IF ; mutex handling uses scope guards Arena : zinn_arena_create changed from returning a pointer to returning an error code with an output parameter. Every error site now pushes a diagnostic frame with details Tests : adapted to the new API. Fixed several real bugs along the way: missing fclose() calls that leaked file descriptors and a renamed internal function amongst a few others The test count also dropped from 50 to 49 Logger tests because I removed a redundant test. What’s next? With the error handler now functional, it will be finally time for the (probably) final core mod-… oh wait. Nevermind that. Next I have to write a ton of unit tests for this new module. Lucky me!"}, {"post_id": 34700, "ts": "2026-07-25T16:58:02Z", "hours": 7.1439, "text": "Devlog #4: Arena Allocator & Test Framework improvements ( Commits: bd81ab254f - ba67b8cade ) 8 changed files with 1638 additions and 44 deletions This devlog covers another core module, the Arena Allocator , as well as improvements to the test framework. Implementing this took quite some time, due to the fact that I want to make sure the codebase stays secure and fast. Arena Allocator ( bd81ab254f ) The next core module I implemented is a linear arena allocator , the polar opposite of a general-purpose malloc. The whole purpose is simple: no free individual allocations. Just bump a pointer and reset the whole thing when you’re done. It’s also quite fast. Alignment without compromise Every pointer returned by the arena is aligned to max_align_t (typically 16 bytes on x86-64). When the CPU loads an 8-byte value from an aligned address, the memory controller fetches a single 64-byte cache line in one transaction. The bytes land in the CPU’s load buffer in order, and execution continues the next cycle. When the same load is unaligned (say, address 0x1003 instead of 0x1000 ), the 8 bytes straddle two cache lines: 0x1000 and 0x1040 . The memory controller now issues two separate cache line fills , the load buffer stitches the result together from the two halves, and the pipeline stalls waiting for the second request to arrive. On modern x86-64 this penalty is roughly 2-3x the latency of an aligned load. For an allocator focused on speed, every allocation must be aligned. The arena guarantees this in two branchless instructions: uintptr_t raw = ( uintptr_t ) arena -> memory + arena -> offset ; uintptr_t aligned = ( raw + 15 ) & ~ 15 ; Snapshots The snapshot API ( zinn_arena_snapshot_begin / zinn_arena_snapshot_end ) lets you checkpoint the arena offset and roll back to it later. In debug builds the rolled-back region is poisoned with 0xAA so dangling reads are immediately obvious. Unit tests for the Arena ( 966c4c289e ) 47 thorough tests covering just about everything about the arena. Test Framework improvements High-precision execution timing ( efd7239d47 ) Every test function’s runtime is now measured. The runtime is printed next to the PASS/FAIL label with microsecond precision. Check out the second attachment. This commit also fixes a subtle C23 compatibility issue: nullptr has type nullptr_t under C23, which can’t be directly cast to uintptr_t . I added a _Generic dispatching macro ( ZINN_TO_PTR ) that maps nullptr_t to (void*)0 while leaving everything else untouched. The failure messages also got an upgrade: actual and expected values are now printed numerically instead of a bare expression string. Test run summary ( ba67b8cade ) The original test runner supported one suite at a time. You’d call zinn_test_summary() and get a single block. Now the architecture is multi-suite. The final output is a detailed breakdown: Per-suite: runtime, tests run/passed/failed, assertions made Global: success rate percentage, throughput (tests/second), average latency per test, slowest suite with its share of total time Check out the first attachment if you are curious how it looks. What’s next? With memory management settled and testing infrastructure solid, the next milestone is an error handler ."}, {"post_id": 33203, "ts": "2026-07-22T22:06:46Z", "hours": 4.5669, "text": "Devlog #3: Test Suite ( Commit: d1e7b17ad9 ) 8 changed files with 1264 additions and 30 deletions The next priority wasn’t to build more features, but to ensure that the ones I have are unbreakable. Thus, I’ve implemented a custom, zero-dependency Unit Testing Framework and a comprehensive suite of 50 tests for the Logger module. Why Build a Custom Test Suite? Because of my ego in the way, I didn’t want to rely on heavy external libraries like GoogleTest or Check (or any external library, for that matter). The result? Isolated Singleton Management : I added a “Backdoor” ( _zinn_log_reset_internal ) to Logger that allows the test suite to scrub the global state of the Logger between runs. This ensures that every test starts with a clean state, which prevents state-leakage bugs. Assertion Precision : Using C23 macros, I built EXPECT and ASSERT checks that capture the exact file and line number of any failure. Clean Output : The test runner provides colored feedback and a final summary. I also updated the Makefile to add a test target, which compiles all source files EXCLUDING main.c (as I have a custom test_main.c ), test files, and runs the tests. The Logger Unit Tests (50 tests) Instead of being lazy, I decided to write a test for everything imaginable for the Logger. This may seem pointless, even redundant at times, but as I say, better be safe than sorry. 1. Lifecycle Verification Proving that Init/Shutdown/Reset cycles don’t leak memory or leave the mutex in a deadlocked state. I verified that the Logger returns to a “Zero State” after shutdown, allowing it to be safely re-initialized later. 2. Boundary Protection & Buffer Safety This was the most critical part. I wrote a “ruler” test to verify exactly what happens when the 1024-character message buffer is exceeded. By analyzing the memory buffer line-by-line, I proved that the logic correctly truncates and appends ... at the exact 1023rd byte without overflowing the stack. 3. Null-Pointer Safety Every public function was tested with nullptr arguments. Where applicable, of course. 4. Logic & Metadata Verification Using fmemopen() to capture the logger’s output in memory, I verified the exact formatting of timestamps, ANSI colors, and source-location metadata. Ajajaj, yet another POSIX-only function. Surely this won’t backfire… What’s Next? Now that the Test Suite is done, and Logger unit tests are written, it’s finally time to tackle yet another core component, this time it being a custom (minimalist) memory allocator ."}, {"post_id": 33003, "ts": "2026-07-22T15:19:45Z", "hours": 0.4203, "text": "Devlog #2: Doxygen integration ( Commit: 94277b5487 ) 7 changed files with 89 additions and 16 deletions Doxyfile This is a very short devlog, as it was a very short integration. I simply added a Doxyfile , which controls how the documentation will be generated. I set it according to my project, e.g. a C project, the project name, what directories it should traverse etc. Makefile update To make the documentation generation and opening as seamless as possible, I added a docs target to the Makefile , which checks if you have doxygen installed. If not, it throws a simple error message and doesn’t proceed. Once it’s verified that doxygen is available, it generates the documentation and opens it in your default browser via xdg-open . Comments While I was going through the codebase for a final check of the comments, I noticed a few functions didn’t have any Doxygen comments whatsoever (especially the static ones) and a few things were incorrectly documented. I added and fixed comments for clean doxygen documentation. Attachment In the attachment you can see the generated HTML documentation for a few functions located in logger.c . Notice the @note being displayed neatly with a yellow background on the website."}, {"post_id": 32987, "ts": "2026-07-22T14:43:03Z", "hours": 3.4797, "text": "Devlog #1: Logger implementation ( Commit b565bfd1f7 ) 6 changed files with 594 additions and 9 deletions The first core module I implemented is the Logger . I feel like I spent a huge amount of time on this, but it was well worth it, as it’s a marvel. Below you can read about the engineering of the logger. The engineering of the Logger This is a quick overview, for the full context you can check out the source code. Multi-Stage Gating (Compile-Time + Runtime) The logger uses a two-tier filtering system. Compile-Time: Using C23 variadic macros and __VA_OPT__ , the logger identifies the build type. In a release build, TRACE and DEBUG calls are completely stripped from the binary. They don’t just “not print”; they don’t exist in the final machine code. Runtime: Even for levels that survive the preprocessor, the logger checks the internal state before doing any work. This ensures that there is no wasted time on string formatting or timestamping. Thread-Safe Singleton Architecture While zinn doesn’t use multithreading yet, I felt like it’s best to “future-proof” the Logger by guarding everything with pthread . This ensures, that whenever (or if at all) I add multithreading, the stream output will be clean and not a garbled mess of characters. Runtime stream redirection Again, this isn’t used currently, so this is another “future-proofing” measure. The logger can seamlessly start writing into any stream desired, as long as it exists. This will be used in the future, but no spoilers as to what will use it ;) Modern C23 & POSIX Integration Precision Timing: Using C23 timespec_get and localtime_r for nanosecond-precision timestamps with thread-safe formatting. Compiler Safety: The logging function is marked with [[gnu::format(printf, x, y)]] , allowing the compiler to catch type-mismatches in log messages at build-time. Deterministic Memory: Zero malloc . All formatting happens in a fixed 1024-byte stack buffer. This also prevents nasty, difficult-to-catch memory bugs, which could be fatal in a core module such as the logger. Screenshots explanation 1st screenshot This screenshot perfectly demonstrates the preprocessor filtering. Notice the difference between the release and debug runs. In release , the TRACE log is vanished. In debug , the logger is fully verbose. This confirms that the compile-time filtering is working. 2nd screenshot Showcase of multiple severities, as well as the FATAL one. Notice the Return code: 2 at the bottom. This proves that the logger successfully captured the error, flushed the stream, and triggered a clean abort() to prevent further corruption. Ignore the makefile error, I suspect it occurs when I run make run , and the binary exits abnormally (e.g. return code != 0), it thinks it’s an error. 3rd screenshot Compared the the previous screenshot (right above), you can see the TRACE log level appears. This didn’t show in the previous screenshot as the minimum log level was higher than TRACE , thus showing the minimum log level works. 4th screenshot Here you can see how the code looked for the previous two screenshots. In the init function ( zinn_log_init ), you pass the minimum log level as the parameter, so when it was ZINN_LOG_TRACE , it logged all the severities. When it was something higher, it didn’t log TRACE , for example. If you were to take a look at the code on the repository, you might notice that it is a bit different. That is due to this screenshot being a bit old, and I’ve went through like 2 hours of improving the Logger:) Future plans With the first core module done, the only correct next step is to implement another core feature."}, {"post_id": 32395, "ts": "2026-07-21T15:30:56Z", "hours": 1.5544, "text": "Devlog #0: Project setup ( Commits: d377087563 - 7874ad3cc6 ) 10 changed files with 1056 additions and 0 deletions For zinn , I decided that the foundation had to be as robust as the final output. Before writing a single line of code, I spent the first hour or so building a thorough foundation from scratch. C Standard For this project I have decided to use the latest C23 standard. Why? The answer is simple: modern features. nullptr : Replaces the macro NULL . It’s a real type, which prevents type-confusion bugs and makes the code’s intent explicit. constexpr : This allows us to define constants with full type safety. More importantly, its value is known at compile-time , thus the compiler can catch math errors or type mismatches before the code even runs. And many others… Code Style I have outlined the code style that will be followed in this codebase. The whole file can be found here . Directory Structure The directory structure is simple: . ├── bin <-- contains executable binaries ├── build <-- contains intermediate files ├── include <-- contains header files, allows sub-dirs └── src <-- contains source files, allows sub-dirs Makefile I have developed a recursive Makefile that supports multiple build confiruations (Debug, Release, Sanitize, Coverage). It features: Zero-Collision Objects: Isolated build directories prevent flag contamination between build configurations. Static Analysis: The Makefile has targets for clang-tidy , cppcheck and GCC’s -fanalyzer . Dependency Tracking: Using -MMD -MP flags to automatically generate header dependencies. This means the build system is “smart”; it only recompiles what is absolutely necessary. Order-Only Directories: Using advanced Makefile logic (the pipe | ) to handle folder creation. This prevents “ghost recompilation” where the binary is rebuilt just because a folder’s timestamp changed. License The project is licensed under GPLv3, which ensures it stays as FOSS (Free and Open Source Software) forever. Future plans Next, I plan to implement bulletproof core components, such as a logger and CLI argument parser ."}]...
|
Title: Zinn by @robkoo | Stardance
Devlogs:
Devlo Title: Zinn by @robkoo | Stardance
Devlogs:
Devlog #0: Project setup ( Commits: d377087563 - 7874ad3cc6 ) 10 changed files with 1056 additions and 0 deletions For zinn , I decided that the foundation had to be as robust as the final output. Before writing a single line of code, I spent the first hour or so building a thorough foundation from scratch. C Standard For this project I have decided to use the latest C23 standard. Why? The answer is simple: modern features. nullptr : Replaces the macro NULL . It’s a real type, which prevents type-confusion bugs and makes the code’s intent explicit. constexpr : This allows us to define constants with full type safety. More importantly, its value is known at compile-time , thus the compiler can catch math errors or type mismatches before the code even runs. And many others… Code Style I have outlined the code style that will be followed in this codebase. The whole file can be found here . Directory Structure The directory structure is simple: . ├── bin <-- contains executable binaries ├── build <-- contains intermediate files ├── include <-- contains header files, allows sub-dirs └── src <-- contains source files, allows sub-dirs Makefile I have developed a recursive Makefile that supports multiple build confiruations (Debug, Release, Sanitize, Coverage). It features: Zero-Collision Objects: Isolated build directories prevent flag contamination between build configurations. Static Analysis: The Makefile has targets for clang-tidy , cppcheck and GCC’s -fanalyzer . Dependency Tracking: Using -MMD -MP flags to automatically generate header dependencies. This means the build system is “smart”; it only recompiles what is absolutely necessary. Order-Only Directories: Using advanced Makefile logic (the pipe | ) to handle folder creation. This prevents “ghost recompilation” where the binary is rebuilt just because a folder’s timestamp changed. License The project is licensed under GPLv3, which ensures it stays as FOSS (Free and Open Source Software) forever. Future plans Next, I plan to implement bulletproof core components, such as a logger and CLI argument parser .
Devlog #1: Logger implementation ( Commit b565bfd1f7 ) 6 changed files with 594 additions and 9 deletions The first core module I implemented is the Logger . I feel like I spent a huge amount of time on this, but it was well worth it, as it’s a marvel. Below you can read about the engineering of the logger. The engineering of the Logger This is a quick overview, for the full context you can check out the source code. Multi-Stage Gating (Compile-Time + Runtime) The logger uses a two-tier filtering system. Compile-Time: Using C23 variadic macros and __VA_OPT__ , the logger identifies the build type. In a release build, TRACE and DEBUG calls are completely stripped from the binary. They don’t just “not print”; they don’t exist in the final machine code. Runtime: Even for levels that survive the preprocessor, the logger checks the internal state before doing any work. This ensures that there is no wasted time on string formatting or timestamping. Thread-Safe Singleton Architecture While zinn doesn’t use multithreading yet, I felt like it’s best to “future-proof” the Logger by guarding everything with pthread . This ensures, that whenever (or if at all) I add multithreading, the stream output will be clean and not a garbled mess of characters. Runtime stream redirection Again, this isn’t used currently, so this is another “future-proofing” measure. The logger can seamlessly start writing into any stream desired, as long as it exists. This will be used in the future, but no spoilers as to what will use it ;) Modern C23 & POSIX Integration Precision Timing: Using C23 timespec_get and localtime_r for nanosecond-precision timestamps with thread-safe formatting. Compiler Safety: The logging function is marked with [[gnu::format(printf, x, y)]] , allowing the compiler to catch type-mismatches in log messages at build-time. Deterministic Memory: Zero malloc . All formatting happens in a fixed 1024-byte stack buffer. This also prevents nasty, difficult-to-catch memory bugs, which could be fatal in a core module such as the logger. Screenshots explanation 1st screenshot This screenshot perfectly demonstrates the preprocessor filtering. Notice the difference between the release and debug runs. In release , the TRACE log is vanished. In debug , the logger is fully verbose. This confirms that the compile-time filtering is working. 2nd screenshot Showcase of multiple severities, as well as the FATAL one. Notice the Return code: 2 at the bottom. This proves that the logger successfully captured the error, flushed the stream, and triggered a clean abort() to prevent further corruption. Ignore the makefile error, I suspect it occurs when I run make run , and the binary exits abnormally (e.g. return code != 0), it thinks it’s an error. 3rd screenshot Compared the the previous screenshot (right above), you can see the TRACE log level appears. This didn’t show in the previous screenshot as the minimum log level was higher than TRACE , thus showing the minimum log level works. 4th screenshot Here you can see how the code looked for the previous two screenshots. In the init function ( zinn_log_init ), you pass the minimum log level as the parameter, so when it was ZINN_LOG_TRACE , it logged all the severities. When it was something higher, it didn’t log TRACE , for example. If you were to take a look at the code on the repository, you might notice that it is a bit different. That is due to this screenshot being a bit old, and I’ve went through like 2 hours of improving the Logger:) Future plans With the first core module done, the only correct next step is to implement another core feature.
Devlog #2: Doxygen integration ( Commit: 94277b5487 ) 7 changed files with 89 additions and 16 deletions Doxyfile This is a very short devlog, as it was a very short integration. I simply added a Doxyfile , which controls how the documentation will be generated. I set it according to my project, e.g. a C project, the project name, what directories it should traverse etc. Makefile update To make the documentation generation and opening as seamless as possible, I added a docs target to the Makefile , which checks if you have doxygen installed. If not, it throws a simple error message and doesn’t proceed. Once it’s verified that doxygen is available, it generates the documentation and opens it in your default browser via xdg-open . Comments While I was going through the codebase for a final check of the comments, I noticed a few functions didn’t have any Doxygen comments whatsoever (especially the static ones) and a few things were incorrectly documented. I added and fixed comments for clean doxygen documentation. Attachment In the attachment you can see the generated HTML documentation for a few functions located in logger.c . Notice the @note being displayed neatly with a yellow background on the website.
Devlog #3: Test Suite ( Commit: d1e7b17ad9 ) 8 changed files with 1264 additions and 30 deletions The next priority wasn’t to build more features, but to ensure that the ones I have are unbreakable. Thus, I’ve implemented a custom, zero-dependency Unit Testing Framework and a comprehensive suite of 50 tests for the Logger module. Why Build a Custom Test Suite? Because of my ego in the way, I didn’t want to rely on heavy external libraries like GoogleTest or Check (or any external library, for that matter). The result? Isolated Singleton Management : I added a “Backdoor” ( _zinn_log_reset_internal ) to Logger that allows the test suite to scrub the global state of the Logger between runs. This ensures that every test starts with a clean state, which prevents state-leakage bugs. Assertion Precision : Using C23 macros, I built EXPECT and ASSERT checks that capture the exact file and line number of any failure. Clean Output : The test runner provides colored feedback and a final summary. I also updated the Makefile to add a test target, which compiles all source files EXCLUDING main.c (as I have a custom test_main.c ), test files, and runs the tests. The Logger Unit Tests (50 tests) Instead of being lazy, I decided to write a test for everything imaginable for the Logger. This may seem pointless, even redundant at times, but as I say, better be safe than sorry. 1. Lifecycle Verification Proving that Init/Shutdown/Reset cycles don’t leak memory or leave the mutex in a deadlocked state. I verified that the Logger returns to a “Zero State” after shutdown, allowing it to be safely re-initialized later. 2. Boundary Protection & Buffer Safety This was the most critical part. I wrote a “ruler” test to verify exactly what happens when the 1024-character message buffer is exceeded. By analyzing the memory buffer line-by-line, I proved that the logic correctly truncates and appends ... at the exact 1023rd byte without overflowing the stack. 3. Null-Pointer Safety Every public function was tested with nullptr arguments. Where applicable, of course. 4. Logic & Metadata Verification Using fmemopen() to capture the logger’s output in memory, I verified the exact formatting of timestamps, ANSI colors, and source-location metadata. Ajajaj, yet another POSIX-only function. Surely this won’t backfire… What’s Next? Now that the Test Suite is done, and Logger unit tests are written, it’s finally time to tackle yet another core component, this time it being a custom (minimalist) memory allocator .
Devlog #4: Arena Allocator & Test Framework improvements ( Commits: bd81ab254f - ba67b8cade ) 8 changed files with 1638 additions and 44 deletions This devlog covers another core module, the Arena Allocator , as well as improvements to the test framework. Implementing this took quite some time, due to the fact that I want to make sure the codebase stays secure and fast. Arena Allocator ( bd81ab254f ) The next core module I implemented is a linear arena allocator , the polar opposite of a general-purpose malloc. The whole purpose is simple: no free individual allocations. Just bump a pointer and reset the whole thing when you’re done. It’s also quite fast. Alignment without compromise Every pointer returned by the arena is aligned to max_align_t (typically 16 bytes on x86-64). When the CPU loads an 8-byte value from an aligned address, the memory controller fetches a single 64-byte cache line in one transaction. The bytes land in the CPU’s load buffer in order, and execution continues the next cycle. When the same load is unaligned (say, address 0x1003 instead of 0x1000 ), the 8 bytes straddle two cache lines: 0x1000 and 0x1040 . The memory controller now issues two separate cache line fills , the load buffer stitches the result together from the two halves, and the pipeline stalls waiting for the second request to arrive. On modern x86-64 this penalty is roughly 2-3x the latency of an aligned load. For an allocator focused on speed, every allocation must be aligned. The arena guarantees this in two branchless instructions: uintptr_t raw = ( uintptr_t ) arena -> memory + arena -> offset ; uintptr_t aligned = ( raw + 15 ) & ~ 15 ; Snapshots The snapshot API ( zinn_arena_snapshot_begin / zinn_arena_snapshot_end ) lets you checkpoint the arena offset and roll back to it later. In debug builds the rolled-back region is poisoned with 0xAA so dangling reads are immediately obvious. Unit tests for the Arena ( 966c4c289e ) 47 thorough tests covering just about everything about the arena. Test Framework improvements High-precision execution timing ( efd7239d47 ) Every test function’s runtime is now measured. The runtime is printed next to the PASS/FAIL label with microsecond precision. Check out the second attachment. This commit also fixes a subtle C23 compatibility issue: nullptr has type nullptr_t under C23, which can’t be directly cast to uintptr_t . I added a _Generic dispatching macro ( ZINN_TO_PTR ) that maps nullptr_t to (void*)0 while leaving everything else untouched. The failure messages also got an upgrade: actual and expected values are now printed numerically instead of a bare expression string. Test run summary ( ba67b8cade ) The original test runner supported one suite at a time. You’d call zinn_test_summary() and get a single block. Now the architecture is multi-suite. The final output is a detailed breakdown: Per-suite: runtime, tests run/passed/failed, assertions made Global: success rate percentage, throughput (tests/second), average latency per test, slowest suite with its share of total time Check out the first attachment if you are curious how it looks. What’s next? With memory management settled and testing infrastructure solid, the next milestone is an error handler .
Devlog #5: Error Handling Overhaul ( Commits: 52515268fe - 91402e3215 ) 18 changed files with 1153 additions and 547 deletions I wasn’t happy with the old error handling. A flat enum doesn’t tell you what went wrong or how bad it is. So I tore it out and replaced it. I’m proud of this module because it uses modern C23 features everywhere you look, is fast, secure, and gives me the important debugging info in case something goes wrong. Thread-safe error and diagnostic module ( 52515268fe ) This commit contains the initial implementation of the module, although with a few bugs I addressed in one of the two later commits. Warning! This commit DOES NOT compile. I haven’t refactored the codebase to use the new error handling implemented in this commit. Bit-packed error codes The new zinn_err_t is a uint32_t with three fields packed into it: [8 bits domain | 4 bits severity | 20 bits code] Domain identifies the module. Severity says how bad it is. Code is the specific error number. Diagnostic stack A thread_local fixed-depth LIFO stack (max 16 frames, 128 message chars each). Every frame records file, function, line, the packed error code, a human-readable message, and a unix timestamp. Pushing a frame manually is tedious, so I wrote macros that inject them for you. Higher-level macros build on this: ZINN_RETURN_IF(condition, error) : if true, push a frame and return the error ZINN_RETURN_IF_ERR(expression) : if the expression fails, push and return ZINN_TRY(expression) : same, but evaluates to the expression’s value on success ZINN_CHECK_ERROR(call, message, ...) : push a frame if error, but keep going zinn_diagnostics_dump_frames() dumps the whole stack to stderr with colored formatting, newest first. Check the attachment to see the stack dump in a terminal. Contains all the info you’d ever need. Scope guard C doesn’t have RAII. But GCC has __attribute__((cleanup)) . The scope guard module wraps it: ZINN_DEFER_CLEANUP ( function , pointer ) This declares a local guard that calls function(pointer) when the scope exits, whether by normal return or early return. You can disarm it with ZINN_SCOPE_GUARD_DISARM(name) if you transfer ownership. The logger now uses this for mutex cleanup. The old code scattered manual pthread_mutex_unlock() calls across every return path. One missed unlock would deadlock the whole process. Refactoring the codebase ( de25c634a0 , 91402e3215 ) The codebase was refactored to use the new error handling and diagnostic functions, macros and types. A few examples: Logger : returns zinn_err_t everywhere; precondition checks use ZINN_RETURN_IF ; mutex handling uses scope guards Arena : zinn_arena_create changed from returning a pointer to returning an error code with an output parameter. Every error site now pushes a diagnostic frame with details Tests : adapted to the new API. Fixed several real bugs along the way: missing fclose() calls that leaked file descriptors and a renamed internal function amongst a few others The test count also dropped from 50 to 49 Logger tests because I removed a redundant test. What’s next? With the error handler now functional, it will be finally time for the (probably) final core mod-… oh wait. Nevermind that. Next I have to write a ton of unit tests for this new module. Lucky me!
Devlog #6: Unit tests for Error Handling ( Commit: 252eb6d937 ) 5 changed files with 1312 additions and 0 deletions After implementing the error code system, diagnostic stack, and scope guard, I needed to make sure they actually work before I start building on top of them. So, my favorite activity, writing unit tests, was awaiting me with 64 more tests across 3 new suites. New test macro: ZINN_EXPECT_EQ_STR The diagnostic stack tests compare message strings. ZINN_EXPECT_EQ would compare pointer addresses if you passed strings, not contents, so I added a strcmp based variant: ZINN_EXPECT_EQ_STR ( frame -> message , "42 hi" ); On failure it prints actual vs expected strings, which makes debugging test failures a lot easier. Error Code (16 tests) The tests verify that each field lands in the correct position and that overflows are safely masked out: “Round-trip” : pack ZINN_DOMAIN_LOGGER | ZINN_SEVERITY_INFO | 0x42 , then extract each field and verify Overflow tests : the masks ( 0xFFFFF , 0xFF , 0xF ) clip overflowed fields back to zero, tested with values one past each bit boundary Max values : 0xFF domain, 0xF severity, 0xFFFFF code all survive the round trip All 6 predefined codes : decoded and checked against expected domain/severity/code down to the exact values Diagnostic Stack (36 tests) Raw push/pop/peek/clear Push : basic field assignment, null file maps to "unknown" , null function maps to "unknown" , null format maps to "(none)" , empty format produces empty string, printf args ( "%d %s" , 42 , "hi" ) produce "42 hi" , truncation at exactly 127 bytes + null terminator at 128 Push overflow : fill all 16 slots, the 17th push returns false , depth stays pinned at 16, the last valid frame is untouched Pop : once from a non-empty stack decrements depth, pop on an empty stack is a no-op, pop 3 of 5 leaves depth at 2, pop all 16 resets to 0 Peek : empty stack returns nullptr , non-empty returns the top frame (LIFO: second push overwrites the peek target), after clear returns nullptr Clear : empty stack stays at 0, stack with 5 frames resets to 0 Convenience macros Each macro has its own test helper and multiple assertions: ZINN_DIAGNOSTICS_PUSH : verifies __FILE__ , __func__ , __LINE__ are injected, with and without format args ZINN_RETURN_IF_ERR : passing ZINN_OK skips the frame and returns OK; passing an error pushes a frame containing "Propagated error" and returns the error ZINN_RETURN_IF : condition true: pushes "Condition failed (true)" and returns the error; false: no frame, returns OK. ZINN_TRY : wraps a successful call (forwards the value), wraps a failing call (pushes "TRY macro captured failure" , returns the error) ZINN_CHECK_ERROR : the only macro that doesn’t return. After pushing a frame, execution continues. Verified with a continued flag, format args, and a static message Integration Two isolation tests: one interleaves push/pop/push and verifies frame independence (frame 0 still holds "0" after pops, frame 1 holds "new" ). The other pushes two frames with different error codes and verifies LIFO ordering and the peek return value at each step. Scope Guard (12 tests) Scope guards fire implicitly when a scope exits. Tested with global counters for basic fire, multiple guards, early return, null-safety, nested scopes, named guards, disarm, double-disarm, and direct execute() calls with null/disarmed/null-cleanup guards. What’s next? With 160 tests across 5 suites, I can take a short break from writing unit tests. Next up is the CLI argument parser (probably) the final core module before I can get to the fun ASCII stuff.
Devlog #7: String View ( Commit: 656a879786 ) 3 changed files with 624 additions and 4 deletions The next core module I built was the string view. The primary goal of this module was to build it fast, avoid heap allocation, ambiguity, and make it “bulletproof”. My reasoning behind making this module is simple: it will be heavily used in the upcoming CLI argument parser and the media-to-ascii engine. The struct and constructors ZinnStringView is dead simple, just a const char* data and a size_t length . Two constructors build views from either explicit parts or null-terminated C strings. Both return ZINN_STRING_VIEW_NULLPTR if you pass them null or empty data. The literal macro The coolest part of this module is ZINN_STRING_VIEW_LITERAL() . It wraps a string literal at compile time using _Generic to detect whether you passed an actual literal or a pointer variable. ZinnStringView sv1 = ZINN_STRING_VIEW_LITERAL ( "hello" ); // works ZinnStringView sv2 = ZINN_STRING_VIEW_LITERAL ( pointer ); // compile error (see attachment) If you pass a variable, _Generic sees char* or const char* and the static_assert fires with a message telling you to use zinn_string_view_from_cstring() instead. Also, while making the attachment I realized what I wrote is actually not correct for C23, as you cannot have static assertions in expressions. This is only a feature in the upcoming C2Y (C29) standard. Implemented functions Generally, I preferred using standard library functions as they are battle-tested, and more often than not use SIMD instructions for much faster execution than whatever I could come up with. Slicing and trimming zinn_string_view_subview gives you a sub-slice with bounds clamping. If offset is past the end you get ZINN_STRING_VIEW_NULLPTR . If offset + count overshoots, it clamps down. The three trim functions share one implementation behind an enum that controls whether to trim left, right, or both. Comparison and matching I built a 256-byte lookup table that maps A-Z to a-z for case-insensitive comparison. It’s locale-independent, so no tolower() surprises on Turkish systems. find_char delegates to memchr , which your libc likely implements with SIMD (16-32 bytes per cycle). starts_with and ends_with are just memcmp with an offset. split_first finds the delimiter via memchr and chops the view in two. Number parsing Parsing from a string view is tedious because standard library functions expect null-terminated strings. The solution is to copy into a small stack buffer, null-terminate it, and call the respective function. The double variant uses strtod_l with a POSIX “C” locale so "3.14" is parsed correctly even if the user’s system uses commas as decimal separators. Both trim whitespace first, check for overflow via errno, and reject partial parses like "123abc" . What’s next? My favorite activity, unit tests!
Devlog #8: Unit tests for String View ( Commit: 63f7ec3f88 ) 5 changed files with 1402 additions and 2 deletions After building the string view module, I did what any sane person would do: wrote 110 tests for it. The new “String View” suite brings the total test count to 260 across 6 suites, and the assertion count to over 1000!!! How the heck did you write 1402 new lines of “code” in 140 minutes? If we exclude comments and blank lines, that’s still a lot of lines. The answer is simple: the editor I use is Neovim, which allows me to use find & replace (see first attachment), quickly copy, delete, manoeuvre lines with simple keybinds, and much more! In the attachment you can see me writing the general structure of roughly 20 tests in one single command, thus saving me 10s of minutes. I simply then replace the test-specific data and assertions and I’m all set! New test macro: ZINN_EXPECT_DOUBLE_EQ Floating point equality is a lie. ZINN_EXPECT_EQ converts to uintptr_t under the hood. It being an integer type, any floating point number you convert to uintptr_t gets its floating part cut off. So I added ZINN_EXPECT_DOUBLE_EQ for checking equality of floating point numbers. Test helpers Two local macros keep the test file from being even longer than it already is: EXPECT_ZINN_STRING_VIEW_NULLPTR(sv) EXPECT_ZINN_STRING_VIEW_VALID(sv, e_data, e_len) Each macro expands to a few lines of code, which might seem pointless at first, but for 110 tests that use the macro, it adds up. What got tested Every public function in the string view module was tested thoroughly: null pointers, empty inputs, boundary values, and at least one “happy” path. Constructors and macros (8 tests) Both constructor macros are verified. from_parts rejects null data and zero length. from_cstring rejects null and empty C strings. Slicing and trimming (23 tests) subview is tested with the offset past the end, offset equal to length, zero count, clamping when count overshoots, exact fits, and partial slices. Each trim variant has tests for null input, no whitespace, some whitespace, all whitespace, and mixed content with whitespace only on one side. Comparison and matching (45 tests) equals checks length mismatch, null data on either side, the same-pointer fast path, exact match, and content mismatch. equals_case_insensitive goes further: same categories plus non-ASCII bytes (the lookup table should pass them through unchanged) and a mismatch on the last character to make sure the loop doesn’t stop early. starts_with and ends_with both test null data, null prefix/suffix, empty prefix/suffix (should return true), empty source (should return false), prefix/suffix longer than the source, match, and no match. find_char tests null data, null out pointer, empty view, char not found, and found at positions first, middle, and last. split_first has the most edge cases: null output pointers independently, null string view, empty string view, delimiter not found, delimiter at start, middle, end, and a single character that is the delimiter. Number parsing (35 tests) to_int64 and to_double are the heaviest. Both test null out, null data, whitespace only, trimming working, buffer overflow, overflow/underflow via ERANGE, no digits, and partial parses like "123abc" . to_int64 additionally tests positive, negative, zero, INT64_MIN, INT64_MAX, plus sign prefix, and a lone hyphen. to_double additionally tests basic, scientific notation, negative, plus prefix, integer-only input, nan, inf, -inf, decimal-only like ".5" , and a bare dot. What’s next? Yet another core module. Regardless of what it is, I’m still hours away from coding some fun ASCII conversions..
Devlog #9: CLI Argument Parser ( Commit: 870e5f9279 ) 7 changed files with 782 additions and 32 deletions The CLI argument parser is Zinn’s final core module. It’s built entirely from scratch, without any external dependencies. Other modules (string views, error handling, logger) were designed to be used seamlessly, and this is the first proof. The architecture The parser is built around declarative option schemas: const ZinnCliOption ZINN_CLI_OPTIONS [] = { {. long_name = ZINN_STRING_VIEW_INIT ( "width" ), . short_name = 'w' , . type = ZINN_CLI_TYPE_INT64 , . offset_in_config = offsetof ( ZinnConfig , width ), ...}, }; Each option knows its type, whether it’s required, and exactly which byte offset inside ZinnConfig to write to. The parser walks argv, matches tokens against schema entries, and writes parsed values directly into the config struct via offsetof + pointer arithmetic. This prevents huge bug-prone switch statements you’d have to write (or copy-paste) if using getopt , for example. The schema validates itself at parse time: duplicate short/long names, offsets exceeding the config struct, zero options, and too many options all get caught before any argv is touched. For the caller, using this module is rather simple. Declare the schema, call zinn_cli_parse( /*...*/ ) , handle failure, and the config is provided nicely in a structure. Following the code style The original parsing function I wrote was a huge, monolithic function with over 200 lines. I extracted what I could: _zinn_validate_schema : validates the schema itself _zinn_pre_scan_help_version : early return for --help / --version before parsing errors can block them _zinn_write_option_value : type-dispatching write via offsetof /switch The main loop is still ~150 lines. The long-option and short-option matching share too many moving parts: the argv index i (which gets bumped for next-arg values), matched_index (required-flag tracking), the positional_only flag, and the token itself. Extracting them would mean threading half a dozen mutable out-parameters through a helper that’s only called once. Technically , the parsing function breaks the code style, but it would’ve been too much trouble than its worth to try and extract anything more. (Also, I wrote the rules, so I can do whatever I want) Safety I own the entire error path. Every parse failure captures file, function, line, and a description in the diagnostic stack. Run --width=abc and you get a trace pointing to the exact switch case that failed, plus a Use ‘–help’ hint (see 2nd attachment) . You don’t get that from getopt returning '?' . What’s next? After adding a new module, unit tests follow, as usual.
Devlog #10: Unit tests for CLI argument parser ( Commit: 90120d4b79 ) 5 changed files with 1448 additions and 11 deletions The last core module got its tests. 73 new tests for the CLI argument parser, which makes 341 tests across 7 suites. The parser has more unit tests than any other function in any suite. Schema(s) for the tests To test the parser you need something to parse, so I built a test schema that covers every option type. The main test schema has four options, each of a different type. Additionally, I made a few deliberately broken schemas for the failure paths: duplicate long names, duplicate short names, an empty schema, one with 33 options (one over the max), and one whose offset_in_config points straight out of the struct. Small fixes uncovered along the way Writing the tests exposed two issues worth mentioning. ZINN_EXPECT_DOUBLE_EQ dumped its constexpr double EPSILON into the surrounding scope. As soon as you’d use it twice in one scope, you’d run into redefinition errors. I simply wrapped the macro’s contents in a do {} while(0) loop to prevent this from happening. The default config values were magic numbers. Now they’re named constants ( ZINN_CLI_DEFAULT_WIDTH , …) living in the header, and the tests assert against those instead of hardcoded values. What the tests cover The zinn_cli_parse tests take up most at 65. The remaining 8 are split between 4 other functions, each with one nullptr path and happy-path. Schema validation and null checks (8 tests) Every error path of zinn_cli_parse : null schema, null argv, null config, plus each of the broken schemas from the harness, all bail with the correct error code. The help and version prescan (10 tests) This section is the interesting one, because the pre-scan for --help / --version is intentionally naive: it scans for the flag before any real parsing. So zinn --str --help returns OK with help set, even though --str is missing its required value. The tests pin down ordering: --version --help gives version, --help --version gives help, since the loop exits on the first hit. zinn -- --help will toggle the help boolean and skip the rest of the parse. The last case is a bug. In “./prog – –help” the pre-scan should identify the -- delimiter and exit the pre-scan loop without toggling the help boolean, thus letting it be parsed as a positional argument. Option forms (6 tests) Everything the parser accepts: --width 80 , --width=80 , -w 80 , -w80 , and mixed forms in a single invocation. Bundled values handle signs too, so -n-42 parses to -42. -shello (short for –str hello) also works correctly:) Positional arguments (10 tests) Positionals fill input_path then output_path ; a third one errors out. After -- the parser treats everything as a positional argument. Fun fact, if you pass -- twice, both get consumed as the “positional mode switcher”. Value and error handling (16 tests) An int option given abc , overflow past INT64_MAX, 1e309 against a double, values that themselves look like flags ( --num --flg ), empty values ( --str= , --num= ), and --str=a=b , where everything after the first equals sign becomes the value. Unknown options (3 tests) Both flag variants are asserted to reject unknown identifiers. Repeats and required options (12 tests) Last occurrence wins. Required option checking happens after the full parse. What’s next? With the final core module’s unit tests now done, I plan to switch build systems so the engine can work on both Linux and Windows flawlessly, which is a prerequisite for the beautiful media-to-ASCII pipeline.
Devlog #11: Switching to Meson ( Commits: c65e483c45 , c1bdb7eb50 ) 4 changed files with 305 additions and 233 deletions Switching to Meson from a Makefile was quite an easy decision. Considering I want a cross-platform build system that is fast , Meson+Ninja stood out as the best possible candidate. On top of that, Meson easily supports cross-compilation, which fits my use case even more! Switch to Meson (Commit c65e483c45 ) The first commit that this devlog details contains the initial implementation of meson.build , and of a Makefile shim . meson.build I decided to write meson.build as idiomatically as possible. I followed the mesonbuild.com documentation for this purpose. Because of my project’s reliance on ISO C23, I had to make sure that Meson supports setting c23 as an option. That means ensuring Meson is above or equal to v1.4.0. The compilation flags and linking flags stay the exact same as in my previous Makefile, and on top of that, Meson checks whether a flag is supported and prints it right out while compiling! Makefile shim The only drawback I encountered while toying with Meson is that the commands can get quite lengthy. For example, to compile and run my project from nothing via meson looks something like this: meson setup build-debug --buildtype=debug -Db_ndebug=if-release && meson compile -C build-debug && ./build-debug/zinn While via my previous Makefile it looked like this: make debug && make run Of course, this has a lot to do with the fact that Meson saves a bunch of metadata, but nevertheless the flow is slower when trying to remember all the meson options. That’s why I created a Makefile shim. The term comes from Embedded Artistry , and it refers to a Makefile that acts as a front-end for Meson (in this case). I wrapped all the meson commands in neat Makefile targets, so I can just run make debug && make run all the same while still getting the valuable Meson features. Windows & cross-compilation support (Commit c1bdb7eb50 ) With Meson now working in my codebase, it was time for cross-platform support. Adding it was really easy. meson.build changes The only change in meson.build besides the Windows linker-flag section is that is_windows and is_mingw detection. cross folder & .ini file Cross-compilation is simply compiling code for a different computer on your own computer. In my case, I wanted to compile for Windows while staying on Linux. In my old Makefile this would be a huge hassle, but Meson only needs this little file to know the target and which cross-compiler binaries to use: [binaries] c = 'x86_64-w64-mingw32-gcc' ar = 'x86_64-w64-mingw32-ar' strip = 'x86_64-w64-mingw32-strip' windres = 'x86_64-w64-mingw32-windres' exe_wrapper = ['wine'] ... The last row is where the magic happens: exe_wrapper tells Meson to run any produced Windows binary through Wine, so I can test the cross-compiled output directly from Linux. What’s next? If you checked the attachment out, you can see a bunch of compilation errors; those are there on purpose. I have yet to update my actual code to support Windows....
|
1793321327.7789123
|
1793926127.7789123
|
|
11346
|
Zinix by @viktorpopp | Stardance
|
viktorpopp
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zinix by @viktorpopp | Stardance
|
1793998414.9214077
|
1794603214.9214077
|
|
25696
|
Zigbee button by @Zeten | Stardance
|
Zeten
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Zigbee button by @Zeten | Stardance
|
1793462237.0568476
|
1794067037.0568476
|
|
9055
|
ZigTap by @braxtonmarx | Stardance
|
braxtonmarx
|
0
|
4.26
|
0
|
[]
|
[{"post_id": 4625, "ts": "2026 [{"post_id": 4625, "ts": "2026-06-08T00:28:26Z", "hours": 2.0503, "text": "worked on coding the Program files… Idk what I was doing so I was following lots of youtube videos"}, {"post_id": 3947, "ts": "2026-06-07T02:22:50Z", "hours": 1.5022, "text": "The PCB is now done!!! I need to start working on the 3d printed case and the code for it"}, {"post_id": 3629, "ts": "2026-06-06T17:22:58Z", "hours": 0.7031, "text": "Started on the design schematic for the Zigbee button"}]...
|
Title: ZigTap by @braxtonmarx | Stardance
Devlogs Title: ZigTap by @braxtonmarx | Stardance
Devlogs:
Started on the design schematic for the Zigbee button
The PCB is now done!!! I need to start working on the 3d printed case and the code for it
worked on coding the Program files… Idk what I was doing so I was following lots of youtube videos...
|
1793843756.8300447
|
1794707756.8300447
|
|
45561
|
Zig-Vulkan-Renderer by @DragonDev22 | Stardance
|
DragonDev22
|
1
|
18.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-29T00:08:31Z", "hours": 18.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A Vulkan renderer in zig. It renders a coloured triangle, and it has some issues on linux mint for some reason.", "repo": "https://codeberg.org/DragonDev22/AIF-vk-renderer", "demo": "https://codeberg.org/DragonDev22/AIF-vk-renderer/releases/tag/v0.0.1-dev"}]...
|
[{"post_id": 77520, "ts": "202 [{"post_id": 77520, "ts": "2026-10-07T09:47:41Z", "hours": 10.7964, "text": "The almighty triangle of doom, death, and destruction. This has certainly taken a while! This was so much effort to this point, and it isn’t perfect, as I get some weird glitches on my system, which doesn’t occur with existing examples. I’ll definitely look to fix them, but I achieved my goal, and this will be improved some other time."}, {"post_id": 43241, "ts": "2026-08-08T12:09:16Z", "hours": 7.1583, "text": "Finally got not only windowing (with glfw) working, but also managed to set up screen colour clearing in just under 100 lines!"}]...
|
Title: Zig-Vulkan-Renderer by @DragonDev22 | Stard Title: Zig-Vulkan-Renderer by @DragonDev22 | Stardance
Devlogs:
Finally got not only windowing (with glfw) working, but also managed to set up screen colour clearing in just under 100 lines!
The almighty triangle of doom, death, and destruction. This has certainly taken a while! This was so much effort to this point, and it isn’t perfect, as I get some weird glitches on my system, which doesn’t occur with existing examples. I’ll definitely look to fix them, but I achieved my goal, and this will be improved some other time.
Ships:
A Vulkan renderer in zig. It renders a coloured triangle, and it has some issues on linux mint for some reason....
|
1794016110.236346
|
1794102510.236346
|