|
29102
|
AniSuffle by @PAPER_01 | Stardance
|
PAPER_01
|
1
|
118.0
|
1811
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-14T11:29:39Z", "hours": 77.0, "multiplier": 19.59, "payout": 1811, "blessing": "blessed", "text": "# Welcome to the shipping devlog (I guess , I don't know what its called) (≧▽≦) Hey um.. In this section I will be giving the overview of my entire project , I will try to keep things simple and short. *(please read github as i m facing limit issue here)* (╥﹏╥) Ok, so my project **\"AniSuffle\"** is a webpage where you can get random Anime/Manga recommendations. But there is way more things I worked on , please let me explain. ( •̀ ω •́ )✧ ## Features ### Generate Random Anime/Manga I have integrated **4 APIs** (**Jikan, Anilist, Kitsu And MangaDex**) for fetching Anime/Manga recommendations. Jikan, Anilist and Kitsu can fetch both Anime and Manga while MangaDex fetches Manga only. They all work together as a fallback system, so if one API fails, another will handle it , you (solving the rate limit issue). =) ### Authentication (Login/SignUP) Logging in or signing in is **NOT COMPULSORY**. I repeat , as I can understand that its such a pain, I had to add it so that you could access the list anywhere in any device . **Make sure to enter unique username in the signup page** The only thing it gives you is access to your saved list across different devices. If you don't want to use your personal email while reviewing, you can use a temporary email. I have also uploaded a video in **Devlog #12** showing how to do it Just in case you dont know how to do that =) ### LocalStorage & Database * Not signed in → saves are stored in **LocalStorage**. * Signed in → saves are stored in the **Database**. * Existing LocalStorage saves are automatically transferred to the database after login to avoid duplication. ### Genre Selection You can generate recommendations based on your selected genre. Some APIs name genres differently, so in a few cases you may receive a closely related genre instead. ### Other Features * Embedded YouTube trailers (when available) * Switch between Anime & Manga * High Rated First (7+ rating) * Double click the poster to save * External links to Crunchyroll, Netflix, AnimeSuge, MangaDex, Viz, BookWalker and YouTube (if available on the API) --- ## Detailed Explanation Please read the **README** on the GitHub repository if you'd like the detailed explanation of how everything works. I had to shorten this because I'm exceeding the character limit. (>﹏<) --- Thank you so so so much. I really really really hope you will like this project. (づ。◕‿‿◕。)づ", "repo": "https://github.com/sudipstha-01/AniSuffle", "demo": "https://shrestha-project-07.wuaze.com"}]...
|
[{"post_id": 35576, "ts": "202 [{"post_id": 35576, "ts": "2026-07-27T03:30:46Z", "hours": 3.0, "text": "Devlog #23 Hello everyone, Welcome to Devlog #23 of AniSuffle ! Update One more bug ,fixed and found . So, till now the username stored would only be saved if someone entered the name in the intro and played the guess rating game. And now its fixed and Now the username is stored in the database immediately after the username name is submitted in the intro username section. Also One more thing , if someone took the username as “PAPER” and later if someone tries “paper” then the name will not be allowed. I did it just to be safe and later no any confusion or bug to occur just becase of the case of the entered word . I will add a screenshot of username is taken below(As I dont know what screenshot to add on this devlog :p ). I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!"}, {"post_id": 35163, "ts": "2026-07-26T12:39:55Z", "hours": 4.0, "text": "Devlog #22 Hello everyone, Welcome to Devlog #22 of AniSuffle ! Update Ok , so This time I was working on the intro side and I realized that before I changed some data structure while storing the username and i am now COOKED (╥﹏╥). Also I was searching for the error in my backend becuase of which the skip btn never appeared and even after asking ai , It was not able to help me ,and after giving it a tons of screenshots of the project , console and networks , It told me to remove a comment - - . And even more annoying or good thing (i dont even know what to call it anymore) was that the code worked after removing the comment. It made no sense to me , and honestly I still dont know why even that comment was causing the issue . Trust me I stared that code for more than an hour only to remove the comment at the end. Anyway , the code is now working (but i know there are still bunch of more bug to fix), so the main addition i would say rn is the live checking of the username . The username entered will be checked at the live time (every 400ms to be more precise). I guess thats all. I know it might sound like not much addition but it was more debug i did this time - -. I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!"}, {"post_id": 34550, "ts": "2026-07-25T11:03:49Z", "hours": 2.0, "text": "Devlog #21 Hello everyone, Welcome to Devlog #21 of AniSuffle ! Update I made a rough templete or a rough design on what the guess highest rating might look like , I mean the structure only , I will change the design and animation later on . Nothing much to explain but I will keep the design image below . Also I am still building the functionality . Right now they only fetch 4 differenct anime poster name and score . I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!"}, {"post_id": 34441, "ts": "2026-07-25T04:49:42Z", "hours": 0.0, "text": "Devlog #20 Hello everyone, Welcome to Devlog #20 of AniSuffle ! Update Hey everyone , a quick update . I again changed my plan and I have now decided to use the intro username as the unique username which will be used everwhere , like in the database and the leaderboard. I apologize for creating the confusion but I felt like asking multiple username might be even more confusing (ó﹏ò。). So i planned to stick with the single username to maintain consistency and to avoid confusion. I would not expand the devlog anymore unnecessarily and waste your time. And I hope I made everything clear If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!"}, {"post_id": 34014, "ts": "2026-07-24T12:40:39Z", "hours": 6.0, "text": "Devlog #19 Hello everyone, Welcome to Devlog #19 of AniSuffle ! First , Our project got SuperStar title and I thank you all,Without ya all my this project would not have got that level of attention. Thanks to all of you and the reviewer for marking it as a SuperStar Project . It made me so happy. Thank you so much (˶>⩊<˶) Update After creating and deleting the same table , the same database many times . I have finally decided to remove the username from the signin option and kept it on the rate game page , which means while signing in you wont have to use username , rather you will sign up using only gmail . Also , I am thinking of linking the gmail with the username automatically after the user has signed in so the progress is stored in the connected account. I am currently working on the backend so there is nothing intresting to show but i will keep the site image for now … I would not expand the devlog anymore. If you have any question please comment ,though I am myself not so sure about the username thing, I mean… I might change the data structure if things go wrong,so if you ask me rn about how i will be storing data exactly then my answer might not be that clear but I will still try , thank you so much . Thanks for reading! <(_ _)> Have a nice day!"}, {"post_id": 33487, "ts": "2026-07-23T14:04:01Z", "hours": 6.0, "text": "Devlog #18 Hello everyone, Welcome to Devlog #18 of AniSuffle ! I know it has been a while , but to be honest , i dont really have much to show for this devlog . Even though I have been working on something fun to be added in this site. Update I the last devlog I told that I will be working on the treding section ,but while making that I dont know for some reason I wanted to make a game like thing in this site. Lemme give a brief description . so I was thinking of making a Rating Guess game , where you will be shown any 4 anime poster and its name and you would have to choose a anime and you will be given a score and I am also planning to make a leaderboard so that the game feels even more competetive, but the problem is that I dont want to make sign in compulsory and I would need a username for that . So I have been working on the game but still am unsure about the usernames , as asking multiple usernames might be confusing so, I am still thinking on what to do about this. I would not expand the devlog anymore. If you have any question please comment , I will try to explaing things there , thank you so much . Thanks for reading! <(_ _)> Have a nice day! =)"}, {"post_id": 32840, "ts": "2026-07-22T07:51:31Z", "hours": 5.0, "text": "Devlog #17 Hello everyone, Welcome to Devlog #17 of AniSuffle ! Update I have changed the background of the intro page and added a video as a background instead (i will provide the link below)(as the old one was AI made, not a copy paste though).There is a skip button in the intro incase its boring for you . Also on one of the feedback , I saw one reviewer was not able to access the for some reason i really dont know why, so now i have moved the site to https://shrestha-project-07.wuaze.com this url, even though the old site will be active , the new updates will be availble on this site only . I might update this link on old devlogs as well. Currently I am working on the trending section , where you will be able to see the trending anime list or in card form, but i will try to make it intresting somehow =) Also , both sites share same database so if you have logged in before then , you can still use that id to login in both site. Credit: https://www.youtube.com/watch?v=1L7mzyGhXCA (there are few edits/cuts i did) I would not expand the devlog anymore Thanks for reading! <(_ _)> Have a nice day! =)"}, {"post_id": 32164, "ts": "2026-07-21T04:15:25Z", "hours": 1.0, "text": "Devlog #16 Hello everyone, Welcome to Devlog #16 of AniSuffle ! Update I have made few changes , I changed the Hover Trailer text from Hover Trailer On / Off to a checkbox ,as I found a cool looking (i guess it is) checkbox on a site and also a mute and unmute btn . So I changed them . I will keep a clip below rather then explaining with words . ##Credit Mute Btn (when hover trailer is on) : https://uiverse.io/catraco/dry-robin-61CheckBox Animation (On hover trailer) : https://uiverse.io/00Kubi/hot-dragonfly-56 I would not expand the devlog anymore Thanks for reading! <(_ _)> Have a nice day! =)"}, {"post_id": 31842, "ts": "2026-07-20T15:25:21Z", "hours": 6.0, "text": "Devlog #15 Hello everyone, Welcome to Devlog #15 of AniSuffle ! So first, I have a few announcements. I got some more feedback, and in respect of those, I will now be making the devlogs shorter and use limited/less kaomoji (ó﹏ò。), so that you can read the devlogs more clearly. Update So, I have finally finished working on the Hover to Play Trailer feature. I just have a mute and unmute button which will be displayed on the trailer when hovered. When hovering, for a few seconds, it will also show titles, the YouTube logo, and other YouTube things. I tried to hide those but was unable to. When I asked AI, it told me that it was not possible. Rather, it gave me alternative ways, which I thought would not be a great user experience, so I left it as default. (ᵕ—ᴗ—) I had a hard time fixing the overlapping of the hover and click animations, but those are finally gone. Now I guess that’s it for this devlog. Thanks for reading! <(_ _)> Have a nice day! =)"}, {"post_id": 31216, "ts": "2026-07-19T13:11:07Z", "hours": 8.0, "text": "Devlog #14 Hello everyone, Welcome to Devlog #14 of AniSuffle ! (≧▽≦) Okay, so this is the first devlog after I have shipped the project. And yes… I’m still working on the project. ( ̄▽ ̄)ゞ Thanks to @Gideonthegreat for the feedbacks! Yeah, I mean, I got some awesome feedback, and I really wanted to add more and make more changes. (๑•̀ㅂ•́)و✧ After thinking and looking around the code for a while… (and staring at it for way longer than I should have) I finally decided to integrate the Hover to Play Trailer feature first . I did not want to just replace the click ripple animation. That’s why I decided to add it as an option ,you can click on the hamburger menu (the three horizontal lines in the top-right corner), where you can turn the Hover to Play Trailer option on and off. ヽ(・∀・)ノ. [I will update the live site later on, as i am still working on it (ó﹏ò。)] It is still not complete. (ᵕ—ᴗ—) I’m still working on it! So I’ll show you a demo video[My laptop is potato so the video is abit laggy, plz dont mind that], but please don’t take it as the final version. I’m still thinking of making more changes to it… hehehe. (,,¬﹏¬,,) I accept that I still need to optimize this feature, and the clip was short as my laptop was lagging alot 😭 (see the CPU usage ( top blue bars)) Maybe I’ll end up changing something again before the next devlog. Who knows? (☞゚ヮ゚)☞ I guess that’s it for this devlog! (ノ◕ヮ◕)ノ*:・゚✧ I will still love feedback if you have any =) Thank you so much for reading! <(_ _)> See you in the next one Thank you again and have a nice day =)"}, {"post_id": 28210, "ts": "2026-07-14T11:04:07Z", "hours": 0.0, "text": "We are finally shiping!!!!⸜(。˃ ᵕ ˂ )⸝♡ Here is the link https://shrestha-project-07.wuaze.com"}, {"post_id": 28114, "ts": "2026-07-14T05:45:33Z", "hours": 1.0, "text": "Hello everyone I was late for class while deployign the site so I M WRITING IT IN CLASS RN (・–・;)ゞ(teacher might come anytime now)But I wanted to share this project so bad . Thank you Here is the link : https://shrestha-project-07.wuaze.com Bye"}, {"post_id": 28041, "ts": "2026-07-14T01:59:46Z", "hours": 3.0, "text": "Devlog #13 Hello everyone!! (˶ᵔᗜᵔ˶)ノ゙ Welcome to Devlog #13 of Anime Shuffle ! (≧▽≦) Hope you all are doing well! (๑˃ᴗ˂)ﻭ This will probably be one of the shortest devlogs before the release, but I wanted to share one last little update. (ᵔᗜᵔ) ** Font Updates** I made a few typography changes to make the site feel a little cleaner and more unique. The Anime Shuffle title on the top-left now uses the Godber font. The titles of the anime/manga cards, along with the “High Rated First” label, now use the Morien font. They’re small changes, but I think they give the site a much nicer personality. (。•̀ᴗ-)✧ ** Responsiveness** I totally forgot to mention, I also added Responsiveness, even though it’s not best as the site is optimized mainly for laptop/PC screen but…. Umm it’s not worst (๑•﹏•) ** Shipping Today…?** If everything goes well on the server side, I’ll be shipping Anime Shuffle today! (ノ◕ヮ◕)ノ*:・゚✧ Hopefully there won’t be any last-minute bugs deciding to appear out of nowhere… (╥﹏╥) Fingers crossed! (๑•̀ㅂ•́)و✧ Any questions , please let me know Thank you all so much for being part of this journey. (づ。◕‿‿◕。)づ It has genuinely meant a lot to me, and I really appreciate everyone who took the time to read the devlogs, give feedback, and support the project along the way. Thank you so much! (´꒳`)♡ Have a wonderful day! (。♥‿♥。)"}, {"post_id": 27673, "ts": "2026-07-13T13:28:43Z", "hours": 6.0, "text": "Devlog #12 Hello everyone!! (˶ᵔᗜᵔ˶)ノ゙ Welcome to Devlog #12 of Anime Shuffle ! (≧▽≦) Hope you all are doing great! (๑˃ᴗ˂)ﻭ This devlog will be a bit shorter (Hopefully….) , but I wanted to share the final updates before the release because… ** Yep… we’re shipping soon!!** (ノ◕ヮ◕)ノ*:・゚✧ Hopefully within the next two days! (ᵕ—ᴗ—) Intro Animation The first thing I added is a small intro screen (around 7–8 seconds long) where you’ll be asked to enter a username. (ᵔᗜᵔ) Don’t worry, I’m not checking whether the username is already taken or not (just yet). You can type anything you want here. The purpose of this intro is simply to make the experience feel a bit more personal and fun. (。•̀ᴗ-)✧ I hope you’ll like it! =) When you eventually sign up, you’ll enter your username again, and that one will need to be unique. (ᵕ—ᴗ—) After entering your name, a short animated intro will play before taking you into the site. (✧ω✧) And yes… I used AI to help create this animation. Not completely, but it definitely helped speed things up. ( ̄▽ ̄)ゞ I also changed the background of the site because the previous one made some buttons a little difficult to see. I received that as feedback, so thank you very much! The site now uses a live wallpaper instead, which should make everything much clearer. I hope you will like that (ó﹏ò。) ** Double Tap = Save** Just like on social media apps, you can now double-tap (or double-click) an anime or manga poster to save it instantly. (☞゚ヮ゚)☞ When you do, a small star animation appears , yeyyy…. ** Email Verification Improvements** I also made a few improvements to the email verification system. (。•ᴗ•。) The verification email has been redesigned slightly so that the verification code is much easier to spot and copy. (´꒳`) ** Shipping Soon…** That’s pretty much it for this devlog! (ノ´ヮ`)ノ*:・゚ Right now I’m focusing on making the site fully responsive across different screen sizes. ૮₍ ˃ ⤙ ˂ ₎ა Also, the email shown in the disposable-email demo video isn’t the actual email theme used by AniShuffle. The disposable email website simply couldn’t render the HTML email correctly. (╥﹏╥) After that’s done, I might write one final devlog before releasing it… or maybe I’ll just ship it immediately. (¬‿¬) My goal is to release Anime Shuffle within the next two days , so stay tuned! (๑>◡<๑) ** Note for Reviewers** If you’re reviewing Anime Shuffle and don’t want to use your personal email address , don’t worry! I’ll also include a short guide video showing **how to get a free disposable (dummy) email,just in case you dont know ** so you can test the authentication system without using your own email. (。•̀ᴗ-)✧ Of course, anyone is welcome to use it—not just reviewers. =) Thank you so much for reading and for following the development journey. It really means a lot! (づ。◕‿‿◕。)づ See you all in the next devlog… or maybe in the release post! (ᵔᗜᵔ) If anything was unclear, please let me know. I’d really appreciate the feedback! Have a wonderful day! (。♥‿♥。)"}, {"post_id": 27177, "ts": "2026-07-12T14:35:42Z", "hours": 9.0, "text": "Devlog #11 Hello everyone (˶ᵔᗜᵔ˶)ノ゙, Welcome to Devlog #11 of AniSuffle . Hope you all are doing great. (≧▽≦) In this devlog, I’ll be sharing the recent changes and improvement i have mad on the site. Ummm.. This devlog will be abit longer, but I want to make sure I explain everything correctly. (ᵕ—ᴗ—) Soooo lets start~ SVG Animation The first update is the addition of SVG animation beside the title. I have also replaced the placehodler (those book and video like emoji) that was displayed on the poster card with the same svg (but the animation will be different). (。•̀ᴗ-)✧ Also about the source of the svg, For the “anime” svg, I got it from AnimeJs and i asked AI to make another svg “manga” , honestly it was quite difficult to make AI understand what I really wanted on the svg, and its still not perfect but ummm its fine and I hope you like those. ( ̄▽ ̄*) LocalStorage Also I have now integrated localStorage so, now you wont have to be logged in to save anime and manga anymore. (๑˃ᴗ˂)ﻭ It works in this way, lemme explain in simple: If you are logged out and you saved few anime/mangas and then you signned in, then all your localStorage saves will be automatically be transfered to the database (and your localStorage will be empty, I had to do this so that There is no duplicate data). ( •̀ ω •́ )✧ Email Verification And the most time consuming, I have integrated email verification which means now, the email you signup with should be a valied email (you can nomore login/signup with [email protected] ). And currently i have used brevo for sending emails and i m on free trial so it has the limit of 300 emails per day , And I assume its more than enough for me right now,also the code expires in 1 hour. (╹◡╹) . [I had to keep authorizing my ip address while setting it up and i thought it was error on my code and I was searching it for hours (╥﹏╥)] I will tell you how you can get a dummy email (just in case you dont know how to get one) if you want to check the authentication system without using your personal email [especially if you are a reviewer reading this.] but anyone willing to test it, you can use that method. But I will be doing that in the next devlog… probably, as In this devlog i might upload the video of showing current updates. (= ̄ω ̄=) I guess I will keep this much for this devlog. I hope I made things clear. [You might have seen manga on the save list even though i didnt add that in this video , and lemme make things clear, it was imported from the localstorage , which i have saved while checking my project =] If anything was unclear then please do tell me. (◕‿◕)♡ Helper tools SVG : https://animejs.com/documentation/svg/createdrawable SMTP : https://www.brevo.com/ Thank you so much for reading. (≧▽≦)♡ Have a nice day! (˶ᵔᗜᵔ˶)ノ゙"}, {"post_id": 26508, "ts": "2026-07-11T10:50:48Z", "hours": 6.0, "text": "Devlog #10 Hello everyone (˶ᵔᗜᵔ˶)ノ゙, Hope you all are doing great. Welcome to Devlog #10 of AniSuffle . Ok this time I will keep the devlog abit shorter maybe… (ᵕ—ᴗ—) Lets start The first and main change for this devlog is the Ripple like animation when you click the image. (Its just like the circle expanding from a point when you throw a stone on a still lake or pound.) Hope you like it! (๑˃ᴗ˂)ﻭ . Also a little bit change in brightness near the cursor ;) I will keep a video of the clip. As I told in previous devlog, I have finally seperated the Anime and Manga section in the save list, and also I kept the Sign In and Login option in the hamburger menu (the three horizontal lines). (。•̀ᴗ-)✧ A small optimization, I have added the APIs in the head section of HTML with rel=\"preconnect\" , so that the connection is established as soon as the site loads. (Just keeping APIs ready for fetching data from them.) ( •̀ ω •́ )✧ Also just to avoid confusion , you will not need to signin to save the anime/manga when i finally ship the project , I am still working on it . (ó﹏ò。)It is just a sample and doesnt represent the final product =) Also the save button on Manga section didnt worked before refreshing the site , and I will be transparent , that it was fault of my site and I am still trying to figure it out (ó﹏ò。) In the video I have wrote a random email , they might not work when I ship it, its just a dummy after all. ( ̄▽ ̄*) I will like to end the devlog now. (ᵔᗜᵔ) If anything was unclear please comment, I will try to explain again there. (╹◡╹) Thank you for reading! Have a nice day! (≧▽≦)ノ"}, {"post_id": 25971, "ts": "2026-07-10T14:45:19Z", "hours": 7.0, "text": "Devlog #09 Hello everyone(˶ᵔᗜᵔ˶)ノ゙, Hope you all are doing great. Welcome to Devlog #09 of AniSuffle . In this devlog I will be sharing you all the recent changes I made on my site. Okay… lemme explain. (๑˃ᴗ˂)ﻭ Auth(Login & SignUp) is finally working Soooo… Finally the Auth(Login and SignUp) feature is working. (≧▽≦) You can now login and save your info on the database and you would be able to login into another device and access your list / saves. I am planning to work on the email verification system as well, but dont worry I will be explaining you all how you can get a disposable email if you dont want to use your personal email, (I respect your Privacy(ᵔᵕᵔ)). Save Feature Also the save feature is now working just like I mentioned earlier. But for now you would have to login to use it. But dont worry. Before I ship this site, I will integrate the localstorage feature , to make the save feature work even without the signing in. I know signing up is kind of annoying sometimes… at least to me it is. ( ̄▽ ̄) So I wanted everyone to still be able to use the save feature even without making an account. Saved Anime & Manga Currently the stored anime and manga are stored in the same place[To be more specific they will be displayed on the same save list ]. But I guess I will make a seperate list for them. I will update in the upcoming devlog about it if I do make that change. (•̀ᴗ•́)و UI Changes Becuase of the sign up and login option the Anime and Manga buttons are on the center for now. I dont really like how it looks either. (ᵕ—ᴗ—) So I am planning to move those buttons back to the right side again. And also add a Hamburger menu (just in case you dont know… It’s The three horizontal line menu, actually i didnt know either before googling it just before writing this devlog (╹ڡ╹ )) . That menu will probably contain more features as I continue working on the site. Backend Debugging Most of my time actually went into debugging. (ó﹏ò。) For some reason I just couldnt figure out why my data wasnt being stored correctly. Sometimes it would save. Sometimes it wouldnt. Sometimes the stored data just refused to show itself in the list (probably it was abit shy (´꒳`)) . So… that took quite a bit longer than I thought. (・–・;)ゞ But yeah, finally things seems to be working [At least for now (・–・;)ゞ] Oh… The last devlog went incredibly long even though I thought it would be shorter… Looks like this one also became longer than I expected. (ㅅ •᷄ ₃•᷅ ) . (My apologies) I dont want to bore ya all. (´▽`) But still I hope I was able to make everything clear. If not, please do comment below and I will try my best to explain it there as well. ദ്ദി◝ ⩊ ◜.ᐟ Thank You all so much for reading. Have a nice day =)"}, {"post_id": 25135, "ts": "2026-07-09T04:56:00Z", "hours": 6.0, "text": "Devlog #08 Hello everyone(˶ᵔᗜᵔ˶)ノ゙, Welcome to Devlog #08 of AniSuffle . Hope you all are doing great. Okay, now let me explain quickly of my recent changes or update on the site. I am not sure but maybe this will be abit shorter devlog, maybeeee(ᵕ—ᴗ—)…. since most of the work is about backend (so nothing flashy to explain) also I will try to not bore anyone reading this.[also i try keeping the devlogs raw and unfiltered] Okay now lemme explain. Save Button & Auth Feature Sooo, the feature I have recently added to my site, actually not added, am still working on it is the save button and also adding a auth feature (the login and signup feature to be more simple =)) . Its not complete though. And one more thing, you definitely dont need to login or signup to use any of the features and tools I have made so far beacuse I understand that signing up is such a pain, I mean at least to me it isss. But there is one feature I want to add, and for this I think the signup is necessary. Now let me expalin how the save feature is going to work. It might be abit different as I am still working on it, I will just tell what I am planning to do. ** Why am I writing this devlog now?** And before that If you ask why am I writing a devlog if I have not done the job, then ummm…∘ ∘ ∘ ( °ヮ° ) Actually I am working on the backend and I am scared I might mess anything up, as I am not too confident on backend and storing user data safely is my top priority( ◡̀_◡́)ᕤ whenever I am dealing with the backend and while doing this I didnt realize that I have already 5 or maybe 6 hours I am not sure but maybe its around 6 hours of time logged already so I thought of updating the devlog, even though I am in the middle of the function (I mean the development process(ᵕ ó ᴗ ò)). I feel like I sound abit unclear (ó﹏ò。)ummm, lemme just explain properly how the save feature is going to (or supposed to) work. So there are two scenerios . ** When not signed in** When you are not signed it, you will still be able to access all the feature of the site, even the save button. But there is a catch. All your saved animes/mangas will be stored on the localstorage . Just a small explaination just in case you have no idea of what localstorage is, ummm… In simple terms you can think it as the browser’s storage area, its typically around 4 MB or 5 MB i assume, but they should be more than enough to us as we are just storing the anime/manga url, source, id and stuff.. lets not go too deep into itദ്ദി(˵ •̀ ᴗ - ˵ ) ✧. So you will still be able to save animes/mangas but you would need to be on the same browser with same browser profile to access those info. When signed in When you are signed in, your saved infos will be stored on the database of the server and you will be able to access them from any device and any browser . and This is the reason I am adding the Singup feature Oh… The devlog doesnt seems small any more. I’m i’m i’m sorry for that(ㅅ •᷄ ₃•᷅ ) Lemme wrap up quick umm but wait I will drop the screenshot of the site by pointing at the save button. Currently its with no css, but dont worry I will update that ugly default button design (and maybe position as well) as soon as i finish my backed(・–・;)ゞ I guess thats it for this devlog , If I forget to mention anything , I will surely update it in the next devlog. If you didnt understand any of the point , please do comment and I will try to explain you there ദ്ദി◝ ⩊ ◜.ᐟ Thank You all so much for reading. Have a nice day =)"}, {"post_id": 24613, "ts": "2026-07-08T10:14:54Z", "hours": 5.0, "text": "Devlog #07 Hello Everyone (•◡•) / , Welcome to Devlog #07 of AniSuffle . In this devlog I will be sharing the latest updates and improvements I’ve made to the site. ** Back and Forward History** I have finally added the Back and Forward (a sort of histroy) like feature . Lemme explain it in simple : If you generate a recommendation and another and another and again another and suddenly you feel like going back then you can press the Back button (just beside the Recommend Btn [to left]) and you will be able to review that anime or even manga. And then you can come back to your current one or just click on Recommend Me on the very same point and the new anime will be recommeded to you. Note: Though the anime ahead of you will be cleared out. ** Watch Anime** I have linked Crunchyroll Netflix AnimeSuge (¬‿¬) to my site. Which means when a anime is recommended to you, you will get these options: Crunchyroll Netflix AnimeSuge Watch Trailer Watch trailer on Youtube, it will be displayed only if the trailer link is available on the APIs I used (Jikan,Anilist,Kitsu) for anime. You can click on them and it will open a new tab and will automaticly search the title of the anime on the corresponding platform. [YouTube trailer is embeded on the site so you wont be redirected just to watch the trailer =)] Also Credit to the creator for the hover animation of Netflix Button : https://www.educrush.in/projects/netflix-button-animation And one more thing, Even though clicking on that link wont pinpoint the exact anime all the time since it is sending data on the search box of that corresponding site and redirecting you to that link, but still it should work for most of the anime, if the anime is available on that particular site. ** Read Manga** I have linked MangaDex Viz BookWalker to my site and the working of it also same as that of the manga. One thing I must say (ゝ。∂) This website is made entirely for entertainment, educational and learning purposes only , and it doesnt support any sort of piracy . That’s it for this Devlog I guess thats it for this devlog and if you have any suggestions or question that you think I didnt explain well or enough (always sucked at explaining others but i do try😅) then plz comment below, I will reply as soon as possible. Thank you everyone for reading. Have a nice day =)"}, {"post_id": 24056, "ts": "2026-07-07T11:21:11Z", "hours": 4.0, "text": "Hello Everyone, Welcome to Devlog #06 of AniSuffle. I am very excited (*≧▽≦) to share what I was working on and also what I will be working after this devlog. The biggest milestone for this devlog might be that I have finally integrated all four APIs I mentioned in the early devlogs. (i.e. Jikan, anilistGenreList, mangadexTagId, Kitsu). All four of them are backing up eachother ᕕ( ᐛ )ᕗ. This took quite a while because ya know different APIs has different structure and some return data in so weird format as well. Anyway, the next change I made is background poster change, lemme explain. Before, I had a backgorund of some live color gradient (actually thats a ovel with diffetent color on it and is rotating and has blur effect applied on it though ⊙﹏⊙). But now its changed, at first untill any image from either anime or manga is loaded the backgroundImage remains as the old one but as soon as user clicks on Recommend Me button and image is loaded, the backgorund image changes to the poster image and it looks kinda cool (at least to me ●﹏●). Also it has some blur effect on it as the direct plane image looked kinda weired without blur and a little bit of brightness lowered. And The last update for this devlog which I am really exited to share is Trailerssss!!!! . Now You can also watch the anime trailers, you get the option of Watch Trailer, and when you click the button, it will play the trailer from the YouTube and more importantly you would not even have to leave the site to watch the trailer, which means you wont be redireted to any site, you will stay and watch the trailer on the VERY same site ヽ(⌐■_■)ノ♪♬. (only used Jikan and Anilist as the source of anime Trailer link). and if any Anime doent have trailer integrated then the Watch Trailer button will not appear, it will stay hidden. So, thats not a bug ok =). I will leave a screenshot below =) I guess thats it for this Devlog. If I forget to mention anything, I will defenitiely update you all in the next Devlog. Also, Next I am planning to work on adding forward and backward option, if you dont get it right now, please dont worry I will be explaining it once I have successfully added it. and I am thinging of adding favourite or watch later like section. I guess thats it for this devlog. Thank you so much for reading. Have a nice day =)"}, {"post_id": 23504, "ts": "2026-07-06T14:59:47Z", "hours": 5.0, "text": "Hello Everyone , Welcome to Devlog #05 of AniSuffle Finally some good news to share (>‿◠)✌. Jikan API Ban Recovery While working on the site, I ended up sending too many request on the jikan API and it temporarily got my IP address banned and thankfully thats over now \\0-0/ and I was still able to make some good progress during that time , as i worked with another API (i.e anilist) and guess what it worksssss!!!! (the structures of different APIs are so different so its kindaa abit ….. you know..) Poster Improvement One of the imporvement is the poster display of the anime. Now the poster can resize itself as the size of the image changes, with a small transition between them (it looks kinda cool to me) Also the information is displayed in quite orgainzed way as well (though i removed the scroll on the description as that seemed abit off) currently it displays title, ratings , released date , status (like its onging or finished releasing ). Screenshot I will drop the image below \\0_0/ High Rated First I have also made a little change on how the High reated first feature work , before it used to compare among the few fetched and now it displays the anime/manga with ratings higher than 7 and if not found among currently fetched then it fetches or requests for more data . I also decided to add a name at the bottom right of the API to see which one is fetched from which (i mean the info) . Notch Change Also I forgot to mention one thing that the notch (apple like degin will disapear when the image is loaded as that looked abit kind of starnge wit the image but still it will appear while the image is in loading state(or when its not totally laoded). If I didnt forget to mention anything then thats it for this devlog . If I didnt make anything clear then please consider commenting , I will Try again to expalin =) Thank you so much for reading . Have a nice day =)"}, {"post_id": 23207, "ts": "2026-07-06T00:58:11Z", "hours": 5.0, "text": "Devlog #04 Hello everyone , Welcome to the devlog #04 of AniSuffle, (A site which recommends you random anime or manga , you can also choose genre of your choice). Recently , I have been facing an issue with the Posters. Actually the size of posters of different for different anime (some are potrait , some are landscape , some are square and some are soooo huge and if i compress them to one size the quality of the image is lost and it looks sooo bad (╥﹏╥)) . But I still plan to keep on working on it (I will try…). A new feature A new feature , I have added a feature “ High rated First ” . Its going to recommend you some of the High rated anime. (Not the highest of all time ,or else if i call for the highest rated anime/manga only then only one might repeat , so i tried making the feature work for high rated animes or mangas). I hope I was able to make you clear , if not plz do comment and I will try again to explain =) **Info about the API ** Currently I am fetching the data from Jikan API . I will leave the API link below if anyone wants to check it out . also, since its a free API , it has a few limitations. Its abit slow and request limit is also low , and thats why I will be trying to fetch APIs from few more other free APIs , I will provide there link below as well . I guess thats it for this devlog . If I get any update to share , I will definitely write another Devlog . Thank You so much for reading. //planning to fetch info from them jikanBaseUrl = https://api.jikan.moe/v4 anilistUrl = https://graphql.anilist.co mangadexUrl = https://api.mangadex.org kitsuUrl = https://kitsu.io/api/edge Have a nice day (ง︡’-’︠)ง **Also here is a quick shot of what my site looks right now (╥﹏╥) **"}, {"post_id": 22618, "ts": "2026-07-05T05:15:09Z", "hours": 4.0, "text": "Hello everyone , Welcome to the **Devlog #03 ** of AniSuffle Here’s a quick update on what i’ve been working on .Till now I wasnt able to make much progress on the JavaScript side , especially the API integration part . Instead , I spent most of my time improving the design of the card (in which anime/manga poster will be displayed). I worked on adding some borders and tried to make the card look abit cooler by adding the apple notch (the top part, i am not sure but i guess its called notch,maybeeee…..) . I might still make more changes on it , i m done totally satisfied with it (╥﹏╥). On the top of that , I added almost every anime/manga genre that I could find online , and the users will also be able to genre on the basis of genre selected . Thats pretty much everything , for this devlog . Thank You so much . Have a nice day (˶ˆᗜˆ˵) Here is a quick shot of the project :"}, {"post_id": 22164, "ts": "2026-07-04T14:16:22Z", "hours": 4.0, "text": "Hello everyone , Welcome to another Devlog #02 of AniSuffle! I just changed the look of the website (had to write whole html and css as my new design was conflicting with the old one (╥ ᴗ ╥) ) But I am satisfied with the new look (atleast for now (ᵕ—ᴗ—)). [I might see new design on Insta (。ŏ﹏ŏ)] And more importantly I made a seperate section for** Manga** as well which means Not only anime but AniSuffle will be recommending Manga as well (i mean i’ll try). I am currently working on the functionality of the site . Thank you so much , here is the latest screen shot . Have a nice day"}, {"post_id": 19650, "ts": "2026-07-01T00:59:35Z", "hours": 4.0, "text": "Devlog #01 Hello, Everyone ! I started working on a project “AniSuffle”. Let me tell you about what I did so far and what I will be doing ahead . I am planing to make a website where you can get anime any random anime recommendation . I would try to integrate multiple APIs on the same site as one API get exhausted pretty quickly . Till now , I have learned to make a live gradient like effect for the background and also made animation for the cards and text , whenever the site loads. Will report again soon . Thank You ! Have a nice day =)"}]...
|
Title: AniSuffle by @PAPER_01 | Stardance
Devlogs Title: AniSuffle by @PAPER_01 | Stardance
Devlogs:
Devlog #01 Hello, Everyone ! I started working on a project “AniSuffle”. Let me tell you about what I did so far and what I will be doing ahead . I am planing to make a website where you can get anime any random anime recommendation . I would try to integrate multiple APIs on the same site as one API get exhausted pretty quickly . Till now , I have learned to make a live gradient like effect for the background and also made animation for the cards and text , whenever the site loads. Will report again soon . Thank You ! Have a nice day =)
Hello everyone , Welcome to another Devlog #02 of AniSuffle! I just changed the look of the website (had to write whole html and css as my new design was conflicting with the old one (╥ ᴗ ╥) ) But I am satisfied with the new look (atleast for now (ᵕ—ᴗ—)). [I might see new design on Insta (。ŏ﹏ŏ)] And more importantly I made a seperate section for** Manga** as well which means Not only anime but AniSuffle will be recommending Manga as well (i mean i’ll try). I am currently working on the functionality of the site . Thank you so much , here is the latest screen shot . Have a nice day
Hello everyone , Welcome to the **Devlog #03 ** of AniSuffle Here’s a quick update on what i’ve been working on .Till now I wasnt able to make much progress on the JavaScript side , especially the API integration part . Instead , I spent most of my time improving the design of the card (in which anime/manga poster will be displayed). I worked on adding some borders and tried to make the card look abit cooler by adding the apple notch (the top part, i am not sure but i guess its called notch,maybeeee…..) . I might still make more changes on it , i m done totally satisfied with it (╥﹏╥). On the top of that , I added almost every anime/manga genre that I could find online , and the users will also be able to genre on the basis of genre selected . Thats pretty much everything , for this devlog . Thank You so much . Have a nice day (˶ˆᗜˆ˵) Here is a quick shot of the project :
Devlog #04 Hello everyone , Welcome to the devlog #04 of AniSuffle, (A site which recommends you random anime or manga , you can also choose genre of your choice). Recently , I have been facing an issue with the Posters. Actually the size of posters of different for different anime (some are potrait , some are landscape , some are square and some are soooo huge and if i compress them to one size the quality of the image is lost and it looks sooo bad (╥﹏╥)) . But I still plan to keep on working on it (I will try…). A new feature A new feature , I have added a feature “ High rated First ” . Its going to recommend you some of the High rated anime. (Not the highest of all time ,or else if i call for the highest rated anime/manga only then only one might repeat , so i tried making the feature work for high rated animes or mangas). I hope I was able to make you clear , if not plz do comment and I will try again to explain =) **Info about the API ** Currently I am fetching the data from Jikan API . I will leave the API link below if anyone wants to check it out . also, since its a free API , it has a few limitations. Its abit slow and request limit is also low , and thats why I will be trying to fetch APIs from few more other free APIs , I will provide there link below as well . I guess thats it for this devlog . If I get any update to share , I will definitely write another Devlog . Thank You so much for reading. //planning to fetch info from them jikanBaseUrl = https://api.jikan.moe/v4 anilistUrl = https://graphql.anilist.co mangadexUrl = https://api.mangadex.org kitsuUrl = https://kitsu.io/api/edge Have a nice day (ง︡’-’︠)ง **Also here is a quick shot of what my site looks right now (╥﹏╥) **
Hello Everyone , Welcome to Devlog #05 of AniSuffle Finally some good news to share (>‿◠)✌. Jikan API Ban Recovery While working on the site, I ended up sending too many request on the jikan API and it temporarily got my IP address banned and thankfully thats over now \0-0/ and I was still able to make some good progress during that time , as i worked with another API (i.e anilist) and guess what it worksssss!!!! (the structures of different APIs are so different so its kindaa abit ….. you know..) Poster Improvement One of the imporvement is the poster display of the anime. Now the poster can resize itself as the size of the image changes, with a small transition between them (it looks kinda cool to me) Also the information is displayed in quite orgainzed way as well (though i removed the scroll on the description as that seemed abit off) currently it displays title, ratings , released date , status (like its onging or finished releasing ). Screenshot I will drop the image below \0_0/ High Rated First I have also made a little change on how the High reated first feature work , before it used to compare among the few fetched and now it displays the anime/manga with ratings higher than 7 and if not found among currently fetched then it fetches or requests for more data . I also decided to add a name at the bottom right of the API to see which one is fetched from which (i mean the info) . Notch Change Also I forgot to mention one thing that the notch (apple like degin will disapear when the image is loaded as that looked abit kind of starnge wit the image but still it will appear while the image is in loading state(or when its not totally laoded). If I didnt forget to mention anything then thats it for this devlog . If I didnt make anything clear then please consider commenting , I will Try again to expalin =) Thank you so much for reading . Have a nice day =)
Hello Everyone, Welcome to Devlog #06 of AniSuffle. I am very excited (*≧▽≦) to share what I was working on and also what I will be working after this devlog. The biggest milestone for this devlog might be that I have finally integrated all four APIs I mentioned in the early devlogs. (i.e. Jikan, anilistGenreList, mangadexTagId, Kitsu). All four of them are backing up eachother ᕕ( ᐛ )ᕗ. This took quite a while because ya know different APIs has different structure and some return data in so weird format as well. Anyway, the next change I made is background poster change, lemme explain. Before, I had a backgorund of some live color gradient (actually thats a ovel with diffetent color on it and is rotating and has blur effect applied on it though ⊙﹏⊙). But now its changed, at first untill any image from either anime or manga is loaded the backgroundImage remains as the old one but as soon as user clicks on Recommend Me button and image is loaded, the backgorund image changes to the poster image and it looks kinda cool (at least to me ●﹏●). Also it has some blur effect on it as the direct plane image looked kinda weired without blur and a little bit of brightness lowered. And The last update for this devlog which I am really exited to share is Trailerssss!!!! . Now You can also watch the anime trailers, you get the option of Watch Trailer, and when you click the button, it will play the trailer from the YouTube and more importantly you would not even have to leave the site to watch the trailer, which means you wont be redireted to any site, you will stay and watch the trailer on the VERY same site ヽ(⌐■_■)ノ♪♬. (only used Jikan and Anilist as the source of anime Trailer link). and if any Anime doent have trailer integrated then the Watch Trailer button will not appear, it will stay hidden. So, thats not a bug ok =). I will leave a screenshot below =) I guess thats it for this Devlog. If I forget to mention anything, I will defenitiely update you all in the next Devlog. Also, Next I am planning to work on adding forward and backward option, if you dont get it right now, please dont worry I will be explaining it once I have successfully added it. and I am thinging of adding favourite or watch later like section. I guess thats it for this devlog. Thank you so much for reading. Have a nice day =)
Devlog #07 Hello Everyone (•◡•) / , Welcome to Devlog #07 of AniSuffle . In this devlog I will be sharing the latest updates and improvements I’ve made to the site. ** Back and Forward History** I have finally added the Back and Forward (a sort of histroy) like feature . Lemme explain it in simple : If you generate a recommendation and another and another and again another and suddenly you feel like going back then you can press the Back button (just beside the Recommend Btn [to left]) and you will be able to review that anime or even manga. And then you can come back to your current one or just click on Recommend Me on the very same point and the new anime will be recommeded to you. Note: Though the anime ahead of you will be cleared out. ** Watch Anime** I have linked Crunchyroll Netflix AnimeSuge (¬‿¬) to my site. Which means when a anime is recommended to you, you will get these options: Crunchyroll Netflix AnimeSuge Watch Trailer Watch trailer on Youtube, it will be displayed only if the trailer link is available on the APIs I used (Jikan,Anilist,Kitsu) for anime. You can click on them and it will open a new tab and will automaticly search the title of the anime on the corresponding platform. [YouTube trailer is embeded on the site so you wont be redirected just to watch the trailer =)] Also Credit to the creator for the hover animation of Netflix Button : https://www.educrush.in/projects/netflix-button-animation And one more thing, Even though clicking on that link wont pinpoint the exact anime all the time since it is sending data on the search box of that corresponding site and redirecting you to that link, but still it should work for most of the anime, if the anime is available on that particular site. ** Read Manga** I have linked MangaDex Viz BookWalker to my site and the working of it also same as that of the manga. One thing I must say (ゝ。∂) This website is made entirely for entertainment, educational and learning purposes only , and it doesnt support any sort of piracy . That’s it for this Devlog I guess thats it for this devlog and if you have any suggestions or question that you think I didnt explain well or enough (always sucked at explaining others but i do try😅) then plz comment below, I will reply as soon as possible. Thank you everyone for reading. Have a nice day =)
Devlog #08 Hello everyone(˶ᵔᗜᵔ˶)ノ゙, Welcome to Devlog #08 of AniSuffle . Hope you all are doing great. Okay, now let me explain quickly of my recent changes or update on the site. I am not sure but maybe this will be abit shorter devlog, maybeeee(ᵕ—ᴗ—)…. since most of the work is about backend (so nothing flashy to explain) also I will try to not bore anyone reading this.[also i try keeping the devlogs raw and unfiltered] Okay now lemme explain. Save Button & Auth Feature Sooo, the feature I have recently added to my site, actually not added, am still working on it is the save button and also adding a auth feature (the login and signup feature to be more simple =)) . Its not complete though. And one more thing, you definitely dont need to login or signup to use any of the features and tools I have made so far beacuse I understand that signing up is such a pain, I mean at least to me it isss. But there is one feature I want to add, and for this I think the signup is necessary. Now let me expalin how the save feature is going to work. It might be abit different as I am still working on it, I will just tell what I am planning to do. ** Why am I writing this devlog now?** And before that If you ask why am I writing a devlog if I have not done the job, then ummm…∘ ∘ ∘ ( °ヮ° ) Actually I am working on the backend and I am scared I might mess anything up, as I am not too confident on backend and storing user data safely is my top priority( ◡̀_◡́)ᕤ whenever I am dealing with the backend and while doing this I didnt realize that I have already 5 or maybe 6 hours I am not sure but maybe its around 6 hours of time logged already so I thought of updating the devlog, even though I am in the middle of the function (I mean the development process(ᵕ ó ᴗ ò)). I feel like I sound abit unclear (ó﹏ò。)ummm, lemme just explain properly how the save feature is going to (or supposed to) work. So there are two scenerios . ** When not signed in** When you are not signed it, you will still be able to access all the feature of the site, even the save button. But there is a catch. All your saved animes/mangas will be stored on the localstorage . Just a small explaination just in case you have no idea of what localstorage is, ummm… In simple terms you can think it as the browser’s storage area, its typically around 4 MB or 5 MB i assume, but they should be more than enough to us as we are just storing the anime/manga url, source, id and stuff.. lets not go too deep into itദ്ദി(˵ •̀ ᴗ - ˵ ) ✧. So you will still be able to save animes/mangas but you would need to be on the same browser with same browser profile to access those info. When signed in When you are signed in, your saved infos will be stored on the database of the server and you will be able to access them from any device and any browser . and This is the reason I am adding the Singup feature Oh… The devlog doesnt seems small any more. I’m i’m i’m sorry for that(ㅅ •᷄ ₃•᷅ ) Lemme wrap up quick umm but wait I will drop the screenshot of the site by pointing at the save button. Currently its with no css, but dont worry I will update that ugly default button design (and maybe position as well) as soon as i finish my backed(・–・;)ゞ I guess thats it for this devlog , If I forget to mention anything , I will surely update it in the next devlog. If you didnt understand any of the point , please do comment and I will try to explain you there ദ്ദി◝ ⩊ ◜.ᐟ Thank You all so much for reading. Have a nice day =)
Devlog #09 Hello everyone(˶ᵔᗜᵔ˶)ノ゙, Hope you all are doing great. Welcome to Devlog #09 of AniSuffle . In this devlog I will be sharing you all the recent changes I made on my site. Okay… lemme explain. (๑˃ᴗ˂)ﻭ Auth(Login & SignUp) is finally working Soooo… Finally the Auth(Login and SignUp) feature is working. (≧▽≦) You can now login and save your info on the database and you would be able to login into another device and access your list / saves. I am planning to work on the email verification system as well, but dont worry I will be explaining you all how you can get a disposable email if you dont want to use your personal email, (I respect your Privacy(ᵔᵕᵔ)). Save Feature Also the save feature is now working just like I mentioned earlier. But for now you would have to login to use it. But dont worry. Before I ship this site, I will integrate the localstorage feature , to make the save feature work even without the signing in. I know signing up is kind of annoying sometimes… at least to me it is. ( ̄▽ ̄) So I wanted everyone to still be able to use the save feature even without making an account. Saved Anime & Manga Currently the stored anime and manga are stored in the same place[To be more specific they will be displayed on the same save list ]. But I guess I will make a seperate list for them. I will update in the upcoming devlog about it if I do make that change. (•̀ᴗ•́)و UI Changes Becuase of the sign up and login option the Anime and Manga buttons are on the center for now. I dont really like how it looks either. (ᵕ—ᴗ—) So I am planning to move those buttons back to the right side again. And also add a Hamburger menu (just in case you dont know… It’s The three horizontal line menu, actually i didnt know either before googling it just before writing this devlog (╹ڡ╹ )) . That menu will probably contain more features as I continue working on the site. Backend Debugging Most of my time actually went into debugging. (ó﹏ò。) For some reason I just couldnt figure out why my data wasnt being stored correctly. Sometimes it would save. Sometimes it wouldnt. Sometimes the stored data just refused to show itself in the list (probably it was abit shy (´꒳`)) . So… that took quite a bit longer than I thought. (・–・;)ゞ But yeah, finally things seems to be working [At least for now (・–・;)ゞ] Oh… The last devlog went incredibly long even though I thought it would be shorter… Looks like this one also became longer than I expected. (ㅅ •᷄ ₃•᷅ ) . (My apologies) I dont want to bore ya all. (´▽`) But still I hope I was able to make everything clear. If not, please do comment below and I will try my best to explain it there as well. ദ്ദി◝ ⩊ ◜.ᐟ Thank You all so much for reading. Have a nice day =)
Devlog #10 Hello everyone (˶ᵔᗜᵔ˶)ノ゙, Hope you all are doing great. Welcome to Devlog #10 of AniSuffle . Ok this time I will keep the devlog abit shorter maybe… (ᵕ—ᴗ—) Lets start The first and main change for this devlog is the Ripple like animation when you click the image. (Its just like the circle expanding from a point when you throw a stone on a still lake or pound.) Hope you like it! (๑˃ᴗ˂)ﻭ . Also a little bit change in brightness near the cursor ;) I will keep a video of the clip. As I told in previous devlog, I have finally seperated the Anime and Manga section in the save list, and also I kept the Sign In and Login option in the hamburger menu (the three horizontal lines). (。•̀ᴗ-)✧ A small optimization, I have added the APIs in the head section of HTML with rel="preconnect" , so that the connection is established as soon as the site loads. (Just keeping APIs ready for fetching data from them.) ( •̀ ω •́ )✧ Also just to avoid confusion , you will not need to signin to save the anime/manga when i finally ship the project , I am still working on it . (ó﹏ò。)It is just a sample and doesnt represent the final product =) Also the save button on Manga section didnt worked before refreshing the site , and I will be transparent , that it was fault of my site and I am still trying to figure it out (ó﹏ò。) In the video I have wrote a random email , they might not work when I ship it, its just a dummy after all. ( ̄▽ ̄*) I will like to end the devlog now. (ᵔᗜᵔ) If anything was unclear please comment, I will try to explain again there. (╹◡╹) Thank you for reading! Have a nice day! (≧▽≦)ノ
Devlog #11 Hello everyone (˶ᵔᗜᵔ˶)ノ゙, Welcome to Devlog #11 of AniSuffle . Hope you all are doing great. (≧▽≦) In this devlog, I’ll be sharing the recent changes and improvement i have mad on the site. Ummm.. This devlog will be abit longer, but I want to make sure I explain everything correctly. (ᵕ—ᴗ—) Soooo lets start~ SVG Animation The first update is the addition of SVG animation beside the title. I have also replaced the placehodler (those book and video like emoji) that was displayed on the poster card with the same svg (but the animation will be different). (。•̀ᴗ-)✧ Also about the source of the svg, For the “anime” svg, I got it from AnimeJs and i asked AI to make another svg “manga” , honestly it was quite difficult to make AI understand what I really wanted on the svg, and its still not perfect but ummm its fine and I hope you like those. ( ̄▽ ̄*) LocalStorage Also I have now integrated localStorage so, now you wont have to be logged in to save anime and manga anymore. (๑˃ᴗ˂)ﻭ It works in this way, lemme explain in simple: If you are logged out and you saved few anime/mangas and then you signned in, then all your localStorage saves will be automatically be transfered to the database (and your localStorage will be empty, I had to do this so that There is no duplicate data). ( •̀ ω •́ )✧ Email Verification And the most time consuming, I have integrated email verification which means now, the email you signup with should be a valied email (you can nomore login/signup with [email protected] ). And currently i have used brevo for sending emails and i m on free trial so it has the limit of 300 emails per day , And I assume its more than enough for me right now,also the code expires in 1 hour. (╹◡╹) . [I had to keep authorizing my ip address while setting it up and i thought it was error on my code and I was searching it for hours (╥﹏╥)] I will tell you how you can get a dummy email (just in case you dont know how to get one) if you want to check the authentication system without using your personal email [especially if you are a reviewer reading this.] but anyone willing to test it, you can use that method. But I will be doing that in the next devlog… probably, as In this devlog i might upload the video of showing current updates. (= ̄ω ̄=) I guess I will keep this much for this devlog. I hope I made things clear. [You might have seen manga on the save list even though i didnt add that in this video , and lemme make things clear, it was imported from the localstorage , which i have saved while checking my project =] If anything was unclear then please do tell me. (◕‿◕)♡ Helper tools SVG : https://animejs.com/documentation/svg/createdrawable SMTP : https://www.brevo.com/ Thank you so much for reading. (≧▽≦)♡ Have a nice day! (˶ᵔᗜᵔ˶)ノ゙
Devlog #12 Hello everyone!! (˶ᵔᗜᵔ˶)ノ゙ Welcome to Devlog #12 of Anime Shuffle ! (≧▽≦) Hope you all are doing great! (๑˃ᴗ˂)ﻭ This devlog will be a bit shorter (Hopefully….) , but I wanted to share the final updates before the release because… ** Yep… we’re shipping soon!!** (ノ◕ヮ◕)ノ*:・゚✧ Hopefully within the next two days! (ᵕ—ᴗ—) Intro Animation The first thing I added is a small intro screen (around 7–8 seconds long) where you’ll be asked to enter a username. (ᵔᗜᵔ) Don’t worry, I’m not checking whether the username is already taken or not (just yet). You can type anything you want here. The purpose of this intro is simply to make the experience feel a bit more personal and fun. (。•̀ᴗ-)✧ I hope you’ll like it! =) When you eventually sign up, you’ll enter your username again, and that one will need to be unique. (ᵕ—ᴗ—) After entering your name, a short animated intro will play before taking you into the site. (✧ω✧) And yes… I used AI to help create this animation. Not completely, but it definitely helped speed things up. ( ̄▽ ̄)ゞ I also changed the background of the site because the previous one made some buttons a little difficult to see. I received that as feedback, so thank you very much! The site now uses a live wallpaper instead, which should make everything much clearer. I hope you will like that (ó﹏ò。) ** Double Tap = Save** Just like on social media apps, you can now double-tap (or double-click) an anime or manga poster to save it instantly. (☞゚ヮ゚)☞ When you do, a small star animation appears , yeyyy…. ** Email Verification Improvements** I also made a few improvements to the email verification system. (。•ᴗ•。) The verification email has been redesigned slightly so that the verification code is much easier to spot and copy. (´꒳`) ** Shipping Soon…** That’s pretty much it for this devlog! (ノ´ヮ`)ノ*:・゚ Right now I’m focusing on making the site fully responsive across different screen sizes. ૮₍ ˃ ⤙ ˂ ₎ა Also, the email shown in the disposable-email demo video isn’t the actual email theme used by AniShuffle. The disposable email website simply couldn’t render the HTML email correctly. (╥﹏╥) After that’s done, I might write one final devlog before releasing it… or maybe I’ll just ship it immediately. (¬‿¬) My goal is to release Anime Shuffle within the next two days , so stay tuned! (๑>◡<๑) ** Note for Reviewers** If you’re reviewing Anime Shuffle and don’t want to use your personal email address , don’t worry! I’ll also include a short guide video showing **how to get a free disposable (dummy) email,just in case you dont know ** so you can test the authentication system without using your own email. (。•̀ᴗ-)✧ Of course, anyone is welcome to use it—not just reviewers. =) Thank you so much for reading and for following the development journey. It really means a lot! (づ。◕‿‿◕。)づ See you all in the next devlog… or maybe in the release post! (ᵔᗜᵔ) If anything was unclear, please let me know. I’d really appreciate the feedback! Have a wonderful day! (。♥‿♥。)
Devlog #13 Hello everyone!! (˶ᵔᗜᵔ˶)ノ゙ Welcome to Devlog #13 of Anime Shuffle ! (≧▽≦) Hope you all are doing well! (๑˃ᴗ˂)ﻭ This will probably be one of the shortest devlogs before the release, but I wanted to share one last little update. (ᵔᗜᵔ) ** Font Updates** I made a few typography changes to make the site feel a little cleaner and more unique. The Anime Shuffle title on the top-left now uses the Godber font. The titles of the anime/manga cards, along with the “High Rated First” label, now use the Morien font. They’re small changes, but I think they give the site a much nicer personality. (。•̀ᴗ-)✧ ** Responsiveness** I totally forgot to mention, I also added Responsiveness, even though it’s not best as the site is optimized mainly for laptop/PC screen but…. Umm it’s not worst (๑•﹏•) ** Shipping Today…?** If everything goes well on the server side, I’ll be shipping Anime Shuffle today! (ノ◕ヮ◕)ノ*:・゚✧ Hopefully there won’t be any last-minute bugs deciding to appear out of nowhere… (╥﹏╥) Fingers crossed! (๑•̀ㅂ•́)و✧ Any questions , please let me know Thank you all so much for being part of this journey. (づ。◕‿‿◕。)づ It has genuinely meant a lot to me, and I really appreciate everyone who took the time to read the devlogs, give feedback, and support the project along the way. Thank you so much! (´꒳`)♡ Have a wonderful day! (。♥‿♥。)
Hello everyone I was late for class while deployign the site so I M WRITING IT IN CLASS RN (・–・;)ゞ(teacher might come anytime now)But I wanted to share this project so bad . Thank you Here is the link : https://shrestha-project-07.wuaze.com Bye
We are finally shiping!!!!⸜(。˃ ᵕ ˂ )⸝♡ Here is the link https://shrestha-project-07.wuaze.com
Devlog #14 Hello everyone, Welcome to Devlog #14 of AniSuffle ! (≧▽≦) Okay, so this is the first devlog after I have shipped the project. And yes… I’m still working on the project. ( ̄▽ ̄)ゞ Thanks to @Gideonthegreat for the feedbacks! Yeah, I mean, I got some awesome feedback, and I really wanted to add more and make more changes. (๑•̀ㅂ•́)و✧ After thinking and looking around the code for a while… (and staring at it for way longer than I should have) I finally decided to integrate the Hover to Play Trailer feature first . I did not want to just replace the click ripple animation. That’s why I decided to add it as an option ,you can click on the hamburger menu (the three horizontal lines in the top-right corner), where you can turn the Hover to Play Trailer option on and off. ヽ(・∀・)ノ. [I will update the live site later on, as i am still working on it (ó﹏ò。)] It is still not complete. (ᵕ—ᴗ—) I’m still working on it! So I’ll show you a demo video[My laptop is potato so the video is abit laggy, plz dont mind that], but please don’t take it as the final version. I’m still thinking of making more changes to it… hehehe. (,,¬﹏¬,,) I accept that I still need to optimize this feature, and the clip was short as my laptop was lagging alot 😭 (see the CPU usage ( top blue bars)) Maybe I’ll end up changing something again before the next devlog. Who knows? (☞゚ヮ゚)☞ I guess that’s it for this devlog! (ノ◕ヮ◕)ノ*:・゚✧ I will still love feedback if you have any =) Thank you so much for reading! <(_ _)> See you in the next one Thank you again and have a nice day =)
Devlog #15 Hello everyone, Welcome to Devlog #15 of AniSuffle ! So first, I have a few announcements. I got some more feedback, and in respect of those, I will now be making the devlogs shorter and use limited/less kaomoji (ó﹏ò。), so that you can read the devlogs more clearly. Update So, I have finally finished working on the Hover to Play Trailer feature. I just have a mute and unmute button which will be displayed on the trailer when hovered. When hovering, for a few seconds, it will also show titles, the YouTube logo, and other YouTube things. I tried to hide those but was unable to. When I asked AI, it told me that it was not possible. Rather, it gave me alternative ways, which I thought would not be a great user experience, so I left it as default. (ᵕ—ᴗ—) I had a hard time fixing the overlapping of the hover and click animations, but those are finally gone. Now I guess that’s it for this devlog. Thanks for reading! <(_ _)> Have a nice day! =)
Devlog #16 Hello everyone, Welcome to Devlog #16 of AniSuffle ! Update I have made few changes , I changed the Hover Trailer text from Hover Trailer On / Off to a checkbox ,as I found a cool looking (i guess it is) checkbox on a site and also a mute and unmute btn . So I changed them . I will keep a clip below rather then explaining with words . ##Credit Mute Btn (when hover trailer is on) : https://uiverse.io/catraco/dry-robin-61CheckBox Animation (On hover trailer) : https://uiverse.io/00Kubi/hot-dragonfly-56 I would not expand the devlog anymore Thanks for reading! <(_ _)> Have a nice day! =)
Devlog #17 Hello everyone, Welcome to Devlog #17 of AniSuffle ! Update I have changed the background of the intro page and added a video as a background instead (i will provide the link below)(as the old one was AI made, not a copy paste though).There is a skip button in the intro incase its boring for you . Also on one of the feedback , I saw one reviewer was not able to access the for some reason i really dont know why, so now i have moved the site to https://shrestha-project-07.wuaze.com this url, even though the old site will be active , the new updates will be availble on this site only . I might update this link on old devlogs as well. Currently I am working on the trending section , where you will be able to see the trending anime list or in card form, but i will try to make it intresting somehow =) Also , both sites share same database so if you have logged in before then , you can still use that id to login in both site. Credit: https://www.youtube.com/watch?v=1L7mzyGhXCA (there are few edits/cuts i did) I would not expand the devlog anymore Thanks for reading! <(_ _)> Have a nice day! =)
Devlog #18 Hello everyone, Welcome to Devlog #18 of AniSuffle ! I know it has been a while , but to be honest , i dont really have much to show for this devlog . Even though I have been working on something fun to be added in this site. Update I the last devlog I told that I will be working on the treding section ,but while making that I dont know for some reason I wanted to make a game like thing in this site. Lemme give a brief description . so I was thinking of making a Rating Guess game , where you will be shown any 4 anime poster and its name and you would have to choose a anime and you will be given a score and I am also planning to make a leaderboard so that the game feels even more competetive, but the problem is that I dont want to make sign in compulsory and I would need a username for that . So I have been working on the game but still am unsure about the usernames , as asking multiple usernames might be confusing so, I am still thinking on what to do about this. I would not expand the devlog anymore. If you have any question please comment , I will try to explaing things there , thank you so much . Thanks for reading! <(_ _)> Have a nice day! =)
Devlog #19 Hello everyone, Welcome to Devlog #19 of AniSuffle ! First , Our project got SuperStar title and I thank you all,Without ya all my this project would not have got that level of attention. Thanks to all of you and the reviewer for marking it as a SuperStar Project . It made me so happy. Thank you so much (˶>⩊<˶) Update After creating and deleting the same table , the same database many times . I have finally decided to remove the username from the signin option and kept it on the rate game page , which means while signing in you wont have to use username , rather you will sign up using only gmail . Also , I am thinking of linking the gmail with the username automatically after the user has signed in so the progress is stored in the connected account. I am currently working on the backend so there is nothing intresting to show but i will keep the site image for now … I would not expand the devlog anymore. If you have any question please comment ,though I am myself not so sure about the username thing, I mean… I might change the data structure if things go wrong,so if you ask me rn about how i will be storing data exactly then my answer might not be that clear but I will still try , thank you so much . Thanks for reading! <(_ _)> Have a nice day!
Devlog #20 Hello everyone, Welcome to Devlog #20 of AniSuffle ! Update Hey everyone , a quick update . I again changed my plan and I have now decided to use the intro username as the unique username which will be used everwhere , like in the database and the leaderboard. I apologize for creating the confusion but I felt like asking multiple username might be even more confusing (ó﹏ò。). So i planned to stick with the single username to maintain consistency and to avoid confusion. I would not expand the devlog anymore unnecessarily and waste your time. And I hope I made everything clear If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!
Devlog #21 Hello everyone, Welcome to Devlog #21 of AniSuffle ! Update I made a rough templete or a rough design on what the guess highest rating might look like , I mean the structure only , I will change the design and animation later on . Nothing much to explain but I will keep the design image below . Also I am still building the functionality . Right now they only fetch 4 differenct anime poster name and score . I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!
Devlog #22 Hello everyone, Welcome to Devlog #22 of AniSuffle ! Update Ok , so This time I was working on the intro side and I realized that before I changed some data structure while storing the username and i am now COOKED (╥﹏╥). Also I was searching for the error in my backend becuase of which the skip btn never appeared and even after asking ai , It was not able to help me ,and after giving it a tons of screenshots of the project , console and networks , It told me to remove a comment - - . And even more annoying or good thing (i dont even know what to call it anymore) was that the code worked after removing the comment. It made no sense to me , and honestly I still dont know why even that comment was causing the issue . Trust me I stared that code for more than an hour only to remove the comment at the end. Anyway , the code is now working (but i know there are still bunch of more bug to fix), so the main addition i would say rn is the live checking of the username . The username entered will be checked at the live time (every 400ms to be more precise). I guess thats all. I know it might sound like not much addition but it was more debug i did this time - -. I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!
Devlog #23 Hello everyone, Welcome to Devlog #23 of AniSuffle ! Update One more bug ,fixed and found . So, till now the username stored would only be saved if someone entered the name in the intro and played the guess rating game. And now its fixed and Now the username is stored in the database immediately after the username name is submitted in the intro username section. Also One more thing , if someone took the username as “PAPER” and later if someone tries “paper” then the name will not be allowed. I did it just to be safe and later no any confusion or bug to occur just becase of the case of the entered word . I will add a screenshot of username is taken below(As I dont know what screenshot to add on this devlog :p ). I hope I made things clear. If any question or If you feel like I didnt made something clear please do ask me in the comments , I will try my best to clear things up there as well. Thanks for reading! <(_ _)> Have a nice day!
Ships:
# Welcome to the shipping devlog (I guess , I don't know what its called) (≧▽≦) Hey um.. In this section I will be giving the overview of my entire project , I will try to keep things simple and short. *(please read github as i m facing limit issue here)* (╥﹏╥) Ok, so my project **"AniSuffle"** is a webpage where you can get random Anime/Manga recommendations. But there is way more things I worked on , please let me explain. ( •̀ ω •́ )✧ ## Features ### Generate Random Anime/Manga I have integrated **4 APIs** (**Jikan, Anilist, Kitsu And MangaDex**) for fetching Anime/Manga recommendations. Jikan, Anilist and Kitsu can fetch both Anime and Manga while MangaDex fetches Manga only. They all work together as a fallback system, so if one API fails, another will handle it , you (solving the rate limit issue). =) ### Authentication (Login/SignUP) Logging in or signing in is **NOT COMPULSORY**. I repeat , as I can understand that its such a pain, I had to add it so that you could access the list anywhere in any device . **Make sure to enter unique username in the signup page** The only thing it gives you is access to your saved list across different devices. If you don't want to use your personal email while reviewing, you can use a temporary email. I have also uploaded a video in **Devlog #12** showing how to do it Just in case you dont know how to do that =) ### LocalStorage & Database * Not signed in → saves are stored in **LocalStorage**. * Signed in → saves are stored in the **Database**. * Existing LocalStorage saves are automatically transferred to the database after login to avoid duplication. ### Genre Selection You can generate recommendations based on your selected genre. Some APIs name genres differently, so in a few cases you may receive a closely related genre instead. ### Other Features * Embedded YouTube trailers (when available) * Switch between Anime & Manga * High Rated First (7+ rating) * Double click the poster to save * External links to Crunchyroll, Netflix, AnimeSuge, MangaDex, Viz, BookWalker and YouTube (if available on the API) --- ## Detailed Explanation Please read the **README** on the GitHub repository if you'd like the detailed explanation of how everything works. I had to shorten this because I'm exceeding the character limit. (>﹏<) --- Thank you so so so much. I really really really hope you will like this project. (づ。◕‿‿◕。)づ...
|
1792878842.9091005
|
1793742842.9091005
|
|
16571
|
mocha by @Glitchy | Stardance
|
Glitchy
|
1
|
101.0
|
1806
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T18:57:02Z", "hours": 101.0, "multiplier": 17.94, "payout": 1806, "blessing": "neutral", "text": "I made a package manager for Windows, which is somewhat backwards compatible with scoop packages. To be honest there’s still a lot of work that I want to do, but I have exams and college application coming up soon so I can’t. That’s not to say I’m not happy with the state of the ship. At the very least it has all the core features that a package manager should have, but there are still a lot of bugs which is why this is only v0.0.1. The biggest challenge by far was trying to figure out how Scoop does things internally. A lot of stuff just doesn’t have documentation, so you have to dig through the really messy PowerShell source code.", "repo": "https://github.com/Protract-123/mocha", "demo": "https://github.com/Protract-123/mocha/releases/latest"}]...
|
[{"post_id": 67579, "ts": "202 [{"post_id": 67579, "ts": "2026-09-13T18:33:17Z", "hours": 1.7761, "text": "So I wrote a README, added a license (MIT of course) and setup CI/CD so that releases are automatically built and deployed. Honestly I forgot how hard it is to write a good README. You need to get a lot of information through without it looking like a wall of text."}, {"post_id": 67267, "ts": "2026-09-13T10:36:48Z", "hours": 5.8047, "text": "I forgot to make a devlog in between so this will be like 2 bigger devlogs. I parallelized bucket updates, which speeds it up quite a bit. This also allowed me to try out parallelism even more, which I plan to apply throughout the CLI later on. I also added configuration options for the runners which mocha shim will use to run certain file types. For example, you can set the python-runner to select the python version that’ll be used to run python scripts that are shimmed. Downloads now have a progress bar, so you don’t need to wonder whether something is happening or not during a long download. Finally env_set is fully supported since I added the relevant variable parsing. This was pretty much just me cleaning out the TODO list before I ship. I also did a lot of smaller bug fixes and refactors as seen below. fix(commands): prevent app installation if already installed (cb27d07) fix(commands): fix config opening with “start” (74f3679) fix(commands): correctly handle non-apps when upgrading (f7419f6) fix: make LogOutput go to Stdout not Stderr (bc10357) fix: handle empty versions correctly (2287da9) fix(pkg): remove correct temp dir (33189b6) fix(shim): warn for unknown shim extension (622c2b4) fix: skip downloads with no hash by default (69d4e35) fix: use correct timeout for downloads (44e527b) fix: drop unnecessary return value from GetExecutableEntries (9fd845c) fix(config): remove unused option (1339971) fix(commands): don’t error for valid results (87c4d6c) refactor(config): rename variables/functions (f253d9d) fix: use unique temp directories (a159e23) refactor: use fmt.Fprintln directly (d2d54bf)"}, {"post_id": 65401, "ts": "2026-09-10T14:55:22Z", "hours": 2.5386, "text": "Lots of small bug fixes and changes, I’ll just list them out: feat(cmd): allow removal of multiple shims in one execution (f2fae3f) fix(manifest): correctly ignore invalid shortcut entries (6a08478) fix(fileops): use correct registry type (5d5d796) fix(config): seed config with defaults (9dfaaff) fix(cmd): use correct release sources (a2a9ba1) fix(cmd): use bucket from install info (5a9109b) I also added support for more file types being shimmed, which helps a lot with compatibility. The file types are .py , .bat , .cmd , .jar and .ps1 ."}, {"post_id": 52474, "ts": "2026-08-22T16:37:15Z", "hours": 4.6758, "text": "Lot of time going into this devlog, but it makes sense since I did do a lot. I did this sweeping refactor of the entire commands module which moved around a lot of code. Essentially each command now gets it’s own directory under the commands module that represents it’s children/parents. For example commands/shim/remove/cmd.go contains code for the mocha shim remove command. Each cmd.go contains a Command struct that has the relevant fields and functions attached to it. This structure just makes things more organized and also means adding test files will be a bit easier since functionality is now isolated. I also sorted out the shim binary. So essentially https://github.com/ScoopInstaller/Shim offers different version of the shim binary which can be installed. Previously I hard coded the code to install cpp v0.1.0 but now users can run mocha shim binary releases to see the options and mocha shim binary setup to install their chosen binary. This also means we actually get the latest releases from GitHub."}, {"post_id": 51141, "ts": "2026-08-20T17:11:51Z", "hours": 3.6722, "text": "Finally got a bit of time to do a bit of development. First thing I did was remove a field from install.json to match scoop . This means that mocha should be a drop in replacement for existing scoop installs. Then I added partial support for env_set and env_add_path . The main thing I need to do to complete the feature is parse variables and replace them with the appropriate paths. These 2 fields are some of the last manifest fields I need to support besides pre/post (un)install hooks."}, {"post_id": 34596, "ts": "2026-07-25T13:39:02Z", "hours": 2.5778, "text": "My summer break has ended so development is going to be a lot slower from now. I added mocha outdated so you can list outdated apps before upgrading them to a newer version. Besides that I tweaked a lot of stuff related to CLI output. For example I changed search to output one table, and simply outputting exact matches at the top of that table. I also changed a lot of messages which were using LogOutput to LogInfo so they use the correct color and output to stderr and not stdout ."}, {"post_id": 31801, "ts": "2026-07-20T14:04:04Z", "hours": 1.5481, "text": "Not sure why I didn’t do this earlier, but I’ve added success messages to commands where it makes sense. Also added a success color to the config so you can change what the success color is. I do still need to improve CLI output quite a bit, but it’s slowly getting there."}, {"post_id": 30693, "ts": "2026-07-18T14:02:54Z", "hours": 2.1922, "text": "I’m writing this one right before F1 Qualifying at Spa! Continuing with the trend of some of my recent work, I improved what table outputs look like to be a little bit more readable. We now use proper separators in the form of Unicode Box Drawing Characters . I also made column alignment configurable, which improves legibility for some commands like mocha bucket list and mocha cache show . I’ve attached an image of the scoop and mocha versions of bucket list so you can compare for yourself."}, {"post_id": 30286, "ts": "2026-07-17T18:51:34Z", "hours": 3.4797, "text": "I love refactoring!!!! I’ll probably end up spending another 20 hours just on refactoring because it’s so fun!!!! This time around I wanted to refactor the code so that our commands orchestrate stuff instead of the helper functions. For example, pkg.Install would first download a package, then install it, and then link it through shims and shortcuts all by itself. This causes issues because it means error messages become slightly worse, and it creates a class of bugs due to edge cases where we don’t necessarily want this order of orchestration. Hence I did a lot of refactoring in the pkg module. I also ended up adding a way to skip verification of downloads when downloading, installing or updating a package through --skip-verify . It’s a useful option in situations where there is a malformed manifest or simply no hash to begin with."}, {"post_id": 30054, "ts": "2026-07-17T10:28:53Z", "hours": 4.6269, "text": "mocha now supports a user defined theme for output colors. In the process I ended up doing a lot of stuff related to the config. First thing I did was swap to fatih/color for colored output, since it handles stuff like colors in command prompt and removing color when output is piped. Then I refactored the config module. Earlier I would pass around a MochaConfiguration object through every function. Now I use a config singleton that’s accessible from any function. Why? Because it means I don’t need to pass the object every time I want to log information. Also means I don’t need to pass mochaDir through almost every function in the codebase. Getting user defined themes was a bit complicated because I needed a good way to handle a default theme so output doesn’t look bad if parsing fails. I handled this by only using the configured theme if every color resolves properly. Otherwise output falls back to the already loaded default theme. Due to this you still get colored output even if there are errors or warning before the configuration and theme is loaded."}, {"post_id": 29066, "ts": "2026-07-15T18:30:47Z", "hours": 4.7214, "text": "So I’ve been doing a bit of refactoring, a bit of bug fixing and a bit of optimization. Essentially just polishing mocha before I work on the next feature. Here’s some of the stuff I did: created tests for ParseRefString to validate behavior cache manifest json between info calls since I/O is really slow bumped dependency versions refactored manifest/info.go Besides that I fixed the uninstall flow since it was really bugged after the latest changes. Essentially mocha would uninstall apps with incorrect info. It would also try to remove shims/shortcuts for apps which don’t have any active shims/shortcuts. I then added a bit of logging since the uninstall command didn’t give any user output for whatever reason (i forgot to earlier)."}, {"post_id": 27086, "ts": "2026-07-12T10:29:45Z", "hours": 6.4975, "text": "This is going to be the equivalent of 2 devlogs since I thought I made one earlier for persists but I didn’t. New feature! We now handle persist items in order to store data between versions. These are files which are persisted between versions of an app. Lets take git as an example to explain why persist exists. Say you want to make sure your git config isn’t deleted every time you update. The issue with this is that the config file is saved in the version specfic directory. To resolve this we can keep the config in $MOCHA_DIR/persist and then symlink the config to where it needs to be, which is essentially what persist tells us to do. Since we handled persist items last time we can now implement mocha upgrade to update apps. The way scoop handles updates is by first removing anything that references the app, like shortcuts or shims . Then we just follow the install process from scratch. This leaves the old version available in case a user wants to revert versions due to a bug, while also updating to the latest available version. This can be seen in the video below, which shows me updating llama.cpp-hip-radeon ."}, {"post_id": 23572, "ts": "2026-07-06T16:39:13Z", "hours": 3.53, "text": "We now create shortcuts! This means any GUI apps should show up properly in the start menu, just like they do when you install with scoop . All I really had to do was a bit of orchestration since I decided to vendor in an implementation from https://github.com/jxeng/shortcut Besides that I expanded the number of apps that are supported by implementing a bit of code that handle architecture specific bin fields, along with bin fields which store 2D arrays. I also cleared up some of the TODO items. I swapped the junction implementation to an implementation from https://github.com/nyaosorg/go-windows-junction since we were previously shelling out to CLI. That and I added a bit more zip bomb protection For the purposes of the video below I changed the location which shortcuts get put to my desktop. It’ll probably be configurable, and match scoop by putting shortcuts in the startup menu by default"}, {"post_id": 22839, "ts": "2026-07-05T13:36:18Z", "hours": 3.3089, "text": "As I mentioned in the previous devlog I added good help information to every bit of the CLI. It’s surprisingly difficult to write good help messages which explains everything to users in a few words I also changed the behaviour of the mocha cache clear command to not clear all cache by default. That’s now gated behind the --all flag in order to match scoop a bit more"}, {"post_id": 21420, "ts": "2026-07-03T11:02:24Z", "hours": 1.0722, "text": "Typically I don’t want to make devlogs for small stuff like this, but this is something I found really cool. So I was working on help messages for all the commands when I realized that mocha bucket list felt a bit slower than pretty much every other command. This is because we need to shell out to git 2 times per bucket, and I had 4 buckets added. While 8 git commands might not sound like a lot, it was enough to make mocha bucket list feel slow. So what I did is I parallelized the metadata fetching through an errgroup . Instead of fetching the metadata for each bucket in order, we fetch the metadata for all 4 buckets simultaneously. This led to a big performance uplift. About 3 times faster than the old version of mocha , and just over 12 times faster than scoop for this operation. See the video below."}, {"post_id": 21386, "ts": "2026-07-03T09:17:07Z", "hours": 2.2464, "text": "I finished up mocha uninstall and mocha list , which means you can actually manage installed apps instead of manually deleting them. There’s not much that goes into mocha uninstall . You just need to remove the relevant shims and app directories since the apps that mocha supports are all portable. mocha list is similarly simple. It’s just loops over the directories in $MOCHA_DIR/apps and looks for apps along with the versions installed for each app."}, {"post_id": 19910, "ts": "2026-07-01T10:53:02Z", "hours": 5.4625, "text": "So I added support for more apps by implementing more extractors. This means in theory any apps which don’t need a pre-install or post-install should work. To be more specific, I handle a few more properties on manifests. Those being extract_dir and innosetup , which inform how an app needs to be installed. I also implement 7zip and innounp as extractors to support more file formats which applications are distributed in. Of course there’s still a lot of work before I consider this ready for public use. I need to create commands for some basic operations like uninstalling, updating and listing apps. I also need to handle shortcuts otherwise GUI apps can’t be accessed from the start menu. Besides that I need to improve the user experience. As you can see in the video below mocha just sort of dumps everything to the console even if it’s not relevant. Help menus are also critical to get working properly."}, {"post_id": 18238, "ts": "2026-06-29T09:51:16Z", "hours": 3.7839, "text": "Finished up the code cleanup in commands , fileops and manifests . I did catch a few edge cases and some incorrect behavior in the process, which is why I always spend so much time reviewing code. I did use AI to assist with code review because I think it’s an area where AI shines. AI is really good at finding small errors or inconsistencies in the codebase which I probably wouldn’t notice. For example, it identified that the ManifestReferences argument was not a required argument for the download command, which meant no help message was displayed on incorrect usage like the other commands. One big thing I will work on eventually is console output. Right now errors are well formatted but a lot of the time commands just run stuff without providing a lot of insight into what actions they are taking which isn’t great. Even the help menu is pretty useless right now (see the image below). Extra context: A manifest reference is a pointer to an app (e.g. main/ [email protected] )"}, {"post_id": 17027, "ts": "2026-06-27T17:10:53Z", "hours": 5.3025, "text": "Before working on more features and expanding the amount of apps mocha actually supports I wanted to go through the codebase and do a lot of cleanup since the codebase is quite messy. There are silly mistakes in some files and bad implementations in others. Hence the time I spent during this period was focused on moving code to where it should be and cleaning up some edge cases, specifically related to the bucket , config and shim modules. A good example of this is moving the code to get the active config to the config module instead of leaving it in main.go . Next up will be refactoring the commands , fileops , and manifest modules. I don’t have much to show so I figured I would present a feature I added but didn’t show earlier: the ability to skip cache hits with the --force flag when installing or downloading an app. Some context I forgot to add initially: I renamed the app module to manifest since I felt it was more accurate to what it actually handles scope wise."}, {"post_id": 15814, "ts": "2026-06-25T18:17:50Z", "hours": 2.5558, "text": "Huge milestone!!! I’ve gotten mocha install working for very basic apps! This means the entire process of downloading a file, then extracting it, then creating a junction and finally creating a shim now works for basic pieces of software! So in terms of what I actually did this devlog, I added cache hits to the download command since it’s relevant to the install command. I then implemented the aforementioned .zip extraction and junction creation. Then all that was left was a bit of orchestration, getting everything to work together properly. See a working install of innounp using mocha install below!"}, {"post_id": 15668, "ts": "2026-06-25T14:03:10Z", "hours": 0.7572, "text": "mocha update is another command which does very little but is very important. All it does is update the known_buckets file, and run git pull on all added buckets to update them. It can also update just the buckets you specify if you pass in an argument. I do need to improve the output of the command since it outputs raw git right now, but at least it’s functional. See the demo below."}, {"post_id": 14392, "ts": "2026-06-23T14:41:51Z", "hours": 6.9436, "text": "Spent a bit longer between devlogs this time, but it was worth it. So I realized the error messages were really bad. I was pretty much just passing errors up the call stack without adding any context, which isn’t great since it means our error messages will be useless to people reading them I therefore went through every single file of the codebase and wrote good error messages which add a bit of context every time we pass it up the call stack. I also did a bit of refactoring where I thought it would be worth it. For example in the shim module I now set the PE subsystem of the shim binary while it’s in memory instead of writing to disk twice. A few good examples of what the new error messages look like can be seen in the video below."}, {"post_id": 13054, "ts": "2026-06-21T10:47:05Z", "hours": 3.4069, "text": "Shims are simple in concept, complicated in reality. So essentially a shim in mocha is just an executable which calls another executable. It’s similar to a shortcut in that sense, except it shows up in $PATH Thankfully the scoop project already has a repository with 4 different implementations for the shim binary, so I can just have mocha shim download one of those binaries. The complicated part was the PE Subsystem. The PE subsystem is basically a bit of info in each binary which tells Windows whether it’s a console application, or a GUI application. We need to set the PE subsystem of the shim exe to the PE subsystem of the binary we are calling for Windows to execute the binary properly. Hence I need to read and write raw binary data. All of this is just the implementation for exe shims. Scoop itself contains implementations for .bat/.cmd , .ps1 , .jar , .py and linux binaries , all of which have wildly different implementations compared to .exe shims. The video below shows the working set of mocha shim commands (those being add , remove and list )."}, {"post_id": 12032, "ts": "2026-06-19T16:57:37Z", "hours": 1.8778, "text": "mocha cache is a simple command. It shows you what files are currently in $MOCHA_DIR/cache directory and it clears them out. One thing I noticed was that scoop cache show actually displays raw bytes instead of human readable file sizes for each cache entry, which is a bit odd since the total they display is human readable. Therefore I made my implementation mocha cache list display human readable sizes since that’s a more reasonable default."}, {"post_id": 11234, "ts": "2026-06-18T11:50:44Z", "hours": 2.2589, "text": "Fuzzy search is really really good. While implementing mocha search I noticed the results returned by scoop search were in alphabetical order, which doesn’t make a lot of sense. If I do scoop search git the first result should probably be git As a result my implementation of search uses github.com/sahilm/fuzzy which is a small library which provides a fuzzy search implementation. Scoop also checks for binary name matches, e.g. package biodiff can provide a binary called git-biodiff and show up in search results. I decided to remove this for now, since I personally find it a bit unnecessary. scoop search also lists all search results, which is okay when results are sorted alphabetically but doesn’t make sense when searches are relevance based. Therefore, by default mocha search will list exact matches plus the 20 most relevant search results. This can be overridden by the --count argument, where setting it to 0 displays all results. A demonstration of mocha search vs scoop search can be seen in the video below."}, {"post_id": 10748, "ts": "2026-06-17T17:14:41Z", "hours": 2.1597, "text": "I finished up mocha download , which surprisingly does a bit more than simply downloading files. The first thing it does is well… download the file. This is a bit more complicated than it seems though, since we need to identify the right file to download based on cpu architecture. Hence the very cursed JSON parsing I had to create. After downloading a file, we also do a hash check. We support the 4 types of file hashes which scoop support, those being sha256 , sha512 , md5 and sha1 . Currently files get downloaded to the $MOCHA_DIR/cache directory like in scoop, however we don’t actually check if there’s anything cached which can lead to repeated downloads. That’s something I’ll need to fix later on"}, {"post_id": 10131, "ts": "2026-06-16T18:54:22Z", "hours": 1.4081, "text": "I was working on the mocha download command so I can sort out fetching files, and during it I realized my current app format makes things a bit weird. mocha cat previously took in a flag for bucket through -b and a name. Scoop on the other hand uses an application reference in the format bucket/name@version . Scoop’s format is really important for downloads and installs, so it didn’t make sense to not standardize it between mocha download and mocha cat . Hence this shorter devlog! See the video below for the new usage (version numbers are ignored for mocha cat )."}, {"post_id": 10004, "ts": "2026-06-16T15:21:57Z", "hours": 2.9753, "text": "I did a bit of refactoring to split the core functionality from the command files. This means that the code for downloading and deleting buckets is separated from the code for the various commands. I’m doing this primarily for better code organization, and also to prevent import cycles. I also finished up the config system I mentioned last time. It’ll be one of the bigger improvements over scoop, which has a basic set of configuration options. TOML was the obvious choice for the config format since it is really easy to read and write. I made sure that you can put it in any of the standard locations, such as %APPDATA% and .config or in $MOCHA_DIR . Running mocha config will open the configuration in your preferred app, and also generate the default config if a configuration hasn’t been detected in any of the valid locations. Currently the configuration can be used to make mocha cat run an external program for printing manifests to stdout . See the video below for an example using bat"}, {"post_id": 8826, "ts": "2026-06-14T17:52:54Z", "hours": 2.6147, "text": "So this is a spot where I think the improvements over scoop start becoming really apparent. The scoop cat command simply prints an app’s manifest to console. However due to the long startup time of PowerShell scripts (scoop is written in PowerShell) basic stuff like scoop cat takes a second. mocha cat on the other hand is nearly instantaneous since it’s a compiled binary with almost 0 startup time. You can see how this plays out in real usage in the video below. I also half baked a config system, but it’s not finished so I’ll talk about that in the next devlog."}, {"post_id": 8586, "ts": "2026-06-14T08:48:35Z", "hours": 2.85, "text": "I finished off the remaining mocha bucket subcommands, those being add , rm and list . These commands manage “buckets” which are pretty much just package sources. mocha bucket add uses git to clone the relevant bucket into the [MOCHA_DIR]/buckets directory. By default MOCHA_DIR is [USER]/mocha mocha bucket list simply loops over the [MOCHA_DIR]/buckets directory and gets relevant info for each bucket. mocha bucket rm removes a bucket by just deleting the folder containing the bucket. For example, removing the main bucket deletes [MOCHA_DIR]/buckets/main"}, {"post_id": 8208, "ts": "2026-06-13T17:32:25Z", "hours": 2.0261, "text": "I started off with something a bit simple: mocha bucket known The known bucket list in scoop is a list of buckets which are known by the package manager in advance. These buckets don’t require the full URL to be used when using scoop bucket sub-commands. For example instead of running scoop bucket add https://github.com/ScoopInstaller/Main you can instead run scoop bucket add main As seen in the video below, mocha bucket known doesn’t do much. First it downloads buckets.json if it doesn’t exist. Then it parses the json and outputs it to console."}]...
|
Title: mocha by @Glitchy | Stardance
Devlogs:
I s Title: mocha by @Glitchy | Stardance
Devlogs:
I started off with something a bit simple: mocha bucket known The known bucket list in scoop is a list of buckets which are known by the package manager in advance. These buckets don’t require the full URL to be used when using scoop bucket sub-commands. For example instead of running scoop bucket add https://github.com/ScoopInstaller/Main you can instead run scoop bucket add main As seen in the video below, mocha bucket known doesn’t do much. First it downloads buckets.json if it doesn’t exist. Then it parses the json and outputs it to console.
I finished off the remaining mocha bucket subcommands, those being add , rm and list . These commands manage “buckets” which are pretty much just package sources. mocha bucket add uses git to clone the relevant bucket into the [MOCHA_DIR]/buckets directory. By default MOCHA_DIR is [USER]/mocha mocha bucket list simply loops over the [MOCHA_DIR]/buckets directory and gets relevant info for each bucket. mocha bucket rm removes a bucket by just deleting the folder containing the bucket. For example, removing the main bucket deletes [MOCHA_DIR]/buckets/main
So this is a spot where I think the improvements over scoop start becoming really apparent. The scoop cat command simply prints an app’s manifest to console. However due to the long startup time of PowerShell scripts (scoop is written in PowerShell) basic stuff like scoop cat takes a second. mocha cat on the other hand is nearly instantaneous since it’s a compiled binary with almost 0 startup time. You can see how this plays out in real usage in the video below. I also half baked a config system, but it’s not finished so I’ll talk about that in the next devlog.
I did a bit of refactoring to split the core functionality from the command files. This means that the code for downloading and deleting buckets is separated from the code for the various commands. I’m doing this primarily for better code organization, and also to prevent import cycles. I also finished up the config system I mentioned last time. It’ll be one of the bigger improvements over scoop, which has a basic set of configuration options. TOML was the obvious choice for the config format since it is really easy to read and write. I made sure that you can put it in any of the standard locations, such as %APPDATA% and .config or in $MOCHA_DIR . Running mocha config will open the configuration in your preferred app, and also generate the default config if a configuration hasn’t been detected in any of the valid locations. Currently the configuration can be used to make mocha cat run an external program for printing manifests to stdout . See the video below for an example using bat
I was working on the mocha download command so I can sort out fetching files, and during it I realized my current app format makes things a bit weird. mocha cat previously took in a flag for bucket through -b and a name. Scoop on the other hand uses an application reference in the format bucket/name@version . Scoop’s format is really important for downloads and installs, so it didn’t make sense to not standardize it between mocha download and mocha cat . Hence this shorter devlog! See the video below for the new usage (version numbers are ignored for mocha cat ).
I finished up mocha download , which surprisingly does a bit more than simply downloading files. The first thing it does is well… download the file. This is a bit more complicated than it seems though, since we need to identify the right file to download based on cpu architecture. Hence the very cursed JSON parsing I had to create. After downloading a file, we also do a hash check. We support the 4 types of file hashes which scoop support, those being sha256 , sha512 , md5 and sha1 . Currently files get downloaded to the $MOCHA_DIR/cache directory like in scoop, however we don’t actually check if there’s anything cached which can lead to repeated downloads. That’s something I’ll need to fix later on
Fuzzy search is really really good. While implementing mocha search I noticed the results returned by scoop search were in alphabetical order, which doesn’t make a lot of sense. If I do scoop search git the first result should probably be git As a result my implementation of search uses github.com/sahilm/fuzzy which is a small library which provides a fuzzy search implementation. Scoop also checks for binary name matches, e.g. package biodiff can provide a binary called git-biodiff and show up in search results. I decided to remove this for now, since I personally find it a bit unnecessary. scoop search also lists all search results, which is okay when results are sorted alphabetically but doesn’t make sense when searches are relevance based. Therefore, by default mocha search will list exact matches plus the 20 most relevant search results. This can be overridden by the --count argument, where setting it to 0 displays all results. A demonstration of mocha search vs scoop search can be seen in the video below.
mocha cache is a simple command. It shows you what files are currently in $MOCHA_DIR/cache directory and it clears them out. One thing I noticed was that scoop cache show actually displays raw bytes instead of human readable file sizes for each cache entry, which is a bit odd since the total they display is human readable. Therefore I made my implementation mocha cache list display human readable sizes since that’s a more reasonable default.
Shims are simple in concept, complicated in reality. So essentially a shim in mocha is just an executable which calls another executable. It’s similar to a shortcut in that sense, except it shows up in $PATH Thankfully the scoop project already has a repository with 4 different implementations for the shim binary, so I can just have mocha shim download one of those binaries. The complicated part was the PE Subsystem. The PE subsystem is basically a bit of info in each binary which tells Windows whether it’s a console application, or a GUI application. We need to set the PE subsystem of the shim exe to the PE subsystem of the binary we are calling for Windows to execute the binary properly. Hence I need to read and write raw binary data. All of this is just the implementation for exe shims. Scoop itself contains implementations for .bat/.cmd , .ps1 , .jar , .py and linux binaries , all of which have wildly different implementations compared to .exe shims. The video below shows the working set of mocha shim commands (those being add , remove and list ).
Spent a bit longer between devlogs this time, but it was worth it. So I realized the error messages were really bad. I was pretty much just passing errors up the call stack without adding any context, which isn’t great since it means our error messages will be useless to people reading them I therefore went through every single file of the codebase and wrote good error messages which add a bit of context every time we pass it up the call stack. I also did a bit of refactoring where I thought it would be worth it. For example in the shim module I now set the PE subsystem of the shim binary while it’s in memory instead of writing to disk twice. A few good examples of what the new error messages look like can be seen in the video below.
mocha update is another command which does very little but is very important. All it does is update the known_buckets file, and run git pull on all added buckets to update them. It can also update just the buckets you specify if you pass in an argument. I do need to improve the output of the command since it outputs raw git right now, but at least it’s functional. See the demo below.
Huge milestone!!! I’ve gotten mocha install working for very basic apps! This means the entire process of downloading a file, then extracting it, then creating a junction and finally creating a shim now works for basic pieces of software! So in terms of what I actually did this devlog, I added cache hits to the download command since it’s relevant to the install command. I then implemented the aforementioned .zip extraction and junction creation. Then all that was left was a bit of orchestration, getting everything to work together properly. See a working install of innounp using mocha install below!
Before working on more features and expanding the amount of apps mocha actually supports I wanted to go through the codebase and do a lot of cleanup since the codebase is quite messy. There are silly mistakes in some files and bad implementations in others. Hence the time I spent during this period was focused on moving code to where it should be and cleaning up some edge cases, specifically related to the bucket , config and shim modules. A good example of this is moving the code to get the active config to the config module instead of leaving it in main.go . Next up will be refactoring the commands , fileops , and manifest modules. I don’t have much to show so I figured I would present a feature I added but didn’t show earlier: the ability to skip cache hits with the --force flag when installing or downloading an app. Some context I forgot to add initially: I renamed the app module to manifest since I felt it was more accurate to what it actually handles scope wise.
Finished up the code cleanup in commands , fileops and manifests . I did catch a few edge cases and some incorrect behavior in the process, which is why I always spend so much time reviewing code. I did use AI to assist with code review because I think it’s an area where AI shines. AI is really good at finding small errors or inconsistencies in the codebase which I probably wouldn’t notice. For example, it identified that the ManifestReferences argument was not a required argument for the download command, which meant no help message was displayed on incorrect usage like the other commands. One big thing I will work on eventually is console output. Right now errors are well formatted but a lot of the time commands just run stuff without providing a lot of insight into what actions they are taking which isn’t great. Even the help menu is pretty useless right now (see the image below). Extra context: A manifest reference is a pointer to an app (e.g. main/ [email protected] )
So I added support for more apps by implementing more extractors. This means in theory any apps which don’t need a pre-install or post-install should work. To be more specific, I handle a few more properties on manifests. Those being extract_dir and innosetup , which inform how an app needs to be installed. I also implement 7zip and innounp as extractors to support more file formats which applications are distributed in. Of course there’s still a lot of work before I consider this ready for public use. I need to create commands for some basic operations like uninstalling, updating and listing apps. I also need to handle shortcuts otherwise GUI apps can’t be accessed from the start menu. Besides that I need to improve the user experience. As you can see in the video below mocha just sort of dumps everything to the console even if it’s not relevant. Help menus are also critical to get working properly.
I finished up mocha uninstall and mocha list , which means you can actually manage installed apps instead of manually deleting them. There’s not much that goes into mocha uninstall . You just need to remove the relevant shims and app directories since the apps that mocha supports are all portable. mocha list is similarly simple. It’s just loops over the directories in $MOCHA_DIR/apps and looks for apps along with the versions installed for each app.
Typically I don’t want to make devlogs for small stuff like this, but this is something I found really cool. So I was working on help messages for all the commands when I realized that mocha bucket list felt a bit slower than pretty much every other command. This is because we need to shell out to git 2 times per bucket, and I had 4 buckets added. While 8 git commands might not sound like a lot, it was enough to make mocha bucket list feel slow. So what I did is I parallelized the metadata fetching through an errgroup . Instead of fetching the metadata for each bucket in order, we fetch the metadata for all 4 buckets simultaneously. This led to a big performance uplift. About 3 times faster than the old version of mocha , and just over 12 times faster than scoop for this operation. See the video below.
As I mentioned in the previous devlog I added good help information to every bit of the CLI. It’s surprisingly difficult to write good help messages which explains everything to users in a few words I also changed the behaviour of the mocha cache clear command to not clear all cache by default. That’s now gated behind the --all flag in order to match scoop a bit more
We now create shortcuts! This means any GUI apps should show up properly in the start menu, just like they do when you install with scoop . All I really had to do was a bit of orchestration since I decided to vendor in an implementation from https://github.com/jxeng/shortcut Besides that I expanded the number of apps that are supported by implementing a bit of code that handle architecture specific bin fields, along with bin fields which store 2D arrays. I also cleared up some of the TODO items. I swapped the junction implementation to an implementation from https://github.com/nyaosorg/go-windows-junction since we were previously shelling out to CLI. That and I added a bit more zip bomb protection For the purposes of the video below I changed the location which shortcuts get put to my desktop. It’ll probably be configurable, and match scoop by putting shortcuts in the startup menu by default
This is going to be the equivalent of 2 devlogs since I thought I made one earlier for persists but I didn’t. New feature! We now handle persist items in order to store data between versions. These are files which are persisted between versions of an app. Lets take git as an example to explain why persist exists. Say you want to make sure your git config isn’t deleted every time you update. The issue with this is that the config file is saved in the version specfic directory. To resolve this we can keep the config in $MOCHA_DIR/persist and then symlink the config to where it needs to be, which is essentially what persist tells us to do. Since we handled persist items last time we can now implement mocha upgrade to update apps. The way scoop handles updates is by first removing anything that references the app, like shortcuts or shims . Then we just follow the install process from scratch. This leaves the old version available in case a user wants to revert versions due to a bug, while also updating to the latest available version. This can be seen in the video below, which shows me updating llama.cpp-hip-radeon .
So I’ve been doing a bit of refactoring, a bit of bug fixing and a bit of optimization. Essentially just polishing mocha before I work on the next feature. Here’s some of the stuff I did: created tests for ParseRefString to validate behavior cache manifest json between info calls since I/O is really slow bumped dependency versions refactored manifest/info.go Besides that I fixed the uninstall flow since it was really bugged after the latest changes. Essentially mocha would uninstall apps with incorrect info. It would also try to remove shims/shortcuts for apps which don’t have any active shims/shortcuts. I then added a bit of logging since the uninstall command didn’t give any user output for whatever reason (i forgot to earlier).
mocha now supports a user defined theme for output colors. In the process I ended up doing a lot of stuff related to the config. First thing I did was swap to fatih/color for colored output, since it handles stuff like colors in command prompt and removing color when output is piped. Then I refactored the config module. Earlier I would pass around a MochaConfiguration object through every function. Now I use a config singleton that’s accessible from any function. Why? Because it means I don’t need to pass the object every time I want to log information. Also means I don’t need to pass mochaDir through almost every function in the codebase. Getting user defined themes was a bit complicated because I needed a good way to handle a default theme so output doesn’t look bad if parsing fails. I handled this by only using the configured theme if every color resolves properly. Otherwise output falls back to the already loaded default theme. Due to this you still get colored output even if there are errors or warning before the configuration and theme is loaded.
I love refactoring!!!! I’ll probably end up spending another 20 hours just on refactoring because it’s so fun!!!! This time around I wanted to refactor the code so that our commands orchestrate stuff instead of the helper functions. For example, pkg.Install would first download a package, then install it, and then link it through shims and shortcuts all by itself. This causes issues because it means error messages become slightly worse, and it creates a class of bugs due to edge cases where we don’t necessarily want this order of orchestration. Hence I did a lot of refactoring in the pkg module. I also ended up adding a way to skip verification of downloads when downloading, installing or updating a package through --skip-verify . It’s a useful option in situations where there is a malformed manifest or simply no hash to begin with.
I’m writing this one right before F1 Qualifying at Spa! Continuing with the trend of some of my recent work, I improved what table outputs look like to be a little bit more readable. We now use proper separators in the form of Unicode Box Drawing Characters . I also made column alignment configurable, which improves legibility for some commands like mocha bucket list and mocha cache show . I’ve attached an image of the scoop and mocha versions of bucket list so you can compare for yourself.
Not sure why I didn’t do this earlier, but I’ve added success messages to commands where it makes sense. Also added a success color to the config so you can change what the success color is. I do still need to improve CLI output quite a bit, but it’s slowly getting there.
My summer break has ended so development is going to be a lot slower from now. I added mocha outdated so you can list outdated apps before upgrading them to a newer version. Besides that I tweaked a lot of stuff related to CLI output. For example I changed search to output one table, and simply outputting exact matches at the top of that table. I also changed a lot of messages which were using LogOutput to LogInfo so they use the correct color and output to stderr and not stdout .
Finally got a bit of time to do a bit of development. First thing I did was remove a field from install.json to match scoop . This means that mocha should be a drop in replacement for existing scoop installs. Then I added partial support for env_set and env_add_path . The main thing I need to do to complete the feature is parse variables and replace them with the appropriate paths. These 2 fields are some of the last manifest fields I need to support besides pre/post (un)install hooks.
Lot of time going into this devlog, but it makes sense since I did do a lot. I did this sweeping refactor of the entire commands module which moved around a lot of code. Essentially each command now gets it’s own directory under the commands module that represents it’s children/parents. For example commands/shim/remove/cmd.go contains code for the mocha shim remove command. Each cmd.go contains a Command struct that has the relevant fields and functions attached to it. This structure just makes things more organized and also means adding test files will be a bit easier since functionality is now isolated. I also sorted out the shim binary. So essentially https://github.com/ScoopInstaller/Shim offers different version of the shim binary which can be installed. Previously I hard coded the code to install cpp v0.1.0 but now users can run mocha shim binary releases to see the options and mocha shim binary setup to install their chosen binary. This also means we actually get the latest releases from GitHub.
Lots of small bug fixes and changes, I’ll just list them out: feat(cmd): allow removal of multiple shims in one execution (f2fae3f) fix(manifest): correctly ignore invalid shortcut entries (6a08478) fix(fileops): use correct registry type (5d5d796) fix(config): seed config with defaults (9dfaaff) fix(cmd): use correct release sources (a2a9ba1) fix(cmd): use bucket from install info (5a9109b) I also added support for more file types being shimmed, which helps a lot with compatibility. The file types are .py , .bat , .cmd , .jar and .ps1 .
I forgot to make a devlog in between so this will be like 2 bigger devlogs. I parallelized bucket updates, which speeds it up quite a bit. This also allowed me to try out parallelism even more, which I plan to apply throughout the CLI later on. I also added configuration options for the runners which mocha shim will use to run certain file types. For example, you can set the python-runner to select the python version that’ll be used to run python scripts that are shimmed. Downloads now have a progress bar, so you don’t need to wonder whether something is happening or not during a long download. Finally env_set is fully supported since I added the relevant variable parsing. This was pretty much just me cleaning out the TODO list before I ship. I also did a lot of smaller bug fixes and refactors as seen below. fix(commands): prevent app installation if already installed (cb27d07) fix(commands): fix config opening with “start” (74f3679) fix(commands): correctly handle non-apps when upgrading (f7419f6) fix: make LogOutput go to Stdout not Stderr (bc10357) fix: handle empty versions correctly (2287da9) fix(pkg): remove correct temp dir (33189b6) fix(shim): warn for unknown shim extension (622c2b4) fix: skip downloads with no hash by default (69d4e35) fix: use correct timeout for downloads (44e527b) fix: drop unnecessary return value from GetExecutableEntries (9fd845c) fix(config): remove unused option (1339971) fix(commands): don’t error for valid results (87c4d6c) refactor(config): rename variables/functions (f253d9d) fix: use unique temp directories (a159e23) refactor: use fmt.Fprintln directly (d2d54bf)
So I wrote a README, added a license (MIT of course) and setup CI/CD so that releases are automatically built and deployed. Honestly I forgot how hard it is to write a good README. You need to get a lot of information through without it looking like a wall of text.
Ships:
I made a package manager for Windows, which is somewhat backwards compatible with scoop packages. To be honest there’s still a lot of work that I want to do, but I have exams and college application coming up soon so I can’t. That’s not to say I’m not happy with the state of the ship. At the very least it has all the core features that a package manager should have, but there are still a lot of bugs which is why this is only v0.0.1. The biggest challenge by far was trying to figure out how Scoop does things internally. A lot of stuff just doesn’t have documentation, so you have to dig through the really messy PowerShell source code....
|
1792856935.9543862
|
1792943335.9543862
|
|
34601
|
Tempo by @evanssidhu | Stardance
|
evanssidhu
|
2
|
97.0
|
1805
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-07T05:07:17Z", "hours": 4.0, "multiplier": 11.52, "payout": 50, "blessing": "neutral", "text": "This is the second ship of the project. This is a pretty small ship aimed at addressing some feedback posted during my last ship. Originally I planned to do a complete UI overhaul, but I decided to just focus on minor improvements now since I have to balance projects with school and don’t know if I am going to have time to work on projects as much. I also want to take a little break from projects to focus on my mental health as well since I have been dedicating multiple hours almost every day purely on making projects. Anyways, enough about that and back to the project. If you want to see the changes from the previous ship, I have them outlined in the devlog below. If you want to see the main features added in the first ship, I have it posted as well shortly below to read. Thank you and I hope you like using my project, if you have any more feedback please outline it in your vote message as I love hearing how I can make my projects better. If you do not want to scroll down to the previous ship message or the readme, here is it posted below. Previous Ship Message Tempo is finally complete. It took way too many hours to finish, mostly through self inflicted pain of using hooks instead of asynchronous functions for the engine. I know that this might not be the greatest project for how long it took, but I am proud to say that it’s finally been shipped even after the many times I wanted to quit. I made this project because I play a little bit of chess and after getting limited to only 1 game review per day I thought it would be a good idea to make my own game review (yes I know other sites exist but wheres the fun in that). Anyways enough about that, here are the project features (definetly not copied from the readme) Features Game Review: Check how well you played in your previous games by simply entering your chess.com username or by manually loading a pgn file. Move Feedback: Instant updates on how well the engine thinks your move is. Move Classifications: How well the engine evaluates your moves. Classifications such as Miss, Great, or Brilliant are also included. Engine Lines: What the engine thinks is the best line to play in a position. Accuracies: How accurate you played relative to the best moves Graph: A visual and interactive graph on how much your expected win percentage changed throughout a game Classification Report: A total summary of how many of each type of move you played History Tree: View the total game history and easily branch off the main path. Play: Play against a friend in person, or play against the engine. Custom positions can be used as well. Custom Positions: Set up a custom position to load later. Settings: Change the app or board theme. If you are still reading this, thank you and I hope you enjoy using my site.", "repo": "https://github.com/es1228/Tempo", "demo": "https://es1228.github.io/Tempo/"}, {"ship_num": 2, "ts": "2026-08-16T22:48:34Z", "hours": 93.0, "multiplier": 18.77, "payout": 1755, "blessing": "neutral", "text": "Ship Message Tempo is finally complete. It took way too many hours to finish, mostly through self inflicted pain of using hooks instead of asynchronous functions for the engine. I know that this might not be the greatest project for how long it took, but I am proud to say that it’s finally been shipped even after the many times I wanted to quit. I made this project because I play a little bit of chess and after getting limited to only 1 game review per day I thought it would be a good idea to make my own game review (yes I know other sites exist but wheres the fun in that). Anyways enough about that, here are the project features (definetly not copied from the readme) Features Game Review: Check how well you played in your previous games by simply entering your chess.com username or by manually loading a pgn file. Move Feedback: Instant updates on how well the engine thinks your move is. Move Classifications: How well the engine evaluates your moves. Classifications such as Miss, Great, or Brilliant are also included. Engine Lines: What the engine thinks is the best line to play in a position. Accuracies: How accurate you played relative to the best moves Graph: A visual and interactive graph on how much your expected win percentage changed throughout a game Classification Report: A total summary of how many of each type of move you played History Tree: View the total game history and easily branch off the main path. Play: Play against a friend in person, or play against the engine. Custom positions can be used as well. Custom Positions: Set up a custom position to load later. Settings: Change the app or board theme. If you are still reading this, thank you and I hope you enjoy using my site.", "repo": "https://github.com/es1228/Tempo", "demo": "https://es1228.github.io/Tempo/"}]...
|
[{"post_id": 63372, "ts": "202 [{"post_id": 63372, "ts": "2026-09-07T04:54:05Z", "hours": 0.6231, "text": "Devlog 24 Small devlog, I was about to do another ship after addressing the feedback from last time, but I noticed a small bug where brilliant moves did not show sometimes. It turns out the issue was much simpler than I was testing for and it was due to a small multiplication sign error when converting the mate evaluation to centipawns to check if a move was winning."}, {"post_id": 63350, "ts": "2026-09-07T03:58:57Z", "hours": 3.7075, "text": "Devlog 23 Hello again everybody! I know its been a long time since I last worked on this project, but I read the feedback on this project and addressed your suggestions. Most of the feedback was on ui/ux improvements, so as a result I removed all mentions of infinity/nan on the site, as it looks rather unpolished and unprofessional. I also changed the modal dialogs from the built in alert function to a less intrusive custom toast notification. Lastly, a couple people said the engine took slightly long to make moves, so I slightly lowered the engine depth for games and also removed another delay I originally added to make the engine feel more human like in its thinking time. In terms of the game review engine I decided to keep it the same as it works pretty quickly due to a worker pool being used, but I did change the dialog slightly to make it feel like something is happening in the background, which suprisingly actually makes it feel faster. Anyways, to everyone that tried this project and gave feedback, thank you as it was much appreciated."}, {"post_id": 48501, "ts": "2026-08-16T21:30:43Z", "hours": 1.5022, "text": "Devlog 22 The site is now live. I actually had a lot of issues in deploying this site for some reason (mainly due to the large stockfish binaries stored in git lfs and the coi serviceworker) and my deployments just kept failing. I eventually got it straightened out now and I am ready to ship the project."}, {"post_id": 47758, "ts": "2026-08-15T21:57:35Z", "hours": 2.4678, "text": "Devlog 21 The history view has finally been properly migrated to a tree structure. Now since that is finally complete, I know it has been long overdue but it is finally time to ship this project."}, {"post_id": 47293, "ts": "2026-08-15T04:37:46Z", "hours": 6.0658, "text": "Devlog 20 Another devlog here focusing on bug fixes, and I am happy to say that almost everything is pretty much complete. I’ve fixed pretty much every out of sync issue, and even got game reviews to load pretty much instantly. It literally took only around 5 seconds to load a 65 move game, so that is finally optimized. I think the issue was some web workers were not terminating properly and taking up too much memory. Anyways I hope to finally have this project out very soon, and the only thing I might to is try to get the history tree working. Today I actually did kind of get it to work but it caused massive performance degradations for some reason and was causing some conflicts with other components as well."}, {"post_id": 47078, "ts": "2026-08-14T18:24:08Z", "hours": 4.785, "text": "Devlog 19 More progress has been made adding features and fixing bugs. I’ll highlight the changes below. Features Game Chart The game chart has been updated to include custom dots and lines showing the move classifications and key points during the game (brilliant moves, great moves, mistake, blunder, and miss). You can also click on the chart to go to that move. History View The history view has now been updated to show the classification icons next to the move, which should make it easier to find moves you are looking for Fixes/Optimizations Memoization Data in the game chart has now been memoized. This prevents the chart from crashing the page due to trying to process data many times per second. Stockfish evaluations Game review evaluations now use an active worker pool to run multiple evaluations at once rather than just one at a time. Positions are also cached now so all evaluations share 1 chess instance. In practice, this has reduced the game review time for a 20 move game from over 1 minute to around 7 seconds, which is around a 90% decrease."}, {"post_id": 46601, "ts": "2026-08-13T23:14:42Z", "hours": 2.3281, "text": "Devlog 18 A few things in this devlog, I separated the game review panel into 2 sections containing the review report and engine analysis. I’ve also refined the classifications for great and brilliant. Brilliant Move Changes The sacrifice can now be anywhere on the board, not just for the piece that moved Trading a lower value piece for a higher value piece (ex: taking a knight but losing a pawn) no longer counts as brilliant Illegal moves (pins, checks, etc.,) no longer contribute to the attacking piece values Great Move Changes Taking a hanging piece or trading lower value pieces for higher value pieces (ex: capturing a hanging queen or recapturing during a trade) no longer count as great moves."}, {"post_id": 46134, "ts": "2026-08-13T04:37:45Z", "hours": 1.8517, "text": "Devlog 17 After a long time, I’ve finally added brilliant moves. This was done by comparing a squares attackers and defenders to determine if the piece is hanging. If a move results in that piece being hanging/sacrificed, and is the top engine move, then the classification will return brilliant. I’ve attached an example below in a game where GothamChess does what he does best and sacrifices both his rooks."}, {"post_id": 46084, "ts": "2026-08-13T01:13:20Z", "hours": 3.2308, "text": "Devlog 16 I’ve added the last 2 features related to game review, accuracies and the eval chart. The last thing I plan to to is add some polish, brilliant moves, and maybe try working on the history/pgn tree again."}, {"post_id": 45932, "ts": "2026-08-12T18:35:37Z", "hours": 2.4761, "text": "Devlog 15 I’ve added a few more features related to game review in this devlog. First, I added a section to view the top 2 engine lines on each move. I’ve also added a table to view classifications for the entire game."}, {"post_id": 45416, "ts": "2026-08-11T20:58:03Z", "hours": 0.9417, "text": "Devlog 14 I’m going to post more frequently as this project gets wrapped up, and I’ve just finished caching the game review data so feedback is instant if you load in game to review. I also decided to add colors to the start and end squares based on classification because it looks nice. I’ve attached a video below, I don’t know why my screen recorder records very laggy but I promise it’s not actually that laggy."}, {"post_id": 45004, "ts": "2026-08-11T04:20:50Z", "hours": 4.3753, "text": "Devlog 13 I’ve been working on the game review stats, and i’ve implemented a function to classify an entire game and tally up the classifications (which was actually harder than it looked, since i needed to rewrite my hooks since hooks cannot be called within functions). It now works pretty decently, but I do want to optimize performance a bit since it takes a while. Funnily enough there was an issue where if the worker resolved too early it would not terminate and create a memory leak and eat your entire system memory, but thats fixed now."}, {"post_id": 44308, "ts": "2026-08-09T23:45:35Z", "hours": 7.9586, "text": "Devlog 12 I really don’t like going this long without posting a devlog, but debugging move classifications was really painful. I encountered an issue where if you went through many moves very quickly, it resulted in classifications not working properly since stockfish could only give evaluations for the current move. This is not ideal since most classifications require checking the evaluation drop, which requires 2+ points of evaluation. I tried many things, first I tried running 3 different stockfish web workers inside the stockfish hook, which caused a couple issues and was not very performant. Next I tried using a single worker and passing in 3 positions, however since the web worker is single threaded it didn’t really work all that well. I also tried using a queue to run each instance one at a time, but that got complex quickly and still did not work. I also wanted to merge the classification and evaluation hooks, which created a 500 line mess of a file which was a nightmare to maintain. Finally, I decided to revert all my changes and keep the hooks separate and simple, and created 3 instances of evaluation hooks within my classification hook. This was much cleaner and actually worked really well, so I wasted 8 hours making things too complex.# Devlog 12 I really don’t like going this long without posting a devlog, but debugging move classifications was really painful. I encountered an issue where if you went through many moves very quickly, it resulted in classifications not working properly since stockfish could only give evaluations for the current move. This is not ideal since most classifications require checking the evaluation drop, which requires 2+ points of evaluation. I tried many things, first I tried running 3 different stockfish web workers inside the stockfish hook, which caused a couple issues and was not very performant. Next I tried using a single worker and passing in 3 positions, however since the web worker is single threaded it didn’t really work all that well. I also tried using a queue to run each instance one at a time, but that got complex quickly and still did not work. I also wanted to merge the classification and evaluation hooks, which created a 500 line mess of a file which was a nightmare to maintain. Finally, I decided to revert all my changes and keep the hooks separate and simple, and created 3 instances of evaluation hooks within my classification hook. This was much cleaner and actually worked really well, so I wasted 8 hours making things too complex."}, {"post_id": 41619, "ts": "2026-08-05T22:47:45Z", "hours": 2.9967, "text": "Devlog 11 I am finally back to this project, and this time did not wait 8 hours to post a devlog. Anyways, I added two major features today, custom position imports (which I forgot to do last time) and engine play. Features Custom Position Imports You can now import a position into the custom position editor, which is great for things like loading puzzles and endgames to practice against the engine. You can also export positions by pressing the copy button to copy the position fen to the clipboard. Play Against Engine You can now play games against stockfish, and choose a difficulty level from 0-20. As mentioned above I believe this is a quite useful feature for things like just playing by yourself or practicing different endgames against the computer. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, etc.,) Playback Controls Board Themes/Styles Miss and Great moves History View Play In Person Custom Position Setup Play Against Engine Full Game Review/Engine Analysis (In Progress) Brilliant Moves"}, {"post_id": 37328, "ts": "2026-07-29T23:27:39Z", "hours": 8.7039, "text": "Devlog 10 I finished work on in-person gameplay and custom position setups, all that is left now is to finish adding engine play, polish game review, and add brilliant moves. Promotions You can now choose the piece you would like to promote to (no longer auto queen). In Person Play You can now create a game to be played in person between 2 people. Time controls are also availible. Custom Positions You can now load custom positions via drag and drop, which is useful for practicing endgames or creating puzzles. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, etc.,) Playback Controls Board Themes/Styles Miss and Great moves History View Play In Person Custom Position Setup [] Full Game Review/Engine Analysis (In Progress) Play Against Engine (In Progress) Brilliant Moves"}, {"post_id": 36679, "ts": "2026-07-28T21:54:34Z", "hours": 8.5064, "text": "Devlog 9 I tried to convert the history from a linear array into a tree, and it did not go well. I spent literal hours trying to get it to work and look at tutorials, but it just did not want to work. So for now i’ve decided to stop working on that feature, and just focus on the last few remaining tasks. I do have to fix a couple of things since a lot of features are currently in progress, but I will post another devlog later showing the updated features."}, {"post_id": 34189, "ts": "2026-07-24T18:26:16Z", "hours": 7.4164, "text": "Devlog 8 Sorry again for the long devlog, some things took a bit longer than I expected. Anyways, icons/glyphs have been added in this devlog. I’ve also fixed some issues with move backtracking. Additional classifications such as miss and great have been added, which took a while since I had to do a lot of refactors to store all the data in cache, and I also didn’t realize I sometimes was tracking the evaluations for the next moves, not the ones just played, which took a while New classifications Miss : Miss is when the previous player makes a bad move, but the next player fails to capitalize on it causing the evaluation to drop back to near where it was before. Great : Great moves are the only moves in the position that work, provided that the outcome is drawn or winning and you are not already winning had you not played the move. It compares 2 lines of stockfish to evaluate the evaluation difference and check for the conditions outlined above. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, etc.,) Playback Controls Board Themes/Styles Miss and Great moves History View (In Progress) Full Game Review/Engine Analysis (In Progress) Play In Person Play Against Engine Custom Position Setup Brilliant Moves"}, {"post_id": 33467, "ts": "2026-07-23T13:22:55Z", "hours": 2.5939, "text": "Devlog 7 Lots of QOL features and fixes added today, i’ve added a basic view of move history, and added a settings page where you can change the theme of the website or board. Next, I do want to work on features that do not involve the game review, such as pass and play or engine play. Move History You can now properly go through a game’s moves and view all played moves in the side pane. Themes Website theming has been added, alongside being able to choose the colors you would like the board to be. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, etc.,) Playback Controls Board Themes/Styles History View (In Progress) Full Game Review/Engine Analysis (In Progress) Play In Person Play Against Engine Custom Position Setup Advanced Classifications (Miss, Great, Brilliant)"}, {"post_id": 32763, "ts": "2026-07-22T03:57:08Z", "hours": 3.5231, "text": "Devlog 6 Second devlog today, this is more of an extension of the previous devlog since a lot of features were not fully polished yet. Since then move playback has been added and I also added a game review container. Most of the logic has now been implemented, all thats left now is a little polish and styling. The only logic thats left is trying to find a way to add proper move history and advanced classifications. I also attached a demo video this time since I forgot to last devlog. Move Playback It is now possible to use arrows to traverse forwards and backwards if a PGN file is imported. Game Review Container I added a little side container which will be used to show the stats of the game review. Currently it only shows the opening and move feedback, but it will be expanded to show accuracies and a full breakdown of the analysis and position similar to chess.com. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, etc.,) Playback Controls History View Board Themes/Styles Play In Person Play Against Engine Custom Position Setup Advanced Classifications (Miss, Great, Brilliant) Changelog 0e4db3c e2552b0"}, {"post_id": 32610, "ts": "2026-07-21T21:52:00Z", "hours": 8.4406, "text": "Devlog 5 Sorry for the long devlog, some things took longer than expected. First I decided to waste time trying to improve the UI until I remembered I suck at design and just decided to revert to the original design. Then I spent forever wondering why my input textbox would not work properly just for me to change e.target.value to e.currentTarget.value. Although I guess where would the fun be if there was no struggle. Anyways, here are the features I added. Board Controls It is now possible to flip the board and go forwards and backwards through moves. Importing from other sources This one took a bit of time, but now you can import games from Chess.com, or provide your own PGN/FEN. Later on I’ll probably also add Lichess as an import source as well. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, Lichess, etc.,) (In Progress) Playback/History Controls (In Progress) Board Themes/Styles Play In Person Play Against Engine Custom Position Setup Advanced Classifications (Miss, Great, Brilliant)"}, {"post_id": 31026, "ts": "2026-07-19T02:37:20Z", "hours": 3.3967, "text": "Devlog 4 Site Styling Site styling has been added in this commit, and it also comes with light/dark mode. The evaluation bar has also been added, and is responsive based on the win probability formula. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Themes/Styles Play In Person Play Against Engine Playback/History Controls Importing from other sources (FEN, PGN, Chess.com, Lichess, etc.,) Custom Position Setup Advanced Classifications (Miss, Great, Brilliant)"}, {"post_id": 30437, "ts": "2026-07-17T23:52:15Z", "hours": 4.6394, "text": "Devlog 3 Move Classifications Move classifications have finally been added. I thought it wouldn’t take this long but instead I spent hours trying to deal with react asynchronous state and trying to coordinate different hooks to play along nicely. Thankfully it works properly now (hopefully). The classifications added are best, excellent, good, inaccuracy, mistake, blunder, and theory. Opening names have also been added as well. Next Steps Next, I’ll work on making the site actually look pretty and have functionality. Importing games should also come next after that. Towards the end i’ll add other classifications as well such as miss, great, and brilliant, however, I expect them to be more difficult as they have slightly stricter classifications."}, {"post_id": 29258, "ts": "2026-07-16T01:54:05Z", "hours": 3.6022, "text": "Devlog 2 Playable Chess! There is now a playable UI to play Chess games. This was done using a mix of chess.js for the logic and react-chessboard for the UI. Most of the logic was handled by the board, however click/drag to move took some time to add. There is also positional evaluations and engine feedback now. Next Steps Next, I plan on creating the actual site design and controls. I also want to add a way to import games from sites like chess.com, and have the ability to load a full game rather than just a position. Move classification is also something that should be implemented soon. Demo Video"}, {"post_id": 28068, "ts": "2026-07-14T02:54:31Z", "hours": 1.6744, "text": "Devlog 1 I started work on Tempo, a chess analysis site to review your games. Chess engines such as Stockfish are easily self-hostable anyways, so there is no reason for sites like chess.com to limit game analysis to 1 per day. What’s New Added move analysis using Stockfish, which is fully selfhosted. Figuring out web workers and UCI was pretty time consuming, but eventually I got the hang of it and figured it out. Next Steps Next, I plan to work on creating the chessboard and site UI. Later I’ll add move classifications such as “Blunder”, “Mistake”, “Excellent”, etc. Maybe i’ll add “Brilliant” moves, but there seems to be no clear definition of one other than “a good sacrifice”."}]...
|
Title: Tempo by @evanssidhu | Stardance
Devlogs:
Title: Tempo by @evanssidhu | Stardance
Devlogs:
Devlog 1 I started work on Tempo, a chess analysis site to review your games. Chess engines such as Stockfish are easily self-hostable anyways, so there is no reason for sites like chess.com to limit game analysis to 1 per day. What’s New Added move analysis using Stockfish, which is fully selfhosted. Figuring out web workers and UCI was pretty time consuming, but eventually I got the hang of it and figured it out. Next Steps Next, I plan to work on creating the chessboard and site UI. Later I’ll add move classifications such as “Blunder”, “Mistake”, “Excellent”, etc. Maybe i’ll add “Brilliant” moves, but there seems to be no clear definition of one other than “a good sacrifice”.
Devlog 2 Playable Chess! There is now a playable UI to play Chess games. This was done using a mix of chess.js for the logic and react-chessboard for the UI. Most of the logic was handled by the board, however click/drag to move took some time to add. There is also positional evaluations and engine feedback now. Next Steps Next, I plan on creating the actual site design and controls. I also want to add a way to import games from sites like chess.com, and have the ability to load a full game rather than just a position. Move classification is also something that should be implemented soon. Demo Video
Devlog 3 Move Classifications Move classifications have finally been added. I thought it wouldn’t take this long but instead I spent hours trying to deal with react asynchronous state and trying to coordinate different hooks to play along nicely. Thankfully it works properly now (hopefully). The classifications added are best, excellent, good, inaccuracy, mistake, blunder, and theory. Opening names have also been added as well. Next Steps Next, I’ll work on making the site actually look pretty and have functionality. Importing games should also come next after that. Towards the end i’ll add other classifications as well such as miss, great, and brilliant, however, I expect them to be more difficult as they have slightly stricter classifications.
Devlog 4 Site Styling Site styling has been added in this commit, and it also comes with light/dark mode. The evaluation bar has also been added, and is responsive based on the win probability formula. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Themes/Styles Play In Person Play Against Engine Playback/History Controls Importing from other sources (FEN, PGN, Chess.com, Lichess, etc.,) Custom Position Setup Advanced Classifications (Miss, Great, Brilliant)
Devlog 5 Sorry for the long devlog, some things took longer than expected. First I decided to waste time trying to improve the UI until I remembered I suck at design and just decided to revert to the original design. Then I spent forever wondering why my input textbox would not work properly just for me to change e.target.value to e.currentTarget.value. Although I guess where would the fun be if there was no struggle. Anyways, here are the features I added. Board Controls It is now possible to flip the board and go forwards and backwards through moves. Importing from other sources This one took a bit of time, but now you can import games from Chess.com, or provide your own PGN/FEN. Later on I’ll probably also add Lichess as an import source as well. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, Lichess, etc.,) (In Progress) Playback/History Controls (In Progress) Board Themes/Styles Play In Person Play Against Engine Custom Position Setup Advanced Classifications (Miss, Great, Brilliant)
Devlog 6 Second devlog today, this is more of an extension of the previous devlog since a lot of features were not fully polished yet. Since then move playback has been added and I also added a game review container. Most of the logic has now been implemented, all thats left now is a little polish and styling. The only logic thats left is trying to find a way to add proper move history and advanced classifications. I also attached a demo video this time since I forgot to last devlog. Move Playback It is now possible to use arrows to traverse forwards and backwards if a PGN file is imported. Game Review Container I added a little side container which will be used to show the stats of the game review. Currently it only shows the opening and move feedback, but it will be expanded to show accuracies and a full breakdown of the analysis and position similar to chess.com. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, etc.,) Playback Controls History View Board Themes/Styles Play In Person Play Against Engine Custom Position Setup Advanced Classifications (Miss, Great, Brilliant) Changelog 0e4db3c e2552b0
Devlog 7 Lots of QOL features and fixes added today, i’ve added a basic view of move history, and added a settings page where you can change the theme of the website or board. Next, I do want to work on features that do not involve the game review, such as pass and play or engine play. Move History You can now properly go through a game’s moves and view all played moves in the side pane. Themes Website theming has been added, alongside being able to choose the colors you would like the board to be. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, etc.,) Playback Controls Board Themes/Styles History View (In Progress) Full Game Review/Engine Analysis (In Progress) Play In Person Play Against Engine Custom Position Setup Advanced Classifications (Miss, Great, Brilliant)
Devlog 8 Sorry again for the long devlog, some things took a bit longer than I expected. Anyways, icons/glyphs have been added in this devlog. I’ve also fixed some issues with move backtracking. Additional classifications such as miss and great have been added, which took a while since I had to do a lot of refactors to store all the data in cache, and I also didn’t realize I sometimes was tracking the evaluations for the next moves, not the ones just played, which took a while New classifications Miss : Miss is when the previous player makes a bad move, but the next player fails to capitalize on it causing the evaluation to drop back to near where it was before. Great : Great moves are the only moves in the position that work, provided that the outcome is drawn or winning and you are not already winning had you not played the move. It compares 2 lines of stockfish to evaluate the evaluation difference and check for the conditions outlined above. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, etc.,) Playback Controls Board Themes/Styles Miss and Great moves History View (In Progress) Full Game Review/Engine Analysis (In Progress) Play In Person Play Against Engine Custom Position Setup Brilliant Moves
Devlog 9 I tried to convert the history from a linear array into a tree, and it did not go well. I spent literal hours trying to get it to work and look at tutorials, but it just did not want to work. So for now i’ve decided to stop working on that feature, and just focus on the last few remaining tasks. I do have to fix a couple of things since a lot of features are currently in progress, but I will post another devlog later showing the updated features.
Devlog 10 I finished work on in-person gameplay and custom position setups, all that is left now is to finish adding engine play, polish game review, and add brilliant moves. Promotions You can now choose the piece you would like to promote to (no longer auto queen). In Person Play You can now create a game to be played in person between 2 people. Time controls are also availible. Custom Positions You can now load custom positions via drag and drop, which is useful for practicing endgames or creating puzzles. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, etc.,) Playback Controls Board Themes/Styles Miss and Great moves History View Play In Person Custom Position Setup [] Full Game Review/Engine Analysis (In Progress) Play Against Engine (In Progress) Brilliant Moves
Devlog 11 I am finally back to this project, and this time did not wait 8 hours to post a devlog. Anyways, I added two major features today, custom position imports (which I forgot to do last time) and engine play. Features Custom Position Imports You can now import a position into the custom position editor, which is great for things like loading puzzles and endgames to practice against the engine. You can also export positions by pressing the copy button to copy the position fen to the clipboard. Play Against Engine You can now play games against stockfish, and choose a difficulty level from 0-20. As mentioned above I believe this is a quite useful feature for things like just playing by yourself or practicing different endgames against the computer. Roadmap Stockfish Web Worker Chessboard/Gameplay Basic Classifications Opening Names Evaluation Bar Site Styling Board Controls Importing from other sources (FEN, PGN, Chess.com, etc.,) Playback Controls Board Themes/Styles Miss and Great moves History View Play In Person Custom Position Setup Play Against Engine Full Game Review/Engine Analysis (In Progress) Brilliant Moves
Devlog 12 I really don’t like going this long without posting a devlog, but debugging move classifications was really painful. I encountered an issue where if you went through many moves very quickly, it resulted in classifications not working properly since stockfish could only give evaluations for the current move. This is not ideal since most classifications require checking the evaluation drop, which requires 2+ points of evaluation. I tried many things, first I tried running 3 different stockfish web workers inside the stockfish hook, which caused a couple issues and was not very performant. Next I tried using a single worker and passing in 3 positions, however since the web worker is single threaded it didn’t really work all that well. I also tried using a queue to run each instance one at a time, but that got complex quickly and still did not work. I also wanted to merge the classification and evaluation hooks, which created a 500 line mess of a file which was a nightmare to maintain. Finally, I decided to revert all my changes and keep the hooks separate and simple, and created 3 instances of evaluation hooks within my classification hook. This was much cleaner and actually worked really well, so I wasted 8 hours making things too complex.# Devlog 12 I really don’t like going this long without posting a devlog, but debugging move classifications was really painful. I encountered an issue where if you went through many moves very quickly, it resulted in classifications not working properly since stockfish could only give evaluations for the current move. This is not ideal since most classifications require checking the evaluation drop, which requires 2+ points of evaluation. I tried many things, first I tried running 3 different stockfish web workers inside the stockfish hook, which caused a couple issues and was not very performant. Next I tried using a single worker and passing in 3 positions, however since the web worker is single threaded it didn’t really work all that well. I also tried using a queue to run each instance one at a time, but that got complex quickly and still did not work. I also wanted to merge the classification and evaluation hooks, which created a 500 line mess of a file which was a nightmare to maintain. Finally, I decided to revert all my changes and keep the hooks separate and simple, and created 3 instances of evaluation hooks within my classification hook. This was much cleaner and actually worked really well, so I wasted 8 hours making things too complex.
Devlog 13 I’ve been working on the game review stats, and i’ve implemented a function to classify an entire game and tally up the classifications (which was actually harder than it looked, since i needed to rewrite my hooks since hooks cannot be called within functions). It now works pretty decently, but I do want to optimize performance a bit since it takes a while. Funnily enough there was an issue where if the worker resolved too early it would not terminate and create a memory leak and eat your entire system memory, but thats fixed now.
Devlog 14 I’m going to post more frequently as this project gets wrapped up, and I’ve just finished caching the game review data so feedback is instant if you load in game to review. I also decided to add colors to the start and end squares based on classification because it looks nice. I’ve attached a video below, I don’t know why my screen recorder records very laggy but I promise it’s not actually that laggy.
Devlog 15 I’ve added a few more features related to game review in this devlog. First, I added a section to view the top 2 engine lines on each move. I’ve also added a table to view classifications for the entire game.
Devlog 16 I’ve added the last 2 features related to game review, accuracies and the eval chart. The last thing I plan to to is add some polish, brilliant moves, and maybe try working on the history/pgn tree again.
Devlog 17 After a long time, I’ve finally added brilliant moves. This was done by comparing a squares attackers and defenders to determine if the piece is hanging. If a move results in that piece being hanging/sacrificed, and is the top engine move, then the classification will return brilliant. I’ve attached an example below in a game where GothamChess does what he does best and sacrifices both his rooks.
Devlog 18 A few things in this devlog, I separated the game review panel into 2 sections containing the review report and engine analysis. I’ve also refined the classifications for great and brilliant. Brilliant Move Changes The sacrifice can now be anywhere on the board, not just for the piece that moved Trading a lower value piece for a higher value piece (ex: taking a knight but losing a pawn) no longer counts as brilliant Illegal moves (pins, checks, etc.,) no longer contribute to the attacking piece values Great Move Changes Taking a hanging piece or trading lower value pieces for higher value pieces (ex: capturing a hanging queen or recapturing during a trade) no longer count as great moves.
Devlog 19 More progress has been made adding features and fixing bugs. I’ll highlight the changes below. Features Game Chart The game chart has been updated to include custom dots and lines showing the move classifications and key points during the game (brilliant moves, great moves, mistake, blunder, and miss). You can also click on the chart to go to that move. History View The history view has now been updated to show the classification icons next to the move, which should make it easier to find moves you are looking for Fixes/Optimizations Memoization Data in the game chart has now been memoized. This prevents the chart from crashing the page due to trying to process data many times per second. Stockfish evaluations Game review evaluations now use an active worker pool to run multiple evaluations at once rather than just one at a time. Positions are also cached now so all evaluations share 1 chess instance. In practice, this has reduced the game review time for a 20 move game from over 1 minute to around 7 seconds, which is around a 90% decrease.
Devlog 20 Another devlog here focusing on bug fixes, and I am happy to say that almost everything is pretty much complete. I’ve fixed pretty much every out of sync issue, and even got game reviews to load pretty much instantly. It literally took only around 5 seconds to load a 65 move game, so that is finally optimized. I think the issue was some web workers were not terminating properly and taking up too much memory. Anyways I hope to finally have this project out very soon, and the only thing I might to is try to get the history tree working. Today I actually did kind of get it to work but it caused massive performance degradations for some reason and was causing some conflicts with other components as well.
Devlog 21 The history view has finally been properly migrated to a tree structure. Now since that is finally complete, I know it has been long overdue but it is finally time to ship this project.
Devlog 22 The site is now live. I actually had a lot of issues in deploying this site for some reason (mainly due to the large stockfish binaries stored in git lfs and the coi serviceworker) and my deployments just kept failing. I eventually got it straightened out now and I am ready to ship the project.
Devlog 23 Hello again everybody! I know its been a long time since I last worked on this project, but I read the feedback on this project and addressed your suggestions. Most of the feedback was on ui/ux improvements, so as a result I removed all mentions of infinity/nan on the site, as it looks rather unpolished and unprofessional. I also changed the modal dialogs from the built in alert function to a less intrusive custom toast notification. Lastly, a couple people said the engine took slightly long to make moves, so I slightly lowered the engine depth for games and also removed another delay I originally added to make the engine feel more human like in its thinking time. In terms of the game review engine I decided to keep it the same as it works pretty quickly due to a worker pool being used, but I did change the dialog slightly to make it feel like something is happening in the background, which suprisingly actually makes it feel faster. Anyways, to everyone that tried this project and gave feedback, thank you as it was much appreciated.
Devlog 24 Small devlog, I was about to do another ship after addressing the feedback from last time, but I noticed a small bug where brilliant moves did not show sometimes. It turns out the issue was much simpler than I was testing for and it was due to a small multiplication sign error when converting the mate evaluation to centipawns to check if a move was winning.
Ships:
Ship Message Tempo is finally complete. It took way too many hours to finish, mostly through self inflicted pain of using hooks instead of asynchronous functions for the engine. I know that this might not be the greatest project for how long it took, but I am proud to say that it’s finally been shipped even after the many times I wanted to quit. I made this project because I play a little bit of chess and after getting limited to only 1 game review per day I thought it would be a good idea to make my own game review (yes I know other sites exist but wheres the fun in that). Anyways enough about that, here are the project features (definetly not copied from the readme) Features Game Review: Check how well you played in your previous games by simply entering your chess.com username or by manually loading a pgn file. Move Feedback: Instant updates on how well the engine thinks your move is. Move Classifications: How well the engine evaluates your moves. Classifications such as Miss, Great, or Brilliant are also included. Engine Lines: What the engine thinks is the best line to play in a position. Accuracies: How accurate you played relative to the best moves Graph: A visual and interactive graph on how much your expected win percentage changed throughout a game Classification Report: A total summary of how many of each type of move you played History Tree: View the total game history and easily branch off the main path. Play: Play against a friend in person, or play against the engine. Custom positions can be used as well. Custom Positions: Set up a custom position to load later. Settings: Change the app or board theme. If you are still reading this, thank you and I hope you enjoy using my site.
This is the second ship of the project. This is a pretty small ship aimed at addressing some feedback posted during my last ship. Originally I planned to do a complete UI overhaul, but I decided to just focus on minor improvements now since I have to balance projects with school and don’t know if I am going to have time to work on projects as much. I also want to take a little break from projects to focus on my mental health as well since I have been dedicating multiple hours almost every day purely on making projects. Anyways, enough about that and back to the project. If you want to see the changes from the previous ship, I have them outlined in the devlog below. If you want to see the main features added in the first ship, I have it posted as well shortly below to read. Thank you and I hope you like using my project, if you have any more feedback please outline it in your vote message as I love hearing how I can make my projects better. If you do not want to scroll down to the previous ship message or the readme, here is it posted below. Previous Ship Message Tempo is finally complete. It took way too many hours to finish, mostly through self inflicted pain of using hooks instead of asynchronous functions for the engine. I know that this might not be the greatest project for how long it took, but I am proud to say that it’s finally been shipped even after the many times I wanted to quit. I made this project because I play a little bit of chess and after getting limited to only 1 game review per day I thought it would be a good idea to make my own game review (yes I know other sites exist but wheres the fun in that). Anyways enough about that, here are the project features (definetly not copied from the readme) Features Game Review: Check how well you played in your previous games by simply entering your chess.com username or by manually loading a pgn file. Move Feedback: Instant updates on how well the engine thinks your move is. Move Classifications: How well the engine evaluates your moves. Classifications such as Miss, Great, or Brilliant are also included. Engine Lines: What the engine thinks is the best line to play in a position. Accuracies: How accurate you played relative to the best moves Graph: A visual and interactive graph on how much your expected win percentage changed throughout a game Classification Report: A total summary of how many of each type of move you played History Tree: View the total game history and easily branch off the main path. Play: Play against a friend in person, or play against the engine. Custom positions can be used as well. Custom Positions: Set up a custom position to load later. Settings: Change the app or board theme. If you are still reading this, thank you and I hope you enjoy using my site....
|
1792986947.8720236
|
1793073347.8720236
|
|
59861
|
Cirkuit by @spectra | Stardance
|
spectra
|
1
|
120.04
|
1802
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T22:09:45Z", "hours": 95.0, "multiplier": 18.99, "payout": 1802, "blessing": "neutral", "text": "Hi! I’m really happy to introduce you to my biggest project so far. It’s called Cirkuit, and it’s a logic circuit sandbox simulator… but with pixel art! That means you can basically build anything using just pixels. Why pixels? You may ask. Well, many logic simulators already exist, but the issue is that most of them aren’t very accessible to the average user. That’s why I wanted Cirkuit to be as easy to use as possible. I’m already quite familiar with TypeScript and React, which I used for this project. So the most difficult part was actually figuring out how to implement features without having 100 nested loops :D I had a hard time figuring out how to build the core engine (obviously), as well as the annotation system. I’m quite proud of how it looks and how well it works. This project was a perfect opportunity for me to improve my design skills. I worked hard to reduce friction between the interface and the user (aka you, dear shipwriters). One piece of advice: try it on a computer with a mouse. Phones and trackpads are supported, but it’s not the best experience. Hope you’ll like this project!", "repo": "https://github.com/NaFo44/Cirkuit", "demo": "https://nafo44.github.io/Cirkuit/"}]...
|
[{"post_id": 82612, "ts": "202 [{"post_id": 82612, "ts": "2026-10-25T12:50:30Z", "hours": 2.0128, "text": "Devlog #40 : Integrated circuits I’m (again) still working on this feature! Since my last devlog, I’ve updated the project document format to serialize the new modules. And that’s basically it! Next step: integrate them into the UI, polish the UX, and ship!"}, {"post_id": 82446, "ts": "2026-10-24T20:32:14Z", "hours": 3.4561, "text": "Devlog #39 : Integrated circuits (again) I’m still working on this feature! I’m not at the frontend part yet, still adapting the engine. More details if you’re curious: A module has a definition that includes its name, public pins, and internal circuit. It can be used multiple times (it’s called an instance in the code). And all modules are listed in a catalog (that I’ll probably integrate in the frontend later). Instances can be selected, moved, copied and pasted, across the layers… The picture bellow shows how this feature could be used. It will make things much easier if you want to build more complex circuits like an 8 bit adder. You’ll just have to stack 8x 1-bit full adder modules! As always, if you enjoy the project, feel free to leave a star on GitHub! Repo: https://github.com/NaFo44/Cirkuit Next steps: finish the backend side, then integrate everything into the frontend, polish the UI, and ship!"}, {"post_id": 81890, "ts": "2026-10-22T21:14:45Z", "hours": 1.7631, "text": "Devlog #38 : Integrated circuits Some of you have requested this, so I’m working on it! It’s not out yet, as it’s a pretty big feature. Integrated circuits will basically be custom components (most likely rectangles) with multiple inputs and outputs, all defined by the user. It’s literally a footprint, kinda like what you’d find in KiCad. I’ve started modifying the engine’s internals so it can handle these new types of connections (alongside the classic 1-pixel components). The real challenge here is keeping everything simple on the UX side, even though this feature targets more advanced users. The image below only shows what it might look like, this will probably change over time. As always, if you enjoy the project, feel free to leave a star on GitHub! Repo: https://github.com/NaFo44/Cirkuit Next steps: keep working on this feature, polish the UI/UX, ship it, and sadly… the end of stardance :("}, {"post_id": 80656, "ts": "2026-10-18T12:34:55Z", "hours": 0.6414, "text": "Devlog #37 : Probe tool is out! You can now inspect your circuits with this new tool. It highlights equipotential wires. I also added small circles to every connected ports. Next steps: UI polish, and maybe a “challenge” or “community circuits” tab."}, {"post_id": 80469, "ts": "2026-10-17T19:03:13Z", "hours": 1.3664, "text": "Devlog #36 : Probe tool and 4-bit calculator. While I was working on improving my 7-segment display, I had quite a hard time simplifying the circuit. Then I thought it could be really useful to have a tool that shows all the equipotential wires. So I’m currently working on it! It’s working, but I still have to improve its style before publishing it. Aside from that, I actually spent way too many hours improving the 4-bit calculator. And it’s now finished! It’s available in the demo circuit if you want to try it. I’ll see if I can build a keyboard later so users don’t have to enter numbers in binary. As always, if you enjoy the project, feel free to leave a star on GitHub! Repo: https://github.com/NaFo44/Cirkuit Next steps: finish the Probe tool, polish the UI, add a “challenge” tab."}, {"post_id": 79615, "ts": "2026-10-14T18:37:38Z", "hours": 1.4939, "text": "Devlog #35 : UI cleanup and (another) demo circuit The sidebar was getting a bit too crowded, so I added a small button to show/hide the more advanced components. The idea is to make things a little less overwhelming for new users, instead of throwing everything at them right away. I also worked on a 4-bit adder and wired it up to my 7-segment decoder! I’m going to try making it a 4-bit decoder instead of a 3-bit one, but things are going to get a lot more complicated (more numbers = more logic gates). One small issue with the adder for now: the most significant bit is on the right, so the input is basically reversed. I’ll fix that soon. In the meantime, you can already try it out in the live demo project! As always, if you enjoy the project, feel free to leave a star on GitHub! Repo: https://github.com/NaFo44/Cirkuit Next steps: more UI/UX improvements, adding challenges, and continuing to waste way too much of my time messing around with circuits xd"}, {"post_id": 79427, "ts": "2026-10-13T22:49:03Z", "hours": 0.4678, "text": "Devlog #34 : New component: Memory! This is one step up in difficulty! It has two inputs: a clock input (at the top) and a signal input (on the left). The output signal is provided on the right. This component can store a 1-bit value, which is updated on every rising edge of the clock signal. You can basically build anything with the component available: calculator, more advanced display (e.g. a 7-segment decoder that can go from 0 to 9). I added a 3-bit binary counter that I wired up to my 7-segment decoder! (demo bellow). It’s also included in the demo project file. Next steps: cleanup UI and improve UX (the sidebar is really really crowded right now)"}, {"post_id": 79113, "ts": "2026-10-12T18:33:18Z", "hours": 1.6869, "text": "Devlog #33 : Docs update and 1-bit memory! I added the clock to the docs page, along with some new tests for it. I’m also almost done with the 1-bit memory (basically a simplified D flip-flop). I’ll share it in the next devlog! Also, if you like this project, you can leave a star on the project’s GitHub page if you wish! Next steps: finish the 1-bit memory and clean up the UI/UX"}, {"post_id": 77284, "ts": "2026-10-06T12:57:02Z", "hours": 1.4464, "text": "Devlog #32 : New component: CLOCK (finally) This one was relatively easy to implement! The tick system was already there, but it was only triggered by user interactions. Now, your circuits run at 10 ticks/s, and the clock has a constant 1 Hz square signal (the recording below is choppy, but yes it is indeed a 1 Hz periodic signal) This component only has one output. I thought it would make building complex circuits easier if the other sides were isolated. Next steps: 1-bit memory, and then a lot of UX/UI improvements!"}, {"post_id": 76710, "ts": "2026-10-04T11:58:04Z", "hours": 1.9281, "text": "Devlog #31 : UI improvement! I replaced the old “main shortcuts” section in the sidebar with simple links. It frees up some space, makes the interface feel cleaner, and should make it much easier to add a proper “Challenge” tab later. Next steps: add a clock and a 1-bit memory."}, {"post_id": 76242, "ts": "2026-10-02T20:30:28Z", "hours": 2.1839, "text": "Devlog #30 : Component documentation! I’ve added a new page in the sidebar that shows a description and preview image for every component. A few people asked for this in the reviews of my first ship, so it felt like a good addition. Also, if you have any idea of how I could integrate the new more advanced features without overwhelming new users, I’m all ears! The sidebar is starting to get pretty crowded, so I need to find a cleaner way to organize everything and keep navigation smooth. Also, huge thanks to the Stardance staff for awarding this project Superstar ❤️ Next steps: code cleanup, UX improvements, 1-bit memory support, and FINALLY the clock."}, {"post_id": 75958, "ts": "2026-10-01T18:50:05Z", "hours": 4.13, "text": "Devlog #29 : New feature: Multi-layer! You can now build circuits across two layers! I added vias, so you can connect the two layers together (obviously). When you place a via, it’s added on both layers, it basically works like a wire. I also finished the 7-segment decoder: 3bit input, supporting only 0-4 for now. The other values are just don’t-cares. Next steps: polish the code and UI, then add some documentation."}, {"post_id": 75590, "ts": "2026-09-30T14:38:26Z", "hours": 2.4681, "text": "Devlog #28 : Multi-layer (and thank you!!) First of all, thank you so much for all the support on this project! The Stardancers who reviewed my first ship got some really great advices. I’ll be following up on a lot of it. So, I’m planning to add: a simple component documentation some challenges (e.g. 7-segment decoder, XOR gate) more advanced features (clock, 1-bit memory) and what I’m working on right now: a second layer! (currently, wires can’t cross each other, which becomes a real issue with more complex circuits) and, if I have enough time, a place where people can share circuit snippets and showcase their projects! The real challenge will be integrating all of this while keeping the UI clean and the UX intuitive. The screenshot below shows what the circuit viewport could look like with the second layer."}, {"post_id": 74661, "ts": "2026-09-27T21:50:30Z", "hours": 1.2256, "text": "Devlog #27 : Some optimization, code cleanup, and brand new readme! That’s the last devlog for this project before I ship!"}, {"post_id": 74620, "ts": "2026-09-27T19:48:58Z", "hours": 2.7119, "text": "Devlog #26 : I’ve done many small improvements, such as: ability to move annotations undo/redo buttons custom favicon Next step: SHIP!"}, {"post_id": 74207, "ts": "2026-09-26T22:21:43Z", "hours": 2.4531, "text": "Devlog #25 : UI/UX improvements! I improved the component selection outline. Now the outline is around the whole selected group of pixels, instead of around each individual pixel. You can also now delete selected components by pressing Del on your keyboard. And I added a little preview showing the pixel currently targeted by the cursor. Next steps: keep working on the UI/UX, and ship!"}, {"post_id": 74006, "ts": "2026-09-26T14:48:02Z", "hours": 2.2353, "text": "Devlog #24 : New feature (kinda): the camera position and zoom are now stored in the project file, and loaded when you open the project. That means you can setup any point of view in your project, and the viewport will be right where you left it when you open it again! I also fixed a bunch of UI inconsistencies: the hover label position is now responsive to the workspace sidebar (before, it was getting hidden behind it) unified border colors fixed the phone workspace responsiveness made the sidebar on the right a little bit smaller I also continued working on the 7-segment display, but ran into some issues since wires can’t cross each other. So I thought about having circuits on two different layers. What do you think about this? Next steps: I’ll probably polish the UX a little bit more, and then ship the project. But I’m planning to keep working on it!"}, {"post_id": 73755, "ts": "2026-09-25T21:20:35Z", "hours": 5.3378, "text": "Devlog #23 : New feature: Undo/Redo! You can now undo and redo things you’ve done in the editor. This works with both components and annotations. I had to implement a project history system. Basically, every time an action modifies the project, the previous project state is added to the past history stack. When you undo, the latest state from past becomes the current state, while the previous current state is moved to the future stack. When you redo, the next state from future becomes the current state and the previous current state is moved back to past. Yeah it’s messy 😂 I’m also still working on the 7-segment decoder. I switched to a 3-bit one, I’ll probably include it in the demo. Next steps: mostly UI and code improvements, and then I’ll probably ship it. I’ll keep working on it!"}, {"post_id": 73252, "ts": "2026-09-24T17:56:14Z", "hours": 4.5872, "text": "Devlog #22 : New feature: selection and copy/paste! You just have to press “S” and drag your mouse/pad while holding the left click. You can then copy, paste, or move the selected pixels around. Probably the most difficult feature I’ve worked on so far. I had to get some help from ChatGPT :’) I think this will be my last devlog before shipping, since one of my other projects has been pending for 18 days now, so yeah… I’ll still keep working on this project though!"}, {"post_id": 72869, "ts": "2026-09-23T21:59:41Z", "hours": 4.2722, "text": "Devlog #21 : Some UI/UX improvements and started working on selection! I’m currently working on the selection system. It works like this: Press S, then while holding it, drag the selection area with the left click. Once selected, you can copy, paste or move the selected block of pixels. It’s not committed yet! It still requires some work. Next steps: finish the selection feature, then add the clock. I also want to improve the UX as much as possible."}, {"post_id": 72417, "ts": "2026-09-22T21:44:45Z", "hours": 3.6344, "text": "Devlog #20 : demo project and UI/UX update! I added a demo project with a basic light/switch circuit, an OR and XOR gate, and a few annotations. I also (and mostly) removed the old “Quick start” section. It was becoming kinda useless since pretty much everything was already covered by the demo project. So I replaced it with a little intro to the project, along with a table of the shortcuts. I also added a little decoration to the bottom-left corner of the sidebar. I think it looks pretty dope! Next steps: copy/paste and selection, THEN add a clock."}, {"post_id": 71977, "ts": "2026-09-21T21:47:46Z", "hours": 2.3336, "text": "Devlog #19 : A little code cleanup! I refactored the App.tsx file because it was handling too many different things. Now each hook has its own dedicated file. Small refactor, but definitely a needed one! Next steps: add a demo project, improve the UI/UX and laptop pad support, add copy/paste and selection, and finally add a clock (eventually, at this point 😂)"}, {"post_id": 71454, "ts": "2026-09-20T21:12:46Z", "hours": 7.6194, "text": "Devlog #18 : You can save your work now! There are now two buttons in the bottom-left corner: Open and Save. Your projects are downloaded as .cirkuit files. This part was actually quite challenging, mostly because of the file format validation and all the tests around it. Next steps: clean up the code, cleanup the UI (it feels a bit messy right now), add a demo project, add copy/paste and selection, and add a clock"}, {"post_id": 70868, "ts": "2026-09-19T21:55:45Z", "hours": 4.9169, "text": "Devlog #17 : New feature: Annotations! You can now add labels, lines and rectangles to your circuits! I developed this feature so I can better explain what’s going on in the demo project when I’ll ship this project. But you can also use it to explain your craziest circuits! Next step: upload/download projects."}, {"post_id": 70240, "ts": "2026-09-18T19:31:51Z", "hours": 4.5228, "text": "Devlog #16 : Annotation feature (WIP) It’s not finished yet, but I’m currently working on a new annotation feature. Why? Because I’ll need it to explain the circuits in the demo! I’m adding this before the project download/upload system, because otherwise I’d have to refactor quite a bit of the system later. Also, I’m starting to build a 4-bit 7-segment decoder in Cirkuit! (I started with the two easier segments lmao) Next steps: continue working on the annotation system, then implement project download/upload."}, {"post_id": 69732, "ts": "2026-09-17T17:45:12Z", "hours": 4.5497, "text": "Devlog #15 : I added a little guide! The goal of this small guide is to explain a few things that might not be obvious to new users. You can close and reopen it whenever you want, so it doesn’t get in the way while you’re playing. It’s still available on the GitHub page if you want to give it a try! Next step: add a minimal circuit loading system (so I can add a default demo circuit), and THEN I’ll add the clock 😂😭"}, {"post_id": 69345, "ts": "2026-09-16T21:00:55Z", "hours": 4.0622, "text": "Devlog #14 : New component: AND gate! Now the two main gates are available (NOT & AND), so you can basically build anything with them! In the screenshot below, I built a working XOR logic gate, both in a large and a condensed version. A few changes since last time, apart from the new component: The old NOT gate wasn’t working properly because the circuit actually handles 3 states (low, floating, high), while the NOT component only supported low and high. So now, “floating” is considered as “low”. Also, there’s no longer real-time simulation, sadly. I had some issues with the logic gates: if you built them the wrong way, it could crash the entire webpage. So now you have to click on “Run simulation” to see the magic happen. It’s a bit less cool than real-time simulation, but at least it doesn’t nuke the whole page anymore lol. Next steps: UI/UX improvements, clock, and 1-bit memory later on"}, {"post_id": 68867, "ts": "2026-09-15T22:24:51Z", "hours": 5.5678, "text": "Devlog #13 : New component: NOT gate! This component returns the opposite signal you give it: low becomes high, high becomes low. I also improved the UI/UX. There’s now a new label in the bottom-left corner of the page that shows which component you’re hovering over with your mouse, and what its current state is. For example: “Wire | Low”, “Switch | Open”. I also fixed the pixel rendering, because before there were some really thin lines between them. And now the sidebar is responsive! Next steps: code cleanup, AND gate, clock"}, {"post_id": 68303, "ts": "2026-09-14T21:50:03Z", "hours": 2.3831, "text": "Devlog #12 : Wire states are now visually apparent! In the example below, on the first circuit, the first segment is high because it is powered by the source, while the second segment (connected to the lamp) is floating because the switch is open. I’ve also fixed a whole bunch of UI issues. You can try out this project on my GitHub page! Next step (for real this time): adding a NOT gate (the clock will come later)"}, {"post_id": 67690, "ts": "2026-09-13T21:26:19Z", "hours": 0.8703, "text": "Devlog #11 : I did some UI improvements, but before I commit, I’d like to have your opinion for the light component; which glow do you prefere?"}, {"post_id": 67626, "ts": "2026-09-13T19:32:41Z", "hours": 0.7378, "text": "Devlog #10: I added some tooltips so it’s easier to understand for you guys! Next steps: Start writting an actual documentation, add new components"}, {"post_id": 67547, "ts": "2026-09-13T17:58:10Z", "hours": 4.0528, "text": "Devlog #9 : New component: Switch This new component come with a new “simulation” mode, where you can interact with the components. Next step: add small tooltips to the sidebar elements, add new components (clock, memory…) It’s deployed so you can try it (see the project page)! I’d love to get some feedbacks."}, {"post_id": 67325, "ts": "2026-09-13T12:07:15Z", "hours": 0.7281, "text": "Devlog #8 : UI update! Changes: checkerboard background texture instead of the old grid custom selector on the component palette pixel art icons Next step: new components (switch, clock, memory…)"}, {"post_id": 67277, "ts": "2026-09-13T10:52:18Z", "hours": 2.2756, "text": "Devlog #7 : Now power and light can be connected from all sides! Also, since the old arrows are no longer necessary (at least for these components), I improved the UX by displaying the actual component icon instead. The icons on the circuit are also hidden by default now, and only appear when you hover over them. Oh and there’s an eraser now. I also deployed the website: nafo44.github.io/Cirkuit/ Next step: add new components (switch, clock, logic gates, memory)"}, {"post_id": 66878, "ts": "2026-09-12T20:32:38Z", "hours": 3.0808, "text": "Devlog #6: I wired up the simulation engine to the UI! It’s working really well, even tho there’s only 3 components right now (source, wire, light). I added arrows so you can easily rotate the components. I want this project to be really intuitive, so if you guys have some ideas to simplify this, I’m all ears! Next step: let a source and light to power/be powered through all sides, add new components (switch, clock, memory)"}, {"post_id": 66549, "ts": "2026-09-12T12:01:35Z", "hours": 4.5847, "text": "Devlog #5 : Now the component placement UI side is wired to our circuit layout! It probably don’t make much sens for you right now. Next step: modify visually the component grid according to the simulation."}, {"post_id": 65649, "ts": "2026-09-10T22:37:33Z", "hours": 5.8197, "text": "Devlog #4: The other half of the engine is done! It can now compute components state (low, high, floating, conflict) based on the connections between each other. Next step: wiring the engine to the UI."}, {"post_id": 65057, "ts": "2026-09-09T21:57:21Z", "hours": 6.5794, "text": "Devlog #3: I’ve finished half of the engine of my website, made to let you create circuits using pixel art. It wasn’t easy! I came up with a simplified netlist algorithm, to represent how a component (pixel) is oriented, how many are wired, to what, and through which side of the pixel. Components states aren’t handled yet, but that’s what I’m going to work on next."}, {"post_id": 64452, "ts": "2026-09-08T20:55:25Z", "hours": 2.1144, "text": "Devlog #2: I improved the UI, added mouse wheel support (to zoom and move the map). Now it’s time to work on the actual engine."}, {"post_id": 64381, "ts": "2026-09-08T18:22:49Z", "hours": 1.6267, "text": "Devlog #1: Hi! I just started making a website where you will be able to create circuits… with pixel art! The idea is to add different pixels: wire (gray), power (green), light (yellow), logic gates (AND, OR, …), memory (simple true/false state storage). I want to keep this as simple as possible to use."}]...
|
Title: Cirkuit by @spectra | Stardance
Devlogs:
D Title: Cirkuit by @spectra | Stardance
Devlogs:
Devlog #1: Hi! I just started making a website where you will be able to create circuits… with pixel art! The idea is to add different pixels: wire (gray), power (green), light (yellow), logic gates (AND, OR, …), memory (simple true/false state storage). I want to keep this as simple as possible to use.
Devlog #2: I improved the UI, added mouse wheel support (to zoom and move the map). Now it’s time to work on the actual engine.
Devlog #3: I’ve finished half of the engine of my website, made to let you create circuits using pixel art. It wasn’t easy! I came up with a simplified netlist algorithm, to represent how a component (pixel) is oriented, how many are wired, to what, and through which side of the pixel. Components states aren’t handled yet, but that’s what I’m going to work on next.
Devlog #4: The other half of the engine is done! It can now compute components state (low, high, floating, conflict) based on the connections between each other. Next step: wiring the engine to the UI.
Devlog #5 : Now the component placement UI side is wired to our circuit layout! It probably don’t make much sens for you right now. Next step: modify visually the component grid according to the simulation.
Devlog #6: I wired up the simulation engine to the UI! It’s working really well, even tho there’s only 3 components right now (source, wire, light). I added arrows so you can easily rotate the components. I want this project to be really intuitive, so if you guys have some ideas to simplify this, I’m all ears! Next step: let a source and light to power/be powered through all sides, add new components (switch, clock, memory)
Devlog #7 : Now power and light can be connected from all sides! Also, since the old arrows are no longer necessary (at least for these components), I improved the UX by displaying the actual component icon instead. The icons on the circuit are also hidden by default now, and only appear when you hover over them. Oh and there’s an eraser now. I also deployed the website: nafo44.github.io/Cirkuit/ Next step: add new components (switch, clock, logic gates, memory)
Devlog #8 : UI update! Changes: checkerboard background texture instead of the old grid custom selector on the component palette pixel art icons Next step: new components (switch, clock, memory…)
Devlog #9 : New component: Switch This new component come with a new “simulation” mode, where you can interact with the components. Next step: add small tooltips to the sidebar elements, add new components (clock, memory…) It’s deployed so you can try it (see the project page)! I’d love to get some feedbacks.
Devlog #10: I added some tooltips so it’s easier to understand for you guys! Next steps: Start writting an actual documentation, add new components
Devlog #11 : I did some UI improvements, but before I commit, I’d like to have your opinion for the light component; which glow do you prefere?
Devlog #12 : Wire states are now visually apparent! In the example below, on the first circuit, the first segment is high because it is powered by the source, while the second segment (connected to the lamp) is floating because the switch is open. I’ve also fixed a whole bunch of UI issues. You can try out this project on my GitHub page! Next step (for real this time): adding a NOT gate (the clock will come later)
Devlog #13 : New component: NOT gate! This component returns the opposite signal you give it: low becomes high, high becomes low. I also improved the UI/UX. There’s now a new label in the bottom-left corner of the page that shows which component you’re hovering over with your mouse, and what its current state is. For example: “Wire | Low”, “Switch | Open”. I also fixed the pixel rendering, because before there were some really thin lines between them. And now the sidebar is responsive! Next steps: code cleanup, AND gate, clock
Devlog #14 : New component: AND gate! Now the two main gates are available (NOT & AND), so you can basically build anything with them! In the screenshot below, I built a working XOR logic gate, both in a large and a condensed version. A few changes since last time, apart from the new component: The old NOT gate wasn’t working properly because the circuit actually handles 3 states (low, floating, high), while the NOT component only supported low and high. So now, “floating” is considered as “low”. Also, there’s no longer real-time simulation, sadly. I had some issues with the logic gates: if you built them the wrong way, it could crash the entire webpage. So now you have to click on “Run simulation” to see the magic happen. It’s a bit less cool than real-time simulation, but at least it doesn’t nuke the whole page anymore lol. Next steps: UI/UX improvements, clock, and 1-bit memory later on
Devlog #15 : I added a little guide! The goal of this small guide is to explain a few things that might not be obvious to new users. You can close and reopen it whenever you want, so it doesn’t get in the way while you’re playing. It’s still available on the GitHub page if you want to give it a try! Next step: add a minimal circuit loading system (so I can add a default demo circuit), and THEN I’ll add the clock 😂😭
Devlog #16 : Annotation feature (WIP) It’s not finished yet, but I’m currently working on a new annotation feature. Why? Because I’ll need it to explain the circuits in the demo! I’m adding this before the project download/upload system, because otherwise I’d have to refactor quite a bit of the system later. Also, I’m starting to build a 4-bit 7-segment decoder in Cirkuit! (I started with the two easier segments lmao) Next steps: continue working on the annotation system, then implement project download/upload.
Devlog #17 : New feature: Annotations! You can now add labels, lines and rectangles to your circuits! I developed this feature so I can better explain what’s going on in the demo project when I’ll ship this project. But you can also use it to explain your craziest circuits! Next step: upload/download projects.
Devlog #18 : You can save your work now! There are now two buttons in the bottom-left corner: Open and Save. Your projects are downloaded as .cirkuit files. This part was actually quite challenging, mostly because of the file format validation and all the tests around it. Next steps: clean up the code, cleanup the UI (it feels a bit messy right now), add a demo project, add copy/paste and selection, and add a clock
Devlog #19 : A little code cleanup! I refactored the App.tsx file because it was handling too many different things. Now each hook has its own dedicated file. Small refactor, but definitely a needed one! Next steps: add a demo project, improve the UI/UX and laptop pad support, add copy/paste and selection, and finally add a clock (eventually, at this point 😂)
Devlog #20 : demo project and UI/UX update! I added a demo project with a basic light/switch circuit, an OR and XOR gate, and a few annotations. I also (and mostly) removed the old “Quick start” section. It was becoming kinda useless since pretty much everything was already covered by the demo project. So I replaced it with a little intro to the project, along with a table of the shortcuts. I also added a little decoration to the bottom-left corner of the sidebar. I think it looks pretty dope! Next steps: copy/paste and selection, THEN add a clock.
Devlog #21 : Some UI/UX improvements and started working on selection! I’m currently working on the selection system. It works like this: Press S, then while holding it, drag the selection area with the left click. Once selected, you can copy, paste or move the selected block of pixels. It’s not committed yet! It still requires some work. Next steps: finish the selection feature, then add the clock. I also want to improve the UX as much as possible.
Devlog #22 : New feature: selection and copy/paste! You just have to press “S” and drag your mouse/pad while holding the left click. You can then copy, paste, or move the selected pixels around. Probably the most difficult feature I’ve worked on so far. I had to get some help from ChatGPT :’) I think this will be my last devlog before shipping, since one of my other projects has been pending for 18 days now, so yeah… I’ll still keep working on this project though!
Devlog #23 : New feature: Undo/Redo! You can now undo and redo things you’ve done in the editor. This works with both components and annotations. I had to implement a project history system. Basically, every time an action modifies the project, the previous project state is added to the past history stack. When you undo, the latest state from past becomes the current state, while the previous current state is moved to the future stack. When you redo, the next state from future becomes the current state and the previous current state is moved back to past. Yeah it’s messy 😂 I’m also still working on the 7-segment decoder. I switched to a 3-bit one, I’ll probably include it in the demo. Next steps: mostly UI and code improvements, and then I’ll probably ship it. I’ll keep working on it!
Devlog #24 : New feature (kinda): the camera position and zoom are now stored in the project file, and loaded when you open the project. That means you can setup any point of view in your project, and the viewport will be right where you left it when you open it again! I also fixed a bunch of UI inconsistencies: the hover label position is now responsive to the workspace sidebar (before, it was getting hidden behind it) unified border colors fixed the phone workspace responsiveness made the sidebar on the right a little bit smaller I also continued working on the 7-segment display, but ran into some issues since wires can’t cross each other. So I thought about having circuits on two different layers. What do you think about this? Next steps: I’ll probably polish the UX a little bit more, and then ship the project. But I’m planning to keep working on it!
Devlog #25 : UI/UX improvements! I improved the component selection outline. Now the outline is around the whole selected group of pixels, instead of around each individual pixel. You can also now delete selected components by pressing Del on your keyboard. And I added a little preview showing the pixel currently targeted by the cursor. Next steps: keep working on the UI/UX, and ship!
Devlog #26 : I’ve done many small improvements, such as: ability to move annotations undo/redo buttons custom favicon Next step: SHIP!
Devlog #27 : Some optimization, code cleanup, and brand new readme! That’s the last devlog for this project before I ship!
Devlog #28 : Multi-layer (and thank you!!) First of all, thank you so much for all the support on this project! The Stardancers who reviewed my first ship got some really great advices. I’ll be following up on a lot of it. So, I’m planning to add: a simple component documentation some challenges (e.g. 7-segment decoder, XOR gate) more advanced features (clock, 1-bit memory) and what I’m working on right now: a second layer! (currently, wires can’t cross each other, which becomes a real issue with more complex circuits) and, if I have enough time, a place where people can share circuit snippets and showcase their projects! The real challenge will be integrating all of this while keeping the UI clean and the UX intuitive. The screenshot below shows what the circuit viewport could look like with the second layer.
Devlog #29 : New feature: Multi-layer! You can now build circuits across two layers! I added vias, so you can connect the two layers together (obviously). When you place a via, it’s added on both layers, it basically works like a wire. I also finished the 7-segment decoder: 3bit input, supporting only 0-4 for now. The other values are just don’t-cares. Next steps: polish the code and UI, then add some documentation.
Devlog #30 : Component documentation! I’ve added a new page in the sidebar that shows a description and preview image for every component. A few people asked for this in the reviews of my first ship, so it felt like a good addition. Also, if you have any idea of how I could integrate the new more advanced features without overwhelming new users, I’m all ears! The sidebar is starting to get pretty crowded, so I need to find a cleaner way to organize everything and keep navigation smooth. Also, huge thanks to the Stardance staff for awarding this project Superstar ❤️ Next steps: code cleanup, UX improvements, 1-bit memory support, and FINALLY the clock.
Devlog #31 : UI improvement! I replaced the old “main shortcuts” section in the sidebar with simple links. It frees up some space, makes the interface feel cleaner, and should make it much easier to add a proper “Challenge” tab later. Next steps: add a clock and a 1-bit memory.
Devlog #32 : New component: CLOCK (finally) This one was relatively easy to implement! The tick system was already there, but it was only triggered by user interactions. Now, your circuits run at 10 ticks/s, and the clock has a constant 1 Hz square signal (the recording below is choppy, but yes it is indeed a 1 Hz periodic signal) This component only has one output. I thought it would make building complex circuits easier if the other sides were isolated. Next steps: 1-bit memory, and then a lot of UX/UI improvements!
Devlog #33 : Docs update and 1-bit memory! I added the clock to the docs page, along with some new tests for it. I’m also almost done with the 1-bit memory (basically a simplified D flip-flop). I’ll share it in the next devlog! Also, if you like this project, you can leave a star on the project’s GitHub page if you wish! Next steps: finish the 1-bit memory and clean up the UI/UX
Devlog #34 : New component: Memory! This is one step up in difficulty! It has two inputs: a clock input (at the top) and a signal input (on the left). The output signal is provided on the right. This component can store a 1-bit value, which is updated on every rising edge of the clock signal. You can basically build anything with the component available: calculator, more advanced display (e.g. a 7-segment decoder that can go from 0 to 9). I added a 3-bit binary counter that I wired up to my 7-segment decoder! (demo bellow). It’s also included in the demo project file. Next steps: cleanup UI and improve UX (the sidebar is really really crowded right now)
Devlog #35 : UI cleanup and (another) demo circuit The sidebar was getting a bit too crowded, so I added a small button to show/hide the more advanced components. The idea is to make things a little less overwhelming for new users, instead of throwing everything at them right away. I also worked on a 4-bit adder and wired it up to my 7-segment decoder! I’m going to try making it a 4-bit decoder instead of a 3-bit one, but things are going to get a lot more complicated (more numbers = more logic gates). One small issue with the adder for now: the most significant bit is on the right, so the input is basically reversed. I’ll fix that soon. In the meantime, you can already try it out in the live demo project! As always, if you enjoy the project, feel free to leave a star on GitHub! Repo: https://github.com/NaFo44/Cirkuit Next steps: more UI/UX improvements, adding challenges, and continuing to waste way too much of my time messing around with circuits xd
Devlog #36 : Probe tool and 4-bit calculator. While I was working on improving my 7-segment display, I had quite a hard time simplifying the circuit. Then I thought it could be really useful to have a tool that shows all the equipotential wires. So I’m currently working on it! It’s working, but I still have to improve its style before publishing it. Aside from that, I actually spent way too many hours improving the 4-bit calculator. And it’s now finished! It’s available in the demo circuit if you want to try it. I’ll see if I can build a keyboard later so users don’t have to enter numbers in binary. As always, if you enjoy the project, feel free to leave a star on GitHub! Repo: https://github.com/NaFo44/Cirkuit Next steps: finish the Probe tool, polish the UI, add a “challenge” tab.
Devlog #37 : Probe tool is out! You can now inspect your circuits with this new tool. It highlights equipotential wires. I also added small circles to every connected ports. Next steps: UI polish, and maybe a “challenge” or “community circuits” tab.
Devlog #38 : Integrated circuits Some of you have requested this, so I’m working on it! It’s not out yet, as it’s a pretty big feature. Integrated circuits will basically be custom components (most likely rectangles) with multiple inputs and outputs, all defined by the user. It’s literally a footprint, kinda like what you’d find in KiCad. I’ve started modifying the engine’s internals so it can handle these new types of connections (alongside the classic 1-pixel components). The real challenge here is keeping everything simple on the UX side, even though this feature targets more advanced users. The image below only shows what it might look like, this will probably change over time. As always, if you enjoy the project, feel free to leave a star on GitHub! Repo: https://github.com/NaFo44/Cirkuit Next steps: keep working on this feature, polish the UI/UX, ship it, and sadly… the end of stardance :(
Devlog #39 : Integrated circuits (again) I’m still working on this feature! I’m not at the frontend part yet, still adapting the engine. More details if you’re curious: A module has a definition that includes its name, public pins, and internal circuit. It can be used multiple times (it’s called an instance in the code). And all modules are listed in a catalog (that I’ll probably integrate in the frontend later). Instances can be selected, moved, copied and pasted, across the layers… The picture bellow shows how this feature could be used. It will make things much easier if you want to build more complex circuits like an 8 bit adder. You’ll just have to stack 8x 1-bit full adder modules! As always, if you enjoy the project, feel free to leave a star on GitHub! Repo: https://github.com/NaFo44/Cirkuit Next steps: finish the backend side, then integrate everything into the frontend, polish the UI, and ship!
Devlog #40 : Integrated circuits I’m (again) still working on this feature! Since my last devlog, I’ve updated the project document format to serialize the new modules. And that’s basically it! Next step: integrate them into the UI, polish the UX, and ship!
Ships:
Hi! I’m really happy to introduce you to my biggest project so far. It’s called Cirkuit, and it’s a logic circuit sandbox simulator… but with pixel art! That means you can basically build anything using just pixels. Why pixels? You may ask. Well, many logic simulators already exist, but the issue is that most of them aren’t very accessible to the average user. That’s why I wanted Cirkuit to be as easy to use as possible. I’m already quite familiar with TypeScript and React, which I used for this project. So the most difficult part was actually figuring out how to implement features without having 100 nested loops :D I had a hard time figuring out how to build the core engine (obviously), as well as the annotation system. I’m quite proud of how it looks and how well it works. This project was a perfect opportunity for me to improve my design skills. I worked hard to reduce friction between the interface and the user (aka you, dear shipwriters). One piece of advice: try it on a computer with a mouse. Phones and trackpads are supported, but it’s not the best experience. Hope you’ll like this project!...
|
1792961607.9052622
|
1793048007.9052622
|
|
29750
|
Thintensors by @satvikhardat | Stardance
|
satvikhardat
|
2
|
106.0
|
1763
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T10:54:37Z", "hours": 74.0, "multiplier": 18.49, "payout": 1252, "blessing": "neutral", "text": "Its a runtime-aware LLM archive format built for fast, efficient inference, This ship basically integrates MoE model paths, that allows you to run models like gpt-oss-20B on speeds and quality faster and better than llama.cpp!! (at q4) its not just the storage format that allows for the improvements, its a combination of different selective layers being quantized with the better storage format, allowing to run inference with higher speed and quality than just simple q8,q4 etc quants. the storage format only gain is only like 10%, but combined with middle out fp8 quants, and even int4 for some performance profiles, it can reach better speeds than the other ways to run inference This does not beat TRT / TRT LM, it does allow for quicker inference, and a more portable solution because for TRT you need to compile the plan (one time) for a few mins before being able to run the model, and it has to be compiled on every machine you run the model on, thintensor allows you to directly have the .thin file and run it on any machine with similar results! and it takes just a few seconds compared to about 30 mins on trt and trt lm reddit post for this project- https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ independent tester’s view- https://github.com/random-unknown-username/Thintensor/issues/1 Let me know if u find any issues, tried a lot of other models here too, as u can see in the graphs :D let me know of any bugs on slack", "repo": "https://github.com/random-unknown-username/Thintensor", "demo": "https://pypi.org/project/thintensor/1.0.1/"}, {"ship_num": 2, "ts": "2026-07-08T11:29:10Z", "hours": 32.0, "multiplier": 18.95, "payout": 511, "blessing": "neutral", "text": "I made ThinTensor, a runtime-aware LLM archive and inference runtime. Instead of only storing tensor bytes, it stores tensor roles, memory pages, quant metadata, and execution hints so the runtime can choose faster kernels and precision paths. The hardest part was keeping speed gains honest with HF correctness checks. So far it reaches up to ~94 tok/s on SmolLM3-3B with full BF16 KV retention and high logit similarity. After being tested on multiple models, you can get a avg 2x performance increase on most LLM archs, all archs are still not implemented, ik but this is workable with qwen, gemma, some MoE models, and SmolLM and a most others, but it wont be as optimized for all the model types Follow the guide at https://github.com/random-unknown-username/Thintensor#fast-path-setting-up-on-a-new-laptop To install thintensor runtime and use this guide to get a sample qwen model up and running https://github.com/random-unknown-username/Thintensor#quickstart-downloading--running-a-sample-model-qwen-08b", "repo": "https://github.com/random-unknown-username/Thintensor", "demo": "https://pypi.org/project/thintensor/1.0.1/"}]...
|
[{"post_id": 52970, "ts": "202 [{"post_id": 52970, "ts": "2026-08-23T10:50:48Z", "hours": 0.4203, "text": "Fixed a few Dense path issues, because the MoE path somehow made the dense path completely usable, fixed a few small one line bugs i got to know from the last ship’s reviews, read to for ship 2!!"}, {"post_id": 47007, "ts": "2026-08-14T16:14:41Z", "hours": 7.4253, "text": "Hitting 100hrs and final ship Didnt get time to work on this idea, since quite the while. And it has js about reached the state i can probably get it to MoE arch works, dense models work, cpu/gpu streaming works well, context/kv cache is also dynamically quanted lm_head quants are also there now The motivation really died out because of this project not getting reviewed its been over a month, leaving this as is, tho its not perfect, but it js about has enough features that i wanted Here are the final results after a ton of benchmarking- Phi-4: ThinTensor 28.21 tok/s vs llama.cpp 17.50 tok/s — 1.61× faster (+61.2%). Quality: 0.999949 cosine vs 0.997281. OpenReasoning-Nemotron-14B: ThinTensor 23.79 tok/s vs llama.cpp 19.79 tok/s — 1.20× faster (+20.2%). Quality: 0.999533 vs 0.967140. Llama 3.2 11B: ThinTensor 41.02 tok/s vs llama.cpp 39.82 tok/s — 1.03× faster (+3.0%). Quality: 0.995095 vs 0.991938. Qwen3.5-9B: ThinTensor 43.28 tok/s vs llama.cpp 42.83 tok/s — 1.01× faster (+1.1%). Quality: 0.973334 vs 0.894908. GPT-OSS-20B: ThinTensor 50.34 tok/s vs llama.cpp 40.36 tok/s — 1.25× faster (+24.7%). Quality: 0.983299 vs 0.792350. *all are apples to apples btw Overall: ThinTensor beats llama.cpp Q4 throughput on 5/5 tested architectures , with a geometric-mean speedup of approximately 1.203× . Probably gonna take a break, and learn before comming back to this, after the ship-2 on stardance!"}, {"post_id": 36344, "ts": "2026-07-28T12:16:13Z", "hours": 6.2056, "text": "ThinTensor Improvements Universal semantic-IR runtime for mixed attention, dense and MoE architectures. Per-tensor precision, kernel and residency planning instead of layer-wide quantization. Production FP8, INT4, MXFP4, Q2 and Q1 quantizers with calibration-aware scoring. Hard ≥0.995 cosine certification with exact routing, greedy-token and KV checks. Qwen3.5 hybrid linear-attention, shared-expert and packed rank-3 MoE support. Durable grouped-INT4 expert sidecars with bounded-RAM, mmap-based construction. Fixed four-matrix Triton projection, cuda / cuda:0 , layer-zero and converter-role bugs. Improved fused kernels, KV caching, expert routing and decode hot paths. Strict cache identity across model, tokenizer, GPU, CUDA, kernels and calibration. Remaining goal: prove ≥30 tok/s on Qwen3.5-35B-A3B at certified ≥0.995 cosine. Getting way better speed on 27B dense models at a cosine that is also way better"}, {"post_id": 34506, "ts": "2026-07-25T08:53:57Z", "hours": 11.7969, "text": "I ammmm tierdd i tried a billionn things over the last 8 hours i just cant seem to understand why gemma4 doesnt want to workkkkk I dont have much to write in this devlog, other than, i am not gonna implement gemma arch for now"}, {"post_id": 33051, "ts": "2026-07-22T17:00:01Z", "hours": 1.0547, "text": "what I did to fix the numerical drift & get some speedups: The Root Cause of the Drift (The Cosine Fix): I discovered that in triton_kernels.py , the tl.dot_scaled call inside _mxfp_lowbit_selected_tensorcore_matvec_kernel (and the mxfp4 variant) had fast_math=True . The fast_math option drops critical precision bits during accumulator addition which was causing the MoE kernels to completely obliterate the trajectory. I disabled it globally using fast_math=False , and this instantly restored our cosine similarity to a perfect 1.000000 over the entire benchmark trajectory. The VRAM Bottleneck: When relying purely on MXFP4 experts, they required over 9.5 GB, breaking the 6.6 GiB budget and forcing the runtime to stream them via PCIe (which tanks performance down to ~5-10tok/s). The Q2 and Q1 low-bit expert decoding kernels actually achieve identical numerical accuracy to the baseline while aggressively packing the weights. The 97.87 tok/s Optimization: I configured bench.py and check_baseline_cosine.py to use: packed_expert_q1_layers=\"0:24\" : All 24 layers of MoE experts are now tightly packed into 1-bit Q1 structures, shrinking the expert memory footprint down to just 2.38 GB (from 9.52 GB). dense_int4_layers=\"all\" : Shrunk the non-expert dense projection weights (Q, K, V, O) into INT4, dropping their footprint from ~1.1 GB to ~0.27 GB. Since the entire model now takes 5.29 GiB (fitting entirely within the 6.6 GiB budget), all layers are pinned directly to VRAM. Because zero layers are streamed (any_streamed=False), the runtime successfully builds the fully fused cuda_graphs execution path, accelerating generation from a crawl to 97.87 tok/s ON gpt-oss-20b. I believe ill be moving to dense models just about now All these issues took SOOO many tests to find"}, {"post_id": 32869, "ts": "2026-07-22T09:43:09Z", "hours": 6.2739, "text": "What I’ve Done: Fixed KV Cache Indexing in Graph Mode: The previous cudaErrorStreamCaptureUnsupported error and out-of-bounds access were caused by assigning python integers dynamically during capture, and failing to respect block sizing. I modified the KV cache’s _in_graph_mode behavior to compute the tensor-based slot offset dynamically ((slot % block_size).view(1)) directly inside the graph capture. This worked successfully and fully restored the model’s coherent output without breaking graph logic. Experimented with MLP Block Sizing: I attempted to increase block_m and num_warps in the 1-bit Triton kernel (mxfp_lowbit_selected_swiglu) to reduce redundant memory loads of the intermediate x tensor. Unfortunately, register limits and memory layout meant it actually resulted in worse throughput, so I reverted those changes. Experimented with Attention Loop Early Exit: The single_token_gqa_attention_kernel is statically unrolled up to token_bucket (256). I tried adding a dynamic while loop to break early for short context sizes, but Triton’s compiler handles static for loops much better. reached around 65tk/s on gpt-oss-20b, constantly improvising MoE performance, next ima lock in for dense models but for now on MoE"}, {"post_id": 32489, "ts": "2026-07-21T18:25:21Z", "hours": 3.3508, "text": "Implemented a huge list of fixes Lazy page-ID tensor resolution after quantization Storage-alias-aware VRAM accounting Correct affine INT4 partial-group quantization KV sequence continuity checks Free-page geometry invalidation Canonical LM-head bias and final-softcap handling Certified shortlist logic with exact fallback Gemma-style attention scaling/softcap fixes Removal of hot-path CUDA scalar tensor allocations Device normalization for “cuda”, “cuda:N”, and torch.device Profile separation has been reconnected and different profiles select different kernels. Paged KV storage exists through SlabbedKVCache. A prior paged-attention slowdown was caused by GPU synchronization from .item() calls in SlabbedKVCache.append(), not by paged addressing itself. Logical page ownership is now tracked CPU-side to avoid those synchronizations. Paged attention has measured approximately: Materialized: 55.1 tok/s Paged: 57.5 tok/s on a relevant smaller models"}, {"post_id": 32108, "ts": "2026-07-21T01:27:17Z", "hours": 10.3133, "text": "Devlog-idk atp Well i said that i would stop working on this project last devlog, butttt, i just saw this https://github.com/random-unknown-username/Thintensor/issues/1 Someone tried thintensor on a 128gb unified ram DGX spark, ANDDDDD now i wanna make it good enough like so its a finished thing"}, {"post_id": 28811, "ts": "2026-07-15T09:45:15Z", "hours": 0.805, "text": "Final devlog: I would be moving from this project to other cool stuff i have in mind, the final benchmarks i got and everything, is pushed, had to do a lot of improvements to get bigger models running just as good as small ones I know there can be a lot of other optmizations, but maybe a few months later ill come back to this, but for now, its gonna stay as is."}, {"post_id": 28164, "ts": "2026-07-14T09:02:15Z", "hours": 13.7189, "text": "This devlog retains the apples-to-apples GPT-OSS control plus fresh Qwen3.5-9B, Llama 3.2 11B text-path, OpenReasoning-Nemotron-14B, and Phi-4 A LOT of optimizations were done to achive this results and 100s of benchmarks in different profiles and stuff, to get to this final table"}, {"post_id": 26560, "ts": "2026-07-11T13:36:08Z", "hours": 2.2911, "text": "ThinRuntime GPT-OSS-20B now achieves: 50.3445 tok/s median across three explicit 200-token runs. llama.cpp b9964 Q4_K_M: 40.3631 tok/s mean. ThinRuntime is 24.73% faster. Exact embedding and LM head; Q1/Q2 applies only to experts. Zero expert transfers during decode. Top-1 unchanged through step 4. Cosine: 0.987376 step 1, 0.983299 step 4. Accepted one-step configuration: 0.991415 cosine. llama.cpp Q4_K_M source-relative cosine: 0.792350."}, {"post_id": 26399, "ts": "2026-07-11T05:13:04Z", "hours": 7.2128, "text": "Worked over a LOT of stuff, like doing apples to apples comparisions of models such as LLama 11b vision instruct, So over time I fixed a lot of stuff added a new profile, that quants and quants and quants all layers till the model fits your VRAM, it doesnt care if the model is 20gb in weigths and you have a 8gb vram, it will quant and make it fit So testing this autofit profile on LLama 11b vision instruct, heres what i found it hit a cosine of 0.939758 and around 24tk/s on a 200 token test Similarly i tested ollama Llama 11b vision instruct with q4_k_m quant, it got a cosine close to 0.720495 i would say it would be more closer to 0.8 because this cosine was for only top 20 logprobes that ollama exposes This was done on 8gb vram rtx 5050 laptop 32gb ddr 5 ryzen 7 250 arch linux and the comparision is apples to apples because the thinruntime also quanted the model aggressively"}, {"post_id": 25725, "ts": "2026-07-10T05:02:15Z", "hours": 1.8908, "text": "Devlog: Resolving GPU Memory Corruption & CUDA Assertions on Wide Matvecs 1. The Symptoms When running inference/benchmarks on unquantized models (like Qwen3.5-9B) using the Triton backend on laptop GPUs (e.g., RTX 5050), the runtime encountered two asynchronous CUDA faults: • cudaErrorIllegalAddress (Illegal memory access) during cache eviction. • device-side assert triggered ( indexSelectSmallIndex assertion failed) during embedding vocabulary lookups. 2. The Root Cause (Resource Starvation & Memory Corruption) Wide Layer Geometries: In Qwen3.5, the projection matrices (Query, Key, Value) have a columns dimension of cols = 3584 . Triton Padded Tiling: Triton pads non-power-of-two shapes to the next power of two ( BLOCK_N = 4096 ). Static Tile Size: The default Triton config mapping uses BLOCK_M = 64 for wide matrices. This instructs Triton to compile a kernel loading a massive static tile size of 64 × 4096 = 262,144 elements. Register & Shared Memory Overflow: In FP32 accumulation, this tile requires 1 MB of memory per thread block. However, laptop GPU streaming multiprocessors (SMs) have a physical hardware limit of 96KB–100KB of shared memory/register files. The Failure Cascade: The compiler failed to allocate resources cleanly, resulting in severe register spills and memory read violations. Triton silently returned corrupted/NaN outputs. The subsequent argmax logit lookup generated a garbage token index (out of bounds), which triggered the PyTorch device-side assertion on the next step. 3. The Fix (Dynamic Chunked Looping) To prevent resource starvation, we modified Triton’s launching configuration in triton_kernels.py: Wide Column Routing: Added a check to detect if cols > 2048 . Looped Execution: Instead of loading the entire 4096 columns block statically, we force the kernel to execute _matvec_looped_kernel using a chunk size of BLOCK_N = 512 . Memory Optimization: The kernel loops through the columns sequentially in chunks of 512. This drops the tile size memory requirement per block to under 64 KB, which safely fits inside any laptop GPU’s physical SM limits. 4. Results I am currently running the final profiles ( max-performance and max-max-perf ). Let me check on the status!"}, {"post_id": 25311, "ts": "2026-07-09T15:03:13Z", "hours": 0.8025, "text": "Posted about this on reddit! https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ Got a lot of feedback, gonna try to work over it over the next few weeks"}, {"post_id": 24643, "ts": "2026-07-08T11:18:54Z", "hours": 0.3739, "text": "Final benchmarks Smaller models have lower cosine because there are like really small like 1B but, some archs are still not fully optimized to run at a good bit faster speed, ik, but i would want to do a ship before working on getting the speed up on those"}, {"post_id": 24238, "ts": "2026-07-07T17:44:41Z", "hours": 0.9025, "text": "Finished benchmarking a few more models Hitting really really good tk/s when compared to hf that even fails to load the models on my 8gb vram, so its a HUGE improvement for gpu poor ppl like me 😭 Reason a lot less improvement for many models is that, each model has a different structure and i havent been able to make a generalized algorithm that would work for all, so for now, we are working with just a simple implementation Benchmark Methodology and Metrics Calculation To ensure accurate, robust, and reproducible results, the benchmarking and correctness scoring flow is executed as follows: 1. Benchmark Execution Workflow Benchmarks are run in isolated, dedicated Python processes for each engine (ThinTensor vs. Hugging Face Transformers) to prevent memory leakage or process interference: ThinTensor Baseline : The model is loaded via the thin_runtime.py engine. Weight Fit Planning : The runtime runs _automatic_fit_plan to estimate weight size. If the model’s weights do not fit within the available GPU VRAM (accounting for system/display manager overhead), it dynamically configures streaming weight residency ( --weight-residency stream ) and streams layers/experts block-by-block from CPU/RAM to the GPU. If the weights fit, it uses fully resident weights ( --weight-residency all ). Timing : Prefills the prompt (default “Hello”), decodes a number of warmup tokens (default 10) to initialize caches and compile/warm up Triton kernels, and then times the next decode steps (default 200) using wall-clock time ( time.perf_counter() ). Transformers (Hugging Face) Baseline : The model is loaded via a dedicated script bench_hf_transformers_decode.py in BF16 precision. RAM/CPU Offloading : For larger models (e.g. Gemma-4-E2B, OLMoE), loading the model fully on memory-constrained GPUs (like the RTX 5050 Laptop GPU with 7.57 GiB VRAM) causes CUDA OOM. To prevent OOM, RAM offloading is enabled via device_map=\"auto\" . Weights that exceed VRAM capacity are kept in CPU system RAM and loaded/swapped as needed. Timing : Like ThinTensor, it pre-runs a prompt prefill, decodes warmup tokens (default 10), and then times steps (default 200) decode steps. The decode loop avoids GPU-to-CPU synchronization (e.g. calling .item() inside the timed loop) to measure pure GPU decoding speed. 2. Metrics & Scores Calculation Thin/HF Peak GiB (Peak GPU Memory) : Tracks peak allocated VRAM in GiB using torch.cuda.max_memory_allocated() . This measures active tensors allocated by PyTorch’s allocator during the decode phase (excluding unallocated cache reserve or general display server memory). Min Cosine (Cosine Similarity) : In compare_hf_thin_logits.py , the logits of the final linear projection layer are collected for both models. Cosine similarity is calculated for the target token index at each step. The minimum cosine similarity found across all decode steps (e.g., step 1 and step 10) and prefill lengths (e.g., 1 and 128) is reported. Top-1 Match : A boolean check indicating whether the token ID with the highest probability (highest logit value) is identical between ThinTensor and HF at all decode steps. Top-5 Set : A boolean check indicating whether the set of top-5 highest-probability token IDs is identical between the two models at all steps (ignoring their internal sorted order). Top-5 Order : A boolean check indicating whether the exact sorted order of the top-5 token IDs matches between ThinTensor and HF at all steps. KV Retention : Specifies the KV cache precision format (e.g. full BF16 )."}, {"post_id": 24052, "ts": "2026-07-07T10:55:07Z", "hours": 5.2325, "text": "Dev Log #4 — 91–96 tok/s with Selective MXFP4 This was the first ThinTensor run that felt genuinely fast. On SmolLM3-3B, the selective MXFP4 gate/up profile reached around: ~91–96 tok/s and on the strong tested record it still preserved: cosine_similarity: 0.9994624257087708 top1_same: true top5_overlap: 0.8 generated_token_match_rate: 0.875 KV retention: full BF16 That cosine is extremely close to the HF BF16 reference: 1.0 - 0.9994624257087708 = 0.0005375742912292 So the run was only about 0.054% away from perfect cosine on that tested checkpoint. Why this was not just normal quantization The profile was selective: MXFP4 gate/up layers: 0:24 MXFP4 row postscale: enabled LM head: FP8 guarded path KV cache: full BF16 attention path: causal KV QKV/O/down: not blindly pushed into MXFP4 A full MXFP4 sweep over QKV, O, down, and gate/up was fast, but it destroyed the logits. That proved the obvious thing: fewer bytes alone is not enough. ThinTensor’s win comes from being role-aware. The runtime knows what each tensor does: Q / K / V O projection gate projection up projection down projection norm embedding LM head KV cache That means the runtime can apply aggressive precision only to the parts that tolerate it. For this result, the safe target was the MLP gate/up path. Why gate/up was the right target Single-token decoding is mostly a weight-read problem. Tthe goal became: reduce gate/up bytes keep attention stable keep KV exact keep LM head guarded preserve token ranking That is exactly what the selective MXFP4 profile does. It uses MXFP4 on the gate/up projections for layers 0:24 , but it does not blindly lower every sensitive path. Where Blackwell helps The test GPU is an RTX 5050 laptop GPU, which is Blackwell. That matters because Blackwell has native low-precision paths for FP4/MXFP4-style execution. ThinTensor uses this through Triton kernels that treat MXFP4 as an execution format, not just a smaller storage format. The idea is: store/read fewer bytes use block scales multiply against BF16 activations accumulate safely then apply row postscale The goal is to make each token cheaper to decode while keeping the output distribution close to HF BF16. The code side The relevant code is built around these ideas: 1. Honest quantization descriptors The QuantizationDescriptor describes the source format: method storage_dtype bits group_size scale_dtype zero_point modules_to_not_convert source_config For example: INT4 != FP4 Q8 != FP8 MXFP4 != generic Q4 The precision_ladder() function makes that explicit. It lists safe choices, opt-in choices, and lossy choices. So instead of silently lowering precision, the runtime can say: preserve native format fallback to BF16 or require explicit validation before requantization 2. Execution planning plan_quantization() decides what should happen at runtime. It can choose: preserve source storage use native kernel dequantize to BF16 or reject unsupported requantization The important flag is this: exact_storage_preserved If this is true, the runtime is using the source encoding directly. Whats next I would have to implement all mainstream model archs manually because all are diff, and like right now you can see, there are a lot of models that are heavily un-optimized Also im messaging stardance team on slack these devlogs too smol for me"}, {"post_id": 22313, "ts": "2026-07-04T18:31:05Z", "hours": 0.8797, "text": "Just hit 91tk/s with “cosine_similarity”: 0.9994624257087708 its actually crazy its like 5x faster the hf full devlog comming soon! ITS LIKE 0.054% away from perfect!!! The selective MXFP4 gate/up profile reached ~96 tok/s while preserving top-1 on the tested SmolLM3-3B through my thintensor runtimeeeee Full DevLogs gonna be crazy"}, {"post_id": 22113, "ts": "2026-07-04T12:07:02Z", "hours": 0.4494, "text": "Initial benchmarks based on some testing on a 3B model Why response similarity? Because we are making a storage format not “just” a runtime, so we need to ensure the model we are optimizing using thintensor runtime it HAS to be replying with the same responses like the original model! So with casual Kv implemented these are the benchmarks i gathered, if you wanna learn what quality fp8 is read my last devlog :D PS- the vram usage on our ThinTensor quality FP8 is just 500 mb more than the q8 even though there is a HUGE difference in the response similarity"}, {"post_id": 22063, "ts": "2026-07-04T09:46:10Z", "hours": 7.5944, "text": "Dev Log #3 — SmolLM3-3B Results SmolLM3-3B was the first real test of ThinTensor as an inference runtime. The baseline was Hugging Face BF16 on my RTX 5050 laptop GPU: HF BF16: ~17.8 tok/s ThinTensor BF16 reached: ThinTensor BF16: ~32–33 tok/s with cosine around 0.999 , meaning the logits stayed extremely close to the original SafeTensors/HF path. That matters because a storage/runtime format should not make the model noticeably worse. Then came the quality FP8 profile: ThinTensor quality FP8: ~46–48 tok/s This was not “quantize everything.” The profile was selective: gate/up projections: FP8 middle down projections: FP8 attention path: BF16 O-proj: BF16 LM head: BF16 KV cache: BF16 ThinTensor can do this because the .thin manifest and execution tape know tensor roles: Q, K, V, O, gate, up, down, norm, embedding, LM head, etc. The runtime can then lower precision only where the model tolerates it, while keeping sensitive paths in BF16. The kernel side reflects this. Attention uses single-token GQA and maps each query head to the right KV head: head = tl . program_id ( 0 ) kv_head = head // ( heads // kv_heads ) scores = tl . sum ( key * q [ None , :], axis = 1 ) * scale The FP8 MLP path uses scaled matvecs: w = tl . load ( weight + offs_m [:, None ] * stride_wm + offs_n [ None , :]) xv = tl . load ( x + offs_n ). to ( tl . float32 ) scale = tl . load ( scales + offs_m ). to ( tl . float32 ) acc = tl . sum ( w * xv [ None , :], axis = 1 ) * scale In one full-vocab centered-logit comparison: GGUF Q8_0 min cosine: 0.952666 ThinTensor BF16 min cosine: 0.999596 ThinTensor quality FP8 min cosine: 0.995366 So ThinTensor quality FP8 stayed much closer to BF16 than the measured Q8 path, while staying in the same speed class. Final speed table: HF BF16: ~17.8 tok/s ThinTensor BF16: ~32–33 tok/s ThinTensor quality FP8: ~46–48 tok/s Ollama / GGUF Q8_0: ~44.1 tok/s Headline: ThinTensor BF16 was ~1.8x faster than HF BF16. ThinTensor quality FP8 was ~2.6x faster than HF BF16. ThinTensor quality FP8 was faster than the measured Q8 baseline while preserving much better logit fidelity. This is where ThinTensor stopped being just an archive experiment and started looking like a real inference runtime :D"}, {"post_id": 20838, "ts": "2026-07-02T15:28:02Z", "hours": 1.5392, "text": "Js got to know that devlogs longer than 10hrs are stripped to 10 😭, i cant have more than 4k char so bear with me theres a LOT to tell that im not able to fit, but ill try my best anyways Dev Log #2 — Converting SafeTensors Into .thin (had to cut so much explaination bcs i HATE THE CHAR LIMIT, id add them in another devlog) The main conversion flow is: pub fn convert_hf ( options : ConvertHfOptions ) -> Result < ConvertHfResult > { let config : Value = serde_json :: from_reader ( File :: open ( options .hf_dir .join ( \"config.json\" )) ? ) ? ; let safetensor_paths = collect_safetensors ( & options .hf_dir ) ? ; let tensors = collect_tensors ( & safetensor_paths ) ? ; let layers = required_u32 ( & config , \"num_hidden_layers\" ) ? ; let model = build_model_spec ( & config , layers , & tensors , & options , & mut warnings ) ? ; let pages = build_pages ( & tensors , & config ) ? ; let execution_tape = build_execution_tape ( layers , & tensors , & mut warnings ) ? ; let manifest = Manifest { format : FORMAT_NAME .to_string (), version : FORMAT_VERSION , model , execution_tape , pages , memory_plan : build_memory_plan ( & config , & tensors ), }; write_archive_pages ( & options .out_path , & manifest , & archive_pages ) ? ; let archive = Archive :: open ( & options .out_path ) ? ; verify_archive ( & archive ) ? ; Ok ( ConvertHfResult { archive , warnings }) } The converter memory-maps each SafeTensors file read-only: let mmap = unsafe { Mmap :: map ( & file ) ? }; let safetensors = SafeTensors :: deserialize ( & mmap ) ? ; let base = mmap .as_ptr () as usize ; Then every tensor becomes a page candidate. The converter records where the tensor bytes live inside the mapped file: let data = tensor .data (); let offset = ( data .as_ptr () as usize ) .checked_sub ( base ) ? ; and stores: struct TensorPage { id : String , path : PathBuf , offset : u64 , size : u64 , checksum : [ u8 ; 32 ], dtype : String , shape : Vec < u64 > , } This avoids rebuilding every tensor in memory. The archive can later copy the original byte range directly: ArchivePageSource :: FileRange { path : tensor .path .clone (), offset : tensor .offset , } After collecting raw tensor data, the converter builds the model spec. It extracts or infers things like hidden size, layer count, attention heads, KV heads, head dimension, RoPE settings, vocab size, activation type, quantization config, and required runtime operators. One important field is attention type: let attention_kind = if kv_heads == heads { \"mha\" } else if kv_heads == 1 { \"mqa\" } else { \"gqa\" }; This matters because many modern decoder models use grouped-query attention. If the runtime only sees shapes but does not understand Q heads vs KV heads, causal attention can be wrong while still looking structurally valid. The converter also records required operators: let mut required_operators = vec! [ \"embedding\" .to_string (), \"rms_norm\" .to_string (), \"qkv_projection\" .to_string (), \"rope\" .to_string (), format! ( \"{attention_kind}_attention\" ), \"o_projection\" .to_string (), \"lm_head\" .to_string (), ]; For dense MLPs it adds: gated_activation down_projection For MoE models it records router and expert stages instead. the rest would be explained in another devlog, i hate the char limit (had to re-write like 10 times btw)"}, {"post_id": 20663, "ts": "2026-07-02T10:03:23Z", "hours": 14.5956, "text": "Dev Log #1 — Why ThinTensor Exists SafeTensors is already a very good format for what it was designed to do: store tensors safely. It keeps tensor metadata simple. For normal model distribution, that is enough. The problem starts when the tensor file becomes the runtime boundary. That is enough if another framework already knows the model class and execution graph. But for an inference runtime, especially one focused on single-token decode, those fields are not enough. The runtime needs to know what each tensor means . The .thin Format The first .thin archive is intentionally simple: .thin = fixed header + JSON manifest + page table + raw page data The Rust implementation defines the archive identity and header size directly: pub const MAGIC: &[u8; 8] = b\"THINv0\\0\\0\"; pub const HEADER_LEN: u32 = 88; The header stores the physical structure of the archive: pub struct Header { pub header_len: u32, pub version: u32, pub manifest_off: u64, pub manifest_len: u64, pub page_table_off: u64, pub page_count: u64, pub data_off: u64, pub archive_hash: [u8; 32], } This lets the loader open the file without guessing. It reads the header, jumps to the manifest, then reads the page table, then maps the raw page data. The manifest is JSON because the early format needed to stay inspectable. It contains the model-level information needed to reconstruct decode: architecture hidden size number of layers attention heads KV heads head dimension vocabulary size RoPE settings tensor names tensor shapes tensor dtypes tensor roles quantization metadata runtime/backend hints validation metadata The page table connects the manifest to real bytes inside the archive: pub struct PageTableRecord { pub page_id: String, pub offset: u64, pub stored_size: u64, pub raw_size: u64, pub flags: u32, pub checksum: [u8; 32], } A page record gives the runtime a verified byte range, not just a tensor name. This matters because pages can later be scheduled, streamed, cached, kept on CPU, moved to GPU, or assigned different execution policies. Packing and Verification The packer does not blindly write files into an archive. It validates the manifest first: let report = validate_manifest(&manifest); if !report.is_ok() { bail!(\"manifest invalid:\\n{}\", report.errors.join(\"\\n\")); } Then every page declared in the manifest must exist and match its declared size: if bytes.len() as u64 != page.size { bail!(\"page declared size does not match file size\"); } It also verifies the page checksum: let checksum = blake3::hash(&bytes); if checksum.as_bytes().as_slice() != expected.as_slice() { bail!(\"page checksum does not match manifest\"); } Only after validation does the writer emit the archive: write_header(&mut file, &header)?; file.write_all(&manifest_bytes)?; for record in &records { write_page_table_record(&mut file, record)?; } for page in pages { write_page_source(&mut file, page)?; } So the final file is structured as: [ header ] [ manifest JSON ] [ page table records ] [ raw page blobs ]"}]...
|
Title: Thintensors by @satvikhardat | Stardance
D Title: Thintensors by @satvikhardat | Stardance
Devlogs:
Dev Log #1 — Why ThinTensor Exists SafeTensors is already a very good format for what it was designed to do: store tensors safely. It keeps tensor metadata simple. For normal model distribution, that is enough. The problem starts when the tensor file becomes the runtime boundary. That is enough if another framework already knows the model class and execution graph. But for an inference runtime, especially one focused on single-token decode, those fields are not enough. The runtime needs to know what each tensor means . The .thin Format The first .thin archive is intentionally simple: .thin = fixed header + JSON manifest + page table + raw page data The Rust implementation defines the archive identity and header size directly: pub const MAGIC: &[u8; 8] = b"THINv0\0\0"; pub const HEADER_LEN: u32 = 88; The header stores the physical structure of the archive: pub struct Header { pub header_len: u32, pub version: u32, pub manifest_off: u64, pub manifest_len: u64, pub page_table_off: u64, pub page_count: u64, pub data_off: u64, pub archive_hash: [u8; 32], } This lets the loader open the file without guessing. It reads the header, jumps to the manifest, then reads the page table, then maps the raw page data. The manifest is JSON because the early format needed to stay inspectable. It contains the model-level information needed to reconstruct decode: architecture hidden size number of layers attention heads KV heads head dimension vocabulary size RoPE settings tensor names tensor shapes tensor dtypes tensor roles quantization metadata runtime/backend hints validation metadata The page table connects the manifest to real bytes inside the archive: pub struct PageTableRecord { pub page_id: String, pub offset: u64, pub stored_size: u64, pub raw_size: u64, pub flags: u32, pub checksum: [u8; 32], } A page record gives the runtime a verified byte range, not just a tensor name. This matters because pages can later be scheduled, streamed, cached, kept on CPU, moved to GPU, or assigned different execution policies. Packing and Verification The packer does not blindly write files into an archive. It validates the manifest first: let report = validate_manifest(&manifest); if !report.is_ok() { bail!("manifest invalid:\n{}", report.errors.join("\n")); } Then every page declared in the manifest must exist and match its declared size: if bytes.len() as u64 != page.size { bail!("page declared size does not match file size"); } It also verifies the page checksum: let checksum = blake3::hash(&bytes); if checksum.as_bytes().as_slice() != expected.as_slice() { bail!("page checksum does not match manifest"); } Only after validation does the writer emit the archive: write_header(&mut file, &header)?; file.write_all(&manifest_bytes)?; for record in &records { write_page_table_record(&mut file, record)?; } for page in pages { write_page_source(&mut file, page)?; } So the final file is structured as: [ header ] [ manifest JSON ] [ page table records ] [ raw page blobs ]
Js got to know that devlogs longer than 10hrs are stripped to 10 😭, i cant have more than 4k char so bear with me theres a LOT to tell that im not able to fit, but ill try my best anyways Dev Log #2 — Converting SafeTensors Into .thin (had to cut so much explaination bcs i HATE THE CHAR LIMIT, id add them in another devlog) The main conversion flow is: pub fn convert_hf ( options : ConvertHfOptions ) -> Result < ConvertHfResult > { let config : Value = serde_json :: from_reader ( File :: open ( options .hf_dir .join ( "config.json" )) ? ) ? ; let safetensor_paths = collect_safetensors ( & options .hf_dir ) ? ; let tensors = collect_tensors ( & safetensor_paths ) ? ; let layers = required_u32 ( & config , "num_hidden_layers" ) ? ; let model = build_model_spec ( & config , layers , & tensors , & options , & mut warnings ) ? ; let pages = build_pages ( & tensors , & config ) ? ; let execution_tape = build_execution_tape ( layers , & tensors , & mut warnings ) ? ; let manifest = Manifest { format : FORMAT_NAME .to_string (), version : FORMAT_VERSION , model , execution_tape , pages , memory_plan : build_memory_plan ( & config , & tensors ), }; write_archive_pages ( & options .out_path , & manifest , & archive_pages ) ? ; let archive = Archive :: open ( & options .out_path ) ? ; verify_archive ( & archive ) ? ; Ok ( ConvertHfResult { archive , warnings }) } The converter memory-maps each SafeTensors file read-only: let mmap = unsafe { Mmap :: map ( & file ) ? }; let safetensors = SafeTensors :: deserialize ( & mmap ) ? ; let base = mmap .as_ptr () as usize ; Then every tensor becomes a page candidate. The converter records where the tensor bytes live inside the mapped file: let data = tensor .data (); let offset = ( data .as_ptr () as usize ) .checked_sub ( base ) ? ; and stores: struct TensorPage { id : String , path : PathBuf , offset : u64 , size : u64 , checksum : [ u8 ; 32 ], dtype : String , shape : Vec < u64 > , } This avoids rebuilding every tensor in memory. The archive can later copy the original byte range directly: ArchivePageSource :: FileRange { path : tensor .path .clone (), offset : tensor .offset , } After collecting raw tensor data, the converter builds the model spec. It extracts or infers things like hidden size, layer count, attention heads, KV heads, head dimension, RoPE settings, vocab size, activation type, quantization config, and required runtime operators. One important field is attention type: let attention_kind = if kv_heads == heads { "mha" } else if kv_heads == 1 { "mqa" } else { "gqa" }; This matters because many modern decoder models use grouped-query attention. If the runtime only sees shapes but does not understand Q heads vs KV heads, causal attention can be wrong while still looking structurally valid. The converter also records required operators: let mut required_operators = vec! [ "embedding" .to_string (), "rms_norm" .to_string (), "qkv_projection" .to_string (), "rope" .to_string (), format! ( "{attention_kind}_attention" ), "o_projection" .to_string (), "lm_head" .to_string (), ]; For dense MLPs it adds: gated_activation down_projection For MoE models it records router and expert stages instead. the rest would be explained in another devlog, i hate the char limit (had to re-write like 10 times btw)
Dev Log #3 — SmolLM3-3B Results SmolLM3-3B was the first real test of ThinTensor as an inference runtime. The baseline was Hugging Face BF16 on my RTX 5050 laptop GPU: HF BF16: ~17.8 tok/s ThinTensor BF16 reached: ThinTensor BF16: ~32–33 tok/s with cosine around 0.999 , meaning the logits stayed extremely close to the original SafeTensors/HF path. That matters because a storage/runtime format should not make the model noticeably worse. Then came the quality FP8 profile: ThinTensor quality FP8: ~46–48 tok/s This was not “quantize everything.” The profile was selective: gate/up projections: FP8 middle down projections: FP8 attention path: BF16 O-proj: BF16 LM head: BF16 KV cache: BF16 ThinTensor can do this because the .thin manifest and execution tape know tensor roles: Q, K, V, O, gate, up, down, norm, embedding, LM head, etc. The runtime can then lower precision only where the model tolerates it, while keeping sensitive paths in BF16. The kernel side reflects this. Attention uses single-token GQA and maps each query head to the right KV head: head = tl . program_id ( 0 ) kv_head = head // ( heads // kv_heads ) scores = tl . sum ( key * q [ None , :], axis = 1 ) * scale The FP8 MLP path uses scaled matvecs: w = tl . load ( weight + offs_m [:, None ] * stride_wm + offs_n [ None , :]) xv = tl . load ( x + offs_n ). to ( tl . float32 ) scale = tl . load ( scales + offs_m ). to ( tl . float32 ) acc = tl . sum ( w * xv [ None , :], axis = 1 ) * scale In one full-vocab centered-logit comparison: GGUF Q8_0 min cosine: 0.952666 ThinTensor BF16 min cosine: 0.999596 ThinTensor quality FP8 min cosine: 0.995366 So ThinTensor quality FP8 stayed much closer to BF16 than the measured Q8 path, while staying in the same speed class. Final speed table: HF BF16: ~17.8 tok/s ThinTensor BF16: ~32–33 tok/s ThinTensor quality FP8: ~46–48 tok/s Ollama / GGUF Q8_0: ~44.1 tok/s Headline: ThinTensor BF16 was ~1.8x faster than HF BF16. ThinTensor quality FP8 was ~2.6x faster than HF BF16. ThinTensor quality FP8 was faster than the measured Q8 baseline while preserving much better logit fidelity. This is where ThinTensor stopped being just an archive experiment and started looking like a real inference runtime :D
Initial benchmarks based on some testing on a 3B model Why response similarity? Because we are making a storage format not “just” a runtime, so we need to ensure the model we are optimizing using thintensor runtime it HAS to be replying with the same responses like the original model! So with casual Kv implemented these are the benchmarks i gathered, if you wanna learn what quality fp8 is read my last devlog :D PS- the vram usage on our ThinTensor quality FP8 is just 500 mb more than the q8 even though there is a HUGE difference in the response similarity
Just hit 91tk/s with “cosine_similarity”: 0.9994624257087708 its actually crazy its like 5x faster the hf full devlog comming soon! ITS LIKE 0.054% away from perfect!!! The selective MXFP4 gate/up profile reached ~96 tok/s while preserving top-1 on the tested SmolLM3-3B through my thintensor runtimeeeee Full DevLogs gonna be crazy
Dev Log #4 — 91–96 tok/s with Selective MXFP4 This was the first ThinTensor run that felt genuinely fast. On SmolLM3-3B, the selective MXFP4 gate/up profile reached around: ~91–96 tok/s and on the strong tested record it still preserved: cosine_similarity: 0.9994624257087708 top1_same: true top5_overlap: 0.8 generated_token_match_rate: 0.875 KV retention: full BF16 That cosine is extremely close to the HF BF16 reference: 1.0 - 0.9994624257087708 = 0.0005375742912292 So the run was only about 0.054% away from perfect cosine on that tested checkpoint. Why this was not just normal quantization The profile was selective: MXFP4 gate/up layers: 0:24 MXFP4 row postscale: enabled LM head: FP8 guarded path KV cache: full BF16 attention path: causal KV QKV/O/down: not blindly pushed into MXFP4 A full MXFP4 sweep over QKV, O, down, and gate/up was fast, but it destroyed the logits. That proved the obvious thing: fewer bytes alone is not enough. ThinTensor’s win comes from being role-aware. The runtime knows what each tensor does: Q / K / V O projection gate projection up projection down projection norm embedding LM head KV cache That means the runtime can apply aggressive precision only to the parts that tolerate it. For this result, the safe target was the MLP gate/up path. Why gate/up was the right target Single-token decoding is mostly a weight-read problem. Tthe goal became: reduce gate/up bytes keep attention stable keep KV exact keep LM head guarded preserve token ranking That is exactly what the selective MXFP4 profile does. It uses MXFP4 on the gate/up projections for layers 0:24 , but it does not blindly lower every sensitive path. Where Blackwell helps The test GPU is an RTX 5050 laptop GPU, which is Blackwell. That matters because Blackwell has native low-precision paths for FP4/MXFP4-style execution. ThinTensor uses this through Triton kernels that treat MXFP4 as an execution format, not just a smaller storage format. The idea is: store/read fewer bytes use block scales multiply against BF16 activations accumulate safely then apply row postscale The goal is to make each token cheaper to decode while keeping the output distribution close to HF BF16. The code side The relevant code is built around these ideas: 1. Honest quantization descriptors The QuantizationDescriptor describes the source format: method storage_dtype bits group_size scale_dtype zero_point modules_to_not_convert source_config For example: INT4 != FP4 Q8 != FP8 MXFP4 != generic Q4 The precision_ladder() function makes that explicit. It lists safe choices, opt-in choices, and lossy choices. So instead of silently lowering precision, the runtime can say: preserve native format fallback to BF16 or require explicit validation before requantization 2. Execution planning plan_quantization() decides what should happen at runtime. It can choose: preserve source storage use native kernel dequantize to BF16 or reject unsupported requantization The important flag is this: exact_storage_preserved If this is true, the runtime is using the source encoding directly. Whats next I would have to implement all mainstream model archs manually because all are diff, and like right now you can see, there are a lot of models that are heavily un-optimized Also im messaging stardance team on slack these devlogs too smol for me
Finished benchmarking a few more models Hitting really really good tk/s when compared to hf that even fails to load the models on my 8gb vram, so its a HUGE improvement for gpu poor ppl like me 😭 Reason a lot less improvement for many models is that, each model has a different structure and i havent been able to make a generalized algorithm that would work for all, so for now, we are working with just a simple implementation Benchmark Methodology and Metrics Calculation To ensure accurate, robust, and reproducible results, the benchmarking and correctness scoring flow is executed as follows: 1. Benchmark Execution Workflow Benchmarks are run in isolated, dedicated Python processes for each engine (ThinTensor vs. Hugging Face Transformers) to prevent memory leakage or process interference: ThinTensor Baseline : The model is loaded via the thin_runtime.py engine. Weight Fit Planning : The runtime runs _automatic_fit_plan to estimate weight size. If the model’s weights do not fit within the available GPU VRAM (accounting for system/display manager overhead), it dynamically configures streaming weight residency ( --weight-residency stream ) and streams layers/experts block-by-block from CPU/RAM to the GPU. If the weights fit, it uses fully resident weights ( --weight-residency all ). Timing : Prefills the prompt (default “Hello”), decodes a number of warmup tokens (default 10) to initialize caches and compile/warm up Triton kernels, and then times the next decode steps (default 200) using wall-clock time ( time.perf_counter() ). Transformers (Hugging Face) Baseline : The model is loaded via a dedicated script bench_hf_transformers_decode.py in BF16 precision. RAM/CPU Offloading : For larger models (e.g. Gemma-4-E2B, OLMoE), loading the model fully on memory-constrained GPUs (like the RTX 5050 Laptop GPU with 7.57 GiB VRAM) causes CUDA OOM. To prevent OOM, RAM offloading is enabled via device_map="auto" . Weights that exceed VRAM capacity are kept in CPU system RAM and loaded/swapped as needed. Timing : Like ThinTensor, it pre-runs a prompt prefill, decodes warmup tokens (default 10), and then times steps (default 200) decode steps. The decode loop avoids GPU-to-CPU synchronization (e.g. calling .item() inside the timed loop) to measure pure GPU decoding speed. 2. Metrics & Scores Calculation Thin/HF Peak GiB (Peak GPU Memory) : Tracks peak allocated VRAM in GiB using torch.cuda.max_memory_allocated() . This measures active tensors allocated by PyTorch’s allocator during the decode phase (excluding unallocated cache reserve or general display server memory). Min Cosine (Cosine Similarity) : In compare_hf_thin_logits.py , the logits of the final linear projection layer are collected for both models. Cosine similarity is calculated for the target token index at each step. The minimum cosine similarity found across all decode steps (e.g., step 1 and step 10) and prefill lengths (e.g., 1 and 128) is reported. Top-1 Match : A boolean check indicating whether the token ID with the highest probability (highest logit value) is identical between ThinTensor and HF at all decode steps. Top-5 Set : A boolean check indicating whether the set of top-5 highest-probability token IDs is identical between the two models at all steps (ignoring their internal sorted order). Top-5 Order : A boolean check indicating whether the exact sorted order of the top-5 token IDs matches between ThinTensor and HF at all steps. KV Retention : Specifies the KV cache precision format (e.g. full BF16 ).
Final benchmarks Smaller models have lower cosine because there are like really small like 1B but, some archs are still not fully optimized to run at a good bit faster speed, ik, but i would want to do a ship before working on getting the speed up on those
Posted about this on reddit! https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ Got a lot of feedback, gonna try to work over it over the next few weeks
Devlog: Resolving GPU Memory Corruption & CUDA Assertions on Wide Matvecs 1. The Symptoms When running inference/benchmarks on unquantized models (like Qwen3.5-9B) using the Triton backend on laptop GPUs (e.g., RTX 5050), the runtime encountered two asynchronous CUDA faults: • cudaErrorIllegalAddress (Illegal memory access) during cache eviction. • device-side assert triggered ( indexSelectSmallIndex assertion failed) during embedding vocabulary lookups. 2. The Root Cause (Resource Starvation & Memory Corruption) Wide Layer Geometries: In Qwen3.5, the projection matrices (Query, Key, Value) have a columns dimension of cols = 3584 . Triton Padded Tiling: Triton pads non-power-of-two shapes to the next power of two ( BLOCK_N = 4096 ). Static Tile Size: The default Triton config mapping uses BLOCK_M = 64 for wide matrices. This instructs Triton to compile a kernel loading a massive static tile size of 64 × 4096 = 262,144 elements. Register & Shared Memory Overflow: In FP32 accumulation, this tile requires 1 MB of memory per thread block. However, laptop GPU streaming multiprocessors (SMs) have a physical hardware limit of 96KB–100KB of shared memory/register files. The Failure Cascade: The compiler failed to allocate resources cleanly, resulting in severe register spills and memory read violations. Triton silently returned corrupted/NaN outputs. The subsequent argmax logit lookup generated a garbage token index (out of bounds), which triggered the PyTorch device-side assertion on the next step. 3. The Fix (Dynamic Chunked Looping) To prevent resource starvation, we modified Triton’s launching configuration in triton_kernels.py: Wide Column Routing: Added a check to detect if cols > 2048 . Looped Execution: Instead of loading the entire 4096 columns block statically, we force the kernel to execute _matvec_looped_kernel using a chunk size of BLOCK_N = 512 . Memory Optimization: The kernel loops through the columns sequentially in chunks of 512. This drops the tile size memory requirement per block to under 64 KB, which safely fits inside any laptop GPU’s physical SM limits. 4. Results I am currently running the final profiles ( max-performance and max-max-perf ). Let me check on the status!
Worked over a LOT of stuff, like doing apples to apples comparisions of models such as LLama 11b vision instruct, So over time I fixed a lot of stuff added a new profile, that quants and quants and quants all layers till the model fits your VRAM, it doesnt care if the model is 20gb in weigths and you have a 8gb vram, it will quant and make it fit So testing this autofit profile on LLama 11b vision instruct, heres what i found it hit a cosine of 0.939758 and around 24tk/s on a 200 token test Similarly i tested ollama Llama 11b vision instruct with q4_k_m quant, it got a cosine close to 0.720495 i would say it would be more closer to 0.8 because this cosine was for only top 20 logprobes that ollama exposes This was done on 8gb vram rtx 5050 laptop 32gb ddr 5 ryzen 7 250 arch linux and the comparision is apples to apples because the thinruntime also quanted the model aggressively
ThinRuntime GPT-OSS-20B now achieves: 50.3445 tok/s median across three explicit 200-token runs. llama.cpp b9964 Q4_K_M: 40.3631 tok/s mean. ThinRuntime is 24.73% faster. Exact embedding and LM head; Q1/Q2 applies only to experts. Zero expert transfers during decode. Top-1 unchanged through step 4. Cosine: 0.987376 step 1, 0.983299 step 4. Accepted one-step configuration: 0.991415 cosine. llama.cpp Q4_K_M source-relative cosine: 0.792350.
This devlog retains the apples-to-apples GPT-OSS control plus fresh Qwen3.5-9B, Llama 3.2 11B text-path, OpenReasoning-Nemotron-14B, and Phi-4 A LOT of optimizations were done to achive this results and 100s of benchmarks in different profiles and stuff, to get to this final table
Final devlog: I would be moving from this project to other cool stuff i have in mind, the final benchmarks i got and everything, is pushed, had to do a lot of improvements to get bigger models running just as good as small ones I know there can be a lot of other optmizations, but maybe a few months later ill come back to this, but for now, its gonna stay as is.
Devlog-idk atp Well i said that i would stop working on this project last devlog, butttt, i just saw this https://github.com/random-unknown-username/Thintensor/issues/1 Someone tried thintensor on a 128gb unified ram DGX spark, ANDDDDD now i wanna make it good enough like so its a finished thing
Implemented a huge list of fixes Lazy page-ID tensor resolution after quantization Storage-alias-aware VRAM accounting Correct affine INT4 partial-group quantization KV sequence continuity checks Free-page geometry invalidation Canonical LM-head bias and final-softcap handling Certified shortlist logic with exact fallback Gemma-style attention scaling/softcap fixes Removal of hot-path CUDA scalar tensor allocations Device normalization for “cuda”, “cuda:N”, and torch.device Profile separation has been reconnected and different profiles select different kernels. Paged KV storage exists through SlabbedKVCache. A prior paged-attention slowdown was caused by GPU synchronization from .item() calls in SlabbedKVCache.append(), not by paged addressing itself. Logical page ownership is now tracked CPU-side to avoid those synchronizations. Paged attention has measured approximately: Materialized: 55.1 tok/s Paged: 57.5 tok/s on a relevant smaller models
What I’ve Done: Fixed KV Cache Indexing in Graph Mode: The previous cudaErrorStreamCaptureUnsupported error and out-of-bounds access were caused by assigning python integers dynamically during capture, and failing to respect block sizing. I modified the KV cache’s _in_graph_mode behavior to compute the tensor-based slot offset dynamically ((slot % block_size).view(1)) directly inside the graph capture. This worked successfully and fully restored the model’s coherent output without breaking graph logic. Experimented with MLP Block Sizing: I attempted to increase block_m and num_warps in the 1-bit Triton kernel (mxfp_lowbit_selected_swiglu) to reduce redundant memory loads of the intermediate x tensor. Unfortunately, register limits and memory layout meant it actually resulted in worse throughput, so I reverted those changes. Experimented with Attention Loop Early Exit: The single_token_gqa_attention_kernel is statically unrolled up to token_bucket (256). I tried adding a dynamic while loop to break early for short context sizes, but Triton’s compiler handles static for loops much better. reached around 65tk/s on gpt-oss-20b, constantly improvising MoE performance, next ima lock in for dense models but for now on MoE
what I did to fix the numerical drift & get some speedups: The Root Cause of the Drift (The Cosine Fix): I discovered that in triton_kernels.py , the tl.dot_scaled call inside _mxfp_lowbit_selected_tensorcore_matvec_kernel (and the mxfp4 variant) had fast_math=True . The fast_math option drops critical precision bits during accumulator addition which was causing the MoE kernels to completely obliterate the trajectory. I disabled it globally using fast_math=False , and this instantly restored our cosine similarity to a perfect 1.000000 over the entire benchmark trajectory. The VRAM Bottleneck: When relying purely on MXFP4 experts, they required over 9.5 GB, breaking the 6.6 GiB budget and forcing the runtime to stream them via PCIe (which tanks performance down to ~5-10tok/s). The Q2 and Q1 low-bit expert decoding kernels actually achieve identical numerical accuracy to the baseline while aggressively packing the weights. The 97.87 tok/s Optimization: I configured bench.py and check_baseline_cosine.py to use: packed_expert_q1_layers="0:24" : All 24 layers of MoE experts are now tightly packed into 1-bit Q1 structures, shrinking the expert memory footprint down to just 2.38 GB (from 9.52 GB). dense_int4_layers="all" : Shrunk the non-expert dense projection weights (Q, K, V, O) into INT4, dropping their footprint from ~1.1 GB to ~0.27 GB. Since the entire model now takes 5.29 GiB (fitting entirely within the 6.6 GiB budget), all layers are pinned directly to VRAM. Because zero layers are streamed (any_streamed=False), the runtime successfully builds the fully fused cuda_graphs execution path, accelerating generation from a crawl to 97.87 tok/s ON gpt-oss-20b. I believe ill be moving to dense models just about now All these issues took SOOO many tests to find
I ammmm tierdd i tried a billionn things over the last 8 hours i just cant seem to understand why gemma4 doesnt want to workkkkk I dont have much to write in this devlog, other than, i am not gonna implement gemma arch for now
ThinTensor Improvements Universal semantic-IR runtime for mixed attention, dense and MoE architectures. Per-tensor precision, kernel and residency planning instead of layer-wide quantization. Production FP8, INT4, MXFP4, Q2 and Q1 quantizers with calibration-aware scoring. Hard ≥0.995 cosine certification with exact routing, greedy-token and KV checks. Qwen3.5 hybrid linear-attention, shared-expert and packed rank-3 MoE support. Durable grouped-INT4 expert sidecars with bounded-RAM, mmap-based construction. Fixed four-matrix Triton projection, cuda / cuda:0 , layer-zero and converter-role bugs. Improved fused kernels, KV caching, expert routing and decode hot paths. Strict cache identity across model, tokenizer, GPU, CUDA, kernels and calibration. Remaining goal: prove ≥30 tok/s on Qwen3.5-35B-A3B at certified ≥0.995 cosine. Getting way better speed on 27B dense models at a cosine that is also way better
Hitting 100hrs and final ship Didnt get time to work on this idea, since quite the while. And it has js about reached the state i can probably get it to MoE arch works, dense models work, cpu/gpu streaming works well, context/kv cache is also dynamically quanted lm_head quants are also there now The motivation really died out because of this project not getting reviewed its been over a month, leaving this as is, tho its not perfect, but it js about has enough features that i wanted Here are the final results after a ton of benchmarking- Phi-4: ThinTensor 28.21 tok/s vs llama.cpp 17.50 tok/s — 1.61× faster (+61.2%). Quality: 0.999949 cosine vs 0.997281. OpenReasoning-Nemotron-14B: ThinTensor 23.79 tok/s vs llama.cpp 19.79 tok/s — 1.20× faster (+20.2%). Quality: 0.999533 vs 0.967140. Llama 3.2 11B: ThinTensor 41.02 tok/s vs llama.cpp 39.82 tok/s — 1.03× faster (+3.0%). Quality: 0.995095 vs 0.991938. Qwen3.5-9B: ThinTensor 43.28 tok/s vs llama.cpp 42.83 tok/s — 1.01× faster (+1.1%). Quality: 0.973334 vs 0.894908. GPT-OSS-20B: ThinTensor 50.34 tok/s vs llama.cpp 40.36 tok/s — 1.25× faster (+24.7%). Quality: 0.983299 vs 0.792350. *all are apples to apples btw Overall: ThinTensor beats llama.cpp Q4 throughput on 5/5 tested architectures , with a geometric-mean speedup of approximately 1.203× . Probably gonna take a break, and learn before comming back to this, after the ship-2 on stardance!
Fixed a few Dense path issues, because the MoE path somehow made the dense path completely usable, fixed a few small one line bugs i got to know from the last ship’s reviews, read to for ship 2!!
Ships:
I made ThinTensor, a runtime-aware LLM archive and inference runtime. Instead of only storing tensor bytes, it stores tensor roles, memory pages, quant metadata, and execution hints so the runtime can choose faster kernels and precision paths. The hardest part was keeping speed gains honest with HF correctness checks. So far it reaches up to ~94 tok/s on SmolLM3-3B with full BF16 KV retention and high logit similarity. After being tested on multiple models, you can get a avg 2x performance increase on most LLM archs, all archs are still not implemented, ik but this is workable with qwen, gemma, some MoE models, and SmolLM and a most others, but it wont be as optimized for all the model types Follow the guide at https://github.com/random-unknown-username/Thintensor#fast-path-setting-up-on-a-new-laptop To install thintensor runtime and use this guide to get a sample qwen model up and running https://github.com/random-unknown-username/Thintensor#quickstart-downloading--running-a-sample-model-qwen-08b
Its a runtime-aware LLM archive format built for fast, efficient inference, This ship basically integrates MoE model paths, that allows you to run models like gpt-oss-20B on speeds and quality faster and better than llama.cpp!! (at q4) its not just the storage format that allows for the improvements, its a combination of different selective layers being quantized with the better storage format, allowing to run inference with higher speed and quality than just simple q8,q4 etc quants. the storage format only gain is only like 10%, but combined with middle out fp8 quants, and even int4 for some performance profiles, it can reach better speeds than the other ways to run inference This does not beat TRT / TRT LM, it does allow for quicker inference, and a more portable solution because for TRT you need to compile the plan (one time) for a few mins before being able to run the model, and it has to be compiled on every machine you run the model on, thintensor allows you to directly have the .thin file and run it on any machine with similar results! and it takes just a few seconds compared to about 30 mins on trt and trt lm reddit post for this project- https://www.reddit.com/r/LocalLLM/comments/1uqr1o3/i_made_a_llm_storage_format_that_makes_llms_run/ independent tester’s view- https://github.com/random-unknown-username/Thintensor/issues/1 Let me know if u find any issues, tried a lot of other models here too, as u can see in the graphs :D let me know of any bugs on slack...
|
1792878673.5936122
|
1793742673.5936122
|
|
16885
|
Hackfetch by @xerneas | Stardance
|
|
2
|
124.4
|
1751
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-22T11:04:00Z", "hours": 63.0, "multiplier": 19.6, "payout": 1381, "blessing": "neutral", "text": "HACKFETCH V2.0 it’s been a few weeks since ship #1 and hackfetch is a completely different tool now. faster, smaller, quieter, actually correct, and now lives in places besides your terminal window. v2.0.0 is out. what changed: fits in your tmux status bar with one line of config. same story for lualine. hackfetch -status prints a compact one-liner meant to be shelled out to every minute. fits everywhere else too. now on the AUR (yay -S hackfetch-bin) alongside the existing brew tap, curl installer, powershell installer, and go install. seven install channels total. runs in ~20ms on repeat calls thanks to an on-disk cache. tmux polling every minute is basically free now. was ~700ms cold before. runs in ~0.7s cold thanks to a parallel API fetch. was ~1.7s before. shows a smooth truecolor gradient on any modern terminal. auto-detects $COLORTERM. falls back to 256-color on older ones. -doctor walks a colored checklist of your setup and tells you exactly what’s broken. green if fine, orange if not, non-zero exit if you wanna script it. new pizza logo because hack club runs on pizza. seven logos total. streak is finally correct after silently saying “1 day” for a month. /summaries is gone from hackatime so hackfetch now reconstructs streak from every coding session in your history via /heartbeats/spans. real streak: 9 days for me right now. 7-day sparkline baked into the fetch (with -v) and available as -status –sparkline for the tmux bar. default fetch got leaner. slack handle, machines count, and the sparkline moved behind -v so the normal fetch stays focused on hours + project + language. loading spinner on the api fetch so you know something is happening. and then the cache made it show up almost never. one install: Linux / Mac: curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh Windows: irm https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.ps1 | iex Arch family: yay -S hackfetch-bin macOS / Linuxbrew: brew install xerneas3318/tap/hackfetch For more install methods check out the github page: https://github.com/xerneas3318/hackfetch teasing the next big thing: hackfetch -leaderboard is coming next, using the public leaderboard endpoints i found in hackatime’s routes file. compete with friends on daily and weekly hours right from your terminal. private friend groups on a hackclub nest box after that. if you try it, thanks. send me some feedback", "repo": "https://github.com/xerneas3318/hackfetch", "demo": "https://github.com/xerneas3318/hackfetch/releases"}, {"ship_num": 2, "ts": "2026-07-07T00:01:54Z", "hours": 27.0, "multiplier": 17.78, "payout": 370, "blessing": "neutral", "text": "Every fetch tool tells you your OS. Mine tells you your streak. hackfetch is a Hack Club themed terminal fetch tool. Inspired by neofetch (originally bash, now archived) and fastfetch (its C successor), written in pure Go. Instead of just showing your kernel and CPU, it pulls live stats from your Hackatime account: today’s hours, weekly total, current streak, top project, top language. Right in your terminal. Six Hack Club themed ASCII logos (including my GOAT orpheus). Fourteen color schemes (pride, trans, bi, pan included). Live watch mode that refreshes while you code. And as of today, you can export the whole thing as a PNG, JPG, or SVG card and post it anywhere. One line to install: Linux / Mac: curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh Windows: irm https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.ps1 | iex Tell me how it was! Follow and like for updates.", "repo": "https://github.com/xerneas3318/hackfetch", "demo": "https://github.com/xerneas3318/hackfetch/releases"}]...
|
[{"post_id": 39919, "ts": "202 [{"post_id": 39919, "ts": "2026-08-03T07:26:53Z", "hours": 6.6894, "text": "Hackfetdch natively in your readme hackfetch -readme it spits out a markdown stats card ready to paste straight into your github profile README. pipe it into a file and commit: hackfetch -readme > stats.md this is the cool bit or drop it in your README.md between two html comments and set up a github action to run it on a schedule so it auto refreshes every day. your profile now has a live coding stats card next to your pinned repos with no cron server, no vercel deploy, no api key stashed in secrets. its literally just markdown. zero extra api calls too. the readme card reads from the same cached hackatime response the normal fetch uses so if you just ran hackfetch it takes ~20ms. the streak emoji is a lil detail i had fun with. 3+ days gets a 🔥 upgrade with brew upgrade hackfetch or yay -S hackfetch-bin (once aur maintenance wraps up) or curl the installer curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh"}, {"post_id": 39223, "ts": "2026-08-02T01:40:31Z", "hours": 7.6967, "text": "HACKFETCH BATTLES??? two features in one release. hackfetch already knows a scary amount about you (thanks hackatime) so why not turn that into more features. hackfetch vs @ someone head to head compare. give it a hackatime username and hackfetch fetches both your histories in parallel, buckets them into today / this week / all time / streak, and prints them side by side with a winner arrow on every row. accepts @name , name , or a full profile url like hackatime.hackclub.com/@name . also works positional: hackfetch vs @you . use it to settle arguments, motivate yourself, or realize your friend has coded 265 hours and you should probably close discord. hackfetch -records personal bests. computed entirely from data hackfetch already fetches (streak + sparkline already use it), so zero new api calls $ hackfetch -records ✦ personal records @you biggest day 12h 41m on 2026-07-18 longest streak 25 days ended 2026-07-01 longest session 43m on 2026-07-17 days coded 86 first day 2026-04-24 99 days ago lifetime 208h 29m the “longest streak” tracks your all time best not just your current one. and “first day” tells you how long ago you started so you can feel old. grab it brew upgrade hackfetch yay -S hackfetch-bin install curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh Next devlog is gonna be a fun one, I have an idea cooking up"}, {"post_id": 38323, "ts": "2026-07-31T17:22:26Z", "hours": 9.4408, "text": "big thank you for everyone’s feedback! fresh out of the oven: hackfetch v2.1.1 (aka the reviewer bug fix pass) what got fixed: shell detection used to just read $SHELL which is your login shell. if you log in as bash but run fish, hackfetch was calling you a bash user. it now checks $FISH_VERSION / $ZSH_VERSION / $BASH_VERSION and falls back to asking the OS who your parent process actually is editor detection was two bugs in a trench coat. it wasnt stripping args so zeditor --wait showed up as “zeditor –wait” instead of “Zed”, and if you had no $EDITOR set it defaulted to nano even if you had literally never opened nano. now it strips flags, maps launcher names to human ones (zeditor -> Zed, code -> VS Code, cursor -> Cursor, hx -> Helix etc), and says “-” instead of nano if nothing is set. top project label was ambiguous. it was pulling weekly stats but the row just said “top project” so people thought it meant all time. now weekly rows read top proj 7d , top lang 7d , top ed 7d , top cat 7d . setup dialog was scaring people. it always printed “file exists but has no api_key” whenever it reached the setup flow, even if the api_key line was actually there but just failing to parse. loadConfig is now more forgiving (inline comments, quoted values, case insensitive keys) and setup tells you WHY its stuck instead of gaslighting you about your own config. also short circuits if you run hackfetch -setup when youre already set up. people said they wanted a gay flag color was already there under the name pride but that wasnt obvious. gay is now an alias so both work. grab it: brew upgrade hackfetch or yay -S hackfetch-bin or curl / powershell installer if you don’t have it yet curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh again thank you to everyone who took the time to actually run it and tell me what was broken!"}, {"post_id": 34562, "ts": "2026-07-25T12:00:09Z", "hours": 10.5769, "text": "hackfetch COLLAB?? so my last two devlogs teased two features. shipping both today. -leaderboard last devlog i said “compete with your friends on hackatime hours is coming soon.” i thought i was gonna have to build a whole nest server for it. turns out /api/v1/leaderboard/daily and /api/v1/leaderboard/weekly already exist and are public on hackatime. just a single call!! so hackfetch -leaderboard daily (or weekly) now shows the top 10: ✦ daily leaderboard Last 24 hours 🥇 1. soaphia14 11h 12m 🥈 2. AnastKara 10h 32m 🥉 3. RoSerMar 10h 6m 4. euledone 10h 5. TheShovel 10h 6. Dylhouse 9h 1m 7. Dexrn 8h 59m 8. HexFud 8h 31m 9. zeddash 8h 29m 10. Trtotomotoro 8h 26m every username is an OSC 8 clickable link to that person’s hackatime profile. modern terminals (iterm2, kitty, wezterm, alacritty, gnome-terminal) render it as an actual hyperlink you can click. terminals without OSC 8 just show the plain text so it doesnt look broken. if you’re on the board it highlights your row in orange and adds (you) next to your name. json addon the other thing. someone else competing in stardance messaged me the other day about integrating hackatime into their own project and needed help figuring out the api (YAY). helping them made me realize hackfetch is doing a bunch of work (auth, caching, streak reconstruction, per-day bucketing) that other tools would love to piggyback on. so now: $ hackfetch -json { \"version\": \"2\", \"fetched_at\": \"2026-07-25T17:00: 20.900829+05:30\", \"system\": { \"user\": \"xerneas\", \"host\": \"Macbook-Pro\", \"os\": \"macOS 26.5.2\", ... }, \"hackatime\": { \"slack\": \"@U0B8FHHRQPJ\", \"streak\": 12, \"today_seconds\": 15820, \"week_seconds\": 237501, \"top_project\": { \"name\": \"hackfetch\", \" \"top_language\": { \"name\": \"Go\", \"seconds\": 97418 }, \"week_chart\": [36967, 31651, 33841, 284 \"machines\": 3 } } week_chart is 7 numbers = daily seconds oldest to newest same as the sparkline. top_language skips the unknown/other buckets. everything lines up with what the normal fetch would show, just parseable. ship landed in v2.1.0. brew update && brew upgrade hackfetch or arch: yay -Syu hackfetch-bin then try: hackfetch -leaderboard weekly hackfetch -json | jq For a general install use: curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh"}, {"post_id": 32880, "ts": "2026-07-22T10:20:45Z", "hours": 8.6689, "text": "my streak was lying to me for a month went to add a simple 7-day sparkline. by the end of the night i had rewritten how hackfetch talks to hackatime and my streak field is finally accurate for the first time in weeks. the plan was get the status from the last 7 days. draw ▁▂▃▄▅▆▇█ bars except the endpoint i needed straight up 404s. /users/current/summaries doesnt exist on the current hackatime deployment. Which means every single time i ran hackfetch it was quietly making a 30-day range call that always failed, then falling back to a placeholder that said “if today has activity, streak = 1”. thats it. no matter how long ive actually been on a streak, the fetch would just show 1 day. 🤦 my streak has said 1 day for the last 2 weeks even though ive been coding literally every day. never noticed because 1 day looks kinda plausible (i added 1 day as a fallback so that it didn’t show an error a couple weeks ago and forgot ) the fix: went digging in hackatimes rails routes on github. turns out theres a whole /api/v1/ namespace i was never using. and one of the endpoints is /api/v1/users/:id/heartbeats/spans. one call, ~150kb of json, every coding session ive ever logged with start_time, end_time, duration. 2000+ spans. which is exactly what i need for both features. bucket the timestamps by local calendar day, count unique days for streak, sum durations per day for the sparkline. one request covers both. and while i was already in the api layer i noticed fetchUser was making a whole separate call for my slack handle, which is silly because that data is already in the weekly stats response we cache. so i piggybacked it. weve gone from 4 api calls per fetch to 3. the sparkline: 7-day chart ▄▄▇▅▄▅▃ 65h 28m oldest on the left, newest on the right. that tall bar in the middle is a big lock-in session from earlier in the week. the two shorter ones on the right are today (still coding) and yesterday (took a break). opt in for -status --sparkline if you want it in your tmux bar too: 2h 9m today · streak 9 · ▄▄▇▅▄▅▃ 65h 28m teasing a backend: I’m planning on building a whole leaderboard server on a free hack club nest box so people can compete on their hackatime hours. while i was poking around the routes file for the streak fix i noticed something. /api/v1/leaderboard/daily and /api/v1/leaderboard/weekly already exist. public. no auth needed. no server needed. no cron sync. hackatime literally already has it directly. so hackfetch -leaderboard is coming soon (private friend groups and personal competitions can come later) last devlog before my next ship after the ship the devlogs are going to be huge. stay tuned :P"}, {"post_id": 32268, "ts": "2026-07-21T10:28:54Z", "hours": 9.7706, "text": "caching or i owe hackclub money so heres what my day looked like: nvim was calling hackfetch -status on every redraw for my lualine. tmux was calling it every 60 seconds for the status bar. i had 3 tmux sessions open. and every time i actually opened a new terminal, hackfetch fired again on shell start. quick napkin math: nvim redraws are basically continuous when im typing, tmux was hitting the api 3x/minute across sessions, plus every terminal open = another fetch. we’re talking hundreds of calls to hackatime in a normal work session. from ONE user. me hackatime is a free hack club service and i was starting to feel bad lol. the fix: cache the response ~/.cache/hackfetch/last.json stores the last snapshot with a timestamp. every fetch checks that file first. if its fresh enough, skip the network entirely and just render from disk. TTL is different depending on the caller: hackfetch (one-shot): 30 seconds. long enough that a normal re-run inside a devlog attempt is instant, short enough that you dont get badly stale numbers. hackfetch -status: 60 seconds tmux polls roughly this often anyway so its basically free now. hackfetch -watch: ignores the cache, always fresh (thats the whole point of watch mode). opt out with -no-cache or HACKFETCH_CACHE_TTL=0 if you want. also HACKFETCH_CACHE_TTL=300 to be even more polite. So yea tmux is now basically free . but the real win writing this made me realize the cache does more than save milliseconds: every fetch was a full TLS handshake, wifi radio spin up, etc. now most fetches touch the disk once and nothing else. macbook fan appreciates it. offline. if your wifi drops mid coding session you keep working from the cache instead of showing a spinner forever. tmux bar just keeps saying what it said 40 seconds ago. battery again but for the hackatime server. hackfetch stops asking the api 5-10x more than they need to. multiply by everyone who has it in their tmux config and thats a real thing. atomic write via .tmp + rename so nothing ever reads a half-written file. cache is user-only (0600), because it does contain your top project name. bonus: -doctor while i was fixing the polite-to-the-api stuff i added -doctor , which walks a checklist and tells you whats broken: hackfetch doctor ✓ wakatime config exists /Users/xerneas/.wakatime.cfg ✓ api_key present loaded from config ✓ wakatime-cli found /Users/xerneas/.wakatime/wakatime-cli ✓ hackatime api reachable today: 28m ✓ terminal supports truecolor $COLORTERM=truecolor ✓ browser opener available /usr/bin/open green if its working, orange if its not, and non-zero exit if anything failed so you can script it. this was going to be a small self-diagnosis feature and it caught a real bug in the api client on the very first run i did while writing it lol (a string field where hackatime returns an int, so one of the fields was silently missing from every fetch since v1.0). fixed that too. ship both landed in v1.10.0. update as usual: brew update brew upgrade hackfetch or arch: yay -Syu hackfetch-bin then run hackfetch -doctor first, and if anything is broken it’ll tell you exactly what."}, {"post_id": 31673, "ts": "2026-07-20T08:45:06Z", "hours": 8.4247, "text": "hackfetch is now TMUX + NVIM COMPATIBLE new thing today: hackfetch will just show up wherever you already look. tmux status bar. nvim statusline. any tool that can shell out to a command and put text on a screen. The addition was simple: hackfetch -status prints one line: 2h 11m today · hackfetch (45m) · streak 12 just the numbers, for tools that already have their own rendering. hackfetch is a data source now, not just a display. in tmux two lines in ~/.tmux.conf : set -g status-interval 60 thats it. every tmux session, every window, refreshing once a minute. i dropped it in a pink Catppuccin capsule to the left of my existing date capsule and now i cant stop glancing at it lol. in neovim (lualine) same story, five lines of lua: sections = { lualine_z = { function () return vim . fn . system ( \"hackfetch -status\" ): gsub ( \" \\n \" , \"\" ) end } } } shells out on every redraw. works with airline too, or any custom statusline that lets you plug in a function. the fun part making hackfetch call safe for “something tmux runs every 60s forever” meant fixing three assumptions the normal fetch was making. this was way harder than it should have been ngl. setup cant block. if you dont have ~/.wakatime.cfg, normal hackfetch throws you into an interactive setup wizard (ask me how i know). in status mode that would freeze your tmux bar until you notice and Ctrl+C it. so status mode is fully non interactive now. no config → print nothing → tmux shows nothing → no deadlock 🙏 api errors cant leak into your bar. hackatime offline? old behavior would dump HTTP 500 timeout into your status area which looks INSANE. now status mode exits silently instead so your bar stays clean every call has to be cheap. hackfetch’s parallel fetch alr seconds, and the shared HTTP client keeps connections alive across the 4 API calls it fires, so tmux polling every 60s is easy on the API. a proper local file cache is on the list for later but honestly not needed for now (i’m lazy) ship landed in v1.9.0. if you already have it: brew update brew upgrade hackfetch or arch family: yay -Syu hackfetch-bin (for more installs for ur specific os check out the github pls) then drop the tmux or lualine snippet above into your dotfiles and its just there in every terminal. no plugin. no config. no daemon. just a flag."}, {"post_id": 31042, "ts": "2026-07-19T03:42:21Z", "hours": 8.7494, "text": "Hackfetch Gets Real Colors New thing today: hackfetch now emits 24-bit color when your terminal supports it, and spreads gradients smoothly across each row instead of cycling through the palette one character at a time. Before and after Old behavior: for a per-char scheme like rainbow , each character got exactly one palette entry, wrapping around every N characters. On a 30-column row with a 3-color palette, that looked like ten cycles of red, green, blue, red, green, blue… basically RGB static. New behavior: the palette spreads across the row once, and characters between palette entries get interpolated in-between colors. Same 3-color palette on a 30-column row now shows red, olive, green, teal, blue, magenta, back to red. Why the rebuild Terminals speak two color modes: 256-color ( \\x1b[38;5;Nm ): pick from a fixed palette of 256 preset RGB values. 24-bit / truecolor ( \\x1b[38;2;R;G;Bm ): specify any of ~16 million RGB values directly. The old code always used 256-color. That meant every character had to snap to one of the palette entries. No in-betweens possible. The new code checks $COLORTERM (set to truecolor by iTerm2, kitty, WezTerm, Alacritty, GNOME Terminal, and most modern terminals) and emits 24-bit escapes when supported. When it’s not, it falls back to the old cycled-palette behavior automatically. You can force it either way with HACKFETCH_TRUECOLOR=1 or =0 . Where you’ll notice it The built-in rainbow scheme has 23 palette stops, so the difference on that one is small. You just see a smoother color distribution and less banding. The change is dramatic on: custom themes with few stops (try 3 colors in your ~/.config/hackfetch/colors.json for the wildest gradient) the stardance palette (11 stops, per-char), where sparkles now flow through the spectrum in order instead of landing on random-looking colors any per-line scheme ( pride , trans , bi , pan , sunset , ocean , forest ) since they now emit exact RGB values instead of nearest-256-color Bonus: the SVG, PNG, and JPG export paths use the smooth interpolation too, so exported cards look better regardless of your terminal. Ship Landed in v1.8.0 . brew update brew upgrade hackfetch Or on the Arch family: yay -Syu hackfetch-bin Try hackfetch rocket forest and just watch."}, {"post_id": 30475, "ts": "2026-07-18T02:33:55Z", "hours": 10.1122, "text": "One More Way to Install (and Pizza) Two small things today: hackfetch is now on the AUR, and there’s a new logo. hackfetch on the AUR A reviewer on my last ship said they had a hard time getting hackfetch running on CachyOS (an Arch-based Linux distro). Instead of trying to reproduce their exact issue, I figured the cleanest fix was to publish hackfetch through the package manager Arch users already trust. So hackfetch is now up as hackfetch-bin on the AUR: aur.archlinux.org/packages/hackfetch-bin If you’re on Arch, CachyOS, Manjaro, EndeavourOS, Garuda, or any other Arch-based distro: yay -S hackfetch-bin Or with paru: paru -S hackfetch-bin The package pulls the pre-built binary straight from the GitHub release, so there’s no waiting on a source build. Works on both x86_64 and aarch64 . Add it up and hackfetch is now installable one command from: brew (macOS and Linuxbrew) apt / dnf / yum / pacman / zypper / apk (all through the curl installer) the AUR (Arch family) go install (any platform with Go) the PowerShell installer (Windows) This thing is getting kind of hard to NOT install. Pizza logo Hack Club runs on pizza. Now hackfetch does too. hackfetch pizza It’s a triangular slice viewed from the tip, HACK CLUB baked into the middle, and a rolled crust at the wide edge. The tricky part was the crust. I went through three drafts trying to make it curve at the bottom without breaking the connection to the slice’s diagonal sides (turns out you can’t cleanly connect diagonal characters to horizontal ones in a monospace grid). Landed on a two-row rolled crust where the diagonals keep going and the interior fills with a double horizontal band. Pairs surprisingly well with sunset: hackfetch pizza sunset Turns your terminal into a golden-hour pizza box. Ship Both landed in v1.7.3 . If you’re on Arch-family: yay -S hackfetch-bin Elsewhere: brew update brew upgrade hackfetch Now try hackfetch pizza and tell me if the crust looks right."}, {"post_id": 29524, "ts": "2026-07-16T14:40:13Z", "hours": 3.2108, "text": "Hackfetch Is Now Actually Fast Last log I added a loading spinner so you’d have something to look at while hackfetch was hitting the Hackatime API. This week I made it so you barely have time to see the spinner at all (undoing all my work lol) The problem hackfetch was making four separate calls to Hackatime for every fetch: /users/current/heartbeats/most_recent (for your slack handle) /users/current/summaries (for your streak) /users/current/statusbar/today (for today's coding time) /users/current/stats/last_7_days (for weekly stats) Doing them one after another meant the total wait was the sum of all four. Turns out that’s about 1.7 seconds on a normal connection. Not the end of the world, but very noticeable when you just want to open a terminal. The fix: run them all at the same time Now hackfetch fires all four calls in parallel using goroutines, waits for the slowest one to come back, and then builds the fetch from the responses. Total wait drops from “sum of all four” to “just the slowest one.” Before: ~1.7 seconds After: ~0.7 seconds 60% faster . Every single fetch. Every single time. One tiny bonus optimization While I was in there, I also switched to a single shared HTTP client with a bigger connection pool. The default Go setup caps you at 2 open connections per host, which is fine when you’re calling one endpoint at a time but hurts when you’re firing four at once. Now the parallel calls can share connections instead of stacking up on each other. Nothing about the fetch itself changed. Same info, same layout, same colors. Just faster. Ship Shipped in v1.7.2. If you have hackfetch installed: brew update brew upgrade hackfetch time hackfetch Watch the spinner barely have time to appear."}, {"post_id": 29398, "ts": "2026-07-16T10:18:00Z", "hours": 13.6781, "text": "Loading Spinner and Splitting Up main.go Thanks so much to everyone who took the time to comment, rate, and drop feedback on my latest ship. All of it was genuinely so helpful and I’ve been spending the last couple days fixing things up a bit. I totally forgot to devlog so I’m actually losing a couple hours since it’s been over ten hours since my last one :sob A loading spinner while Hackatime fetches One reviewer pointed out that hackfetch takes a couple of seconds when it’s pulling your Hackatime stats for the first time, and there was no signal that anything was happening. Now there is. ⠋ fetching Hackatime... The spinner cycles through 10 braille frames and the whole line clears out the instant the fetch finishes. Same fetch, way less awkward pause. Two small details that make it feel right: It only shows when stderr is actually a terminal, so it doesn’t spam control codes into your log files if you redirect output. It prints one frame immediately, so fast fetches still flash something instead of nothing. hackfetch runs it around the API calls automatically. No config, no opt-in. It’s just there. Splitting up main.go Another reviewer said the 1.5k-line file was too much. They were completely right. hackfetch had grown into one giant main.go that held the logos, the color schemes, the Hackatime API client, the terminal render, the SVG exporter, the PNG rasterizer, everything. Refactored today into files that each do one thing: logos.go: the ASCII logos colors.go: color schemes and the ANSI → hex table config.go: reads ~/.wakatime.cfg hackatime.go: the API client, caching, and language inference sysinfo.go: OS, shell, editor, terminal setup.go: the -setup flow render.go: terminal render, watch loop, and layout export.go: SVG, PNG, and JPG exporters main.go: just flag parsing and the entry point (~100 lines instead of 1,600) Same binary, same behavior, zero user-visible change. But next time I want to add a new logo or a new color scheme, I know exactly which file to open. Also way friendlier for anyone who wants to hack on it. Ship Both landed in v1.7.1. If you already have it: brew update brew upgrade hackfetch Or the curl installer will pull v1.7.1 the next time you run it. Try it."}, {"post_id": 23812, "ts": "2026-07-06T23:42:52Z", "hours": 7.1119, "text": "New feature today: hackfetch can turn itself into a shareable image. The goal was simple: your terminal fetch should be more than a terminal thing. If it looks cool on your screen, you should be able to post it in a Slack channel or drop it in a devlog without ever having to take a screenshot. hackfetch -export card.svg Run that and instead of printing to your terminal, hackfetch writes an SVG file that looks exactly like the fetch on your screen: logo on the left, stats on the right, rounded corners, monospace font, every color preserved. Getting the general SVG output was the easy part. Draw a rectangle, put text inside it, done. The hard part was preserving the colors. Terminals speak ANSI 256-color codes. SVGs speak hex color strings. They don’t line up one-to-one, so a naive export just drops every color and produces a black-and-white version of the fetch. Not very shareable. The fix: a lookup table from ANSI 256-color codes to hex values, plus a rendering path that emits every styled character as its own SVG element with the correct fill color. That’s actually a lot of tspans. Schemes like per-char, where every single glyph has its own gradient stop, can produce hundreds of colored elements per fetch. But it works. The SVG renders smoothly in any browser and looks identical to what shows up in your terminal. Use It Anywhere Some things you can do with the exported card: open it in a browser to see it drop it into a Slack channel or a devlog convert it to PNG with rsvg-convert if you need a raster image hackfetch -export card.svg trans Open it. Post it. Ship it."}, {"post_id": 19472, "ts": "2026-06-30T20:03:24Z", "hours": 2.2483, "text": "Live Hackfetch New milestone today: hackfetch can now stay open and update itself while you code. The goal was simple: run hackfetch once, leave it in the corner of your terminal, and watch the numbers move in real time as you work. hackfetch -watch Your today-hours tick up. Your top project changes when you switch repos. Your streak rolls over at midnight. All without running the command a second time. The static render was already in place from the regular one-shot fetch. The new part was redrawing without scrolling. That sounds simple. It is not. In a terminal, every time you print something, it appends to the bottom of the screen. By default, refreshing the fetch would just print a second copy of itself underneath the first, then a third, then a fourth. Within a minute you’d have a wall of identical fetches scrolling away into the past. The trick is ANSI escape codes. There’s a sequence that means “move the cursor up N lines” and one that means “clear the rest of the screen from here down.” Together they let you erase the previous fetch and redraw a new one in the same spot. Same screen, fresh data, no scroll. Why every 30 seconds? Two reasons: Hackatime aggregates heartbeats in 1-minute buckets internally, so polling faster than that doesn’t tell you anything new 30 seconds is fast enough to feel “live” without hammering the API for no reason Ctrl+C to quit. Resizing the terminal doesn’t break it. Pair it with a gradient color scheme and the whole thing turns into a tiny dashboard for your coding session: hackfetch -watch sunset"}, {"post_id": 16604, "ts": "2026-06-27T00:38:28Z", "hours": 0.5825, "text": "Hackfetch Installs Itself Anywhere Hackfetch crossed another milestone today: you no longer need Go installed to use it. Or Homebrew. Or anything, really. The goal was simple: one command, any Linux, any Mac, no prerequisites. curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh Run that on Ubuntu, Fedora, Alpine, Arch, openSUSE, whatever you have, and a few seconds later hackfetch is on your PATH. Getting the basic installer working was the easy part. Detect your OS, detect your CPU architecture, grab the matching binary from GitHub Releases, drop it in /usr/local/bin. Standard installer stuff. The harder problem was the script itself failing on some Linuxes. I’d written the first version in Bash, with set -euo pipefail at the top and $'\\033[1m' style escape sequences sprinkled through. Worked great on my Mac. Worked great on Ubuntu. Then I checked which shell Alpine Linux ships by default. Not Bash. The whole script would die on line one for anyone on a minimal container. So I rewrote it in POSIX sh, which is the one shell every Unix system actually has. No Bash-isms, no fancy quoting, no pipefail. Smaller, dumber, way more portable. Speaking Seven Package Managers The next problem: the script needs curl and tar to do its job. If you don’t have them, normally you’d just be stuck. Instead, the installer now detects your system’s package manager and installs the missing prereqs for you: apt (Debian, Ubuntu) dnf (Fedora, RHEL) yum (CentOS, older RHEL) pacman (Arch) zypper (openSUSE) apk (Alpine) brew (macOS) They all do the same thing. They all use different words for it. The installer knows all seven. One line. Any Linux. No prereqs."}, {"post_id": 15120, "ts": "2026-06-24T15:57:10Z", "hours": 0.4172, "text": "Hackfetch Meets Orpheus! If you’ve been around Hack Club for more than five minutes, you know Orpheus. The little dinosaur shows up everywhere: stickers, websites, T-shirts, hackathon merch. Until today, he wasn’t in hackfetch. That’s been bugging me since v1.0. The goal was simple: give Orpheus a spot in the logo lineup, the same way flag, bot, and rocket already have one. hackfetch orpheus Drawing him was the harder part. Every logo in hackfetch has to fit inside a fixed width of 33 characters, otherwise the system info column next to it gets pushed off the screen. 33 characters is not a lot of room to draw a recognizable dinosaur, especially one with personality. I tried him head-on first. It didn’t work. Round dinosaur faces in ASCII end up looking like blobs because you don’t have curves, only corners. So I redrew him in profile. The result: a snout sticking out to one side one big eye (◉) that catches the light a HACK CLUB body underneath two tiny stubby legs at the bottom Nine lines tall. No wasted rows. He plays especially well with the gradient color schemes: hackfetch orpheus -color forest hackfetch orpheus -color sunset Forest makes him look like he’s wandering through tall grass. Sunset gives him a “main character in the closing shot” vibe. The mascot finally has a seat at the terminal. Long overdue! Also if any better artists want to have a crack at it, I’m super open to that, and I can credit you in my repo as a collaborator! THNX!"}, {"post_id": 14410, "ts": "2026-06-23T15:08:46Z", "hours": 6.8756, "text": "Hackfetch Can Finally Fetch Hackfetch crossed a pretty big milestone today: it actually fetches things. The goal is simple: build a Neofetch-style dashboard for Hack Club. Run a single command and get a snapshot of your machine alongside your Hack Club activity. hackfetch and instantly see information like: OS Hostname Username Shell Terminal Editor Hackatime stats Getting the system information was the easy part. Go makes it straightforward to grab things like the current user, hostname, operating system, and environment variables. The harder problem was rendering everything cleanly beside an ASCII logo. Each logo has different dimensions and line lengths, so I ended up building a small layout engine that calculates the width of every logo row and pads it dynamically before printing the corresponding information. Without that, the text column slowly drifts into the logo and the entire fetch screen looks broken. Hooking into Hackatime The more interesting work was integrating with the Hackatime API.Hackfetch reads your API key from: ~/.wakatime.cfg authenticates with Hackatime, and pulls fresh coding statistics every time you run the command.Right now it can display: Today’s coding time Weekly coding time Current streak Top project Most-used language No browser. No dashboard. Just a terminal command."}, {"post_id": 7579, "ts": "2026-06-12T17:50:14Z", "hours": 0.5989, "text": "In honor of pride month, I have added a pride color scheme to my custom hackfetch. It is currently installable via brew. On macs, simply run: brew install xerneas3318/tap/hackfetch Currently working on better support for more operating systems. Follow and like to stay updated!"}, {"post_id": 7526, "ts": "2026-06-12T15:50:51Z", "hours": 8.7181, "text": "Introducing hackfetch a tiny terminal fetch tool for hackatime. Run hackfetch and get your hours today, weekly total, streak, top project, and top language right in your terminal. 5 logos. 8 color schemes. mix and match: hackfetch stardance rainbow How it works: hackfetch reads your hackatime key from ~/.wakatime.cfg, fetches your Hackatime summaries and heartbeats, then renders your stats directly in the terminal."}]...
|
Title: Hackfetch by @xerneas | Stardance
Devlogs: Title: Hackfetch by @xerneas | Stardance
Devlogs:
Introducing hackfetch a tiny terminal fetch tool for hackatime. Run hackfetch and get your hours today, weekly total, streak, top project, and top language right in your terminal. 5 logos. 8 color schemes. mix and match: hackfetch stardance rainbow How it works: hackfetch reads your hackatime key from ~/.wakatime.cfg, fetches your Hackatime summaries and heartbeats, then renders your stats directly in the terminal.
In honor of pride month, I have added a pride color scheme to my custom hackfetch. It is currently installable via brew. On macs, simply run: brew install xerneas3318/tap/hackfetch Currently working on better support for more operating systems. Follow and like to stay updated!
Hackfetch Can Finally Fetch Hackfetch crossed a pretty big milestone today: it actually fetches things. The goal is simple: build a Neofetch-style dashboard for Hack Club. Run a single command and get a snapshot of your machine alongside your Hack Club activity. hackfetch and instantly see information like: OS Hostname Username Shell Terminal Editor Hackatime stats Getting the system information was the easy part. Go makes it straightforward to grab things like the current user, hostname, operating system, and environment variables. The harder problem was rendering everything cleanly beside an ASCII logo. Each logo has different dimensions and line lengths, so I ended up building a small layout engine that calculates the width of every logo row and pads it dynamically before printing the corresponding information. Without that, the text column slowly drifts into the logo and the entire fetch screen looks broken. Hooking into Hackatime The more interesting work was integrating with the Hackatime API.Hackfetch reads your API key from: ~/.wakatime.cfg authenticates with Hackatime, and pulls fresh coding statistics every time you run the command.Right now it can display: Today’s coding time Weekly coding time Current streak Top project Most-used language No browser. No dashboard. Just a terminal command.
Hackfetch Meets Orpheus! If you’ve been around Hack Club for more than five minutes, you know Orpheus. The little dinosaur shows up everywhere: stickers, websites, T-shirts, hackathon merch. Until today, he wasn’t in hackfetch. That’s been bugging me since v1.0. The goal was simple: give Orpheus a spot in the logo lineup, the same way flag, bot, and rocket already have one. hackfetch orpheus Drawing him was the harder part. Every logo in hackfetch has to fit inside a fixed width of 33 characters, otherwise the system info column next to it gets pushed off the screen. 33 characters is not a lot of room to draw a recognizable dinosaur, especially one with personality. I tried him head-on first. It didn’t work. Round dinosaur faces in ASCII end up looking like blobs because you don’t have curves, only corners. So I redrew him in profile. The result: a snout sticking out to one side one big eye (◉) that catches the light a HACK CLUB body underneath two tiny stubby legs at the bottom Nine lines tall. No wasted rows. He plays especially well with the gradient color schemes: hackfetch orpheus -color forest hackfetch orpheus -color sunset Forest makes him look like he’s wandering through tall grass. Sunset gives him a “main character in the closing shot” vibe. The mascot finally has a seat at the terminal. Long overdue! Also if any better artists want to have a crack at it, I’m super open to that, and I can credit you in my repo as a collaborator! THNX!
Hackfetch Installs Itself Anywhere Hackfetch crossed another milestone today: you no longer need Go installed to use it. Or Homebrew. Or anything, really. The goal was simple: one command, any Linux, any Mac, no prerequisites. curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh Run that on Ubuntu, Fedora, Alpine, Arch, openSUSE, whatever you have, and a few seconds later hackfetch is on your PATH. Getting the basic installer working was the easy part. Detect your OS, detect your CPU architecture, grab the matching binary from GitHub Releases, drop it in /usr/local/bin. Standard installer stuff. The harder problem was the script itself failing on some Linuxes. I’d written the first version in Bash, with set -euo pipefail at the top and $'\033[1m' style escape sequences sprinkled through. Worked great on my Mac. Worked great on Ubuntu. Then I checked which shell Alpine Linux ships by default. Not Bash. The whole script would die on line one for anyone on a minimal container. So I rewrote it in POSIX sh, which is the one shell every Unix system actually has. No Bash-isms, no fancy quoting, no pipefail. Smaller, dumber, way more portable. Speaking Seven Package Managers The next problem: the script needs curl and tar to do its job. If you don’t have them, normally you’d just be stuck. Instead, the installer now detects your system’s package manager and installs the missing prereqs for you: apt (Debian, Ubuntu) dnf (Fedora, RHEL) yum (CentOS, older RHEL) pacman (Arch) zypper (openSUSE) apk (Alpine) brew (macOS) They all do the same thing. They all use different words for it. The installer knows all seven. One line. Any Linux. No prereqs.
Live Hackfetch New milestone today: hackfetch can now stay open and update itself while you code. The goal was simple: run hackfetch once, leave it in the corner of your terminal, and watch the numbers move in real time as you work. hackfetch -watch Your today-hours tick up. Your top project changes when you switch repos. Your streak rolls over at midnight. All without running the command a second time. The static render was already in place from the regular one-shot fetch. The new part was redrawing without scrolling. That sounds simple. It is not. In a terminal, every time you print something, it appends to the bottom of the screen. By default, refreshing the fetch would just print a second copy of itself underneath the first, then a third, then a fourth. Within a minute you’d have a wall of identical fetches scrolling away into the past. The trick is ANSI escape codes. There’s a sequence that means “move the cursor up N lines” and one that means “clear the rest of the screen from here down.” Together they let you erase the previous fetch and redraw a new one in the same spot. Same screen, fresh data, no scroll. Why every 30 seconds? Two reasons: Hackatime aggregates heartbeats in 1-minute buckets internally, so polling faster than that doesn’t tell you anything new 30 seconds is fast enough to feel “live” without hammering the API for no reason Ctrl+C to quit. Resizing the terminal doesn’t break it. Pair it with a gradient color scheme and the whole thing turns into a tiny dashboard for your coding session: hackfetch -watch sunset
New feature today: hackfetch can turn itself into a shareable image. The goal was simple: your terminal fetch should be more than a terminal thing. If it looks cool on your screen, you should be able to post it in a Slack channel or drop it in a devlog without ever having to take a screenshot. hackfetch -export card.svg Run that and instead of printing to your terminal, hackfetch writes an SVG file that looks exactly like the fetch on your screen: logo on the left, stats on the right, rounded corners, monospace font, every color preserved. Getting the general SVG output was the easy part. Draw a rectangle, put text inside it, done. The hard part was preserving the colors. Terminals speak ANSI 256-color codes. SVGs speak hex color strings. They don’t line up one-to-one, so a naive export just drops every color and produces a black-and-white version of the fetch. Not very shareable. The fix: a lookup table from ANSI 256-color codes to hex values, plus a rendering path that emits every styled character as its own SVG element with the correct fill color. That’s actually a lot of tspans. Schemes like per-char, where every single glyph has its own gradient stop, can produce hundreds of colored elements per fetch. But it works. The SVG renders smoothly in any browser and looks identical to what shows up in your terminal. Use It Anywhere Some things you can do with the exported card: open it in a browser to see it drop it into a Slack channel or a devlog convert it to PNG with rsvg-convert if you need a raster image hackfetch -export card.svg trans Open it. Post it. Ship it.
Loading Spinner and Splitting Up main.go Thanks so much to everyone who took the time to comment, rate, and drop feedback on my latest ship. All of it was genuinely so helpful and I’ve been spending the last couple days fixing things up a bit. I totally forgot to devlog so I’m actually losing a couple hours since it’s been over ten hours since my last one :sob A loading spinner while Hackatime fetches One reviewer pointed out that hackfetch takes a couple of seconds when it’s pulling your Hackatime stats for the first time, and there was no signal that anything was happening. Now there is. ⠋ fetching Hackatime... The spinner cycles through 10 braille frames and the whole line clears out the instant the fetch finishes. Same fetch, way less awkward pause. Two small details that make it feel right: It only shows when stderr is actually a terminal, so it doesn’t spam control codes into your log files if you redirect output. It prints one frame immediately, so fast fetches still flash something instead of nothing. hackfetch runs it around the API calls automatically. No config, no opt-in. It’s just there. Splitting up main.go Another reviewer said the 1.5k-line file was too much. They were completely right. hackfetch had grown into one giant main.go that held the logos, the color schemes, the Hackatime API client, the terminal render, the SVG exporter, the PNG rasterizer, everything. Refactored today into files that each do one thing: logos.go: the ASCII logos colors.go: color schemes and the ANSI → hex table config.go: reads ~/.wakatime.cfg hackatime.go: the API client, caching, and language inference sysinfo.go: OS, shell, editor, terminal setup.go: the -setup flow render.go: terminal render, watch loop, and layout export.go: SVG, PNG, and JPG exporters main.go: just flag parsing and the entry point (~100 lines instead of 1,600) Same binary, same behavior, zero user-visible change. But next time I want to add a new logo or a new color scheme, I know exactly which file to open. Also way friendlier for anyone who wants to hack on it. Ship Both landed in v1.7.1. If you already have it: brew update brew upgrade hackfetch Or the curl installer will pull v1.7.1 the next time you run it. Try it.
Hackfetch Is Now Actually Fast Last log I added a loading spinner so you’d have something to look at while hackfetch was hitting the Hackatime API. This week I made it so you barely have time to see the spinner at all (undoing all my work lol) The problem hackfetch was making four separate calls to Hackatime for every fetch: /users/current/heartbeats/most_recent (for your slack handle) /users/current/summaries (for your streak) /users/current/statusbar/today (for today's coding time) /users/current/stats/last_7_days (for weekly stats) Doing them one after another meant the total wait was the sum of all four. Turns out that’s about 1.7 seconds on a normal connection. Not the end of the world, but very noticeable when you just want to open a terminal. The fix: run them all at the same time Now hackfetch fires all four calls in parallel using goroutines, waits for the slowest one to come back, and then builds the fetch from the responses. Total wait drops from “sum of all four” to “just the slowest one.” Before: ~1.7 seconds After: ~0.7 seconds 60% faster . Every single fetch. Every single time. One tiny bonus optimization While I was in there, I also switched to a single shared HTTP client with a bigger connection pool. The default Go setup caps you at 2 open connections per host, which is fine when you’re calling one endpoint at a time but hurts when you’re firing four at once. Now the parallel calls can share connections instead of stacking up on each other. Nothing about the fetch itself changed. Same info, same layout, same colors. Just faster. Ship Shipped in v1.7.2. If you have hackfetch installed: brew update brew upgrade hackfetch time hackfetch Watch the spinner barely have time to appear.
One More Way to Install (and Pizza) Two small things today: hackfetch is now on the AUR, and there’s a new logo. hackfetch on the AUR A reviewer on my last ship said they had a hard time getting hackfetch running on CachyOS (an Arch-based Linux distro). Instead of trying to reproduce their exact issue, I figured the cleanest fix was to publish hackfetch through the package manager Arch users already trust. So hackfetch is now up as hackfetch-bin on the AUR: aur.archlinux.org/packages/hackfetch-bin If you’re on Arch, CachyOS, Manjaro, EndeavourOS, Garuda, or any other Arch-based distro: yay -S hackfetch-bin Or with paru: paru -S hackfetch-bin The package pulls the pre-built binary straight from the GitHub release, so there’s no waiting on a source build. Works on both x86_64 and aarch64 . Add it up and hackfetch is now installable one command from: brew (macOS and Linuxbrew) apt / dnf / yum / pacman / zypper / apk (all through the curl installer) the AUR (Arch family) go install (any platform with Go) the PowerShell installer (Windows) This thing is getting kind of hard to NOT install. Pizza logo Hack Club runs on pizza. Now hackfetch does too. hackfetch pizza It’s a triangular slice viewed from the tip, HACK CLUB baked into the middle, and a rolled crust at the wide edge. The tricky part was the crust. I went through three drafts trying to make it curve at the bottom without breaking the connection to the slice’s diagonal sides (turns out you can’t cleanly connect diagonal characters to horizontal ones in a monospace grid). Landed on a two-row rolled crust where the diagonals keep going and the interior fills with a double horizontal band. Pairs surprisingly well with sunset: hackfetch pizza sunset Turns your terminal into a golden-hour pizza box. Ship Both landed in v1.7.3 . If you’re on Arch-family: yay -S hackfetch-bin Elsewhere: brew update brew upgrade hackfetch Now try hackfetch pizza and tell me if the crust looks right.
Hackfetch Gets Real Colors New thing today: hackfetch now emits 24-bit color when your terminal supports it, and spreads gradients smoothly across each row instead of cycling through the palette one character at a time. Before and after Old behavior: for a per-char scheme like rainbow , each character got exactly one palette entry, wrapping around every N characters. On a 30-column row with a 3-color palette, that looked like ten cycles of red, green, blue, red, green, blue… basically RGB static. New behavior: the palette spreads across the row once, and characters between palette entries get interpolated in-between colors. Same 3-color palette on a 30-column row now shows red, olive, green, teal, blue, magenta, back to red. Why the rebuild Terminals speak two color modes: 256-color ( \x1b[38;5;Nm ): pick from a fixed palette of 256 preset RGB values. 24-bit / truecolor ( \x1b[38;2;R;G;Bm ): specify any of ~16 million RGB values directly. The old code always used 256-color. That meant every character had to snap to one of the palette entries. No in-betweens possible. The new code checks $COLORTERM (set to truecolor by iTerm2, kitty, WezTerm, Alacritty, GNOME Terminal, and most modern terminals) and emits 24-bit escapes when supported. When it’s not, it falls back to the old cycled-palette behavior automatically. You can force it either way with HACKFETCH_TRUECOLOR=1 or =0 . Where you’ll notice it The built-in rainbow scheme has 23 palette stops, so the difference on that one is small. You just see a smoother color distribution and less banding. The change is dramatic on: custom themes with few stops (try 3 colors in your ~/.config/hackfetch/colors.json for the wildest gradient) the stardance palette (11 stops, per-char), where sparkles now flow through the spectrum in order instead of landing on random-looking colors any per-line scheme ( pride , trans , bi , pan , sunset , ocean , forest ) since they now emit exact RGB values instead of nearest-256-color Bonus: the SVG, PNG, and JPG export paths use the smooth interpolation too, so exported cards look better regardless of your terminal. Ship Landed in v1.8.0 . brew update brew upgrade hackfetch Or on the Arch family: yay -Syu hackfetch-bin Try hackfetch rocket forest and just watch.
hackfetch is now TMUX + NVIM COMPATIBLE new thing today: hackfetch will just show up wherever you already look. tmux status bar. nvim statusline. any tool that can shell out to a command and put text on a screen. The addition was simple: hackfetch -status prints one line: 2h 11m today · hackfetch (45m) · streak 12 just the numbers, for tools that already have their own rendering. hackfetch is a data source now, not just a display. in tmux two lines in ~/.tmux.conf : set -g status-interval 60 thats it. every tmux session, every window, refreshing once a minute. i dropped it in a pink Catppuccin capsule to the left of my existing date capsule and now i cant stop glancing at it lol. in neovim (lualine) same story, five lines of lua: sections = { lualine_z = { function () return vim . fn . system ( "hackfetch -status" ): gsub ( " \n " , "" ) end } } } shells out on every redraw. works with airline too, or any custom statusline that lets you plug in a function. the fun part making hackfetch call safe for “something tmux runs every 60s forever” meant fixing three assumptions the normal fetch was making. this was way harder than it should have been ngl. setup cant block. if you dont have ~/.wakatime.cfg, normal hackfetch throws you into an interactive setup wizard (ask me how i know). in status mode that would freeze your tmux bar until you notice and Ctrl+C it. so status mode is fully non interactive now. no config → print nothing → tmux shows nothing → no deadlock 🙏 api errors cant leak into your bar. hackatime offline? old behavior would dump HTTP 500 timeout into your status area which looks INSANE. now status mode exits silently instead so your bar stays clean every call has to be cheap. hackfetch’s parallel fetch alr seconds, and the shared HTTP client keeps connections alive across the 4 API calls it fires, so tmux polling every 60s is easy on the API. a proper local file cache is on the list for later but honestly not needed for now (i’m lazy) ship landed in v1.9.0. if you already have it: brew update brew upgrade hackfetch or arch family: yay -Syu hackfetch-bin (for more installs for ur specific os check out the github pls) then drop the tmux or lualine snippet above into your dotfiles and its just there in every terminal. no plugin. no config. no daemon. just a flag.
caching or i owe hackclub money so heres what my day looked like: nvim was calling hackfetch -status on every redraw for my lualine. tmux was calling it every 60 seconds for the status bar. i had 3 tmux sessions open. and every time i actually opened a new terminal, hackfetch fired again on shell start. quick napkin math: nvim redraws are basically continuous when im typing, tmux was hitting the api 3x/minute across sessions, plus every terminal open = another fetch. we’re talking hundreds of calls to hackatime in a normal work session. from ONE user. me hackatime is a free hack club service and i was starting to feel bad lol. the fix: cache the response ~/.cache/hackfetch/last.json stores the last snapshot with a timestamp. every fetch checks that file first. if its fresh enough, skip the network entirely and just render from disk. TTL is different depending on the caller: hackfetch (one-shot): 30 seconds. long enough that a normal re-run inside a devlog attempt is instant, short enough that you dont get badly stale numbers. hackfetch -status: 60 seconds tmux polls roughly this often anyway so its basically free now. hackfetch -watch: ignores the cache, always fresh (thats the whole point of watch mode). opt out with -no-cache or HACKFETCH_CACHE_TTL=0 if you want. also HACKFETCH_CACHE_TTL=300 to be even more polite. So yea tmux is now basically free . but the real win writing this made me realize the cache does more than save milliseconds: every fetch was a full TLS handshake, wifi radio spin up, etc. now most fetches touch the disk once and nothing else. macbook fan appreciates it. offline. if your wifi drops mid coding session you keep working from the cache instead of showing a spinner forever. tmux bar just keeps saying what it said 40 seconds ago. battery again but for the hackatime server. hackfetch stops asking the api 5-10x more than they need to. multiply by everyone who has it in their tmux config and thats a real thing. atomic write via .tmp + rename so nothing ever reads a half-written file. cache is user-only (0600), because it does contain your top project name. bonus: -doctor while i was fixing the polite-to-the-api stuff i added -doctor , which walks a checklist and tells you whats broken: hackfetch doctor ✓ wakatime config exists /Users/xerneas/.wakatime.cfg ✓ api_key present loaded from config ✓ wakatime-cli found /Users/xerneas/.wakatime/wakatime-cli ✓ hackatime api reachable today: 28m ✓ terminal supports truecolor $COLORTERM=truecolor ✓ browser opener available /usr/bin/open green if its working, orange if its not, and non-zero exit if anything failed so you can script it. this was going to be a small self-diagnosis feature and it caught a real bug in the api client on the very first run i did while writing it lol (a string field where hackatime returns an int, so one of the fields was silently missing from every fetch since v1.0). fixed that too. ship both landed in v1.10.0. update as usual: brew update brew upgrade hackfetch or arch: yay -Syu hackfetch-bin then run hackfetch -doctor first, and if anything is broken it’ll tell you exactly what.
my streak was lying to me for a month went to add a simple 7-day sparkline. by the end of the night i had rewritten how hackfetch talks to hackatime and my streak field is finally accurate for the first time in weeks. the plan was get the status from the last 7 days. draw ▁▂▃▄▅▆▇█ bars except the endpoint i needed straight up 404s. /users/current/summaries doesnt exist on the current hackatime deployment. Which means every single time i ran hackfetch it was quietly making a 30-day range call that always failed, then falling back to a placeholder that said “if today has activity, streak = 1”. thats it. no matter how long ive actually been on a streak, the fetch would just show 1 day. 🤦 my streak has said 1 day for the last 2 weeks even though ive been coding literally every day. never noticed because 1 day looks kinda plausible (i added 1 day as a fallback so that it didn’t show an error a couple weeks ago and forgot ) the fix: went digging in hackatimes rails routes on github. turns out theres a whole /api/v1/ namespace i was never using. and one of the endpoints is /api/v1/users/:id/heartbeats/spans. one call, ~150kb of json, every coding session ive ever logged with start_time, end_time, duration. 2000+ spans. which is exactly what i need for both features. bucket the timestamps by local calendar day, count unique days for streak, sum durations per day for the sparkline. one request covers both. and while i was already in the api layer i noticed fetchUser was making a whole separate call for my slack handle, which is silly because that data is already in the weekly stats response we cache. so i piggybacked it. weve gone from 4 api calls per fetch to 3. the sparkline: 7-day chart ▄▄▇▅▄▅▃ 65h 28m oldest on the left, newest on the right. that tall bar in the middle is a big lock-in session from earlier in the week. the two shorter ones on the right are today (still coding) and yesterday (took a break). opt in for -status --sparkline if you want it in your tmux bar too: 2h 9m today · streak 9 · ▄▄▇▅▄▅▃ 65h 28m teasing a backend: I’m planning on building a whole leaderboard server on a free hack club nest box so people can compete on their hackatime hours. while i was poking around the routes file for the streak fix i noticed something. /api/v1/leaderboard/daily and /api/v1/leaderboard/weekly already exist. public. no auth needed. no server needed. no cron sync. hackatime literally already has it directly. so hackfetch -leaderboard is coming soon (private friend groups and personal competitions can come later) last devlog before my next ship after the ship the devlogs are going to be huge. stay tuned :P
hackfetch COLLAB?? so my last two devlogs teased two features. shipping both today. -leaderboard last devlog i said “compete with your friends on hackatime hours is coming soon.” i thought i was gonna have to build a whole nest server for it. turns out /api/v1/leaderboard/daily and /api/v1/leaderboard/weekly already exist and are public on hackatime. just a single call!! so hackfetch -leaderboard daily (or weekly) now shows the top 10: ✦ daily leaderboard Last 24 hours 🥇 1. soaphia14 11h 12m 🥈 2. AnastKara 10h 32m 🥉 3. RoSerMar 10h 6m 4. euledone 10h 5. TheShovel 10h 6. Dylhouse 9h 1m 7. Dexrn 8h 59m 8. HexFud 8h 31m 9. zeddash 8h 29m 10. Trtotomotoro 8h 26m every username is an OSC 8 clickable link to that person’s hackatime profile. modern terminals (iterm2, kitty, wezterm, alacritty, gnome-terminal) render it as an actual hyperlink you can click. terminals without OSC 8 just show the plain text so it doesnt look broken. if you’re on the board it highlights your row in orange and adds (you) next to your name. json addon the other thing. someone else competing in stardance messaged me the other day about integrating hackatime into their own project and needed help figuring out the api (YAY). helping them made me realize hackfetch is doing a bunch of work (auth, caching, streak reconstruction, per-day bucketing) that other tools would love to piggyback on. so now: $ hackfetch -json { "version": "2", "fetched_at": "2026-07-25T17:00: 20.900829+05:30", "system": { "user": "xerneas", "host": "Macbook-Pro", "os": "macOS 26.5.2", ... }, "hackatime": { "slack": "@U0B8FHHRQPJ", "streak": 12, "today_seconds": 15820, "week_seconds": 237501, "top_project": { "name": "hackfetch", " "top_language": { "name": "Go", "seconds": 97418 }, "week_chart": [36967, 31651, 33841, 284 "machines": 3 } } week_chart is 7 numbers = daily seconds oldest to newest same as the sparkline. top_language skips the unknown/other buckets. everything lines up with what the normal fetch would show, just parseable. ship landed in v2.1.0. brew update && brew upgrade hackfetch or arch: yay -Syu hackfetch-bin then try: hackfetch -leaderboard weekly hackfetch -json | jq For a general install use: curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh
big thank you for everyone’s feedback! fresh out of the oven: hackfetch v2.1.1 (aka the reviewer bug fix pass) what got fixed: shell detection used to just read $SHELL which is your login shell. if you log in as bash but run fish, hackfetch was calling you a bash user. it now checks $FISH_VERSION / $ZSH_VERSION / $BASH_VERSION and falls back to asking the OS who your parent process actually is editor detection was two bugs in a trench coat. it wasnt stripping args so zeditor --wait showed up as “zeditor –wait” instead of “Zed”, and if you had no $EDITOR set it defaulted to nano even if you had literally never opened nano. now it strips flags, maps launcher names to human ones (zeditor -> Zed, code -> VS Code, cursor -> Cursor, hx -> Helix etc), and says “-” instead of nano if nothing is set. top project label was ambiguous. it was pulling weekly stats but the row just said “top project” so people thought it meant all time. now weekly rows read top proj 7d , top lang 7d , top ed 7d , top cat 7d . setup dialog was scaring people. it always printed “file exists but has no api_key” whenever it reached the setup flow, even if the api_key line was actually there but just failing to parse. loadConfig is now more forgiving (inline comments, quoted values, case insensitive keys) and setup tells you WHY its stuck instead of gaslighting you about your own config. also short circuits if you run hackfetch -setup when youre already set up. people said they wanted a gay flag color was already there under the name pride but that wasnt obvious. gay is now an alias so both work. grab it: brew upgrade hackfetch or yay -S hackfetch-bin or curl / powershell installer if you don’t have it yet curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh again thank you to everyone who took the time to actually run it and tell me what was broken!
HACKFETCH BATTLES??? two features in one release. hackfetch already knows a scary amount about you (thanks hackatime) so why not turn that into more features. hackfetch vs @ someone head to head compare. give it a hackatime username and hackfetch fetches both your histories in parallel, buckets them into today / this week / all time / streak, and prints them side by side with a winner arrow on every row. accepts @name , name , or a full profile url like hackatime.hackclub.com/@name . also works positional: hackfetch vs @you . use it to settle arguments, motivate yourself, or realize your friend has coded 265 hours and you should probably close discord. hackfetch -records personal bests. computed entirely from data hackfetch already fetches (streak + sparkline already use it), so zero new api calls $ hackfetch -records ✦ personal records @you biggest day 12h 41m on 2026-07-18 longest streak 25 days ended 2026-07-01 longest session 43m on 2026-07-17 days coded 86 first day 2026-04-24 99 days ago lifetime 208h 29m the “longest streak” tracks your all time best not just your current one. and “first day” tells you how long ago you started so you can feel old. grab it brew upgrade hackfetch yay -S hackfetch-bin install curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh Next devlog is gonna be a fun one, I have an idea cooking up
Hackfetdch natively in your readme hackfetch -readme it spits out a markdown stats card ready to paste straight into your github profile README. pipe it into a file and commit: hackfetch -readme > stats.md this is the cool bit or drop it in your README.md between two html comments and set up a github action to run it on a schedule so it auto refreshes every day. your profile now has a live coding stats card next to your pinned repos with no cron server, no vercel deploy, no api key stashed in secrets. its literally just markdown. zero extra api calls too. the readme card reads from the same cached hackatime response the normal fetch uses so if you just ran hackfetch it takes ~20ms. the streak emoji is a lil detail i had fun with. 3+ days gets a 🔥 upgrade with brew upgrade hackfetch or yay -S hackfetch-bin (once aur maintenance wraps up) or curl the installer curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh
Ships:
Every fetch tool tells you your OS. Mine tells you your streak. hackfetch is a Hack Club themed terminal fetch tool. Inspired by neofetch (originally bash, now archived) and fastfetch (its C successor), written in pure Go. Instead of just showing your kernel and CPU, it pulls live stats from your Hackatime account: today’s hours, weekly total, current streak, top project, top language. Right in your terminal. Six Hack Club themed ASCII logos (including my GOAT orpheus). Fourteen color schemes (pride, trans, bi, pan included). Live watch mode that refreshes while you code. And as of today, you can export the whole thing as a PNG, JPG, or SVG card and post it anywhere. One line to install: Linux / Mac: curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh Windows: irm https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.ps1 | iex Tell me how it was! Follow and like for updates.
HACKFETCH V2.0 it’s been a few weeks since ship #1 and hackfetch is a completely different tool now. faster, smaller, quieter, actually correct, and now lives in places besides your terminal window. v2.0.0 is out. what changed: fits in your tmux status bar with one line of config. same story for lualine. hackfetch -status prints a compact one-liner meant to be shelled out to every minute. fits everywhere else too. now on the AUR (yay -S hackfetch-bin) alongside the existing brew tap, curl installer, powershell installer, and go install. seven install channels total. runs in ~20ms on repeat calls thanks to an on-disk cache. tmux polling every minute is basically free now. was ~700ms cold before. runs in ~0.7s cold thanks to a parallel API fetch. was ~1.7s before. shows a smooth truecolor gradient on any modern terminal. auto-detects $COLORTERM. falls back to 256-color on older ones. -doctor walks a colored checklist of your setup and tells you exactly what’s broken. green if fine, orange if not, non-zero exit if you wanna script it. new pizza logo because hack club runs on pizza. seven logos total. streak is finally correct after silently saying “1 day” for a month. /summaries is gone from hackatime so hackfetch now reconstructs streak from every coding session in your history via /heartbeats/spans. real streak: 9 days for me right now. 7-day sparkline baked into the fetch (with -v) and available as -status –sparkline for the tmux bar. default fetch got leaner. slack handle, machines count, and the sparkline moved behind -v so the normal fetch stays focused on hours + project + language. loading spinner on the api fetch so you know something is happening. and then the cache made it show up almost never. one install: Linux / Mac: curl -fsSL https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.sh | sh Windows: irm https://raw.githubusercontent.com/xerneas3318/hackfetch/main/install.ps1 | iex Arch family: yay -S hackfetch-bin macOS / Linuxbrew: brew install xerneas3318/tap/hackfetch For more install methods check out the github page: https://github.com/xerneas3318/hackfetch teasing the next big thing: hackfetch -leaderboard is coming next, using the public leaderboard endpoints i found in hackatime’s routes file. compete with friends on daily and weekly hours right from your terminal. private friend groups on a hackclub nest box after that. if you try it, thanks. send me some feedback...
|
1792878603.0227313
|
1793742603.0227313
|
|
22325
|
NaOs by @Phonemi | Stardance
|
Phonemi
|
3
|
116.0
|
1730
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T20:49:35Z", "hours": 80.0, "multiplier": 19.49, "payout": 1568, "blessing": "neutral", "text": "NaOS [+_+] NaOS is short for Not an Operating System (it’s cool because Naos is also one of the hottest and most luminous stars you can see with the naked eye) in my project i tried to make the WebOS feel like a normal os that you can daily drive, that’s why there is no fancy feature that just advertises my os (makes no sense if you want something usable) all the features of my os: a bar (clock, launcher, applications, shutdown menu, sound and workspaces) sound effects (some of them are self recorded) a calendar (next to it is the notification overview) notifications app launcher (you can also change settings from the launcher, you have to type > for that) – widgets (you can code infinite ones, but if you don’t there are 2): todo widget (a todo list, you can add counters for things like hours of sleep or drink water, or normal check marks) clock (just a normal clock) – applications (also infinite if you code, but if not there are 12): terminal (34 commands, its own filesystem, nano for editing) files (to browse the virtual filesystem) code (text editor, saves to the filesystem or downloads, you can also compile your code (like 30 programming languages) and interpret it too, clone from github, and if you name a file .window or .widget it becomes an application or a widget (they are html files)) browser (web search, image search, page proxy, downloads into the filesystem. info: youtube is not working, the rest should be fine. you can use google (or bing if you want, but nobody wants to use bing anyway)) paint (draw on a canvas, save into the filesystem or download) viewer (look at wallpapers and anything you drew or downloaded, set any as background) monitor (btop style, real load and fps graphs, memory, filesystem stats, open windows) calculator (just a calculator) snake (it’s snake, not much) settings (change your config, kinda useless because you can do all of it better in my config files) config files pets (easter egg + new AI, you can click to pet them, they won’t leave the white glow) – the stuff that makes it feel like a real wm: 3 window manager layouts: normal (floating windows you drag and resize), hyprland (dwindle tiling, every new window splits the focused one) and niri (scrollable columns) — switch in settings, the terminal or with a keybind 4 workspaces you can switch between and throw windows across, plus an overview windows snap to the edges and you can open multiple instances of the same app a lock screen boot and shutdown animations break reminders (look away from the screen) and drink reminders keybinds dark and light mode self drawn icons very clean closing, hiding and fullscreen animations and it does not run on vercel, it runs on my school’s kubernetes cluster hope you like it [-_-]", "repo": "https://github.com/Phonokles/NaOS", "demo": "https://buyers-russia-investigation-expires.trycloudflare.com/"}, {"ship_num": 2, "ts": "2026-07-17T21:37:17Z", "hours": 16.0, "multiplier": 10.17, "payout": 162, "blessing": "neutral", "text": "This WebOS was made to improve real life. It’s really comfortable and has cool colors, fonts, etc. It has apps: calc, folders, code, terminal, snake, todo, and settings - all resizable and movable. There are pets on your bar. There are WMs (Window Managers), fully movable and resizable widgets (clock and todo), workspaces, and overviews (the overview depends on the WM). There’s a top bar with shutdown, a calendar, and the workspaces. Popups remind you to drink. New features for WebOS2, missions are: the WMs the movable and resizable widgets (including the clock widget) desktop overview (2 different variants) a RAM file system new terminal commands Snake game popups (the drink one)", "repo": "https://github.com/Phonokles/NaOS", "demo": "https://buyers-russia-investigation-expires.trycloudflare.com/"}, {"ship_num": 3, "ts": "2026-07-01T13:30:16Z", "hours": 20.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Get a life WebOS: It’s a web OS which runs smooth and clean its made to make your life a better one (but that’s contradictory, because you’re a loser(Programmer)) but there is a widget which helps you to do your daily to do’s there is a calc(calc is slang for calculator btw), a calendar, terminal and a settings app. You can click on the icons on the Taskbar to open the applications. On the top bar there is a clock and the date if you click on them a calendar pops up which is not draggable same if you press on the power button there is a pop up which allows you to lock, reboot and shutdown the OS On the bar there are animals but don’t put more than 4 on it or something terrible is going to happen. There is an Akita, a Panda and a Fox which only move on the taskbar which follows your cursor. On the top right you can find numbers. They indicate the workspace you’re currently on and if you press on a other number which is not marked, you switch to the workspace. Hope you all like it!", "repo": "https://github.com/Phonokles/NaOS", "demo": "https://buyers-russia-investigation-expires.trycloudflare.com/"}]...
|
[{"post_id": 43505, "ts": "202 [{"post_id": 43505, "ts": "2026-08-08T20:29:14Z", "hours": 8.4136, "text": "last devblog[+_+] so this is the last devblog on the project and here are my last changes I rebranded from get a life WebOS to Na-Os(it is the brightest star in the northern hemisphere) and it is Not an Os i fixed a lot of bugs espacialy when it comes to compiling and searching images it now runs on my schools kubernetes cluster instead of vercel because i used all my vercel limits and i will put a custom sub domain on it tomorow to and it uses a cloud flare tunnel so it was a fun journee never thought that i am gona work over a 100h on this project but yea and i think i did a great job at trying to make it work just like a normal os hope you like it and if you like the project my other ones are cool to so take a look at those[-_-]"}, {"post_id": 41852, "ts": "2026-08-06T10:12:56Z", "hours": 8.2286, "text": "infinite apps backgrounds and widgets[+_+] so i made if you name a html file .window i will pop up as a window and work as a app and also get displayed in the search and if you name a html file .widget it becoes a fully functionale widget also displayed in the settings you can also download images now through the browser so there is a image option and you can download images there and also you can now download files generaly though the browser and you can now clone project from github and also commit through my webos hope you like it[-_-]"}, {"post_id": 39408, "ts": "2026-08-02T11:03:39Z", "hours": 8.1969, "text": "extreme ui changes[+_+] new launcher look aplications reworked: (code, files, paint, browser) icons now work great because i converted them to pngs you can change bar position (no fox and widget bugs) you can change bar and window transparincy new top window design a bit cleaner and a new settings menu plus settings icon browser and todo ando overview bug fixes and redisign hope you like it[-_-]"}, {"post_id": 39109, "ts": "2026-08-01T20:21:45Z", "hours": 5.2419, "text": "the interpreter is working yay[+_+] so this interpreter finaly works front end and you can now execute most py programms i will need to do some things to help you to execute all programm but for that i ned to host this project on a local server so i will do that in the future but not now hope you like it[-_-]"}, {"post_id": 38698, "ts": "2026-08-01T06:53:16Z", "hours": 9.0414, "text": "so i added a compiler to my webos[+_+] in my webos your are now able to execute any file tha you created in the code editor or the ones who sit on your virtual file system they perfectly run in the terminal without any problems to execute them just press the run button or execute the comand it was a bit complicated but a lot of fun hope you like it[-_-]"}, {"post_id": 37671, "ts": "2026-07-30T15:52:02Z", "hours": 2.265, "text": "you can now execute html files in the browser that was pretty easy so you can create a html file with your folder app or with the code app and execute it. it works great and without any problems hope you like it[-_-]"}, {"post_id": 37592, "ts": "2026-07-30T12:57:00Z", "hours": 4.3206, "text": "i think the browser is finished[+_+] the browser can now search the web its not the best search but i am happy with it you can open most websites youtube doas not work but if you have a playing tab so a vid which is not directly in youtube it works some other websites block you to but most of them work (i am so happy i am finished with that shit i had so many burnouts) hope you like it[-_-]"}, {"post_id": 37369, "ts": "2026-07-30T01:14:43Z", "hours": 4.5939, "text": "Browser is kinda working you can now open most websites unfotunatly not youtube or search engins like bing or duck duck they block you because vercel is a data center i am working on the fix for that but its working great and is preaty cool sry if my code is not the best and also my time (i didnt sleep for 2 days to code) so i will tr to if x it in this night and then rest a bit hope you like it"}, {"post_id": 36870, "ts": "2026-07-29T06:53:16Z", "hours": 6.7442, "text": "i added a Browser(but its shitti like most online browsers)[+_+] i added a browser with wiki search and you can open wikipedia articles unfortunatly nothing else i am workin on that right now i needed a bit longer because i worked through the night and was realy tiered hope you like it[-_-]"}, {"post_id": 36642, "ts": "2026-07-28T21:10:39Z", "hours": 4.7825, "text": "i added icons and sound effects and a new animal bot with new fetures[+_+] so there are icons right now they are a bit buggy but i will fix that there are sound effects which are realy bad but hope thats ok and a sound settings menu and a slider the animals dont overlap that often animore and you can pet them and in the end i fixed the ram bug in the drawing app earlyer when you risized your window it wouldonly load evrthing you see in the ram but thats fixed now hope you like it[-_-]"}, {"post_id": 35993, "ts": "2026-07-27T19:55:23Z", "hours": 3.6594, "text": "cool closing hiding and fullscreen animation [+_+] its hard to explain just watch the video hope you like it[-_-]"}, {"post_id": 35844, "ts": "2026-07-27T15:21:40Z", "hours": 5.9306, "text": "So now new changes are online (design rework)[+_+] the launcher looks acceptable now you can see it in a picture below the drawing app looks prety good now to and there is a galary took some insperations from procreate for the layout there is no top bar anymore i thought it was anoying to have 2 bars and it looks better know only 3 apps displayed and if you open a app it doas get displayed you can hover over them to see the windows i removed no fetures there is no welcome screen anymore and you boot directly but there is a welcome app which is prety clean i am working right now on better closing hiding and fulscreen animation, bug fixes, that you can pet pets, a browser where you can download pngs, executable programs and a rework for the pet death easter egg, and sound effects. hope you like it[-_-]"}, {"post_id": 35482, "ts": "2026-07-26T23:05:57Z", "hours": 9.0283, "text": "3 new apps key binds and launcher but all in beta[+_+] so i made 3 new apps paint: where you can paint in and save the image in the ram filesystem or localy but i am still woking on it imageviewer: shows all the image on your desktop and you can also put anything as your background now btop: a fake system where you can see what needs how much power etc mostly fake and random values i added keybinds so you can open up epplicaions per keybinds and do other cool stuff i also added a launcher but its realy ugly so i am working on a 3 redisign but everthing is a bit ugg thats why you cant try out the new fetures sry even though i hope you like it"}, {"post_id": 30090, "ts": "2026-07-17T12:04:52Z", "hours": 4.0786, "text": "i added a desktop overview and a snake game[+_+] i added a desktop overview diferent depending on your wm in hyprland and desktop you have the basic windows 11 overview i think or macos idk and if you chose niri you have the niri desktop overview wich expandes in 2 dimensions and there is a super dupper cool snake game which absulutly works totaly fine. idk know why but my ram file system broke like 1000 times so i fixed that to hope you like it[-_-]"}, {"post_id": 28967, "ts": "2026-07-15T16:16:02Z", "hours": 3.3625, "text": "I added window tiling Managers[+_+] so now there are window tiling manager there is the default (but that is boring)and there is hyprland and niri i dont want to describe them so just watch the video or google it hope u like it [-_-]"}, {"post_id": 28472, "ts": "2026-07-14T18:40:40Z", "hours": 5.9744, "text": "NEW WIDGET AND A FILE SYSTEM[+_+] i added a clock widget with also a liquid glass lok and a supper cool file system that work just like on a normal pc but only on ram you can also resize the widget hope you like it[-_-]"}, {"post_id": 27799, "ts": "2026-07-13T17:51:33Z", "hours": 0.5594, "text": "i changed the color theme a it it looks a lot better"}, {"post_id": 26092, "ts": "2026-07-10T17:56:26Z", "hours": 2.0528, "text": "i added a drink notifiation thee will be more in the future"}, {"post_id": 19471, "ts": "2026-06-30T20:03:23Z", "hours": 1.9661, "text": "I added a lot of things (I don’t know why, but Hackatime didn’t work properly, so it only shows 2 hours. I actually worked around 4–5 hours).There are now multiple pets, a to-do list, a terminal, a code editor, a calculator, and a to-do widget.I also added a little easter egg: if you put more than 4 animals in there, they’ll explode. (I’m still working on the crashout page after that, as well as voice acting and sound effects in general.)There are workspaces now too. Hope you like it!"}, {"post_id": 19171, "ts": "2026-06-30T13:00:15Z", "hours": 2.3544, "text": "I changed a few things, made the calendar a bit shorter, and also added a settings app where you can change background images and switch between light and dark mode. I also added a few new SVGs (grabbed online)."}, {"post_id": 17737, "ts": "2026-06-28T17:33:28Z", "hours": 3.3497, "text": "i added a button on the top bar where you can lock shutdown and reboot with cool animation(i am proud of the lock on sry for the bad quality my laptop is broken so i have to use the old Budget ubuntu laptop of my father)"}, {"post_id": 17488, "ts": "2026-06-28T09:15:18Z", "hours": 2.0619, "text": "now there is a top bar with time and a calendar. i will be focusing on more pets and some calender applications and widgets"}, {"post_id": 17191, "ts": "2026-06-27T22:01:38Z", "hours": 2.7978, "text": "This time i made a boot screen with a checklist of things loading, as well as the rough desktop, for which i added a wallpaper and the fox from the welcome page. That’s all for this devlog, hope you like it, see you next time!"}, {"post_id": 17008, "ts": "2026-06-27T16:34:05Z", "hours": 5.7586, "text": "For the welcome screen, I added a cute little fox and made a button about me, which I made a little bit cleaner since it was somewhat ugly before. I took the fox animations from the VS-Pets vscode extension, but I coded functions myself. For example I made it so that the fox starts moving on its own after 5 seconds of inactivity and it always stays on the green platform which follows the mouse cursor. It also always has a chance to start running and a chance to lie down. The next devlog will be about a boot screen and a desktop. Hope you guys like it!"}, {"post_id": 12080, "ts": "2026-06-19T18:30:34Z", "hours": 1.9469, "text": "i added a welcome screen"}]...
|
Title: NaOs by @Phonemi | Stardance
Devlogs:
i ad Title: NaOs by @Phonemi | Stardance
Devlogs:
i added a welcome screen
For the welcome screen, I added a cute little fox and made a button about me, which I made a little bit cleaner since it was somewhat ugly before. I took the fox animations from the VS-Pets vscode extension, but I coded functions myself. For example I made it so that the fox starts moving on its own after 5 seconds of inactivity and it always stays on the green platform which follows the mouse cursor. It also always has a chance to start running and a chance to lie down. The next devlog will be about a boot screen and a desktop. Hope you guys like it!
This time i made a boot screen with a checklist of things loading, as well as the rough desktop, for which i added a wallpaper and the fox from the welcome page. That’s all for this devlog, hope you like it, see you next time!
now there is a top bar with time and a calendar. i will be focusing on more pets and some calender applications and widgets
i added a button on the top bar where you can lock shutdown and reboot with cool animation(i am proud of the lock on sry for the bad quality my laptop is broken so i have to use the old Budget ubuntu laptop of my father)
I changed a few things, made the calendar a bit shorter, and also added a settings app where you can change background images and switch between light and dark mode. I also added a few new SVGs (grabbed online).
I added a lot of things (I don’t know why, but Hackatime didn’t work properly, so it only shows 2 hours. I actually worked around 4–5 hours).There are now multiple pets, a to-do list, a terminal, a code editor, a calculator, and a to-do widget.I also added a little easter egg: if you put more than 4 animals in there, they’ll explode. (I’m still working on the crashout page after that, as well as voice acting and sound effects in general.)There are workspaces now too. Hope you like it!
i added a drink notifiation thee will be more in the future
i changed the color theme a it it looks a lot better
NEW WIDGET AND A FILE SYSTEM[+_+] i added a clock widget with also a liquid glass lok and a supper cool file system that work just like on a normal pc but only on ram you can also resize the widget hope you like it[-_-]
I added window tiling Managers[+_+] so now there are window tiling manager there is the default (but that is boring)and there is hyprland and niri i dont want to describe them so just watch the video or google it hope u like it [-_-]
i added a desktop overview and a snake game[+_+] i added a desktop overview diferent depending on your wm in hyprland and desktop you have the basic windows 11 overview i think or macos idk and if you chose niri you have the niri desktop overview wich expandes in 2 dimensions and there is a super dupper cool snake game which absulutly works totaly fine. idk know why but my ram file system broke like 1000 times so i fixed that to hope you like it[-_-]
3 new apps key binds and launcher but all in beta[+_+] so i made 3 new apps paint: where you can paint in and save the image in the ram filesystem or localy but i am still woking on it imageviewer: shows all the image on your desktop and you can also put anything as your background now btop: a fake system where you can see what needs how much power etc mostly fake and random values i added keybinds so you can open up epplicaions per keybinds and do other cool stuff i also added a launcher but its realy ugly so i am working on a 3 redisign but everthing is a bit ugg thats why you cant try out the new fetures sry even though i hope you like it
So now new changes are online (design rework)[+_+] the launcher looks acceptable now you can see it in a picture below the drawing app looks prety good now to and there is a galary took some insperations from procreate for the layout there is no top bar anymore i thought it was anoying to have 2 bars and it looks better know only 3 apps displayed and if you open a app it doas get displayed you can hover over them to see the windows i removed no fetures there is no welcome screen anymore and you boot directly but there is a welcome app which is prety clean i am working right now on better closing hiding and fulscreen animation, bug fixes, that you can pet pets, a browser where you can download pngs, executable programs and a rework for the pet death easter egg, and sound effects. hope you like it[-_-]
cool closing hiding and fullscreen animation [+_+] its hard to explain just watch the video hope you like it[-_-]
i added icons and sound effects and a new animal bot with new fetures[+_+] so there are icons right now they are a bit buggy but i will fix that there are sound effects which are realy bad but hope thats ok and a sound settings menu and a slider the animals dont overlap that often animore and you can pet them and in the end i fixed the ram bug in the drawing app earlyer when you risized your window it wouldonly load evrthing you see in the ram but thats fixed now hope you like it[-_-]
i added a Browser(but its shitti like most online browsers)[+_+] i added a browser with wiki search and you can open wikipedia articles unfortunatly nothing else i am workin on that right now i needed a bit longer because i worked through the night and was realy tiered hope you like it[-_-]
Browser is kinda working you can now open most websites unfotunatly not youtube or search engins like bing or duck duck they block you because vercel is a data center i am working on the fix for that but its working great and is preaty cool sry if my code is not the best and also my time (i didnt sleep for 2 days to code) so i will tr to if x it in this night and then rest a bit hope you like it
i think the browser is finished[+_+] the browser can now search the web its not the best search but i am happy with it you can open most websites youtube doas not work but if you have a playing tab so a vid which is not directly in youtube it works some other websites block you to but most of them work (i am so happy i am finished with that shit i had so many burnouts) hope you like it[-_-]
you can now execute html files in the browser that was pretty easy so you can create a html file with your folder app or with the code app and execute it. it works great and without any problems hope you like it[-_-]
so i added a compiler to my webos[+_+] in my webos your are now able to execute any file tha you created in the code editor or the ones who sit on your virtual file system they perfectly run in the terminal without any problems to execute them just press the run button or execute the comand it was a bit complicated but a lot of fun hope you like it[-_-]
the interpreter is working yay[+_+] so this interpreter finaly works front end and you can now execute most py programms i will need to do some things to help you to execute all programm but for that i ned to host this project on a local server so i will do that in the future but not now hope you like it[-_-]
extreme ui changes[+_+] new launcher look aplications reworked: (code, files, paint, browser) icons now work great because i converted them to pngs you can change bar position (no fox and widget bugs) you can change bar and window transparincy new top window design a bit cleaner and a new settings menu plus settings icon browser and todo ando overview bug fixes and redisign hope you like it[-_-]
infinite apps backgrounds and widgets[+_+] so i made if you name a html file .window i will pop up as a window and work as a app and also get displayed in the search and if you name a html file .widget it becoes a fully functionale widget also displayed in the settings you can also download images now through the browser so there is a image option and you can download images there and also you can now download files generaly though the browser and you can now clone project from github and also commit through my webos hope you like it[-_-]
last devblog[+_+] so this is the last devblog on the project and here are my last changes I rebranded from get a life WebOS to Na-Os(it is the brightest star in the northern hemisphere) and it is Not an Os i fixed a lot of bugs espacialy when it comes to compiling and searching images it now runs on my schools kubernetes cluster instead of vercel because i used all my vercel limits and i will put a custom sub domain on it tomorow to and it uses a cloud flare tunnel so it was a fun journee never thought that i am gona work over a 100h on this project but yea and i think i did a great job at trying to make it work just like a normal os hope you like it and if you like the project my other ones are cool to so take a look at those[-_-]
Ships:
Get a life WebOS: It’s a web OS which runs smooth and clean its made to make your life a better one (but that’s contradictory, because you’re a loser(Programmer)) but there is a widget which helps you to do your daily to do’s there is a calc(calc is slang for calculator btw), a calendar, terminal and a settings app. You can click on the icons on the Taskbar to open the applications. On the top bar there is a clock and the date if you click on them a calendar pops up which is not draggable same if you press on the power button there is a pop up which allows you to lock, reboot and shutdown the OS On the bar there are animals but don’t put more than 4 on it or something terrible is going to happen. There is an Akita, a Panda and a Fox which only move on the taskbar which follows your cursor. On the top right you can find numbers. They indicate the workspace you’re currently on and if you press on a other number which is not marked, you switch to the workspace. Hope you all like it!
This WebOS was made to improve real life. It’s really comfortable and has cool colors, fonts, etc. It has apps: calc, folders, code, terminal, snake, todo, and settings - all resizable and movable. There are pets on your bar. There are WMs (Window Managers), fully movable and resizable widgets (clock and todo), workspaces, and overviews (the overview depends on the WM). There’s a top bar with shutdown, a calendar, and the workspaces. Popups remind you to drink. New features for WebOS2, missions are: the WMs the movable and resizable widgets (including the clock widget) desktop overview (2 different variants) a RAM file system new terminal commands Snake game popups (the drink one)
NaOS [+_+] NaOS is short for Not an Operating System (it’s cool because Naos is also one of the hottest and most luminous stars you can see with the naked eye) in my project i tried to make the WebOS feel like a normal os that you can daily drive, that’s why there is no fancy feature that just advertises my os (makes no sense if you want something usable) all the features of my os: a bar (clock, launcher, applications, shutdown menu, sound and workspaces) sound effects (some of them are self recorded) a calendar (next to it is the notification overview) notifications app launcher (you can also change settings from the launcher, you have to type > for that) – widgets (you can code infinite ones, but if you don’t there are 2): todo widget (a todo list, you can add counters for things like hours of sleep or drink water, or normal check marks) clock (just a normal clock) – applications (also infinite if you code, but if not there are 12): terminal (34 commands, its own filesystem, nano for editing) files (to browse the virtual filesystem) code (text editor, saves to the filesystem or downloads, you can also compile your code (like 30 programming languages) and interpret it too, clone from github, and if you name a file .window or .widget it becomes an application or a widget (they are html files)) browser (web search, image search, page proxy, downloads into the filesystem. info: youtube is not working, the rest should be fine. you can use google (or bing if you want, but nobody wants to use bing anyway)) paint (draw on a canvas, save into the filesystem or download) viewer (look at wallpapers and anything you drew or downloaded, set any as background) monitor (btop style, real load and fps graphs, memory, filesystem stats, open windows) calculator (just a calculator) snake (it’s snake, not much) settings (change your config, kinda useless because you can do all of it better in my config files) config files pets (easter egg + new AI, you can click to pet them, they won’t leave the white glow) – the stuff that makes it feel like a real wm: 3 window manager layouts: normal (floating windows you drag and resize), hyprland (dwindle tiling, every new window splits the focused one) and niri (scrollable columns) — switch in settings, the terminal or with a keybind 4 workspaces you can switch between and throw windows across, plus an overview windows snap to the edges and you can open multiple instances of the same app a lock screen boot and shutdown animations break reminders (look away from the screen) and drink reminders keybinds dark and light mode self drawn icons very clean closing, hiding and fullscreen animations and it does not run on vercel, it runs on my school’s kubernetes cluster hope you like it [-_-]...
|
1792878770.693346
|
1793742770.693346
|
|
4086
|
Boba Cats! by @grassyd | Stardance
|
grassyd
|
1
|
92.31
|
1697
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T20:09:37Z", "hours": 91.0, "multiplier": 19.1, "payout": 1697, "blessing": "neutral", "text": "Check out @Jewelia ’s version of the project here: https://stardance.hackclub.com/projects/1894 Boba Cats! is a 2D adventure platformer game about, well, boba and cats! It was made with @Jewelia and @kimeowsu ! The first world of the game is fully playable! Music and extra touches will be added in the future! You can play the game on the itch app for Windows, Mac, or Linux, or you can directly download the game for Windows! (This is a collaborative project! @Jewelia ’s project links to the same thing; it’s up to you if you want to rate hers or mine or both)", "repo": "https://github.com/grassybox/Boba-Cats", "demo": "https://grassinabox.itch.io/boba-cats"}]...
|
[{"post_id": 60021, "ts": "202 [{"post_id": 60021, "ts": "2026-09-02T03:46:55Z", "hours": 1.3117, "text": "Hello hello! Thank you so much for all the support and feedback on our game!! It really means a lot! And huge thank you Stardance team for the Super Star!!?! 🤯🤯🤯 I’m so grateful for this program, it’s been awesome 💖 Sorry it’s been a while since the last update… 😔 (though if you’ve never seen me before I guess you wouldn’t know lol…) We took quite a break now that we’re all starting school and are busy with other things too . However, we still hope to do one more ship with a more complete version of this world of the game! So what is next? 🎵 Music!! - This is probably the biggest thing we’ve been wanting to add, so music is in the works! We are also thinking of adding more sound effects and improving the sound design overall! 🎮 Gameplay improvements - We are working to tweak some things based on our ideas and the wonderful feedback we gotten! For example, some parts are kind of confusing to navigate at the moment 😅, so we hope to make it more clear! 🌐 Web version? - We’ve been wanting to make the game playable on the web! I’m not sure how possible this is since Godot 4 does not officially support exporting C# projects to web yet… but we’ll see what we can do! 👍 And whatever other miscellaneous additions we decide to add! Thanks for reading!! (p.s. I finally put a linux version of the demo on the game’s itch.io page sorry it took so long 😭)"}, {"post_id": 43760, "ts": "2026-08-09T05:39:46Z", "hours": 12.5853, "text": "Playtesting!! EDIT: the ship is shipping!! It is currently pending review!! It may take a few days to show up because I forgot you have to get it reviewed!! 😅😅😅🆒 _ @kimeowsu spent some time playtesting our game! She’s quite good at finding issues 😅 As per usual, the seabunny had a lot of issues >:/ …but they should be fixed now! _ Some of the stuff we fixed include: ⛸️ Player doesn’t slide away during a conversation anymore Seabunny no longer freezes the game ➡️⬅️ Seabunny no longer occasionally moves backwards Player is no longer able to collect the same coin over and over again 🖼️ Visual fixes (ex. one of the cats no longer has only half of a helmet) 🌟 And many more miscellaneous tweaks! I know I said that we would ship earlier… but I think this time we are actually going to ship in the next 24 hours… for real… probably… 🎉 🥳 🎈 🆒"}, {"post_id": 39755, "ts": "2026-08-02T22:31:52Z", "hours": 7.4647, "text": "Sound Effects!! 🔊 [Game update] Our game has sound effects now! @kimeowsu actually got sound effects from the website aidn.jp/dotvoice by daniwell ! The sound effects are quite minimal so it sounds quite empty for now… we will have original music eventually from a friend , but good things take time 😋 I also fixed some bugs (mostly ones I caused myself 😅) and added a quit button (as cool as Boba Cats! is, I don’t think anyone wants to play it forever and ever and ever) As @Jewelia said in her post, we are hoping to ship this week!! World 1 will be completely playable!! 🎉🥳🎊 In the future, we may have another ship just to include the music and any fixes and extra touches Thanks for reading!! :D"}, {"post_id": 36053, "ts": "2026-07-27T21:52:46Z", "hours": 4.7814, "text": "spinny item animation thing! [Game update] I made this animation that plays whenever you get an item! Some other small additions: 🦪 Pearls are new! They will be hidden in a couple places and will be able to be gifted to the townspeople in exchange for stories ✨ Added sparkles to the miniboss arena to better show where to go 🪸 Tube coral now teleport you back to the beginning of the room if you get hit 🗃️ Organized scene files into folders Since this project has gotten more attention recently, thank you for the support!!!! @Jewelia and I hope to have a ship ready soon…"}, {"post_id": 33180, "ts": "2026-07-22T21:04:15Z", "hours": 4.3947, "text": "You can go backwards now… ( !) [Game update] I added stuff like this conveniently left behind ladder so you can actually go back to the previous rooms after finishing the seabunny miniboss I finished the last cutscene in the area! @kimeowsu helped add some more decorative vines in some of the areas I made collectable coins! You can’t see your number of coins collected yet so you’re just gonna have to trust me they’re getting collected"}, {"post_id": 31927, "ts": "2026-07-20T18:37:03Z", "hours": 6.5889, "text": "Game Update #I didn’t count! I finished my secret room! (but you don’t get to see it here because it’s secret… 😼) Coded the plant shop with @Jewelia ! Finally finished the seabunny miniboss with some animation tweaks! Fixed an issue where pressing enter to finish a dialogue would restart the dialogue, trapping you in an infinite loop… 😵💫 Added the title screen + opening (created by @kimeowsu !)"}, {"post_id": 28421, "ts": "2026-07-14T17:35:17Z", "hours": 8.9475, "text": "Almost done with the seabunny miniboss!! but then I realized I had to fix the camera movement to stay still during the miniboss (actually @Jewelia ended up doing that because I couldn’t figure it out ), edit all of the seabunny animations because switching animations caused the seabunny to start floating , make the exit of the room higher so that the player can’t escape without actually finishing the miniboss , make the climbable vine sprite longer so the player can actually reach that exit when it’s time, fix issues in the player’s movement code (which have been there the whole time…😅), implement the quest system we made so that the game keeps track of when you’ve beaten the miniboss and when to play which cutscene, make the ending cutscene, make the world 1 end screen (which doesn’t work yet oops), uhhh But that didn’t take too long… So yeah we’re almost done with the seabunny miniboss! Anyway, I also added another short cutscene at the beginning of the game, began working on my secret room , and finally organized all of the game files into folders! (I also renamed my project folder… which created a new project in Hackatime… but I didn’t realize and thought I lost my hours and made it so that I could never get hours on Stardance ever again… but actually I just had to add the new Hackatime project to Stardance and I was just stupid and everything’s fine )"}, {"post_id": 26094, "ts": "2026-07-10T17:57:43Z", "hours": 7.7283, "text": "We’re continuing to tweak things and add the final additions to our game! Including: A room full of vines 🪴 A plant shop 🌷 A geyser shortcut that shoots the player up! 🌊 A gate that opens when you click on it 🖱️ And more!"}, {"post_id": 20415, "ts": "2026-07-02T00:36:24Z", "hours": 8.0689, "text": "I keep forgetting to post devlogs… We’ve been continuing to add more rooms, such as this long coral room. (Unfortunately, the tube coral sprites are a little broken right now and look like they are on the ceiling… ) Now there’s only 2 rooms left to add for world 1!! 🎉 🎉 We also worked on finishing up the sea bunny miniboss (still not working right now) and making cutscene animations like this one in the boba room ⬇️. They’re actually so silly and fun to make 😆 so you better watch the video (if you want to) As always, @kimeowsu made the art, and @Jewelia added plenty of new updates too!"}, {"post_id": 18476, "ts": "2026-06-29T17:15:26Z", "hours": 7.2158, "text": "Fish minigame ! 🐟 We created a minigame where you collect fish within a time limit to get coins! You have to be careful, though, because if you get too close, you can get hit by them. @Jewelia also started making a menu to show the controls and inventory. Additionally, we’re continuing to add new rooms and dialogue scenes!"}, {"post_id": 17352, "ts": "2026-06-28T03:07:24Z", "hours": 6.3483, "text": "New Rooms !! Sorry it’s been a while… @Jewelia , @kimeowsu , and I have been adding a lot of new rooms to the underwater section of the game, like this submarine workshop and this cave room! We also added screen transitions and a way to enter and exit buildings. Now, we are beginning to add in the dialogue! The first world of our game may be done very, very soon! (Maybe even soon enough for a free sticker? ) Until next time!"}, {"post_id": 12273, "ts": "2026-06-20T01:11:20Z", "hours": 5.1033, "text": "WORDS !! 🗣️ @Jewelia and I started making the dialogue system! The only issue is that the font is blurry. I thought I fixed it… but no… 😔 Maybe it will work better with a more pixelated font. 🤔 Actually I think half of the time I spent was just importing sprites 😅 @kimeowsu has been doing a ton of pixel art! 🔥🔥🔥We also added a big jellyfish! kimeowsu says it’s based on the Sea Nettle :0 Anyway sorry the video is so chaotic 👻😆"}, {"post_id": 10958, "ts": "2026-06-17T23:33:57Z", "hours": 3.5786, "text": "New Room!! 📦📦📦✨ @kimeowsu brought us some lovely art for this box room! There’s a big jellyfish at the top that hurts you if you go near… We also added a parallax effect, so the different layers of the background move at different speeds! (It’s most noticeable in the rocks at the top.) Don’t ask what the bomb does…"}, {"post_id": 6867, "ts": "2026-06-11T14:54:12Z", "hours": 1.5281, "text": "Flashlight system!! ✨ We added darkness and a flashlight system, which will be used in certain rooms of the game! (and the code for this worked first try?!? OK more like second try but still 🤯) Right now the flashlight can follow where your mouse pointer is! Also, @Jewelia did some magic and fixed the camera so it looks great now! 😄"}, {"post_id": 5969, "ts": "2026-06-10T00:25:20Z", "hours": 4.1497, "text": "WE HAVE ART!! 🥳 @kimeowsu helped make some amazing art for the game! Doesn’t it look great? Aside from that, @Jewelia and I added a health and hitbox system. She also added walls and floors. Now we need to adjust the camera because, well, the game isn’t fully on screen. 😅"}, {"post_id": 1621, "ts": "2026-06-03T19:12:23Z", "hours": 2.9072, "text": "I’m making an adventure game with an underwater area! 🌊🐟🦀🪸🐈🐳😄🆒😆👾‼️‼️Ok sorry for all the emojis 😔 Anyway I made a tube coral that pulls the player down when they swim above it! @Jewelia helped make it so that they turn on and off every two seconds using a timer! (Her hours are logged separately) It works now except for some reason the coral in the middle doesn’t want to cooperate!! It turns on at a different time then the others for some reason and doesn’t pull the player when it’s supposed to! IDK why this is happening they should all be the same Once we figure out how to fix that, the next step is to make it so that if you get pulled too close to the bottom, you take damage. and at some point add the art graphics!"}]...
|
Title: Boba Cats! by @grassyd | Stardance
Devlogs Title: Boba Cats! by @grassyd | Stardance
Devlogs:
I’m making an adventure game with an underwater area! 🌊🐟🦀🪸🐈🐳😄🆒😆👾‼️‼️Ok sorry for all the emojis 😔 Anyway I made a tube coral that pulls the player down when they swim above it! @Jewelia helped make it so that they turn on and off every two seconds using a timer! (Her hours are logged separately) It works now except for some reason the coral in the middle doesn’t want to cooperate!! It turns on at a different time then the others for some reason and doesn’t pull the player when it’s supposed to! IDK why this is happening they should all be the same Once we figure out how to fix that, the next step is to make it so that if you get pulled too close to the bottom, you take damage. and at some point add the art graphics!
WE HAVE ART!! 🥳 @kimeowsu helped make some amazing art for the game! Doesn’t it look great? Aside from that, @Jewelia and I added a health and hitbox system. She also added walls and floors. Now we need to adjust the camera because, well, the game isn’t fully on screen. 😅
Flashlight system!! ✨ We added darkness and a flashlight system, which will be used in certain rooms of the game! (and the code for this worked first try?!? OK more like second try but still 🤯) Right now the flashlight can follow where your mouse pointer is! Also, @Jewelia did some magic and fixed the camera so it looks great now! 😄
New Room!! 📦📦📦✨ @kimeowsu brought us some lovely art for this box room! There’s a big jellyfish at the top that hurts you if you go near… We also added a parallax effect, so the different layers of the background move at different speeds! (It’s most noticeable in the rocks at the top.) Don’t ask what the bomb does…
WORDS !! 🗣️ @Jewelia and I started making the dialogue system! The only issue is that the font is blurry. I thought I fixed it… but no… 😔 Maybe it will work better with a more pixelated font. 🤔 Actually I think half of the time I spent was just importing sprites 😅 @kimeowsu has been doing a ton of pixel art! 🔥🔥🔥We also added a big jellyfish! kimeowsu says it’s based on the Sea Nettle :0 Anyway sorry the video is so chaotic 👻😆
New Rooms !! Sorry it’s been a while… @Jewelia , @kimeowsu , and I have been adding a lot of new rooms to the underwater section of the game, like this submarine workshop and this cave room! We also added screen transitions and a way to enter and exit buildings. Now, we are beginning to add in the dialogue! The first world of our game may be done very, very soon! (Maybe even soon enough for a free sticker? ) Until next time!
Fish minigame ! 🐟 We created a minigame where you collect fish within a time limit to get coins! You have to be careful, though, because if you get too close, you can get hit by them. @Jewelia also started making a menu to show the controls and inventory. Additionally, we’re continuing to add new rooms and dialogue scenes!
I keep forgetting to post devlogs… We’ve been continuing to add more rooms, such as this long coral room. (Unfortunately, the tube coral sprites are a little broken right now and look like they are on the ceiling… ) Now there’s only 2 rooms left to add for world 1!! 🎉 🎉 We also worked on finishing up the sea bunny miniboss (still not working right now) and making cutscene animations like this one in the boba room ⬇️. They’re actually so silly and fun to make 😆 so you better watch the video (if you want to) As always, @kimeowsu made the art, and @Jewelia added plenty of new updates too!
We’re continuing to tweak things and add the final additions to our game! Including: A room full of vines 🪴 A plant shop 🌷 A geyser shortcut that shoots the player up! 🌊 A gate that opens when you click on it 🖱️ And more!
Almost done with the seabunny miniboss!! but then I realized I had to fix the camera movement to stay still during the miniboss (actually @Jewelia ended up doing that because I couldn’t figure it out ), edit all of the seabunny animations because switching animations caused the seabunny to start floating , make the exit of the room higher so that the player can’t escape without actually finishing the miniboss , make the climbable vine sprite longer so the player can actually reach that exit when it’s time, fix issues in the player’s movement code (which have been there the whole time…😅), implement the quest system we made so that the game keeps track of when you’ve beaten the miniboss and when to play which cutscene, make the ending cutscene, make the world 1 end screen (which doesn’t work yet oops), uhhh But that didn’t take too long… So yeah we’re almost done with the seabunny miniboss! Anyway, I also added another short cutscene at the beginning of the game, began working on my secret room , and finally organized all of the game files into folders! (I also renamed my project folder… which created a new project in Hackatime… but I didn’t realize and thought I lost my hours and made it so that I could never get hours on Stardance ever again… but actually I just had to add the new Hackatime project to Stardance and I was just stupid and everything’s fine )
Game Update #I didn’t count! I finished my secret room! (but you don’t get to see it here because it’s secret… 😼) Coded the plant shop with @Jewelia ! Finally finished the seabunny miniboss with some animation tweaks! Fixed an issue where pressing enter to finish a dialogue would restart the dialogue, trapping you in an infinite loop… 😵💫 Added the title screen + opening (created by @kimeowsu !)
You can go backwards now… ( !) [Game update] I added stuff like this conveniently left behind ladder so you can actually go back to the previous rooms after finishing the seabunny miniboss I finished the last cutscene in the area! @kimeowsu helped add some more decorative vines in some of the areas I made collectable coins! You can’t see your number of coins collected yet so you’re just gonna have to trust me they’re getting collected
spinny item animation thing! [Game update] I made this animation that plays whenever you get an item! Some other small additions: 🦪 Pearls are new! They will be hidden in a couple places and will be able to be gifted to the townspeople in exchange for stories ✨ Added sparkles to the miniboss arena to better show where to go 🪸 Tube coral now teleport you back to the beginning of the room if you get hit 🗃️ Organized scene files into folders Since this project has gotten more attention recently, thank you for the support!!!! @Jewelia and I hope to have a ship ready soon…
Sound Effects!! 🔊 [Game update] Our game has sound effects now! @kimeowsu actually got sound effects from the website aidn.jp/dotvoice by daniwell ! The sound effects are quite minimal so it sounds quite empty for now… we will have original music eventually from a friend , but good things take time 😋 I also fixed some bugs (mostly ones I caused myself 😅) and added a quit button (as cool as Boba Cats! is, I don’t think anyone wants to play it forever and ever and ever) As @Jewelia said in her post, we are hoping to ship this week!! World 1 will be completely playable!! 🎉🥳🎊 In the future, we may have another ship just to include the music and any fixes and extra touches Thanks for reading!! :D
Playtesting!! EDIT: the ship is shipping!! It is currently pending review!! It may take a few days to show up because I forgot you have to get it reviewed!! 😅😅😅🆒 _ @kimeowsu spent some time playtesting our game! She’s quite good at finding issues 😅 As per usual, the seabunny had a lot of issues >:/ …but they should be fixed now! _ Some of the stuff we fixed include: ⛸️ Player doesn’t slide away during a conversation anymore Seabunny no longer freezes the game ➡️⬅️ Seabunny no longer occasionally moves backwards Player is no longer able to collect the same coin over and over again 🖼️ Visual fixes (ex. one of the cats no longer has only half of a helmet) 🌟 And many more miscellaneous tweaks! I know I said that we would ship earlier… but I think this time we are actually going to ship in the next 24 hours… for real… probably… 🎉 🥳 🎈 🆒
Hello hello! Thank you so much for all the support and feedback on our game!! It really means a lot! And huge thank you Stardance team for the Super Star!!?! 🤯🤯🤯 I’m so grateful for this program, it’s been awesome 💖 Sorry it’s been a while since the last update… 😔 (though if you’ve never seen me before I guess you wouldn’t know lol…) We took quite a break now that we’re all starting school and are busy with other things too . However, we still hope to do one more ship with a more complete version of this world of the game! So what is next? 🎵 Music!! - This is probably the biggest thing we’ve been wanting to add, so music is in the works! We are also thinking of adding more sound effects and improving the sound design overall! 🎮 Gameplay improvements - We are working to tweak some things based on our ideas and the wonderful feedback we gotten! For example, some parts are kind of confusing to navigate at the moment 😅, so we hope to make it more clear! 🌐 Web version? - We’ve been wanting to make the game playable on the web! I’m not sure how possible this is since Godot 4 does not officially support exporting C# projects to web yet… but we’ll see what we can do! 👍 And whatever other miscellaneous additions we decide to add! Thanks for reading!! (p.s. I finally put a linux version of the demo on the game’s itch.io page sorry it took so long 😭)
Ships:
Check out @Jewelia ’s version of the project here: https://stardance.hackclub.com/projects/1894 Boba Cats! is a 2D adventure platformer game about, well, boba and cats! It was made with @Jewelia and @kimeowsu ! The first world of the game is fully playable! Music and extra touches will be added in the future! You can play the game on the itch app for Windows, Mac, or Linux, or you can directly download the game for Windows! (This is a collaborative project! @Jewelia ’s project links to the same thing; it’s up to you if you want to rate hers or mine or both)...
|
1792986437.1219916
|
1793072837.1219916
|
|
1029
|
Origin Engine by @aloyak | Stardance
|
aloyak
|
1
|
74.0
|
1696
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-29T14:54:41Z", "hours": 74.0, "multiplier": 19.01, "payout": 1696, "blessing": "neutral", "text": "I made a custom game engine from scratch! it has a fast opengl pixelart renderer, builtin physics, lighting, an entity-component system, a spatial audio system, terrain system, it can load and save scenes on the fly, supports many 3d asset extensions… Its what i used to create my other big project! (JSP) the engine is cross-platform and works right out of the box for linux, windows and web!! and also it comes with a lightweight level editor and ive also made a website for it Hope you like it!! made with <3 from @aloyak", "repo": "https://github.com/aloyak/origin", "demo": "https://origin.aloyak.dev/"}]...
|
[{"post_id": 57380, "ts": "202 [{"post_id": 57380, "ts": "2026-08-29T14:44:05Z", "hours": 5.4342, "text": "ORIGIN ENGINE version 0.19.3 First ship is coming up soon! Even tho ive been working on really exciting stuff, i really would like to focus on actually learning and having a deep enough understanding of vulkan and other stuff like the best engine’s architecture before actually logging and building something open and usable, thats why i feel this is a good place to finally ship this project as it is and maybe come back to it at some point Pre-ship checklist! I’ve updated the website! now you have a few new sections with new information like the game i build using this engine and other cool stuff! published a new version to the github releases page (0.19.3 i think), with the binaries for the demo game and the sandbox for both windows and linux! the web build is still there on the website but it is marked as legacy tho Its been super fun to work on this and ive learnt a lot but i really really really think i could make something so much better with all the knowledge i now have and with some serious research, this is pretty much what ive explained in most of all the previous devlogs (the last 2 or 3) I’ve been working on applying some of the stuff ive been working on to the engine, like the new renderer class its now pretty much ported nicely! ive also tested that everything worked cross platform and yay! the project is very ready to hold any new game or project you might wanna do with it, although i might wanna make a quick tutorial on how to work with the engine on a github repo cuz its not very intuitive Known issue I’ve been trying to add support to the engine for builtin shaders but ive realized that its a super deeper problem than what i was expecting, id honestly do something like making all the shaders be done with something like slang and then compile them to spirv without any glsl intermediary PD: the video you see is a demo scene you can find at assets/scenes/physics.scene if you wanna try it by yourself!!!"}, {"post_id": 54613, "ts": "2026-08-25T17:11:59Z", "hours": 10.0381, "text": "ORIGIN ENGINE I’ve finally managed to port enough of the original engine to setup an imgui layer to have this little built-in launcher! it currently only works when using opengl, but its completely supported by both the windowing backends (glfw & sdl3) Its hard to make videos like this on a steamdeck so please like lol. Other stuff I completely restructured the new engine architecture to be a layered system, the engine holds a stack of layers and updates them independently! each layer holds stuff like OnAttach OnLateUpdate OnEvent etc, which is a much better approach compared to what we had before! I created a completely new custom file system, as the sandbox and games use completely different files and base directories, you can now mount/dismount different “aliases” for each program, so you can find your assets easily with custom virtual paths like sandbox://settings.json or project://scenes/scene.json Literally ported the scene/entity system right from the previous version, but it is a lot smaller currently, because the previous one wasnt really good, we now can load scenes from a file but now those get added to a scene stack, which is a lot more efficient if you wanna load them again! Overall the project’s code quality is so much better too!! After these bases are set im gonna be focusing on getting a full render layer working with at least opengl, even tho the vulkan renderer is already setup… PD: Origin Zero is just the new “protoype” name i gave it, just like with when i started this project i called it Origin “Zeus” lmao"}, {"post_id": 53290, "ts": "2026-08-23T19:02:52Z", "hours": 9.1458, "text": "ORIGIN ENGINE I’m sorry in advance that these and probably the next few devlogs wont have very exiting things or new and awesome information but sometimes you gotta focus on boring structural stuff that its just not really fun… The new Project-Based System The engine is now very dependent on the sandbox editor, sort of like a symbiotic relationship between the sandbox and your code editor, because thats where you will not only handle your assets but also play the game. The previous version just had the sandbox to be a tiny map editor tool that not even i would use half of the time The project (also called environment) then would have its own “environment” literally where all your assets would be included, with very little naming restrictions, this would make working on the project super easy and itd be easy too to use git with it (maybe build a builtin git UI??? it could be cool) I’ve already built the base for it and I’ve already added support for ImGui only for the OpenGL backend, i was thinking of adding a different UI system but this one will do for now :))"}, {"post_id": 51278, "ts": "2026-08-20T20:19:45Z", "hours": 8.3647, "text": "ORIGIN ENGINE A NEW UPDATE! I’m building a huge update for the origin engine! it might even be considered a new engine all together. The same philosophy is still there but I’m re-writting and refactoring the base structure of the whole engine. For now this refactor is close source tho, ill publish it once its ready for ship! What we currently have: I have the structure already though: A new project-based system where all the shader compilation and asset handling is done for each project, this + a simple abstraction layer should allow the sandbox to be a hugely more important tool as you will be able to play your game right in the editor! Compile time switch between SDL3 or GLFW for windowing, input is not yet “ported” if you consider it that way What i wanna add but may be difficult Runtime api switching between OpenGL, Vulkan and DirectX3D 11. even tho for now i have a super basic abstraction layer and only opengl is even able to initialize so….. maybe too hard i hope i manage to do it tho , was thinking of doing a similar thing for switching between physics engines like bullet3, physicsX or Box3D, this is very much in the future of course Project export/ editor previews This is a major step and im learning a lot!! but its very difficult to handle new stuff like vulkan with other new c++ architectural stuff, hope it goes well"}, {"post_id": 50196, "ts": "2026-08-19T10:21:29Z", "hours": 7.615, "text": "ORIGIN ENGINE Another update to the best game engine there is that starts with the letter “O” (i think). Today’s devlog is small, bust most likely will be start of a new series of very much needed updates to the engine!. It’s important to note that most of the things ive been working on are not yet finished :(( New stuff! New things that are completely finished: Fix the sandbox UI, it was missing imgui flags from previous bug fixes i had to do because the docking branch of imgui was broken, they fixed it so i just rolled back! Cleaned up the rendering class, specially important for the new updates im working on, because im gonna need to do a hell lot of abstraction! Things im working on Im taking the current base of the engine to make a new “modular” system just for the love of the game, the most basic thing ive done is to allow the user to choose between SDL3 or GLFW for windowing, although input is currently only handled with SDL3 regardless…. There’s a lot of exiting stuff coming SOON^(TM), hope you like them!! (vulkan?, probably not lmfao) PD: yes! this is the origin engine running nicely in a steamdeck!!!"}, {"post_id": 41213, "ts": "2026-08-05T09:19:15Z", "hours": 6.7264, "text": "ORIGIN ENGINE Yippi another round of improvements to the best and certainty not over engineered game engine out there! Out of all the things ive been working on with the engine ive only really finished one, but it was rather a big change tho NEW input system I’ve added a new action-based input system that handles by itself connected devices (because we now support gamepads!!! ), input modes and preferences, keybinds and settings all in one simple system The new system instead of reading “raw” input from SDL3 now instead has a wrapper that sets all input to “actions”. All actions have assigned a certain key/button/axis etc… It allows you to use keyboard/mouse and gamepad all at the same time Games can now have support for handheld devices like your steamdeck! Support for precompiled shaders (GLSL -> SPV) This is still work in progress!! The engine itself supports the compiled GLSL files very quickly but the problem is to get those shaders to compile in the first place The shader class gets the relative path for the shader, before actually compiling it, it checks if theres a file with the same name but that ends with “.spv”, in that case it uses that one Right now theres not an easy utility script that will handle compilation for you, that needs to be done next!! Dynamically Chunked Terrain Collisions Very early and of course WIP, I still haven’t done much but i have a pretty good idea of how this will work: You bake the local position of all the vertex of a terrain model and then, when you require it, you get all the triangles close to the player in real time (with a basic “chunked” system), then Bullet3 generates that mesh collider rather quickly as the mesh is not so big (this will probably require multi-threading ). More on this on the next devlog Other small changes Fixed the sandbox not having docking enabled Added ImPlot3D to project, might use it at some point PD: This picture is from my other project that you should check out! It showcases the new terrain system (WIP)"}, {"post_id": 33210, "ts": "2026-07-22T22:17:42Z", "hours": 8.1519, "text": "ORIGIN ENGINE I’ve been adding some quality of life changes that make working with this engine a lot easier, which means more abstraction in some cases which is not always the best but whatever. Ive also worked very hard on fixing and improving the physics (even considered porting it to now use Box3D instead of Bullet3, but that will probably happen in the far future, and Bullet3 will be kept as a fallback) What have i been working on i see you ask? Added the ParentEntityComponent , a very simple work around for the lack of parent-child entities on my engine, this will probably be deprecated sooner or later but its a decent solution instead of doing all the work all at once Added GetRefreshRate to window class, so for example, your game can set the target fps based on this Changes to physics system (Bullet3) Fixed a super hard to find bug where models vertex and physics-engine vertex would have shifter coords and would make the objects act weird on real time, this is such a huge change, it makes physics really good to play with, see the video!! Added functions to apply force, impulse and torque to a dynamic rigidbody Added the teleport function for kinematic rigidbodies Added getLinearVelocity and getAngularVelocity Added options to freeze rotation on independent axis HUGE: allow the engine to support different physics worlds to live in one same game in real time! this needs some work tho, not featured in the video PD: This is getting super nice but also growing in complexity, once i finish with my game i will surely start improving the overall structure and start thinking about more serious changes, maybe another graphics api????"}, {"post_id": 27690, "ts": "2026-07-13T14:02:40Z", "hours": 9.3322, "text": "ORIGIN ENGINE Yippie! another update to the engine powering my game, i’ve added quite a lot of things but also managed to clean up some dead code in the way. The most excinting new thing is probably the new postprocessing layer system! this is what ive added in the past 3 weeks: Postprocessing layer: you can now code different vertex & fragment shaders that drawn on top of the main buffer, you can stack as many as youd like in order to create many new cool effects spent hours trying to fix the sandbox editor’s rendering being completely broken, took about 3-4 days lol added new getters to camera like a directly inversed view matrix or setMat4() and setTexture() functions with shaders add localToWorld() and worldToLocal() to the transform class fixed specular lighting leaking to some dark areas fix handle untextured materials in model import added a built-in user settings save/load system based on json serialization refactor a part of the audio system to now have built-in fade ins/out, volume control and async background music The biggest change coming up would probably be to develop a dynamic rendering system that allows me to use different cameras rendering at the same time, as I’ll probably need it for JSP PD: this engine is being used for my current main project (almost 100 hours!), please check it out! JSP: https://stardance.hackclub.com/projects/14066"}, {"post_id": 11317, "ts": "2026-06-18T14:52:15Z", "hours": 9.5539, "text": "ORIGIN ENGINE This is my custom engine that im using for my other big project, the Janitor Space Program (go check it out!: https://stardance.hackclub.com/projects/14066 ), most of these changes come from having to create or update an engine feature so that the game im building is easier and faster to develop, and in the meantime im also upgrading this engine to something more powerful and mature, although i feel like im making it also a bit more complex or spaghetti, ill work on that later over this last 2 weeks ive added so many features like: improved logging library, allows you to use formatting directly support for embedded textures in .fbx models added a lookAt() method to the camera component fixed web support for the audio system added more features and functions to the in-house math library, like the cross and dot products, a 4x4 Matrix and other small stuff scenes now can be either “.json” or “.scene” sandbox: shortcut to align an entity to the sandbox scene view camera added color tint to the skybox component added quick line rendering for fast debugging, probably needs refactoring tho added LateLoop() , which obviously happens after Loop() and its mainly used for UI and stuff added setTargetFps() so that gpu doesnt work to 100% if vsync is disabled changed the builtin shaders path to assets/shaders/builtin wip: added imgui support to the web builds Most relevant new features: added instanced rendering! still sort of a WIP added real-time texture editing, allows the cpu to have ownership of a texture instead of the gpu and do whatever it wants with it, currently just paint it wip: huge refactoring of the render class to allow for different postprocessing layers to render on top of each other with custom shaders, this allows for any kind of postprocessing effect to be made without much issue, i managed to get a simple vignette shader working quickly! the render class still needs some cleanup tho This was fun but if they gave me an euro for every seg fault ive endured elon musk would be small next to me. i love to see how this small side project i started long ago is now something a lot bigger than i expected, this literally started as a learnopengl tutorial :))"}]...
|
Title: Origin Engine by @aloyak | Stardance
Devlo Title: Origin Engine by @aloyak | Stardance
Devlogs:
ORIGIN ENGINE This is my custom engine that im using for my other big project, the Janitor Space Program (go check it out!: https://stardance.hackclub.com/projects/14066 ), most of these changes come from having to create or update an engine feature so that the game im building is easier and faster to develop, and in the meantime im also upgrading this engine to something more powerful and mature, although i feel like im making it also a bit more complex or spaghetti, ill work on that later over this last 2 weeks ive added so many features like: improved logging library, allows you to use formatting directly support for embedded textures in .fbx models added a lookAt() method to the camera component fixed web support for the audio system added more features and functions to the in-house math library, like the cross and dot products, a 4x4 Matrix and other small stuff scenes now can be either “.json” or “.scene” sandbox: shortcut to align an entity to the sandbox scene view camera added color tint to the skybox component added quick line rendering for fast debugging, probably needs refactoring tho added LateLoop() , which obviously happens after Loop() and its mainly used for UI and stuff added setTargetFps() so that gpu doesnt work to 100% if vsync is disabled changed the builtin shaders path to assets/shaders/builtin wip: added imgui support to the web builds Most relevant new features: added instanced rendering! still sort of a WIP added real-time texture editing, allows the cpu to have ownership of a texture instead of the gpu and do whatever it wants with it, currently just paint it wip: huge refactoring of the render class to allow for different postprocessing layers to render on top of each other with custom shaders, this allows for any kind of postprocessing effect to be made without much issue, i managed to get a simple vignette shader working quickly! the render class still needs some cleanup tho This was fun but if they gave me an euro for every seg fault ive endured elon musk would be small next to me. i love to see how this small side project i started long ago is now something a lot bigger than i expected, this literally started as a learnopengl tutorial :))
ORIGIN ENGINE Yippie! another update to the engine powering my game, i’ve added quite a lot of things but also managed to clean up some dead code in the way. The most excinting new thing is probably the new postprocessing layer system! this is what ive added in the past 3 weeks: Postprocessing layer: you can now code different vertex & fragment shaders that drawn on top of the main buffer, you can stack as many as youd like in order to create many new cool effects spent hours trying to fix the sandbox editor’s rendering being completely broken, took about 3-4 days lol added new getters to camera like a directly inversed view matrix or setMat4() and setTexture() functions with shaders add localToWorld() and worldToLocal() to the transform class fixed specular lighting leaking to some dark areas fix handle untextured materials in model import added a built-in user settings save/load system based on json serialization refactor a part of the audio system to now have built-in fade ins/out, volume control and async background music The biggest change coming up would probably be to develop a dynamic rendering system that allows me to use different cameras rendering at the same time, as I’ll probably need it for JSP PD: this engine is being used for my current main project (almost 100 hours!), please check it out! JSP: https://stardance.hackclub.com/projects/14066
ORIGIN ENGINE I’ve been adding some quality of life changes that make working with this engine a lot easier, which means more abstraction in some cases which is not always the best but whatever. Ive also worked very hard on fixing and improving the physics (even considered porting it to now use Box3D instead of Bullet3, but that will probably happen in the far future, and Bullet3 will be kept as a fallback) What have i been working on i see you ask? Added the ParentEntityComponent , a very simple work around for the lack of parent-child entities on my engine, this will probably be deprecated sooner or later but its a decent solution instead of doing all the work all at once Added GetRefreshRate to window class, so for example, your game can set the target fps based on this Changes to physics system (Bullet3) Fixed a super hard to find bug where models vertex and physics-engine vertex would have shifter coords and would make the objects act weird on real time, this is such a huge change, it makes physics really good to play with, see the video!! Added functions to apply force, impulse and torque to a dynamic rigidbody Added the teleport function for kinematic rigidbodies Added getLinearVelocity and getAngularVelocity Added options to freeze rotation on independent axis HUGE: allow the engine to support different physics worlds to live in one same game in real time! this needs some work tho, not featured in the video PD: This is getting super nice but also growing in complexity, once i finish with my game i will surely start improving the overall structure and start thinking about more serious changes, maybe another graphics api????
ORIGIN ENGINE Yippi another round of improvements to the best and certainty not over engineered game engine out there! Out of all the things ive been working on with the engine ive only really finished one, but it was rather a big change tho NEW input system I’ve added a new action-based input system that handles by itself connected devices (because we now support gamepads!!! ), input modes and preferences, keybinds and settings all in one simple system The new system instead of reading “raw” input from SDL3 now instead has a wrapper that sets all input to “actions”. All actions have assigned a certain key/button/axis etc… It allows you to use keyboard/mouse and gamepad all at the same time Games can now have support for handheld devices like your steamdeck! Support for precompiled shaders (GLSL -> SPV) This is still work in progress!! The engine itself supports the compiled GLSL files very quickly but the problem is to get those shaders to compile in the first place The shader class gets the relative path for the shader, before actually compiling it, it checks if theres a file with the same name but that ends with “.spv”, in that case it uses that one Right now theres not an easy utility script that will handle compilation for you, that needs to be done next!! Dynamically Chunked Terrain Collisions Very early and of course WIP, I still haven’t done much but i have a pretty good idea of how this will work: You bake the local position of all the vertex of a terrain model and then, when you require it, you get all the triangles close to the player in real time (with a basic “chunked” system), then Bullet3 generates that mesh collider rather quickly as the mesh is not so big (this will probably require multi-threading ). More on this on the next devlog Other small changes Fixed the sandbox not having docking enabled Added ImPlot3D to project, might use it at some point PD: This picture is from my other project that you should check out! It showcases the new terrain system (WIP)
ORIGIN ENGINE Another update to the best game engine there is that starts with the letter “O” (i think). Today’s devlog is small, bust most likely will be start of a new series of very much needed updates to the engine!. It’s important to note that most of the things ive been working on are not yet finished :(( New stuff! New things that are completely finished: Fix the sandbox UI, it was missing imgui flags from previous bug fixes i had to do because the docking branch of imgui was broken, they fixed it so i just rolled back! Cleaned up the rendering class, specially important for the new updates im working on, because im gonna need to do a hell lot of abstraction! Things im working on Im taking the current base of the engine to make a new “modular” system just for the love of the game, the most basic thing ive done is to allow the user to choose between SDL3 or GLFW for windowing, although input is currently only handled with SDL3 regardless…. There’s a lot of exiting stuff coming SOON^(TM), hope you like them!! (vulkan?, probably not lmfao) PD: yes! this is the origin engine running nicely in a steamdeck!!!
ORIGIN ENGINE A NEW UPDATE! I’m building a huge update for the origin engine! it might even be considered a new engine all together. The same philosophy is still there but I’m re-writting and refactoring the base structure of the whole engine. For now this refactor is close source tho, ill publish it once its ready for ship! What we currently have: I have the structure already though: A new project-based system where all the shader compilation and asset handling is done for each project, this + a simple abstraction layer should allow the sandbox to be a hugely more important tool as you will be able to play your game right in the editor! Compile time switch between SDL3 or GLFW for windowing, input is not yet “ported” if you consider it that way What i wanna add but may be difficult Runtime api switching between OpenGL, Vulkan and DirectX3D 11. even tho for now i have a super basic abstraction layer and only opengl is even able to initialize so….. maybe too hard i hope i manage to do it tho , was thinking of doing a similar thing for switching between physics engines like bullet3, physicsX or Box3D, this is very much in the future of course Project export/ editor previews This is a major step and im learning a lot!! but its very difficult to handle new stuff like vulkan with other new c++ architectural stuff, hope it goes well
ORIGIN ENGINE I’m sorry in advance that these and probably the next few devlogs wont have very exiting things or new and awesome information but sometimes you gotta focus on boring structural stuff that its just not really fun… The new Project-Based System The engine is now very dependent on the sandbox editor, sort of like a symbiotic relationship between the sandbox and your code editor, because thats where you will not only handle your assets but also play the game. The previous version just had the sandbox to be a tiny map editor tool that not even i would use half of the time The project (also called environment) then would have its own “environment” literally where all your assets would be included, with very little naming restrictions, this would make working on the project super easy and itd be easy too to use git with it (maybe build a builtin git UI??? it could be cool) I’ve already built the base for it and I’ve already added support for ImGui only for the OpenGL backend, i was thinking of adding a different UI system but this one will do for now :))
ORIGIN ENGINE I’ve finally managed to port enough of the original engine to setup an imgui layer to have this little built-in launcher! it currently only works when using opengl, but its completely supported by both the windowing backends (glfw & sdl3) Its hard to make videos like this on a steamdeck so please like lol. Other stuff I completely restructured the new engine architecture to be a layered system, the engine holds a stack of layers and updates them independently! each layer holds stuff like OnAttach OnLateUpdate OnEvent etc, which is a much better approach compared to what we had before! I created a completely new custom file system, as the sandbox and games use completely different files and base directories, you can now mount/dismount different “aliases” for each program, so you can find your assets easily with custom virtual paths like sandbox://settings.json or project://scenes/scene.json Literally ported the scene/entity system right from the previous version, but it is a lot smaller currently, because the previous one wasnt really good, we now can load scenes from a file but now those get added to a scene stack, which is a lot more efficient if you wanna load them again! Overall the project’s code quality is so much better too!! After these bases are set im gonna be focusing on getting a full render layer working with at least opengl, even tho the vulkan renderer is already setup… PD: Origin Zero is just the new “protoype” name i gave it, just like with when i started this project i called it Origin “Zeus” lmao
ORIGIN ENGINE version 0.19.3 First ship is coming up soon! Even tho ive been working on really exciting stuff, i really would like to focus on actually learning and having a deep enough understanding of vulkan and other stuff like the best engine’s architecture before actually logging and building something open and usable, thats why i feel this is a good place to finally ship this project as it is and maybe come back to it at some point Pre-ship checklist! I’ve updated the website! now you have a few new sections with new information like the game i build using this engine and other cool stuff! published a new version to the github releases page (0.19.3 i think), with the binaries for the demo game and the sandbox for both windows and linux! the web build is still there on the website but it is marked as legacy tho Its been super fun to work on this and ive learnt a lot but i really really really think i could make something so much better with all the knowledge i now have and with some serious research, this is pretty much what ive explained in most of all the previous devlogs (the last 2 or 3) I’ve been working on applying some of the stuff ive been working on to the engine, like the new renderer class its now pretty much ported nicely! ive also tested that everything worked cross platform and yay! the project is very ready to hold any new game or project you might wanna do with it, although i might wanna make a quick tutorial on how to work with the engine on a github repo cuz its not very intuitive Known issue I’ve been trying to add support to the engine for builtin shaders but ive realized that its a super deeper problem than what i was expecting, id honestly do something like making all the shaders be done with something like slang and then compile them to spirv without any glsl intermediary PD: the video you see is a demo scene you can find at assets/scenes/physics.scene if you wanna try it by yourself!!!
Ships:
I made a custom game engine from scratch! it has a fast opengl pixelart renderer, builtin physics, lighting, an entity-component system, a spatial audio system, terrain system, it can load and save scenes on the fly, supports many 3d asset extensions… Its what i used to create my other big project! (JSP) the engine is cross-platform and works right out of the box for linux, windows and web!! and also it comes with a lightweight level editor and ive also made a website for it Hope you like it!! made with <3 from @aloyak...
|
1792990527.5510185
|
1793076927.5510185
|
|
38932
|
trout by @nosrep | Stardance
|
nosrep
|
1
|
85.0
|
1696
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T06:51:47Z", "hours": 85.0, "multiplier": 16.67, "payout": 1696, "blessing": "neutral", "text": "welcome to trout v2! the goal of this period was to upgrade trout v1 to finally become the strongest chess engine written in haskell (it’s a cool title, ok). i believe it is done, and trout now beats the previous #1, barbarossa. writing a chess engine in haskell is hard and annoying and probably a not good use of my time, but i am stubborn and not very bright so here we are. writing a chess engine is also very annoying in general, involving thousands of hours of cpu time to test changes. everyone say thank you to my poor i7 10700k together with the +300elo (!!!) strength improvement over v1, i also corrected the engine’s time management (no more timing out in chess GUIs) and cleaned up the web interface. to play the engine, you have three options: the demo link: this has the web interface for trout. it’s the original engine compiled down to WASM with a nice ui on top. lichess bot: you can find the lichess bot link at the bottom of the demo website, @TroutBot . it’s running on an oracle free tier server and can only play two games simultaneously; if challenging it hangs, it’s probably playing 2 already. locally: if you want troutbot at peak performance, you can download a chess GUI like En Croissant or Arena, and configure the trout binary (on github releases) in the GUI. trout speaks the standard UCI protocol.", "repo": "https://github.com/Osrepnay/trout", "demo": "https://osrepnay.github.io/trout-web"}]...
|
[{"post_id": 67147, "ts": "202 [{"post_id": 67147, "ts": "2026-09-13T06:34:52Z", "hours": 1.16, "text": "I did some more frontend work! i made the chessground rank/file responsive: for some reason, the default ones are positioned by pixel offsets and break pretty quickly on smaller screens. some light css max fixes this recolored everything: stock chessground theme is kinda lame made the time slider exponential: I wanted to give a larger time range (previous is 100ms-1000ms), but everything past 1s on the high end makes it really unwieldy to set the time on the low end, where people usually play. i made it exponential, i can expand the top end (3000ms now) without the slider feeling weird. it’s easier to show than explain"}, {"post_id": 65064, "ts": "2026-09-09T22:19:08Z", "hours": 4.8239, "text": "managed to update the website to the new version. It was much easier than I expected, considering the amount of changes I’ve made. new version is better (besides just being stronger) in that I factored the iterative deepening code out, which means the website can have sensible time settings now instead of the stupid “max time per depth” thing it had before. I also implemented IIR (internal iterative reductions). I’ve tried it like 10 times before, but this specific version worked for some reason. +28 elo! engine is now safely better than barbarossa."}, {"post_id": 64248, "ts": "2026-09-08T14:43:59Z", "hours": 0.6486, "text": "2.0 release has been tagged! i set up a dockerfile to make static linux binaries and created a windows github action to make the windows binaries. I also finished the test against the last version of the engine:"}, {"post_id": 63549, "ts": "2026-09-07T13:53:00Z", "hours": 4.9844, "text": "it is done….. i think trout is the strongest haskell engine now (i made the passed pawn bonus tunable per-rank, which added around 20 elo. re-tested some other search stuff but they all kinda sucked) i think i’m going to work on polishing the frontend now, tag a 2.0 release soon."}, {"post_id": 62696, "ts": "2026-09-06T05:49:18Z", "hours": 8.5936, "text": "i’ve been doing some tuner work, it’s not great the old tuner was pretty bad. very janky, repeated code, very hard to read, and sloooowwww…. i optimized it by precomputing the factors for each position so it’s just a bunch of multiplications to get the score. upside: order of magnitude speed improvement. downside: 20+ gb memory…. other problem is that the new tuner’s results are not great. they aren’t horribly bad like some other tests, but the gains aren’t as big as i was expecting. this might be a data quality issue? i might write proper datagen code at some point instead of just relying on the output of SPRT tests. I did get a nice 7 elo from removing floating point ops in eval, so that’s nice i guess. i can smell the goal already. Soon (i would attach a picture of the 20gb but i’m kinda running a sprt right now… maybe next time)"}, {"post_id": 60920, "ts": "2026-09-03T16:06:58Z", "hours": 9.0614, "text": "big gap! some stuff came up and i don’t fully remember what i’ve done since the last devlog. git log tells me i did some minor logic fixes and added SEE pruning in pvs (32 elo), which prunes nodes based on their static exchange evaluation. i do remember that the current version of the engine can beat barbarossa at LTC now. STC it still loses (i.e. my engine scales better… glass half full), but I am now working on eval tuning to hopefully bump the elo up some more. i am now working on this through ssh. negative: lag. positive: there is almost nothing running on my computer aside from the language server. should make testing easier and more predictable"}, {"post_id": 43577, "ts": "2026-08-08T22:09:51Z", "hours": 8.8139, "text": "i’m now within 100 elo of my target, but it’s still not looking great. it seems i have hit another wall. there’s this copypasta around chess programming circles with a rough order of search features to implement, and i’ve tried 3 in a row, none doing much. since last time, i’ve just added two things that have gained elo: history decay tweak (10 elo): after searching a position, decay history by 50% instead of 80%, helps retain memory from previous searches check extensions (23 elo): extend a search by 1 more move if in check. it’s very simple. i’ve since tried IIR (internal iterative reductions), SEE pruning in PVS (more moveloop pruning), and continuation history (like the history heuristic, but More™️). only continuation history has kinda done something, but only when comparing against a version that’s just as slow; when comparing against the original, it’s much closer because for some reason continuation history slows down the search by almost 10% (??????). The main slow-down-er seems to be indexing the continuation history array, which is absolutely baffling to me. i’ve even tried to start reading the GHC Core again, until i remembered why it was so painful last time."}, {"post_id": 41607, "ts": "2026-08-05T22:20:00Z", "hours": 8.6608, "text": "a lot of changes in this batch, but not all of them were for strength. here’s a quick runthrough of the elo-affecting changes: add improving heuristic to rfp (prune more nodes while improving) add staticEval >= beta guard to nmp (restrict the usage of null move pruning to moves that already seem good from static eval) futility pruning (very similar to reverse futility pruning - removes quiet moves when static eval is pretty far below alpha) tempo bonus (side to move gets a bonus to eval for having tempo) add quiescence search results to transposition table (i had this in the old version but i guess i forgot to port it over until now) soft time bounds in search (instead of searching for as long as possible and nuking the search thread mid-search, stop iterative deepening if it looks like the next node will take too long) to fix this, i moved the timing-out logic inside the search function, which is what most engines do. I didn’t do this earlier because 1. it’s marginally harder and 2. it would require making the search functions IO instead of ST. ST is escapable, so it’s more pure, so this was kinda a bummer to do, but i didn’t see any way to get around this. here’s a graph i made while i was looking at aspiration windows more. it shows the average centipawn change between successive depths of search. the current aspiration window implementation assumes that depth and avg cp change is inversely related, but it doesn’t look like this is true. (what is the hump doing??) I tried a couple of aspiration window implementations that don’t make this assumption but didn’t get anything huge. I’ll probably replace it at some point."}, {"post_id": 39895, "ts": "2026-08-03T05:39:33Z", "hours": 5.7494, "text": "the engine is finally in the strongest state it’s ever been! (i think) for those who have not been obsessively following this project, the search part of the engine has gone through two rewrites now. i kept hitting walls where i really shouldn’t have; improvements that should have been huge gains did a lot less than expected. i did the rewrites in an attempt to find a potential bug that would kill future attempts at improvements, but i never really found anything significant. i never really got the engine to it’s pre-rewrites strength until now. read it and weep (~17 elo gain) -------------------------------------------------- Results of trout-exe-max vs trout-exe-asp-tweak (8+0.08, NULL, 16.000000MB, UHO_Lichess_4852_v1.epd): Elo: -16.96 +/- 14.18, nElo: -22.54 +/- 18.80 LOS: 0.94 %, DrawRatio: 33.99 %, PairsRatio: 0.82 Games: 1312, Wins: 380, Losses: 444, Draws: 488, Points: 624.0 (47.56 %) Ptnml(0-2): [63, 175, 223, 153, 42], WL/DD Ratio: 1.79 LLR: -2.98 (-101.3%) (-2.94, 2.94) [0.00, 10.00] -------------------------------------------------- it’s still not super great because elo improvements are coming slooowww and we’re still only 17 elo up with many more features than before. it’s still nice, though. implemented since last devlog: “improving” heuristic (13 elo): a position is said to be “improving” if the static evaluation now is higher than the one from a move ago. we can use this to tweak some parameters in the search, like when to cut off for LMP, which is what i did. need more testing for the other features. lmr limit (16 elo): my LMR implementation was slightly bugged and would reduce too many moves; normally the first couple are spared, but i had every move except the first reduced. negative captures below quiet moves (13 elo): for some reason, i had captures that were deemed negative by SEE (bad captures, basically - trading a queen for a pawn would be one) sorted above all quiet moves. i moved them to the bottom of move sorting. redo aspiration windows (36 elo): i redid the implementation for aspiration windows slightly. it should be smarter about bounds now. that makes around 100 elo for aspiration windows cumulatively now, which is kinda crazy here’s a picture of htop when i was running the engines against each othe for elo testing. i thought it was kinda funny"}, {"post_id": 38604, "ts": "2026-08-01T02:40:06Z", "hours": 8.2208, "text": "oh no, 8 hours i need to devlog more holy moly from last devlog, i kinda found a solution to the fail-soft problem? Most engine’s LMR implementations will re-search twice if the previous search went over alpha (lower bound). The first search has reduced depth AND a null-window around alpha (search window of 1 centipawn; searches faster, but can only tell the direction of the true search result); if this is over alpha, it’ll re-search with full depth; if this is again over alpha, it’ll re-search with full depth and full bounds. My engine was skipping the middle step and jumping from reduced depth + null window -> full depth + full bounds. Apparently this is an accepted method and it was working fine compared to the other version, EXCEPT once I switched to fail-soft on beta. in other news, I added: aspiration windows (75 elo): the initial search is normally unbounded, but aspiration windows try to clamp the search around a “guess” based on the previous depth of iterative deepening, and widen if it fails high or low. it did almost nothing before, and randomly became really good. don’t ask me why. razoring (22 elo): prunes a node if quiescence search says it’s too far below alpha. I already had it in a previous version and brought it over to the search rewrite. pretty simple, smallish elo boost. late move pruning (39 elo): prunes the latter part of move list; moves are sorted by how good they’re predicted to be, so latter moves are usually pretty garbage fixes (23 elo): small logic changes to LMR and LMP. don’t know how they didn’t lose more elo, the LMR bug was kinda bad. separate PV tracking: the PV (principal variation, the best moves for each player as calculated by the engine) was previously tracked by the transposition table, but that meant i didn’t have a lot of flexibility with the replacement strategy for the table, lest it wipe an important PV entry. tracking it separately lets me fiddle with the replacement strategy more, although I haven’t actually found one better than what I have now here’s a graph generated from a google sheet with 100k rows (!?). it’s a histogram of every time a move was marked as “currently the best”, indexed by entry. ideally, it’d be all 0, meaning the best move was searched first every time, meaning there was basically no wasted effort."}, {"post_id": 37391, "ts": "2026-07-30T02:23:34Z", "hours": 6.5078, "text": "6.5 hours? oh man i was right, nmp only gained like 30 elo, gained much much more before. i tried to hunt down anything weird but i had to leave it at that. i also implemented pruning in quiescence search, so the engine only searches moves that have a positive static exchange evaluation (essentially, the result of all trades on a particular square). i also accidentally found out my engine was doing fail-hard on beta cutoffs instead of fail-soft! in a fail-soft framework, the search is allowed to return outside of the bounds set by the alpha and beta parameters (it’s hard to explain succinctly here and i don’t want to keep doing it, search up alpha-beta search if you’re interested). thus, alpha and beta are soft bounds. this means each search returns more information about the move score. i successfully did fail-soft on the alpha (lower bound) side, but not on the beta side due to what i can only assume is a coding mistake. the problem is, when switching to fail-soft on beta, the engine lost like 30 elo! i bisected the change to the LMR (late move reductions) patch, but still have no idea why LMR doesn’t play nice with fail-soft beta. i’m kinda at the end of my rope here, i might just have to eat the elo loss…"}, {"post_id": 36088, "ts": "2026-07-27T23:22:04Z", "hours": 5.5464, "text": "I finally got RFP to gain! but it might not be as good as it seems… ive been struggling to get rfp, a pretty basic improvement, to actually do anything, and redid everything search step-by-step to make sure i didn’t do anything wrong. so far, i’ve added back SEE move ordering, butterfly heuristic, PVS, transposition table move ordering, and RFP. however, i don’t think this actually fixes my problem; the code is largely the same aside from some parameter changes, so my theory is that rfp is only working now because i added everything back in a different order, and now i might struggle with adding back different features that aren’t gaining anymore. i’m currently testing null move pruning (based on the null move observation: doing something is basically always better than doing nothing), and it’s not doing as much as it used to… disturbing"}, {"post_id": 35484, "ts": "2026-07-26T23:08:41Z", "hours": 1.4153, "text": "ive nuked it…. i kept fighting rfp and talking with other people about this. apparently, rfp is one of the easiest gainers (something that gains elo/strength), and usually gains a lot, but again, nothing. i ran an overnight test of like 5000 games and the rfp version manages to LOSE 8 elo, where other people have gained 80. i’m gonna try to restart search again, but basically fully. i don’t know if this will actually do anything, but i don’t see many other choices…"}, {"post_id": 34984, "ts": "2026-07-26T03:58:38Z", "hours": 6.8525, "text": "i’ve reentered the nightmare when i last left off this project in ~september, I basically hit a wall with optimizations. I had a crapload of pruning and whatnot, but the elo of the engine didn’t really reflect it. I then did a search rewrite but got stuck on RFP (reverse futility pruning), which is supposed to gain a lot of strength but did basically nothing for me. brief (??) aside: reverse futility pruning, in simple terms, checks if the static evaluation (evaluation without searching moves) is above beta (if a move scores above beta, it’s “too good,” and the opponent won’t allow that position to happen in the first place) by some margin. if it is, it’ll return without searching any moves, because it’s not likely that the player can lose that much material/positional advantage in whatever depth is left to search. anyway, i’m still stuck on this. I’ve re-reimplemented half the search to recheck its correctness, because correctness issues can sometimes stuff new optimizations, but it seems to be all good. RFP still doesn’t do jack. i don’t really know where to go from here. I could just ignore it, but the fact that RFP doesn’t do anything (for reference, another engine dev i talked to got like 80 elo out of RFP, which is insane) is a troubling sign and might mean something else is wrong."}, {"post_id": 34363, "ts": "2026-07-25T00:30:18Z", "hours": 3.7367, "text": "hello! trout again. i’m gonna try to get this to #1 haskell engine, but it’s been such a pain… after summer of making I did some more work on this, but hit a wall where all my changes either did nothing or gained like 10elo (which is not enough for the hundreds i need). I tried rewriting part of search but hit a wall again with the same problem, on features that should have made improvements! i’ve been fighting with the search some more trying to get reverse futility pruning to do something meaningful. in someone else’s engine, it gained i think 80+ elo in total (!!!), which is bonkers compared to the 20 or something i get on a good day. it’s not a good day, so RFP actually manages to lose elo here. i might have to rewrite search again. i don’t know how much of this is just wrong. (here’s the commented out old search)"}]...
|
Title: trout by @nosrep | Stardance
Devlogs:
hell Title: trout by @nosrep | Stardance
Devlogs:
hello! trout again. i’m gonna try to get this to #1 haskell engine, but it’s been such a pain… after summer of making I did some more work on this, but hit a wall where all my changes either did nothing or gained like 10elo (which is not enough for the hundreds i need). I tried rewriting part of search but hit a wall again with the same problem, on features that should have made improvements! i’ve been fighting with the search some more trying to get reverse futility pruning to do something meaningful. in someone else’s engine, it gained i think 80+ elo in total (!!!), which is bonkers compared to the 20 or something i get on a good day. it’s not a good day, so RFP actually manages to lose elo here. i might have to rewrite search again. i don’t know how much of this is just wrong. (here’s the commented out old search)
i’ve reentered the nightmare when i last left off this project in ~september, I basically hit a wall with optimizations. I had a crapload of pruning and whatnot, but the elo of the engine didn’t really reflect it. I then did a search rewrite but got stuck on RFP (reverse futility pruning), which is supposed to gain a lot of strength but did basically nothing for me. brief (??) aside: reverse futility pruning, in simple terms, checks if the static evaluation (evaluation without searching moves) is above beta (if a move scores above beta, it’s “too good,” and the opponent won’t allow that position to happen in the first place) by some margin. if it is, it’ll return without searching any moves, because it’s not likely that the player can lose that much material/positional advantage in whatever depth is left to search. anyway, i’m still stuck on this. I’ve re-reimplemented half the search to recheck its correctness, because correctness issues can sometimes stuff new optimizations, but it seems to be all good. RFP still doesn’t do jack. i don’t really know where to go from here. I could just ignore it, but the fact that RFP doesn’t do anything (for reference, another engine dev i talked to got like 80 elo out of RFP, which is insane) is a troubling sign and might mean something else is wrong.
ive nuked it…. i kept fighting rfp and talking with other people about this. apparently, rfp is one of the easiest gainers (something that gains elo/strength), and usually gains a lot, but again, nothing. i ran an overnight test of like 5000 games and the rfp version manages to LOSE 8 elo, where other people have gained 80. i’m gonna try to restart search again, but basically fully. i don’t know if this will actually do anything, but i don’t see many other choices…
I finally got RFP to gain! but it might not be as good as it seems… ive been struggling to get rfp, a pretty basic improvement, to actually do anything, and redid everything search step-by-step to make sure i didn’t do anything wrong. so far, i’ve added back SEE move ordering, butterfly heuristic, PVS, transposition table move ordering, and RFP. however, i don’t think this actually fixes my problem; the code is largely the same aside from some parameter changes, so my theory is that rfp is only working now because i added everything back in a different order, and now i might struggle with adding back different features that aren’t gaining anymore. i’m currently testing null move pruning (based on the null move observation: doing something is basically always better than doing nothing), and it’s not doing as much as it used to… disturbing
6.5 hours? oh man i was right, nmp only gained like 30 elo, gained much much more before. i tried to hunt down anything weird but i had to leave it at that. i also implemented pruning in quiescence search, so the engine only searches moves that have a positive static exchange evaluation (essentially, the result of all trades on a particular square). i also accidentally found out my engine was doing fail-hard on beta cutoffs instead of fail-soft! in a fail-soft framework, the search is allowed to return outside of the bounds set by the alpha and beta parameters (it’s hard to explain succinctly here and i don’t want to keep doing it, search up alpha-beta search if you’re interested). thus, alpha and beta are soft bounds. this means each search returns more information about the move score. i successfully did fail-soft on the alpha (lower bound) side, but not on the beta side due to what i can only assume is a coding mistake. the problem is, when switching to fail-soft on beta, the engine lost like 30 elo! i bisected the change to the LMR (late move reductions) patch, but still have no idea why LMR doesn’t play nice with fail-soft beta. i’m kinda at the end of my rope here, i might just have to eat the elo loss…
oh no, 8 hours i need to devlog more holy moly from last devlog, i kinda found a solution to the fail-soft problem? Most engine’s LMR implementations will re-search twice if the previous search went over alpha (lower bound). The first search has reduced depth AND a null-window around alpha (search window of 1 centipawn; searches faster, but can only tell the direction of the true search result); if this is over alpha, it’ll re-search with full depth; if this is again over alpha, it’ll re-search with full depth and full bounds. My engine was skipping the middle step and jumping from reduced depth + null window -> full depth + full bounds. Apparently this is an accepted method and it was working fine compared to the other version, EXCEPT once I switched to fail-soft on beta. in other news, I added: aspiration windows (75 elo): the initial search is normally unbounded, but aspiration windows try to clamp the search around a “guess” based on the previous depth of iterative deepening, and widen if it fails high or low. it did almost nothing before, and randomly became really good. don’t ask me why. razoring (22 elo): prunes a node if quiescence search says it’s too far below alpha. I already had it in a previous version and brought it over to the search rewrite. pretty simple, smallish elo boost. late move pruning (39 elo): prunes the latter part of move list; moves are sorted by how good they’re predicted to be, so latter moves are usually pretty garbage fixes (23 elo): small logic changes to LMR and LMP. don’t know how they didn’t lose more elo, the LMR bug was kinda bad. separate PV tracking: the PV (principal variation, the best moves for each player as calculated by the engine) was previously tracked by the transposition table, but that meant i didn’t have a lot of flexibility with the replacement strategy for the table, lest it wipe an important PV entry. tracking it separately lets me fiddle with the replacement strategy more, although I haven’t actually found one better than what I have now here’s a graph generated from a google sheet with 100k rows (!?). it’s a histogram of every time a move was marked as “currently the best”, indexed by entry. ideally, it’d be all 0, meaning the best move was searched first every time, meaning there was basically no wasted effort.
the engine is finally in the strongest state it’s ever been! (i think) for those who have not been obsessively following this project, the search part of the engine has gone through two rewrites now. i kept hitting walls where i really shouldn’t have; improvements that should have been huge gains did a lot less than expected. i did the rewrites in an attempt to find a potential bug that would kill future attempts at improvements, but i never really found anything significant. i never really got the engine to it’s pre-rewrites strength until now. read it and weep (~17 elo gain) -------------------------------------------------- Results of trout-exe-max vs trout-exe-asp-tweak (8+0.08, NULL, 16.000000MB, UHO_Lichess_4852_v1.epd): Elo: -16.96 +/- 14.18, nElo: -22.54 +/- 18.80 LOS: 0.94 %, DrawRatio: 33.99 %, PairsRatio: 0.82 Games: 1312, Wins: 380, Losses: 444, Draws: 488, Points: 624.0 (47.56 %) Ptnml(0-2): [63, 175, 223, 153, 42], WL/DD Ratio: 1.79 LLR: -2.98 (-101.3%) (-2.94, 2.94) [0.00, 10.00] -------------------------------------------------- it’s still not super great because elo improvements are coming slooowww and we’re still only 17 elo up with many more features than before. it’s still nice, though. implemented since last devlog: “improving” heuristic (13 elo): a position is said to be “improving” if the static evaluation now is higher than the one from a move ago. we can use this to tweak some parameters in the search, like when to cut off for LMP, which is what i did. need more testing for the other features. lmr limit (16 elo): my LMR implementation was slightly bugged and would reduce too many moves; normally the first couple are spared, but i had every move except the first reduced. negative captures below quiet moves (13 elo): for some reason, i had captures that were deemed negative by SEE (bad captures, basically - trading a queen for a pawn would be one) sorted above all quiet moves. i moved them to the bottom of move sorting. redo aspiration windows (36 elo): i redid the implementation for aspiration windows slightly. it should be smarter about bounds now. that makes around 100 elo for aspiration windows cumulatively now, which is kinda crazy here’s a picture of htop when i was running the engines against each othe for elo testing. i thought it was kinda funny
a lot of changes in this batch, but not all of them were for strength. here’s a quick runthrough of the elo-affecting changes: add improving heuristic to rfp (prune more nodes while improving) add staticEval >= beta guard to nmp (restrict the usage of null move pruning to moves that already seem good from static eval) futility pruning (very similar to reverse futility pruning - removes quiet moves when static eval is pretty far below alpha) tempo bonus (side to move gets a bonus to eval for having tempo) add quiescence search results to transposition table (i had this in the old version but i guess i forgot to port it over until now) soft time bounds in search (instead of searching for as long as possible and nuking the search thread mid-search, stop iterative deepening if it looks like the next node will take too long) to fix this, i moved the timing-out logic inside the search function, which is what most engines do. I didn’t do this earlier because 1. it’s marginally harder and 2. it would require making the search functions IO instead of ST. ST is escapable, so it’s more pure, so this was kinda a bummer to do, but i didn’t see any way to get around this. here’s a graph i made while i was looking at aspiration windows more. it shows the average centipawn change between successive depths of search. the current aspiration window implementation assumes that depth and avg cp change is inversely related, but it doesn’t look like this is true. (what is the hump doing??) I tried a couple of aspiration window implementations that don’t make this assumption but didn’t get anything huge. I’ll probably replace it at some point.
i’m now within 100 elo of my target, but it’s still not looking great. it seems i have hit another wall. there’s this copypasta around chess programming circles with a rough order of search features to implement, and i’ve tried 3 in a row, none doing much. since last time, i’ve just added two things that have gained elo: history decay tweak (10 elo): after searching a position, decay history by 50% instead of 80%, helps retain memory from previous searches check extensions (23 elo): extend a search by 1 more move if in check. it’s very simple. i’ve since tried IIR (internal iterative reductions), SEE pruning in PVS (more moveloop pruning), and continuation history (like the history heuristic, but More™️). only continuation history has kinda done something, but only when comparing against a version that’s just as slow; when comparing against the original, it’s much closer because for some reason continuation history slows down the search by almost 10% (??????). The main slow-down-er seems to be indexing the continuation history array, which is absolutely baffling to me. i’ve even tried to start reading the GHC Core again, until i remembered why it was so painful last time.
big gap! some stuff came up and i don’t fully remember what i’ve done since the last devlog. git log tells me i did some minor logic fixes and added SEE pruning in pvs (32 elo), which prunes nodes based on their static exchange evaluation. i do remember that the current version of the engine can beat barbarossa at LTC now. STC it still loses (i.e. my engine scales better… glass half full), but I am now working on eval tuning to hopefully bump the elo up some more. i am now working on this through ssh. negative: lag. positive: there is almost nothing running on my computer aside from the language server. should make testing easier and more predictable
i’ve been doing some tuner work, it’s not great the old tuner was pretty bad. very janky, repeated code, very hard to read, and sloooowwww…. i optimized it by precomputing the factors for each position so it’s just a bunch of multiplications to get the score. upside: order of magnitude speed improvement. downside: 20+ gb memory…. other problem is that the new tuner’s results are not great. they aren’t horribly bad like some other tests, but the gains aren’t as big as i was expecting. this might be a data quality issue? i might write proper datagen code at some point instead of just relying on the output of SPRT tests. I did get a nice 7 elo from removing floating point ops in eval, so that’s nice i guess. i can smell the goal already. Soon (i would attach a picture of the 20gb but i’m kinda running a sprt right now… maybe next time)
it is done….. i think trout is the strongest haskell engine now (i made the passed pawn bonus tunable per-rank, which added around 20 elo. re-tested some other search stuff but they all kinda sucked) i think i’m going to work on polishing the frontend now, tag a 2.0 release soon.
2.0 release has been tagged! i set up a dockerfile to make static linux binaries and created a windows github action to make the windows binaries. I also finished the test against the last version of the engine:
managed to update the website to the new version. It was much easier than I expected, considering the amount of changes I’ve made. new version is better (besides just being stronger) in that I factored the iterative deepening code out, which means the website can have sensible time settings now instead of the stupid “max time per depth” thing it had before. I also implemented IIR (internal iterative reductions). I’ve tried it like 10 times before, but this specific version worked for some reason. +28 elo! engine is now safely better than barbarossa.
I did some more frontend work! i made the chessground rank/file responsive: for some reason, the default ones are positioned by pixel offsets and break pretty quickly on smaller screens. some light css max fixes this recolored everything: stock chessground theme is kinda lame made the time slider exponential: I wanted to give a larger time range (previous is 100ms-1000ms), but everything past 1s on the high end makes it really unwieldy to set the time on the low end, where people usually play. i made it exponential, i can expand the top end (3000ms now) without the slider feeling weird. it’s easier to show than explain
Ships:
welcome to trout v2! the goal of this period was to upgrade trout v1 to finally become the strongest chess engine written in haskell (it’s a cool title, ok). i believe it is done, and trout now beats the previous #1, barbarossa. writing a chess engine in haskell is hard and annoying and probably a not good use of my time, but i am stubborn and not very bright so here we are. writing a chess engine is also very annoying in general, involving thousands of hours of cpu time to test changes. everyone say thank you to my poor i7 10700k together with the +300elo (!!!) strength improvement over v1, i also corrected the engine’s time management (no more timing out in chess GUIs) and cleaned up the web interface. to play the engine, you have three options: the demo link: this has the web interface for trout. it’s the original engine compiled down to WASM with a nice ui on top. lichess bot: you can find the lichess bot link at the bottom of the demo website, @TroutBot . it’s running on an oracle free tier server and can only play two games simultaneously; if challenging it hangs, it’s probably playing 2 already. locally: if you want troutbot at peak performance, you can download a chess GUI like En Croissant or Arena, and configure the trout binary (on github releases) in the GUI. trout speaks the standard UCI protocol....
|
1792853867.8653579
|
1792940267.8653579
|
|
34134
|
SlopUI by @racek256 | Stardance
|
racek256
|
1
|
95.0
|
1637
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-12T15:49:06Z", "hours": 95.0, "multiplier": 17.25, "payout": 1637, "blessing": "neutral", "text": "I made SlopUI, a local and private AI assistant interface featuring Slopper as your assistant. Just a few features to flag: memory, MCPs, a mobile page, and much more. The best part of this project is probably the local web search and memory engine, since they required me to benchmark multiple solutions and system prompts and iterate on result quality. The most challenging part was building the frontend. I am not a designer, so I had some trouble with the design, but I managed to get a design I am happy with. Mostly in dark mode, the light mode is not so great.", "repo": "https://github.com/racek256/SlopUI", "demo": "https://slop.racek.xyz"}]...
|
[{"post_id": 79066, "ts": "202 [{"post_id": 79066, "ts": "2026-10-12T15:39:34Z", "hours": 2.4158, "text": "devlog 12 Memory engine finished and deployed Few of AI assisted bug fixes README.md + docs/ + License Pre ship fixes and stuff"}, {"post_id": 78753, "ts": "2026-10-11T14:39:37Z", "hours": 9.5125, "text": "Devlog 11 Today I’ve been cooking hard. Currently I’m working on the memory engine for SlopUI. The architecture is quite simple: A cheap extractor analyzes all conversations, extracts context, and suggests memories. All context gets passed to a smarter filter that has tools to directly manage the entire memory system: add, edit, remove, and list memories. All saved memories get embedded and saved into the DB. Search uses an embedder + reranker for quick lookup. Search takes around 0.5s per message, but I’ll optimize it before the next devlog. I’ve also improved the mobile version of SlopUI and added PWA support so you can install it similarly to a normal app. The memory engine is still in development, and I have a few experimental ideas in mind that might make the memory crazy good. But first I need to finish it."}, {"post_id": 77122, "ts": "2026-10-05T18:18:31Z", "hours": 10.3761, "text": "Ups, looks like I overshot the 10 hours again and Stardance is forcing me to make another devlog. I guess it’s time for DEVLOG 10 You don’t have to stare into a white screen anymore thanks to my genius invention dark mode (I know it still looks terrible, I’m not a designer) configuration was migrated to a config.yaml file with more configuration options websearch got improved (I know I’m saying this every devlog and I’m probably gonna keep saying it even in the following ones) sidebar has an option to pin/unpin chat Discord OAuth is implemented and it’s used even on the demo deployment https://slop.racek.xyz more stable generation"}, {"post_id": 69094, "ts": "2026-09-16T11:14:35Z", "hours": 8.8664, "text": "Devlog 9 Yupiiii another version focused on stability and it is looking stable Generation is now separated from Request so even when connection dies frontend can reconnect without user noticing Full File Uploading support for basic text and image formats websearch, webfetch functions are stable enough to be considered usable websearch has gained massive speed improvements although it will improve even further in the future Frontend Polish, fixes and stuff ( the boring stuff that actually makes this app usable ) here is picture of slopper saying hello although it didn’t really understood what devlog means:"}, {"post_id": 63767, "ts": "2026-09-07T18:44:22Z", "hours": 9.16, "text": "Devlog 8 This version is mostly Quality of Life improvements and stability, but it really improves a lot. This update brings: Backend Working config.json file for basic model configuration Not crashing every second prompt webfetch/websearch somewhat faster and not crashing anymore Better security Improved SearXNG default configuration Frontend Mobile interface — the webpage finally works on phones Regeneration — now, even when the backend throws an error, the frontend gives you the option to retry the request Reasoning popup — you can now see what the model is actually thinking about WIP File attachments — frontend part finished, not wired into the backend I’m probably going to stop working on new features and rather start finishing this project up, so probably another QoL update will be next, alongside one last large feature I need to do: proper demo account creation, ’cause right now demo mode is just one large shared account. I know, pretty bad."}, {"post_id": 54052, "ts": "2026-08-24T20:18:35Z", "hours": 8.8131, "text": "devlog 7 In this version I finally added full MCP support. Websearch also got a few improvements, plus the full Lightpanda browser through MCP integration. Backend has improved stability. I have started on the mobile interface, although it’s not yet ready. I’ve also started working on the config system, for now most of it is in .env, but soon I’m gonna replace it with a proper .yaml file."}, {"post_id": 45845, "ts": "2026-08-12T15:56:54Z", "hours": 9.0239, "text": "Devlog 6 The demo is finally out on slop.racek.xyz. The demo won’t have all the features of the full dev build, because my server isn’t able to run proper embedding and reranking models. That’s why the demo relies on the Tavily API for web searches, it’s nearly identical. The harness is finally starting to come together. I implemented just two tools: websearch and webfetch . This took me so long because I wasn’t only adding those tools, but also benchmarking different embedding and reranking models, so I can be sure I’m not losing performance for no reason. The websearch tool is definitely going to go through more improvements, but for now this is the version I’m okay with and the AI also seems to like it (yes I asked it)"}, {"post_id": 44544, "ts": "2026-08-10T11:38:58Z", "hours": 8.0272, "text": "Devlog 5 After some time, I’m back with new features and improvements. I finally added a Reasoning/Websearch indicator so users can see what the AI is currently doing. This gives users a sense that something is happening, which makes the entire process feel faster. I’ve also removed the search button from the sidebar since I’m not going to work on it anytime soon. I’ll probably implement it for the second release, but not right now. If everything goes correctly, today I hope to release a demo with DeepSeek V4 Flash as a free model. All I need to do before releasing the demo is: Finish demo sign-in Fix a few frontend bugs Add rate limiting to the backend Deploy on my server After releasing the demo, I’ll have a really basic AI chat interface: you send a message, the AI responds. It has one tool, websearch . That’s why after releasing the demo, I want to focus on the harness and make it actually good. I’m definitely going to do a SearXNG implementation for the websearch tool (currently it uses the Tavily API) and implement a custom page loader/parser and some basic RAG. I haven’t used RAG for a long time, so I’m going to have to do some research on it. I definitely want to add more tools later on, but I’ll keep that for future devlogs."}, {"post_id": 40010, "ts": "2026-08-03T11:13:25Z", "hours": 9.7369, "text": "Devlog 4 Holy moly, it’s again another 9 hours. Thankfully, I finally have something to talk about in this devlog. I’m getting really close to publishing the demo page. I have a mostly working frontend, and the backend has just a few bugs I need to handle. I’m still missing rate limiting and model verification on the backend. For now, the harness has just one websearch tool. in the future, I want to add much more and make it a full harness, but for the first release I hope this is enough. One last feature I want to implement on the frontend is displaying the harness state, so instead of showing the user a simple loader, they will see what’s currently happening in the harness — what the agent is reasoning about, and so on. So the plan for now is: Complete frontend integration Fix backend bugs Display harness state on frontend Release public demo page with rate limiting Improve harness Ship first release"}, {"post_id": 36988, "ts": "2026-07-29T12:53:51Z", "hours": 9.6169, "text": "Devlog 3 After a week I’m finally back home and continuing my work on this project. I noticed I’ve already gone 9 hours without a devlog, but I don’t have much to talk about yet. Well, I started working on the backend — it’s taking quite slow because I’m giving it the proper time to ensure its security and ease of implementation for the frontend. I guess I’ll just list the stuff I have implemented or am working on implementing: JWT Authentication (finished) Conversation Branching (finished) AI Harness (mostly finished) DB implementation (mostly implemented) Rate limiting (not yet) API User focused / Authentication (finished) Inference / AI (not started yet) Still got some work to do, but the backend is getting close to finished. The last step will be frontend API implementation, and the project will be ready for demo deployment. I’ll probably launch the public demo without the need to create an account, with free inference on DeepSeek v4 Flash. I’ll use the OpenCode Zen API for that because they offer free DeepSeek v4 Flash inference. I hate the person who tought is good idea to block publishing copied messages i didn’t use AI to write it but i wrote it in my code editor and now i have to rewrite this entire message cause stardance thinks i AI generated this."}, {"post_id": 29121, "ts": "2026-07-15T19:46:05Z", "hours": 5.9314, "text": "Devlog 2 The frontend is finally in a usable state, which means I can finally start working on the backend. I intentionally kept the frontend simple no special features yet. I have plenty of ideas for special features and improvements, but my first priority is getting the application into a polished, presentable state. Once that’s done, I’ll start experimenting with those ideas. Now, let’s talk about the backend. What do I actually want? I’ll probably use basic Python with SQLite. There’s no need for a separate database for this project. The backend will include simple JWT authentication, response streaming, model selection, and some basic rate limiting. Once everything is working reliably, I’ll start thinking about building a custom harness or maybe even experimenting with some multi-agent workflows. But first, I don’t want to get sidetracked, I want to finish the base application."}, {"post_id": 27824, "ts": "2026-07-13T18:26:21Z", "hours": 3.8267, "text": "Devlog #1 I’m starting with a simple agentic web interface. For the first release, I want to focus mainly on the user interface and finishing the frontend. The backend will just be a simple API or an Ollama proxy with rate limiting. I also want to create a custom harness in Python, but not for the first release. I prepared some design files beforehand, but they look bad, so I’m not really following them much. If I don’t mess up the UI, it should come out looking okay, but I’m a bit more worried about the UX. I like putting animations everywhere, which always absolutely ruins UX, so I’ll try to be more conservative with them this time. I’m working on the frontend mostly without AI, using it only as interactive documentation. I’m hoping to get the frontend into a usable form asap so I can start working on other features and the custom harness."}]...
|
Title: SlopUI by @racek256 | Stardance
Devlogs:
D Title: SlopUI by @racek256 | Stardance
Devlogs:
Devlog #1 I’m starting with a simple agentic web interface. For the first release, I want to focus mainly on the user interface and finishing the frontend. The backend will just be a simple API or an Ollama proxy with rate limiting. I also want to create a custom harness in Python, but not for the first release. I prepared some design files beforehand, but they look bad, so I’m not really following them much. If I don’t mess up the UI, it should come out looking okay, but I’m a bit more worried about the UX. I like putting animations everywhere, which always absolutely ruins UX, so I’ll try to be more conservative with them this time. I’m working on the frontend mostly without AI, using it only as interactive documentation. I’m hoping to get the frontend into a usable form asap so I can start working on other features and the custom harness.
Devlog 2 The frontend is finally in a usable state, which means I can finally start working on the backend. I intentionally kept the frontend simple no special features yet. I have plenty of ideas for special features and improvements, but my first priority is getting the application into a polished, presentable state. Once that’s done, I’ll start experimenting with those ideas. Now, let’s talk about the backend. What do I actually want? I’ll probably use basic Python with SQLite. There’s no need for a separate database for this project. The backend will include simple JWT authentication, response streaming, model selection, and some basic rate limiting. Once everything is working reliably, I’ll start thinking about building a custom harness or maybe even experimenting with some multi-agent workflows. But first, I don’t want to get sidetracked, I want to finish the base application.
Devlog 3 After a week I’m finally back home and continuing my work on this project. I noticed I’ve already gone 9 hours without a devlog, but I don’t have much to talk about yet. Well, I started working on the backend — it’s taking quite slow because I’m giving it the proper time to ensure its security and ease of implementation for the frontend. I guess I’ll just list the stuff I have implemented or am working on implementing: JWT Authentication (finished) Conversation Branching (finished) AI Harness (mostly finished) DB implementation (mostly implemented) Rate limiting (not yet) API User focused / Authentication (finished) Inference / AI (not started yet) Still got some work to do, but the backend is getting close to finished. The last step will be frontend API implementation, and the project will be ready for demo deployment. I’ll probably launch the public demo without the need to create an account, with free inference on DeepSeek v4 Flash. I’ll use the OpenCode Zen API for that because they offer free DeepSeek v4 Flash inference. I hate the person who tought is good idea to block publishing copied messages i didn’t use AI to write it but i wrote it in my code editor and now i have to rewrite this entire message cause stardance thinks i AI generated this.
Devlog 4 Holy moly, it’s again another 9 hours. Thankfully, I finally have something to talk about in this devlog. I’m getting really close to publishing the demo page. I have a mostly working frontend, and the backend has just a few bugs I need to handle. I’m still missing rate limiting and model verification on the backend. For now, the harness has just one websearch tool. in the future, I want to add much more and make it a full harness, but for the first release I hope this is enough. One last feature I want to implement on the frontend is displaying the harness state, so instead of showing the user a simple loader, they will see what’s currently happening in the harness — what the agent is reasoning about, and so on. So the plan for now is: Complete frontend integration Fix backend bugs Display harness state on frontend Release public demo page with rate limiting Improve harness Ship first release
Devlog 5 After some time, I’m back with new features and improvements. I finally added a Reasoning/Websearch indicator so users can see what the AI is currently doing. This gives users a sense that something is happening, which makes the entire process feel faster. I’ve also removed the search button from the sidebar since I’m not going to work on it anytime soon. I’ll probably implement it for the second release, but not right now. If everything goes correctly, today I hope to release a demo with DeepSeek V4 Flash as a free model. All I need to do before releasing the demo is: Finish demo sign-in Fix a few frontend bugs Add rate limiting to the backend Deploy on my server After releasing the demo, I’ll have a really basic AI chat interface: you send a message, the AI responds. It has one tool, websearch . That’s why after releasing the demo, I want to focus on the harness and make it actually good. I’m definitely going to do a SearXNG implementation for the websearch tool (currently it uses the Tavily API) and implement a custom page loader/parser and some basic RAG. I haven’t used RAG for a long time, so I’m going to have to do some research on it. I definitely want to add more tools later on, but I’ll keep that for future devlogs.
Devlog 6 The demo is finally out on slop.racek.xyz. The demo won’t have all the features of the full dev build, because my server isn’t able to run proper embedding and reranking models. That’s why the demo relies on the Tavily API for web searches, it’s nearly identical. The harness is finally starting to come together. I implemented just two tools: websearch and webfetch . This took me so long because I wasn’t only adding those tools, but also benchmarking different embedding and reranking models, so I can be sure I’m not losing performance for no reason. The websearch tool is definitely going to go through more improvements, but for now this is the version I’m okay with and the AI also seems to like it (yes I asked it)
devlog 7 In this version I finally added full MCP support. Websearch also got a few improvements, plus the full Lightpanda browser through MCP integration. Backend has improved stability. I have started on the mobile interface, although it’s not yet ready. I’ve also started working on the config system, for now most of it is in .env, but soon I’m gonna replace it with a proper .yaml file.
Devlog 8 This version is mostly Quality of Life improvements and stability, but it really improves a lot. This update brings: Backend Working config.json file for basic model configuration Not crashing every second prompt webfetch/websearch somewhat faster and not crashing anymore Better security Improved SearXNG default configuration Frontend Mobile interface — the webpage finally works on phones Regeneration — now, even when the backend throws an error, the frontend gives you the option to retry the request Reasoning popup — you can now see what the model is actually thinking about WIP File attachments — frontend part finished, not wired into the backend I’m probably going to stop working on new features and rather start finishing this project up, so probably another QoL update will be next, alongside one last large feature I need to do: proper demo account creation, ’cause right now demo mode is just one large shared account. I know, pretty bad.
Devlog 9 Yupiiii another version focused on stability and it is looking stable Generation is now separated from Request so even when connection dies frontend can reconnect without user noticing Full File Uploading support for basic text and image formats websearch, webfetch functions are stable enough to be considered usable websearch has gained massive speed improvements although it will improve even further in the future Frontend Polish, fixes and stuff ( the boring stuff that actually makes this app usable ) here is picture of slopper saying hello although it didn’t really understood what devlog means:
Ups, looks like I overshot the 10 hours again and Stardance is forcing me to make another devlog. I guess it’s time for DEVLOG 10 You don’t have to stare into a white screen anymore thanks to my genius invention dark mode (I know it still looks terrible, I’m not a designer) configuration was migrated to a config.yaml file with more configuration options websearch got improved (I know I’m saying this every devlog and I’m probably gonna keep saying it even in the following ones) sidebar has an option to pin/unpin chat Discord OAuth is implemented and it’s used even on the demo deployment https://slop.racek.xyz more stable generation
Devlog 11 Today I’ve been cooking hard. Currently I’m working on the memory engine for SlopUI. The architecture is quite simple: A cheap extractor analyzes all conversations, extracts context, and suggests memories. All context gets passed to a smarter filter that has tools to directly manage the entire memory system: add, edit, remove, and list memories. All saved memories get embedded and saved into the DB. Search uses an embedder + reranker for quick lookup. Search takes around 0.5s per message, but I’ll optimize it before the next devlog. I’ve also improved the mobile version of SlopUI and added PWA support so you can install it similarly to a normal app. The memory engine is still in development, and I have a few experimental ideas in mind that might make the memory crazy good. But first I need to finish it.
devlog 12 Memory engine finished and deployed Few of AI assisted bug fixes README.md + docs/ + License Pre ship fixes and stuff
Ships:
I made SlopUI, a local and private AI assistant interface featuring Slopper as your assistant. Just a few features to flag: memory, MCPs, a mobile page, and much more. The best part of this project is probably the local web search and memory engine, since they required me to benchmark multiple solutions and system prompts and iterate on result quality. The most challenging part was building the frontend. I am not a designer, so I had some trouble with the design, but I managed to get a design I am happy with. Mostly in dark mode, the light mode is not so great....
|
1792857262.7901886
|
1792943662.7901886
|
|
4353
|
InviteHub by @Mrithul_E | Stardance
|
Mrithul_E
|
2
|
85.0
|
1614
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T15:04:05Z", "hours": 4.0, "multiplier": 12.49, "payout": 49, "blessing": "neutral", "text": "I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase. what’s new in this ship 2 fixed some security vulnerability as per github code scan Added assets completely handmade with canva replaced many fonts in home page with cursive fonts added our mission section in the home page", "repo": "https://github.com/Mrithul-E/InviteHub", "demo": "https://invitehub.mrithul.in/"}, {"ship_num": 2, "ts": "2026-09-06T13:06:11Z", "hours": 81.0, "multiplier": 19.23, "payout": 1565, "blessing": "neutral", "text": "I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase.", "repo": "https://github.com/Mrithul-E/InviteHub", "demo": "https://invitehub.mrithul.in/"}]...
|
[{"post_id": 66105, "ts": "202 [{"post_id": 66105, "ts": "2026-09-11T18:10:15Z", "hours": 0.3892, "text": "Minor security fixes as per GitHub security scan Inclusion of functionality from an untrusted source Client-side URL redirect using query in URL"}, {"post_id": 66022, "ts": "2026-09-11T15:47:24Z", "hours": 1.2178, "text": "Some reworks readme updated added more gap in between the template card added the github link to the navbar changed some fonts in homepage and added some paragraph sections there"}, {"post_id": 64908, "ts": "2026-09-09T16:58:28Z", "hours": 1.6047, "text": "full css and ui rework: Changed the background image Made the design and animation minimalistic updated the navbar and footer removed unwanted styling in css removed unwanted gradient from text made minimal footer"}, {"post_id": 63600, "ts": "2026-09-07T14:55:46Z", "hours": 0.7089, "text": "Minor css fix removed many useless css code. Made it more good. not that the gradients are not generated by AI, instead it is generated by online CSS gradient maker. Don’t this that this is a AI generated/AI styled project. This site doesn’t have that much huge css to use AI. The Login with Google button is copied by some article in Medium. The gradient used in the home page Get Started button is custom made using CSS gradient generator The background image and the animated phone image is generated by Chatgpt. I don’t know whether this is contributing to the AI feel 🥲🥲😭😭 UPDATE: : By asking to shipwrights, they say that it was flagged and AI because it used AI generated images, which is not allowed. So i made it my self using canva, here it is:"}, {"post_id": 62873, "ts": "2026-09-06T12:22:58Z", "hours": 0.3833, "text": "Fix: Chrome media hub staying active even when video stops fixed this by removing the src and loading the video again into chrome’s memory, this solves the problem ."}, {"post_id": 62835, "ts": "2026-09-06T11:22:25Z", "hours": 1.3864, "text": "Added demo video to the home page Updated README.md and also fixed many minor css and html issues"}, {"post_id": 62397, "ts": "2026-09-05T18:51:00Z", "hours": 1.4019, "text": "Added README.md !! *Not comleted yet, no images and videos are added yet"}, {"post_id": 62092, "ts": "2026-09-05T10:41:55Z", "hours": 1.1986, "text": "Added the pages such as About, privacy-policies etc… Added About, Privacy policies , Terms of service page in hbs and added the corresponding routers for it"}, {"post_id": 62018, "ts": "2026-09-05T07:10:46Z", "hours": 0.5586, "text": "Added confirmation for logout and Added redirect to the last visited URL in login Added redirect to the last visited URL in login Added confirmation for logout, and made the logout route a long random string"}, {"post_id": 61684, "ts": "2026-09-04T18:32:50Z", "hours": 3.3572, "text": "Added ‘My invitations’ section in website Added My invitations section that shows the invitations created by that user. From here user can see the invitation, creation date, and user can also delete the invitation. Delete option will delete all files that are part of that invitation from the cdn, then delete the complete invitation from the db. And also added some minor fixes such as: webpage title issues added favicon etc…"}, {"post_id": 61049, "ts": "2026-09-03T19:19:07Z", "hours": 1.6256, "text": "User experience improvement implemented: made the created invitation url return fron server to frontend removed unwanted console.log used for debugging made the “Get started” button in frontend functional Added: invitation link and copy button in invitation creation form submission page"}, {"post_id": 60427, "ts": "2026-09-02T18:50:07Z", "hours": 1.5317, "text": "Added search option in templates Implemented using Fuse.js *images are placeholders"}, {"post_id": 60264, "ts": "2026-09-02T15:01:57Z", "hours": 1.1522, "text": "Reached initial working stage First working template added Added: render of hbs from cdn rendering of custom form from database"}, {"post_id": 59313, "ts": "2026-09-01T01:12:28Z", "hours": 2.1864, "text": "added template and form rendering from Database"}, {"post_id": 58317, "ts": "2026-08-30T18:12:36Z", "hours": 4.9681, "text": "Added a option to write the template(HBS) and the form from frontend implemented: option to write the template(HBS) and the form from frontend hbs to CDN script 10 MB fields limit in template creation router (multer) Invitation total file size limit 50 MB (formidable) Invitation data processing and cleanup"}, {"post_id": 56814, "ts": "2026-08-28T18:55:14Z", "hours": 1.57, "text": "Connected the form created using jquery forms to HackClub CDN My website is basically a site that have many templates for different kind of event. A user can select a template , this will redirect to a form. Each template have entirely different forms , each form is created by the Admin using a jquery form builder ui. Because these form structures are unknow to the server, the server dont know how much file input fields are there. so we cant set a limit on number of file input fields and per input size. So I set a 50 MB total upload limit using formidable before sending files to hackclub cdn. This makes the usage fair."}, {"post_id": 56609, "ts": "2026-08-28T13:05:06Z", "hours": 1.4072, "text": "Handle multipart uploads with file size limits using busboy formidable ✓ In the last devlog I shared a very large code to limit max total requiest size using busboy. Yesterday , In a simple google search , the Google AI mode suggested me of Formidable previously idk formidable … So I learned about that , it made my code so tiny frontend logic was already there"}, {"post_id": 54984, "ts": "2026-08-26T12:38:33Z", "hours": 2.4072, "text": "Handle multipart uploads with file size limits using busboy i want to limit the max total file upload to 50 MB, multer cant have this feature so I use busboy and wrote long long code to solve this problem code :"}, {"post_id": 54621, "ts": "2026-08-25T17:23:09Z", "hours": 0.6072, "text": "Research: How to limit the total file size in a multipart/formData (Express.js) After many searches I found out that multer don’t support this I am planning to use Busboy directly"}, {"post_id": 54387, "ts": "2026-08-25T11:35:57Z", "hours": 2.1842, "text": "Added error messages in data submissions in rendered template form Added a 50 MB file size limit in file upload (for now only frontend checks are implemented, backend check is TODO)."}, {"post_id": 51711, "ts": "2026-08-21T15:19:40Z", "hours": 2.8461, "text": "Added delete template option for admin The delete option will delete the template from the database and also delete the thumbnail image stored in hackclub CDN"}, {"post_id": 34488, "ts": "2026-07-25T07:52:12Z", "hours": 4.4856, "text": "Switched from formeo to jquery form builder formeo doesn’t support many input types"}, {"post_id": 30066, "ts": "2026-07-17T10:51:07Z", "hours": 1.1742, "text": "Researching on custom form builder On deep research on making a custom form builder form my each templates , I found : formeo, jquery form builder and survayJS"}, {"post_id": 28398, "ts": "2026-07-14T17:08:38Z", "hours": 4.6656, "text": "connected the admin only template creation form to the firestore AND also made the template cards load dynamically currently provided image is a placeholder This is admin page , only admin page have create template button"}, {"post_id": 25450, "ts": "2026-07-09T18:43:35Z", "hours": 1.7492, "text": "Added hackclub cdn to the project !!! At first it didn’t worked because of compatibly issue of new nodejs’s fetch and npm form-data module fixed using new build-in formData()"}, {"post_id": 23622, "ts": "2026-07-06T18:04:21Z", "hours": 2.0433, "text": "new knoledge unlocked: I can use : app . use ( ' /admin ' , requireAdmin , adminRouter ) instead of : app . use ( requireAdmin ) app . use ( ' /admin ' , adminRouter ) I know everybody knows this, but this is a knowledge to me"}, {"post_id": 21534, "ts": "2026-07-03T15:40:01Z", "hours": 1.2683, "text": "added a very very cool text area for entering description for each field completely build on bootstrap accordion check it out !!!"}, {"post_id": 20136, "ts": "2026-07-01T17:55:02Z", "hours": 1.2319, "text": "First template design completed !!! fully using Bootstrap , and some css"}, {"post_id": 19898, "ts": "2026-07-01T10:16:49Z", "hours": 1.5828, "text": "Continuing the writting of the first template for the site !!! basically my project is a invitation page builder, it needs a lot of custom template. | ▽ not complete yet"}, {"post_id": 18554, "ts": "2026-06-29T18:58:19Z", "hours": 6.7694, "text": "Devlog 6 - Template creation form In this 6h 44m, I made a lot of features but the main highlight was the work on the template creation form ( continuation of previous devlog) Story Time: Basically my project is a wedding invitation page generator. My website will have a lot of prebuild invitation template(HBS) for different different events So the point is different templates require different forms should be filled by the user. Therefore when the admin create different template, the admin should list the require fields for the form of the specific template. Problems faced: My thoughts was to make a prebuild list of fields, from that the admin should list them in specific order. Problem - 1 The first problem was there is no form element to do these. So i used a select element with a ‘Add’ btn. For the sorting, at first i used up/down button, but that wasn’t smooth. After researching I found sortable js. At first sortable js also was not smooth, I fixed that by removing some bootstrap classes from the tag. Problem - 2 The next problem I faced was I cant use required in the custom fields list maker, So I can’t make that field mandatory. Solution (simple) The solution was simple, I made a invisible <textarea required .....> , and add the list of fields to that in json string when the admin edited the list. Thank you for reading ❤️, Mrithul."}, {"post_id": 15040, "ts": "2026-06-24T12:54:36Z", "hours": 4.9608, "text": "Devlog 5 - Templates Page Spent 4 hours and 52 minutes working on the templates page today. This page is going to be the main place where all invitation templates are managed, so I wanted to get the basic structure done before moving on to creating more templates. Templates Grid The first thing I worked on was the layout. I switched the page to a responsive grid system and started building the actual templates page. I also added a Create Template card that is only visible to admins. Clicking the card opens a modal for creating new templates. Template Creation Modal The modal is still incomplete, but the basic flow is now working. Currently it has fields for: Template name HTML file name Preview image Template category Template fields There’s still quite a bit of work left to do here, but at least the structure is finally in place. Template Categories & Fields One thing I didn’t want to do was create a completely separate form for every invitation type. Instead, I’m building a system where templates can be configured using categories and predefined fields. const templateCategories = [ { id : \" wedding \" , name : \" Wedding \" }, { id : \" engagement \" , name : \" Engagement \" }, { id : \" birthday \" , name : \" Birthday \" } .... ] const templateFields = [ { id : \" eventTitle \" , label : \" Event Title \" , type : \" text \" , category : \" common \" }, { id : \" groomName \" , label : \" Groom Name \" , type : \" text \" , category : \" wedding \" } .... ] Right now I’ve added categories for weddings, birthdays, engagements, housewarmings, baby showers and several other event types. The field system should make adding future templates a lot easier. Small UI Improvements I also spent some time cleaning up the page and added a footer. The site is slowly starting to look more like an actual product instead of a collection of pages. Next The next step is finishing the template creation page and making the field selection system fully functional. Once that’s done, adding new templates should be much faster than it is right now."}, {"post_id": 8246, "ts": "2026-06-13T18:26:46Z", "hours": 1.1044, "text": "Devlog - 4 Today I connected my website to firestore for database I have implemented the saving of login information of user to user collection of firestore database This is the implementation code: service\\userService.js : async function saveUserLogin ( userRecord ) { return db . collection ( \" users \" ) . doc ( userRecord . uid ) . set ( { displayName : userRecord . displayName || null , email : userRecord . email , photoURL : userRecord . photoURL || null , lastLoginAt : new Date ( userRecord . metadata . lastSignInTime ) }, { merge : true } ) } service\\userService.js : router . post ( \" /sessionLogin \" , async ( req , res ) => { const idToken = req . body . idToken ; const expiresIn = 60 * 60 * 24 * 13 * 1000 ; try { const sessionCookie = await admin . auth (). createSessionCookie ( idToken , { expiresIn : expiresIn }); const options = { maxAge : expiresIn , httpOnly : true , secure : false }; const decodedClaims = await admin . auth (). verifySessionCookie ( sessionCookie , true ); const userRecord = await admin . auth (). getUser ( decodedClaims . uid ); await saveUserLogin ( userRecord ) res . cookie ( ' session ' , sessionCookie , options ) res . status ( 200 ). send ({ status : \" success \" }) } catch ( err ) { console . error ( err ) res . status ( 401 ). send ( ' Unauthorized request! ' ); } }) I also created the redirect from login page if login successful / refresh in login fail (these things where previously missing) Also there are many UI improvements made, that’s not written in this Devlog (●’◡’●)"}, {"post_id": 7934, "ts": "2026-06-13T07:31:13Z", "hours": 8.3672, "text": "Devlog Time spent: 8 hours 15 minutes across ~6 days This week I mostly worked on security-related improvements and continued work on the invitation template system. Security Fixes When I opened GitHub, I got a security notification. After checking it, I found that a Firebase client-side API key was present in the repository. I know Firebase client API keys are not secret credentials by themselves, but leaving them exposed can still make abuse easier, especially if other protections are missing. Since the project is still in development, I decided to clean it up now rather than later. What I did: Revoked the old API key Generated a new one Moved the configuration into environment variables Made sure sensitive files are not pushed to GitHub res . locals . firebaseClientCred = Buffer . from ( process . env . firebaseClientCred , \" base64 \" ) . toString ( \" utf-8 \" ); The long-term plan is to separate development and production configurations. Right now localhost access is required for development, so strict domain restrictions are not practical yet. Once the project is deployed, I plan to have: A development API configuration that allows localhost A production API configuration that only allows requests from the final website domain The developer configuration will stay out of production deployments. Even if development code is accidentally pushed, it should fail instead of exposing access that was never intended for production. The backend Firebase SDK setup was already safe, so most of this work was focused on the client-side configuration. Navbar Improvements I also implemented automatic navbar link highlighting. Instead of manually setting the active page for every route, the navbar now checks the current URL and highlights the correct link automatically. function highlightCurrentPageLink () { const currentPageUrl = window . location . pathname ; const links = document . querySelectorAll ( \" #navbar-ul li a \" ); links . forEach (( link ) => { const href = link . getAttribute ( \" href \" ); if ( href . split ( \" / \" )[ 1 ] === currentPageUrl . split ( \" / \" )[ 1 ]) { link . classList . add ( \" active \" ); } else { link . classList . remove ( \" active \" ); } }); } Small change, but it makes maintaining the navigation much easier. User Menu Worked on the user menu and logout functionality. Nothing huge here, but it is another piece of the authentication flow that is now coming together. Template System I created the HBS file structure for the template page and spent a lot of time thinking about how templates should actually be implemented. This is currently the biggest blocker. There are several ways to handle template rendering and customization, and I don’t want to lock myself into a design that becomes difficult to maintain later. A lot of the development time this week went into planning, experimenting, and changing approaches rather than writing large amounts of code. Next Create separate Firebase development and production configurations Add domain restrictions after deployment Continue work on the invitation template system Finish the template rendering workflow Improve user account features There is still a lot to do, but the project is becoming more stable and secure before moving further into feature development."}, {"post_id": 3693, "ts": "2026-06-06T18:57:54Z", "hours": 2.5967, "text": "Devlog-2: Today , I added a beautiful animation to the home page made the home page overall beautiful Also fixed a authentication error : the fix was simple - I accidently wrote (res, req) instead of (req, res) in express router Also completed the login page design What’s next : Surely build a footer tomorrow 😁 Also planning to create a template creation tool for Admin Note: the PHONE image have a cool animation effect. completely done by hands , no AI only used AI for clearing doubt"}, {"post_id": 2855, "ts": "2026-06-05T18:18:17Z", "hours": 8.5736, "text": "Login Page within 8h 33m , I made the home page, firebase auth, designed logo etc.. currently I am working on designing the ‘Login with google’ page I thought I should only submit and link the project after completing the full project … 😟 but I didn’t forget to connect hackatime 😁🥳"}]...
|
Title: InviteHub by @Mrithul_E | Stardance
Devlog Title: InviteHub by @Mrithul_E | Stardance
Devlogs:
Login Page within 8h 33m , I made the home page, firebase auth, designed logo etc.. currently I am working on designing the ‘Login with google’ page I thought I should only submit and link the project after completing the full project … 😟 but I didn’t forget to connect hackatime 😁🥳
Devlog-2: Today , I added a beautiful animation to the home page made the home page overall beautiful Also fixed a authentication error : the fix was simple - I accidently wrote (res, req) instead of (req, res) in express router Also completed the login page design What’s next : Surely build a footer tomorrow 😁 Also planning to create a template creation tool for Admin Note: the PHONE image have a cool animation effect. completely done by hands , no AI only used AI for clearing doubt
Devlog Time spent: 8 hours 15 minutes across ~6 days This week I mostly worked on security-related improvements and continued work on the invitation template system. Security Fixes When I opened GitHub, I got a security notification. After checking it, I found that a Firebase client-side API key was present in the repository. I know Firebase client API keys are not secret credentials by themselves, but leaving them exposed can still make abuse easier, especially if other protections are missing. Since the project is still in development, I decided to clean it up now rather than later. What I did: Revoked the old API key Generated a new one Moved the configuration into environment variables Made sure sensitive files are not pushed to GitHub res . locals . firebaseClientCred = Buffer . from ( process . env . firebaseClientCred , " base64 " ) . toString ( " utf-8 " ); The long-term plan is to separate development and production configurations. Right now localhost access is required for development, so strict domain restrictions are not practical yet. Once the project is deployed, I plan to have: A development API configuration that allows localhost A production API configuration that only allows requests from the final website domain The developer configuration will stay out of production deployments. Even if development code is accidentally pushed, it should fail instead of exposing access that was never intended for production. The backend Firebase SDK setup was already safe, so most of this work was focused on the client-side configuration. Navbar Improvements I also implemented automatic navbar link highlighting. Instead of manually setting the active page for every route, the navbar now checks the current URL and highlights the correct link automatically. function highlightCurrentPageLink () { const currentPageUrl = window . location . pathname ; const links = document . querySelectorAll ( " #navbar-ul li a " ); links . forEach (( link ) => { const href = link . getAttribute ( " href " ); if ( href . split ( " / " )[ 1 ] === currentPageUrl . split ( " / " )[ 1 ]) { link . classList . add ( " active " ); } else { link . classList . remove ( " active " ); } }); } Small change, but it makes maintaining the navigation much easier. User Menu Worked on the user menu and logout functionality. Nothing huge here, but it is another piece of the authentication flow that is now coming together. Template System I created the HBS file structure for the template page and spent a lot of time thinking about how templates should actually be implemented. This is currently the biggest blocker. There are several ways to handle template rendering and customization, and I don’t want to lock myself into a design that becomes difficult to maintain later. A lot of the development time this week went into planning, experimenting, and changing approaches rather than writing large amounts of code. Next Create separate Firebase development and production configurations Add domain restrictions after deployment Continue work on the invitation template system Finish the template rendering workflow Improve user account features There is still a lot to do, but the project is becoming more stable and secure before moving further into feature development.
Devlog - 4 Today I connected my website to firestore for database I have implemented the saving of login information of user to user collection of firestore database This is the implementation code: service\userService.js : async function saveUserLogin ( userRecord ) { return db . collection ( " users " ) . doc ( userRecord . uid ) . set ( { displayName : userRecord . displayName || null , email : userRecord . email , photoURL : userRecord . photoURL || null , lastLoginAt : new Date ( userRecord . metadata . lastSignInTime ) }, { merge : true } ) } service\userService.js : router . post ( " /sessionLogin " , async ( req , res ) => { const idToken = req . body . idToken ; const expiresIn = 60 * 60 * 24 * 13 * 1000 ; try { const sessionCookie = await admin . auth (). createSessionCookie ( idToken , { expiresIn : expiresIn }); const options = { maxAge : expiresIn , httpOnly : true , secure : false }; const decodedClaims = await admin . auth (). verifySessionCookie ( sessionCookie , true ); const userRecord = await admin . auth (). getUser ( decodedClaims . uid ); await saveUserLogin ( userRecord ) res . cookie ( ' session ' , sessionCookie , options ) res . status ( 200 ). send ({ status : " success " }) } catch ( err ) { console . error ( err ) res . status ( 401 ). send ( ' Unauthorized request! ' ); } }) I also created the redirect from login page if login successful / refresh in login fail (these things where previously missing) Also there are many UI improvements made, that’s not written in this Devlog (●’◡’●)
Devlog 5 - Templates Page Spent 4 hours and 52 minutes working on the templates page today. This page is going to be the main place where all invitation templates are managed, so I wanted to get the basic structure done before moving on to creating more templates. Templates Grid The first thing I worked on was the layout. I switched the page to a responsive grid system and started building the actual templates page. I also added a Create Template card that is only visible to admins. Clicking the card opens a modal for creating new templates. Template Creation Modal The modal is still incomplete, but the basic flow is now working. Currently it has fields for: Template name HTML file name Preview image Template category Template fields There’s still quite a bit of work left to do here, but at least the structure is finally in place. Template Categories & Fields One thing I didn’t want to do was create a completely separate form for every invitation type. Instead, I’m building a system where templates can be configured using categories and predefined fields. const templateCategories = [ { id : " wedding " , name : " Wedding " }, { id : " engagement " , name : " Engagement " }, { id : " birthday " , name : " Birthday " } .... ] const templateFields = [ { id : " eventTitle " , label : " Event Title " , type : " text " , category : " common " }, { id : " groomName " , label : " Groom Name " , type : " text " , category : " wedding " } .... ] Right now I’ve added categories for weddings, birthdays, engagements, housewarmings, baby showers and several other event types. The field system should make adding future templates a lot easier. Small UI Improvements I also spent some time cleaning up the page and added a footer. The site is slowly starting to look more like an actual product instead of a collection of pages. Next The next step is finishing the template creation page and making the field selection system fully functional. Once that’s done, adding new templates should be much faster than it is right now.
Devlog 6 - Template creation form In this 6h 44m, I made a lot of features but the main highlight was the work on the template creation form ( continuation of previous devlog) Story Time: Basically my project is a wedding invitation page generator. My website will have a lot of prebuild invitation template(HBS) for different different events So the point is different templates require different forms should be filled by the user. Therefore when the admin create different template, the admin should list the require fields for the form of the specific template. Problems faced: My thoughts was to make a prebuild list of fields, from that the admin should list them in specific order. Problem - 1 The first problem was there is no form element to do these. So i used a select element with a ‘Add’ btn. For the sorting, at first i used up/down button, but that wasn’t smooth. After researching I found sortable js. At first sortable js also was not smooth, I fixed that by removing some bootstrap classes from the tag. Problem - 2 The next problem I faced was I cant use required in the custom fields list maker, So I can’t make that field mandatory. Solution (simple) The solution was simple, I made a invisible <textarea required .....> , and add the list of fields to that in json string when the admin edited the list. Thank you for reading ❤️, Mrithul.
Continuing the writting of the first template for the site !!! basically my project is a invitation page builder, it needs a lot of custom template. | ▽ not complete yet
First template design completed !!! fully using Bootstrap , and some css
added a very very cool text area for entering description for each field completely build on bootstrap accordion check it out !!!
new knoledge unlocked: I can use : app . use ( ' /admin ' , requireAdmin , adminRouter ) instead of : app . use ( requireAdmin ) app . use ( ' /admin ' , adminRouter ) I know everybody knows this, but this is a knowledge to me
Added hackclub cdn to the project !!! At first it didn’t worked because of compatibly issue of new nodejs’s fetch and npm form-data module fixed using new build-in formData()
connected the admin only template creation form to the firestore AND also made the template cards load dynamically currently provided image is a placeholder This is admin page , only admin page have create template button
Researching on custom form builder On deep research on making a custom form builder form my each templates , I found : formeo, jquery form builder and survayJS
Switched from formeo to jquery form builder formeo doesn’t support many input types
Added delete template option for admin The delete option will delete the template from the database and also delete the thumbnail image stored in hackclub CDN
Added error messages in data submissions in rendered template form Added a 50 MB file size limit in file upload (for now only frontend checks are implemented, backend check is TODO).
Research: How to limit the total file size in a multipart/formData (Express.js) After many searches I found out that multer don’t support this I am planning to use Busboy directly
Handle multipart uploads with file size limits using busboy i want to limit the max total file upload to 50 MB, multer cant have this feature so I use busboy and wrote long long code to solve this problem code :
Handle multipart uploads with file size limits using busboy formidable ✓ In the last devlog I shared a very large code to limit max total requiest size using busboy. Yesterday , In a simple google search , the Google AI mode suggested me of Formidable previously idk formidable … So I learned about that , it made my code so tiny frontend logic was already there
Connected the form created using jquery forms to HackClub CDN My website is basically a site that have many templates for different kind of event. A user can select a template , this will redirect to a form. Each template have entirely different forms , each form is created by the Admin using a jquery form builder ui. Because these form structures are unknow to the server, the server dont know how much file input fields are there. so we cant set a limit on number of file input fields and per input size. So I set a 50 MB total upload limit using formidable before sending files to hackclub cdn. This makes the usage fair.
Added a option to write the template(HBS) and the form from frontend implemented: option to write the template(HBS) and the form from frontend hbs to CDN script 10 MB fields limit in template creation router (multer) Invitation total file size limit 50 MB (formidable) Invitation data processing and cleanup
added template and form rendering from Database
Reached initial working stage First working template added Added: render of hbs from cdn rendering of custom form from database
Added search option in templates Implemented using Fuse.js *images are placeholders
User experience improvement implemented: made the created invitation url return fron server to frontend removed unwanted console.log used for debugging made the “Get started” button in frontend functional Added: invitation link and copy button in invitation creation form submission page
Added ‘My invitations’ section in website Added My invitations section that shows the invitations created by that user. From here user can see the invitation, creation date, and user can also delete the invitation. Delete option will delete all files that are part of that invitation from the cdn, then delete the complete invitation from the db. And also added some minor fixes such as: webpage title issues added favicon etc…
Added confirmation for logout and Added redirect to the last visited URL in login Added redirect to the last visited URL in login Added confirmation for logout, and made the logout route a long random string
Added the pages such as About, privacy-policies etc… Added About, Privacy policies , Terms of service page in hbs and added the corresponding routers for it
Added README.md !! *Not comleted yet, no images and videos are added yet
Added demo video to the home page Updated README.md and also fixed many minor css and html issues
Fix: Chrome media hub staying active even when video stops fixed this by removing the src and loading the video again into chrome’s memory, this solves the problem .
Minor css fix removed many useless css code. Made it more good. not that the gradients are not generated by AI, instead it is generated by online CSS gradient maker. Don’t this that this is a AI generated/AI styled project. This site doesn’t have that much huge css to use AI. The Login with Google button is copied by some article in Medium. The gradient used in the home page Get Started button is custom made using CSS gradient generator The background image and the animated phone image is generated by Chatgpt. I don’t know whether this is contributing to the AI feel 🥲🥲😭😭 UPDATE: : By asking to shipwrights, they say that it was flagged and AI because it used AI generated images, which is not allowed. So i made it my self using canva, here it is:
full css and ui rework: Changed the background image Made the design and animation minimalistic updated the navbar and footer removed unwanted styling in css removed unwanted gradient from text made minimal footer
Some reworks readme updated added more gap in between the template card added the github link to the navbar changed some fonts in homepage and added some paragraph sections there
Minor security fixes as per GitHub security scan Inclusion of functionality from an untrusted source Client-side URL redirect using query in URL
Ships:
I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase.
I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase. what’s new in this ship 2 fixed some security vulnerability as per github code scan Added assets completely handmade with canva replaced many fonts in home page with cursive fonts added our mission section in the home page...
|
1792968577.4225602
|
1793054977.4225602
|
|
29599
|
Holy Moley by @GeorgeSun | Stardance
|
GeorgeSun
|
3
|
96.74
|
1613
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-07T23:43:28Z", "hours": 65.0, "multiplier": 19.59, "payout": 1513, "blessing": "neutral", "text": "Me and my friends made a game about a little mole that fights demons! There are 14 different levels, an inventory system, main menu, health system, map/quick travel system, shop system, and four different items. There are also two bossfights that multiple different attacks and are quite challenging. The most challenging part about this was making the enemy pathfinding as there were many bugs and glitches during the creation process. I am most proud of how polished the game is because the game feels very reactive and fun to play. There has been many changes since the last ship which I feel make the game a lot more complete such as the mole village where there are NPC moles for you to talk to. The game has side quests for you to accomplish now which give you exclusive unlocks that help you along your adventure. Click try project below to play on web or on PC!", "repo": "https://github.com/Geofoods/Holy-Moly", "demo": "https://bryanjietang-boop.itch.io/holy-moly"}, {"ship_num": 2, "ts": "2026-09-03T22:02:25Z", "hours": 2.0, "multiplier": 12.89, "payout": 24, "blessing": "neutral", "text": "Me and my friends made a game about a little mole that fights demons! There are nine different levels, inventory system, main menu, health system, and many different intricate systems such as the parry system! The most challenging part about this was making the enemy pathfinding as there were many bugs and glitches during the creation process. I am most proud of how polished the game is because the game feels very reactive and fun to play. I am also proud of the fact that this is now available on mobile and can be played on Andriod and Iphone! (although not available on the app store. You can play my project with the demo link! The Android version is downloadable, you just have to give it permissions. IOS needs an apple developer license however so it will take a while.", "repo": "https://github.com/Geofoods/Holy-Moly", "demo": "https://bryanjietang-boop.itch.io/holy-moly"}, {"ship_num": 3, "ts": "2026-07-10T14:24:37Z", "hours": 12.0, "multiplier": 12.93, "payout": 76, "blessing": "neutral", "text": "Me and my friends made a game about a little mole that fights demons! There are nine different levels, inventory system, main menu, health system, and many different intricate systems such as the parry system! The most challenging part about this was making the enemy pathfinding as there were many bugs and glitches during the creation process. I am most proud of how polished the game is because the game feels very reactive and fun to play. You can play my project with the demo link!", "repo": "https://github.com/Geofoods/Holy-Moly", "demo": "https://bryanjietang-boop.itch.io/holy-moly"}]...
|
[{"post_id": 82122, "ts": "202 [{"post_id": 82122, "ts": "2026-10-24T00:29:19Z", "hours": 9.1569, "text": "I created a level editor so that everyone can make their own levels. You can create blocks, enemies, checkpoints, chests, items, decorations, and spawnpoints! You can even change the background, music, and VFX! After you have created your level, you can upload your levels to the public server so that everyone can play your level. You can also sort levels by date, likes, downloads, and keywords!"}, {"post_id": 80043, "ts": "2026-10-16T01:49:13Z", "hours": 8.5842, "text": "I polished the map menu to be more consistent to the rest of the menus in the game. I also added more selection to the shop where now you can also sell things in the shop. There are also two new weapons which is the miner’s pickaxe and the wizard’s staff which is the first ranged weapon. I also am currently working on a multiplayer battle mode."}, {"post_id": 77696, "ts": "2026-10-07T23:19:00Z", "hours": 3.3469, "text": "I made my final bugfixes and a few optimizations for web, I think you guys will really enjoy the game!"}, {"post_id": 77189, "ts": "2026-10-06T00:18:02Z", "hours": 10.3744, "text": "This will probably be the final devlog as the game is super close to being finished! I added houses that the mole can enter and also added an extra phase to the corrupted snail boss. There are also new quests for you to partipate in and there are more points for you to quick travel from. I also added in some more music and sound effects and more polishing. You can also now save and erase game data"}, {"post_id": 75730, "ts": "2026-09-30T21:36:11Z", "hours": 9.2133, "text": "I created a new boss called the corrupted snail which will be the final boss and also reworked the corrupted heart as well. I also added some extra story and dialogue and added a new map with quick travel so that you can travel from mole village to the shopkeeper"}, {"post_id": 73767, "ts": "2026-09-25T21:55:35Z", "hours": 7.4275, "text": "I added extra polishing to the arena such as a new enemy spawning animation, and reworked the hornets which is the new enemy that dashes into you. I also added some story and dialogue."}, {"post_id": 72415, "ts": "2026-09-22T21:35:48Z", "hours": 10.3656, "text": "I changed the colours to make the visuals more aesthetic. I also added mole village where you can talk to other moles. I also revamped the tutorial so that the player learns the controls better"}, {"post_id": 70715, "ts": "2026-09-19T17:16:05Z", "hours": 8.8269, "text": "There are now new enemies such as hornets and I have been working on a lot of new levels for my open world 2d platformer called Holy Moly!"}, {"post_id": 69410, "ts": "2026-09-17T00:24:37Z", "hours": 7.6839, "text": "I want to make this an Open World 2D Platformer Game so I have it so that you can travel between levels freely without select screen. I also changed the lighting and added various QOL features"}, {"post_id": 68317, "ts": "2026-09-14T22:37:20Z", "hours": 5.8411, "text": "Made a new shop UI, cave system, and a dynamic camera. I also changed the block breaking physics so that the dirt particles have physics and also added ranged weapons and a grappling hook"}, {"post_id": 64521, "ts": "2026-09-09T00:01:03Z", "hours": 2.0364, "text": "I created a world system where are the levels are connected and also added a damage indicator when hitting enemies and how much damage you inflicted. I also tweaked the combat system so now there is an aerial attack when you attack in the air which is faster than ground attacking"}, {"post_id": 52028, "ts": "2026-08-22T02:07:00Z", "hours": 1.5547, "text": "I ported my Game onto Android and Apple phones and added mobile support!"}, {"post_id": 23539, "ts": "2026-07-06T15:49:12Z", "hours": 10.8819, "text": "Finished the game with 9 levels, end screen, win screen, and boss at the end. You can play the game right now!"}, {"post_id": 20425, "ts": "2026-07-02T00:51:13Z", "hours": 0.8114, "text": "Added a cave parallax background, the player sprite animations and the health indicator"}]...
|
Title: Holy Moley by @GeorgeSun | Stardance
Devlo Title: Holy Moley by @GeorgeSun | Stardance
Devlogs:
Added a cave parallax background, the player sprite animations and the health indicator
Finished the game with 9 levels, end screen, win screen, and boss at the end. You can play the game right now!
I ported my Game onto Android and Apple phones and added mobile support!
I created a world system where are the levels are connected and also added a damage indicator when hitting enemies and how much damage you inflicted. I also tweaked the combat system so now there is an aerial attack when you attack in the air which is faster than ground attacking
Made a new shop UI, cave system, and a dynamic camera. I also changed the block breaking physics so that the dirt particles have physics and also added ranged weapons and a grappling hook
I want to make this an Open World 2D Platformer Game so I have it so that you can travel between levels freely without select screen. I also changed the lighting and added various QOL features
There are now new enemies such as hornets and I have been working on a lot of new levels for my open world 2d platformer called Holy Moly!
I changed the colours to make the visuals more aesthetic. I also added mole village where you can talk to other moles. I also revamped the tutorial so that the player learns the controls better
I added extra polishing to the arena such as a new enemy spawning animation, and reworked the hornets which is the new enemy that dashes into you. I also added some story and dialogue.
I created a new boss called the corrupted snail which will be the final boss and also reworked the corrupted heart as well. I also added some extra story and dialogue and added a new map with quick travel so that you can travel from mole village to the shopkeeper
This will probably be the final devlog as the game is super close to being finished! I added houses that the mole can enter and also added an extra phase to the corrupted snail boss. There are also new quests for you to partipate in and there are more points for you to quick travel from. I also added in some more music and sound effects and more polishing. You can also now save and erase game data
I made my final bugfixes and a few optimizations for web, I think you guys will really enjoy the game!
I polished the map menu to be more consistent to the rest of the menus in the game. I also added more selection to the shop where now you can also sell things in the shop. There are also two new weapons which is the miner’s pickaxe and the wizard’s staff which is the first ranged weapon. I also am currently working on a multiplayer battle mode.
I created a level editor so that everyone can make their own levels. You can create blocks, enemies, checkpoints, chests, items, decorations, and spawnpoints! You can even change the background, music, and VFX! After you have created your level, you can upload your levels to the public server so that everyone can play your level. You can also sort levels by date, likes, downloads, and keywords!
Ships:
Me and my friends made a game about a little mole that fights demons! There are nine different levels, inventory system, main menu, health system, and many different intricate systems such as the parry system! The most challenging part about this was making the enemy pathfinding as there were many bugs and glitches during the creation process. I am most proud of how polished the game is because the game feels very reactive and fun to play. You can play my project with the demo link!
Me and my friends made a game about a little mole that fights demons! There are nine different levels, inventory system, main menu, health system, and many different intricate systems such as the parry system! The most challenging part about this was making the enemy pathfinding as there were many bugs and glitches during the creation process. I am most proud of how polished the game is because the game feels very reactive and fun to play. I am also proud of the fact that this is now available on mobile and can be played on Andriod and Iphone! (although not available on the app store. You can play my project with the demo link! The Android version is downloadable, you just have to give it permissions. IOS needs an apple developer license however so it will take a while.
Me and my friends made a game about a little mole that fights demons! There are 14 different levels, an inventory system, main menu, health system, map/quick travel system, shop system, and four different items. There are also two bossfights that multiple different attacks and are quite challenging. The most challenging part about this was making the enemy pathfinding as there were many bugs and glitches during the creation process. I am most proud of how polished the game is because the game feels very reactive and fun to play. There has been many changes since the last ship which I feel make the game a lot more complete such as the mole village where there are NPC moles for you to talk to. The game has side quests for you to accomplish now which give you exclusive unlocks that help you along your adventure. Click try project below to play on web or on PC!...
|
1792968862.0742104
|
1793055262.0742104
|
|
87
|
Pterodactyl Panel (Android App) by @stefdp | Stard Pterodactyl Panel (Android App) by @stefdp | Stardance...
|
stefdp
|
1
|
157.29
|
1608
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-07T14:34:43Z", "hours": 106.0, "multiplier": 15.23, "payout": 1608, "blessing": "neutral", "text": "For rating & testing the project, please first read all of the text in the release. I made an Android app to manage your self-hosted Pterodactyl Panel instance (Currently only the client side, later I’ll also add the admin side). For who doesn’t know, Pterodactyl Panel is a panel usually used to manage game servers, but it can run anything, each server is just a docker container. The most challenging part was prob downloading files, and it still confuses me tbh because on the Android Studio emulator it works fine, but when if I try it on my actual phone (Samsung A55 5G) it randomly stops after a few seconds and I can’t seem to understand why", "repo": "https://git.stefdp.com/Stef/Pterodactyl-Panel-Android-App", "demo": "https://git.stefdp.com/Stef/Pterodactyl-Panel-Android-App/releases/latest"}]...
|
[{"post_id": 55643, "ts": "202 [{"post_id": 55643, "ts": "2026-08-27T16:32:55Z", "hours": 2.5833, "text": "Added updated checking For F-Droid flavor it doesn’t do anything For APK flavor it checks my git repo For Play Store flavor it uses play store com.google.android.play:app-update library Updated the app site, available at https://ptero.stefdp.com Updated the changelog & app images in the fastlane folder Added an animation when switching between loading states with circular loading"}, {"post_id": 55485, "ts": "2026-08-27T11:17:55Z", "hours": 1.5147, "text": "Added optional biometric authentication so people can lock their app behind phone code or biometric verification (like fingerprint etc.)"}, {"post_id": 54826, "ts": "2026-08-25T23:53:13Z", "hours": 3.245, "text": "Created nests, nest & nest egg screens For nest egg screen, created 3 tabs: Configuration Variables Install Script it was pretty easy and quick to create those cuz they’re read-only as there’s no API endpoint to edit/delete them Added a back handler in the tabbed screens so that back button now goes to the previous tab instead of the entire previous screen In the client servers screen added a switch to see others’ server (admin only) Fixed capitalization in the getNestEgg function ( eggid -> eggId )"}, {"post_id": 54513, "ts": "2026-08-25T15:20:42Z", "hours": 2.9808, "text": "Created users & user screen Updated the AGP (Android Gradle Plugin) Table headers now properly support multi line text (previously if one text was multiline while everything else wasn’t, all the divider would have a gap on the bottom except for the multiline one) In the client server screen, settings tab the UUID is now aligned to the right Improved screen change when deleting a server/node/user/location (instead of navController.popBackStack() (which basically acts as the back button) i specifically navigate to generic screen (eg. “user” -> “users”) and remove current screen from the back history so in the case that there is no screen to back into (eg if the app is opened via a deep link or stuff like that) it will go to the generic tab anyway) Added pull to refresh in the location screen"}, {"post_id": 53949, "ts": "2026-08-24T17:33:07Z", "hours": 1.9753, "text": "Created server manage tab (only reinstall & suspend/unsuspend cuz there seem to be no API endpoint to toggle install status & transfer) Created server delete tab Added 2 new button types, SUCCESS (green) and WARNING (yellow) In the admin server screen now most tabs are hidden whent he server is installing"}, {"post_id": 53378, "ts": "2026-08-23T22:08:42Z", "hours": 1.3206, "text": "Created the admin server databases tab (it only supports resetting the password and deleting the databases because for creating a database i need the hosts IDs, which there seem to be no API endpoint to get them) Added a modifier param to the Container component In the client server screen added a param to directly switch to the databases tab (this is used when the user goes from the admin server screen to the client server screen) Fixed “Missing Server ID” notification when client server is opened with databases tab as first tab"}, {"post_id": 52489, "ts": "2026-08-22T17:05:09Z", "hours": 1.9144, "text": "Created the server startup tab Changed the way Container components are spaced in the Build Configuration tab and create server popup In the create server popup disabled the docker image select when only 1 image is available"}, {"post_id": 52173, "ts": "2026-08-22T08:15:57Z", "hours": 4.4989, "text": "Created server screen with its: About tab Details tab Build Configuration tab Fixed pull to reload, it was updating the refreshIndex variable before the main resource actually refreshed and this caused the tabs not to refresh unless the user pulled to refresh twice CodeText component now uses default text style & font weight instead of pre-defined ones (for some reasons with pre-defined ones, in the ScrollableTabRow component it adds like a margin on the bottom of the blue active indicator) Updated UpdateServerDetailsBody to mark required fields as non-nullable In the server owner select, fixed the selected user disappearing if it was not in the search results In the allocation selects: Made the UI use alias:port when an alias is available, otherwise will default to ip:port Moved the ip:port text to a variable to avoid writing the same thing twice"}, {"post_id": 50274, "ts": "2026-08-19T13:03:15Z", "hours": 2.3186, "text": "Added server creation Added a searchable property in the Select component that adds a text input to filter the options Created a regex to check node & server names"}, {"post_id": 49934, "ts": "2026-08-18T22:04:46Z", "hours": 1.0625, "text": "All *Include enums are now chainable so doing ListNodesQueryInclude.SERVERS + ListServersQueryInclude.USER returns servers.user Also now instead of <enum>.toQueryString(...) (like ListServersQueryInclude.toQueryString(...) ) i do listOf(...).toQueryString() Used the new include enum chaining in 2 places: node servers tab: it now makes way less HTTP requests since the user, nest & egg are directly returned with the server, saving me from making multiple HTTP requests to fetch all users, nests & eggs (which would’ve taken a long time on a large server that for example has thousands of users, since it was fetching at a rate of 50 users per HTTP request, and it being a mobile app, internet might not be fast too) servers screen, now it fetches the egg variable together with the nest instead of having to fetch the egg’s data Moved ApiErrorResponse in a models folder for better organization this is a code only change so ig i’ll show pics of the code"}, {"post_id": 49856, "ts": "2026-08-18T20:07:04Z", "hours": 5.0992, "text": "Created the servers screen (WIP, inputs are untested and creating servers is not implemented yet) Created node servers tab Added pagination to the list nests HTTP request response Removed useless reset of the allocations in the node allocations tab In the created node popup, switched some inputs description from \"quoted\" test to actual inline code blocks CodeText component now uses CharSequence instead of String so it also supports annotated strings Switched main components from Text to CodeText Application server status is now an enum Updated list nests query to include eggs variables too (i just found out i can do this so i’m gonna prob do in in all the other ones in the next devlog too)"}, {"post_id": 48195, "ts": "2026-08-16T14:20:45Z", "hours": 4.3858, "text": "Created the node allocations tab The servers screen now shows the server description when available The 2FA check now considers 2FA as enabled even if the status code is 400 other than checking the error message (ptero got no way of knowing if 2FA is enabled other than that ) Update the TextInput component to allow showing optional suggestions (used in the assign new allocations popup, IP Address input) The Checkbox component now is more transparent when disabled (from 0.5 to 0.2 alpha) Changed how padding works in the Pager component Updated the Table component to add a param to disable lazy loading (for some reason it was laggier) Updated the libs"}, {"post_id": 47489, "ts": "2026-08-15T13:07:23Z", "hours": 2.2333, "text": "Created the node configuration tab Renamed the CodeText component to CodeBlockText and added params to highlight the content with a specific language Created the CodeText component to have both normal text and inline code text (kinda like markdown when you do this )"}, {"post_id": 47046, "ts": "2026-08-14T17:23:43Z", "hours": 1.6747, "text": "Create the settings tab in the node screen Added enabled state to all the inputs & switches in the create node popup Updated the updateNode function’s body & params since some required params were marked as nullable"}, {"post_id": 46843, "ts": "2026-08-14T11:23:01Z", "hours": 2.9253, "text": "Created the node screen & its about tab Moved node specific endpoints to their own ApiService instead of having them in the ApplicationApiService and added 2 endpoints to respectively fetch system data in v1 and v2 Made it so create new node button is disabled until all locations are fetched"}, {"post_id": 45978, "ts": "2026-08-12T20:16:10Z", "hours": 2.9544, "text": "Created the popup to create a node When fetching the node lists, now it also fetches all the locations (needed for a select in the create popup) Added fastlane metadata (will be used for F-Droid in the future) The Popup component now has a scrollbar Updated the scrollbar so now it only shows up when the container has enough contents to be scrollable Added an arrangement property in the Table ’s headers & row cells so that i can center certain things Updated TextInput and Switch components to make their description text color customizable Updated the workflow to automatically push the .aab file to play store after it’s built and made the release (hopefully, i didn’t test it) Fixed create location popup not clearing the inputs upon closing"}, {"post_id": 45461, "ts": "2026-08-11T23:00:38Z", "hours": 0.5592, "text": "Fixed admins not being able to manage servers subusers’ permissions Fixed not being aple to open sub-directories in the file browser Fixed create location popup not closing after creating the location"}, {"post_id": 45335, "ts": "2026-08-11T18:39:18Z", "hours": 1.6944, "text": "Created nodes screen (missing the popup to create a node for now) App name is now dynamically generated in the build.gradle.kts file (so debug build get the (Debug) suffix) Added an HTTP endpoint to check a node status"}, {"post_id": 45109, "ts": "2026-08-11T11:53:58Z", "hours": 0.4881, "text": "Created a CodeText component to display text as code (kinda like this ) and applied it in all the places where I previously just copy pasted same code Creating an API key now copies the key to the clipboard"}, {"post_id": 45061, "ts": "2026-08-11T10:17:04Z", "hours": 5.8633, "text": "Created the locations screen Created the location screen Took and modified to adapt to this app the Table component, originally from my Zipline app Fixed the pull to refresh, when calling onRefresh it didn’t actually set isRefreshing to true so the spinner would immediately disappear instead of swithcing to the spinner state till it finished loading Removed the page property from functions since the page is already stored in the viewModel so it made no sense to retrieve it from the viewModel just to send it to a function in the viewModel Fixed the formatDate function, it was crashing the app on older Android versions (<= 13) because the date time parser couldn’t understand the timezone (it expected a date like 2026-08-08-T15:43:30Z instead of 2026-08-08-T15:43:30+02:00 ) Added a new primary color variant that looks good enough on light bgs Fixed some multi-line TextInput s being marked as singleLine"}, {"post_id": 42647, "ts": "2026-08-07T14:13:23Z", "hours": 0.4458, "text": "Fixed the pull to refresh box having incorrect padding, so the circle was being hidden by the header and by the time it was out, it was already fully pulled and so it would refresh Updated the README also did some tests with downloading but i failed so i just undid them without committing or anything"}, {"post_id": 42285, "ts": "2026-08-06T22:21:15Z", "hours": 2.0292, "text": "Created a website for the app & a privacy policy (that was needed for the play store app), it’s available at https://ptero.stefdp.com Added a prompt to request the notification permission in the login screen and a button in the settings in case you want to enable notification in a second moment Improved the eventDescription variable in the ActivityDisplay component (i didn’t even know that was possible, i found it out cuz i made a _count variable and android studio suggested me to put it directly in the when , lmao) Updated versioning to follow SemVer ( 1.0 -> 1.0.0 )"}, {"post_id": 41895, "ts": "2026-08-06T12:09:27Z", "hours": 3.0606, "text": "in the account settings screen added a tab for the app settings Fixed some activity log event having incorrect names and causing the app to crash Added an action to build the app when the commit is prefixed with [build] or [release] Moved the *Scrollbar modifiers above any padding modifier so they look better Switch ScrollableTabRow to a normal Row instead of LazyRow since it’ll never have enough items to cause any lag Updated the README Removed the admin input in the login screen since it’s currently not available"}, {"post_id": 41497, "ts": "2026-08-05T19:00:04Z", "hours": 1.0289, "text": "In the account settings screen created the activity tab (i think i finished all the client side of the app , now i just gotta finish the small importance TODOs like removing the padding to the scrollbar in most scrollable views & stuff like that) Moved ActivityDisplay in the general components as it’s used in the accoutn activity too Updated ActivityDisplay to include the user agent button when available"}, {"post_id": 41417, "ts": "2026-08-05T16:42:56Z", "hours": 0.65, "text": "In the account settings screen added the SSH Keys tab (basically a almost full copy paste of the API Credentials for the frontend) Fixed capitalization of a variable & function in the api key tab"}, {"post_id": 41037, "ts": "2026-08-04T23:29:22Z", "hours": 2.9483, "text": "In the account settings screen created the API credentials tab Update the server screen so each tabs remembers its own data after switching to another tab (previously it would reset when the user switched to another tab). Also tabs now only fetch data on first render, then they use the previously fetched data instead of re-fetching, unless the user manually refreshes via the “pull to refresh” action (the thing where you swipe from top to down and it shows the refresh circle, idk it’s “professional” name ) Applied same changes as above to the account settings screen Updated the formatDate function to include a param to toggle the year in the date"}, {"post_id": 40669, "ts": "2026-08-04T11:04:30Z", "hours": 5.4211, "text": "Added the account settings screen and its account tab (now missing “API Credentials”, “SSH Keys” and “Activity” tabs, then the app is done ) in the server screen’s files tab file names are now limited to one line and if they overflow, they get cut off and “…” is added Now each warning popup in the server screen has its own icon instead of all using the suspended icon in all places, replaced refreshIndex += 1 with refreshIndex++ The app now no longer shows “Missing Server ID” toast as soon as you open a server Fixed disable 2FA endpoint (i forgot to add /disable at the end and i was wondering why 2FA wasn’t getting disabled even tho the request succeeded (without /disable it acts as enable endpoint)) Fixed get qr code response as it was different from what the API docs listed In the get qr code function added a secondary response to tell that 2FA is already enabled (used to check 2FA status so i know whether to show enable or disable button in the 2FA cuz the user object doesn’t tell me if the user has 2FA on … shitty API fr) Added a simple regex to parse emails (so the change email button is enabled only if this regex passes) Servers screen now uses a normal Column instead of a LazyColumn as lazily loading the server was causing more lag than loading all at once (after all it’s just 10 servers per page) Same as above for the server screen activity tab (jusy 25 logs per page) Fixed the pagination system in servers screen and server screen activity tab (for total amount of pages it was using the total amount of items in the current pages ( .total ) instead of the total number of pages ( .totalPages ), idk how i missed that ) Moved the file picker stuff outside of the LazyColumn & put the permissions in a remember to hopefully try to decrease lag I wanted to make a screen rec but i was too lazy to then go and censor my 2FA secret"}, {"post_id": 39547, "ts": "2026-08-02T15:55:34Z", "hours": 5.2503, "text": "Created the activity tab (finally finished all server tabs :D) along with a function to parse the variables in the logs’ description Improved loading for schedules, backup and databases tabs Fixed JSON text highlighting not highlighting strings inside of arrays Added padding for the Waterfall Cutout (aka screens with rounded edges) in the Header and ScrollableTabRow components In the settings tab added a popup to confirm the reinstallation of the server Added the endpoint to get the server activity (idk how i had skipped that one) and its function to call it Renamed AccountActivity to ActivityLog as it’s used in server activity too Installed a lib to generate avatars thta look like “Boring Avatars” one (cuz boring avatars API is paid ) add .trim() to all user inputs Now tabs refresh only when the server ID changes instead of anything in the server object"}, {"post_id": 39101, "ts": "2026-08-01T20:10:32Z", "hours": 4.3317, "text": "Create a custom PullToRefreshBox component that just uses Material3 PullToRefreshBox under the hood, i just made a component so i can easily style it as it’s in 1 single place Added the pull to refresh gesture to servers list & server details screens Added a warning for when the server is suspended, installing, transferring, restoring from a backup or its node is under maintenance (all warnings for now use same icons, i gotta change that) In the servers list servers now are disable and show a pill when they are suspended, installing, transferring, restoring from a backup or their node is under maintenance (basically when the warning is displayed, the server is also disabled aka you can’t access its data like console, files etc.) The app now properly handles padding for devices that have a “waterfall inset” (aka those kind of phones with curved screen at the edge) The top bar in the server list now properly shows a loading state instead of just disappearing and appearing when the user permissions are fetched Created a function hasPermission to check if an user has a certain permission instead of repeating the same code like 20 times Moved StartupContainer to a more general Container Moved ServerStatus enum to Server.Status Removed navController from all tabs as it was unused"}, {"post_id": 38795, "ts": "2026-08-01T11:14:01Z", "hours": 2.0736, "text": "Created the startup tab Made startup variable description nullable as it’s an optional property"}, {"post_id": 38468, "ts": "2026-07-31T21:10:19Z", "hours": 0.7469, "text": "Network tab now just disables all the buttons when loading instead of switching to skeleton loading for any small change like updating an allocation’s notes Doubled hamburger menu icon left padding to match the avatar padding on the right Doubled the gaps between the cards in the backups & network tabs Halved the gaps between the cards in the schedules tab I also tried to make the TextInput label not squared for a while but failed 😭 , for some reasons even if i clip my highest component to rounded corners, it still has the squared bg in the back"}, {"post_id": 38370, "ts": "2026-07-31T18:28:20Z", "hours": 1.9514, "text": "Added the network tab to manage server allocations Added a “Tertiary” button type (just cuz secondary was almost invisible on the allocation bg 🥀) Fixed allocation endpoints using String instead of Long Moved backup popups outside of the padded Column Updated my github username in the readme"}, {"post_id": 36009, "ts": "2026-07-27T20:28:50Z", "hours": 0.4436, "text": "After i tested more the additions of the last devlog i found some issues so here i fixed them Fixed backups downloading as .gz instead of .tar.gz Fixed “Create Backup” not showing up when the current backup count was 0 (making it impossible to create backups at all) Disabled inputs in the restore & create popups when respectively restoring and creating Removed the enabled param in the BackupDisplay as it was basically useless"}, {"post_id": 35992, "ts": "2026-07-27T19:54:26Z", "hours": 4.4839, "text": "Finished the users tab Made the backups tab Made all popup’s horizontal padding equal When editing or creating a new subuser, the permissins that the current user doesn’t have are disabled in the permissions list Disabled the “Create Database” button when at the limit Renamed File to FileDisplay for consistency with other components Fixed edit & create user body still using String instead of ServerSubuser.Permission Fixed the deleteServerBackup function which was marked as GET instead of DELETE Made the truncate param required in the restoreServerBackup function as it’s required in the API"}, {"post_id": 34673, "ts": "2026-07-25T16:12:15Z", "hours": 5.4628, "text": "Started making the users tab but it’s really WIP, none of the buttons except create new user works) Handled subuser permissions for all current tabs Added a LabeledCheckbox component Removed some function params that were pointless to have Installed the Gravatar SDK for the subusers’ avatar I legit think Android Studio is ragebaiting me, as soon as i start the rec the app starts to lag, when i stop the rec it’s fine"}, {"post_id": 34147, "ts": "2026-07-24T17:24:53Z", "hours": 3.77, "text": "Finished handling buttons in the schedules tab & created all the popups for schedule & tasks management In all screens & tab now all the inputs, switches, selects etc. are disabled when loading or making a HTTP request (like delete schedule, update file name etc.) Added a function to convert ISO date strings in human-readable strings Added a missing endpoint to execute a schedule Added a missing only_when_online property in the ServerSchedule data class Fixed schedule & tasks endpoint types (was using String instead of Long for the IDs) Fixed ScrollableTabRow not using all the horizontal space when in landscape mode"}, {"post_id": 33800, "ts": "2026-07-24T00:56:20Z", "hours": 2.5242, "text": "Finished the UI side of the schedule details popup (still WIP for backend like button handling) Moved each popup into its own folder & file to avoid having many long Popup calls at the top of screen/tab files Changed task action from a normal screen to an enum Took the formatDate function from my Zipline app"}, {"post_id": 33067, "ts": "2026-07-22T17:17:14Z", "hours": 4.2242, "text": "Created the schedules tab for the server screen (still WIP, for now only works for displaying & creating schedules, gotta add edit, deletion and task management) Moved each tab to its own ViewModel for better ordering instead of putting everything is a generic one Improved code layout by using return s in some places instead of many if else blocks Fixed ScrollableTabRow component improperly placing icons when there was no text Moved ‘linked’ data class es inside each other so i can do Server.Attributes.Limits instead of having a class with a long name like ApplicationServerAttributesLimits"}, {"post_id": 32681, "ts": "2026-07-22T00:08:40Z", "hours": 5.6317, "text": "Updated the file edit screen to use VSCode’s Dark+ theme colors for highlighting and added Java and CASM/Crawssembly by @The_Craw Added the databases tab with handling for creation, deletion and rotation of the password Fixed rotateServerDatabasePassword and deleteServerDatabase , they were using the wrong endpoint ( /server instead of /servers ) Made each tab independently scrollable instead of making the parent component scrollable Took the IconButton component from my Zipline app and slightly modified it (the MoreActionsButton component now uses that) Changed the Notification object component’s background color"}, {"post_id": 31859, "ts": "2026-07-20T16:06:12Z", "hours": 2.1247, "text": "FInished file handling (handled edit & save files & create new file) Added file highlighting for .env files Fixed writeServerFile having a wrong Content-Type (it had application/json instead of text/plain since the input is a raw string) Fixed HTML syntax highlighting, it wasn’t highlighting the > part of the tag"}, {"post_id": 31721, "ts": "2026-07-20T10:47:03Z", "hours": 2.645, "text": "Added a screen for code editing with simple syntax highlighting (via a newly installed library) and a warning if you try to leave without saving (that’s still WIP, saving isn’t implemented yet and neither reading the content of the selected file) Updated the TextInput component to have a fontFamily property so that in the core editor i can set the text to be monospace On the login screen i disabled the application api key input till the admin side is actually done"}, {"post_id": 31407, "ts": "2026-07-19T19:00:46Z", "hours": 4.4347, "text": "(Sorry for the slightly laggy video, not sure if it’s cuz it’s via a emulator or cuz i compressed the video from 136 MiB down to 36 MB) In the server screen added the handling for download, upload, delete, copy, create folder, rename/move, change permissions, archive & unarchive Filled the File component’s “more actions” menu (before it was empty) Updated uploadServerFiles to be able to upload multiple files at once Added a function to convert linux string permissions (like drwxr-xr-x ) to int/octal (like 755 ) Added a regex for the linux int/octal permission Took the Popup component and Storage object form my Zipline app Updated the SecureStorage class to add the file download folder variable"}, {"post_id": 30962, "ts": "2026-07-18T23:42:06Z", "hours": 2.1631, "text": "Created the Files tab in the server screen (still WIP, most of the buttons do nothing rn) Created a File component to avoid repeating same code Added a new color surfaceContainer used in notifications Took the “More Actions” component from my Zipline app Took the “Checkbox” component from my Zipline app and modified it to be toggleable In server screen disable global scroll on certain tabs as they’d cause the app to crash for infinite scroll moved the WebSocket connection to the Console tab instead of the general server screen, this way it auto reconnects when the user switches back to the console tab (since it disconnects when the user moves to another tab to save resources)"}, {"post_id": 30840, "ts": "2026-07-18T19:40:14Z", "hours": 3.5069, "text": "Added charts to the console tab of the server screen Added a top scrollbar like ptero’s to the server screen and moved the console stuff to its own file for better sorting Created a component for the chart container & top scrollbar to avoid repetition Added AI declaration in the readme cuz i only found out now that it’s required Removed a double new line the Button component"}, {"post_id": 29863, "ts": "2026-07-17T00:51:22Z", "hours": 3.43, "text": "Created the server screen and right now i only made the console section out of all the ones i gotta do (console, files, databases, schedules, users, backups, network, startup, settings & activity) The server screen itself is WIP as it’s missing the buttons to switch between the sections The console tab is also WIP as i haven’t done the line charts for CPU, RAM & Network I/O) (devlogging with this stuff half-made cuz it’s almost 3AM so i gotta sleep ) Took the formatMs function from my zipline app to convert ms to human readable time like “1h 30m 20s” for the server uptime In the WebSocketManager class renamed the setPowerState function to sendPowerSignal as it makes more sense On the console screen i wanted the console to follow its actual colors but only lib i found to do that doesn’t support jetpack compose that well so i had to rely on the XML’s TextView (but in compose thanks to the AndroidView component)"}, {"post_id": 29055, "ts": "2026-07-15T18:23:36Z", "hours": 2.9633, "text": "Fixed websocket not working (apparently it 403’s unless you put the panel URL as Origin header) Added pagination to the servers screen and also made the server load lazily and get unrendered when out of the display Also suspended servers’ names now are grayed out Installed a ANSI parser library to correctly color console output (hopefully it works however they already said it won’t work for outline 😭) Took the scrollbar modifiers from my Zipline app and put a scrollbar in the servers list Created a object to easily access the WebSocketManager from a ViewModel class Currently working on the specific server page, right now it’s empty but i got websocket working, i’ll push it once it’s finished"}, {"post_id": 28568, "ts": "2026-07-14T21:58:36Z", "hours": 3.9736, "text": "Added the UI for the client servers list screen (still gotta finish it tho, just have to add pagination and will only shows 10 servers per page to avoid getting ratelimited as i have to make a separate HTTP request for each server to get their resources usage) Added pterodactyl panel colors to be used in the server status (red, green and yellow) Fixed listServers not working cuz of wrong path (i didn’t know how to tell retrofit to use just the baseUrl , then after it threw an error i googled it and realized i just had to put . ) Updated getServerResources response class, now the server state uses a enum instead of a generic string Updated Server class to better fix some typed and add 1 missing key Added the uploadServerFile HTTP method (i didn’t do i it initially cuz the docs were confusing and i couldn’t understand how to select the upload directory, turns out i was setting the directory query on the request to get the signed url instead of the signed url itself 😭 Improved login process to handle the case when the user logged with just an application api key and not a client one Added application API key validation for the same reason as the login Took shimmerable modifier from my Zipline app to make skeleton loading Added definitions & placeholders for all screens until i make them"}, {"post_id": 28257, "ts": "2026-07-14T12:33:25Z", "hours": 2.8692, "text": "Created Loading and Login Screen After making a HTTP request the app crashed and only then i realized that i didn’t make the HTTP request suspend functions so i fixed it Took the Notification object from my Zipline app, tho i gotta fix it a bit cuz the color is kinda ugly and i still don’t know which one in the palette to use cuz imo none of them fits, maybe i’ll just use a separate color out of the palette for it Updated the TextInput component to add a optional required field which when set to true adds a red * next to the label, might do this with switches too I took some common regex (domain, IPv4, number and decimal) since i might need them later and some of them (domain & IPv4) are also aready used in the login"}, {"post_id": 27777, "ts": "2026-07-13T17:06:27Z", "hours": 2.8914, "text": "Finished creating the methods to call the client API (same as application ones, copy pasted same code and changed method & function vars) (except for the download* ones, i took those from my other app Zipline) I also took the Transfer Service from my Zipline app Updated all the libraries Set target SDK to 37 (Android 17) now i gotta do the frontend part"}, {"post_id": 27272, "ts": "2026-07-12T18:21:50Z", "hours": 0.7419, "text": "Finished creating the methods to call the application API (basically just copy pasted same code and changed the method & the fuction vars) Now i gotta make the same thing for the client API"}, {"post_id": 27163, "ts": "2026-07-12T14:07:41Z", "hours": 1.4042, "text": "Started creating methods to call the API endpoints easily Took the Header component from one of my other apps"}, {"post_id": 26528, "ts": "2026-07-11T12:05:14Z", "hours": 0.8058, "text": "Set up color scheme (right now both light and dark color are the same, idk what colors to use to differ but make it still look like the official app) Added some util modules that i also use in my other apps Created an empty login screen"}, {"post_id": 26500, "ts": "2026-07-11T10:27:23Z", "hours": 0.9733, "text": "I had forgotten to add the client API HTTP endpoint to get the console websocket token & URL so i added it now Added the WebSocket handling (untested) Updated the proguard rules so that HTTP request/response classes are not shrunk or minified by R6"}, {"post_id": 26100, "ts": "2026-07-10T18:05:31Z", "hours": 0.6336, "text": "Finished adding the application API HTTP requests (added application/servers/{serverId}/databases , application/nests and application/nests/{nestId}/eggs ) Also fixed some classes having wrong data cuz i realized that i copy pasted them without actually changing their name in some places 😭 you can see them in the commit here even tho i’m kinda confused cuz in the docs i didn’t see any endpoint to create or manage nests, eggs and database hosts"}, {"post_id": 26051, "ts": "2026-07-10T17:14:07Z", "hours": 2.1628, "text": "Added more application API HTTP requests (all the application/nodes/{nodeId}/allocations , application/locations and application/servers endpoints) you can see them in the commit here"}, {"post_id": 21431, "ts": "2026-07-03T11:41:26Z", "hours": 2.1569, "text": "Added more application API HTTP requests (all the /application/user and /application/nodes endpoints) you can see them in the commit here"}, {"post_id": 7486, "ts": "2026-06-12T14:24:53Z", "hours": 1.1056, "text": "Split the API in 2 types: application and client (as pterodactyl handles those differently with 2 diff api keys) Fixed some wrong or missing types Finished adding the HTTP requests for the client API Started adding the HTTP requests for the application API"}, {"post_id": 7451, "ts": "2026-06-12T12:46:34Z", "hours": 1.6653, "text": "Added more HTTP requests (ngl am too lazy to list them all, just watch them in the commit here )"}, {"post_id": 4342, "ts": "2026-06-07T16:58:23Z", "hours": 4.2092, "text": "Added even more HTTP requests, tho could be not 100% accurate cuz ptero API is shit 😭, the official one is AI generated and has hallucinations…. anyway i added: GET /api/client/account/activity GET /api/client/account/ssh-keys POST /api/client/account/ssh-keys POST /api/client/account/ssh-keys/remove GET /api/client/servers/{identifier} GET /api/client/servers/{identifier}/resources POST /api/client/servers/{identifier}/command POST /api/client/servers/{identifier}/power GET /api/client/servers/{identifier}/databases POST /api/client/servers/{identifier}/databases POST /api/client/server/{serverIdentifier}/databases/{databaseIdentifier)/rotate-password DELETE /api/client/server/{serverIdentifier}/databases/{databaseIdentifier} GET /api/client/servers/{identifier}/files/list GET /api/client/servers/{identifier}/files/contents GET /api/client/servers/{identifier}/files/download POST /api/client/servers/{identifier}/files/write POST /api/client/servers/{identifier}/files/create-folder POST /api/client/servers/{identifier}/files/copy PUT /api/client/servers/{identifier}/files/rename POST /api/client/servers/{identifier}/files/compress POST /api/client/servers/{identifier}/files/decompress POST /api/client/servers/{identifier}/files/delete GET /api/client/servers/{identifier}/files/upload POST /api/client/servers/{identifier}/files/chmod GET /api/client/servers/{identifier}/schedules GET /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{identifier}/schedules POST /api/client/servers/{identifier}/schedules/{scheduleIdentifier} DELETE /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} DELETE /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} Writing all these took alot of time"}, {"post_id": 3759, "ts": "2026-06-06T20:13:46Z", "hours": 1.5667, "text": "Started adding some HTTP requests typedef, still missing alot tho for now i added: GET /api/client GET /api/client/permissions GET /api/client/account GET /api/client/account/two-factor POST /api/client/account/two-factor (enable) POST /api/client/account/two-factor (disable) PUT /api/client/account/email PUT /api/client/account/password GET /api/client/account/api-keys DELETE /api/client/account/api-keys/{identifier} POST /api/client/account/api-keys no frontend yet, i’m doing the backend first"}, {"post_id": 3611, "ts": "2026-06-06T16:44:59Z", "hours": 0.7236, "text": "Just created the app skeleton based on the other 2 apps i’ve already made (with alot of TODOs for now) now working on writing the code for HTTP requests to the pterodactyl API and their response types"}]...
|
Title: Pterodactyl Panel (Android App) by @stefdp Title: Pterodactyl Panel (Android App) by @stefdp | Stardance
Devlogs:
Just created the app skeleton based on the other 2 apps i’ve already made (with alot of TODOs for now) now working on writing the code for HTTP requests to the pterodactyl API and their response types
Started adding some HTTP requests typedef, still missing alot tho for now i added: GET /api/client GET /api/client/permissions GET /api/client/account GET /api/client/account/two-factor POST /api/client/account/two-factor (enable) POST /api/client/account/two-factor (disable) PUT /api/client/account/email PUT /api/client/account/password GET /api/client/account/api-keys DELETE /api/client/account/api-keys/{identifier} POST /api/client/account/api-keys no frontend yet, i’m doing the backend first
Added even more HTTP requests, tho could be not 100% accurate cuz ptero API is shit 😭, the official one is AI generated and has hallucinations…. anyway i added: GET /api/client/account/activity GET /api/client/account/ssh-keys POST /api/client/account/ssh-keys POST /api/client/account/ssh-keys/remove GET /api/client/servers/{identifier} GET /api/client/servers/{identifier}/resources POST /api/client/servers/{identifier}/command POST /api/client/servers/{identifier}/power GET /api/client/servers/{identifier}/databases POST /api/client/servers/{identifier}/databases POST /api/client/server/{serverIdentifier}/databases/{databaseIdentifier)/rotate-password DELETE /api/client/server/{serverIdentifier}/databases/{databaseIdentifier} GET /api/client/servers/{identifier}/files/list GET /api/client/servers/{identifier}/files/contents GET /api/client/servers/{identifier}/files/download POST /api/client/servers/{identifier}/files/write POST /api/client/servers/{identifier}/files/create-folder POST /api/client/servers/{identifier}/files/copy PUT /api/client/servers/{identifier}/files/rename POST /api/client/servers/{identifier}/files/compress POST /api/client/servers/{identifier}/files/decompress POST /api/client/servers/{identifier}/files/delete GET /api/client/servers/{identifier}/files/upload POST /api/client/servers/{identifier}/files/chmod GET /api/client/servers/{identifier}/schedules GET /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{identifier}/schedules POST /api/client/servers/{identifier}/schedules/{scheduleIdentifier} DELETE /api/client/servers/{identifier}/schedules/{scheduleIdentifier} POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks POST /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} DELETE /api/client/servers/{serverIdentifier}/schedules/{scheduleIdentifier}/tasks/{taskIdentifier} Writing all these took alot of time
Added more HTTP requests (ngl am too lazy to list them all, just watch them in the commit here )
Split the API in 2 types: application and client (as pterodactyl handles those differently with 2 diff api keys) Fixed some wrong or missing types Finished adding the HTTP requests for the client API Started adding the HTTP requests for the application API
Added more application API HTTP requests (all the /application/user and /application/nodes endpoints) you can see them in the commit here
Added more application API HTTP requests (all the application/nodes/{nodeId}/allocations , application/locations and application/servers endpoints) you can see them in the commit here
Finished adding the application API HTTP requests (added application/servers/{serverId}/databases , application/nests and application/nests/{nestId}/eggs ) Also fixed some classes having wrong data cuz i realized that i copy pasted them without actually changing their name in some places 😭 you can see them in the commit here even tho i’m kinda confused cuz in the docs i didn’t see any endpoint to create or manage nests, eggs and database hosts
I had forgotten to add the client API HTTP endpoint to get the console websocket token & URL so i added it now Added the WebSocket handling (untested) Updated the proguard rules so that HTTP request/response classes are not shrunk or minified by R6
Set up color scheme (right now both light and dark color are the same, idk what colors to use to differ but make it still look like the official app) Added some util modules that i also use in my other apps Created an empty login screen
Started creating methods to call the API endpoints easily Took the Header component from one of my other apps
Finished creating the methods to call the application API (basically just copy pasted same code and changed the method & the fuction vars) Now i gotta make the same thing for the client API
Finished creating the methods to call the client API (same as application ones, copy pasted same code and changed method & function vars) (except for the download* ones, i took those from my other app Zipline) I also took the Transfer Service from my Zipline app Updated all the libraries Set target SDK to 37 (Android 17) now i gotta do the frontend part
Created Loading and Login Screen After making a HTTP request the app crashed and only then i realized that i didn’t make the HTTP request suspend functions so i fixed it Took the Notification object from my Zipline app, tho i gotta fix it a bit cuz the color is kinda ugly and i still don’t know which one in the palette to use cuz imo none of them fits, maybe i’ll just use a separate color out of the palette for it Updated the TextInput component to add a optional required field which when set to true adds a red * next to the label, might do this with switches too I took some common regex (domain, IPv4, number and decimal) since i might need them later and some of them (domain & IPv4) are also aready used in the login
Added the UI for the client servers list screen (still gotta finish it tho, just have to add pagination and will only shows 10 servers per page to avoid getting ratelimited as i have to make a separate HTTP request for each server to get their resources usage) Added pterodactyl panel colors to be used in the server status (red, green and yellow) Fixed listServers not working cuz of wrong path (i didn’t know how to tell retrofit to use just the baseUrl , then after it threw an error i googled it and realized i just had to put . ) Updated getServerResources response class, now the server state uses a enum instead of a generic string Updated Server class to better fix some typed and add 1 missing key Added the uploadServerFile HTTP method (i didn’t do i it initially cuz the docs were confusing and i couldn’t understand how to select the upload directory, turns out i was setting the directory query on the request to get the signed url instead of the signed url itself 😭 Improved login process to handle the case when the user logged with just an application api key and not a client one Added application API key validation for the same reason as the login Took shimmerable modifier from my Zipline app to make skeleton loading Added definitions & placeholders for all screens until i make them
Fixed websocket not working (apparently it 403’s unless you put the panel URL as Origin header) Added pagination to the servers screen and also made the server load lazily and get unrendered when out of the display Also suspended servers’ names now are grayed out Installed a ANSI parser library to correctly color console output (hopefully it works however they already said it won’t work for outline 😭) Took the scrollbar modifiers from my Zipline app and put a scrollbar in the servers list Created a object to easily access the WebSocketManager from a ViewModel class Currently working on the specific server page, right now it’s empty but i got websocket working, i’ll push it once it’s finished
Created the server screen and right now i only made the console section out of all the ones i gotta do (console, files, databases, schedules, users, backups, network, startup, settings & activity) The server screen itself is WIP as it’s missing the buttons to switch between the sections The console tab is also WIP as i haven’t done the line charts for CPU, RAM & Network I/O) (devlogging with this stuff half-made cuz it’s almost 3AM so i gotta sleep ) Took the formatMs function from my zipline app to convert ms to human readable time like “1h 30m 20s” for the server uptime In the WebSocketManager class renamed the setPowerState function to sendPowerSignal as it makes more sense On the console screen i wanted the console to follow its actual colors but only lib i found to do that doesn’t support jetpack compose that well so i had to rely on the XML’s TextView (but in compose thanks to the AndroidView component)
Added charts to the console tab of the server screen Added a top scrollbar like ptero’s to the server screen and moved the console stuff to its own file for better sorting Created a component for the chart container & top scrollbar to avoid repetition Added AI declaration in the readme cuz i only found out now that it’s required Removed a double new line the Button component
Created the Files tab in the server screen (still WIP, most of the buttons do nothing rn) Created a File component to avoid repeating same code Added a new color surfaceContainer used in notifications Took the “More Actions” component from my Zipline app Took the “Checkbox” component from my Zipline app and modified it to be toggleable In server screen disable global scroll on certain tabs as they’d cause the app to crash for infinite scroll moved the WebSocket connection to the Console tab instead of the general server screen, this way it auto reconnects when the user switches back to the console tab (since it disconnects when the user moves to another tab to save resources)
(Sorry for the slightly laggy video, not sure if it’s cuz it’s via a emulator or cuz i compressed the video from 136 MiB down to 36 MB) In the server screen added the handling for download, upload, delete, copy, create folder, rename/move, change permissions, archive & unarchive Filled the File component’s “more actions” menu (before it was empty) Updated uploadServerFiles to be able to upload multiple files at once Added a function to convert linux string permissions (like drwxr-xr-x ) to int/octal (like 755 ) Added a regex for the linux int/octal permission Took the Popup component and Storage object form my Zipline app Updated the SecureStorage class to add the file download folder variable
Added a screen for code editing with simple syntax highlighting (via a newly installed library) and a warning if you try to leave without saving (that’s still WIP, saving isn’t implemented yet and neither reading the content of the selected file) Updated the TextInput component to have a fontFamily property so that in the core editor i can set the text to be monospace On the login screen i disabled the application api key input till the admin side is actually done
FInished file handling (handled edit & save files & create new file) Added file highlighting for .env files Fixed writeServerFile having a wrong Content-Type (it had application/json instead of text/plain since the input is a raw string) Fixed HTML syntax highlighting, it wasn’t highlighting the > part of the tag
Updated the file edit screen to use VSCode’s Dark+ theme colors for highlighting and added Java and CASM/Crawssembly by @The_Craw Added the databases tab with handling for creation, deletion and rotation of the password Fixed rotateServerDatabasePassword and deleteServerDatabase , they were using the wrong endpoint ( /server instead of /servers ) Made each tab independently scrollable instead of making the parent component scrollable Took the IconButton component from my Zipline app and slightly modified it (the MoreActionsButton component now uses that) Changed the Notification object component’s background color
Created the schedules tab for the server screen (still WIP, for now only works for displaying & creating schedules, gotta add edit, deletion and task management) Moved each tab to its own ViewModel for better ordering instead of putting everything is a generic one Improved code layout by using return s in some places instead of many if else blocks Fixed ScrollableTabRow component improperly placing icons when there was no text Moved ‘linked’ data class es inside each other so i can do Server.Attributes.Limits instead of having a class with a long name like ApplicationServerAttributesLimits
Finished the UI side of the schedule details popup (still WIP for backend like button handling) Moved each popup into its own folder & file to avoid having many long Popup calls at the top of screen/tab files Changed task action from a normal screen to an enum Took the formatDate function from my Zipline app
Finished handling buttons in the schedules tab & created all the popups for schedule & tasks management In all screens & tab now all the inputs, switches, selects etc. are disabled when loading or making a HTTP request (like delete schedule, update file name etc.) Added a function to convert ISO date strings in human-readable strings Added a missing endpoint to execute a schedule Added a missing only_when_online property in the ServerSchedule data class Fixed schedule & tasks endpoint types (was using String instead of Long for the IDs) Fixed ScrollableTabRow not using all the horizontal space when in landscape mode
Started making the users tab but it’s really WIP, none of the buttons except create new user works) Handled subuser permissions for all current tabs Added a LabeledCheckbox component Removed some function params that were pointless to have Installed the Gravatar SDK for the subusers’ avatar I legit think Android Studio is ragebaiting me, as soon as i start the rec the app starts to lag, when i stop the rec it’s fine
Finished the users tab Made the backups tab Made all popup’s horizontal padding equal When editing or creating a new subuser, the permissins that the current user doesn’t have are disabled in the permissions list Disabled the “Create Database” button when at the limit Renamed File to FileDisplay for consistency with other components Fixed edit & create user body still using String instead of ServerSubuser.Permission Fixed the deleteServerBackup function which was marked as GET instead of DELETE Made the truncate param required in the restoreServerBackup function as it’s required in the API
After i tested more the additions of the last devlog i found some issues so here i fixed them Fixed backups downloading as .gz instead of .tar.gz Fixed “Create Backup” not showing up when the current backup count was 0 (making it impossible to create backups at all) Disabled inputs in the restore & create popups when respectively restoring and creating Removed the enabled param in the BackupDisplay as it was basically useless
Added the network tab to manage server allocations Added a “Tertiary” button type (just cuz secondary was almost invisible on the allocation bg 🥀) Fixed allocation endpoints using String instead of Long Moved backup popups outside of the padded Column Updated my github username in the readme
Network tab now just disables all the buttons when loading instead of switching to skeleton loading for any small change like updating an allocation’s notes Doubled hamburger menu icon left padding to match the avatar padding on the right Doubled the gaps between the cards in the backups & network tabs Halved the gaps between the cards in the schedules tab I also tried to make the TextInput label not squared for a while but failed 😭 , for some reasons even if i clip my highest component to rounded corners, it still has the squared bg in the back
Created the startup tab Made startup variable description nullable as it’s an optional property
Create a custom PullToRefreshBox component that just uses Material3 PullToRefreshBox under the hood, i just made a component so i can easily style it as it’s in 1 single place Added the pull to refresh gesture to servers list & server details screens Added a warning for when the server is suspended, installing, transferring, restoring from a backup or its node is under maintenance (all warnings for now use same icons, i gotta change that) In the servers list servers now are disable and show a pill when they are suspended, installing, transferring, restoring from a backup or their node is under maintenance (basically when the warning is displayed, the server is also disabled aka you can’t access its data like console, files etc.) The app now properly handles padding for devices that have a “waterfall inset” (aka those kind of phones with curved screen at the edge) The top bar in the server list now properly shows a loading state instead of just disappearing and appearing when the user permissions are fetched Created a function hasPermission to check if an user has a certain permission instead of repeating the same code like 20 times Moved StartupContainer to a more general Container Moved ServerStatus enum to Server.Status Removed navController from all tabs as it was unused
Created the activity tab (finally finished all server tabs :D) along with a function to parse the variables in the logs’ description Improved loading for schedules, backup and databases tabs Fixed JSON text highlighting not highlighting strings inside of arrays Added padding for the Waterfall Cutout (aka screens with rounded edges) in the Header and ScrollableTabRow components In the settings tab added a popup to confirm the reinstallation of the server Added the endpoint to get the server activity (idk how i had skipped that one) and its function to call it Renamed AccountActivity to ActivityLog as it’s used in server activity too Installed a lib to generate avatars thta look like “Boring Avatars” one (cuz boring avatars API is paid ) add .trim() to all user inputs Now tabs refresh only when the server ID changes instead of anything in the server object
Added the account settings screen and its account tab (now missing “API Credentials”, “SSH Keys” and “Activity” tabs, then the app is done ) in the server screen’s files tab file names are now limited to one line and if they overflow, they get cut off and “…” is added Now each warning popup in the server screen has its own icon instead of all using the suspended icon in all places, replaced refreshIndex += 1 with refreshIndex++ The app now no longer shows “Missing Server ID” toast as soon as you open a server Fixed disable 2FA endpoint (i forgot to add /disable at the end and i was wondering why 2FA wasn’t getting disabled even tho the request succeeded (without /disable it acts as enable endpoint)) Fixed get qr code response as it was different from what the API docs listed In the get qr code function added a secondary response to tell that 2FA is already enabled (used to check 2FA status so i know whether to show enable or disable button in the 2FA cuz the user object doesn’t tell me if the user has 2FA on … shitty API fr) Added a simple regex to parse emails (so the change email button is enabled only if this regex passes) Servers screen now uses a normal Column instead of a LazyColumn as lazily loading the server was causing more lag than loading all at once (after all it’s just 10 servers per page) Same as above for the server screen activity tab (jusy 25 logs per page) Fixed the pagination system in servers screen and server screen activity tab (for total amount of pages it was using the total amount of items in the current pages ( .total ) instead of the total number of pages ( .totalPages ), idk how i missed that ) Moved the file picker stuff outside of the LazyColumn & put the permissions in a remember to hopefully try to decrease lag I wanted to make a screen rec but i was too lazy to then go and censor my 2FA secret
In the account settings screen created the API credentials tab Update the server screen so each tabs remembers its own data after switching to another tab (previously it would reset when the user switched to another tab). Also tabs now only fetch data on first render, then they use the previously fetched data instead of re-fetching, unless the user manually refreshes via the “pull to refresh” action (the thing where you swipe from top to down and it shows the refresh circle, idk it’s “professional” name ) Applied same changes as above to the account settings screen Updated the formatDate function to include a param to toggle the year in the date
In the account settings screen added the SSH Keys tab (basically a almost full copy paste of the API Credentials for the frontend) Fixed capitalization of a variable & function in the api key tab
In the account settings screen created the activity tab (i think i finished all the client side of the app , now i just gotta finish the small importance TODOs like removing the padding to the scrollbar in most scrollable views & stuff like that) Moved ActivityDisplay in the general components as it’s used in the accoutn activity too Updated ActivityDisplay to include the user agent button when available
in the account settings screen added a tab for the app settings Fixed some activity log event having incorrect names and causing the app to crash Added an action to build the app when the commit is prefixed with [build] or [release] Moved the *Scrollbar modifiers above any padding modifier so they look better Switch ScrollableTabRow to a normal Row instead of LazyRow since it’ll never have enough items to cause any lag Updated the README Removed the admin input in the login screen since it’s currently not available
Created a website for the app & a privacy policy (that was needed for the play store app), it’s available at https://ptero.stefdp.com Added a prompt to request the notification permission in the login screen and a button in the settings in case you want to enable notification in a second moment Improved the eventDescription variable in the ActivityDisplay component (i didn’t even know that was possible, i found it out cuz i made a _count variable and android studio suggested me to put it directly in the when , lmao) Updated versioning to follow SemVer ( 1.0 -> 1.0.0 )
Fixed the pull to refresh box having incorrect padding, so the circle was being hidden by the header and by the time it was out, it was already fully pulled and so it would refresh Updated the README also did some tests with downloading but i failed so i just undid them without committing or anything
Created the locations screen Created the location screen Took and modified to adapt to this app the Table component, originally from my Zipline app Fixed the pull to refresh, when calling onRefresh it didn’t actually set isRefreshing to true so the spinner would immediately disappear instead of swithcing to the spinner state till it finished loading Removed the page property from functions since the page is already stored in the viewModel so it made no sense to retrieve it from the viewModel just to send it to a function in the viewModel Fixed the formatDate function, it was crashing the app on older Android versions (<= 13) because the date time parser couldn’t understand the timezone (it expected a date like 2026-08-08-T15:43:30Z instead of 2026-08-08-T15:43:30+02:00 ) Added a new primary color variant that looks good enough on light bgs Fixed some multi-line TextInput s being marked as singleLine
Created a CodeText component to display text as code (kinda like this ) and applied it in all the places where I previously just copy pasted same code Creating an API key now copies the key to the clipboard
Created nodes screen (missing the popup to create a node for now) App name is now dynamically generated in the build.gradle.kts file (so debug build get the (Debug) suffix) Added an HTTP endpoint to check a node status
Fixed admins not being able to manage servers subusers’ permissions Fixed not being aple to open sub-directories in the file browser Fixed create location popup not closing after creating the location
Created the popup to create a node When fetching the node lists, now it also fetches all the locations (needed for a select in the create popup) Added fastlane metadata (will be used for F-Droid in the future) The Popup component now has a scrollbar Updated the scrollbar so now it only shows up when the container has enough contents to be scrollable Added an arrangement property in the Table ’s headers & row cells so that i can center certain things Updated TextInput and Switch components to make their description text color customizable Updated the workflow to automatically push the .aab file to play store after it’s built and made the release (hopefully, i didn’t test it) Fixed create location popup not clearing the inputs upon closing
Created the node screen & its about tab Moved node specific endpoints to their own ApiService instead of having them in the ApplicationApiService and added 2 endpoints to respectively fetch system data in v1 and v2 Made it so create new node button is disabled until all locations are fetched
Create the settings tab in the node screen Added enabled state to all the inputs & switches in the create node popup Updated the updateNode function’s body & params since some required params were marked as nullable
Created the node configuration tab Renamed the CodeText component to CodeBlockText and added params to highlight the content with a specific language Created the CodeText component to have both normal text and inline code text (kinda like markdown when you do this )
Created the node allocations tab The servers screen now shows the server description when available The 2FA check now considers 2FA as enabled even if the status code is 400 other than checking the error message (ptero got no way of knowing if 2FA is enabled other than that ) Update the TextInput component to allow showing optional suggestions (used in the assign new allocations popup, IP Address input) The Checkbox component now is more transparent when disabled (from 0.5 to 0.2 alpha) Changed how padding works in the Pager component Updated the Table component to add a param to disable lazy loading (for some reason it was laggier) Updated the libs
Created the servers screen (WIP, inputs are untested and creating servers is not implemented yet) Created node servers tab Added pagination to the list nests HTTP request response Removed useless reset of the allocations in the node allocations tab In the created node popup, switched some inputs description from "quoted" test to actual inline code blocks CodeText component now uses CharSequence instead of String so it also supports annotated strings Switched main components from Text to CodeText Application server status is now an enum Updated list nests query to include eggs variables too (i just found out i can do this so i’m gonna prob do in in all the other ones in the next devlog too)
All *Include enums are now chainable so doing ListNodesQueryInclude.SERVERS + ListServersQueryInclude.USER returns servers.user Also now instead of <enum>.toQueryString(...) (like ListServersQueryInclude.toQueryString(...) ) i do listOf(...).toQueryString() Used the new include enum chaining in 2 places: node servers tab: it now makes way less HTTP requests since the user, nest & egg are directly returned with the server, saving me from making multiple HTTP requests to fetch all users, nests & eggs (which would’ve taken a long time on a large server that for example has thousands of users, since it was fetching at a rate of 50 users per HTTP request, and it being a mobile app, internet might not be fast too) servers screen, now it fetches the egg variable together with the nest instead of having to fetch the egg’s data Moved ApiErrorResponse in a models folder for better organization this is a code only change so ig i’ll show pics of the code
Added server creation Added a searchable property in the Select component that adds a text input to filter the options Created a regex to check node & server names
Created server screen with its: About tab Details tab Build Configuration tab Fixed pull to reload, it was updating the refreshIndex variable before the main resource actually refreshed and this caused the tabs not to refresh unless the user pulled to refresh twice CodeText component now uses default text style & font weight instead of pre-defined ones (for some reasons with pre-defined ones, in the ScrollableTabRow component it adds like a margin on the bottom of the blue active indicator) Updated UpdateServerDetailsBody to mark required fields as non-nullable In the server owner select, fixed the selected user disappearing if it was not in the search results In the allocation selects: Made the UI use alias:port when an alias is available, otherwise will default to ip:port Moved the ip:port text to a variable to avoid writing the same thing twice
Created the server startup tab Changed the way Container components are spaced in the Build Configuration tab and create server popup In the create server popup disabled the docker image select when only 1 image is available
Created the admin server databases tab (it only supports resetting the password and deleting the databases because for creating a database i need the hosts IDs, which there seem to be no API endpoint to get them) Added a modifier param to the Container component In the client server screen added a param to directly switch to the databases tab (this is used when the user goes from the admin server screen to the client server screen) Fixed “Missing Server ID” notification when client server is opened with databases tab as first tab
Created server manage tab (only reinstall & suspend/unsuspend cuz there seem to be no API endpoint to toggle install status & transfer) Created server delete tab Added 2 new button types, SUCCESS (green) and WARNING (yellow) In the admin server screen now most tabs are hidden whent he server is installing
Created users & user screen Updated the AGP (Android Gradle Plugin) Table headers now properly support multi line text (previously if one text was multiline while everything else wasn’t, all the divider would have a gap on the bottom except for the multiline one) In the client server screen, settings tab the UUID is now aligned to the right Improved screen change when deleting a server/node/user/location (instead of navController.popBackStack() (which basically acts as the back button) i specifically navigate to generic screen (eg. “user” -> “users”) and remove current screen from the back history so in the case that there is no screen to back into (eg if the app is opened via a deep link or stuff like that) it will go to the generic tab anyway) Added pull to refresh in the location screen
Created nests, nest & nest egg screens For nest egg screen, created 3 tabs: Configuration Variables Install Script it was pretty easy and quick to create those cuz they’re read-only as there’s no API endpoint to edit/delete them Added a back handler in the tabbed screens so that back button now goes to the previous tab instead of the entire previous screen In the client servers screen added a switch to see others’ server (admin only) Fixed capitalization in the getNestEgg function ( eggid -> eggId )
Added optional biometric authentication so people can lock their app behind phone code or biometric verification (like fingerprint etc.)
Added updated checking For F-Droid flavor it doesn’t do anything For APK flavor it checks my git repo For Play Store flavor it uses play store com.google.android.play:app-update library Updated the app site, available at https://ptero.stefdp.com Updated the changelog & app images in the fastlane folder Added an animation when switching between loading states with circular loading
Ships:
For rating & testing the project, please first read all of the text in the release. I made an Android app to manage your self-hosted Pterodactyl Panel instance (Currently only the client side, later I’ll also add the admin side). For who doesn’t know, Pterodactyl Panel is a panel usually used to manage game servers, but it can run anything, each server is just a docker container. The most challenging part was prob downloading files, and it still confuses me tbh because on the Android Studio emulator it works fine, but when if I try it on my actual phone (Samsung A55 5G) it randomly stops after a few seconds and I can’t seem to understand why...
|
1792961446.2727244
|
1793047846.2727244
|
|
30039
|
Pirate Cats by @Vishy | Stardance
|
Vishy
|
2
|
82.0
|
1600
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-15T23:16:06Z", "hours": 5.0, "multiplier": 19.74, "payout": 104, "blessing": "neutral", "text": "Second Ship for Pirate Cats. In this ship there have been many changes to the games. Some changes include making instructions/tasks clearer, many visual changes, and easter eggs/new features. Many of you guys said the instructions were not clear so I spent a lot of time going through to fix it, and made it more clearer here and there. Also you guys said to put space to skip, so I added that now you can just zoom through the text (if you please). There were not any bugs but some items that were not connected allowing you to not see the bubbles, making some visual fixes like the shells was so blurry and there were some fade in’s coming in really early. Then I added some easter eggs and new dialogue for you guys to find. I hope you guys enjoy the new and improved version!", "repo": "https://github.com/justvishy12/Pirate-Cats", "demo": "https://vishyyyyyyyyy.itch.io/pirate-cats"}, {"ship_num": 2, "ts": "2026-08-01T23:26:58Z", "hours": 77.0, "multiplier": 19.55, "payout": 1496, "blessing": "neutral", "text": "Welcome to my ship of Pirate Cats. Pirate Cats is a 2d godot interactive game using point and click and other buttons such as arrow keys and space. This was the most complex game I have ever built and I have learned so much from it. This game has taken me over a month to build and I am so proud of my self. From learning that there are other ways to create assets (like figma) to how to create save manager (saving the users progress) this was a very fun game to build. Building this game was not so easy, as it required alot of logic, and some of that was repeating so I had to keep rechecking it. Also there were some items I did not know how to use so I had to do research. As this game is only a point and click I am sure you guys will find it entertaining, as I spent a long time on making this good. After building a game so long, and finishing, I realized I want to expand on this! So this is version one where I have your guys feedback! So I can improve my game and add a hard mode where you have lives and other suggestions you guys have. This game has tested my patience as I have spent countless nights coding and building this game from scratch. I have learned so many things that I previously did not know. I didnt know a panel takes mouse input or that there were sliders, those were the easy things to conquer. But items such as creating a full on working save manager took some time to understand, or creating a full fishing minigame, with different sounds and other cool features. I am sure you guys will love what I have put into this game. It also makes me want to learn how to use figma more. From playing minigames on the ship, to steering a ship, to helping the cats escape from crabs, this game has great variety. So who is ready to help the cats (and of course a parrot) and find their treasure!", "repo": "https://github.com/justvishy12/Pirate-Cats", "demo": "https://vishyyyyyyyyy.itch.io/pirate-cats"}]...
|
[{"post_id": 47246, "ts": "202 [{"post_id": 47246, "ts": "2026-08-15T01:34:45Z", "hours": 1.3317, "text": "Captains Secret??? I designeed the figma cat for the captain, along with the frame, then implemented the photo/frame in godot behind the chair in the captains room. This is a relatively short devlog as it is just one added feature that I think makes the game cooler. Figma For the figma first we start off with creating the cat, it is the same as usual, I don’t use the pen tool because it is very unconsistent, anyways we start with the head then the body then add legs, one thing about figma is they dont have vertical and horizontal align just horizontal with items, they should have an option to enable a grid. Anyways for the secret I figured I would make it contrast the captain ( we are talking about the cat) the captain has textured and not very furry fur, but I made this cat have furry skin/fur, and not textured, and kind of short/tall (depending on which cat you are comparing it to). Anyways I used the Pen tool to create the frame as it is easier and faster, even though the alignment is not perfect, it is hard to see just from the human eye, Godot To input this in godot we have to get the image, so we upload it into the file system then I had to re export the chair (seperatley) so I could have it like the photo is behind the chair and the user can press the photo (only the part sticking out) then the captains text plays. This is like a secret and for you guys to find out, so good luck and go try it out!"}, {"post_id": 44656, "ts": "2026-08-10T15:53:19Z", "hours": 3.9511, "text": "Recommended Fixes Hello everyone I just recently shipped and I was really happy with the votes I got so thank you to everyone that supported me but with all the suggestions you guys gave and some of mine that I knew i had to do, I have fixed up the game. Before I get started the godot wakatime extention is broken so now I have to use lapse which makes it harder for me because I have to do the whole recording in one sitting and I cant do some work close it and continue. The video attached includes a few of the fixes and I will start using paragraphs in my writing. But without further to do lets get started. List Of Fixes With all you guys said I have made a list of fixes such as during the cooking scene it was not clear what to do after you made a plate so at the end of the training round I added a arrow so that users can try it before they are on their own. Second There is this flag in the powder monkey’s area, which is side ship view 1. When the flag raises its fine but it does some bugs when coming back down and the way I structured it was weird so I deleted all the code and had a area 2d mouse enter and exit, and I start the animation one 1 speed when they hover over it and when they let go I put it on -1 speed and play it. This makes it look like you are raising the flag and when you stop it goes down. Another thing was all the shells in that scene were blurry. I forgot what did but in figma I think the items were way to small so when scaling up t was very blurry. Also for the space star scene when the user gets it wrong the dialogue for it says that they found the island but then says they should set sail tomorrow, I had the order of items wrong so I flipped them (in the dialogue) and made it stop 1 line earlier in the code. Also after the user gets 3 constellations correct to go to the island it goes to the scene fades in and out then next scene then fades in and out and same for third scene. The problem was that it was making things visible after the fade out finished, it should have been doing it when fade in was done so when fade out was done like you were traveling. Skip text!!! I know this is a big one, so I added it, so I had a line of code that was like if event.is_action_pressed(\"ui_accept\") and !typing: So I just flipped it so that when the dialogue is playing and if they call it it makes a variable true, and in the code where it is playing the text out (its a for loop) I break the for loop and make the ammount of characters visible the ammount of characters there are. Then I also made all the text that says space to continue, to space to skip. This one I did most recently but it was with the crabs, I added a randomizer for the audio so when they shoot the cannons, I just made a randi for -0.1 - 0.1 and added it to the pitch of 1 to the audio stream player so it was random. I also made a new scene for the explosion boom like visual effect and made it fade in and out. I have also commented all the code to make it easier for you guys to understand! That is all I have done and will always be looking for more suggestions to do more work, thank you and hope yall enjoy!"}, {"post_id": 38867, "ts": "2026-08-01T13:04:48Z", "hours": 2.4856, "text": "Finishing Touches Hello everyone we have finally finished Pirate Cats. After weeks of coding, building and testing, we have finally come up with a playable version. In this version everything is finished, but there is only one mode. So as this is the last devlog for this ship let me explain what I have done this time. Bugs After game testing we found some bugs out like there was no music for the cooking puzzle, or the sponge was not visible for the sponge scene, or the button in the island was not working, or the typing settings broke down. So let me start each of the bugs and how I fixed this (all these bugs came up yesterday as I only post a devlog once a day). So first the cooking music puzzle, I forgot to play it in the code, this was a simple fix but the other ones were not. For the scrubbing scene the sponge was not visible, in the code again I forgot to set it to visible but then I found another bug from fixing one it was that I need to turn it back after the scene otherwise it will always stay like that. So I figured out you have to set the cursor to null, that way it doesn’t put a preloaded asset and just has the normal one. This next one was tricky, on the island minigame where you are digging after you finish digging, sometimes you can not press certain parts of the button (to finish the dialogue and go to the end scene) I was so confused on what to problem was, then after some time I realized it only happened because I was initiating a scene, and I thought that it was over it, so I set some of the items including the buttons z index near 1000, because there was only going to be like 100 of the items. So then I thought the button for the sand was over, but it was not and I disabled it after the treasure was found, so I was so confused, then I realized there was a panel in the scene being initiated. So then I finally thought dont panels take the mouse input? And that was when I realized that I had a random panel there stealing the mouse, so i set the mouse input on it to pass, so it can not take it. Finally the typing settings. I learned how to use sliders, but there was one thing I could not figure out, how to flip a slider, so for the text slider, it was fast (the bottom one) to slow (the top one) instead of slow to fast as a slider should be, but then when assigning the value I put a - infront of it, I thought this fixed it because when I went in the speed was on the slower side but max speed. Then I tested it, and I could not change the speed, the problem was when you do - it puts the lowest setting meaning it can not be put to the highest, so I had to put it back and I still don not know how to flip a slider, but that is for next ship. See you guys!"}, {"post_id": 37977, "ts": "2026-07-31T01:49:51Z", "hours": 4.8392, "text": "Finishing Touches (Saving Special ✨) Hello everyone, I am getting close to shipping this project and I have done the finishing touches today which is so much, and I just have to get my fellow game testers up and test the game for any bugs or anything. I know there are a few here and there, but I should have fixed them when I started, doing it now will be too much, and I will fix it in the second ship. So without further to do lets get straight into it. Loading Scenes The loading scenes are the guide scene, preference scene, and the loading part itself. So now in the preference scene there are volume sliders for the different things like sfx, audio in general and bg music. And there is also a slider for the speed on how fast the text goes by, since you can not skip it i thought \"SHould it not be useful to just have a speed, so fast and slow readers can adjust it to make it feel more like a game? So then I added a slider, all the settings are saved I think, but since this is just finishing the logic and not the testing part I will not know for a fact. Overall the ui looks great, and mainly for the save manager, I was working on connecting the variables throughout the different scenes, and when they load a game, based on where they are in the game (like progress wise) then it will put them in the corresponding scene, this was not hard but I kept on forgetting what to add until I started wroking on a different scene. Other Fixes So one major bug I had was previously when I was working on the map scene, I thought I saved the progress but I didn’t and then I committed and all my progress was gone, so I had to spend some time today fixing all the bugs there, and then some of the dialogue in that scene, I thought for some reason was inputted incorrectly, then I proceeded to re fix the whole structure adding lines to the dialogue and then I realized it was wrong and had to put it back, since changing dialogue doesnt sound like a big deal, you have to understand, I changed all the variables because of that. Anyways that was the last thing I did today but lets talk about some other progress I did today. Audio The audio for the game was all recorded today, and everything is handmade (like in the meaning that it is not taken from somewhere else) the only thing that is going to be used for the game that is not handmade, is the background music (im not a good artist, but I am a musician so I am sure I can learn how to do it) and also the fonts, the fonts used for this game look amazing, and I will use it again for all my other games. After making the audio I had to implement it everywhere such as keyboard noise for the letters typing on the screen. Or the crabs moving, or the sponge scrubbing, or the cannons firing going like \"Boom Boom\" and other stuff. Anyways that summarizes most of the things I have done today, and tomorrow I will official test the game and get ready to ship, bye guys!"}, {"post_id": 37400, "ts": "2026-07-30T02:48:14Z", "hours": 7.0306, "text": "Bugs + Fixes Hello everyone, I am getting very close to finishing Pirate Cats and will probably only work on it for a few more days (like until the 31st then ship on the first). I have big changes coming in after this ship. So today I will talk about to big progress and what I will be working on! The Game Tester So I had a game tester come and try my game, like obviously not everything is connected, but I had him try the individual scenes, and lets just say I was not happy. Before you guys all start talking about how I hired a Professional Game Tester with Money for a project for stardance, relax. The game tester is my friend, he has tested all my projects and lets just say, I am so glad he does. Anyways he found some bugs and it took a while to fix it (considering I was on a time crunch and had to go out somewhere today and the due date (the end ofthe month) is coming soon ). So first of all he tested the back ship scene which is the video linked, so what is supposed to happen when u click the cat, it is supposed to talk about either if you have completed the minigame \"Oh come eat supper again\" or if you havent \"Welcome, want to help me cook\" and then go to cooking mingame, but all this is set in one array of dialogue, and I call the dialogue from either number one or two and then I only make it go to the next dialogue if it is not one of the ending numbers for talking other wise I just make it not visible. The bug was that I needed an if statement that checked if it was an ending dialogue, and if not it goes to the next. This is the one of the least complex of problems, the second is with the digging scene. So the problem was after it started the dialogue explaining how to play, it went on one dialogue extra, I realized I had included one more so I just deleted that including code, this was the least of complex, but the third bug is massive. So the bug was after the cooking scene, once the dialogue finished (which is the tutorial) the user couldn’t play them selves. I slowly realized the problem was that it worked before and when I included the dialogue, it broke, since the tutorial completely changed how I had built it. So I had to go one by one and fix every little thing, first after you completed the tutorial, it automatically sends you back, but then you cant even get another plate, so I had to fix that, then once you get the plate I realized there was no order, then I made it so before you go back the order comes, then I realized after you got the plate nothing happens, its supposed to go to the next scene, then it went to the next scene which was getting the sand castle, which worked fine then it went to the scene to get toppings like the shell and flag and star, and that worked fine, then I went to the check scene, I realized there was no way to get back to use up the other plates. Then I fixed that, and when I went back, I realized the plate count never changed, for some reason in the code I was setting it back to 0, so it never changed how many plates the user did. So after I fixed this, I played it again, then I realized the second time you do it, the first times items that they picked were not visible and disabled, so in the reset code (after one full round) I made sure everything became visible and not disabled, then because of this I finally fixed it! Work I need to fix the star scene next, so it plays what happens before they go and after they get it right. My goal is to do as much hours as possible because I am trying to get the framework 13 in this ship, and hopefully this project will do it. After I do this ship I will work on a hard mode for this game, so if users want a challenge they shall get it. Anyways that is it for now, see you guys next devlog!"}, {"post_id": 36182, "ts": "2026-07-28T03:15:49Z", "hours": 5.3925, "text": "The Cats Can Now Talk? Hello everyone, it has been 4 days, and I have done a lot of work on the game for the past few days, and am getting very close to submitting it. So I have finished the last mini game, which is finding the treasure to save the cats (or aid them depending on how you take giving cats treats ) and now I have implemented the dialogue part such as the cats and you talking, and the map being found in most of the scenes. So without further to do lets get straight in it and talk about the minigame. Digging up treasure So right now I have made the basic part of the treasure scene, it still needs to be decorated and I need to push the borders out a little but to start its good. It will not be in the video posted but it will be tomorrow. So how it works is I have this scene called sand, it is an area 2d and everything is not visible besides the smallest hole and smalest pile of sand, and you can press the area 2d 3 times and it will have the medium pile and hole and large pile and hole. And in it, I have it calling functions from the main scene. So in the main scene I call the scene for every time the press a button (the whole screen consists of 6 buttons, if they dig fully and that button is the treasure one, then you get it for the cats) it mainly consists of buttons and randi functions and caling functions from two different scenes. Cats are Talking IF you want to see the desert scene or the cats talking you can see it on https://www.youtube.com/shorts/6k6MWErv86k , anyways the logic for this is we call next dialogue, and this checks the index and then adds one too it and goes to the next. Then if it is cat speaking, it waits for the user to press space (skip) then it adds one to the index and plays the next if it is the users turn to talk (the user can talk using a button they press) then they press a button and the text becomes the dialogue and then it adds one to its index and then plays the next. Then when the index is the second to last I stop it from playing anymore dialogue. Then when the user completes the task like sorting then it makes the map visible and then it plays the last dialogue (when they press the map because it is a button) and it says something like, THANK YOU SO MUCH FOR FINDING IT, PLEASE PUT THAT PIECE OF MAP ON THE CAPTAINS DESK then that will add, and once you have all the pieces you can put the map together. That is all I have to say, and I will do alot more in the next few days, as I need to finish up dialogue and work on the save, and global variables. But for now, bye guys!"}, {"post_id": 34058, "ts": "2026-07-24T14:49:39Z", "hours": 6.0272, "text": "The Minigames Are Coming To An End… Hello everyone, I have completed two more minigames for my game pirate cat, and only have one last game to create. I have been very productive, and learned how to code more efficiently, as I finished two minigames yesterday. Without further to do, lets get into the first minigame I finished. Scrubber Cat By the name you might get what the scrubber cat does, the scrubber cat is the cat/pirate that will be scrubbing and cleaning the decks/the ship. So for a minigame I have created one where you scrub the dirt to get rid. I still need to make the colors more vibrant but the logic is done, and I did have some few bugs but we will start about the game. So for the game, for each round there are a certain amount of stains. Each stain gets its own button and each button has mouse entered and mouse exited which goes to a variable. The variable is either false or true. So if mouse entered the variable is true otherwise it is false. Then in the beginning I call round 1, in round I check if the items are visible, then I check if the mouse entered is true and if the mouse is moving, because I have a variable called mose pos, and in the ready is set it to the mouse position, and then I compare it with the current mouse position when round 1 goes, then i set it to mose pos. Then if the mouse is moving, and the variable is true. The stain looses some of its visiblity, like its going away. I am going to find out how to make the cursor a scrubber, but for now its not. And the user will do this for 3 different round. Constellations So if you saw the video you might have saw the constellation game, I recommend you watch the video to understand what I say. So there are two different types of constellations, human constellations, and cat constellations. So the goal is the user to always pick the cat constellations. So there is 2 sides, one side is the cat and the other is the human, the sides will switch, and you have to pick the cat one, if you dont, that round restarts. I had so many bugs with this, and the main one wasthe timer. In godot I had no clue that you have to stop a timer after it timed out. This created a majority of the bugs. And since it was basically the same logic for most of it, I did copy and pasting and because of this I forgot to change some of the variables, so it did changes to things that did not need changes, and did not do changes to things that did changes. I am going to finish up this game soon and submit it. Bye guys!"}, {"post_id": 33306, "ts": "2026-07-23T03:10:54Z", "hours": 7.845, "text": "Powder Monkey (Major Bug Not Fixed) Hello guys, this devlog is going to be max characters and if its not I have so much to complain about… I have worked so long today and dont so much, and I think that everything I have done was very great. So without much to do lets get into todays progress. Before Powder Monkey Mini game So I am going to talk about what I did before I started the powder monkey minigame. So today, before I ate lunch I was working on other stuff, like not minigames but the travel, so now users can travel around the boat, to the parrot area (in the front), powder monkeys area (going to be discussed in todays devlog and its on the side) the back of the ship which has both the cooking cat, and also the fishing cat. And then there is one more side of the boat, which is the other side, side view 2 which has the scrubber cat (I am going to save the scrubber cat for tomorrow when I start working on him and his mini game). So now that I have explained what I spent the first 1 and a half hours on lets get into the Powder Monkey Minigame. The powder monkey minigame Okay guys now we are going to start talking about the powder monkey’s minigame. So if you see the video you might start to see where the video game is going. But if you don’t understand the video or have not seen the video (due to personal reasons) then let me explain. Ever see those fake mobile ads that don’t let you play the game but give you a preview? Well I am building that fake mobile ad, im not trying to say it’s fake, but this time you can actually now play the one level until you beat it. So the game is like you drag the different colored balls into the different beakers and try to get beakers with only one of the same colored balls. So I spent 5 hours creating the logic, then I realized i made the game wrong 😭 Then I had to get rid of this one part of a line in 45 lines, then I deleted it and then it didnt save and I had to redo it, and that took 30 minutes already, then redoing it made it an hour. So the line I said that I deleted checked if the when placing a ball (we will call the different objects you can move a ball) so when moving the balls i made it so you had to place it in either an empty beaker or ontop of a ball of the same type. I didnt know that it could be placed on different types. So then after deleting that line of code when running there are still some bugs here and there that dont allow one of the coconuts and one of the ballons to move. I have checked 2000 LINES OF CODE 15 TIMES, MAYBE MORE. And me not finding this bug is annoying because I still have to write the check feature. Anyways I will try to fix the bugs, but here is yesterdays video https://www.youtube.com/shorts/7UFbDQq-l0Q and by guys see you later!"}, {"post_id": 32344, "ts": "2026-07-21T13:34:14Z", "hours": 5.2003, "text": "You can Finally Fix the map Hello guys, we have spent another 5 hours on this game. I have got to say, I am starting to love this game. Day by day, the more I do the more I get drawn in. I have got to say at the beginning I didn’t really feel like doing this game. But now after I see everything I am amazed. As usual if you want to see yesterdays progress on the captains room you can see it on Vishy Labs or https://www.youtube.com/shorts/0w2feNxZQ5A The Map For the past few day’s I have been working on the map scene, if you see it, it may not look complicated but I have spent longer than the fishing minigame to create this, let me explain why. So there are 6 maps, and 6 panels. One panel for each map. If you place a map in the panel, either that is the right panel to place it in or the wrong one. There is over 40 variables for this scene, since there are 6 buttons, we have 6 of placed 1-6 and 6 of map 1-6, (now these are for dragging the maps) 6 offsets 1-6 6 dragging 1-6, 6 inzone 1-6 and for the panels 6 pan 1-6. So this makes it hard to keep track of all of them. And let me talk about the logic, so when you press a button like hold it down you have to change the position with the offset and the mouses position, but now we have to check if the piece of the map is intersecting with the panel, and if it is, which panel is it intersecting, then if there is already a panel there. And it gets ever more complicated, if there is a map intersecting or above 2 panels, then you have to subtract the values from all the panels and see which one is the closest from the center of the map, because in godot for some reason it likes putting its point in the top left. And I have made over 8 different functions not including the button up and down or godot made functions just for this. This has got to be one of the most complicated minigames yet but im glad I did it. We have function snap map which gets the center of the panel and places the center of the map there, and this only works if that panel doesn’t have a map and the map was placed there. We also have func_panel_taken you input the panel which in my case is closest because that is what I have put for the closest panel in the code, and you also input which map your moving, so it ignores that when it does the check for intersection. But the process_function is the most complicated to keep track of. Since it does 60 times per second, you have to make sure everything doesnt run more than once by having variables that become true when the condition is false. And you have to make sure what your doing is supposed to be checked, because if it is not and the values get changed, then you have to find a new way to implament it. If you guys saw the attachment I have showed a little of the sideview1 and I will get more into that tomorrow. Bye guys!"}, {"post_id": 31767, "ts": "2026-07-20T12:37:58Z", "hours": 3.7061, "text": "Captain’s Room + Ship Hello everyone I have done 7 hours yesterday and devloged 3 of them with the crabfight and the others hours now. I have been very productive and had a lot of progres on my game pirate cats. I have finished major parts of scenes. Captains Room First I would like to talk about the Captains Room, this is the first part of the video and you see a lot of things start to move when I put my mouse over them, that is the hover. You can do it with a button 2d with mouse entered and exited, in the start I had it as mouse entered meant animation played and mouse exited mean animation stopped on a button. and if you watched the video, you saw that my camera moved when the mouse was on the side of the view. To do this I used a camera, and put two button 2d’s on the edge, and I had mouse exited for the left side was left camera move = true and I set it false when it was exited, I did the same with the right side button and had a variable called right camera move = false . You might wonder how just having variables would move the camera, it doesn’t. In the process code (which runs 60 frames per second) there is this var delta, which means run at 60 frames per second. So for the camera to move left I did $Camera2D.global_position : Vector2 = -1 * Speed * Delta I could set speed to whatever I wanted such as 300 and then when it was for the right side I just switched -1 to 1. This was all working I had no bugs, but in the scene tree the camera is at the bottom. So the buttons are children of the camera, and there are other buttons above it such as the ones I use to hover. So when I was moving the camera my cursor landed on one of the other items that hover, and the camera stopped moving. It was very annoying and I didn’t know how to fix it. It turns out you can use area 2D’s they have a mouse entered, mouse exited, and a click function. The only difference is you can not see the area 2d’s like if you are putting an icon or text or style on the button like a panel you wont see it. But luckily for me I but the button over the assets. So this was a big problem I solved. Back of The Ship I have started working, just the back part. That is the second part of the video, when it goes to that new scene after pressing the arrow. I have the fisher and the cook there. So as you see the arrows are what guides the players, and there is a camera and some items to hover at the back of the ship and I am using area 2d’s. Game Information If you want to see my crab mini game in Pirate Cats, or previous history you can see it on Vishy Labs on Instagram https://www.youtube.com/shorts/dKRGESaI7ss I will continue working on the map part, where the user has to put the map together after getting all the pieces. See you guys later!"}, {"post_id": 31240, "ts": "2026-07-19T14:25:01Z", "hours": 7.3289, "text": "Crab Fight 🦀 Hello everyone it’s getting close to the day when I get to submit, Pirate Cats, and as usual if you want to view my game’s previous progress you can see it on youtube https://youtu.be/XgYkeBUyqbE?si=mVQkA0oVtBkzSB1x Well now I have currently finished the crab fight. I usually only devlog after the day is done, but for pirate cats I devlog when I finish one minigame, so now today I have finished the crab fight minigame, so I will be explaining all about it. I dont have the dialouge and the text or the home pages or settings done yet, but I will be submiting on the 30th. I think i might need to go back and fix the assets for some other items, as like the fishing game the place holders are still there and the cannon doesn’t really look like a cannon, but let’s get started and talk about my progress. Crabs So now it is time for me to talk on what I have been doing for the past 2 days, well I have been working on the actual minigame as always, if you watched the video and have any suggestions please comment it, I will take it into account! So for the crabs, there are 3 crabs, they dont really do anything just different colored hats for variety but what happens is that there are 3 groups, left right and middle, I do a randi function randi_range(1,2) if it is 1 the crabs in the first group are not part of the first round if it is 2 they are part of the first round. Then I do an function for each group and do an if statment to see which crab color should be visible then in that I do the calculations. Alright you might be wondering, what are the calculations? Well the calculations are how much the crab has to move each time. So I have to take account the height of the waves, how much room I have between waves, and how many times the crabs will pop up. So in the code I make the crab go up, then go down. I use the tween function to move the crab, since using an animation player and you can only run 1 animation at a time, it would be a pain to keep track of all the animation players, so I use tween as I have said before tween moves the item smootly so it is not teleporting. Then I do either of two things, one if the crab gets all the way to the bottom then the players screen flashes red, then it repeats the process. Cannon So in godot, you can add inputs, I added left, right, and space. So then in the code I did in the process, using direction and inputted left and right. The first one inputed is -1 second is 1 and if both or none is being pressed then direction is 0. This is built into godot so I got lucky, because it saved some time in the coding process. Then I have a speed, which I set to 200-300. Then in process I did ~$Cannon.global_position = direction * speed * delta` this makes it so that it moves every esecond something is being held down. Now that I have explained how the cannon is working I will explain how the cannon ball works. Cannon Ball So everyone, the cannon ball is a new scene, I can just call it every time and this makes it so I dont have to make alot of them, because I don’t know how many the user will use, so it would be hard to make so many. So in the new scene I have a panel on the cannon ball, as my other mini games. The panel on the crabs and the panel on the cannon ball interact, this happens when they are in direct contact, I check if that crab is visible, and then if that crab should be caught, it can only be caught if it is above the wave (if it is not above the wave then it is hiding but can still be triggered, not visible) then I make that group not visible, and do it for all the other crabs that got hit. I use tween to make the cannon move up by 300. The work I have done in the past few days were alot more complicated, but I will keep doing more, my goal is to reach 50 hours by the end of this month and submit. Thank you guys, if you want to see progress its Vishy Labs on both youtube and instagram. See you guys!"}, {"post_id": 30207, "ts": "2026-07-17T16:32:01Z", "hours": 2.5833, "text": "Parrot Feeding Time 🦜 Hello everyone it has been some time since I have posted a devlog, like 4 days but here I am with some exciting news to share. I have finished the parrot feeding scene and made the check feature for the cooking scene. If you want to see what I did it is on https://youtube.com/shorts/XgYkeBUyqbE?si=7PP_u8wK7GwFHCAd Parrot Scene For the parrot scene the user is supposed to feed the parrot cookies, because i dont really know anything more interesting if you guys do please tell me. So to feed the parrot cookies I have to make the cookies dragable so they can give it to the parrot, and doing this will play a cool extra animation of the parrot chewing. Since I already did the cooking scene making the dragging part was already really easy, since I just add a button and a panel. I told you guys last time what the button does it has the button up and down function so it can detect when the button is being held down and released and when the mouse is moving so I can drag the item. So then I have a panel on both the item and the parrot, and I check that when button is let go and they are making contact, then if they are it is not visible and the parrot chewing animation plays, and I did this for pretty much all of them. Cooking Scene So we did some more things for the cooking scene, so I was working on a check feature, then I was moving all my data to a new computer, and I accidently commited on both computers for same scene to github, and they both overrid eachother and all my progress was lost, then after spending some time researching I realized I can pull back commits by reverting and I got my progress on the checking part back. Then after this I checked if the items on the plate, and assigned each one to a variable, if it is visible or not then this variable is true or false, and i did that both for the order and the plate. The actual checking feature is it checks if both of the variables for the same item are the same then if they are the light for that item becomes visible, I show it in the video attached so if you want to see please watch. Future Steps So there are a few things I need to make and I need help from you guys, so what should the powder monkey do, and what should the captain do, it was thought that the map puzzle piece will just be in the captains poket, and users will have to set up the cannon for the pirate monkey, if you guys have anything else more interesting please share! Bye guys!"}, {"post_id": 28060, "ts": "2026-07-14T02:41:44Z", "hours": 5.6961, "text": "Cat Cooking Hello everyone, it might be a day or two since I have devloged, since I finished the fishing game mechanics, I wanted to take a short break and now I am back and starting the cooking minigame for the cook cat whose name is BISCUITS Thats right everybody, lets give it up for our cook cat buiscuits, and for the fisher cat, I forgot to put names back then, so his name is now Minnow If you guys have any suggestions for names I will take it in for my game! So without further to do, lets get into Pirate Cats, Cooking! (And if you wanted to see yesterdays progress you can view it on https://www.youtube.com/shorts/XgLbwD1cwBg ) Logic If you saw the video (I put the link above) I made it yesterday, which is when I made the logic. So for each item, like the cakes shown in yesterday’s video, or the plates, sand castles, and toppings shown in today’s video. They all have a base node of a Sprite. But you might be thinking \"How can a sprite 2D be draggable?\" Well to make this possible, we added a button and code, so the button takes up the whole sprite space (where ever you want the user to be able to click and let it drag the item). So you add a script to your base layer, keep in mind you can do this to anything by just adding a button and script to it. In my script I had an offset, the global position and the global mouse position. I made the offset 0,0, which is where the item or sprite in my case starts off (Im just going to start referring the item using sprite from now on). Then on the button, you don’t do a button pressed signal, you do a button down and button up signal (this is to imitate the button being held down and dragged). Then you create another variable which is dragging and if you want you can have can_drag. When button is down dragging = true and when it is up dragging = false. Then in the process you subtract the offset from the global position of the mouse and the global position. And for the items to make them visible on the plate I had a plate that had all the items already there, and a panel. Because an area 2d does not react with a panel, every draggable item had to have a panel, and in their process it had when their panel interacted with the other panel, it will check if they already have it, can they have it, and it will do it, this will make the items on the plate appear and the off plate draggable’s disapear. Appearence As I have already told you guys, we are using figma. It makes the art look way better than my pixel art for other games. I guess it is just your opinion/the person. Anyways I think it all looks way better. But one thing that really weighed me down is that im not getting much support on youtube and instagram for Vishy Labs for progress on my game, and I was even accused of having my game as a copy. So I am persevering and making this game better than any game out there. If you want to support me I am Vishy Labs on youtube and instagram. Stay tunned for more progress!"}, {"post_id": 26273, "ts": "2026-07-10T23:34:22Z", "hours": 6.0039, "text": "MAJOR FISHING UPDATES, READ NOW Hello everyone, today is the best day for me! So many things happened and I can’t wait to share it. So please watch the video added below because it is basically all I did today. If you would like to know what I did yesterday, im on Vishy Labs on Youtube and Instagram , with that said lets get into todays progress. Fishing Logic I basically am done with the fishing game, but there were major things in the logic that had to be changed, and I would like to talk about it. So first I have different rarity fish. At the beginning I just made it so it pulls a random fish, but that doesn’t really aid the term rarity, and in the last devlog I was talking about how a fish was chosen, by the randi function. So to actually turn it into a rarity I just made the randi range longer, from 1-3 to 1-7, so the first fish takes number 1 2 and 3, the second takes 4 and 5, the third takes 6, the golden takes 7. Alot of places in my code, I forgot to change it because in the original code I had made it so there were only 1-3 so then in the new code when a number past 3 came, it didn’t know what to do and it ended there. I would also like to learn about this new thing I learned, clamping. $Outside/Slider.position.x = clamp( $Outside/Slider.position.x, 0, $Outside.size.x - $Outside/Slider.size.x this is clamping. There are 3 inputs, value, minimum, and maximum. You might be wondering how did I use it in my game. Well for the slider, I need to make sure that the slider does not go past the barrier/border/past the edge of the outside panel. Because if it does, it decreases the value of the game (by the value I mean it doesn’t look good for the user). So I just made the value the position of the slider, and the minimum is 0 and the maximum is the big bar, subtract the slider size (all x values). This all makes it so the slider can not escape the barrier, because I am changing the position with tween, so it moves, and since the position is manually changed it doesn’t mean that it can have contact with the collision body. I would also like to take about tween. Tween is built in godot, and there are many ways to use it, I just used it so that when I change the position of the slider it is smooth and I do not have to use an animation player ( animation player would not work because then in is all predictable). So for the tween I put what I want to smooth, and what duration, and then in the code I set the distance. All theses little features is what makes my game look better and more playable. And that is it for the logic. Fishing Visuals If you saw the video, I think you will be very pleased with the visuals. All of this is being made in figma, as it is much easier to make than libre sprite. So the waves are just the waves from the first scene, but just stacked. Then the brown stuff is not a dock, it is the ship (like you are on the edge fishing). Then everything else is pretty much self explanatory. So to make it replaced from last time, the only thing I did was add a background, change the bobber, and scale the fishing line to be attached. And because of this, in my code I am resizing the button, so the user can not press on the dock when fishing but when clicking for the actual game part, they can. That is it for today, by tomorrow I am pretty sure the whole fishing mini game will be done, with the fish popping up with a banner, and I will most likely be starting the next game."}, {"post_id": 25612, "ts": "2026-07-10T00:03:03Z", "hours": 6.6575, "text": "Pirate Cats - Fishing Hello everyone, today was a big day, as you can see I spent over 6 hours again. I have alot to say, alot to announce, and a new limit for me while I also unbox new scenes. If you want to check out my progress you can see it on Vishy Labs , on Instagram or Youtube, https://www.youtube.com/channel/UCv318x8ryMI-l4kxYvwhLog Bugs Well since I just started there were not many bugs, but there was one very annoying one that bothered me so much. Everything in Godot was blurry. At first I thought it was because the assets were getting made small and imported, but that was not the case. Even after scaling the assets up by a lot and re-importing it and scaling it down, you can tell it was still very blurry. I thought all the settings were correct because I put the texture/render to linear, because it is not a pixel game, so linear is the right texture for our game. But it turns out it was the view port… I set it to view_port instead of canvas_items . View port is meant to match you screen size, while canvas items matches your godot size (how you import it, basically how you make the game, just keeping the same size), now that this bug is fixed (or should I say mystery solved) let me get into what progress I made today. Fishing Mini-Game So now it is time to get into our fishing mini game. If you saw the video you either might think, “wow that is hard to build” or “that looks so bad, what even is that”. Well if you were impressed, im just building a blue print, but if you thought it was bad, don’t worry, im just planning it out. You might wonder what it is or how it works. So this is a fishing mini game, the goal of this is to find the fish with the map, and use the map piece to get the final map which leads to the treassure (I covered this last devlog) if you want to know more on how my game will work, read my last devlog. Anyways, so in this game, the user is going to cast the rod (fishing line) and then have to wait for the fish to get hooked, and when it does, they have to beat the mini game. The minigame is hard to understand but if you watch the video it will make sense. So the mini game is that there is a slider, and it is moving, left (constantly) and you goal is to not let it stay out of the safe zone for too long, or let it touch the border once, if it does you lose that fish you will have to fish more, and that fish wont add to your stats (how many fish you fish). So basically what I did I made the whole screen a button, when the user clicks the screen they cast the rod, if they click again and there is no fish caught they reel the rod in (bring it back). If they catch a fish, there is a function, it is either the fish starts to jerk, or moves slowly. If the fish jerks it will make the bar move left 40 (different based on level of the fish) if it is slow moving or idling, then the bar moves 15 (might be different for the fish types). To make this look smooth, since I am not using an animation player, I am using the godot function tween, this allows it to move smoothly and not be rapid, making my game more like a game instead of a twitch. I am mainly using randi functions (randi functions are basically random functions, if you input items into them they will choose a random item from that list). So I am randomly choosing, the time the user waits, and if their fish will be jerking or idling at the moment. Now that I have explained this I want to talk about my save manager."}, {"post_id": 23834, "ts": "2026-07-07T00:32:57Z", "hours": 5.9386, "text": "Introducing Pirate Cats Hello everyone, I am officially introducing pirate cats. Pirate cats is a 2d game, including pirates and cats with the theme of summer. Users will be helping cats find their long lost tressure (Cats love this). I am of course making this game in godot, along side with pirate cats I am also working on a hack pad and I am having a lot of trouble, so this month we are staying motivated! This game is still being planned but currently I have thought out alot of it and came up with a detailed plan which is still a work in progress. Ideas There were a lot of ideas in circulation and I still might include them but here were the ideas Cat Dress up Previously for another hackclub event called flavortown I made a game called demegorgon dressup, it was ment for the new stranger things season and it went pretty well. I was planning on making it like you give cats different accessories and fufill customer orders and that was going to be a part of the game. Keep in mind, I was planning on making a large long game. Idea number two Icecream serving I was planning on making an ice cream serving game, because ice cream relates to summer and you would have a time limit and put certain toppings on a cone. That was also going to be another part of the game not a full game. Finally my last idea Treasure Finding What if there were cats which were actually pirates trying to find treasure. Pirate Cats Finding Treasure Now that we came to the present idea that is in making, I will explain how this game will function, and currently its core features. In this game, you are not a cat you are the human. The human’s goal is to find missing pieces of the treasure map, help them defeat raids and invasions, gain loyalty and trust (may be a sidequest) and read the ancient language (english) which only humans can understand. There are different types of cats, and you must help them solve their problem so they willingly offer you the piece of the map that they somehow have. Currently the cats are Captain, Fisher, Cook, Scrubber, and Powder Monkey. Game Introduction The game starts you off looking at a moving ship with a pirate cat logo. Then you meet the scrubber cat, and the powder monkey rats you off. This leads you to the captain, which explains their map problem and you agree to help. You must defeat the crabs, this will be done by blasting cannon balls at them, possibly destroying the ship. Then you have to help the scrubber cat scrub the deck, and that helps you get a piece of the map. For the powder monkey, it is still being decided how you get the piece of a map, either you will untangle the ropes of the cannon, or set fuse to the correct barrel, and the paper will be lodged inside. For the cook, you must creat sandcastles cakes and cookies. There will be a map piece hiding behind a dish. For the fisher, you will be on the plank fishing, when a fish pops up you have to click them, one of the fish will have a map inside them. Also if you get the golden fish, you gains cats loyalty. The captains part is still being thought of, and if you have any ideas, it would be good. The captains parrot also has a piece, it needs you to answer a question correctly, and feed it, to get the piece back. After putting the pieces on the table, the human which is you will have to make sense of the ancient text and unscrammble the map. This leads them to find the ancient treasure making the cats happy again. Game Progress I have done alot of work, I dont have much space left to talk about it, but currently I have had the parallax 2d backgrounds made, so it makes the background look more live when the ship is moving past. Also I was spending alot of time today on working with the animation player so that when the menu is open, it will be clear so you can see behind it and the ship will be moving. I have much more to say but I have reached the MAX CHARACTER LENGTH, so I will explain in next devlog, bye!"}]...
|
Title: Pirate Cats by @Vishy | Stardance
Devlogs: Title: Pirate Cats by @Vishy | Stardance
Devlogs:
Introducing Pirate Cats Hello everyone, I am officially introducing pirate cats. Pirate cats is a 2d game, including pirates and cats with the theme of summer. Users will be helping cats find their long lost tressure (Cats love this). I am of course making this game in godot, along side with pirate cats I am also working on a hack pad and I am having a lot of trouble, so this month we are staying motivated! This game is still being planned but currently I have thought out alot of it and came up with a detailed plan which is still a work in progress. Ideas There were a lot of ideas in circulation and I still might include them but here were the ideas Cat Dress up Previously for another hackclub event called flavortown I made a game called demegorgon dressup, it was ment for the new stranger things season and it went pretty well. I was planning on making it like you give cats different accessories and fufill customer orders and that was going to be a part of the game. Keep in mind, I was planning on making a large long game. Idea number two Icecream serving I was planning on making an ice cream serving game, because ice cream relates to summer and you would have a time limit and put certain toppings on a cone. That was also going to be another part of the game not a full game. Finally my last idea Treasure Finding What if there were cats which were actually pirates trying to find treasure. Pirate Cats Finding Treasure Now that we came to the present idea that is in making, I will explain how this game will function, and currently its core features. In this game, you are not a cat you are the human. The human’s goal is to find missing pieces of the treasure map, help them defeat raids and invasions, gain loyalty and trust (may be a sidequest) and read the ancient language (english) which only humans can understand. There are different types of cats, and you must help them solve their problem so they willingly offer you the piece of the map that they somehow have. Currently the cats are Captain, Fisher, Cook, Scrubber, and Powder Monkey. Game Introduction The game starts you off looking at a moving ship with a pirate cat logo. Then you meet the scrubber cat, and the powder monkey rats you off. This leads you to the captain, which explains their map problem and you agree to help. You must defeat the crabs, this will be done by blasting cannon balls at them, possibly destroying the ship. Then you have to help the scrubber cat scrub the deck, and that helps you get a piece of the map. For the powder monkey, it is still being decided how you get the piece of a map, either you will untangle the ropes of the cannon, or set fuse to the correct barrel, and the paper will be lodged inside. For the cook, you must creat sandcastles cakes and cookies. There will be a map piece hiding behind a dish. For the fisher, you will be on the plank fishing, when a fish pops up you have to click them, one of the fish will have a map inside them. Also if you get the golden fish, you gains cats loyalty. The captains part is still being thought of, and if you have any ideas, it would be good. The captains parrot also has a piece, it needs you to answer a question correctly, and feed it, to get the piece back. After putting the pieces on the table, the human which is you will have to make sense of the ancient text and unscrammble the map. This leads them to find the ancient treasure making the cats happy again. Game Progress I have done alot of work, I dont have much space left to talk about it, but currently I have had the parallax 2d backgrounds made, so it makes the background look more live when the ship is moving past. Also I was spending alot of time today on working with the animation player so that when the menu is open, it will be clear so you can see behind it and the ship will be moving. I have much more to say but I have reached the MAX CHARACTER LENGTH, so I will explain in next devlog, bye!
Pirate Cats - Fishing Hello everyone, today was a big day, as you can see I spent over 6 hours again. I have alot to say, alot to announce, and a new limit for me while I also unbox new scenes. If you want to check out my progress you can see it on Vishy Labs , on Instagram or Youtube, https://www.youtube.com/channel/UCv318x8ryMI-l4kxYvwhLog Bugs Well since I just started there were not many bugs, but there was one very annoying one that bothered me so much. Everything in Godot was blurry. At first I thought it was because the assets were getting made small and imported, but that was not the case. Even after scaling the assets up by a lot and re-importing it and scaling it down, you can tell it was still very blurry. I thought all the settings were correct because I put the texture/render to linear, because it is not a pixel game, so linear is the right texture for our game. But it turns out it was the view port… I set it to view_port instead of canvas_items . View port is meant to match you screen size, while canvas items matches your godot size (how you import it, basically how you make the game, just keeping the same size), now that this bug is fixed (or should I say mystery solved) let me get into what progress I made today. Fishing Mini-Game So now it is time to get into our fishing mini game. If you saw the video you either might think, “wow that is hard to build” or “that looks so bad, what even is that”. Well if you were impressed, im just building a blue print, but if you thought it was bad, don’t worry, im just planning it out. You might wonder what it is or how it works. So this is a fishing mini game, the goal of this is to find the fish with the map, and use the map piece to get the final map which leads to the treassure (I covered this last devlog) if you want to know more on how my game will work, read my last devlog. Anyways, so in this game, the user is going to cast the rod (fishing line) and then have to wait for the fish to get hooked, and when it does, they have to beat the mini game. The minigame is hard to understand but if you watch the video it will make sense. So the mini game is that there is a slider, and it is moving, left (constantly) and you goal is to not let it stay out of the safe zone for too long, or let it touch the border once, if it does you lose that fish you will have to fish more, and that fish wont add to your stats (how many fish you fish). So basically what I did I made the whole screen a button, when the user clicks the screen they cast the rod, if they click again and there is no fish caught they reel the rod in (bring it back). If they catch a fish, there is a function, it is either the fish starts to jerk, or moves slowly. If the fish jerks it will make the bar move left 40 (different based on level of the fish) if it is slow moving or idling, then the bar moves 15 (might be different for the fish types). To make this look smooth, since I am not using an animation player, I am using the godot function tween, this allows it to move smoothly and not be rapid, making my game more like a game instead of a twitch. I am mainly using randi functions (randi functions are basically random functions, if you input items into them they will choose a random item from that list). So I am randomly choosing, the time the user waits, and if their fish will be jerking or idling at the moment. Now that I have explained this I want to talk about my save manager.
MAJOR FISHING UPDATES, READ NOW Hello everyone, today is the best day for me! So many things happened and I can’t wait to share it. So please watch the video added below because it is basically all I did today. If you would like to know what I did yesterday, im on Vishy Labs on Youtube and Instagram , with that said lets get into todays progress. Fishing Logic I basically am done with the fishing game, but there were major things in the logic that had to be changed, and I would like to talk about it. So first I have different rarity fish. At the beginning I just made it so it pulls a random fish, but that doesn’t really aid the term rarity, and in the last devlog I was talking about how a fish was chosen, by the randi function. So to actually turn it into a rarity I just made the randi range longer, from 1-3 to 1-7, so the first fish takes number 1 2 and 3, the second takes 4 and 5, the third takes 6, the golden takes 7. Alot of places in my code, I forgot to change it because in the original code I had made it so there were only 1-3 so then in the new code when a number past 3 came, it didn’t know what to do and it ended there. I would also like to learn about this new thing I learned, clamping. $Outside/Slider.position.x = clamp( $Outside/Slider.position.x, 0, $Outside.size.x - $Outside/Slider.size.x this is clamping. There are 3 inputs, value, minimum, and maximum. You might be wondering how did I use it in my game. Well for the slider, I need to make sure that the slider does not go past the barrier/border/past the edge of the outside panel. Because if it does, it decreases the value of the game (by the value I mean it doesn’t look good for the user). So I just made the value the position of the slider, and the minimum is 0 and the maximum is the big bar, subtract the slider size (all x values). This all makes it so the slider can not escape the barrier, because I am changing the position with tween, so it moves, and since the position is manually changed it doesn’t mean that it can have contact with the collision body. I would also like to take about tween. Tween is built in godot, and there are many ways to use it, I just used it so that when I change the position of the slider it is smooth and I do not have to use an animation player ( animation player would not work because then in is all predictable). So for the tween I put what I want to smooth, and what duration, and then in the code I set the distance. All theses little features is what makes my game look better and more playable. And that is it for the logic. Fishing Visuals If you saw the video, I think you will be very pleased with the visuals. All of this is being made in figma, as it is much easier to make than libre sprite. So the waves are just the waves from the first scene, but just stacked. Then the brown stuff is not a dock, it is the ship (like you are on the edge fishing). Then everything else is pretty much self explanatory. So to make it replaced from last time, the only thing I did was add a background, change the bobber, and scale the fishing line to be attached. And because of this, in my code I am resizing the button, so the user can not press on the dock when fishing but when clicking for the actual game part, they can. That is it for today, by tomorrow I am pretty sure the whole fishing mini game will be done, with the fish popping up with a banner, and I will most likely be starting the next game.
Cat Cooking Hello everyone, it might be a day or two since I have devloged, since I finished the fishing game mechanics, I wanted to take a short break and now I am back and starting the cooking minigame for the cook cat whose name is BISCUITS Thats right everybody, lets give it up for our cook cat buiscuits, and for the fisher cat, I forgot to put names back then, so his name is now Minnow If you guys have any suggestions for names I will take it in for my game! So without further to do, lets get into Pirate Cats, Cooking! (And if you wanted to see yesterdays progress you can view it on https://www.youtube.com/shorts/XgLbwD1cwBg ) Logic If you saw the video (I put the link above) I made it yesterday, which is when I made the logic. So for each item, like the cakes shown in yesterday’s video, or the plates, sand castles, and toppings shown in today’s video. They all have a base node of a Sprite. But you might be thinking "How can a sprite 2D be draggable?" Well to make this possible, we added a button and code, so the button takes up the whole sprite space (where ever you want the user to be able to click and let it drag the item). So you add a script to your base layer, keep in mind you can do this to anything by just adding a button and script to it. In my script I had an offset, the global position and the global mouse position. I made the offset 0,0, which is where the item or sprite in my case starts off (Im just going to start referring the item using sprite from now on). Then on the button, you don’t do a button pressed signal, you do a button down and button up signal (this is to imitate the button being held down and dragged). Then you create another variable which is dragging and if you want you can have can_drag. When button is down dragging = true and when it is up dragging = false. Then in the process you subtract the offset from the global position of the mouse and the global position. And for the items to make them visible on the plate I had a plate that had all the items already there, and a panel. Because an area 2d does not react with a panel, every draggable item had to have a panel, and in their process it had when their panel interacted with the other panel, it will check if they already have it, can they have it, and it will do it, this will make the items on the plate appear and the off plate draggable’s disapear. Appearence As I have already told you guys, we are using figma. It makes the art look way better than my pixel art for other games. I guess it is just your opinion/the person. Anyways I think it all looks way better. But one thing that really weighed me down is that im not getting much support on youtube and instagram for Vishy Labs for progress on my game, and I was even accused of having my game as a copy. So I am persevering and making this game better than any game out there. If you want to support me I am Vishy Labs on youtube and instagram. Stay tunned for more progress!
Parrot Feeding Time 🦜 Hello everyone it has been some time since I have posted a devlog, like 4 days but here I am with some exciting news to share. I have finished the parrot feeding scene and made the check feature for the cooking scene. If you want to see what I did it is on https://youtube.com/shorts/XgYkeBUyqbE?si=7PP_u8wK7GwFHCAd Parrot Scene For the parrot scene the user is supposed to feed the parrot cookies, because i dont really know anything more interesting if you guys do please tell me. So to feed the parrot cookies I have to make the cookies dragable so they can give it to the parrot, and doing this will play a cool extra animation of the parrot chewing. Since I already did the cooking scene making the dragging part was already really easy, since I just add a button and a panel. I told you guys last time what the button does it has the button up and down function so it can detect when the button is being held down and released and when the mouse is moving so I can drag the item. So then I have a panel on both the item and the parrot, and I check that when button is let go and they are making contact, then if they are it is not visible and the parrot chewing animation plays, and I did this for pretty much all of them. Cooking Scene So we did some more things for the cooking scene, so I was working on a check feature, then I was moving all my data to a new computer, and I accidently commited on both computers for same scene to github, and they both overrid eachother and all my progress was lost, then after spending some time researching I realized I can pull back commits by reverting and I got my progress on the checking part back. Then after this I checked if the items on the plate, and assigned each one to a variable, if it is visible or not then this variable is true or false, and i did that both for the order and the plate. The actual checking feature is it checks if both of the variables for the same item are the same then if they are the light for that item becomes visible, I show it in the video attached so if you want to see please watch. Future Steps So there are a few things I need to make and I need help from you guys, so what should the powder monkey do, and what should the captain do, it was thought that the map puzzle piece will just be in the captains poket, and users will have to set up the cannon for the pirate monkey, if you guys have anything else more interesting please share! Bye guys!
Crab Fight 🦀 Hello everyone it’s getting close to the day when I get to submit, Pirate Cats, and as usual if you want to view my game’s previous progress you can see it on youtube https://youtu.be/XgYkeBUyqbE?si=mVQkA0oVtBkzSB1x Well now I have currently finished the crab fight. I usually only devlog after the day is done, but for pirate cats I devlog when I finish one minigame, so now today I have finished the crab fight minigame, so I will be explaining all about it. I dont have the dialouge and the text or the home pages or settings done yet, but I will be submiting on the 30th. I think i might need to go back and fix the assets for some other items, as like the fishing game the place holders are still there and the cannon doesn’t really look like a cannon, but let’s get started and talk about my progress. Crabs So now it is time for me to talk on what I have been doing for the past 2 days, well I have been working on the actual minigame as always, if you watched the video and have any suggestions please comment it, I will take it into account! So for the crabs, there are 3 crabs, they dont really do anything just different colored hats for variety but what happens is that there are 3 groups, left right and middle, I do a randi function randi_range(1,2) if it is 1 the crabs in the first group are not part of the first round if it is 2 they are part of the first round. Then I do an function for each group and do an if statment to see which crab color should be visible then in that I do the calculations. Alright you might be wondering, what are the calculations? Well the calculations are how much the crab has to move each time. So I have to take account the height of the waves, how much room I have between waves, and how many times the crabs will pop up. So in the code I make the crab go up, then go down. I use the tween function to move the crab, since using an animation player and you can only run 1 animation at a time, it would be a pain to keep track of all the animation players, so I use tween as I have said before tween moves the item smootly so it is not teleporting. Then I do either of two things, one if the crab gets all the way to the bottom then the players screen flashes red, then it repeats the process. Cannon So in godot, you can add inputs, I added left, right, and space. So then in the code I did in the process, using direction and inputted left and right. The first one inputed is -1 second is 1 and if both or none is being pressed then direction is 0. This is built into godot so I got lucky, because it saved some time in the coding process. Then I have a speed, which I set to 200-300. Then in process I did ~$Cannon.global_position = direction * speed * delta` this makes it so that it moves every esecond something is being held down. Now that I have explained how the cannon is working I will explain how the cannon ball works. Cannon Ball So everyone, the cannon ball is a new scene, I can just call it every time and this makes it so I dont have to make alot of them, because I don’t know how many the user will use, so it would be hard to make so many. So in the new scene I have a panel on the cannon ball, as my other mini games. The panel on the crabs and the panel on the cannon ball interact, this happens when they are in direct contact, I check if that crab is visible, and then if that crab should be caught, it can only be caught if it is above the wave (if it is not above the wave then it is hiding but can still be triggered, not visible) then I make that group not visible, and do it for all the other crabs that got hit. I use tween to make the cannon move up by 300. The work I have done in the past few days were alot more complicated, but I will keep doing more, my goal is to reach 50 hours by the end of this month and submit. Thank you guys, if you want to see progress its Vishy Labs on both youtube and instagram. See you guys!
Captain’s Room + Ship Hello everyone I have done 7 hours yesterday and devloged 3 of them with the crabfight and the others hours now. I have been very productive and had a lot of progres on my game pirate cats. I have finished major parts of scenes. Captains Room First I would like to talk about the Captains Room, this is the first part of the video and you see a lot of things start to move when I put my mouse over them, that is the hover. You can do it with a button 2d with mouse entered and exited, in the start I had it as mouse entered meant animation played and mouse exited mean animation stopped on a button. and if you watched the video, you saw that my camera moved when the mouse was on the side of the view. To do this I used a camera, and put two button 2d’s on the edge, and I had mouse exited for the left side was left camera move = true and I set it false when it was exited, I did the same with the right side button and had a variable called right camera move = false . You might wonder how just having variables would move the camera, it doesn’t. In the process code (which runs 60 frames per second) there is this var delta, which means run at 60 frames per second. So for the camera to move left I did $Camera2D.global_position : Vector2 = -1 * Speed * Delta I could set speed to whatever I wanted such as 300 and then when it was for the right side I just switched -1 to 1. This was all working I had no bugs, but in the scene tree the camera is at the bottom. So the buttons are children of the camera, and there are other buttons above it such as the ones I use to hover. So when I was moving the camera my cursor landed on one of the other items that hover, and the camera stopped moving. It was very annoying and I didn’t know how to fix it. It turns out you can use area 2D’s they have a mouse entered, mouse exited, and a click function. The only difference is you can not see the area 2d’s like if you are putting an icon or text or style on the button like a panel you wont see it. But luckily for me I but the button over the assets. So this was a big problem I solved. Back of The Ship I have started working, just the back part. That is the second part of the video, when it goes to that new scene after pressing the arrow. I have the fisher and the cook there. So as you see the arrows are what guides the players, and there is a camera and some items to hover at the back of the ship and I am using area 2d’s. Game Information If you want to see my crab mini game in Pirate Cats, or previous history you can see it on Vishy Labs on Instagram https://www.youtube.com/shorts/dKRGESaI7ss I will continue working on the map part, where the user has to put the map together after getting all the pieces. See you guys later!
You can Finally Fix the map Hello guys, we have spent another 5 hours on this game. I have got to say, I am starting to love this game. Day by day, the more I do the more I get drawn in. I have got to say at the beginning I didn’t really feel like doing this game. But now after I see everything I am amazed. As usual if you want to see yesterdays progress on the captains room you can see it on Vishy Labs or https://www.youtube.com/shorts/0w2feNxZQ5A The Map For the past few day’s I have been working on the map scene, if you see it, it may not look complicated but I have spent longer than the fishing minigame to create this, let me explain why. So there are 6 maps, and 6 panels. One panel for each map. If you place a map in the panel, either that is the right panel to place it in or the wrong one. There is over 40 variables for this scene, since there are 6 buttons, we have 6 of placed 1-6 and 6 of map 1-6, (now these are for dragging the maps) 6 offsets 1-6 6 dragging 1-6, 6 inzone 1-6 and for the panels 6 pan 1-6. So this makes it hard to keep track of all of them. And let me talk about the logic, so when you press a button like hold it down you have to change the position with the offset and the mouses position, but now we have to check if the piece of the map is intersecting with the panel, and if it is, which panel is it intersecting, then if there is already a panel there. And it gets ever more complicated, if there is a map intersecting or above 2 panels, then you have to subtract the values from all the panels and see which one is the closest from the center of the map, because in godot for some reason it likes putting its point in the top left. And I have made over 8 different functions not including the button up and down or godot made functions just for this. This has got to be one of the most complicated minigames yet but im glad I did it. We have function snap map which gets the center of the panel and places the center of the map there, and this only works if that panel doesn’t have a map and the map was placed there. We also have func_panel_taken you input the panel which in my case is closest because that is what I have put for the closest panel in the code, and you also input which map your moving, so it ignores that when it does the check for intersection. But the process_function is the most complicated to keep track of. Since it does 60 times per second, you have to make sure everything doesnt run more than once by having variables that become true when the condition is false. And you have to make sure what your doing is supposed to be checked, because if it is not and the values get changed, then you have to find a new way to implament it. If you guys saw the attachment I have showed a little of the sideview1 and I will get more into that tomorrow. Bye guys!
Powder Monkey (Major Bug Not Fixed) Hello guys, this devlog is going to be max characters and if its not I have so much to complain about… I have worked so long today and dont so much, and I think that everything I have done was very great. So without much to do lets get into todays progress. Before Powder Monkey Mini game So I am going to talk about what I did before I started the powder monkey minigame. So today, before I ate lunch I was working on other stuff, like not minigames but the travel, so now users can travel around the boat, to the parrot area (in the front), powder monkeys area (going to be discussed in todays devlog and its on the side) the back of the ship which has both the cooking cat, and also the fishing cat. And then there is one more side of the boat, which is the other side, side view 2 which has the scrubber cat (I am going to save the scrubber cat for tomorrow when I start working on him and his mini game). So now that I have explained what I spent the first 1 and a half hours on lets get into the Powder Monkey Minigame. The powder monkey minigame Okay guys now we are going to start talking about the powder monkey’s minigame. So if you see the video you might start to see where the video game is going. But if you don’t understand the video or have not seen the video (due to personal reasons) then let me explain. Ever see those fake mobile ads that don’t let you play the game but give you a preview? Well I am building that fake mobile ad, im not trying to say it’s fake, but this time you can actually now play the one level until you beat it. So the game is like you drag the different colored balls into the different beakers and try to get beakers with only one of the same colored balls. So I spent 5 hours creating the logic, then I realized i made the game wrong 😭 Then I had to get rid of this one part of a line in 45 lines, then I deleted it and then it didnt save and I had to redo it, and that took 30 minutes already, then redoing it made it an hour. So the line I said that I deleted checked if the when placing a ball (we will call the different objects you can move a ball) so when moving the balls i made it so you had to place it in either an empty beaker or ontop of a ball of the same type. I didnt know that it could be placed on different types. So then after deleting that line of code when running there are still some bugs here and there that dont allow one of the coconuts and one of the ballons to move. I have checked 2000 LINES OF CODE 15 TIMES, MAYBE MORE. And me not finding this bug is annoying because I still have to write the check feature. Anyways I will try to fix the bugs, but here is yesterdays video https://www.youtube.com/shorts/7UFbDQq-l0Q and by guys see you later!
The Minigames Are Coming To An End… Hello everyone, I have completed two more minigames for my game pirate cat, and only have one last game to create. I have been very productive, and learned how to code more efficiently, as I finished two minigames yesterday. Without further to do, lets get into the first minigame I finished. Scrubber Cat By the name you might get what the scrubber cat does, the scrubber cat is the cat/pirate that will be scrubbing and cleaning the decks/the ship. So for a minigame I have created one where you scrub the dirt to get rid. I still need to make the colors more vibrant but the logic is done, and I did have some few bugs but we will start about the game. So for the game, for each round there are a certain amount of stains. Each stain gets its own button and each button has mouse entered and mouse exited which goes to a variable. The variable is either false or true. So if mouse entered the variable is true otherwise it is false. Then in the beginning I call round 1, in round I check if the items are visible, then I check if the mouse entered is true and if the mouse is moving, because I have a variable called mose pos, and in the ready is set it to the mouse position, and then I compare it with the current mouse position when round 1 goes, then i set it to mose pos. Then if the mouse is moving, and the variable is true. The stain looses some of its visiblity, like its going away. I am going to find out how to make the cursor a scrubber, but for now its not. And the user will do this for 3 different round. Constellations So if you saw the video you might have saw the constellation game, I recommend you watch the video to understand what I say. So there are two different types of constellations, human constellations, and cat constellations. So the goal is the user to always pick the cat constellations. So there is 2 sides, one side is the cat and the other is the human, the sides will switch, and you have to pick the cat one, if you dont, that round restarts. I had so many bugs with this, and the main one wasthe timer. In godot I had no clue that you have to stop a timer after it timed out. This created a majority of the bugs. And since it was basically the same logic for most of it, I did copy and pasting and because of this I forgot to change some of the variables, so it did changes to things that did not need changes, and did not do changes to things that did changes. I am going to finish up this game soon and submit it. Bye guys!
The Cats Can Now Talk? Hello everyone, it has been 4 days, and I have done a lot of work on the game for the past few days, and am getting very close to submitting it. So I have finished the last mini game, which is finding the treasure to save the cats (or aid them depending on how you take giving cats treats ) and now I have implemented the dialogue part such as the cats and you talking, and the map being found in most of the scenes. So without further to do lets get straight in it and talk about the minigame. Digging up treasure So right now I have made the basic part of the treasure scene, it still needs to be decorated and I need to push the borders out a little but to start its good. It will not be in the video posted but it will be tomorrow. So how it works is I have this scene called sand, it is an area 2d and everything is not visible besides the smallest hole and smalest pile of sand, and you can press the area 2d 3 times and it will have the medium pile and hole and large pile and hole. And in it, I have it calling functions from the main scene. So in the main scene I call the scene for every time the press a button (the whole screen consists of 6 buttons, if they dig fully and that button is the treasure one, then you get it for the cats) it mainly consists of buttons and randi functions and caling functions from two different scenes. Cats are Talking IF you want to see the desert scene or the cats talking you can see it on https://www.youtube.com/shorts/6k6MWErv86k , anyways the logic for this is we call next dialogue, and this checks the index and then adds one too it and goes to the next. Then if it is cat speaking, it waits for the user to press space (skip) then it adds one to the index and plays the next if it is the users turn to talk (the user can talk using a button they press) then they press a button and the text becomes the dialogue and then it adds one to its index and then plays the next. Then when the index is the second to last I stop it from playing anymore dialogue. Then when the user completes the task like sorting then it makes the map visible and then it plays the last dialogue (when they press the map because it is a button) and it says something like, THANK YOU SO MUCH FOR FINDING IT, PLEASE PUT THAT PIECE OF MAP ON THE CAPTAINS DESK then that will add, and once you have all the pieces you can put the map together. That is all I have to say, and I will do alot more in the next few days, as I need to finish up dialogue and work on the save, and global variables. But for now, bye guys!
Bugs + Fixes Hello everyone, I am getting very close to finishing Pirate Cats and will probably only work on it for a few more days (like until the 31st then ship on the first). I have big changes coming in after this ship. So today I will talk about to big progress and what I will be working on! The Game Tester So I had a game tester come and try my game, like obviously not everything is connected, but I had him try the individual scenes, and lets just say I was not happy. Before you guys all start talking about how I hired a Professional Game Tester with Money for a project for stardance, relax. The game tester is my friend, he has tested all my projects and lets just say, I am so glad he does. Anyways he found some bugs and it took a while to fix it (considering I was on a time crunch and had to go out somewhere today and the due date (the end ofthe month) is coming soon ). So first of all he tested the back ship scene which is the video linked, so what is supposed to happen when u click the cat, it is supposed to talk about either if you have completed the minigame "Oh come eat supper again" or if you havent "Welcome, want to help me cook" and then go to cooking mingame, but all this is set in one array of dialogue, and I call the dialogue from either number one or two and then I only make it go to the next dialogue if it is not one of the ending numbers for talking other wise I just make it not visible. The bug was that I needed an if statement that checked if it was an ending dialogue, and if not it goes to the next. This is the one of the least complex of problems, the second is with the digging scene. So the problem was after it started the dialogue explaining how to play, it went on one dialogue extra, I realized I had included one more so I just deleted that including code, this was the least of complex, but the third bug is massive. So the bug was after the cooking scene, once the dialogue finished (which is the tutorial) the user couldn’t play them selves. I slowly realized the problem was that it worked before and when I included the dialogue, it broke, since the tutorial completely changed how I had built it. So I had to go one by one and fix every little thing, first after you completed the tutorial, it automatically sends you back, but then you cant even get another plate, so I had to fix that, then once you get the plate I realized there was no order, then I made it so before you go back the order comes, then I realized after you got the plate nothing happens, its supposed to go to the next scene, then it went to the next scene which was getting the sand castle, which worked fine then it went to the scene to get toppings like the shell and flag and star, and that worked fine, then I went to the check scene, I realized there was no way to get back to use up the other plates. Then I fixed that, and when I went back, I realized the plate count never changed, for some reason in the code I was setting it back to 0, so it never changed how many plates the user did. So after I fixed this, I played it again, then I realized the second time you do it, the first times items that they picked were not visible and disabled, so in the reset code (after one full round) I made sure everything became visible and not disabled, then because of this I finally fixed it! Work I need to fix the star scene next, so it plays what happens before they go and after they get it right. My goal is to do as much hours as possible because I am trying to get the framework 13 in this ship, and hopefully this project will do it. After I do this ship I will work on a hard mode for this game, so if users want a challenge they shall get it. Anyways that is it for now, see you guys next devlog!
Finishing Touches (Saving Special ✨) Hello everyone, I am getting close to shipping this project and I have done the finishing touches today which is so much, and I just have to get my fellow game testers up and test the game for any bugs or anything. I know there are a few here and there, but I should have fixed them when I started, doing it now will be too much, and I will fix it in the second ship. So without further to do lets get straight into it. Loading Scenes The loading scenes are the guide scene, preference scene, and the loading part itself. So now in the preference scene there are volume sliders for the different things like sfx, audio in general and bg music. And there is also a slider for the speed on how fast the text goes by, since you can not skip it i thought "SHould it not be useful to just have a speed, so fast and slow readers can adjust it to make it feel more like a game? So then I added a slider, all the settings are saved I think, but since this is just finishing the logic and not the testing part I will not know for a fact. Overall the ui looks great, and mainly for the save manager, I was working on connecting the variables throughout the different scenes, and when they load a game, based on where they are in the game (like progress wise) then it will put them in the corresponding scene, this was not hard but I kept on forgetting what to add until I started wroking on a different scene. Other Fixes So one major bug I had was previously when I was working on the map scene, I thought I saved the progress but I didn’t and then I committed and all my progress was gone, so I had to spend some time today fixing all the bugs there, and then some of the dialogue in that scene, I thought for some reason was inputted incorrectly, then I proceeded to re fix the whole structure adding lines to the dialogue and then I realized it was wrong and had to put it back, since changing dialogue doesnt sound like a big deal, you have to understand, I changed all the variables because of that. Anyways that was the last thing I did today but lets talk about some other progress I did today. Audio The audio for the game was all recorded today, and everything is handmade (like in the meaning that it is not taken from somewhere else) the only thing that is going to be used for the game that is not handmade, is the background music (im not a good artist, but I am a musician so I am sure I can learn how to do it) and also the fonts, the fonts used for this game look amazing, and I will use it again for all my other games. After making the audio I had to implement it everywhere such as keyboard noise for the letters typing on the screen. Or the crabs moving, or the sponge scrubbing, or the cannons firing going like "Boom Boom" and other stuff. Anyways that summarizes most of the things I have done today, and tomorrow I will official test the game and get ready to ship, bye guys!
Finishing Touches Hello everyone we have finally finished Pirate Cats. After weeks of coding, building and testing, we have finally come up with a playable version. In this version everything is finished, but there is only one mode. So as this is the last devlog for this ship let me explain what I have done this time. Bugs After game testing we found some bugs out like there was no music for the cooking puzzle, or the sponge was not visible for the sponge scene, or the button in the island was not working, or the typing settings broke down. So let me start each of the bugs and how I fixed this (all these bugs came up yesterday as I only post a devlog once a day). So first the cooking music puzzle, I forgot to play it in the code, this was a simple fix but the other ones were not. For the scrubbing scene the sponge was not visible, in the code again I forgot to set it to visible but then I found another bug from fixing one it was that I need to turn it back after the scene otherwise it will always stay like that. So I figured out you have to set the cursor to null, that way it doesn’t put a preloaded asset and just has the normal one. This next one was tricky, on the island minigame where you are digging after you finish digging, sometimes you can not press certain parts of the button (to finish the dialogue and go to the end scene) I was so confused on what to problem was, then after some time I realized it only happened because I was initiating a scene, and I thought that it was over it, so I set some of the items including the buttons z index near 1000, because there was only going to be like 100 of the items. So then I thought the button for the sand was over, but it was not and I disabled it after the treasure was found, so I was so confused, then I realized there was a panel in the scene being initiated. So then I finally thought dont panels take the mouse input? And that was when I realized that I had a random panel there stealing the mouse, so i set the mouse input on it to pass, so it can not take it. Finally the typing settings. I learned how to use sliders, but there was one thing I could not figure out, how to flip a slider, so for the text slider, it was fast (the bottom one) to slow (the top one) instead of slow to fast as a slider should be, but then when assigning the value I put a - infront of it, I thought this fixed it because when I went in the speed was on the slower side but max speed. Then I tested it, and I could not change the speed, the problem was when you do - it puts the lowest setting meaning it can not be put to the highest, so I had to put it back and I still don not know how to flip a slider, but that is for next ship. See you guys!
Recommended Fixes Hello everyone I just recently shipped and I was really happy with the votes I got so thank you to everyone that supported me but with all the suggestions you guys gave and some of mine that I knew i had to do, I have fixed up the game. Before I get started the godot wakatime extention is broken so now I have to use lapse which makes it harder for me because I have to do the whole recording in one sitting and I cant do some work close it and continue. The video attached includes a few of the fixes and I will start using paragraphs in my writing. But without further to do lets get started. List Of Fixes With all you guys said I have made a list of fixes such as during the cooking scene it was not clear what to do after you made a plate so at the end of the training round I added a arrow so that users can try it before they are on their own. Second There is this flag in the powder monkey’s area, which is side ship view 1. When the flag raises its fine but it does some bugs when coming back down and the way I structured it was weird so I deleted all the code and had a area 2d mouse enter and exit, and I start the animation one 1 speed when they hover over it and when they let go I put it on -1 speed and play it. This makes it look like you are raising the flag and when you stop it goes down. Another thing was all the shells in that scene were blurry. I forgot what did but in figma I think the items were way to small so when scaling up t was very blurry. Also for the space star scene when the user gets it wrong the dialogue for it says that they found the island but then says they should set sail tomorrow, I had the order of items wrong so I flipped them (in the dialogue) and made it stop 1 line earlier in the code. Also after the user gets 3 constellations correct to go to the island it goes to the scene fades in and out then next scene then fades in and out and same for third scene. The problem was that it was making things visible after the fade out finished, it should have been doing it when fade in was done so when fade out was done like you were traveling. Skip text!!! I know this is a big one, so I added it, so I had a line of code that was like if event.is_action_pressed("ui_accept") and !typing: So I just flipped it so that when the dialogue is playing and if they call it it makes a variable true, and in the code where it is playing the text out (its a for loop) I break the for loop and make the ammount of characters visible the ammount of characters there are. Then I also made all the text that says space to continue, to space to skip. This one I did most recently but it was with the crabs, I added a randomizer for the audio so when they shoot the cannons, I just made a randi for -0.1 - 0.1 and added it to the pitch of 1 to the audio stream player so it was random. I also made a new scene for the explosion boom like visual effect and made it fade in and out. I have also commented all the code to make it easier for you guys to understand! That is all I have done and will always be looking for more suggestions to do more work, thank you and hope yall enjoy!
Captains Secret??? I designeed the figma cat for the captain, along with the frame, then implemented the photo/frame in godot behind the chair in the captains room. This is a relatively short devlog as it is just one added feature that I think makes the game cooler. Figma For the figma first we start off with creating the cat, it is the same as usual, I don’t use the pen tool because it is very unconsistent, anyways we start with the head then the body then add legs, one thing about figma is they dont have vertical and horizontal align just horizontal with items, they should have an option to enable a grid. Anyways for the secret I figured I would make it contrast the captain ( we are talking about the cat) the captain has textured and not very furry fur, but I made this cat have furry skin/fur, and not textured, and kind of short/tall (depending on which cat you are comparing it to). Anyways I used the Pen tool to create the frame as it is easier and faster, even though the alignment is not perfect, it is hard to see just from the human eye, Godot To input this in godot we have to get the image, so we upload it into the file system then I had to re export the chair (seperatley) so I could have it like the photo is behind the chair and the user can press the photo (only the part sticking out) then the captains text plays. This is like a secret and for you guys to find out, so good luck and go try it out!
Ships:
Welcome to my ship of Pirate Cats. Pirate Cats is a 2d godot interactive game using point and click and other buttons such as arrow keys and space. This was the most complex game I have ever built and I have learned so much from it. This game has taken me over a month to build and I am so proud of my self. From learning that there are other ways to create assets (like figma) to how to create save manager (saving the users progress) this was a very fun game to build. Building this game was not so easy, as it required alot of logic, and some of that was repeating so I had to keep rechecking it. Also there were some items I did not know how to use so I had to do research. As this game is only a point and click I am sure you guys will find it entertaining, as I spent a long time on making this good. After building a game so long, and finishing, I realized I want to expand on this! So this is version one where I have your guys feedback! So I can improve my game and add a hard mode where you have lives and other suggestions you guys have. This game has tested my patience as I have spent countless nights coding and building this game from scratch. I have learned so many things that I previously did not know. I didnt know a panel takes mouse input or that there were sliders, those were the easy things to conquer. But items such as creating a full on working save manager took some time to understand, or creating a full fishing minigame, with different sounds and other cool features. I am sure you guys will love what I have put into this game. It also makes me want to learn how to use figma more. From playing minigames on the ship, to steering a ship, to helping the cats escape from crabs, this game has great variety. So who is ready to help the cats (and of course a parrot) and find their treasure!
Second Ship for Pirate Cats. In this ship there have been many changes to the games. Some changes include making instructions/tasks clearer, many visual changes, and easter eggs/new features. Many of you guys said the instructions were not clear so I spent a lot of time going through to fix it, and made it more clearer here and there. Also you guys said to put space to skip, so I added that now you can just zoom through the text (if you please). There were not any bugs but some items that were not connected allowing you to not see the bubbles, making some visual fixes like the shells was so blurry and there were some fade in’s coming in really early. Then I added some easter eggs and new dialogue for you guys to find. I hope you guys enjoy the new and improved version!...
|
1792997370.6715546
|
1793083770.6715546
|
|
1327
|
Cirqmon by @itsdecodeaditya | Stardance
|
itsdecodeaditya
|
1
|
85.0
|
1594
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T21:50:13Z", "hours": 85.0, "multiplier": 19.19, "payout": 1594, "blessing": "neutral", "text": "Cirqmon is a quantum computing circuit builder on web and It’s idea was like when I used to go on tools like IBM’s or other quantum circuit simulators they used to feel like so dry and academic, So I thought why don’t I make one that’s colorful, looks like game because I guess learning deep tech should not mean that you lose colors. Earlier I thought I would just build UI layer on top of Qiskit via Python API, then I thought what will I learn and from a quite a long time I wanted to build something that involves maths and physics so i thought I should build whole thing by myself. The whole thing was Actually a bit challenging on understanding how Q spheres or Tensors or how bitwise calculations work, aligning it will a Good UI theme, So I just learned and build. sometimes I thought How will i finish or how will I map that understanding into code But I guess AI as a Teacher helped me a lot. For Others to try it you should know about Quantum Gates, read the Readme once and I guess you will understand the project.", "repo": "https://github.com/decodeaditya/cirqmon/", "demo": "https://cirqmon.vercel.app/"}]...
|
[{"post_id": 71464, "ts": "202 [{"post_id": 71464, "ts": "2026-09-20T21:31:02Z", "hours": 2.8469, "text": "Cirqmon Devlog #12 So I guess it’s final Devlog. Here firstly I updated Readme with new UI based snapshots. Made custom Alert box so it matches the theme instead of browser native alert box. Fixed bug in which earlier the gates were being added in circuit without checking if that Block is being used by other gate and its corresponding qubits. I hope if I don’t get a new problem to fix I will ship it;"}, {"post_id": 71194, "ts": "2026-09-20T12:52:50Z", "hours": 8.1419, "text": "Cirqmon Devlog #11 So Guys, I have finally finalized the Cirqmon Playground UI. I replaced the old glassmorphism theme with a rougher, more irregular visual style. Earlier I got feedback that, the old layout felt cluttered because the quantum gates were spread far apart and Due to Space Background and glassmorphism, it looked like Vibe coded. I have now grouped all the gates together in one place to make the interface cleaner and easier to navigate. Here Is what I changed: Removed the Home button. Clicking the Cirqmon logo now takes gets back to the home page. Updated Playground icons with Animal GIFs to give it more lively and engaging appearance. As mentioned above, reduced the use of glassmorphism to due to flickering issues and implemented like hand drawn solid color based UI. Attaching a video Snapshot so you can see changes made. also, The README is the only major task left. Once that’s finished, I’ll be ready to ship the project!"}, {"post_id": 66582, "ts": "2026-09-12T12:50:46Z", "hours": 8.0617, "text": "Cirqmon Devlog #10 Every time I think My project is ready to ship I find something missing and then it gets delayed. After I finished the blog on Deutsch Jozsa algorithm the project worked, as it needed only Single and Double qubit gate. When I started writing about Grover’s algorithm I realized the need of Three Qubit gate too as it needed CCZ gate to flip the phase to achieve 111 State. So I had to fix that. Here is what I did: Firstly as I told earlier I added the 3 Qubit gate feature, the underlying simulator code is working as old Inflating the Matrix approach, I only had to make it work for 3 Qubit gates. Secondly once I was on huddle where we were discussing about Boba bash, I presented the project to people and some said like ’it looks like too stuffed or some said it looked vibe coded. So I thought its a good feedback to work on. Then I improvised the Homepage so it feels like Apple like minimal theme while maintaining game feel. I also added the Background video instead of static image. Thirdly the blog page was pending so I made blog page with similar theme as I updated along with a option to search among the medium posts. So this was what I updated in this Version and now I needs that code review and matching the theme on Playground too. Just Hope I don’t get stuck this time and wrap it up. Thanks for Reading!"}, {"post_id": 46862, "ts": "2026-08-14T12:20:36Z", "hours": 6.1919, "text": "Cirqmon #Devlog 9 This version is more of testing, I thought that I should write blogs and use examples using Cirqmon, So Written 2 blogs on Quantum computing for Beginners and Deutsch Joza algorithm. While writing it I thought I should Show them on Cirqmon Hompage too, earlier I thought I would replace blogs part in Homepage with Just a medium link of mine, but later when I read on internet that medium allows to see RSS version of Blogs so I parsed RSS to JSON and fetched Blogs related Quantum Computing. Along with it, made Qubits limits to 8 and steps to 24 and made a centralized Config file to control parameters from there. Added a Toggle so People can switch indentation of Qubit states either Big endian or Little Endian. Updated Homepage button with Pikachu Button I found while explore on UI verse, also added link to Readme guide. Now After writing Blogs I am getting surge of confidence inside that I understood Quantum Computing more Better. One of topics I am curious about is Cybersecurity and one of Algorithm that challenges classical Approaches like RSA is Shor’s Algorithm so next I am going to explore it, Also along with all these, I have updated Some images in readme too and going to Push updates, so do Share Feedbacks."}, {"post_id": 43067, "ts": "2026-08-08T04:03:36Z", "hours": 3.9364, "text": "Cirqmon #Devlog 8 Actually I was telling my friend about project, and I realized that the Project should have better readme that tells about features, Examples, and Tour. Also added HSL wheel in Q sphere so People can Use it as a reference. Initially its faded, you hover it and it gets Visible. Also the Latest version is now Live with multi qubit gates."}, {"post_id": 41965, "ts": "2026-08-06T14:25:38Z", "hours": 8.0969, "text": "Cirqmon Devlog #7 So, I am posting this Devlog after interval of Almost 20 days since last Posted. Why delay? During this time I learnt a Lot about Quantum computing. Infact, I was planning to ship the Project with Single qubit gates only, but after I joined Qiskit Global Summer School, then I realised that main game in Quantum computing is about entanglement, that comes with multi Qubit gates like CX, CZ, SWAP etc. The Media attached is Demo is of a GHZ circuit is made by combination of H gate and CNOT gates. Basically a GHZ state is larger version of Bell state. For N qubits, only two possible states shows Up with equal probability i.e 1/root2 (000…n + 111…n). So here is What I made Changes and How : 1) 2 Qubit Gates Implementation - So Earlier Version was for Only 1 Qubit Gates, and it used Tensor product. Where it used to tensor Each step and then Multiply each step to StateVector in successive manner. But for 2 Qubit gates, tensor method gets problematic because multi qubit gates need to have dependence on other qubits too, meanwhile tensor assumes every gate on that step is independent and it builds large matrix. This loses dependence and relation as demanded by multi qubit gates. So then I got to know of approach called Embedding or Inflation where we first create Temporary matrix of 2^n rows and 2^n Columns with each entry initially as 0, then we start looping through columns of that Matrix (which represent possibility, like iteration for 0 is actually 00 in binary) and then, matching it with rows and columns in Gate matrix, after that we force the bit in Temporary Matrix’s respective column and row to align with what Gate’s matrix bit has? Either 0 or 1. Finally we get Result of application in that Temporary matrix which we multiply with StateVector later on. That’s how This Inflation Approach works. 2) Applied Phase angle Indicator Now, Quantum State’s node’s color in Q sphere shows its phase Angle, which can be from PI to -PI, calculated using formula tan2a(y,x) , then we constraint it from 0 to 2PI, later convert to degrees, then feeding that value as HUE value in HSL colour format keeping lightness as 50% and Saturation 100% and then it corresponds to Phase Angle with color that degree, like 0deg is red, 90deg is green etc. So this was Major Changes I did along with some Style changes and Minor error fixing that appeared during changing the Simulator’s Approach. And to be very Honest at when I started to Write code for 2 qubit Gates, I earlier thought I would Do something that I dont have to change Simulator, but those were still just making me cry. So finally I gone to AI to learn and for almost 2 days new experiments were going out of head and that way almost I wasted Hours and then to experiment more and Stop Tracking Hackatime since I knew It would track more hours for Experiments too, So I coded in Cursor (Without Any AI, Just as Other Editor) Untracked. At the End it worked :) Now Finally Majority part is Done, after few More Edits, Will Ship it soon!"}, {"post_id": 28525, "ts": "2026-07-14T20:44:03Z", "hours": 7.3483, "text": "Devlog #6 :) So Hey People, I am feeling Immensely satisfied that Q Sphere feature is Mostly done. Also the GateWiki part is also done that tells You about Gate you Clicked on Gates Tray, again to tell you can drag gates into Circuit to build and Tap to know about it . May be I also link blogs on that Later. Now about Q Sphere Part Okay , Now let me share about Making of Q Sphere Part , So earlier I was not able to visualize it, but somehow I got to Know about Spherical Coordinates which is dependent on: theta : angle of Line from Z Axis phi : angle of Line from x Axis But clicked finally after frustration of not understanding it earlier. Then I gone to Google searching to see 3d visuals and AI to understand how we calculate those angles: So - Based on hamming weights (Means how many 1s in that State, Suppose in |01> has 1 1s and 011 have 2 1s ) and total qubits which help us find theta and divide sphere into sort of rings for similar nodes/lines of same hamming weights in same ring. Then we find how we calculate phi based on total active states in each ring and slicing ring into same proportion. I don’t know why but that was a finally a kick for me :) Finally since you will plot lines and nodes on spherical surface you have to convert theta and phi to coordinates [x, y, z] which you do using polar coordinates . Then after plotting them, a major part of Q sphere is made. now as you can see on 2nd screenshot left side the Sphere shows nodes for respective State. more chances of being 0 is on upper half and more 1 chance on bottom half. Structured the folders Also I worked on code Structure to keep all algos separated: To parse stateVectors Parse the frontend data to json circuit instructions Making all q sphere data from stateVectors parsing Code to export in Qiskit. more such functions too.. So yeah that was work I did, little more things is needed to build, after that project is done. Adding some multi qubit gates is next important thing now. I would be pushing on Github this Version and Vercel too now. Go check it out. Namaste!!!"}, {"post_id": 27203, "ts": "2026-07-12T15:29:23Z", "hours": 8.8928, "text": "Devlog #5 :) To be very honest I forget that its 8 hours 47 minutes in hackatime and it didn’t posted devlog until I got a Notification on slack. Sooo Guys! In this part of work I had to decide a thing that should I add Visualization of Qubits or not and then I realized that’s the whole point of project [to let people easily visualize whats happening]. So thats why I have decided add Q sphere . Folder Structure First of all I realized that my project was using url images and project structure was actually messing up as files and folders were increasing, so I decided to first organise the chaos and downloading all internet 3d assets in project. [Screenshot -1]. Because without a better organization of project it would get intimidatingly hard for others to contribute. Big Endian vs Little Endian Now second part is making the Result page of Qubit execution match that 3d glassmorphism design and white browsing through IBM composer (Tool for making Circuits) I got to observe that states were actually reverse in order. Suppose you applied hadamard gate to first qubit in 2 qubit system so instead of showing Probabilities of states as |00> = 50% , |01> = 0 , |10> = 50% , |11> = 0 , it reversed for 01 and 10. So after reading on internet about this I got to know that both ways are right and just differs because order you calcuate tensors: G1 * G2 * G3.. gives you Big Endian Version which considers least qubit as important Vice versa in case of Little Endian as IBM uses. So I implemented both in project. Earlier I thought I broke a physics Law [haha.] Making Q Sphere Its for Q sphere [2nd screenshot], that’s what help you understand statevector, because we can’t imagine more than 3D, so IBM come with this method. Basically I have used react 3 fiber that helps us write Three.js in react easily, using JSX instead of js manually, and it shows 3 lines in space which represent each state in vector: Bigger the node on top, bigger its probability . Color tells phase angle from origin. More 0 probability the vector will be pointing on upper hemisphere’s top and similarly more 1 will point on bottom of lower hemisphere. I am still processing [x,y,z] coordinates of line. Q sphere now shows random plots, I have to parse state vector to correct representation, will tell you about it in next devlog after I have learnt and implemented this. Screen Restrictions Forth is more of usability, side by side you can see either, code and graph or sphere and graph , so understand better. Also I added a screen restrictor for small screens since running this project on phone won’t be possible because design clutterness (forget to add screenshot, but you can check live). So hope you liked this version, I know it’s too much of quantum but yeah like others I am also trying to understand better. At Last, don’t forget to check attachments and share your feedbacks. Also I think I would be pushing on github now before developing futher. Namaste!!!"}, {"post_id": 26000, "ts": "2026-07-10T15:38:00Z", "hours": 5.5644, "text": "Devlog #4 This Part was all about making Navigation work between pages and since last time I got some feedbacks that Home and Playground VIbe Don’t match so made Playground more 3d. Here are Changes - Using react router, Made Navigation between Home and Playground and Vice versa. Used 3d Resources like Background images, Button images to make it look 3d Videogame. Added button animations like some changes images, some spins. Improved qubit adjust box. Added tooltip component so people know what buttons does what, since buttons are image based. So, I have tried to make project look 3d Glassmorphism and minimal too. check out video attached to see progress till now ."}, {"post_id": 25463, "ts": "2026-07-09T19:03:49Z", "hours": 7.8494, "text": "#Devlog 3 Made Homepage for Cirqmon because I wanted to Put Medium blogs and Tool at one place so this will act as Entry door easily. Experimented with designs, fonts and images to make it feel like 3d Cartoon themed. Following things made - At first “what is does” Hero Section telling people that its a Colorful way to play and learn to make Quantum Circuits. Actually in hero section I have experimented with 3d images animations but it looked distracting UI so Removed it. but Kept H and Y gates to give a idea of Builder. Blogs Section is where it will fetch Quantum related Blogs from Medium (will write soon). Don’t forget to notice that Astronaut. Data is dummy. the Boxes use Backdrop transparent design to match with 3d design. Last is for People who would like to give feedbacks. Buttons are Demo for now. Basically UI for Homepage is Done. Now in next Version WIll use router for Navigation. ALso TBH Gemini really Helped me with Box Shadow button effects which I adjusted according to project Later. Do give Feedbacks please :)"}, {"post_id": 23711, "ts": "2026-07-06T20:20:51Z", "hours": 6.1475, "text": "Its Devlog 2 and in midway didn’t knew That I will be able to go further in project but somehow Curosity pushed it. So I have basically in this Version I made following new Things - Added fundamental Single Qubit Gates and the Moment someone drag Gates into Circuit and it get Translated into circuit Instructions JSON which tracks for which gate is applied at target and step; The moment you click on Playcircuit button it Calculates the probability of Each possible Qubit state and corresponding qiskit code; Basically this part of calculating the Circuit I had options either to use Qiskit directly via Python, Use react pre-written Scripts in react or Reinvent the Wheel by making my own Simulator which might not be as Efficient as Already made ones. So to see how strong my kidneys are I chose 3rd one. But you won’t believe I got answers to all My questions whether Why more qubits means exponential computation time, or tensors and many other things which I will write in blogs in some time. So basically it was about initializing a State vector and then running step by step tensor product of gates applied and then when I got a single wire as a result of all gates in each step, then multiply the state vector with Matrix which contains 2^N rows and columns (n is number of qubits) which finally gives you the amplitudes of each state. FInally you format them to Show. Now it still need better design and More code organization after which I will push new Version; till then You are welcome for Questions and Suggestions. Note - This version handle single qubits till now."}, {"post_id": 17512, "ts": "2026-06-28T10:11:41Z", "hours": 11.5036, "text": "Quite a While I started to learn about quantum Computing and observed that its still gives too research vibes for a beginner to overwhelm and leave it. This is Cirqmon which I am making so Building Quantum circuits become some fun without dumping every information and expecting everyone to be a Researcher. Started with making on React, giving it Cartoon or Animated vibe, earlier I thought to make it Doremon themed but later found that it would give copyright issues. For now features added- 1 ) You can Drag and Drog Quantum gates from Tray into Circuit Canvas. 2 ) Music and Background Manage buttons. 3 ) I have tried to play with Vector and Cartoon Images in Transition. 4 ) Adjust Qubits and Nodes/Steps from Drawer earlier I thought to Use Slider but used Buttons later to Avoid touch screen inconsistencies. While making the Drag and Drop canvas Features, found that using HTML Drag and drop API sometimes break on Safari and other browers and it was still making codebase look complicated for others or even me in future to Contribute. So I used @dnd kit for drag and drop feature. Also I kept a Limit on Qubits and Nodes to Keep Execution Easier and test. Majorly a Structure is Done,"}]...
|
Title: Cirqmon by @itsdecodeaditya | Stardance
De Title: Cirqmon by @itsdecodeaditya | Stardance
Devlogs:
Quite a While I started to learn about quantum Computing and observed that its still gives too research vibes for a beginner to overwhelm and leave it. This is Cirqmon which I am making so Building Quantum circuits become some fun without dumping every information and expecting everyone to be a Researcher. Started with making on React, giving it Cartoon or Animated vibe, earlier I thought to make it Doremon themed but later found that it would give copyright issues. For now features added- 1 ) You can Drag and Drog Quantum gates from Tray into Circuit Canvas. 2 ) Music and Background Manage buttons. 3 ) I have tried to play with Vector and Cartoon Images in Transition. 4 ) Adjust Qubits and Nodes/Steps from Drawer earlier I thought to Use Slider but used Buttons later to Avoid touch screen inconsistencies. While making the Drag and Drop canvas Features, found that using HTML Drag and drop API sometimes break on Safari and other browers and it was still making codebase look complicated for others or even me in future to Contribute. So I used @dnd kit for drag and drop feature. Also I kept a Limit on Qubits and Nodes to Keep Execution Easier and test. Majorly a Structure is Done,
Its Devlog 2 and in midway didn’t knew That I will be able to go further in project but somehow Curosity pushed it. So I have basically in this Version I made following new Things - Added fundamental Single Qubit Gates and the Moment someone drag Gates into Circuit and it get Translated into circuit Instructions JSON which tracks for which gate is applied at target and step; The moment you click on Playcircuit button it Calculates the probability of Each possible Qubit state and corresponding qiskit code; Basically this part of calculating the Circuit I had options either to use Qiskit directly via Python, Use react pre-written Scripts in react or Reinvent the Wheel by making my own Simulator which might not be as Efficient as Already made ones. So to see how strong my kidneys are I chose 3rd one. But you won’t believe I got answers to all My questions whether Why more qubits means exponential computation time, or tensors and many other things which I will write in blogs in some time. So basically it was about initializing a State vector and then running step by step tensor product of gates applied and then when I got a single wire as a result of all gates in each step, then multiply the state vector with Matrix which contains 2^N rows and columns (n is number of qubits) which finally gives you the amplitudes of each state. FInally you format them to Show. Now it still need better design and More code organization after which I will push new Version; till then You are welcome for Questions and Suggestions. Note - This version handle single qubits till now.
#Devlog 3 Made Homepage for Cirqmon because I wanted to Put Medium blogs and Tool at one place so this will act as Entry door easily. Experimented with designs, fonts and images to make it feel like 3d Cartoon themed. Following things made - At first “what is does” Hero Section telling people that its a Colorful way to play and learn to make Quantum Circuits. Actually in hero section I have experimented with 3d images animations but it looked distracting UI so Removed it. but Kept H and Y gates to give a idea of Builder. Blogs Section is where it will fetch Quantum related Blogs from Medium (will write soon). Don’t forget to notice that Astronaut. Data is dummy. the Boxes use Backdrop transparent design to match with 3d design. Last is for People who would like to give feedbacks. Buttons are Demo for now. Basically UI for Homepage is Done. Now in next Version WIll use router for Navigation. ALso TBH Gemini really Helped me with Box Shadow button effects which I adjusted according to project Later. Do give Feedbacks please :)
Devlog #4 This Part was all about making Navigation work between pages and since last time I got some feedbacks that Home and Playground VIbe Don’t match so made Playground more 3d. Here are Changes - Using react router, Made Navigation between Home and Playground and Vice versa. Used 3d Resources like Background images, Button images to make it look 3d Videogame. Added button animations like some changes images, some spins. Improved qubit adjust box. Added tooltip component so people know what buttons does what, since buttons are image based. So, I have tried to make project look 3d Glassmorphism and minimal too. check out video attached to see progress till now .
Devlog #5 :) To be very honest I forget that its 8 hours 47 minutes in hackatime and it didn’t posted devlog until I got a Notification on slack. Sooo Guys! In this part of work I had to decide a thing that should I add Visualization of Qubits or not and then I realized that’s the whole point of project [to let people easily visualize whats happening]. So thats why I have decided add Q sphere . Folder Structure First of all I realized that my project was using url images and project structure was actually messing up as files and folders were increasing, so I decided to first organise the chaos and downloading all internet 3d assets in project. [Screenshot -1]. Because without a better organization of project it would get intimidatingly hard for others to contribute. Big Endian vs Little Endian Now second part is making the Result page of Qubit execution match that 3d glassmorphism design and white browsing through IBM composer (Tool for making Circuits) I got to observe that states were actually reverse in order. Suppose you applied hadamard gate to first qubit in 2 qubit system so instead of showing Probabilities of states as |00> = 50% , |01> = 0 , |10> = 50% , |11> = 0 , it reversed for 01 and 10. So after reading on internet about this I got to know that both ways are right and just differs because order you calcuate tensors: G1 * G2 * G3.. gives you Big Endian Version which considers least qubit as important Vice versa in case of Little Endian as IBM uses. So I implemented both in project. Earlier I thought I broke a physics Law [haha.] Making Q Sphere Its for Q sphere [2nd screenshot], that’s what help you understand statevector, because we can’t imagine more than 3D, so IBM come with this method. Basically I have used react 3 fiber that helps us write Three.js in react easily, using JSX instead of js manually, and it shows 3 lines in space which represent each state in vector: Bigger the node on top, bigger its probability . Color tells phase angle from origin. More 0 probability the vector will be pointing on upper hemisphere’s top and similarly more 1 will point on bottom of lower hemisphere. I am still processing [x,y,z] coordinates of line. Q sphere now shows random plots, I have to parse state vector to correct representation, will tell you about it in next devlog after I have learnt and implemented this. Screen Restrictions Forth is more of usability, side by side you can see either, code and graph or sphere and graph , so understand better. Also I added a screen restrictor for small screens since running this project on phone won’t be possible because design clutterness (forget to add screenshot, but you can check live). So hope you liked this version, I know it’s too much of quantum but yeah like others I am also trying to understand better. At Last, don’t forget to check attachments and share your feedbacks. Also I think I would be pushing on github now before developing futher. Namaste!!!
Devlog #6 :) So Hey People, I am feeling Immensely satisfied that Q Sphere feature is Mostly done. Also the GateWiki part is also done that tells You about Gate you Clicked on Gates Tray, again to tell you can drag gates into Circuit to build and Tap to know about it . May be I also link blogs on that Later. Now about Q Sphere Part Okay , Now let me share about Making of Q Sphere Part , So earlier I was not able to visualize it, but somehow I got to Know about Spherical Coordinates which is dependent on: theta : angle of Line from Z Axis phi : angle of Line from x Axis But clicked finally after frustration of not understanding it earlier. Then I gone to Google searching to see 3d visuals and AI to understand how we calculate those angles: So - Based on hamming weights (Means how many 1s in that State, Suppose in |01> has 1 1s and 011 have 2 1s ) and total qubits which help us find theta and divide sphere into sort of rings for similar nodes/lines of same hamming weights in same ring. Then we find how we calculate phi based on total active states in each ring and slicing ring into same proportion. I don’t know why but that was a finally a kick for me :) Finally since you will plot lines and nodes on spherical surface you have to convert theta and phi to coordinates [x, y, z] which you do using polar coordinates . Then after plotting them, a major part of Q sphere is made. now as you can see on 2nd screenshot left side the Sphere shows nodes for respective State. more chances of being 0 is on upper half and more 1 chance on bottom half. Structured the folders Also I worked on code Structure to keep all algos separated: To parse stateVectors Parse the frontend data to json circuit instructions Making all q sphere data from stateVectors parsing Code to export in Qiskit. more such functions too.. So yeah that was work I did, little more things is needed to build, after that project is done. Adding some multi qubit gates is next important thing now. I would be pushing on Github this Version and Vercel too now. Go check it out. Namaste!!!
Cirqmon Devlog #7 So, I am posting this Devlog after interval of Almost 20 days since last Posted. Why delay? During this time I learnt a Lot about Quantum computing. Infact, I was planning to ship the Project with Single qubit gates only, but after I joined Qiskit Global Summer School, then I realised that main game in Quantum computing is about entanglement, that comes with multi Qubit gates like CX, CZ, SWAP etc. The Media attached is Demo is of a GHZ circuit is made by combination of H gate and CNOT gates. Basically a GHZ state is larger version of Bell state. For N qubits, only two possible states shows Up with equal probability i.e 1/root2 (000…n + 111…n). So here is What I made Changes and How : 1) 2 Qubit Gates Implementation - So Earlier Version was for Only 1 Qubit Gates, and it used Tensor product. Where it used to tensor Each step and then Multiply each step to StateVector in successive manner. But for 2 Qubit gates, tensor method gets problematic because multi qubit gates need to have dependence on other qubits too, meanwhile tensor assumes every gate on that step is independent and it builds large matrix. This loses dependence and relation as demanded by multi qubit gates. So then I got to know of approach called Embedding or Inflation where we first create Temporary matrix of 2^n rows and 2^n Columns with each entry initially as 0, then we start looping through columns of that Matrix (which represent possibility, like iteration for 0 is actually 00 in binary) and then, matching it with rows and columns in Gate matrix, after that we force the bit in Temporary Matrix’s respective column and row to align with what Gate’s matrix bit has? Either 0 or 1. Finally we get Result of application in that Temporary matrix which we multiply with StateVector later on. That’s how This Inflation Approach works. 2) Applied Phase angle Indicator Now, Quantum State’s node’s color in Q sphere shows its phase Angle, which can be from PI to -PI, calculated using formula tan2a(y,x) , then we constraint it from 0 to 2PI, later convert to degrees, then feeding that value as HUE value in HSL colour format keeping lightness as 50% and Saturation 100% and then it corresponds to Phase Angle with color that degree, like 0deg is red, 90deg is green etc. So this was Major Changes I did along with some Style changes and Minor error fixing that appeared during changing the Simulator’s Approach. And to be very Honest at when I started to Write code for 2 qubit Gates, I earlier thought I would Do something that I dont have to change Simulator, but those were still just making me cry. So finally I gone to AI to learn and for almost 2 days new experiments were going out of head and that way almost I wasted Hours and then to experiment more and Stop Tracking Hackatime since I knew It would track more hours for Experiments too, So I coded in Cursor (Without Any AI, Just as Other Editor) Untracked. At the End it worked :) Now Finally Majority part is Done, after few More Edits, Will Ship it soon!
Cirqmon #Devlog 8 Actually I was telling my friend about project, and I realized that the Project should have better readme that tells about features, Examples, and Tour. Also added HSL wheel in Q sphere so People can Use it as a reference. Initially its faded, you hover it and it gets Visible. Also the Latest version is now Live with multi qubit gates.
Cirqmon #Devlog 9 This version is more of testing, I thought that I should write blogs and use examples using Cirqmon, So Written 2 blogs on Quantum computing for Beginners and Deutsch Joza algorithm. While writing it I thought I should Show them on Cirqmon Hompage too, earlier I thought I would replace blogs part in Homepage with Just a medium link of mine, but later when I read on internet that medium allows to see RSS version of Blogs so I parsed RSS to JSON and fetched Blogs related Quantum Computing. Along with it, made Qubits limits to 8 and steps to 24 and made a centralized Config file to control parameters from there. Added a Toggle so People can switch indentation of Qubit states either Big endian or Little Endian. Updated Homepage button with Pikachu Button I found while explore on UI verse, also added link to Readme guide. Now After writing Blogs I am getting surge of confidence inside that I understood Quantum Computing more Better. One of topics I am curious about is Cybersecurity and one of Algorithm that challenges classical Approaches like RSA is Shor’s Algorithm so next I am going to explore it, Also along with all these, I have updated Some images in readme too and going to Push updates, so do Share Feedbacks.
Cirqmon Devlog #10 Every time I think My project is ready to ship I find something missing and then it gets delayed. After I finished the blog on Deutsch Jozsa algorithm the project worked, as it needed only Single and Double qubit gate. When I started writing about Grover’s algorithm I realized the need of Three Qubit gate too as it needed CCZ gate to flip the phase to achieve 111 State. So I had to fix that. Here is what I did: Firstly as I told earlier I added the 3 Qubit gate feature, the underlying simulator code is working as old Inflating the Matrix approach, I only had to make it work for 3 Qubit gates. Secondly once I was on huddle where we were discussing about Boba bash, I presented the project to people and some said like ’it looks like too stuffed or some said it looked vibe coded. So I thought its a good feedback to work on. Then I improvised the Homepage so it feels like Apple like minimal theme while maintaining game feel. I also added the Background video instead of static image. Thirdly the blog page was pending so I made blog page with similar theme as I updated along with a option to search among the medium posts. So this was what I updated in this Version and now I needs that code review and matching the theme on Playground too. Just Hope I don’t get stuck this time and wrap it up. Thanks for Reading!
Cirqmon Devlog #11 So Guys, I have finally finalized the Cirqmon Playground UI. I replaced the old glassmorphism theme with a rougher, more irregular visual style. Earlier I got feedback that, the old layout felt cluttered because the quantum gates were spread far apart and Due to Space Background and glassmorphism, it looked like Vibe coded. I have now grouped all the gates together in one place to make the interface cleaner and easier to navigate. Here Is what I changed: Removed the Home button. Clicking the Cirqmon logo now takes gets back to the home page. Updated Playground icons with Animal GIFs to give it more lively and engaging appearance. As mentioned above, reduced the use of glassmorphism to due to flickering issues and implemented like hand drawn solid color based UI. Attaching a video Snapshot so you can see changes made. also, The README is the only major task left. Once that’s finished, I’ll be ready to ship the project!
Cirqmon Devlog #12 So I guess it’s final Devlog. Here firstly I updated Readme with new UI based snapshots. Made custom Alert box so it matches the theme instead of browser native alert box. Fixed bug in which earlier the gates were being added in circuit without checking if that Block is being used by other gate and its corresponding qubits. I hope if I don’t get a new problem to fix I will ship it;
Ships:
Cirqmon is a quantum computing circuit builder on web and It’s idea was like when I used to go on tools like IBM’s or other quantum circuit simulators they used to feel like so dry and academic, So I thought why don’t I make one that’s colorful, looks like game because I guess learning deep tech should not mean that you lose colors. Earlier I thought I would just build UI layer on top of Qiskit via Python API, then I thought what will I learn and from a quite a long time I wanted to build something that involves maths and physics so i thought I should build whole thing by myself. The whole thing was Actually a bit challenging on understanding how Q spheres or Tensors or how bitwise calculations work, aligning it will a Good UI theme, So I just learned and build. sometimes I thought How will i finish or how will I map that understanding into code But I guess AI as a Teacher helped me a lot. For Others to try it you should know about Quantum Gates, read the Readme once and I guess you will understand the project....
|
1792853321.4610965
|
1792939721.4610965
|
|
17558
|
WinDurango by @Rodrigo_Todescatto2010 | Stardance
|
Rodrigo_Todescatto2010
|
2
|
84.0
|
1594
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-12T17:43:22Z", "hours": 71.0, "multiplier": 19.95, "payout": 1355, "blessing": "neutral", "text": "During the meanwhile, I’ve been working with mostly audio and support for other games.", "repo": "https://github.com/WinDurango/WinDurango", "demo": "https://github.com/WinDurango/WinDurango/actions"}, {"ship_num": 2, "ts": "2026-06-15T19:54:34Z", "hours": 13.0, "multiplier": 18.65, "payout": 239, "blessing": "neutral", "text": "Hey there! This is WinDurango, an Xbox One translation layer (you can call it a high level emulator too if you want…) for Windows 10/11. Currently, support for games such as Forza Horizon 2, Forza Motorsport 5, Halo 5 and others is being actively worked on, while some few others like Minecraft: Xbox One Edition (older versions), Sonic Mania and LIMBO are fully playable! Note that I’m not the only developer in this project (I work on rendering/audio mostly and WinRT a few times), as @dexrn (works mostly on the GitHub/Social Media management part) and @CT5 (works mostly on the WinRT part). (screenshot from Forza Motorsport 5 with WinDurango in ForzaVista mode, showing the car interior).", "repo": "https://github.com/WinDurango/WinDurango", "demo": "https://github.com/WinDurango/WinDurango/actions"}]...
|
[{"post_id": 66761, "ts": "202 [{"post_id": 66761, "ts": "2026-09-12T17:28:09Z", "hours": 9.845, "text": "Quick update: Progress on audio with Forza Horizon 2! It now stutters way less. (Broken textures because I’m still debugging some stuff!)"}, {"post_id": 54171, "ts": "2026-08-25T01:05:49Z", "hours": 2.115, "text": "Great news: Thanks to RSantila, audio is now in the works for Forza and other games that use the ACP! (games that use Wwise or FMOD for example) For example, here’s Forza Horizon 2 with music in the background (there’s no audio at all without ACP processing, it’s also kinda glitchy because it’s being processed and decoded)"}, {"post_id": 47218, "ts": "2026-08-15T00:04:26Z", "hours": 7.5353, "text": "Great news: Forza Horizon 2 finally gets to the title screen!"}, {"post_id": 44010, "ts": "2026-08-09T14:38:36Z", "hours": 2.8606, "text": "Another quick update: Forza Horizon 3 now boots! (Might require DXVK!)"}, {"post_id": 39006, "ts": "2026-08-01T17:28:34Z", "hours": 5.3114, "text": "Another quick update: Peggle 2 is now playable!"}, {"post_id": 37865, "ts": "2026-07-30T20:47:12Z", "hours": 3.3136, "text": "Hey! Small update: The Crew boots!"}, {"post_id": 35493, "ts": "2026-07-26T23:25:10Z", "hours": 1.4122, "text": "Hey there! Little update: Destiny now boots!"}, {"post_id": 35456, "ts": "2026-07-26T21:43:25Z", "hours": 9.0853, "text": "Hey! Has been quite a while since the last devlog but here are some changes and news: Halo 5: Guardians is very close to booting! It still just needs some fixes with memory allocation. FIFA 15 is another game close to booting! Occultic;Nine now boots! Overall, I’m still doing some work that I will hopefully be able to share better in the next few days :)"}, {"post_id": 27986, "ts": "2026-07-13T23:06:36Z", "hours": 6.9742, "text": "Hi! I’m back with some stuff: Happy Dungeons (an console exclusive game) now boots with WinDurango! I’m working very hard at the moment on Forza Horizon 2 and Forza Motorsport 5 (which are my goals…) and I hope to have new stuff to share about them soon! And… That’s it for today, there isn’t anything else to say 😭"}, {"post_id": 24994, "ts": "2026-07-08T21:48:51Z", "hours": 9.4822, "text": "Hey there! It has been a few days since the last devlog (again) but we are still cooking some stuff! Another Minecraft: Xbox One Edition version is now playable! The version is 1.22.904.0/CU34 or earlier? Not sure about the exact CU. Another playable one is 1.18.781.0! While this one can’t be shown yet (or heard… there’s nothing!), I’m heavily working on emulating (I think we could put it like that?) the Xbox One’s ACP (Audio Co-Processor), which is used for decoding XMA (Xbox Media Audio) and processing audio in general (heavily used by FMOD and Wwise). While some games don’t depend on it specifically (such as Minecraft, LIMBO, Sonic Mania etc), the majority of the games depend on it (Unity, Unreal Engine and Cryengine use it), and if you don’t emulate it, most of the games will basically either hang at some point waiting for audio to be processed (e.g. Forza, Happy Wars, Halo 5) and won’t have audio at all. This is the part I’m focusing the most currently and I’m very stomped on it, which is also why there isn’t much progress going on, but hopefully I get some progress with it to share with y’all! That’s it for today, I really hope to have new stuff to share with everyone soon! But for now, that’s pretty much it… 😭"}, {"post_id": 19667, "ts": "2026-07-01T01:29:49Z", "hours": 12.6392, "text": "Hello there! Has been a while since my last devlog (a few days… long ago, huh?), but that does not mean there’s no progress going on, because there is! Draw Bundles are currently being worked on, which means more geometry rendering for some games! It still needs some optimization (mainly on RAM usage) and placement update still needs a few tweaks, but welp, at least we are getting some progress overall! Minecraft: Story Mode now boots! And it looks very broken I know and I’m investigating what can be done for fix that, but as far as I’ve seen, this is happening because of the game updating buffers with UpdateSubresource1 and passing what seems like (not sure if that’s actually the case!) constant offsets in pSrcBox + passing passing unaligned constants when setting a constant buffer with SetConstantBuffers1 , which was actually allowed back in D3D11.X, Xbox’s D3D11 version. Note that Minecraft: Story Mode isn’t the only game that does that, there are some games such as Forza Horizon 2 that also do so! And believe me, there are way more trickeries that were allowed and could be done back in D3D11.X… That’s it for today! I don’t have anything else to say and this is all the progress I got, I’ve been quite busy with some school exams but they will end soon (in 2 days) and hopefully I can get some more progress to share here! See ya! :)"}, {"post_id": 9024, "ts": "2026-06-15T01:43:09Z", "hours": 6.4064, "text": "Hello again! Today I’ve made some progress with 3D rendering with Placement Resources and got some 3D stuff in Forza rendering! Most of the scenario and the track won’t really render at all because I haven’t implemented Draw Bundles yet, but I plan on working on it soon! That’s it for today, hope yall like it :)"}, {"post_id": 8501, "ts": "2026-06-14T04:12:23Z", "hours": 5.2733, "text": "Hello again! Today I’ve made some progress with tiled textures/placement resources (a Xbox One’s D3D11.X exclusive feature similar to placed resources in D3D12), I’m still working on it but results are already quite satisfactory… The first screenshot shows how the texture looks now and the second one shows how it looked like before, the third one is an extra screenshot from the game title screen! (it also looked like a mess before!) See ya! :)"}, {"post_id": 7772, "ts": "2026-06-13T00:01:01Z", "hours": 1.6606, "text": "Hello World! This is WinDurango, a Xbox One Translation Layer for Windows 10/11. Today I got Forza Motorsport 6 booting. It didn’t require much thankfully but I noticed our ID3D11DeviceX vtable might be wrong for it’s D3D11.X version. Right after the Turn 10/Microsoft Studios intro (bink video), the game hangs on a black screen due to unimplemented audio things (ACP commands). More updates to come in the next days from other games as well! :)"}]...
|
Title: WinDurango by @Rodrigo_Todescatto2010 | Sta Title: WinDurango by @Rodrigo_Todescatto2010 | Stardance
Devlogs:
Hello World! This is WinDurango, a Xbox One Translation Layer for Windows 10/11. Today I got Forza Motorsport 6 booting. It didn’t require much thankfully but I noticed our ID3D11DeviceX vtable might be wrong for it’s D3D11.X version. Right after the Turn 10/Microsoft Studios intro (bink video), the game hangs on a black screen due to unimplemented audio things (ACP commands). More updates to come in the next days from other games as well! :)
Hello again! Today I’ve made some progress with tiled textures/placement resources (a Xbox One’s D3D11.X exclusive feature similar to placed resources in D3D12), I’m still working on it but results are already quite satisfactory… The first screenshot shows how the texture looks now and the second one shows how it looked like before, the third one is an extra screenshot from the game title screen! (it also looked like a mess before!) See ya! :)
Hello again! Today I’ve made some progress with 3D rendering with Placement Resources and got some 3D stuff in Forza rendering! Most of the scenario and the track won’t really render at all because I haven’t implemented Draw Bundles yet, but I plan on working on it soon! That’s it for today, hope yall like it :)
Hello there! Has been a while since my last devlog (a few days… long ago, huh?), but that does not mean there’s no progress going on, because there is! Draw Bundles are currently being worked on, which means more geometry rendering for some games! It still needs some optimization (mainly on RAM usage) and placement update still needs a few tweaks, but welp, at least we are getting some progress overall! Minecraft: Story Mode now boots! And it looks very broken I know and I’m investigating what can be done for fix that, but as far as I’ve seen, this is happening because of the game updating buffers with UpdateSubresource1 and passing what seems like (not sure if that’s actually the case!) constant offsets in pSrcBox + passing passing unaligned constants when setting a constant buffer with SetConstantBuffers1 , which was actually allowed back in D3D11.X, Xbox’s D3D11 version. Note that Minecraft: Story Mode isn’t the only game that does that, there are some games such as Forza Horizon 2 that also do so! And believe me, there are way more trickeries that were allowed and could be done back in D3D11.X… That’s it for today! I don’t have anything else to say and this is all the progress I got, I’ve been quite busy with some school exams but they will end soon (in 2 days) and hopefully I can get some more progress to share here! See ya! :)
Hey there! It has been a few days since the last devlog (again) but we are still cooking some stuff! Another Minecraft: Xbox One Edition version is now playable! The version is 1.22.904.0/CU34 or earlier? Not sure about the exact CU. Another playable one is 1.18.781.0! While this one can’t be shown yet (or heard… there’s nothing!), I’m heavily working on emulating (I think we could put it like that?) the Xbox One’s ACP (Audio Co-Processor), which is used for decoding XMA (Xbox Media Audio) and processing audio in general (heavily used by FMOD and Wwise). While some games don’t depend on it specifically (such as Minecraft, LIMBO, Sonic Mania etc), the majority of the games depend on it (Unity, Unreal Engine and Cryengine use it), and if you don’t emulate it, most of the games will basically either hang at some point waiting for audio to be processed (e.g. Forza, Happy Wars, Halo 5) and won’t have audio at all. This is the part I’m focusing the most currently and I’m very stomped on it, which is also why there isn’t much progress going on, but hopefully I get some progress with it to share with y’all! That’s it for today, I really hope to have new stuff to share with everyone soon! But for now, that’s pretty much it… 😭
Hi! I’m back with some stuff: Happy Dungeons (an console exclusive game) now boots with WinDurango! I’m working very hard at the moment on Forza Horizon 2 and Forza Motorsport 5 (which are my goals…) and I hope to have new stuff to share about them soon! And… That’s it for today, there isn’t anything else to say 😭
Hey! Has been quite a while since the last devlog but here are some changes and news: Halo 5: Guardians is very close to booting! It still just needs some fixes with memory allocation. FIFA 15 is another game close to booting! Occultic;Nine now boots! Overall, I’m still doing some work that I will hopefully be able to share better in the next few days :)
Hey there! Little update: Destiny now boots!
Hey! Small update: The Crew boots!
Another quick update: Peggle 2 is now playable!
Another quick update: Forza Horizon 3 now boots! (Might require DXVK!)
Great news: Forza Horizon 2 finally gets to the title screen!
Great news: Thanks to RSantila, audio is now in the works for Forza and other games that use the ACP! (games that use Wwise or FMOD for example) For example, here’s Forza Horizon 2 with music in the background (there’s no audio at all without ACP processing, it’s also kinda glitchy because it’s being processed and decoded)
Quick update: Progress on audio with Forza Horizon 2! It now stutters way less. (Broken textures because I’m still debugging some stuff!)
Ships:
Hey there! This is WinDurango, an Xbox One translation layer (you can call it a high level emulator too if you want…) for Windows 10/11. Currently, support for games such as Forza Horizon 2, Forza Motorsport 5, Halo 5 and others is being actively worked on, while some few others like Minecraft: Xbox One Edition (older versions), Sonic Mania and LIMBO are fully playable! Note that I’m not the only developer in this project (I work on rendering/audio mostly and WinRT a few times), as @dexrn (works mostly on the GitHub/Social Media management part) and @CT5 (works mostly on the WinRT part). (screenshot from Forza Motorsport 5 with WinDurango in ForzaVista mode, showing the car interior).
During the meanwhile, I’ve been working with mostly audio and support for other games....
|
1792975942.4427547
|
1793062342.4427547
|
|
524
|
Car Game by @Mihai | Stardance
|
Mihai
|
2
|
78.0
|
1589
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-12T19:17:46Z", "hours": 27.0, "multiplier": 19.23, "payout": 622, "blessing": "neutral", "text": "So, this is the new version of car gaim!!! There is a new map, much more optimized, together with settings and a linux build to improve accessibility. There are 3 races together with a free drive mode on the main map. Change log: -New map -3 new races -Settings -New UI/Hud -Racing line -Driver models and reactions -Driving Surfaces -New sounds (shifting, high speed, crash etc.) -Speed effects -Improved car model and textures -Small AI improvements -Loading Screen -New Crash system: three crashes or a big crash and you’re out of the race -Optimization -Partial controller support -Small destructable objects on the map The biggest challenge was finding time to still work on the game and also bring significant improvement. The time restrain allowed me to focus on the necessary and I really feel the game is in a better place now. Technically this update is much smaller than the first release (it’s obvious) but interconnecting all the systems in one product was a real hassle, especially with the UI, as Unity UI is a bit janky. Notes for testers: I found a region with very bad fps spikes, for which I haven’t found the cause for. Thankfully its only a small part of both races, and a small part on the map overall. There is partial controller support, menus haven’t been tested properly, but driving works. There is a Linux build, but it wasn’t tested, any notes about that are welcome. Download available on itch.io", "repo": "https://github.com/Telea-Mihai/Car-gaim", "demo": "https://github.com/Telea-Mihai/Car-gaim/releases/tag/V0.0.2"}, {"ship_num": 2, "ts": "2026-09-10T19:52:13Z", "hours": 51.0, "multiplier": 15.73, "payout": 967, "blessing": "neutral", "text": "This is a small NFS inspired car game demo. It’s a project to test my technical abilities in Unity. It features custom made vehicle physics based on Unity’s built in wheel colliders and a custom easy to use solution for racing ai. Besides that, it is (in some small predetermined angles) a fairly good looking game, with a little bit of style. The game uses Unity’s HDRP render pipeline for its graphics, together with some screen space reflections and reflective materials, the game gets to look fairly good, especialy in the low light enviorment it’s set in. The car physics are in a sim-cade style. The car can still do crazy steering at high speeds, and its very easy to rotate it, but understeer and oversteer can still occur, besides that, the car is not limited in any way when it comes to external forces that can imbalance it, hit a curb at a high speed and the car can go flying. The biggest challenge was the racing AI. First of all it was hard to make a car know how much to steer to go from point A to point B. After that, it was fairly simple right? Just sample some point from the road spline and follow them. But curves exist, and for that you need to calculate the right speed to go trough it so that it wont crash. Then, the car was driving very inefficiently, following the middle of the road, so what followed was a long quest of making a racing path generator, in which I succeeded (with the help of AI). Then came obstacle avoidance, making the car not seem just like a train following a predefined track. If necessary the car will go off track to avoid obstacles and it’s aware of cars around it and will try to keep the distance. There is also a system that predicts collisions with other cars (for example if a car in front is cutting in front of it, it can predict that will happen and brake). This is all theory but it still works in game, sometimes. Another hard part was building a city. I had no prior experience in making games that aren’t made out of just basic cubes and shapes, so it was difficult to find assets and other stuff to populate the city. Then also came the point of how much detail should I even add and many other factors that in the end made me make the hard decision of making just one race in order to not break the illussion of a semi believable city. I’m very proud of how it came out, alltough I have so many ideas about how I can make it grander and better, but i currently don’t have the time to do so. I hope to come back in the future and actually make a cool metal-rock and boost infused racing game like NFS Most Wanted, but it has to wait. For those who want to play test the game. Currently there is only a windows version for the game, and it can also be pretty demanding in terms of GPU (Basically, I think it needs a dedicated GPU, I have a rtx 3050 4gb laptop GPU and it runs fine). There is a simpler driving demo scene which is just white terrain with some roads, that maybe will fair better with lower end hardware.", "repo": "https://github.com/Telea-Mihai/Car-gaim", "demo": "https://github.com/Telea-Mihai/Car-gaim/releases/tag/V0.0.2"}]...
|
[{"post_id": 79112, "ts": "202 [{"post_id": 79112, "ts": "2026-10-12T18:32:02Z", "hours": 5.6664, "text": "This has been a big push to finish the new version of the game. Together with a linux build the new version brings a new map, new UI, racing line, settings menu, AI-improvements, optimization, driver models, 3 new races, a loading screen, and a start race “screen”. Specific for this devlog, the settings menu, with three graphical presets, a loading screen and a start race screen. Two new races. Small map additions (some houses and parked cars, and physical objects incld cones and barriers that you can hit). Bug fixes across the board. A big challenge for this was the data transition between scenes and settings saving. And I used player prefs to save settings, and some simple static objects to transfer info between scenes. Overall what I have here is a nice base to start building a campaign."}, {"post_id": 78111, "ts": "2026-10-09T16:17:50Z", "hours": 1.0669, "text": "I made a line that shows you where to go, so you don’t need to guess anymore. It uses the baked racing path the AI uses, and passes the points to a line renderer. It also scales with speed, higher speed => line extends further, in order to help you see upcoming corners easier."}, {"post_id": 77336, "ts": "2026-10-06T16:21:09Z", "hours": 3.9394, "text": "So, there have been a few changes. There are now drivers, the cars are no longer driven by ghosts. There are procedural animations for steering using IK (it’s really not that complicated. They also look ahead and where they drive (INCREDIBLE!!!!). Besides that they also react to crashes, eating the steering wheel, cus there ain’t no airbag (poor lads). I’ve reworked the crash system, not visually but technically. You are now allowed to have 3 small crashes, they still trigger the slow motion, but they don’t end your race. Crash many more times than that, your race ends. This way you are still penalised for bad driving. There is still a one hit “lethal impact”, but that basically means going top speed into a tree to trigger. Another small addition are some more sounds, to make the driving feel even better: -Gear shifter sounds -Handbrake pull/release sounds Just a small bit of polish. Besides that there were small bug fixes, nothing notable."}, {"post_id": 76466, "ts": "2026-10-03T16:42:33Z", "hours": 2.4925, "text": "I’ve been working on a new surface system! Now I can add surfaces with different sounds and effects when sliding. I also added “rolling sounds” that play when just driving over at adequate speed. I’ve added a dirt surface, for obvious reasons. It also has something called rolling resistance. You will observe the fact that when driving over dirt with one side of the car still on the road, the car will steer towards the dirt, because of the higher resistance, and also will have as a consequence a lower top speed, also acting as a penalty for driving offroad. Besides that I also added ambient sounds, like a wind and leaves thing so that you can tell when standing still that you are in a forest :))) Last thing is I made the crashing better, no longer will any impact “crash” you but the sounds are also better, with separate sounds for high and low impact speeds. Basically a lot of polish for the game, the driving feels better, I feel like, because of it, and it also incentivises you to stay on the road, alltough the trees already kinda did that."}, {"post_id": 76168, "ts": "2026-10-02T15:41:06Z", "hours": 2.1219, "text": "I’ve been working on the HUD for the game. Really simple, but it was missing. It features a lap counter, lap timer, best lap, lap delta, position. The speed/rpm/gear cluster is the same as before."}, {"post_id": 74116, "ts": "2026-09-26T18:26:41Z", "hours": 2.6064, "text": "Speed. Speed is very important when it comes to racing, right? Well yes, but in a video game, where you sit down on a chair, static, in a room, the sensation of speed is even more important. That’s why these few hours i’ve been working on making the game feel fast . Changes have been made to the way the camera moves behind the car and in how it tracks it. Besides that, there has been a little sound work. At high speeds sounds become muffled and a wind noise can be heard. There is also the post processing i’ve been talking about in the other devlogs. Besides that, i’ve started reworking the UI, and the first element was the gauge cluster. I’ve decided to have the text physically live in the world, it reacts to the car, lagging behind or moving from side to side slightly. It also gets blurred at high speeds, because from a certain point it doesn’t matter if you’re going 150 or 200 kph, since that road barrier is still approaching you at a lethal speed, so you should probably just brake. I LOVE the way the driving turned out, and I sometimes sit for too long just driving around, so I can’t wait to get this game back to you guyz. Peace."}, {"post_id": 72697, "ts": "2026-09-23T15:05:15Z", "hours": 2.4817, "text": "The map is doneeeeeeee!!!! It’s as varied as I could make it, but you can see the different regions, and I like that. Besides that I’ve made the first race layout, and the AI just works (wowowowwow!!!!). Another cool thing I’ve added is wind, as a sound, when you go really really fast. On high speed, as I said in a previous devlog, a tunnel vision effect forms. Now, the sounds will deafen as if the ears are getting plugged, the only thing you hear clearly being the sound of the wind passing by your car. It has a really cool implementation, using a curve and some inverse lerp to sample, this way the effect is not linear and at low speed no big changes happen. Anyway, down here i’ll add some screenshots with the map, love to hear your feedback!"}, {"post_id": 70530, "ts": "2026-09-19T10:10:04Z", "hours": 2.7044, "text": "I’ve been working on the dry-ish mountain region. I’ve also added grass to the map, as you can see. For the moment I have some lighting issues in the mountain region because of the rock models, and some settings, so the dry grass there is black, but other than that it looks great and it really helps fill the map with life. Other than map work, I took some time to work on the speed feeling. In the second and third photo is how the game looks at a speed of >120km/h. The edges get deformed, pulled back, and a vignette help sell the tunnel vision illusion. Besides that, its screen shake and FOV work. Between the third and last picture you can clearly see the difference between the two states."}, {"post_id": 69662, "ts": "2026-09-17T15:00:25Z", "hours": 1.1333, "text": "I’ve put in another hour on the map. I’ve decided to split the map in multiple regions for visual variety. There is the dense forest in the first photo, followed by a low vegetation, high altitude mountain region (began working, second and third photo). Planned is also a plains-like region, a lake and i’ll see if I can fit a small town somewhere. The roads are curved and never go straight for too long, and compared to the city map, some of the chicanes here make sense. I am still thinking about how I could still have the night city here in the next demo. Maybe i’ll restore the map itself, or i’m thinking of just adding a docks area for free driving."}, {"post_id": 69151, "ts": "2026-09-16T14:16:13Z", "hours": 1.1, "text": "I’ve been messing around with assets, lighting and visual effects. I kinda like this a bit more than the city night. So for the next demo, this will be the theme. I’ve also deleted the city scene, since it was just bad in terms of performance and other stuff. Basically, my hope is that, using a forest, will help me conceal a lot more, and repetition of trees and other assets wont be as visible as in a city, thus i’ll be able to finish it faster without losing visual fidelity. Also all the assets have LOD’s for optimization!"}, {"post_id": 68725, "ts": "2026-09-15T17:01:11Z", "hours": 1.6053, "text": "So, after all the positive feedback I couldn’t just leave the project to rot. Soo, in my free time I will try to work some more on this game. So I made a little list with what to add: I will be leaving the night city behind, it’s hard to optimize. Instead I will be making a forest/mountain scene, which I think will be cool to race in. I also decided to experiment some more with the visual effects available to me, so I added flares to light sources, for now a bit excessive, but oh well. I also upped the collision particles, more smoke, sparks and debris => looks better cuz it hides the bad crash physics (maybe ???) After I am done with the forest scene, and I will make a couple races, what will follow is another ship, and then I will work on traffic followed (if finished) by another ship."}, {"post_id": 65510, "ts": "2026-09-10T18:18:48Z", "hours": 3.2097, "text": "BUILD READY!!! This is the last devlog before the ship. Alltough the game isnt in the state I would like it to be, school started and i’m in my terminal grade, so it’s a tough year ahead, so I have to shelve this project. The race is playable, its difficult in a way but its also fun. I also added a second level which is just an open map with a field and hills for you to test the driving physics and also as a lower graphical alternative to the city race. In the final hours of development I added all the basic necessary menus and fixed some bugs that I catched while testing. See you in the ship!"}, {"post_id": 64889, "ts": "2026-09-09T16:28:26Z", "hours": 3.6897, "text": "I’ve reworked a few sections of the track and tweaked the racing AI. They can now almost always finish the race unless the player does some tomfoolery. Besides that I fixed a ugly visual bug where the terrain would poke trough the road when the camera was closed to the ground. Next, I remade the speedometer, RPM indicator and Gear indicator as you can see in the screenshots. The final thing that I added is a detection of “large” crashes, alltough is inconsistent, I dont currently have ideas how to fix it right now. For now when it detects a crash it enables slowmotion for a fraction of a second just for some oomph. All that remains for me to do is UI: -Race start countdown -Race finish info -Pause Menu -Main menu And a Game Over screen for when you crash. After these additions I will ship the game, as school started and I will have to shelve it, and I dont want to miss out on the sweet stardust it can offer!"}, {"post_id": 63721, "ts": "2026-09-07T17:33:37Z", "hours": 2.8544, "text": "Soo, I made the car more believable. It has working brake lights (WOOW), and new engine sounds that make it sound more powerful, but also added something extra spice, like exhaust backfire, that is programically made, with a multitude of firecracker sounds that I then processed. Besides that I also added a turbo blow off sound. They use the simulated rpm to decide their pitch and intensity, while also considering the throttle difference and position. Last thing (visible in the last seconds of the last video), I improved the crash physics with detachable parts and deformable chassis."}, {"post_id": 62131, "ts": "2026-09-05T11:51:23Z", "hours": 2.7356, "text": "The map is done! I added some bariers with a simple shader, but I might change them soon, as I dont like the way they look. I also added a new car for the race. I’ve also done some optimzing, enabled mesh batching, and after i’m 100% done with the map I will also bake the lighting for even better performance. I’ve decided to leave out traffic for now, as its’ pretty difficult to implement and I don’t have the time, since school is starting. As a small to do list for the ship: -Main menu with settings -Start sequence -Race Timer -Ending Cutscene -Model credit list -Sounds -Maybe some music"}, {"post_id": 55154, "ts": "2026-08-26T17:03:03Z", "hours": 3.3333, "text": "I have been working on the map ever since the last devlog. There isn’t much to say as there is to show. The scene has gotten laggy with lag spikes that seem random, so I will have to investigate and see how to optimize the game."}, {"post_id": 53725, "ts": "2026-08-24T12:09:21Z", "hours": 3.5356, "text": "Alright, i’ve been busy collecting assets and making materials and collections in order to start work on the map, which I did, I started with the dock area, since I dont yet have many house models, and well, I think it’s looking pretty cool, ngl. Next up I’ll go around the track in order to detail the section most. I am using the darkness and distance as a tool to be lazy, but also optimize. No point in detailing a part the player wont see. Also in my toolset is the fact the player will be moving fast and concentrating on the road, so it won’t be necessary for me to detail every inch of the map, instead focusing on intersections and areas the player will be slow enough to notice such details."}, {"post_id": 52464, "ts": "2026-08-22T16:17:32Z", "hours": 2.1669, "text": "The really fun part has begun! Im stylizing the game. Yeah, I decided to skip traffic for now and instead get busy making my environment. First I started by making a cool night sky and lighting, i turned on some settings, and I am pretty afraid that this game wont run decent at all when Im done, but ill do optimizing later, im sure it will be fine. Im still in search of models, as modelling everything by myself is out of the scope of this little project. But it’s gonna be pretty cool looking, i believe."}, {"post_id": 51776, "ts": "2026-08-21T16:47:51Z", "hours": 1.4, "text": "Ok, i’ve worked around a bit, and decided that for the first ship I want to release ONE very good feeling race. So I wont complicate myself with tuning and other systems, it will be one car, one race. So the atmosphere will be very important. I already have the layout of the race done, it’s supposed to go trough the docks > coast > downtown > highway and then the race ends. Also I believe making this small but very polished game will lend me more experience than something that will be overly complex, as many of my game projects end up. I will start with the terrain an polishing the track to make it more interesting in terms of driving and then i’ll get started on the terrain and dock area"}, {"post_id": 51639, "ts": "2026-08-21T12:50:14Z", "hours": 5.0786, "text": "The racing AI is done. I also made a small race manager which takes the cars, aligns them in a grid and then starts a countdown. It also keeps trak of the position and lap-times, but there is no UI for that yet. I also started working on the Map for the demo, i’m still debating how big the demo will be, but probably it’ll be a few races. After I have a small map layout, i’ll get started on the traffic AI, and move on from there. Im still trying to get the hang of this road tool I am using, and also getting the road dimensions right, but we’ll see."}, {"post_id": 49190, "ts": "2026-08-17T20:37:34Z", "hours": 3.1403, "text": "I’m very happy with the racing AI, while it’s not perfect and cannot avoid everything, like a wall in the middle of the road, I dont think that will be the case like ever. It can avoid other cars, either static or not and it uses a basic prediction to determine if it’s on a collision course with another car and act accordingly. Also, for the path, as you could see from the beggining of the video, the path was already backed based on the road. The car then only decides when to brake and steer based on that path. Next up i’ll make a demo race with multiple racers and position marking and stuff and then get started on the map."}, {"post_id": 47417, "ts": "2026-08-15T10:44:33Z", "hours": 5.6383, "text": "Alrighty, I decided to actually use my brain and came to the conclusion to instead bake the racing paths, instead of just having them create one at runtime. I made a small unity tool, I just place the checkpoints, click bake and a racing spline gets generated. If you look real close, you can see that the line follows an outside-inside-outside path for steering. Now that I have this, I will work on the racer Ai itself. First I will make it follow the track with optimal speed and then teach it to avoid obstacles, other cars and then even overtake."}, {"post_id": 45697, "ts": "2026-08-12T11:00:48Z", "hours": 3.2739, "text": "Okk, I feel like i’m getting close. As you can see, the car now tries to build a racing line, this is all in real time. While its still not perfect, I feel like I am getting close. There are still some bugs related to the pathing on the road that I will have to fix, but overall its very good. The system works by identifying an apex. The geometrical apex is considered in this case the point which has the biggest angle difference compared to its neighbours. Now, after it identifies the apex, it grabs all points leading to the apex, and shifts them to the outside, before starting to shift them to the inside towards the apex, all using a sine wave based lerp in order to get a nice arc. While this system is good, I feel like the driver script that is responsible with making the car follow the points is kind of goofed, so i’ll look into that."}, {"post_id": 45184, "ts": "2026-08-11T14:37:35Z", "hours": 6.5986, "text": "Racing ai, thats all I’ve been doing. It works fine-ish, i feel like Im close but it still overshoots, but I have some ideas on how to fix it."}, {"post_id": 3583, "ts": "2026-06-06T16:13:53Z", "hours": 4.5958, "text": "I have been working on making racing ai for the game. As a small intro, i have worked on this project before, and what I got is a working car controller, and dialed in physics to something I like how it feels. The ai represented a difficult problem. If I want this to be open world, and for there to be police chases, I needed the NPC car to be able to go offroad, so basically, of a set path. There would be the option to make a hand tailored map and even for the offroad sections to be counted as roads, but that would be hard for one developer to do and test, so I opted for this. When the car is not on a road network, it fallbacks to the built in navmesh system in unity. It then uses it to calculate a path as a list of point and then drives between them. On the road, we just need to sample points from the spline of the road and then drive between them. The hard part was this driving part :D While it might seem simple, just point the car to the next point, and then have it move forwards, there is much more nuance to this. First, the NPC car should behave just like the player car, it should have the same turn angle, and thus I must now convert a simple direction into a steering angle. Another difficult part is when racing. I can’t just have it accelerate always, the car must brake when a sharp corner is coming up, and for really tight one, maybe even drift. So how do you do that? Well, i dont know yet, this past 4 hours I have been working on the same script and same section trying to figure that out. I really hope that next devlog I can come with a solution, but i cant promise anything. My plan is to calculate the curve of the upcoming curve, and then somehow spit out a good speed for that, but there are a lot of factors to account for, like the grip of the car and actual speed, distance to corner etc."}]...
|
Title: Car Game by @Mihai | Stardance
Devlogs:
I Title: Car Game by @Mihai | Stardance
Devlogs:
I have been working on making racing ai for the game. As a small intro, i have worked on this project before, and what I got is a working car controller, and dialed in physics to something I like how it feels. The ai represented a difficult problem. If I want this to be open world, and for there to be police chases, I needed the NPC car to be able to go offroad, so basically, of a set path. There would be the option to make a hand tailored map and even for the offroad sections to be counted as roads, but that would be hard for one developer to do and test, so I opted for this. When the car is not on a road network, it fallbacks to the built in navmesh system in unity. It then uses it to calculate a path as a list of point and then drives between them. On the road, we just need to sample points from the spline of the road and then drive between them. The hard part was this driving part :D While it might seem simple, just point the car to the next point, and then have it move forwards, there is much more nuance to this. First, the NPC car should behave just like the player car, it should have the same turn angle, and thus I must now convert a simple direction into a steering angle. Another difficult part is when racing. I can’t just have it accelerate always, the car must brake when a sharp corner is coming up, and for really tight one, maybe even drift. So how do you do that? Well, i dont know yet, this past 4 hours I have been working on the same script and same section trying to figure that out. I really hope that next devlog I can come with a solution, but i cant promise anything. My plan is to calculate the curve of the upcoming curve, and then somehow spit out a good speed for that, but there are a lot of factors to account for, like the grip of the car and actual speed, distance to corner etc.
Racing ai, thats all I’ve been doing. It works fine-ish, i feel like Im close but it still overshoots, but I have some ideas on how to fix it.
Okk, I feel like i’m getting close. As you can see, the car now tries to build a racing line, this is all in real time. While its still not perfect, I feel like I am getting close. There are still some bugs related to the pathing on the road that I will have to fix, but overall its very good. The system works by identifying an apex. The geometrical apex is considered in this case the point which has the biggest angle difference compared to its neighbours. Now, after it identifies the apex, it grabs all points leading to the apex, and shifts them to the outside, before starting to shift them to the inside towards the apex, all using a sine wave based lerp in order to get a nice arc. While this system is good, I feel like the driver script that is responsible with making the car follow the points is kind of goofed, so i’ll look into that.
Alrighty, I decided to actually use my brain and came to the conclusion to instead bake the racing paths, instead of just having them create one at runtime. I made a small unity tool, I just place the checkpoints, click bake and a racing spline gets generated. If you look real close, you can see that the line follows an outside-inside-outside path for steering. Now that I have this, I will work on the racer Ai itself. First I will make it follow the track with optimal speed and then teach it to avoid obstacles, other cars and then even overtake.
I’m very happy with the racing AI, while it’s not perfect and cannot avoid everything, like a wall in the middle of the road, I dont think that will be the case like ever. It can avoid other cars, either static or not and it uses a basic prediction to determine if it’s on a collision course with another car and act accordingly. Also, for the path, as you could see from the beggining of the video, the path was already backed based on the road. The car then only decides when to brake and steer based on that path. Next up i’ll make a demo race with multiple racers and position marking and stuff and then get started on the map.
The racing AI is done. I also made a small race manager which takes the cars, aligns them in a grid and then starts a countdown. It also keeps trak of the position and lap-times, but there is no UI for that yet. I also started working on the Map for the demo, i’m still debating how big the demo will be, but probably it’ll be a few races. After I have a small map layout, i’ll get started on the traffic AI, and move on from there. Im still trying to get the hang of this road tool I am using, and also getting the road dimensions right, but we’ll see.
Ok, i’ve worked around a bit, and decided that for the first ship I want to release ONE very good feeling race. So I wont complicate myself with tuning and other systems, it will be one car, one race. So the atmosphere will be very important. I already have the layout of the race done, it’s supposed to go trough the docks > coast > downtown > highway and then the race ends. Also I believe making this small but very polished game will lend me more experience than something that will be overly complex, as many of my game projects end up. I will start with the terrain an polishing the track to make it more interesting in terms of driving and then i’ll get started on the terrain and dock area
The really fun part has begun! Im stylizing the game. Yeah, I decided to skip traffic for now and instead get busy making my environment. First I started by making a cool night sky and lighting, i turned on some settings, and I am pretty afraid that this game wont run decent at all when Im done, but ill do optimizing later, im sure it will be fine. Im still in search of models, as modelling everything by myself is out of the scope of this little project. But it’s gonna be pretty cool looking, i believe.
Alright, i’ve been busy collecting assets and making materials and collections in order to start work on the map, which I did, I started with the dock area, since I dont yet have many house models, and well, I think it’s looking pretty cool, ngl. Next up I’ll go around the track in order to detail the section most. I am using the darkness and distance as a tool to be lazy, but also optimize. No point in detailing a part the player wont see. Also in my toolset is the fact the player will be moving fast and concentrating on the road, so it won’t be necessary for me to detail every inch of the map, instead focusing on intersections and areas the player will be slow enough to notice such details.
I have been working on the map ever since the last devlog. There isn’t much to say as there is to show. The scene has gotten laggy with lag spikes that seem random, so I will have to investigate and see how to optimize the game.
The map is done! I added some bariers with a simple shader, but I might change them soon, as I dont like the way they look. I also added a new car for the race. I’ve also done some optimzing, enabled mesh batching, and after i’m 100% done with the map I will also bake the lighting for even better performance. I’ve decided to leave out traffic for now, as its’ pretty difficult to implement and I don’t have the time, since school is starting. As a small to do list for the ship: -Main menu with settings -Start sequence -Race Timer -Ending Cutscene -Model credit list -Sounds -Maybe some music
Soo, I made the car more believable. It has working brake lights (WOOW), and new engine sounds that make it sound more powerful, but also added something extra spice, like exhaust backfire, that is programically made, with a multitude of firecracker sounds that I then processed. Besides that I also added a turbo blow off sound. They use the simulated rpm to decide their pitch and intensity, while also considering the throttle difference and position. Last thing (visible in the last seconds of the last video), I improved the crash physics with detachable parts and deformable chassis.
I’ve reworked a few sections of the track and tweaked the racing AI. They can now almost always finish the race unless the player does some tomfoolery. Besides that I fixed a ugly visual bug where the terrain would poke trough the road when the camera was closed to the ground. Next, I remade the speedometer, RPM indicator and Gear indicator as you can see in the screenshots. The final thing that I added is a detection of “large” crashes, alltough is inconsistent, I dont currently have ideas how to fix it right now. For now when it detects a crash it enables slowmotion for a fraction of a second just for some oomph. All that remains for me to do is UI: -Race start countdown -Race finish info -Pause Menu -Main menu And a Game Over screen for when you crash. After these additions I will ship the game, as school started and I will have to shelve it, and I dont want to miss out on the sweet stardust it can offer!
BUILD READY!!! This is the last devlog before the ship. Alltough the game isnt in the state I would like it to be, school started and i’m in my terminal grade, so it’s a tough year ahead, so I have to shelve this project. The race is playable, its difficult in a way but its also fun. I also added a second level which is just an open map with a field and hills for you to test the driving physics and also as a lower graphical alternative to the city race. In the final hours of development I added all the basic necessary menus and fixed some bugs that I catched while testing. See you in the ship!
So, after all the positive feedback I couldn’t just leave the project to rot. Soo, in my free time I will try to work some more on this game. So I made a little list with what to add: I will be leaving the night city behind, it’s hard to optimize. Instead I will be making a forest/mountain scene, which I think will be cool to race in. I also decided to experiment some more with the visual effects available to me, so I added flares to light sources, for now a bit excessive, but oh well. I also upped the collision particles, more smoke, sparks and debris => looks better cuz it hides the bad crash physics (maybe ???) After I am done with the forest scene, and I will make a couple races, what will follow is another ship, and then I will work on traffic followed (if finished) by another ship.
I’ve been messing around with assets, lighting and visual effects. I kinda like this a bit more than the city night. So for the next demo, this will be the theme. I’ve also deleted the city scene, since it was just bad in terms of performance and other stuff. Basically, my hope is that, using a forest, will help me conceal a lot more, and repetition of trees and other assets wont be as visible as in a city, thus i’ll be able to finish it faster without losing visual fidelity. Also all the assets have LOD’s for optimization!
I’ve put in another hour on the map. I’ve decided to split the map in multiple regions for visual variety. There is the dense forest in the first photo, followed by a low vegetation, high altitude mountain region (began working, second and third photo). Planned is also a plains-like region, a lake and i’ll see if I can fit a small town somewhere. The roads are curved and never go straight for too long, and compared to the city map, some of the chicanes here make sense. I am still thinking about how I could still have the night city here in the next demo. Maybe i’ll restore the map itself, or i’m thinking of just adding a docks area for free driving.
I’ve been working on the dry-ish mountain region. I’ve also added grass to the map, as you can see. For the moment I have some lighting issues in the mountain region because of the rock models, and some settings, so the dry grass there is black, but other than that it looks great and it really helps fill the map with life. Other than map work, I took some time to work on the speed feeling. In the second and third photo is how the game looks at a speed of >120km/h. The edges get deformed, pulled back, and a vignette help sell the tunnel vision illusion. Besides that, its screen shake and FOV work. Between the third and last picture you can clearly see the difference between the two states.
The map is doneeeeeeee!!!! It’s as varied as I could make it, but you can see the different regions, and I like that. Besides that I’ve made the first race layout, and the AI just works (wowowowwow!!!!). Another cool thing I’ve added is wind, as a sound, when you go really really fast. On high speed, as I said in a previous devlog, a tunnel vision effect forms. Now, the sounds will deafen as if the ears are getting plugged, the only thing you hear clearly being the sound of the wind passing by your car. It has a really cool implementation, using a curve and some inverse lerp to sample, this way the effect is not linear and at low speed no big changes happen. Anyway, down here i’ll add some screenshots with the map, love to hear your feedback!
Speed. Speed is very important when it comes to racing, right? Well yes, but in a video game, where you sit down on a chair, static, in a room, the sensation of speed is even more important. That’s why these few hours i’ve been working on making the game feel fast . Changes have been made to the way the camera moves behind the car and in how it tracks it. Besides that, there has been a little sound work. At high speeds sounds become muffled and a wind noise can be heard. There is also the post processing i’ve been talking about in the other devlogs. Besides that, i’ve started reworking the UI, and the first element was the gauge cluster. I’ve decided to have the text physically live in the world, it reacts to the car, lagging behind or moving from side to side slightly. It also gets blurred at high speeds, because from a certain point it doesn’t matter if you’re going 150 or 200 kph, since that road barrier is still approaching you at a lethal speed, so you should probably just brake. I LOVE the way the driving turned out, and I sometimes sit for too long just driving around, so I can’t wait to get this game back to you guyz. Peace.
I’ve been working on the HUD for the game. Really simple, but it was missing. It features a lap counter, lap timer, best lap, lap delta, position. The speed/rpm/gear cluster is the same as before.
I’ve been working on a new surface system! Now I can add surfaces with different sounds and effects when sliding. I also added “rolling sounds” that play when just driving over at adequate speed. I’ve added a dirt surface, for obvious reasons. It also has something called rolling resistance. You will observe the fact that when driving over dirt with one side of the car still on the road, the car will steer towards the dirt, because of the higher resistance, and also will have as a consequence a lower top speed, also acting as a penalty for driving offroad. Besides that I also added ambient sounds, like a wind and leaves thing so that you can tell when standing still that you are in a forest :))) Last thing is I made the crashing better, no longer will any impact “crash” you but the sounds are also better, with separate sounds for high and low impact speeds. Basically a lot of polish for the game, the driving feels better, I feel like, because of it, and it also incentivises you to stay on the road, alltough the trees already kinda did that.
So, there have been a few changes. There are now drivers, the cars are no longer driven by ghosts. There are procedural animations for steering using IK (it’s really not that complicated. They also look ahead and where they drive (INCREDIBLE!!!!). Besides that they also react to crashes, eating the steering wheel, cus there ain’t no airbag (poor lads). I’ve reworked the crash system, not visually but technically. You are now allowed to have 3 small crashes, they still trigger the slow motion, but they don’t end your race. Crash many more times than that, your race ends. This way you are still penalised for bad driving. There is still a one hit “lethal impact”, but that basically means going top speed into a tree to trigger. Another small addition are some more sounds, to make the driving feel even better: -Gear shifter sounds -Handbrake pull/release sounds Just a small bit of polish. Besides that there were small bug fixes, nothing notable.
I made a line that shows you where to go, so you don’t need to guess anymore. It uses the baked racing path the AI uses, and passes the points to a line renderer. It also scales with speed, higher speed => line extends further, in order to help you see upcoming corners easier.
This has been a big push to finish the new version of the game. Together with a linux build the new version brings a new map, new UI, racing line, settings menu, AI-improvements, optimization, driver models, 3 new races, a loading screen, and a start race “screen”. Specific for this devlog, the settings menu, with three graphical presets, a loading screen and a start race screen. Two new races. Small map additions (some houses and parked cars, and physical objects incld cones and barriers that you can hit). Bug fixes across the board. A big challenge for this was the data transition between scenes and settings saving. And I used player prefs to save settings, and some simple static objects to transfer info between scenes. Overall what I have here is a nice base to start building a campaign.
Ships:
This is a small NFS inspired car game demo. It’s a project to test my technical abilities in Unity. It features custom made vehicle physics based on Unity’s built in wheel colliders and a custom easy to use solution for racing ai. Besides that, it is (in some small predetermined angles) a fairly good looking game, with a little bit of style. The game uses Unity’s HDRP render pipeline for its graphics, together with some screen space reflections and reflective materials, the game gets to look fairly good, especialy in the low light enviorment it’s set in. The car physics are in a sim-cade style. The car can still do crazy steering at high speeds, and its very easy to rotate it, but understeer and oversteer can still occur, besides that, the car is not limited in any way when it comes to external forces that can imbalance it, hit a curb at a high speed and the car can go flying. The biggest challenge was the racing AI. First of all it was hard to make a car know how much to steer to go from point A to point B. After that, it was fairly simple right? Just sample some point from the road spline and follow them. But curves exist, and for that you need to calculate the right speed to go trough it so that it wont crash. Then, the car was driving very inefficiently, following the middle of the road, so what followed was a long quest of making a racing path generator, in which I succeeded (with the help of AI). Then came obstacle avoidance, making the car not seem just like a train following a predefined track. If necessary the car will go off track to avoid obstacles and it’s aware of cars around it and will try to keep the distance. There is also a system that predicts collisions with other cars (for example if a car in front is cutting in front of it, it can predict that will happen and brake). This is all theory but it still works in game, sometimes. Another hard part was building a city. I had no prior experience in making games that aren’t made out of just basic cubes and shapes, so it was difficult to find assets and other stuff to populate the city. Then also came the point of how much detail should I even add and many other factors that in the end made me make the hard decision of making just one race in order to not break the illussion of a semi believable city. I’m very proud of how it came out, alltough I have so many ideas about how I can make it grander and better, but i currently don’t have the time to do so. I hope to come back in the future and actually make a cool metal-rock and boost infused racing game like NFS Most Wanted, but it has to wait. For those who want to play test the game. Currently there is only a windows version for the game, and it can also be pretty demanding in terms of GPU (Basically, I think it needs a dedicated GPU, I have a rtx 3050 4gb laptop GPU and it runs fine). There is a simpler driving demo scene which is just white terrain with some roads, that maybe will fair better with lower end hardware.
So, this is the new version of car gaim!!! There is a new map, much more optimized, together with settings and a linux build to improve accessibility. There are 3 races together with a free drive mode on the main map. Change log: -New map -3 new races -Settings -New UI/Hud -Racing line -Driver models and reactions -Driving Surfaces -New sounds (shifting, high speed, crash etc.) -Speed effects -Improved car model and textures -Small AI improvements -Loading Screen -New Crash system: three crashes or a big crash and you’re out of the race -Optimization -Partial controller support -Small destructable objects on the map The biggest challenge was finding time to still work on the game and also bring significant improvement. The time restrain allowed me to focus on the necessary and I really feel the game is in a better place now. Technically this update is much smaller than the first release (it’s obvious) but interconnecting all the systems in one product was a real hassle, especially with the UI, as Unity UI is a bit janky. Notes for testers: I found a region with very bad fps spikes, for which I haven’t found the cause for. Thankfully its only a small part of both races, and a small part on the map overall. There is partial controller support, menus haven’t been tested properly, but driving works. There is a Linux build, but it wasn’t tested, any notes about that are welcome. Download available on itch.io...
|
1792850016.1723537
|
1792936416.1723537
|
|
30862
|
Psync by @jacobjuneau | Stardance
|
jacobjuneau
|
1
|
93.0
|
1577
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-11T22:18:47Z", "hours": 93.0, "multiplier": 16.94, "payout": 1577, "blessing": "neutral", "text": "Note: Very untested, only try with projects you have backups of! Psync was designed to solve the problem of my laptop having limited storage and my with to be able to use my nas semi-transparently without the use of automountd or fuse both of which I have tried and deployed in other scenarios and neither of which are resiliant to not being able to contact the NFS server when on different networks. So i made Psync which uses encryption which make me feel secure enough to open it up to the internet instead of unauthenticated NFS.", "repo": "https://github.com/jacobjuneau6/Psync", "demo": "https://crates.io/crates/pwr-cli"}]...
|
[{"post_id": 26707, "ts": "202 [{"post_id": 26707, "ts": "2026-07-11T17:33:03Z", "hours": 2.0, "text": "Add bash tab completion script for pwr CLI commands Provide a bash completion function for all pwr subcommands and their flags. The completion script maps each subcommand to its valid arguments: init completes –server-host, –server-port, –psk, and –local-root; archive, restore, and ensure complete directory paths; status and list offer –recursive/-r; log provides –errors/-e and –project; shell completes bash, zsh, fish, and –init. The completion is installed via ‘source <(pwr completions bash)’ in .bashrc."}, {"post_id": 26622, "ts": "2026-07-11T15:31:34Z", "hours": 2.0, "text": "Document required parentheses around impl Trait syntax in handler signatures The Rust 2024 edition requires explicit parentheses around compound trait bounds in function argument position. Without them, ‘&mut impl Read + Write’ is ambiguous: it could parse as ‘(&mut impl Read) + Write’ (a mutable reference to a type implementing Read, with an additional Write bound) or ‘&mut (impl Read + Write)’ (a mutable reference to a type implementing both). The compiler requires the latter to be written with parentheses. Add a module-level doc comment explaining this so future maintainers do not attempt to remove the parentheses."}, {"post_id": 26556, "ts": "2026-07-11T13:30:09Z", "hours": 2.0, "text": "Add end-to-end integration tests for full client-server lifecycle Implement two end-to-end tests using paired in-memory byte streams (Pipe struct implementing Read+Write via Arc<Mutex<Vec») that simulate a complete client-server interaction without network dependencies. test_full_client_server_archive_restore_cycle creates a multi-file project directory, generates age encryption keys and a PSK, runs the archive pipeline to produce an encrypted blob, then spawns two threads for client and server communicating through paired pipes. The client performs the full protocol sequence: Handshake with HMAC-SHA256 proof, ArchiveRequest with project metadata, chunked data transfer with 1 MiB chunks and zero-length EOF marker, and ArchiveComplete with SHA-256 hash. The server thread receives the Handshake, verifies the client proof, responds with its own server proof for mutual authentication, reads the ArchiveRequest, receives all chunks via the 4-byte length-prefixed streaming protocol, and acknowledges ArchiveComplete. After both threads join, assertions verify the server received the exact encrypted blob, decryption succeeds, and the local project metadata transitions correctly through local → archived → placeholder states with .project.toml file survival. test_end_to_end_hash_verification_prevents_corruption validates that tampering with a single byte of the encrypted archive produces a different SHA-256 hash, ensuring integrity violations are detectable before extraction."}, {"post_id": 26393, "ts": "2026-07-11T04:56:13Z", "hours": 2.0, "text": "Add operation progress overlay to TUI and wire pwr tui subcommand in CLI Implement an OperationOverlay screen for the ratatui-based TUI that renders a centered modal dialog with a progress gauge, transfer statistics, and a cancel prompt during archive and restore operations. The overlay displays the operation name and project name in the title bar, a cyan progress gauge driven by the bytes_done/bytes_total ratio, a statistics line showing human-readable byte counts with percentage, and a status line that changes between ‘Press Esc to cancel’ during transfer, ‘Transfer complete’ on success, and red error text on failure. The format_size helper converts byte counts to GB/MB/KB/B with one decimal place. The handle_input method maps Escape to cancellation and Enter to dismissal after completion. Wire the pwr tui subcommand into the CLI behind the tui feature flag. The Commands enum gains a Tui variant gated by #[cfg(feature = “tui”)], the dispatch match arm calls cmd_tui(), and the tui module is conditionally compiled. Building without –features tui produces a CLI-only binary; building with the flag includes the ratatui and crossterm dependencies and the tui module, enabling pwr tui to launch the interactive interface."}, {"post_id": 26352, "ts": "2026-07-11T02:54:46Z", "hours": 1.9667, "text": "Annotate session state structs with allow(dead_code) for future use The ArchiveSession and RestoreSession structs in the handler state machine contain fields (session_id, file_count, compression, bytes_received, bytes_sent) that are stored for future use in resume-after-interruption logic and detailed transfer statistics. Currently they are only written during state transitions but not yet read back. Add #[allow(dead_code)] annotations to suppress compiler warnings while keeping the fields available for the planned transfer progress tracking and interrupted archive resume features."}, {"post_id": 26283, "ts": "2026-07-11T00:05:32Z", "hours": 2.0333, "text": "Fix warning: remove unused variable and clean up imports Remove the unused config variable clone from the listener accept loop where it was captured by the thread closure but never referenced. Remove the unused PrivateKeyDer import from rustls pki_types. Prefix the catch-all match variable with underscore to suppress the unused variable warning in the dispatch function. Keep the required parentheses around impl Trait syntax in argument position as required by Rust 2024 edition for disambiguation. Add MIT LICENSE file."}, {"post_id": 26236, "ts": "2026-07-10T22:03:06Z", "hours": 2.0, "text": "Add systemd service unit and deployment guides for server and client Create a hardened systemd service unit for pwr-server with security directives including NoNewPrivileges, PrivateTmp, ProtectSystem=strict, ProtectHome=yes, and read-only access to config and certificate paths with read-write access only to the project storage directory. The service runs as the pwr system user, restarts on failure with a 5-second delay, and logs to journald. Resource limits cap file descriptors at 4096 and memory at 512 MB. Add docs/server-setup.md covering the complete Debian 12 deployment workflow: installing build dependencies, compiling with cargo, initializing the server to generate TLS certificates and PSK, creating the storage directory with correct ownership, installing and enabling the systemd service, verifying the listener with ss, configuring firewall rules for nftables and iptables, and troubleshooting common issues. Add docs/client-setup.md covering the Arch Linux client workflow: building the binary, running pwr init with server host and PSK, setting up shell integration for bash, zsh, and fish, performing the first archive and restore, launching the TUI, and troubleshooting configuration and authentication errors. Include a full configuration file reference."}, {"post_id": 26145, "ts": "2026-07-10T19:28:04Z", "hours": 2.0, "text": "Fix client integration tests and add retry-aware connect test Repair the client integration test suite after the retry logic and library target additions. The connect_to_nonexistent_server test now uses a match statement instead of unwrap_err to work with the ClientResult type. The connect_timeout_is_respected test is marked #[ignore] because OS-level TCP timeout behavior varies across platforms, making sub-second timeout assertions unreliable in CI environments. Unused imports (TcpListener, Duration) are removed from the test file."}, {"post_id": 26055, "ts": "2026-07-10T17:19:39Z", "hours": 2.0, "text": "Add progress bar integration to CLI with empty-archive edge case handling also add 0-byte transfer file size."}, {"post_id": 25987, "ts": "2026-07-10T15:17:01Z", "hours": 1.9667, "text": "Add progress callback support to client archive and restore methods Extend archive_project and restore_project with optional progress callbacks that report bytes transferred against total size. The existing methods become thin wrappers calling the new archive_project_with_progress and restore_project_with_progress variants with None for backward compatibility. During archive, the callback fires after each 1 MiB chunk is written to the TCP stream, reporting cumulative bytes sent. During restore, the callback fires after each received chunk is appended to the buffer, reporting cumulative bytes received. The callback signature is fn(u64, u64) where the first argument is current progress and the second is the total, suitable for driving indicatif progress bars or TUI progress displays without coupling the client module to any specific UI library."}, {"post_id": 25938, "ts": "2026-07-10T13:15:41Z", "hours": 1.9667, "text": "Add exponential backoff retry logic to PwrClient connection Implement connect_with_retry in PwrClient that wraps the existing connection logic with up to 3 retry attempts using exponential backoff starting at 1 second and doubling to 2 and 4 seconds. The existing connect method is renamed to connect_once and made private, with the public connect method now calling it in a retry loop. Transient network failures such as TCP connection refused or TLS handshake timeouts are retried, while authentication failures are not (they propagate immediately since retrying with the same credentials would produce the same result). Each retry attempt is logged at WARN level with the error and delay, and a successful retry is logged at INFO level. The connect_timeout_secs from the client config is applied to each individual TCP connection attempt within the retry loop."}, {"post_id": 25722, "ts": "2026-07-10T04:53:07Z", "hours": 2.0, "text": "Implement TLS transport with custom certificate verifier and fingerprint pinning Replace the TLS-not-yet-implemented stub in the PwrClient with a working rustls-based TLS 1.3 connection layer. The connect_tls function builds a ClientConfig using the dangerous API with a custom certificate verifier (CertVerifier) that accepts self-signed server certificates — necessary because pwr-server generates its own ECDSA P-256 certificate during init rather than obtaining one from a public CA. Authentication is provided by the PSK handshake running over the encrypted channel, so the TLS layer provides confidentiality while the application layer handles mutual authentication. The verifier supports optional SHA-256 certificate fingerprint pinning. When a server_fingerprint is present in the client config, the verifier computes the SHA-256 hash of the server’s end-entity certificate and compares it against the pinned value, rejecting the connection on mismatch. When no fingerprint is configured, the verifier accepts any certificate but logs the observed fingerprint for the user to pin later, enabling a trust-on-first-use workflow. Signature verification in the verifier accepts all TLS 1.2 and 1.3 signatures without checking against a root CA. This is intentional: the security model relies on PSK-based mutual authentication at the application layer combined with certificate pinning for defense-in-depth, rather than on the Web PKI trust infrastructure which would reject self-signed certificates. The supported_verify_schemes list advertises ECDSA and RSA schemes to maximize compatibility."}, {"post_id": 25674, "ts": "2026-07-10T02:47:59Z", "hours": 1.9667, "text": "Add server address display to status command output Extend the status command to print the configured server host and port after the project count summary, giving users a quick reminder of which NAS their projects are archived to."}, {"post_id": 25619, "ts": "2026-07-10T00:28:40Z", "hours": 2.0333, "text": "Fix server handler and listener warnings: remove unnecessary parentheses and unused imports Clean up compilation warnings in the pwr-server crate. In handler.rs, the send_server_msg function signature used unnecessary parentheses around impl Write which triggered the unused_parens lint. In listener.rs, the PrivateKeyDer import was unused since the key is loaded via rustls_pemfile::private_key which returns a generic PrivateKeyDer type that does not need to be explicitly imported."}, {"post_id": 25572, "ts": "2026-07-09T22:06:58Z", "hours": 2.0, "text": "Clean up unused imports and fix compilation warnings in client TLS module Remove unused Arc import from the top-level client scope (it is only needed inside the connect_tls function where it is imported locally). Replace TrustAnchor with the correct ServerName import from rustls::pki_types. Remove the unnecessary mut qualifier from the ClientConnection binding in connect_tls."}, {"post_id": 25494, "ts": "2026-07-09T20:05:53Z", "hours": 2.0, "text": "Add –tls flag to all network commands, –limit to log, –auto-install to shell init Extend the CLI with connection and usability flags across all subcommands. Every command that contacts the server (archive, restore, ensure, status, list) now accepts a –tls flag that is passed through to PwrClient::connect, controlling whether the connection uses TLS with certificate pinning or plaintext for local testing. The log command gains a –limit flag defaulting to 50 entries, with a summary line showing how many entries were truncated. The shell init command supports –auto-install which opens the shell rc file in append mode and writes the eval line directly, providing a one-command setup experience. Function signatures throughout main.rs are updated to thread the new boolean parameter. The ensure command passes tls=false through to its internal restore call since ensure is triggered from the shell wrapper where TLS may not be configured. The list command delegates to cmd_status with tls=false for local-only directory scanning."}, {"post_id": 25418, "ts": "2026-07-09T18:04:28Z", "hours": 2.0, "text": "Wire progress bars and retry logic into CLI archive and restore commands Integrate the progress reporting module and retry logic into the two main CLI workflows. The archive command now creates a progress bar before the packaging pipeline and passes it to create_archive_with_progress via a ProgressFn callback that maps ArchiveStage values to status messages and fractional bar position. A second progress bar tracks the upload phase. Both bars are finished and cleared on completion. The restore command similarly uses a download progress bar keyed to the stored project size and an extraction progress bar sized to the received encrypted blob. Connection attempts now use with_retry wrapping PwrClient::connect with 3 retries and a 1-second base delay, retrying only on transient network errors as classified by is_retryable_error. This provides resilience against momentary server unavailability without masking fatal errors like authentication failures."}, {"post_id": 25343, "ts": "2026-07-09T16:03:49Z", "hours": 2.0, "text": "Add client integration test suite with handshake, streaming, retry, and progress tests Create 14 integration tests in pwr-cli/tests/client_integration.rs covering the client-side protocol layer. Handshake tests verify that ClientMessage frames encode with correct magic bytes, version, and type discriminants, and that decode_client_message recovers the original Handshake struct with client_id and nonce intact. Archive flow tests exercise ArchiveRequest and ArchiveComplete serialization round-trips with all fields including UUID, name, total_size, file_count, compression, and hash. Restore flow tests verify RestoreRequest encoding and decoding. Server response parsing tests validate that HandshakeAck, Error, and StatusResponse messages are correctly deserialized from framed payloads, including success flags, error codes, and project info vectors with UUID and file_count fields. Chunk streaming tests cover five size boundaries from zero bytes (EOF detection) through 1 MiB, plus standalone EOF marker encoding. Retry logic tests verify is_retryable_error correctly classifies connection failures, timeouts, and broken pipes as transient while treating authentication and not-found errors as fatal. with_retry is tested for immediate success, maximum retry exhaustion (initial + 3 retries = 4 calls), and early termination on non-retryable errors after 1 call. A progress stage test confirms all five ArchiveStage variants are distinct."}, {"post_id": 25289, "ts": "2026-07-09T14:02:25Z", "hours": 1.9667, "text": "Add progress reporting module with indicatif integration and stage callbacks Introduce a progress module in the pwr CLI crate that provides two display modes for long-running operations. The archive_progress_bar and restore_progress_bar functions create indicatif ProgressBar instances with styled templates showing a spinner, progress bar, byte counter, and ETA. The update_archive_progress function maps ArchiveStage enum values to human-readable status messages displayed in the bar. For non-interactive terminals or quiet mode, print_stage emits a simple line to stderr for each stage transition during archive or extract operations. This provides visibility into long-running operations without requiring a TTY."}, {"post_id": 25182, "ts": "2026-07-09T07:46:17Z", "hours": 2.0333, "text": "Implement TLS connector with certificate pinning and retry logic for the client Add a complete TLS connection path to PwrClient, replacing the previous stub that returned a not-yet-implemented error. The connect_tls function builds a rustls ClientConfig with webpki root certificates for standard PKI validation. When a server_fingerprint is set in the client config, a custom FingerprintVerifier replaces the default verifier. This verifier computes the SHA-256 hash of the server’s end-entity certificate DER bytes and compares it against the pinned hex fingerprint, implementing trust-on-first-use style certificate pinning without requiring a private CA. The verifier supports TLS 1.2 and 1.3 signature schemes including RSA and ECDSA P-256. The PwrClient struct gains server_addr, psk, and pinned_fingerprint fields, enabling a reconnect method that re-establishes a TCP connection to the same server and re-runs the PSK handshake without reloading the config file. The connect method now branches on use_tls, routing to either the TLS path with certificate validation or the plaintext path for local testing. Add retry logic via the with_retry helper, a generic function that wraps any fallible operation with exponential backoff. The caller provides a retryable-error predicate; is_retryable_error recognizes connection refused, timeout, connection closed, connection reset, broken pipe, and unexpected EOF as transient errors worth retrying. The base delay doubles each attempt, with a configurable maximum number of retries."}, {"post_id": 25150, "ts": "2026-07-09T05:35:05Z", "hours": 2.0, "text": "Add server integration test suite and library target for external testing Create 17 integration tests in pwr-server/tests/server_integration.rs covering the full server subsystem. Storage CRUD tests (6) verify project creation with duplicate rejection, removal, archive read/write round-trips through the storage layer, persistence across re-opens via registry JSON, and size limit enforcement rejecting archives exceeding the configured max_project_size_gb. PSK handshake tests (3) validate the full mutual authentication flow with correct proof verification and wrong-PSK rejection. Frame-level integration tests (3) exercise the complete serialization pipeline: Handshake framing round-trip with client_id and nonce preservation, ArchiveRequest framing with all fields intact, and server message decode direction checking. File chunk streaming tests (2) simulate the chunk protocol by encoding 250 KB of cyclical data across 4 KB chunks with 4-byte length prefixes and EOF markers, reassembling on the receiver side and verifying content equality. An empty archive test confirms that a standalone EOF marker produces zero bytes of received data. Rate limiter tests (3) verify the 6th attempt is blocked after 5 allowed, success resets the window, and different IPs are tracked independently. A full archive-restore simulation test writes 500 KB of data through the storage layer, reads it back, and verifies byte-exact restoration plus metadata persistence. A cleanup test confirms that removing a project after a failed archive deletes both the archive file and registry entry. To support external integration tests, a library target (lib.rs) is added to pwr-server, re-exporting all modules as public while the binary target (main.rs) retains its own private module declarations."}, {"post_id": 25104, "ts": "2026-07-09T02:58:05Z", "hours": 2.0, "text": "Add file chunk streaming to archive and restore handlers Implement the raw chunk streaming protocol in both directions on the server side. After accepting an ArchiveRequest, the handler enters a chunk receive loop (handle_archive_chunks) that reads 4-byte big-endian length prefixes followed by that many bytes of data, appending each chunk to the project’s archive file on disk via append-mode file I/O. A zero-length chunk signals EOF. The total bytes received is logged for monitoring. On the restore side, handle_restore_chunks reads the complete archive file from disk through the storage layer, then streams it back to the client in 1 MiB chunks with the same 4-byte length-prefixed format, followed by a zero-length EOF marker and a flush. This mirrors the client’s restore_project method which reads chunks in the same format. The dispatch function now chains the chunk streaming phase after the initial request acceptance: ArchiveRequest dispatch calls handle_archive_start followed by handle_archive_chunks, and RestoreRequest calls handle_restore_start followed by handle_restore_chunks. The ArchiveComplete and RestoreComplete messages are received as framed messages after the chunk phase completes, handled by the existing finish functions."}, {"post_id": 24986, "ts": "2026-07-08T21:34:40Z", "hours": 2.0, "text": "Add IP-based authentication rate limiter and integrate into handshake handler Implement a per-IP rate limiter in the server’s auth module that tracks failed authentication attempts within a sliding 60-second window. Each IP is allowed up to 5 failed handshake attempts before being banned for 300 seconds. The RateLimiter maintains an in-memory HashMap<IpAddr, RateLimitEntry> with periodic cleanup of expired entries to prevent unbounded memory growth. The check_attempt method atomically increments the attempt counter, resets the window if it has expired, checks whether the IP is currently banned, and returns false if the attempt should be rejected. record_success resets the counter and clears any ban on successful authentication, allowing legitimate clients that temporarily misconfigured their PSK to recover. The rate limiter is shared across all connections via Arc<Mutex<» and passed through HandlerContext. The handshake handler calls check_attempt before validating the PSK proof, ensuring brute-force attempts are blocked before any cryptographic work is performed. If the rate limit is exceeded, a HandshakeAck with a descriptive error is sent and the connection is closed. On successful authentication, record_success is called to clear the counter. Four unit tests verify that the first five attempts are allowed, the sixth is blocked, record_success resets the counter, and different IPs are tracked independently."}, {"post_id": 24904, "ts": "2026-07-08T19:20:56Z", "hours": 2.0, "text": "Implement server main entry point with clap CLI and fix listener/handler compilation Add a complete main.rs for pwr-server with three clap subcommands. The init subcommand detects or accepts a hostname, delegates to cert::init_server for TLS certificate generation, PSK creation, and config file writing, then prints the start command. The start subcommand locates the config file via the standard search path, loads and validates the ServerConfig, logs the bind address and storage path via tracing, and calls listener::run to begin accepting connections (blocks until shutdown). The status subcommand loads the config and prints a summary of all settings plus a connectivity check by attempting a brief TCP connection to the configured port, reporting whether the server appears to be running. Logging is configured via tracing-subscriber with an env-filter defaulting to pwr_server=info, controllable via the RUST_LOG environment variable. The –foreground flag on the start subcommand is accepted but daemonization is not yet implemented. Fix two compilation errors discovered during integration. The listener’s TLS setup incorrectly pattern-matched rustls::StreamOwned::new as if it returned a Result; it returns the stream directly in rustls 0.23. The handler’s handle_archive_finish had a borrow conflict where the session reference from the Archiving state match arm prevented reassigning *state; the fix extracts project_uuid and project_name into local variables before the state transition."}, {"post_id": 24827, "ts": "2026-07-08T17:13:43Z", "hours": 2.0, "text": "Add comprehensive crypto integration test suite with 26 tests Introduce crypto_integration.rs exercising the full security subsystem across four categories. PSK tests (8) verify 256-bit key generation across ten iterations, hex round-trip preservation including case insensitivity, rejection of odd-length and wrong-length hex strings, deterministic client proof computation, the complete mutual authentication flow with distinct client and server proofs, and PSK binding where different keys produce different proofs. Age encryption tests (6) cover small, empty, and 1 MB large payload round-trips, ephemeral key non-determinism (same plaintext produces different ciphertext but both decrypt correctly), wrong identity rejection, and corrupted ciphertext detection via single-byte flipping mid-payload. HKDF tests (4) verify 256-bit output length, deterministic derivation for same PSK and UUID, cross-project key uniqueness for different UUIDs, and a known-UUID stability test confirming the derived key is neither all-zeros nor all-PSK-bytes. Integrity tests (3) confirm streaming hasher equivalence with oneshot hashing across 5 MB of 64 KB chunks, empty file hashing matching the well-known empty SHA-256 digest, and proper I/O error propagation for nonexistent files. Archive round-trip tests (3) create a multi-file project with README, two Rust sources, a design doc, and Cargo.toml, run through create_archive → extract_archive, verify all file contents match exactly and .project.toml is excluded. Hash verification rejection confirms wrong hashes prevent extraction. A progress callback test records all stage transitions during archive creation and verifies the final progress fraction reaches 1.0."}, {"post_id": 24701, "ts": "2026-07-08T13:51:58Z", "hours": 2.0, "text": "Add progress callback support to archive and extract pipelines Introduce progress reporting to the archive packaging and extraction functions through an optional callback parameter. The ProgressFn type is a boxed closure receiving an ArchiveStage enum and a fractional progress value from 0.0 to 1.0. Eight stages cover the full lifecycle: Scanning, Tarring, Compressing, Encrypting, Hashing, Decrypting, Decompressing, and Extracting. The original create_archive and extract_archive signatures are preserved as convenience wrappers that call the new create_archive_with_progress and extract_archive_with_progress variants with None for the callback, maintaining backward compatibility for callers that do not need progress reporting. Progress granularity is coarse but meaningful: the archive pipeline reports six transitions (Scanning at 0.0, Tarring at 0.1, Compressing at 0.3, Encrypting at 0.5, Hashing at 0.9 and 1.0). The extract pipeline reports eight transitions (Hashing at 0.0 and 0.2, Decrypting at 0.3 and 0.5, Decompressing at 0.6, Extracting at 0.7 and 1.0). Future refinements could report per-file progress during the tar stage by tracking bytes written against the pre-computed directory size."}, {"post_id": 24514, "ts": "2026-07-08T03:32:17Z", "hours": 2.0, "text": "Add HKDF-SHA256 per-project key derivation from master PSK Implement derive_project_key in the crypto module using ring’s HKDF implementation with SHA-256. The function takes the 256-bit master PSK as the HKDF salt and the project UUID bytes as the info parameter, producing a deterministic 256-bit per-project key. This design means per-project encryption keys are never stored on disk — they are re-derived from the master PSK and project UUID on each archive or restore operation. If the PSK is rotated, all existing projects become inaccessible, which is documented as a deliberate security property rather than a bug. The HKDF-Extract step uses the PSK as the salt with an empty initial key material, producing a pseudorandom key. HKDF-Expand then derives 32 bytes of output key material bound to the project UUID via the info parameter, preventing cross-project key reuse even if an attacker learns one project’s derived key. Four tests verify deterministic derivation, UUID binding, PSK binding, and correct 256-bit output length."}, {"post_id": 24448, "ts": "2026-07-08T00:35:04Z", "hours": 1.9667, "text": "Implement complete integrity verification module with streaming hasher Replace the stub hash_file function with a full implementation that reads files in 64 KiB chunks through std::io::copy into a SHA-256 hasher, avoiding memory pressure for arbitrarily large inputs. Add hash_bytes_raw for callers that need the 32-byte binary digest rather than a hex string. hash_reader accepts any io::Read source, enabling hash computation on network streams or in-memory buffers without materializing intermediate files. Introduce StreamingHasher for incremental hash computation across multiple update calls. This is designed for chunked network reception where the full data is never in memory at once: the receiver calls update on each chunk as it arrives, then finalize or finalize_raw to obtain the digest. The struct wraps sha2::Sha256 and implements Default. Verification helpers verify_hash and verify_file_hash compare computed hashes against expected hex strings, returning bool rather than Result for use in assert-style checks. The crypto module’s sha256_hex and sha256_file functions are updated to delegate to the integrity module, making it the single canonical location for SHA-256 operations. Ten tests cover known-answer vectors for the empty string and ‘hello world’, raw hash byte length, file hashing including a 10 MB large-file path to exercise chunked I/O, hash verification for both match and mismatch cases, file verification, streaming hasher correctness against a known answer, streaming-vs-oneshot equivalence across four chunks, and hash_reader with an in-memory source."}, {"post_id": 24339, "ts": "2026-07-07T20:58:46Z", "hours": 2.0, "text": "Add comprehensive protocol integration test suite Introduce 20 integration tests in pwr-core/tests/protocol_integration.rs that exercise the full protocol layer without network dependencies, operating entirely on in-memory frame buffers and byte streams. Frame encode/decode round-trips validate that ArchiveRequest, RestoreRequest, and Handshake messages survive serialization through the full pipeline: typed ClientMessage enum to JSON payload to framed bytes with magic and length prefix through decode_frame back to typed enum with correct field values. FrameDecoder buffering tests cover two edge cases: byte-by-byte arrival where the decoder correctly reports None for incomplete frames across dozens of individual push_bytes calls until the full frame is available, and multi-frame reads where two concatenated frames in a single buffer are decoded sequentially without leftover bytes. Error injection tests verify that bad magic bytes produce errors, truncated frame headers (fewer than 10 bytes) return None rather than errors, payloads exceeding the 16 MiB limit are rejected, unsupported protocol versions are detected, and unknown message type bytes trigger framing errors. File chunk streaming tests cover exact 1 MiB chunks, zero-length data (which is indistinguishable from the EOF marker by design since empty chunks serve no purpose), EOF detection, and reassembly of 500 KB of cyclical data across 4 KB chunks with content verification. Serialization coverage iterates over all five ClientMessage variants and all seven ServerMessage variants, verifying each round-trips through JSON and preserves its message_type discriminant. Boundary tests handle empty ProjectInfo lists, near-max-size payloads with u64::MAX size_bytes and u32::MAX file_count, and direction-mismatch rejection where decode_client_message and decode_server_message refuse payloads from the wrong direction."}, {"post_id": 24259, "ts": "2026-07-07T18:26:22Z", "hours": 2.0, "text": "Refactor client to use typed ClientMessage/ServerMessage enums and protocol builders Replace raw struct construction and manual frame encoding in the archive, restore, and status methods with protocol builder functions and typed message enums. archive_project now calls protocol::build_archive_request and protocol::build_archive_complete. restore_project uses protocol::build_restore_request. The send_client_msg and recv_server_msg helpers replace the generic send_frame and recv_frame functions, providing type-safe serialization for ClientMessage enums and typed deserialization via protocol::decode_server_message for ServerMessage responses. The handshake function is updated to construct the Handshake message as a ClientMessage::Handshake variant and match the response as a ServerMessage::HandshakeAck variant, with error handling for ServerMessage::Error responses. Response parsing in all methods uses match on ServerMessage variants instead of serde_json::from_slice with unwrapped payloads, catching unexpected message types at the call site rather than failing silently with deserialization errors. The import list is reduced from a wildcard protocol::* to explicit imports for ClientMessage, Handshake, ProjectInfo, ServerMessage, and the protocol module itself for builder function access."}, {"post_id": 24168, "ts": "2026-07-07T15:49:02Z", "hours": 2.0, "text": "Refactor server handler to use ClientMessage/ServerMessage enums and protocol builders Rewrite the connection handler’s dispatch function to decode raw frame payloads through protocol::decode_client_message, which returns a typed ClientMessage enum. The match statement now patterns on the enum variant directly rather than matching MessageType discriminants and manually deserializing individual structs. This eliminates redundant deserialization code and catches direction mismatches at the protocol boundary. All server response construction now uses the protocol builder functions: build_handshake_ack_success, build_handshake_ack_failed, build_archive_accept, build_restore_accept, build_status_response, and build_error. The send_server_msg helper takes a ServerMessage enum, calls message_type() for the frame header discriminant, and serializes through encode_frame. This replaces scattered struct literal construction and manual frame encoding with a single call site. The handler functions (handle_handshake, handle_archive_start, handle_archive_finish, handle_restore_start, handle_status) are unchanged in logic but now operate on the inner payload structs extracted by the dispatch layer. Storage locking uses scoped blocks with read().unwrap() and write().unwrap() guards that drop before the next operation. Unused imports are cleaned up, including the removal of the deprecated ring::constant_time import."}, {"post_id": 24104, "ts": "2026-07-07T13:45:46Z", "hours": 2.0, "text": "Add typed builder functions for all protocol message flows Introduce convenience constructors in the protocol module that build ClientMessage and ServerMessage enums from their constituent fields, eliminating the need for callers to construct nested struct literals. For the archive flow, build_archive_request accepts a UUID, name, size, file count, and compression flag, while build_archive_complete and build_archive_failed produce the terminal ArchiveComplete variants. For the restore flow, build_restore_request wraps a project UUID, build_restore_accept bundles session metadata with size and hash, build_restore_complete signals success, and build_restore_failed attaches an error string. Handshake builders handle both success and failure Ack messages with the server nonce, proof, and optional reason. Additional helpers cover ArchiveAccept, StatusResponse, and generic Error messages. These builders centralize protocol message construction so handler and client code does not repeat struct literals and reduces the surface area for missing required fields."}, {"post_id": 23954, "ts": "2026-07-07T05:15:09Z", "hours": 2.0, "text": "Add ClientMessage and ServerMessage sum types with typed deserialization dispatch Introduce two unified enums to the protocol module that wrap all message variants for type-safe routing in the connection handler state machine. ClientMessage covers the five messages the client can send (Handshake, ArchiveRequest, ArchiveComplete, RestoreRequest, StatusRequest) and ServerMessage covers the six server responses (HandshakeAck, ArchiveAccept, RestoreAccept, RestoreComplete, StatusResponse, Error). Each variant delegates serialization to the inner struct via serde’s internally-tagged enum representation using a ‘type’ discriminator field. The message_type method on each enum maps variants to their MessageType discriminant byte, enabling the frame encoder to write the correct header without the caller tracking the mapping manually. Two deserialization functions, decode_client_message and decode_server_message, take a raw payload and a MessageType discriminant and return the typed enum. They validate that the discriminant matches the expected direction, rejecting client message types when a server message is expected and vice versa, catching protocol-level dispatch bugs at the decoding layer rather than deeper in handler logic. The MessageType enum is relocated from the frame module to the protocol module since it is a protocol concern, resolving a circular import between the two modules. Frame encoding continues to reference MessageType for the frame header type byte. The from_byte constructor maps all 13 assigned discriminants with explicit match arms for stability. Eight new tests cover ClientMessage and ServerMessage JSON round-trips, direction-mismatch rejection in decode_client_message and decode_server_message, and message_type discriminant mapping for both enums, adding to the existing serialization and discriminant tests."}, {"post_id": 23872, "ts": "2026-07-07T02:13:05Z", "hours": 2.0, "text": "Add comprehensive README with architecture overview, security model, and setup guides Document the complete pwr project covering the three-crate architecture, security model with its three layers (TLS transport, PSK authentication, and age at-rest encryption), quick-start guides for both Debian 12 server and Arch Linux client, the .project.toml file format specification, complete command reference table, configuration file reference for both client and server TOML files, and build-from-source instructions with feature flags for the optional TUI."}, {"post_id": 23820, "ts": "2026-07-06T23:56:22Z", "hours": 2.0, "text": "Add TLS certificate generation and server initialization utility Implement a certificate generation module in pwr-server that produces self-signed ECDSA P-256 certificates for TLS 1.3 via the rcgen crate. generate_certificate accepts a common name (typically the server hostname), creates certificate parameters with a distinguished name, generates a P-256 keypair, self-signs the certificate with a 365-day validity, and returns the PEM-encoded certificate, PEM-encoded private key, and a SHA-256 hex fingerprint of the certificate for client-side pinning. save_certificate writes the certificate and key to the configured paths with appropriate permissions: the certificate file is world-readable while the private key is restricted to owner-only (mode 0o600 on Unix). Parent directories are created automatically. The init_server function ties everything together for first-time setup. It generates the TLS certificate and key, saves them to /etc/pwr/, generates a random 256-bit PSK via ring’s CSPRNG, creates a ServerConfig with the PSK and certificate paths, and saves the config to /etc/pwr/server.toml. The PSK hex string and certificate fingerprint are printed to stdout with instructions for copying the PSK to the client config. This gives administrators a single command to bootstrap a new pwr-server instance with all security material generated fresh and properly permissioned."}, {"post_id": 23698, "ts": "2026-07-06T20:10:17Z", "hours": 2.0, "text": "Add ratatui-based TUI with project browser, creator, and log viewer screens Implement a terminal UI for interactive project management using ratatui 0.28 with the crossterm backend. The application shell provides a tabbed interface with three screens accessible via number keys (1-3) or Tab cycling. A status bar at the bottom displays global keybindings. The Project List screen renders a scrollable table of tracked projects discovered by scanning the local root directory for .project.toml files. Each row displays a color-coded status indicator (green for local, yellow for archived), project name, human-readable size, and last-sync date. Vim-style j/k and arrow key navigation is supported. Pressing r refreshes the list from disk. The screen is empty with an appropriate message when no projects are configured. The Project Creator screen provides a two-field form for interactively creating .project.toml files. The name field is pre-filled from the current directory name. Tab and Shift+Tab cycle focus between name and local path fields. Typing appends characters, backspace deletes. Ctrl+S validates that the path exists and is a directory, that the name is non-empty, then writes the .project.toml via the core library’s atomic write function. Status messages appear on success or validation failure. The Log Viewer screen reads the local JSONL transaction log and displays entries in a scrollable table with timestamp, operation type, project name, data size, and color-coded status (green OK, red FAILED, yellow in-progress). Supports refresh with r and j/k navigation. The TUI is enabled behind the tui Cargo feature flag which gates the ratatui and crossterm dependencies."}, {"post_id": 23620, "ts": "2026-07-06T18:02:51Z", "hours": 2.0, "text": "Implement full CLI command suite with shell integration and client networking"}, {"post_id": 23512, "ts": "2026-07-06T15:10:42Z", "hours": 2.0, "text": "Implement archive packaging pipeline and client networking module Add the archive packaging pipeline to pwr-core. The create_archive function builds an encrypted project archive through a four-stage streaming pipeline. First, the project directory is walked recursively and added to a tar archive via the tar crate, excluding .project.toml metadata files. Second, the tar stream is gzip-compressed using flate2 at default compression level and written to a temporary file to bound memory usage independent of project size. Third, the compressed tarball is read back and encrypted using the age X25519 public key from the project’s metadata, producing an opaque encrypted blob the server cannot read. Fourth, the SHA-256 hash of the encrypted blob is computed for integrity verification after transfer. Symlinks are preserved in the archive. The reverse pipeline, extract_archive, first verifies the SHA-256 hash against the expected value, then age-decrypts, gunzips, and untars into the target directory. Two tests verify create-extract round-trip fidelity (README.md, src/main.rs, and Cargo.toml are restored with correct content) and that hash mismatch prevents extraction. Add the protocol client module to the pwr binary. PwrClient manages a connection to pwr-server with TCP socket setup, configurable timeouts, PSK handshake authentication with mutual server proof verification, and framed message send/receive via the core frame module. The archive_project method sends an ArchiveRequest, receives acceptance, streams archive data in 1 MiB chunks with 4-byte length prefixes and a zero-length EOF marker, and sends ArchiveComplete with the SHA-256 hash. The restore_project method requests a project by UUID, receives a RestoreAccept with size metadata, streams chunks back from the server, and returns the complete encrypted blob. get_status queries the server for project listings with optional UUID filtering. The handshake helper generates a 32-byte CSPRNG nonce, computes the HMAC-SHA256 client proof, sends the Handshake message, verifies the server’s HandshakeAck success flag, and performs mutual authentication by validating the server proof against the expected value using constant-time comparison."}, {"post_id": 23258, "ts": "2026-07-06T03:13:55Z", "hours": 2.0, "text": "Implement pwr-server storage backend, connection handler, and TLS listener Add the three core server modules that together form the NAS-side daemon. The storage module (storage.rs) manages an on-disk project registry as a JSON index file mapping UUIDs to StoredProject entries containing name, size, file count, encryption flag, and timestamps. The registry is persisted atomically using a write-to-temp-then-rename pattern. Per-project directories under the configured storage base path hold data.enc (the encrypted archive blob) and meta.toml (per-project metadata). Methods provide CRUD operations on the registry, streaming archive read/write through buffered I/O, storage limit enforcement against the configured max_project_size_gb, and filesystem directory management. Five tests verify create-and-list, duplicate rejection, remove, archive write-read round-trip, and registry persistence across re-opens. The handler module (handler.rs) implements a per-connection state machine with five states: AwaitingHandshake, Authenticated, Archiving, Restoring, and Closed. The dispatch function routes decoded frames by state and message type. The handshake handler validates the client’s HMAC-SHA256 proof in constant time using ring::constant_time::verify_slices_are_equal, then generates a server nonce and server proof for mutual authentication. Archive start creates a project entry after checking the storage limit, archive finish updates the final size or rolls back on failure. Restore start looks up the project and verifies the archive file exists. Status queries support both single-UUID lookup and full listing. Storage is shared across connections via Arc<RwLock> with per-operation read or write locking. The listener module (listener.rs) loads PEM-encoded TLS certificates via rustls-pemfile, builds a rustls ServerConfig with TLS 1.3 and the application-level protocol negotiation tag “pwr/1”, binds a std::net TcpListener, and spawns each accepted connection on a dedicated OS thread with a rustls::StreamOwned wrapping the TCP stream for TLS encryption."}, {"post_id": 23204, "ts": "2026-07-06T00:55:44Z", "hours": 2.0, "text": "Implement cryptographic layer with PSK authentication, age encryption, and SHA-256 integrity Add the complete cryptographic subsystem to pwr-core, providing three layers of security for the protocol. The pre-shared key authentication layer uses HMAC-SHA256 to compute challenge-response proofs. The client proves knowledge of the PSK by sending HMAC(client_nonce || “pwr-auth-v1”, PSK). The server responds with HMAC(client_nonce || server_nonce || “pwr-auth-v1”, PSK), enabling mutual authentication. Both nonces are 32-byte CSPRNG values generated per-connection using ring’s SystemRandom. The PSK itself is a 256-bit random key stored as a hex string in both config files. Helper functions handle hex encoding and decoding. At-rest encryption uses age with X25519 key pairs. generate_age_identity creates a fresh keypair, stores the secret identity at ~/.config/pwr/identity with 0o600 permissions, and returns the Bech32 public key for inclusion in .project.toml. The age_encrypt function takes a public key string and plaintext, producing an age-format encrypted blob using the one-shot Encryptor API. age_decrypt reverses this with an identity, returning the original plaintext. Both functions propagate structured errors for wrong keys, corrupted data, and unsupported formats. Integrity verification uses SHA-256 via the sha2 crate. sha256_hex hashes an in-memory buffer. sha256_file streams through a file in 64 KiB chunks to support large projects without memory pressure. Ten tests verify PSK randomness and hex round-trips, deterministic proof computation (same inputs produce same outputs), mutual proof divergence (client and server proofs differ), age encrypt-decrypt round-trips for both empty and non-empty payloads, wrong-identity rejection, known-answer SHA-256 vectors, and file hashing against the same known answer."}, {"post_id": 23125, "ts": "2026-07-05T21:58:39Z", "hours": 2.0, "text": "Implement wire protocol message types and frame encoding layer Define the complete set of protocol messages shared between client and server in pwr-core. The MessageType enum assigns stable 1-byte discriminants to each message variant for routing in the frame header. Handshake messages carry 32-byte client and server nonces with HMAC-SHA256 proofs for mutual PSK authentication, plus a server version string and optional error reason for debugging failed handshakes. Archive flow messages coordinate project uploads: ArchiveRequest announces the project UUID, name, total size, file count, and compression flag; ArchiveAccept returns a session UUID for correlating subsequent chunks; ArchiveComplete reports the final SHA-256 hash and transfer size. Restore flow mirrors this with RestoreRequest, RestoreAccept (carrying size and hash so the client can pre-allocate), and RestoreComplete. File streaming uses FileHeader (relative path, size, Unix mode bits) sent before raw chunk data and FileEnd (SHA-256 checksum) sent after. Query messages provide StatusRequest with optional project UUID filter and StatusResponse with a ProjectInfo vector carrying UUID, name, size, file count, and timestamps. The frame module implements a 10-byte header format: 4 magic bytes (0x50575246, ASCII “PWRF”), 4-byte big-endian payload length, 1-byte protocol version, and 1-byte message type. Payloads are JSON-encoded for debuggability. encode_frame serializes and wraps a message; decode_frame validates magic, version, and length bounds, returning None when more data is needed. FrameDecoder maintains an internal buffer for incremental socket reads. File chunks use a separate 4-byte length-prefixed streaming format with a zero-length EOF marker, keeping large file data out of the JSON framing layer. Thirteen tests cover message type discriminants, serialization round-trips for ArchiveRequest and ProjectInfo, handshake nonce sizes, frame encode-decode with magic verification, partial-read buffering in FrameDecoder, oversized frame rejection, bad magic rejection, file chunk encode-decode, and EOF marker detection."}, {"post_id": 23041, "ts": "2026-07-05T19:34:43Z", "hours": 2.0, "text": "Implement project file I/O with atomic writes, placeholder detection, and directory utilities Add the complete project file management layer in pwr-core. The .project.toml file is the stable identity marker that persists on local disk regardless of whether project content is present (Local state) or stored on the server (Archived state). read_project_file returns Option, returning None when no .project.toml exists so callers can distinguish untracked directories from tracked projects. write_project_file uses an atomic write-through pattern: contents are serialized to a .tmp sibling file first, then renamed over the target, preventing readers from observing a partially written metadata file. remove_project_file deletes the marker without touching directory contents. State detection predicates cover all cases needed by the CLI and shell wrapper. is_archived_placeholder confirms that a directory contains only a .project.toml whose state field is Archived — the signal that triggers automatic restore in the ensure command. is_local_project checks for the opposite state. is_tracked simply tests file existence without parsing. Directory utilities support the archive and restore workflows. dir_size computes total bytes excluding the metadata file itself, with symlinks counted by their target path length rather than followed. file_count tallies regular files recursively for transfer progress estimation. remove_dir_contents_except_project strips a directory down to its .project.toml placeholder after a successful archive. Eleven tests cover round-trip I/O, atomic write behavior, placeholder and local state detection, tracking predicate, exact byte counting, file enumeration, directory stripping, and recursive discovery."}, {"post_id": 22950, "ts": "2026-07-05T16:44:00Z", "hours": 2.0, "text": "Implement server-side configuration management with validation and storage layout Add the ServerConfig struct to the pwr-server crate, controlling all aspects of the daemon’s operation. The configuration specifies the TCP bind address and port (defaulting to 0.0.0.0:9742), the filesystem root for project storage (defaulting to /srv/pwr/projects), paths to the TLS certificate and private key files, the hex-encoded 256-bit pre-shared authentication token that clients must present during the handshake, and operational limits including maximum concurrent connections (default 32), maximum project size in gigabytes (default 500), and an idle timeout for authenticated connections (default 300 seconds). Validation is performed at load time: the port must be non-zero, the auth token must be non-empty, and both max_project_size_gb and max_connections must be positive. The validate method returns a plain String error so the caller can present it directly to the user without depending on the shared pwr-core error types, keeping the server crate’s dependency surface minimal during early development. A config file search strategy checks four locations in order: an explicit –config CLI path, the current working directory (for development), the XDG config directory under ~/.config/pwr/, and the system-wide /etc/pwr/server.toml. Helper methods compute derived paths: project_dir returns the per-UUID storage subdirectory, registry_path returns the JSON index file location, and bind_addr formats the socket address for TcpListener::bind. Seven tests cover default validation, empty-token rejection, zero-port rejection, bind address formatting, project directory path generation, registry path naming, and a full save-load round-trip through TOML serialization and deserialization."}, {"post_id": 22866, "ts": "2026-07-05T14:19:16Z", "hours": 2.7561, "text": "Add client configuration management with server connection settings Refactor the PwrConfig struct to support the protocol-based architecture by replacing rsync-oriented fields (NAS hostname, SSH user, rsync options) with connection parameters for the pwr-server daemon. The new fields are server_host for the NAS hostname or IP address, server_port defaulting to 9742, and server_psk storing a hex-encoded 256-bit pre-shared key for HMAC-SHA256 authentication during the TLS handshake. Certificate pinning is supported through an optional server_fingerprint field that stores the SHA-256 hash of the server’s self-signed X.509 certificate. When set, the client rejects connections where the server presents a certificate with a different fingerprint, preventing man-in-the-middle attacks even if an attacker obtains a valid CA-signed certificate for the server’s hostname. Timeout configuration separates connection establishment (default 10 seconds) from long-running transfers (default 300 seconds) so users can tune them independently. Path helpers provide the standard XDG config directory layout: config.toml for connection settings, identity for the age encryption keypair, and transactions.log for the JSONL audit trail. The config_exists predicate lets callers check for prior initialization without triggering the NoConfig error path. The load_config function maps TOML parse errors into the TomlParse variant carrying the file path for actionable error messages. A server_addr convenience method joins host and port for use with TcpStream::connect. Three tests verify address formatting, config path construction, and port default values."}, {"post_id": 22680, "ts": "2026-07-05T07:23:29Z", "hours": 4.3908, "text": "The error module in pwr-core defines PwrError as a comprehensive thiserror enum covering I/O failures, TOML and bincode serialization errors, protocol framing violations, cryptographic operation failures, authentication rejections, network connectivity issues, storage-layer problems like missing or corrupted projects, and timeouts. Each variant carries contextual information: the TOML parse error includes the file path, protocol errors carry descriptive strings, and storage errors distinguish between not-found, already-exists, and corrupted states. Client configuration (PwrConfig) is rewritten with fields for server hostname, port, hex-encoded pre-shared key, optional TLS certificate fingerprint for pinning, local project root path, and configurable connect and transfer timeouts. The old rsync-oriented fields (NAS host, SSH user, rsync options) are removed. Server configuration is deferred to the pwr-server crate for a later commit. Stub modules for protocol message types, frame encoding, cryptographic key management, archive packaging, and integrity verification are placed in pwr-core so subsequent commits can fill them in without structural changes. Both binaries compile as minimal stubs printing their version. Ten tests pass covering config serialization, metadata state transitions, project file round-trips, transaction log JSONL format, and SHA-256 hash verification of known inputs."}]...
|
Title: Psync by @jacobjuneau | Stardance
Devlogs: Title: Psync by @jacobjuneau | Stardance
Devlogs:
The error module in pwr-core defines PwrError as a comprehensive thiserror enum covering I/O failures, TOML and bincode serialization errors, protocol framing violations, cryptographic operation failures, authentication rejections, network connectivity issues, storage-layer problems like missing or corrupted projects, and timeouts. Each variant carries contextual information: the TOML parse error includes the file path, protocol errors carry descriptive strings, and storage errors distinguish between not-found, already-exists, and corrupted states. Client configuration (PwrConfig) is rewritten with fields for server hostname, port, hex-encoded pre-shared key, optional TLS certificate fingerprint for pinning, local project root path, and configurable connect and transfer timeouts. The old rsync-oriented fields (NAS host, SSH user, rsync options) are removed. Server configuration is deferred to the pwr-server crate for a later commit. Stub modules for protocol message types, frame encoding, cryptographic key management, archive packaging, and integrity verification are placed in pwr-core so subsequent commits can fill them in without structural changes. Both binaries compile as minimal stubs printing their version. Ten tests pass covering config serialization, metadata state transitions, project file round-trips, transaction log JSONL format, and SHA-256 hash verification of known inputs.
Add client configuration management with server connection settings Refactor the PwrConfig struct to support the protocol-based architecture by replacing rsync-oriented fields (NAS hostname, SSH user, rsync options) with connection parameters for the pwr-server daemon. The new fields are server_host for the NAS hostname or IP address, server_port defaulting to 9742, and server_psk storing a hex-encoded 256-bit pre-shared key for HMAC-SHA256 authentication during the TLS handshake. Certificate pinning is supported through an optional server_fingerprint field that stores the SHA-256 hash of the server’s self-signed X.509 certificate. When set, the client rejects connections where the server presents a certificate with a different fingerprint, preventing man-in-the-middle attacks even if an attacker obtains a valid CA-signed certificate for the server’s hostname. Timeout configuration separates connection establishment (default 10 seconds) from long-running transfers (default 300 seconds) so users can tune them independently. Path helpers provide the standard XDG config directory layout: config.toml for connection settings, identity for the age encryption keypair, and transactions.log for the JSONL audit trail. The config_exists predicate lets callers check for prior initialization without triggering the NoConfig error path. The load_config function maps TOML parse errors into the TomlParse variant carrying the file path for actionable error messages. A server_addr convenience method joins host and port for use with TcpStream::connect. Three tests verify address formatting, config path construction, and port default values.
Implement server-side configuration management with validation and storage layout Add the ServerConfig struct to the pwr-server crate, controlling all aspects of the daemon’s operation. The configuration specifies the TCP bind address and port (defaulting to 0.0.0.0:9742), the filesystem root for project storage (defaulting to /srv/pwr/projects), paths to the TLS certificate and private key files, the hex-encoded 256-bit pre-shared authentication token that clients must present during the handshake, and operational limits including maximum concurrent connections (default 32), maximum project size in gigabytes (default 500), and an idle timeout for authenticated connections (default 300 seconds). Validation is performed at load time: the port must be non-zero, the auth token must be non-empty, and both max_project_size_gb and max_connections must be positive. The validate method returns a plain String error so the caller can present it directly to the user without depending on the shared pwr-core error types, keeping the server crate’s dependency surface minimal during early development. A config file search strategy checks four locations in order: an explicit –config CLI path, the current working directory (for development), the XDG config directory under ~/.config/pwr/, and the system-wide /etc/pwr/server.toml. Helper methods compute derived paths: project_dir returns the per-UUID storage subdirectory, registry_path returns the JSON index file location, and bind_addr formats the socket address for TcpListener::bind. Seven tests cover default validation, empty-token rejection, zero-port rejection, bind address formatting, project directory path generation, registry path naming, and a full save-load round-trip through TOML serialization and deserialization.
Implement project file I/O with atomic writes, placeholder detection, and directory utilities Add the complete project file management layer in pwr-core. The .project.toml file is the stable identity marker that persists on local disk regardless of whether project content is present (Local state) or stored on the server (Archived state). read_project_file returns Option, returning None when no .project.toml exists so callers can distinguish untracked directories from tracked projects. write_project_file uses an atomic write-through pattern: contents are serialized to a .tmp sibling file first, then renamed over the target, preventing readers from observing a partially written metadata file. remove_project_file deletes the marker without touching directory contents. State detection predicates cover all cases needed by the CLI and shell wrapper. is_archived_placeholder confirms that a directory contains only a .project.toml whose state field is Archived — the signal that triggers automatic restore in the ensure command. is_local_project checks for the opposite state. is_tracked simply tests file existence without parsing. Directory utilities support the archive and restore workflows. dir_size computes total bytes excluding the metadata file itself, with symlinks counted by their target path length rather than followed. file_count tallies regular files recursively for transfer progress estimation. remove_dir_contents_except_project strips a directory down to its .project.toml placeholder after a successful archive. Eleven tests cover round-trip I/O, atomic write behavior, placeholder and local state detection, tracking predicate, exact byte counting, file enumeration, directory stripping, and recursive discovery.
Implement wire protocol message types and frame encoding layer Define the complete set of protocol messages shared between client and server in pwr-core. The MessageType enum assigns stable 1-byte discriminants to each message variant for routing in the frame header. Handshake messages carry 32-byte client and server nonces with HMAC-SHA256 proofs for mutual PSK authentication, plus a server version string and optional error reason for debugging failed handshakes. Archive flow messages coordinate project uploads: ArchiveRequest announces the project UUID, name, total size, file count, and compression flag; ArchiveAccept returns a session UUID for correlating subsequent chunks; ArchiveComplete reports the final SHA-256 hash and transfer size. Restore flow mirrors this with RestoreRequest, RestoreAccept (carrying size and hash so the client can pre-allocate), and RestoreComplete. File streaming uses FileHeader (relative path, size, Unix mode bits) sent before raw chunk data and FileEnd (SHA-256 checksum) sent after. Query messages provide StatusRequest with optional project UUID filter and StatusResponse with a ProjectInfo vector carrying UUID, name, size, file count, and timestamps. The frame module implements a 10-byte header format: 4 magic bytes (0x50575246, ASCII “PWRF”), 4-byte big-endian payload length, 1-byte protocol version, and 1-byte message type. Payloads are JSON-encoded for debuggability. encode_frame serializes and wraps a message; decode_frame validates magic, version, and length bounds, returning None when more data is needed. FrameDecoder maintains an internal buffer for incremental socket reads. File chunks use a separate 4-byte length-prefixed streaming format with a zero-length EOF marker, keeping large file data out of the JSON framing layer. Thirteen tests cover message type discriminants, serialization round-trips for ArchiveRequest and ProjectInfo, handshake nonce sizes, frame encode-decode with magic verification, partial-read buffering in FrameDecoder, oversized frame rejection, bad magic rejection, file chunk encode-decode, and EOF marker detection.
Implement cryptographic layer with PSK authentication, age encryption, and SHA-256 integrity Add the complete cryptographic subsystem to pwr-core, providing three layers of security for the protocol. The pre-shared key authentication layer uses HMAC-SHA256 to compute challenge-response proofs. The client proves knowledge of the PSK by sending HMAC(client_nonce || “pwr-auth-v1”, PSK). The server responds with HMAC(client_nonce || server_nonce || “pwr-auth-v1”, PSK), enabling mutual authentication. Both nonces are 32-byte CSPRNG values generated per-connection using ring’s SystemRandom. The PSK itself is a 256-bit random key stored as a hex string in both config files. Helper functions handle hex encoding and decoding. At-rest encryption uses age with X25519 key pairs. generate_age_identity creates a fresh keypair, stores the secret identity at ~/.config/pwr/identity with 0o600 permissions, and returns the Bech32 public key for inclusion in .project.toml. The age_encrypt function takes a public key string and plaintext, producing an age-format encrypted blob using the one-shot Encryptor API. age_decrypt reverses this with an identity, returning the original plaintext. Both functions propagate structured errors for wrong keys, corrupted data, and unsupported formats. Integrity verification uses SHA-256 via the sha2 crate. sha256_hex hashes an in-memory buffer. sha256_file streams through a file in 64 KiB chunks to support large projects without memory pressure. Ten tests verify PSK randomness and hex round-trips, deterministic proof computation (same inputs produce same outputs), mutual proof divergence (client and server proofs differ), age encrypt-decrypt round-trips for both empty and non-empty payloads, wrong-identity rejection, known-answer SHA-256 vectors, and file hashing against the same known answer.
Implement pwr-server storage backend, connection handler, and TLS listener Add the three core server modules that together form the NAS-side daemon. The storage module (storage.rs) manages an on-disk project registry as a JSON index file mapping UUIDs to StoredProject entries containing name, size, file count, encryption flag, and timestamps. The registry is persisted atomically using a write-to-temp-then-rename pattern. Per-project directories under the configured storage base path hold data.enc (the encrypted archive blob) and meta.toml (per-project metadata). Methods provide CRUD operations on the registry, streaming archive read/write through buffered I/O, storage limit enforcement against the configured max_project_size_gb, and filesystem directory management. Five tests verify create-and-list, duplicate rejection, remove, archive write-read round-trip, and registry persistence across re-opens. The handler module (handler.rs) implements a per-connection state machine with five states: AwaitingHandshake, Authenticated, Archiving, Restoring, and Closed. The dispatch function routes decoded frames by state and message type. The handshake handler validates the client’s HMAC-SHA256 proof in constant time using ring::constant_time::verify_slices_are_equal, then generates a server nonce and server proof for mutual authentication. Archive start creates a project entry after checking the storage limit, archive finish updates the final size or rolls back on failure. Restore start looks up the project and verifies the archive file exists. Status queries support both single-UUID lookup and full listing. Storage is shared across connections via Arc<RwLock> with per-operation read or write locking. The listener module (listener.rs) loads PEM-encoded TLS certificates via rustls-pemfile, builds a rustls ServerConfig with TLS 1.3 and the application-level protocol negotiation tag “pwr/1”, binds a std::net TcpListener, and spawns each accepted connection on a dedicated OS thread with a rustls::StreamOwned wrapping the TCP stream for TLS encryption.
Implement archive packaging pipeline and client networking module Add the archive packaging pipeline to pwr-core. The create_archive function builds an encrypted project archive through a four-stage streaming pipeline. First, the project directory is walked recursively and added to a tar archive via the tar crate, excluding .project.toml metadata files. Second, the tar stream is gzip-compressed using flate2 at default compression level and written to a temporary file to bound memory usage independent of project size. Third, the compressed tarball is read back and encrypted using the age X25519 public key from the project’s metadata, producing an opaque encrypted blob the server cannot read. Fourth, the SHA-256 hash of the encrypted blob is computed for integrity verification after transfer. Symlinks are preserved in the archive. The reverse pipeline, extract_archive, first verifies the SHA-256 hash against the expected value, then age-decrypts, gunzips, and untars into the target directory. Two tests verify create-extract round-trip fidelity (README.md, src/main.rs, and Cargo.toml are restored with correct content) and that hash mismatch prevents extraction. Add the protocol client module to the pwr binary. PwrClient manages a connection to pwr-server with TCP socket setup, configurable timeouts, PSK handshake authentication with mutual server proof verification, and framed message send/receive via the core frame module. The archive_project method sends an ArchiveRequest, receives acceptance, streams archive data in 1 MiB chunks with 4-byte length prefixes and a zero-length EOF marker, and sends ArchiveComplete with the SHA-256 hash. The restore_project method requests a project by UUID, receives a RestoreAccept with size metadata, streams chunks back from the server, and returns the complete encrypted blob. get_status queries the server for project listings with optional UUID filtering. The handshake helper generates a 32-byte CSPRNG nonce, computes the HMAC-SHA256 client proof, sends the Handshake message, verifies the server’s HandshakeAck success flag, and performs mutual authentication by validating the server proof against the expected value using constant-time comparison.
Implement full CLI command suite with shell integration and client networking
Add ratatui-based TUI with project browser, creator, and log viewer screens Implement a terminal UI for interactive project management using ratatui 0.28 with the crossterm backend. The application shell provides a tabbed interface with three screens accessible via number keys (1-3) or Tab cycling. A status bar at the bottom displays global keybindings. The Project List screen renders a scrollable table of tracked projects discovered by scanning the local root directory for .project.toml files. Each row displays a color-coded status indicator (green for local, yellow for archived), project name, human-readable size, and last-sync date. Vim-style j/k and arrow key navigation is supported. Pressing r refreshes the list from disk. The screen is empty with an appropriate message when no projects are configured. The Project Creator screen provides a two-field form for interactively creating .project.toml files. The name field is pre-filled from the current directory name. Tab and Shift+Tab cycle focus between name and local path fields. Typing appends characters, backspace deletes. Ctrl+S validates that the path exists and is a directory, that the name is non-empty, then writes the .project.toml via the core library’s atomic write function. Status messages appear on success or validation failure. The Log Viewer screen reads the local JSONL transaction log and displays entries in a scrollable table with timestamp, operation type, project name, data size, and color-coded status (green OK, red FAILED, yellow in-progress). Supports refresh with r and j/k navigation. The TUI is enabled behind the tui Cargo feature flag which gates the ratatui and crossterm dependencies.
Add TLS certificate generation and server initialization utility Implement a certificate generation module in pwr-server that produces self-signed ECDSA P-256 certificates for TLS 1.3 via the rcgen crate. generate_certificate accepts a common name (typically the server hostname), creates certificate parameters with a distinguished name, generates a P-256 keypair, self-signs the certificate with a 365-day validity, and returns the PEM-encoded certificate, PEM-encoded private key, and a SHA-256 hex fingerprint of the certificate for client-side pinning. save_certificate writes the certificate and key to the configured paths with appropriate permissions: the certificate file is world-readable while the private key is restricted to owner-only (mode 0o600 on Unix). Parent directories are created automatically. The init_server function ties everything together for first-time setup. It generates the TLS certificate and key, saves them to /etc/pwr/, generates a random 256-bit PSK via ring’s CSPRNG, creates a ServerConfig with the PSK and certificate paths, and saves the config to /etc/pwr/server.toml. The PSK hex string and certificate fingerprint are printed to stdout with instructions for copying the PSK to the client config. This gives administrators a single command to bootstrap a new pwr-server instance with all security material generated fresh and properly permissioned.
Add comprehensive README with architecture overview, security model, and setup guides Document the complete pwr project covering the three-crate architecture, security model with its three layers (TLS transport, PSK authentication, and age at-rest encryption), quick-start guides for both Debian 12 server and Arch Linux client, the .project.toml file format specification, complete command reference table, configuration file reference for both client and server TOML files, and build-from-source instructions with feature flags for the optional TUI.
Add ClientMessage and ServerMessage sum types with typed deserialization dispatch Introduce two unified enums to the protocol module that wrap all message variants for type-safe routing in the connection handler state machine. ClientMessage covers the five messages the client can send (Handshake, ArchiveRequest, ArchiveComplete, RestoreRequest, StatusRequest) and ServerMessage covers the six server responses (HandshakeAck, ArchiveAccept, RestoreAccept, RestoreComplete, StatusResponse, Error). Each variant delegates serialization to the inner struct via serde’s internally-tagged enum representation using a ‘type’ discriminator field. The message_type method on each enum maps variants to their MessageType discriminant byte, enabling the frame encoder to write the correct header without the caller tracking the mapping manually. Two deserialization functions, decode_client_message and decode_server_message, take a raw payload and a MessageType discriminant and return the typed enum. They validate that the discriminant matches the expected direction, rejecting client message types when a server message is expected and vice versa, catching protocol-level dispatch bugs at the decoding layer rather than deeper in handler logic. The MessageType enum is relocated from the frame module to the protocol module since it is a protocol concern, resolving a circular import between the two modules. Frame encoding continues to reference MessageType for the frame header type byte. The from_byte constructor maps all 13 assigned discriminants with explicit match arms for stability. Eight new tests cover ClientMessage and ServerMessage JSON round-trips, direction-mismatch rejection in decode_client_message and decode_server_message, and message_type discriminant mapping for both enums, adding to the existing serialization and discriminant tests.
Add typed builder functions for all protocol message flows Introduce convenience constructors in the protocol module that build ClientMessage and ServerMessage enums from their constituent fields, eliminating the need for callers to construct nested struct literals. For the archive flow, build_archive_request accepts a UUID, name, size, file count, and compression flag, while build_archive_complete and build_archive_failed produce the terminal ArchiveComplete variants. For the restore flow, build_restore_request wraps a project UUID, build_restore_accept bundles session metadata with size and hash, build_restore_complete signals success, and build_restore_failed attaches an error string. Handshake builders handle both success and failure Ack messages with the server nonce, proof, and optional reason. Additional helpers cover ArchiveAccept, StatusResponse, and generic Error messages. These builders centralize protocol message construction so handler and client code does not repeat struct literals and reduces the surface area for missing required fields.
Refactor server handler to use ClientMessage/ServerMessage enums and protocol builders Rewrite the connection handler’s dispatch function to decode raw frame payloads through protocol::decode_client_message, which returns a typed ClientMessage enum. The match statement now patterns on the enum variant directly rather than matching MessageType discriminants and manually deserializing individual structs. This eliminates redundant deserialization code and catches direction mismatches at the protocol boundary. All server response construction now uses the protocol builder functions: build_handshake_ack_success, build_handshake_ack_failed, build_archive_accept, build_restore_accept, build_status_response, and build_error. The send_server_msg helper takes a ServerMessage enum, calls message_type() for the frame header discriminant, and serializes through encode_frame. This replaces scattered struct literal construction and manual frame encoding with a single call site. The handler functions (handle_handshake, handle_archive_start, handle_archive_finish, handle_restore_start, handle_status) are unchanged in logic but now operate on the inner payload structs extracted by the dispatch layer. Storage locking uses scoped blocks with read().unwrap() and write().unwrap() guards that drop before the next operation. Unused imports are cleaned up, including the removal of the deprecated ring::constant_time import.
Refactor client to use typed ClientMessage/ServerMessage enums and protocol builders Replace raw struct construction and manual frame encoding in the archive, restore, and status methods with protocol builder functions and typed message enums. archive_project now calls protocol::build_archive_request and protocol::build_archive_complete. restore_project uses protocol::build_restore_request. The send_client_msg and recv_server_msg helpers replace the generic send_frame and recv_frame functions, providing type-safe serialization for ClientMessage enums and typed deserialization via protocol::decode_server_message for ServerMessage responses. The handshake function is updated to construct the Handshake message as a ClientMessage::Handshake variant and match the response as a ServerMessage::HandshakeAck variant, with error handling for ServerMessage::Error responses. Response parsing in all methods uses match on ServerMessage variants instead of serde_json::from_slice with unwrapped payloads, catching unexpected message types at the call site rather than failing silently with deserialization errors. The import list is reduced from a wildcard protocol::* to explicit imports for ClientMessage, Handshake, ProjectInfo, ServerMessage, and the protocol module itself for builder function access.
Add comprehensive protocol integration test suite Introduce 20 integration tests in pwr-core/tests/protocol_integration.rs that exercise the full protocol layer without network dependencies, operating entirely on in-memory frame buffers and byte streams. Frame encode/decode round-trips validate that ArchiveRequest, RestoreRequest, and Handshake messages survive serialization through the full pipeline: typed ClientMessage enum to JSON payload to framed bytes with magic and length prefix through decode_frame back to typed enum with correct field values. FrameDecoder buffering tests cover two edge cases: byte-by-byte arrival where the decoder correctly reports None for incomplete frames across dozens of individual push_bytes calls until the full frame is available, and multi-frame reads where two concatenated frames in a single buffer are decoded sequentially without leftover bytes. Error injection tests verify that bad magic bytes produce errors, truncated frame headers (fewer than 10 bytes) return None rather than errors, payloads exceeding the 16 MiB limit are rejected, unsupported protocol versions are detected, and unknown message type bytes trigger framing errors. File chunk streaming tests cover exact 1 MiB chunks, zero-length data (which is indistinguishable from the EOF marker by design since empty chunks serve no purpose), EOF detection, and reassembly of 500 KB of cyclical data across 4 KB chunks with content verification. Serialization coverage iterates over all five ClientMessage variants and all seven ServerMessage variants, verifying each round-trips through JSON and preserves its message_type discriminant. Boundary tests handle empty ProjectInfo lists, near-max-size payloads with u64::MAX size_bytes and u32::MAX file_count, and direction-mismatch rejection where decode_client_message and decode_server_message refuse payloads from the wrong direction.
Implement complete integrity verification module with streaming hasher Replace the stub hash_file function with a full implementation that reads files in 64 KiB chunks through std::io::copy into a SHA-256 hasher, avoiding memory pressure for arbitrarily large inputs. Add hash_bytes_raw for callers that need the 32-byte binary digest rather than a hex string. hash_reader accepts any io::Read source, enabling hash computation on network streams or in-memory buffers without materializing intermediate files. Introduce StreamingHasher for incremental hash computation across multiple update calls. This is designed for chunked network reception where the full data is never in memory at once: the receiver calls update on each chunk as it arrives, then finalize or finalize_raw to obtain the digest. The struct wraps sha2::Sha256 and implements Default. Verification helpers verify_hash and verify_file_hash compare computed hashes against expected hex strings, returning bool rather than Result for use in assert-style checks. The crypto module’s sha256_hex and sha256_file functions are updated to delegate to the integrity module, making it the single canonical location for SHA-256 operations. Ten tests cover known-answer vectors for the empty string and ‘hello world’, raw hash byte length, file hashing including a 10 MB large-file path to exercise chunked I/O, hash verification for both match and mismatch cases, file verification, streaming hasher correctness against a known answer, streaming-vs-oneshot equivalence across four chunks, and hash_reader with an in-memory source.
Add HKDF-SHA256 per-project key derivation from master PSK Implement derive_project_key in the crypto module using ring’s HKDF implementation with SHA-256. The function takes the 256-bit master PSK as the HKDF salt and the project UUID bytes as the info parameter, producing a deterministic 256-bit per-project key. This design means per-project encryption keys are never stored on disk — they are re-derived from the master PSK and project UUID on each archive or restore operation. If the PSK is rotated, all existing projects become inaccessible, which is documented as a deliberate security property rather than a bug. The HKDF-Extract step uses the PSK as the salt with an empty initial key material, producing a pseudorandom key. HKDF-Expand then derives 32 bytes of output key material bound to the project UUID via the info parameter, preventing cross-project key reuse even if an attacker learns one project’s derived key. Four tests verify deterministic derivation, UUID binding, PSK binding, and correct 256-bit output length.
Add progress callback support to archive and extract pipelines Introduce progress reporting to the archive packaging and extraction functions through an optional callback parameter. The ProgressFn type is a boxed closure receiving an ArchiveStage enum and a fractional progress value from 0.0 to 1.0. Eight stages cover the full lifecycle: Scanning, Tarring, Compressing, Encrypting, Hashing, Decrypting, Decompressing, and Extracting. The original create_archive and extract_archive signatures are preserved as convenience wrappers that call the new create_archive_with_progress and extract_archive_with_progress variants with None for the callback, maintaining backward compatibility for callers that do not need progress reporting. Progress granularity is coarse but meaningful: the archive pipeline reports six transitions (Scanning at 0.0, Tarring at 0.1, Compressing at 0.3, Encrypting at 0.5, Hashing at 0.9 and 1.0). The extract pipeline reports eight transitions (Hashing at 0.0 and 0.2, Decrypting at 0.3 and 0.5, Decompressing at 0.6, Extracting at 0.7 and 1.0). Future refinements could report per-file progress during the tar stage by tracking bytes written against the pre-computed directory size.
Add comprehensive crypto integration test suite with 26 tests Introduce crypto_integration.rs exercising the full security subsystem across four categories. PSK tests (8) verify 256-bit key generation across ten iterations, hex round-trip preservation including case insensitivity, rejection of odd-length and wrong-length hex strings, deterministic client proof computation, the complete mutual authentication flow with distinct client and server proofs, and PSK binding where different keys produce different proofs. Age encryption tests (6) cover small, empty, and 1 MB large payload round-trips, ephemeral key non-determinism (same plaintext produces different ciphertext but both decrypt correctly), wrong identity rejection, and corrupted ciphertext detection via single-byte flipping mid-payload. HKDF tests (4) verify 256-bit output length, deterministic derivation for same PSK and UUID, cross-project key uniqueness for different UUIDs, and a known-UUID stability test confirming the derived key is neither all-zeros nor all-PSK-bytes. Integrity tests (3) confirm streaming hasher equivalence with oneshot hashing across 5 MB of 64 KB chunks, empty file hashing matching the well-known empty SHA-256 digest, and proper I/O error propagation for nonexistent files. Archive round-trip tests (3) create a multi-file project with README, two Rust sources, a design doc, and Cargo.toml, run through create_archive → extract_archive, verify all file contents match exactly and .project.toml is excluded. Hash verification rejection confirms wrong hashes prevent extraction. A progress callback test records all stage transitions during archive creation and verifies the final progress fraction reaches 1.0.
Implement server main entry point with clap CLI and fix listener/handler compilation Add a complete main.rs for pwr-server with three clap subcommands. The init subcommand detects or accepts a hostname, delegates to cert::init_server for TLS certificate generation, PSK creation, and config file writing, then prints the start command. The start subcommand locates the config file via the standard search path, loads and validates the ServerConfig, logs the bind address and storage path via tracing, and calls listener::run to begin accepting connections (blocks until shutdown). The status subcommand loads the config and prints a summary of all settings plus a connectivity check by attempting a brief TCP connection to the configured port, reporting whether the server appears to be running. Logging is configured via tracing-subscriber with an env-filter defaulting to pwr_server=info, controllable via the RUST_LOG environment variable. The –foreground flag on the start subcommand is accepted but daemonization is not yet implemented. Fix two compilation errors discovered during integration. The listener’s TLS setup incorrectly pattern-matched rustls::StreamOwned::new as if it returned a Result; it returns the stream directly in rustls 0.23. The handler’s handle_archive_finish had a borrow conflict where the session reference from the Archiving state match arm prevented reassigning *state; the fix extracts project_uuid and project_name into local variables before the state transition.
Add IP-based authentication rate limiter and integrate into handshake handler Implement a per-IP rate limiter in the server’s auth module that tracks failed authentication attempts within a sliding 60-second window. Each IP is allowed up to 5 failed handshake attempts before being banned for 300 seconds. The RateLimiter maintains an in-memory HashMap<IpAddr, RateLimitEntry> with periodic cleanup of expired entries to prevent unbounded memory growth. The check_attempt method atomically increments the attempt counter, resets the window if it has expired, checks whether the IP is currently banned, and returns false if the attempt should be rejected. record_success resets the counter and clears any ban on successful authentication, allowing legitimate clients that temporarily misconfigured their PSK to recover. The rate limiter is shared across all connections via Arc<Mutex<» and passed through HandlerContext. The handshake handler calls check_attempt before validating the PSK proof, ensuring brute-force attempts are blocked before any cryptographic work is performed. If the rate limit is exceeded, a HandshakeAck with a descriptive error is sent and the connection is closed. On successful authentication, record_success is called to clear the counter. Four unit tests verify that the first five attempts are allowed, the sixth is blocked, record_success resets the counter, and different IPs are tracked independently.
Add file chunk streaming to archive and restore handlers Implement the raw chunk streaming protocol in both directions on the server side. After accepting an ArchiveRequest, the handler enters a chunk receive loop (handle_archive_chunks) that reads 4-byte big-endian length prefixes followed by that many bytes of data, appending each chunk to the project’s archive file on disk via append-mode file I/O. A zero-length chunk signals EOF. The total bytes received is logged for monitoring. On the restore side, handle_restore_chunks reads the complete archive file from disk through the storage layer, then streams it back to the client in 1 MiB chunks with the same 4-byte length-prefixed format, followed by a zero-length EOF marker and a flush. This mirrors the client’s restore_project method which reads chunks in the same format. The dispatch function now chains the chunk streaming phase after the initial request acceptance: ArchiveRequest dispatch calls handle_archive_start followed by handle_archive_chunks, and RestoreRequest calls handle_restore_start followed by handle_restore_chunks. The ArchiveComplete and RestoreComplete messages are received as framed messages after the chunk phase completes, handled by the existing finish functions.
Add server integration test suite and library target for external testing Create 17 integration tests in pwr-server/tests/server_integration.rs covering the full server subsystem. Storage CRUD tests (6) verify project creation with duplicate rejection, removal, archive read/write round-trips through the storage layer, persistence across re-opens via registry JSON, and size limit enforcement rejecting archives exceeding the configured max_project_size_gb. PSK handshake tests (3) validate the full mutual authentication flow with correct proof verification and wrong-PSK rejection. Frame-level integration tests (3) exercise the complete serialization pipeline: Handshake framing round-trip with client_id and nonce preservation, ArchiveRequest framing with all fields intact, and server message decode direction checking. File chunk streaming tests (2) simulate the chunk protocol by encoding 250 KB of cyclical data across 4 KB chunks with 4-byte length prefixes and EOF markers, reassembling on the receiver side and verifying content equality. An empty archive test confirms that a standalone EOF marker produces zero bytes of received data. Rate limiter tests (3) verify the 6th attempt is blocked after 5 allowed, success resets the window, and different IPs are tracked independently. A full archive-restore simulation test writes 500 KB of data through the storage layer, reads it back, and verifies byte-exact restoration plus metadata persistence. A cleanup test confirms that removing a project after a failed archive deletes both the archive file and registry entry. To support external integration tests, a library target (lib.rs) is added to pwr-server, re-exporting all modules as public while the binary target (main.rs) retains its own private module declarations.
Implement TLS connector with certificate pinning and retry logic for the client Add a complete TLS connection path to PwrClient, replacing the previous stub that returned a not-yet-implemented error. The connect_tls function builds a rustls ClientConfig with webpki root certificates for standard PKI validation. When a server_fingerprint is set in the client config, a custom FingerprintVerifier replaces the default verifier. This verifier computes the SHA-256 hash of the server’s end-entity certificate DER bytes and compares it against the pinned hex fingerprint, implementing trust-on-first-use style certificate pinning without requiring a private CA. The verifier supports TLS 1.2 and 1.3 signature schemes including RSA and ECDSA P-256. The PwrClient struct gains server_addr, psk, and pinned_fingerprint fields, enabling a reconnect method that re-establishes a TCP connection to the same server and re-runs the PSK handshake without reloading the config file. The connect method now branches on use_tls, routing to either the TLS path with certificate validation or the plaintext path for local testing. Add retry logic via the with_retry helper, a generic function that wraps any fallible operation with exponential backoff. The caller provides a retryable-error predicate; is_retryable_error recognizes connection refused, timeout, connection closed, connection reset, broken pipe, and unexpected EOF as transient errors worth retrying. The base delay doubles each attempt, with a configurable maximum number of retries.
Add progress reporting module with indicatif integration and stage callbacks Introduce a progress module in the pwr CLI crate that provides two display modes for long-running operations. The archive_progress_bar and restore_progress_bar functions create indicatif ProgressBar instances with styled templates showing a spinner, progress bar, byte counter, and ETA. The update_archive_progress function maps ArchiveStage enum values to human-readable status messages displayed in the bar. For non-interactive terminals or quiet mode, print_stage emits a simple line to stderr for each stage transition during archive or extract operations. This provides visibility into long-running operations without requiring a TTY.
Add client integration test suite with handshake, streaming, retry, and progress tests Create 14 integration tests in pwr-cli/tests/client_integration.rs covering the client-side protocol layer. Handshake tests verify that ClientMessage frames encode with correct magic bytes, version, and type discriminants, and that decode_client_message recovers the original Handshake struct with client_id and nonce intact. Archive flow tests exercise ArchiveRequest and ArchiveComplete serialization round-trips with all fields including UUID, name, total_size, file_count, compression, and hash. Restore flow tests verify RestoreRequest encoding and decoding. Server response parsing tests validate that HandshakeAck, Error, and StatusResponse messages are correctly deserialized from framed payloads, including success flags, error codes, and project info vectors with UUID and file_count fields. Chunk streaming tests cover five size boundaries from zero bytes (EOF detection) through 1 MiB, plus standalone EOF marker encoding. Retry logic tests verify is_retryable_error correctly classifies connection failures, timeouts, and broken pipes as transient while treating authentication and not-found errors as fatal. with_retry is tested for immediate success, maximum retry exhaustion (initial + 3 retries = 4 calls), and early termination on non-retryable errors after 1 call. A progress stage test confirms all five ArchiveStage variants are distinct.
Wire progress bars and retry logic into CLI archive and restore commands Integrate the progress reporting module and retry logic into the two main CLI workflows. The archive command now creates a progress bar before the packaging pipeline and passes it to create_archive_with_progress via a ProgressFn callback that maps ArchiveStage values to status messages and fractional bar position. A second progress bar tracks the upload phase. Both bars are finished and cleared on completion. The restore command similarly uses a download progress bar keyed to the stored project size and an extraction progress bar sized to the received encrypted blob. Connection attempts now use with_retry wrapping PwrClient::connect with 3 retries and a 1-second base delay, retrying only on transient network errors as classified by is_retryable_error. This provides resilience against momentary server unavailability without masking fatal errors like authentication failures.
Add –tls flag to all network commands, –limit to log, –auto-install to shell init Extend the CLI with connection and usability flags across all subcommands. Every command that contacts the server (archive, restore, ensure, status, list) now accepts a –tls flag that is passed through to PwrClient::connect, controlling whether the connection uses TLS with certificate pinning or plaintext for local testing. The log command gains a –limit flag defaulting to 50 entries, with a summary line showing how many entries were truncated. The shell init command supports –auto-install which opens the shell rc file in append mode and writes the eval line directly, providing a one-command setup experience. Function signatures throughout main.rs are updated to thread the new boolean parameter. The ensure command passes tls=false through to its internal restore call since ensure is triggered from the shell wrapper where TLS may not be configured. The list command delegates to cmd_status with tls=false for local-only directory scanning.
Clean up unused imports and fix compilation warnings in client TLS module Remove unused Arc import from the top-level client scope (it is only needed inside the connect_tls function where it is imported locally). Replace TrustAnchor with the correct ServerName import from rustls::pki_types. Remove the unnecessary mut qualifier from the ClientConnection binding in connect_tls.
Fix server handler and listener warnings: remove unnecessary parentheses and unused imports Clean up compilation warnings in the pwr-server crate. In handler.rs, the send_server_msg function signature used unnecessary parentheses around impl Write which triggered the unused_parens lint. In listener.rs, the PrivateKeyDer import was unused since the key is loaded via rustls_pemfile::private_key which returns a generic PrivateKeyDer type that does not need to be explicitly imported.
Add server address display to status command output Extend the status command to print the configured server host and port after the project count summary, giving users a quick reminder of which NAS their projects are archived to.
Implement TLS transport with custom certificate verifier and fingerprint pinning Replace the TLS-not-yet-implemented stub in the PwrClient with a working rustls-based TLS 1.3 connection layer. The connect_tls function builds a ClientConfig using the dangerous API with a custom certificate verifier (CertVerifier) that accepts self-signed server certificates — necessary because pwr-server generates its own ECDSA P-256 certificate during init rather than obtaining one from a public CA. Authentication is provided by the PSK handshake running over the encrypted channel, so the TLS layer provides confidentiality while the application layer handles mutual authentication. The verifier supports optional SHA-256 certificate fingerprint pinning. When a server_fingerprint is present in the client config, the verifier computes the SHA-256 hash of the server’s end-entity certificate and compares it against the pinned value, rejecting the connection on mismatch. When no fingerprint is configured, the verifier accepts any certificate but logs the observed fingerprint for the user to pin later, enabling a trust-on-first-use workflow. Signature verification in the verifier accepts all TLS 1.2 and 1.3 signatures without checking against a root CA. This is intentional: the security model relies on PSK-based mutual authentication at the application layer combined with certificate pinning for defense-in-depth, rather than on the Web PKI trust infrastructure which would reject self-signed certificates. The supported_verify_schemes list advertises ECDSA and RSA schemes to maximize compatibility.
Add exponential backoff retry logic to PwrClient connection Implement connect_with_retry in PwrClient that wraps the existing connection logic with up to 3 retry attempts using exponential backoff starting at 1 second and doubling to 2 and 4 seconds. The existing connect method is renamed to connect_once and made private, with the public connect method now calling it in a retry loop. Transient network failures such as TCP connection refused or TLS handshake timeouts are retried, while authentication failures are not (they propagate immediately since retrying with the same credentials would produce the same result). Each retry attempt is logged at WARN level with the error and delay, and a successful retry is logged at INFO level. The connect_timeout_secs from the client config is applied to each individual TCP connection attempt within the retry loop.
Add progress callback support to client archive and restore methods Extend archive_project and restore_project with optional progress callbacks that report bytes transferred against total size. The existing methods become thin wrappers calling the new archive_project_with_progress and restore_project_with_progress variants with None for backward compatibility. During archive, the callback fires after each 1 MiB chunk is written to the TCP stream, reporting cumulative bytes sent. During restore, the callback fires after each received chunk is appended to the buffer, reporting cumulative bytes received. The callback signature is fn(u64, u64) where the first argument is current progress and the second is the total, suitable for driving indicatif progress bars or TUI progress displays without coupling the client module to any specific UI library.
Add progress bar integration to CLI with empty-archive edge case handling also add 0-byte transfer file size.
Fix client integration tests and add retry-aware connect test Repair the client integration test suite after the retry logic and library target additions. The connect_to_nonexistent_server test now uses a match statement instead of unwrap_err to work with the ClientResult type. The connect_timeout_is_respected test is marked #[ignore] because OS-level TCP timeout behavior varies across platforms, making sub-second timeout assertions unreliable in CI environments. Unused imports (TcpListener, Duration) are removed from the test file.
Add systemd service unit and deployment guides for server and client Create a hardened systemd service unit for pwr-server with security directives including NoNewPrivileges, PrivateTmp, ProtectSystem=strict, ProtectHome=yes, and read-only access to config and certificate paths with read-write access only to the project storage directory. The service runs as the pwr system user, restarts on failure with a 5-second delay, and logs to journald. Resource limits cap file descriptors at 4096 and memory at 512 MB. Add docs/server-setup.md covering the complete Debian 12 deployment workflow: installing build dependencies, compiling with cargo, initializing the server to generate TLS certificates and PSK, creating the storage directory with correct ownership, installing and enabling the systemd service, verifying the listener with ss, configuring firewall rules for nftables and iptables, and troubleshooting common issues. Add docs/client-setup.md covering the Arch Linux client workflow: building the binary, running pwr init with server host and PSK, setting up shell integration for bash, zsh, and fish, performing the first archive and restore, launching the TUI, and troubleshooting configuration and authentication errors. Include a full configuration file reference.
Fix warning: remove unused variable and clean up imports Remove the unused config variable clone from the listener accept loop where it was captured by the thread closure but never referenced. Remove the unused PrivateKeyDer import from rustls pki_types. Prefix the catch-all match variable with underscore to suppress the unused variable warning in the dispatch function. Keep the required parentheses around impl Trait syntax in argument position as required by Rust 2024 edition for disambiguation. Add MIT LICENSE file.
Annotate session state structs with allow(dead_code) for future use The ArchiveSession and RestoreSession structs in the handler state machine contain fields (session_id, file_count, compression, bytes_received, bytes_sent) that are stored for future use in resume-after-interruption logic and detailed transfer statistics. Currently they are only written during state transitions but not yet read back. Add #[allow(dead_code)] annotations to suppress compiler warnings while keeping the fields available for the planned transfer progress tracking and interrupted archive resume features.
Add operation progress overlay to TUI and wire pwr tui subcommand in CLI Implement an OperationOverlay screen for the ratatui-based TUI that renders a centered modal dialog with a progress gauge, transfer statistics, and a cancel prompt during archive and restore operations. The overlay displays the operation name and project name in the title bar, a cyan progress gauge driven by the bytes_done/bytes_total ratio, a statistics line showing human-readable byte counts with percentage, and a status line that changes between ‘Press Esc to cancel’ during transfer, ‘Transfer complete’ on success, and red error text on failure. The format_size helper converts byte counts to GB/MB/KB/B with one decimal place. The handle_input method maps Escape to cancellation and Enter to dismissal after completion. Wire the pwr tui subcommand into the CLI behind the tui feature flag. The Commands enum gains a Tui variant gated by #[cfg(feature = “tui”)], the dispatch match arm calls cmd_tui(), and the tui module is conditionally compiled. Building without –features tui produces a CLI-only binary; building with the flag includes the ratatui and crossterm dependencies and the tui module, enabling pwr tui to launch the interactive interface.
Add end-to-end integration tests for full client-server lifecycle Implement two end-to-end tests using paired in-memory byte streams (Pipe struct implementing Read+Write via Arc<Mutex<Vec») that simulate a complete client-server interaction without network dependencies. test_full_client_server_archive_restore_cycle creates a multi-file project directory, generates age encryption keys and a PSK, runs the archive pipeline to produce an encrypted blob, then spawns two threads for client and server communicating through paired pipes. The client performs the full protocol sequence: Handshake with HMAC-SHA256 proof, ArchiveRequest with project metadata, chunked data transfer with 1 MiB chunks and zero-length EOF marker, and ArchiveComplete with SHA-256 hash. The server thread receives the Handshake, verifies the client proof, responds with its own server proof for mutual authentication, reads the ArchiveRequest, receives all chunks via the 4-byte length-prefixed streaming protocol, and acknowledges ArchiveComplete. After both threads join, assertions verify the server received the exact encrypted blob, decryption succeeds, and the local project metadata transitions correctly through local → archived → placeholder states with .project.toml file survival. test_end_to_end_hash_verification_prevents_corruption validates that tampering with a single byte of the encrypted archive produces a different SHA-256 hash, ensuring integrity violations are detectable before extraction.
Document required parentheses around impl Trait syntax in handler signatures The Rust 2024 edition requires explicit parentheses around compound trait bounds in function argument position. Without them, ‘&mut impl Read + Write’ is ambiguous: it could parse as ‘(&mut impl Read) + Write’ (a mutable reference to a type implementing Read, with an additional Write bound) or ‘&mut (impl Read + Write)’ (a mutable reference to a type implementing both). The compiler requires the latter to be written with parentheses. Add a module-level doc comment explaining this so future maintainers do not attempt to remove the parentheses.
Add bash tab completion script for pwr CLI commands Provide a bash completion function for all pwr subcommands and their flags. The completion script maps each subcommand to its valid arguments: init completes –server-host, –server-port, –psk, and –local-root; archive, restore, and ensure complete directory paths; status and list offer –recursive/-r; log provides –errors/-e and –project; shell completes bash, zsh, fish, and –init. The completion is installed via ‘source <(pwr completions bash)’ in .bashrc.
Ships:
Note: Very untested, only try with projects you have backups of! Psync was designed to solve the problem of my laptop having limited storage and my with to be able to use my nas semi-transparently without the use of automountd or fuse both of which I have tried and deployed in other scenarios and neither of which are resiliant to not being able to contact the NFS server when on different networks. So i made Psync which uses encryption which make me feel secure enough to open it up to the internet instead of unauthenticated NFS....
|
1792878793.759945
|
1793742793.759945
|
|
2910
|
3d game engine by @rajaryan1492007 | Stardance
|
rajaryan1492007
|
3
|
110.5
|
1561
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T19:17:52Z", "hours": 14.0, "multiplier": 16.69, "payout": 232, "blessing": "neutral", "text": "i just finally done all thing like stable etc . and search of all libs etc so can really work making really good engine i add milestone etc . u can still test project tho but it will just artitacture doc change and some sync bug fix . other then that i add milestone so i can work on that now but i 19 now today so my hackclub will get end so i just ship to info that . devlog is end but i will continue to work on this engine bcuz it been like year since i st working on it already so anyway . and anything u wanna know u can check my project issues and roadmap", "repo": "https://github.com/rajaryan2007/UNHUMAN", "demo": "https://github.com/rajaryan2007/UNHUMAN/releases/tag/test"}, {"ship_num": 2, "ts": "2026-08-26T21:35:30Z", "hours": 71.0, "multiplier": 14.89, "payout": 1056, "blessing": "neutral", "text": "-> I built the Unhuman Engine (UHE) a high-performance, custom 3D game engine written entirely from scratch in C++. It features a custom Vulkan rendering pipeline, Jolt Physics integration, and a 3D spatial audio system using miniaudio. Alongside the engine, I built a fully playable “Aim Lab” style 3D shooter game to showcase its capabilities, complete with skeletal animations, recoil mechanics, and a robust entity component system (ECS). -> Building a Vulkan renderer from the ground up is notoriously difficult due to how explicit the API is. Getting the Vulkan swapchains, descriptors, and framebuffers perfectly synchronized was a massive hurdle. Beyond rendering, building the virtual file system (VFS) to correctly resolve asset paths across different platforms (Linux native and Windows via Wine) required a lot of trial and error, as did managing multithreaded memory cleanup for the audio subsystem to prevent Because of the custom Vulkan architecture and strict C++ optimizations, the game hits 900+ FPS in release builds, even on integrated graphics! the custom pixel-perfect 3D entity picking system we built using Vulkan framebuffers (instead of relying on standard physics raycasting). Finally, the engine architecture is scalable enough that it’s not just for games—it’s designed to handle heavy robotics and autonomous vehicle simulations in the engine . -> The engine supports both Linux and Windows to play the game, just run the UHEGAME executable inside the bin folder. Important: Make sure the assets folder (which contains the 3D models and audio files) is sitting right next to the executable in the same directory, otherwise the game will fall back to a safe mode. Controls: Use your mouse to aim, Left Click to shoot the targets, and press ‘R’ to reload the animated 3D pistol also i write it too big bcuz last time many people said they don’t understand what i did . about running it u can run it in windows and linux both see window build and linux build there to work able excutable file one is uhegame.exe and uhe_editor.exe one is game and other is editor https://github.com/rajaryan2007/UNHUMAN/releases/tag/alpha i will improve the game as time goes i just st with vulkan and other if u have any problem u can ask here https://github.com/rajaryan2007/UNHUMAN/issues if still don’t understand don’t rate down read or search or just read devlog and understand instead of low rating thankyou :)", "repo": "https://github.com/rajaryan2007/UNHUMAN", "demo": "https://github.com/rajaryan2007/UNHUMAN/releases/tag/test"}, {"ship_num": 3, "ts": "2026-06-09T19:02:56Z", "hours": 21.0, "multiplier": 14.37, "payout": 273, "blessing": "neutral", "text": "This project has been a daily labor of love for over a year. Over the last 4 to 5 months, I completely rewrote the entire rendering backend, moving away from a legacy OpenGL state machine to an explicit Vulkan pipeline. Along the way, I completely redesigned the Rendering Hardware Interface (RHI) to align with modern graphics architectures. Welcome to UNHUMAN! You are completely free to clone and compile this engine, but please read this first: ->The 50/50 Rule: This is a custom, explicitly defined Vulkan engine currently tailored to a Ryzen/Vega Windows environment. Because Vulkan does not hide driver-level differences (NVIDIA vs. AMD vs. Intel), there is roughly a 50/50 chance it will compile flawlessly or completely explode on your specific GPU setup. ->The Easy Way Out: If you attempt to build the project and hit Vulkan validation errors, device-lost crashes, or strict compilation failures, please do not waste your time trying to debug my RHI! * Visual Verification: If the build fails on your hardware, simply watch the YouTube Walkthrough Video linked below. It contains the full visual proof of the engine running, rendering, and functioning on the native development machine. link -> https://youtu.be/CHDIU61auYo", "repo": "https://github.com/rajaryan2007/UNHUMAN", "demo": "https://github.com/rajaryan2007/UNHUMAN/releases/tag/test"}]...
|
[{"post_id": 70209, "ts": "202 [{"post_id": 70209, "ts": "2026-09-18T18:21:31Z", "hours": 4.5, "text": "reading source code of o3de and make my engine barrier better"}, {"post_id": 67555, "ts": "2026-09-13T18:10:01Z", "hours": 1.8844, "text": "just make milestone bar for realase"}, {"post_id": 66844, "ts": "2026-09-12T19:21:25Z", "hours": 2.6544, "text": "make better job system"}, {"post_id": 62020, "ts": "2026-09-05T07:13:01Z", "hours": 4.5067, "text": "add multithreading and better sync"}, {"post_id": 59175, "ts": "2026-08-31T20:15:59Z", "hours": 4.8814, "text": "added text rendering"}, {"post_id": 54512, "ts": "2026-08-25T15:19:38Z", "hours": 2.1939, "text": "added audio and animation"}, {"post_id": 52892, "ts": "2026-08-23T08:38:37Z", "hours": 1.9892, "text": "St making game in my game engine"}, {"post_id": 51531, "ts": "2026-08-21T09:17:58Z", "hours": 3.6897, "text": "added a ci/cd test For engine with lavapipe"}, {"post_id": 45963, "ts": "2026-08-12T19:45:40Z", "hours": 8.6658, "text": "Add descriptor Set fallback and Contribution guidelines"}, {"post_id": 39452, "ts": "2026-08-02T12:29:11Z", "hours": 8.3283, "text": "implemented many fallback feature no less crash add fallback of dynamic_rendering other are pending"}, {"post_id": 30001, "ts": "2026-07-17T07:25:22Z", "hours": 9.0811, "text": "all setup done just have to write fallback now :)"}, {"post_id": 25765, "ts": "2026-07-10T06:41:34Z", "hours": 3.7094, "text": "implementing old renderpass and Framebuffer and other thing to run old hardware"}, {"post_id": 23311, "ts": "2026-07-06T05:53:37Z", "hours": 3.5711, "text": "add more file more function just fallback for Vulkan Engine so it can run in more device"}, {"post_id": 22767, "ts": "2026-07-05T10:54:14Z", "hours": 3.7322, "text": "add support for extension check in Vulkan"}, {"post_id": 21133, "ts": "2026-07-02T22:43:28Z", "hours": 0.9317, "text": "so from now not developing any feature in Game engine for some weeks and Adding fallback to 1.1 to 1.4 vulkan bcuz lot of problem andriod don’t support 1.3 mostly and many gpu like intel have bug in bindless so just adding other to fallback bcuz other are also not good nvidia and amd also have some problem add buildbot that will test like github don’t support gpu to test most probably i will test in software cpu and build system so user can compile and run thing without having any problem so at last only problem left is gpu vendor specific that i will cover through blender o3de engine that how engine can run in most gpus i give better doc or reference next time to show it but it very hard and take month to search so that it"}, {"post_id": 20716, "ts": "2026-07-02T11:47:34Z", "hours": 1.1572, "text": "while working on my engine i take refernce from blender also contributed in blender one issues even got merged other are pending"}, {"post_id": 17338, "ts": "2026-06-28T02:42:07Z", "hours": 7.2022, "text": "jolt physics implementation in vulkan engine and some other bug fix"}, {"post_id": 11434, "ts": "2026-06-18T18:19:47Z", "hours": 1.8758, "text": "PBR light implementation done in my engine"}, {"post_id": 11050, "ts": "2026-06-18T02:35:35Z", "hours": 1.8658, "text": "reimplemented tracy profiler for my engine and working in PBR"}, {"post_id": 10211, "ts": "2026-06-16T20:38:31Z", "hours": 2.0136, "text": "one of the hardest bug to solve i did it now there no texture overlap"}, {"post_id": 9830, "ts": "2026-06-16T08:46:40Z", "hours": 4.2797, "text": "linux and window both support for vulkan engine tested in wine"}, {"post_id": 8004, "ts": "2026-06-13T11:03:28Z", "hours": 6.6514, "text": "model loading done in my engine"}, {"post_id": 5794, "ts": "2026-06-09T18:32:13Z", "hours": 0.28, "text": "update everything now moving toward 3d work and cleanup"}, {"post_id": 5693, "ts": "2026-06-09T16:07:36Z", "hours": 1.7525, "text": "finally port complete in vulkan with RHI and Linux support"}, {"post_id": 5390, "ts": "2026-06-09T04:27:45Z", "hours": 10.2675, "text": "finally rhi and wrapper test is done in vulkan"}, {"post_id": 3458, "ts": "2026-06-06T12:22:17Z", "hours": 8.22, "text": "almost write backend vulkan may i can see something in screen next week after 3 month 😵💫"}, {"post_id": 1715, "ts": "2026-06-03T21:36:09Z", "hours": 0.5761, "text": "rewriting my game engine backend in vulkan and adding support for linux"}]...
|
Title: 3d game engine by @rajaryan1492007 | Starda Title: 3d game engine by @rajaryan1492007 | Stardance
Devlogs:
rewriting my game engine backend in vulkan and adding support for linux
almost write backend vulkan may i can see something in screen next week after 3 month 😵💫
finally rhi and wrapper test is done in vulkan
finally port complete in vulkan with RHI and Linux support
update everything now moving toward 3d work and cleanup
model loading done in my engine
linux and window both support for vulkan engine tested in wine
one of the hardest bug to solve i did it now there no texture overlap
reimplemented tracy profiler for my engine and working in PBR
PBR light implementation done in my engine
jolt physics implementation in vulkan engine and some other bug fix
while working on my engine i take refernce from blender also contributed in blender one issues even got merged other are pending
so from now not developing any feature in Game engine for some weeks and Adding fallback to 1.1 to 1.4 vulkan bcuz lot of problem andriod don’t support 1.3 mostly and many gpu like intel have bug in bindless so just adding other to fallback bcuz other are also not good nvidia and amd also have some problem add buildbot that will test like github don’t support gpu to test most probably i will test in software cpu and build system so user can compile and run thing without having any problem so at last only problem left is gpu vendor specific that i will cover through blender o3de engine that how engine can run in most gpus i give better doc or reference next time to show it but it very hard and take month to search so that it
add support for extension check in Vulkan
add more file more function just fallback for Vulkan Engine so it can run in more device
implementing old renderpass and Framebuffer and other thing to run old hardware
all setup done just have to write fallback now :)
implemented many fallback feature no less crash add fallback of dynamic_rendering other are pending
Add descriptor Set fallback and Contribution guidelines
added a ci/cd test For engine with lavapipe
St making game in my game engine
added audio and animation
added text rendering
add multithreading and better sync
make better job system
just make milestone bar for realase
reading source code of o3de and make my engine barrier better
Ships:
This project has been a daily labor of love for over a year. Over the last 4 to 5 months, I completely rewrote the entire rendering backend, moving away from a legacy OpenGL state machine to an explicit Vulkan pipeline. Along the way, I completely redesigned the Rendering Hardware Interface (RHI) to align with modern graphics architectures. Welcome to UNHUMAN! You are completely free to clone and compile this engine, but please read this first: ->The 50/50 Rule: This is a custom, explicitly defined Vulkan engine currently tailored to a Ryzen/Vega Windows environment. Because Vulkan does not hide driver-level differences (NVIDIA vs. AMD vs. Intel), there is roughly a 50/50 chance it will compile flawlessly or completely explode on your specific GPU setup. ->The Easy Way Out: If you attempt to build the project and hit Vulkan validation errors, device-lost crashes, or strict compilation failures, please do not waste your time trying to debug my RHI! * Visual Verification: If the build fails on your hardware, simply watch the YouTube Walkthrough Video linked below. It contains the full visual proof of the engine running, rendering, and functioning on the native development machine. link -> https://youtu.be/CHDIU61auYo
-> I built the Unhuman Engine (UHE) a high-performance, custom 3D game engine written entirely from scratch in C++. It features a custom Vulkan rendering pipeline, Jolt Physics integration, and a 3D spatial audio system using miniaudio. Alongside the engine, I built a fully playable “Aim Lab” style 3D shooter game to showcase its capabilities, complete with skeletal animations, recoil mechanics, and a robust entity component system (ECS). -> Building a Vulkan renderer from the ground up is notoriously difficult due to how explicit the API is. Getting the Vulkan swapchains, descriptors, and framebuffers perfectly synchronized was a massive hurdle. Beyond rendering, building the virtual file system (VFS) to correctly resolve asset paths across different platforms (Linux native and Windows via Wine) required a lot of trial and error, as did managing multithreaded memory cleanup for the audio subsystem to prevent Because of the custom Vulkan architecture and strict C++ optimizations, the game hits 900+ FPS in release builds, even on integrated graphics! the custom pixel-perfect 3D entity picking system we built using Vulkan framebuffers (instead of relying on standard physics raycasting). Finally, the engine architecture is scalable enough that it’s not just for games—it’s designed to handle heavy robotics and autonomous vehicle simulations in the engine . -> The engine supports both Linux and Windows to play the game, just run the UHEGAME executable inside the bin folder. Important: Make sure the assets folder (which contains the 3D models and audio files) is sitting right next to the executable in the same directory, otherwise the game will fall back to a safe mode. Controls: Use your mouse to aim, Left Click to shoot the targets, and press ‘R’ to reload the animated 3D pistol also i write it too big bcuz last time many people said they don’t understand what i did . about running it u can run it in windows and linux both see window build and linux build there to work able excutable file one is uhegame.exe and uhe_editor.exe one is game and other is editor https://github.com/rajaryan2007/UNHUMAN/releases/tag/alpha i will improve the game as time goes i just st with vulkan and other if u have any problem u can ask here https://github.com/rajaryan2007/UNHUMAN/issues if still don’t understand don’t rate down read or search or just read devlog and understand instead of low rating thankyou :)
i just finally done all thing like stable etc . and search of all libs etc so can really work making really good engine i add milestone etc . u can still test project tho but it will just artitacture doc change and some sync bug fix . other then that i add milestone so i can work on that now but i 19 now today so my hackclub will get end so i just ship to info that . devlog is end but i will continue to work on this engine bcuz it been like year since i st working on it already so anyway . and anything u wanna know u can check my project issues and roadmap...
|
1792986732.2223449
|
1793073132.2223449
|
|
12569
|
NeneUI (@neneys/ui) by @pksmkwe26 | Stardance
|
pksmkwe26
|
2
|
83.0
|
1559
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-24T12:40:09Z", "hours": 45.0, "multiplier": 19.25, "payout": 872, "blessing": "neutral", "text": "@neneys /ui - NeneUI It is an Server-Driven UI Library Which Interpretes TypeScript into an Native Rendered Flutter Widget. Basically, You can write your Entire App in TypeScript and It gets Rendered Into Native Flutter Widgets without WebView. Why? We need Server-Driven UI to ensure that we do not need to update an entire app for a little UI changes or even major overhauls of the App Interface, We could just change it on Server-Side and updated without going through the process of Approval and such. Major Updates After the Previous Ship NeneUI Testing Kit has been buffed with Debug Bar and More Platforms Support for WebSocket Rendering Web Support (along with SEO PHP for Web Crawlers) Memory/GPU Leak issues fixed! Advanced & Improved + Detailed Documentation Decorated README.md Documentation The New Documentation is now written in Docsaurus and hosted in Github Pages at https://kwe26.github.io/neneui/ along with the NeneUI Testing Kit at https://kwe26.github.io/neneui/tester . While it took alot of time documenting each working Widgets but it has now made using @neneys /ui more easier. New Widgets That were Added NeneDisplay and NeneNavbottom - Theese Two Widgets Now help you construct an Bottom Bar with Various Pages as Content that can be now switched from one place to another without reloading the entire page. Layouts and Layout - This allows you to put many Content on Side of Each Other and allow you the drag wheel to drag and arrange the size. WebSocket Widget - It can also render Widgets over WS live real-time making it an really useful feature. Some New Action Callbacks were also added such as SOFTRELOAD that softly reloads the UI without changing the states and maintains the UI. DebugBar The Testing Kit Now includes and Debug Bar to help Developers Reload the UI or check the #id Declarations and Variables Value NeneDesktopRuntime An Desktop Runtime that is WIP but could help replace Electron.js where everything is WebView and sucks alot of ram. But NeneDesktopRuntime can render the Widgets with TypeScript into Native Widgets. Examples There are now examples bundled with NeneUI Testing Kit, One is an AI Chat Application and other is called NeneWorld with Pokedex and Weather API and Country API uses to showcase the Widgets FAQ Page An FAQ Page has been added to ensure the Users dont get stuck somewhere in the library and could get some reference on it Such as the Linux issue with quickjs where the fix is provided. Conclusion There were alot of challenges while making this library with my Laptop dropping to 0.47GHz at random moments and searching the pub.dev docs for shadcn_flutter and upgrading sub-libraries and testing stuff the major headache being the Navigation and Web Support (SEO is done via PHP to show Web Crawlers meangingful HTML to index).", "repo": "https://github.com/kwe26/neneui", "demo": "https://www.npmjs.com/@neneys/ui"}, {"ship_num": 2, "ts": "2026-08-21T15:35:04Z", "hours": 38.0, "multiplier": 18.11, "payout": 687, "blessing": "neutral", "text": "I made an Server-Side Rendering Library for Flutter, You write the Code in TypeScript and the Flutter Renderer (i named it Daikon) parses it into Native Code, Without WebViews! Completely Native. The Challenges i faced were, how to like index the widgets to be used while JSON becomes parsed and the handling of #ids and most importantly, ForEach Option and the JS Option. I used shadcn_flutter for UI Elements that were rendered, i really like shadcn_flutter’s Design. it’s really cool. I tried to keep it as much as user-friendly as possible, by adding TypeScript Types so VSCode Auto-complete could work. I have also added File Uploads feature with In-Memory Image Display too, if it’s an Image, it is really helpful, even with Server Callbacks and such things Theese are necessary for an production application. And Actions such as TOAST, DIALOG, NAVIGATE, etc. This is the intresting part too!! You can try out the library at https://www.npmjs.com/@neneys/ui for testing it out! While the docs is still not complete, i hope that the documented Widgets could work for your expirment too! I plan to continue this Library even after the program ends!! Love you all! 🥰", "repo": "https://github.com/kwe26/neneui", "demo": "https://www.npmjs.com/@neneys/ui"}]...
|
[{"post_id": 82256, "ts": "202 [{"post_id": 82256, "ts": "2026-10-24T12:15:40Z", "hours": 2.1886, "text": "Devlog (No.28) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere README.md README.md has been improved alot with visual designs and details with Links and References Provided too and some Yashiro Nene based Images. Figma File is provided in link. Docs Updates The Home Page of Docs has been updated to look better and provide more information about NeneUI. The Docs Is now extended and now includes more information about implemented Widgets and Link to NeneUI Testing Kit NeneUI Testing Kit The NeneUI Testing Kit has been updated to show examples of @neneys /ui One being an AI Chat Application and other being an random Test with Pokedex, etc. Nene Desktop Runtime While Still Work in Progress, You can now follow the docs to Launch and test the Desktop Runtime. The Desktop Runtime is a standalone application that could embed @neneys /ui in it and Make Desktop Applications with just TypeScript. A Stable Release NeneUI will be released as a stable version 1.0.0 with Pub.dev and NPM Versions available soon as possible and will be kept updated Thanks for your support till 1.0.0 Release! I hope we meet soon! Thanks <3333"}, {"post_id": 82065, "ts": "2026-10-23T17:57:50Z", "hours": 3.3633, "text": "Devlog (No.27) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere JavascriptEngine JavaScriptEngine({…}) which could control Whether JS should be enabled or not and how much stackSize should be specified. xhr should be enabled or disabled SEO Support for Flutter Web With the Help of PHP to Render Text, Image and some minimal data. PHP can provide basic Page to Crawlers requesting the site. So that SEO could be utilised. However, PHP Version Selection is limited to only allow the recently patched PHP versions for Security Reasons. Github Actions Added Nene Desktop Runtime to be built in Github Actions Bug FIxes @neneys /ui had a Critical Memory and GPU Leak issue which kept the GPU usage at constant high even when not being used and being left Idle. Docs Updates JavaScript Execution and SEO Setup are now documented in the Docs and pub.dev and npmjs packages are now updated NeneUI Testing Kit NeneUI Testing Kit are now available on Web https://kwe26.github.io/neneui/tester However It could only open HTTPS and Cors (*) Apps only and is kind of limited with some JS Execution Issues. The User Interface of Testing Kit is also quite updated. Close to Release NeneUI is now Close to being 1.0.0 Release finally! Within 1-2 devlogs i’ll be shipping soon.!! Thanks for reading! Love you <3!"}, {"post_id": 81857, "ts": "2026-10-22T19:16:50Z", "hours": 1.7314, "text": "Devlog (No.26) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Web - Platform Support Finally, @neneys /ui is now supported on Web (Flutter Web). The Inconsistencies are now managed making @neneys /ui work directly on Web Too. *Limitations on Web * Same as Flutter Web - It’s hard for crawlers to idenitfy content of web pages. I’m trying to fix that issue by double-rendering. Mostly by Setting-up an PHP to Interept the UI into HTML for Crawlers Making SEO work good! README.md Changes FAQ Added into README (Address the Linux Compile Issue in FAQ related to quickjs_engine) More Decorative Elements Github Actions Nene UI Testing Kit finally compiles on all 5 (Windows, Linux, Android, iOS, macOS) successfuly. Linux, macOS - May require libmpv to be installed or available on system path We seem to be very close to first v1 Release with maximum widgets and support. Thanks for Reading!! I love you all 3<.!!!"}, {"post_id": 81525, "ts": "2026-10-21T16:05:35Z", "hours": 4.5514, "text": "Devlog (No.25) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Widget Layouts Layout Layouts and Layout It helps you make an Layout on Screen as show in Screenshot. And It can be arranged via an Handle too, It supports unlimited Layout on Screen as much as space is there. Removed Removed Skeleton Widget from Docs as it was no-longer rendering properly README.md The README.md is now updated with some Images and Decorative Work for looking more nicer and attractive New Action New Action such as ACTION.SET_DISPLAY_INDEX and ACTION.CLOSE_OVERLAY AlertDialog is now documented under FeedBack Section Nene Desktop Runtime Nene Desktop Runtime is half-done and still has some issues, will try to fix it and make it install and run Apps soon! Thanks for reading!! I love you all >3"}, {"post_id": 80207, "ts": "2026-10-16T18:56:50Z", "hours": 2.6222, "text": "Devlog (No.24) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere WebSocket Support NeneUI now supports WebSocket Rendering and Execution WebSocket ({ url : \" ws://localhost:3500/ws/home \" , }) What Can it Do? Show Widgets Over WebSockets Execute Actions Use Cases? ChatBots Live News? Messaging? New Action Action.SEND_SOCKET Uses FormSubmitAction as Parameter with :socket: as the callbackPath New Functions SendWidget(socket, Widget) SendAction(socket, DoAction) Thanks for Reading! Love you all readers >3!"}, {"post_id": 79450, "ts": "2026-10-14T01:34:11Z", "hours": 2.6942, "text": "Devlog (No.23) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Features Shared Preferences ReqType Action.SOFT_RELOAD SharedPreferences You can use SET_PREFS and REM_PREFS Action to Set or Remove and PREF_EXISTS with exists and not parameters for functions GetPrefs When ReqType.POST is present you could use GetPrefs to get the preference value in UI/Callback Route GetFile Returns File Uploaded’s Path as in uploads/file.extension only works in Callback as that’s the place where you could recieve file. Action.SOFT_RELOAD Reloads the Screen without Changing any State or Position of Page. Other Changes :- Remove Old docs/ folder and SKILL.md for AI Agents to utilise NeneUI properly Thanks for reading. love you all 🥰🥰"}, {"post_id": 77906, "ts": "2026-10-08T18:28:36Z", "hours": 0.7811, "text": "Devlog (No.22) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere NeneWorld - An Sample App NeneWorld is an Sample App for @neneys /ui Showcasing some Little Things of NeneUI. *Who Made It? : * Claude! Yes SKILL.md is coming soon to everyone, where the AI can read SKILL.md and create an App using NeneUI Library. Features? of this Sample App Demo of NeneBottomnav, NeneDisplay Images Buttons and Callback Pokedex Dw, Only the Sample is AI-written, The Main Project @neneys /ui Library is still an human-made project. And i do not want AI to take over NeneUI and write it itself, that would ruin this Library Why Skill.MD? So, that Users Can make an App using NeneUI and also ask AI For Help where they feel stuck. Tho it consumes tokens alot, cus NeneUI is becoming an more larger library Excuz me what is NeneUI? As i told earlier, NeneUI allows you to write the entire App UI in TypeScript and Render it Server-Side and produce in front of User. AND NO NENEUI IS NOT A WEBVIEW. It translates TypeScript into NATIVE Flutter Widgets. So the Interface feels native and uses Less RAM in this RAM Crisis Economy. Status? NeneUI is still in early stages, as i consider it. It still lacks many things such as an shared_preferences Implementation, WebSockets and proper Secure JavaScript Execution System. Conclusion I love if i get even tiny support for NeneUI and the people reading this devlog, I love you all who support me ;) Love you >3… Thanks for reading…!!!!"}, {"post_id": 77561, "ts": "2026-10-07T14:14:36Z", "hours": 1.3781, "text": "Devlog (No.21) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Widget & Major Feature Added NeneDisplay to Change the Area of the Screen with a custom route, Like we see on normal apps. NeneDisplay It follows the index of bottomNavbar (or prescribed Variable) and loads the corresponding Page on the Area specified. Only Scaffold Body as a whole is supported as of now. NeneDisplay ({ urlMap : { 0 : \" /ui/route_a \" , 1 : \" /ui/route_b \" } }) It has urlMap and followIndex arguments only. Quick Note: It does not create a complete new Nene IDDB, It exists on top of the existing one so the variables do not disappear that were assigned by previous page . Thanks for reading today!! I hope your day goes well Love you all >3"}, {"post_id": 77257, "ts": "2026-10-06T09:21:43Z", "hours": 1.04, "text": "Devlog (No.20) - A tiny update NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere CUSTOM WIDGET YAY!!!! NeneBottomNavbar Bottom Navigation Bar for NeneUI Apps! With Two Types for Now normal , float About NeneNavbottom and NeneNavItem are the new widgets added. Any New Widget? Yes, NeneSidebar as well and NeneDisplay for Route and SPA System THANKS for Reading !!! Love you all."}, {"post_id": 76497, "ts": "2026-10-03T19:12:05Z", "hours": 1.4064, "text": "Devlog (No.19) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Changes Added a Mouse Hover Effect like in Inspect Element for Debug Bar Docs Changes Added Docs about SingleChildScrollView Compare & Variables Documentation Breadcrumbs Future Changes Custom Widgets Layout Widgets mostly Custom BottomNavBar Possible WebUI for SEO Purposes I’ve planned with PHP, Next.js but i have to yet choose which one would be easier to implement and best SEO. I’m having a slight fever, so i’m unable to update many things i’ve planned in my mind, i apologise for it. Anyways Thanks everyone, Love you for the support ❤️"}, {"post_id": 74963, "ts": "2026-09-28T18:21:51Z", "hours": 2.1094, "text": "Devlog (No.18) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Feature & Changes Changed Overlay Circular Progress Indicator to LinearProgressIndicator near AppBar for Form Submit New Action RELOAD UI (Soft-reloads UI) DebugBar (A.k.a Orb) Stays always active Docs Changes Add Layouts Docs (Column,Row) Avatar Widget Docs Button, ButtonGroup MainAxis, CrossAxis Documented That’s it for today, Thanks for Reading!!"}, {"post_id": 74142, "ts": "2026-09-26T19:17:54Z", "hours": 2.5919, "text": "Devlog (No.17) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Bug Fixes Fix where Height/Width of Image’s Default Value was always 0. Docs Progress Added Content Documentation Added Feedback Widgets Docs such as Progress, CircularProgressIndicator, etc. Experiment Tried to Experiment with Rust Renderer, It did not work as i don’t know rust much properly Desktop Apps - Planning Update I’ve planned to make the Desktop Apps be static but built from TypeScript and Bundle Flutter + Bun Shipping Desktop Apps. Stardance Example In the Stardance Example, I’ve added Banner Images Support if available and Creation Date and Devlog Count. More to come on the way. Thanks for reading everyone Love you all >3….."}, {"post_id": 73495, "ts": "2026-09-25T07:31:02Z", "hours": 2.2736, "text": "Devlog (No.16) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Bug Fixes in NeneUI Fixed a Bug where Padding caused Null Error in Some Widgets Fixed Card not having color passed down to UI Renderer Docs Updates The Documentation of Actions and Forms is now Complete!! Next Up Feedback and more! Example App (WIP) The Example app is located in stardance_ui.ts <– It’s an utilisation of Stardance API to show something and render it in NeneUI! (It’s in very very early stage also it’s letting me discover more stability bugs along with it.) Info on Plugins I’m planning to pause on Plugins development and not include the @neneys /payments plugin in Testing Kit for Now. Desktop App (Electron-like Solution) - [Planned] I’m planning to make an Electron-like Framework but instead of Chromium we’ll use NeneUI to render the Desktop App. Thank you for reading!! I love the readers ;)"}, {"post_id": 72332, "ts": "2026-09-22T17:57:30Z", "hours": 2.1519, "text": "Devlog (No.15) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere What’s New in Docs? -> I’ve Separated Base Components and Form Components -> TextField, ColorPicker, CheckBox Docs Added -> Sample Callback has been added What’s Next? Add Actions and DoAction Docs and Explaining Callbacks Navigation System What did i discover? Appearently if you do not have Scaffold in a new page, Flutter makes it completly black page. It seems like Scaffold is required to be defined from NeneUI Server-Side. Plans in NeneUI Implement More Controlled JavaScript Environment and Allow Enabling and Disabling JavaScript. Restrictions and More Functions to Manipulate Widgets One More thing Apparently, The NPM Package and Flutter Package is recieving alot of Downloads in week, idk how, But I’m very happy and i really want to thank them. . Anyways . Thank you for reading my devlog. Love you all!!!! 🥰🥰"}, {"post_id": 70646, "ts": "2026-09-19T14:48:32Z", "hours": 3.0544, "text": "Devlog (No.14) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Docs, Finally! Tho it’s not complete but foundation is now laid! Using Docsaurus for the Docs Changes in NeneUI? Upgrade Sample App Version Publish 0.0.6 to Dart for Combability Docs is available at https://kwe26.github.io/neneui/ NeneUI is becoming more and more productional! New Features & Bug Fixes Coming on the WAY!!! NOTE: Only a few components are documented as of now! Thanks for Reading Love you all 😘😘"}, {"post_id": 69490, "ts": "2026-09-17T04:53:57Z", "hours": 7.1178, "text": "Devlog (No.13) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Bug Fixes And Improvements Fix Bug where FormSubmit would .pop the context out Upgrade flutter_js to flutter_quickjs Improve NeneUI Testing Kit for Android Setup Plugins Support New Features @neneys /payments - Yes, You can Accept Payments from NeneUI now too! Docs - Working on a Documentation based on Docusaurus What’s Next? Improving JS Execution and Making it More Secure Working on Form Submission to fix some issues An Proper Docs for every Humans! Making @neneys /payments on Flutter to use url_launcher or Native Plugins instead of rendering it in Web, would be better. More Plugins!! Hey, i’ve been thinking would it be good idea, if we make it an Electron like Windows/Linux/macOS App Making too but instead of Chromium it’ll be flutter render?? Thanks, kwee26 Love you all 🥰"}, {"post_id": 67573, "ts": "2026-09-13T18:27:12Z", "hours": 1.0572, "text": "Devlog (No.12) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Bug Fixes & Improvements Larger Files Now Do not Freeze The Entire App It can now process Large Files (e.g. Ubuntu ISO) A Single Error in Widget (exclusion of RenderOverflows) now don’t block entire app, As seen in Screenshot (2) below Error Handling has been improved. Re-Designed: NeneUI Testing Tool It has been Renamed into NeneUI Testing Kit It now has a Nice Looking UI with Nene in Right! Links to Project now included and Confirmation of Launch App and Plugins Selection Anyways, That’s it for Today! Thank you! Love you all 🤞🥰"}, {"post_id": 67046, "ts": "2026-09-13T02:51:26Z", "hours": 2.0111, "text": "Devlog (No.11) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Widget (as a plugin) : VideoFrame Widget, Currently this is an prototype and i don’t gurantee complete stableness in this VideoFrame. Other Major Changes Migrated to Latest Flutter SDK Removed Material Mentions Upgraded shadcn_flutter New Fatal Error When Starting up I have re-designed the Fatal Error when NeneUI couldn’t be initialized for some reason, now you can Try Again or even copy the Stacktrace on why is it happening What are the plans? Improve Stability & Performance Focus more on Documentation Theese Suggestions were given by Anon in Review, and i think i should focus on them more. And that’s it for now Thank you, for reading Love you all 😘😘"}, {"post_id": 65523, "ts": "2026-09-10T18:36:33Z", "hours": 1.1789, "text": "Devlog (No.10) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Here are the changes that were made and are planned NeneUI Tester Pre-hosted NeneUI Examples @neneys /payments system Video, Audio Players Custom Widget SharedPreferences Please suggest more changes that can be added to @neneys /ui Love you all ❤️"}, {"post_id": 51713, "ts": "2026-08-21T15:22:14Z", "hours": 5.1417, "text": "Devlog (No.9) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere I hope this is the last Devlog, before shipping the first version Here’s the List of Changes made Added an Sample Project Extended Docs and Readme.md Fixed Bugs in TS Library Themes Support! showDialog -> showOverlay Package Renamed to as @neneys /ui I really love this project, i always hoped for an Remote Server Side Native UI Rendering, And here we are with first release!!! I hope for your genuine support and love for this project! Thanks, I love everyone ❤️ !"}, {"post_id": 30251, "ts": "2026-07-17T17:55:58Z", "hours": 6.4769, "text": "Devlog (No.8) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere I’ve thought of more useful features and added them as well, and you will love it Here are the list of the features i’ve added File Uploads!! Breadcrumbs PropsReplacement Improved Nene HTTP ColorPickers! Some Docs Image Memory File uploads was the hardest part to do, it took a lot of time debugging and working around then there was loading image from memory i had to figure out what to do, so i just made it to load the selected file from memory Known Funny Issue: Please don’t try uploading a GB worth of file, it freezes up your system, i think i may try writing an exception that prevents 500MB+ file being uploaded otherwise it’s disaster I’m planning to ship 1st release by next blog soon enough, working on it from now on so it would be easier for everyone to use it Here’s the Screenshot"}, {"post_id": 15198, "ts": "2026-06-24T18:20:21Z", "hours": 5.385, "text": "Devlog (No.7) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere I’ve been thinking and working on new features which would make it possible for NeneUI to be used productionally by all the developers New Features ForEach Widget Support to ForEach Terms Column ( ' #forEachTest ' , { mainAxisAlignment : MainAxis . start , crossAxisAlignment : CrossAxis . start , foreach : true , children : ForEach ( ' #forEachW ' , { varToForEach : \" testMap \" , namespaceVar : \" testMap \" , child : Row ( ' #roWCh ' , { children : [ Text ( ' #TextABC ' , { text : Var ({ template : \" Hello, %1 (%2) \" , variable : \" for.title,for.gender \" }) }) ] }) }) }) The Code ForEach will only work inside children:[] where multiple widgets can be rendered Such as Row, Flex, Table Frame Widget Frame ( ' #frame ' , { framePath : \" /ui/test \" }) This Widget Functions just like IFrames in HTML to render something inside another page Table Widgets The Table Widgets Include Table , TableCell , TableFooter , TableRow , TableSize DatePicker Widget DatePicker ( ' #dtp ' , { mode : PromptMode . dialog , defaultDate : DateTime . now () }) PromptMode and DateTime are now integrated within Core.ts JavaScript Code Execution!! YOU CAN NOW EXECUTE JAVASCRIPT CODE TOO!! DoAction ( Action . JAVASCRIPT , `console.log(\"Var: \"+getVariable(\"#userName.controller\")); action(' ${ Action . SHOW_TOAST } ', Date.now() + ' Hello World ' + getVariable(\"#userName.controller\"));` ) Currently Using flutter_js which in turn uses QJS behind the scenes Modifications Image now supports Variable URL Support as well showScaffold Flag has been added to Daikon Renderer for Frame Planned Stuffs ListView and GridView Support in Future Updates Usable JS Features OTP Input and More Shadcn_flutter Widgets Thanks for Reading!!!!"}, {"post_id": 8648, "ts": "2026-06-14T11:32:13Z", "hours": 5.4906, "text": "Devlog 7 . Context: it is an Server-Side Rendering Library for Flutter Apps so the UI can be updated without even touching flutter’s code or re-compiling the app. . . New Features Added NeneHTTP and NeneCallback for Callback (IPC-like) Add AlertDialog Support Add HoverCard Widget Improve Types of Widgets to Ensure Easy Integration Remove Unused Imports Half-Done ForEach Support, Quite Difficult but will try to implement it soon. FormSubmit Button Widget Added Widget Props Manipulation as well to Manipulate or Replace Widget at any place. . I’m working on more new features to integrate, hopefully they get integrated with ease."}, {"post_id": 7465, "ts": "2026-06-12T13:27:31Z", "hours": 5.6386, "text": "Devlog 6 . . Context: It is an Server Side Rendering Library for Flutter Apps so the UI can be updated without even touching flutter’s code and re-compiling the entire app. . New Features Introduced CheckBox and TextField widgets with state reading support Added Context Menu functionality for various widgets Added NavigationItem, NavigationGroup, and NavigationDivider components Implemented Compare() for conditional UI rendering Added Refresh Interface option in Daikon Debug Integrated Iconify API for dynamic icon resolution and rendering . . I Plan to add More Features sooner enough. Completing NeneUI."}, {"post_id": 6281, "ts": "2026-06-10T15:43:26Z", "hours": 2.4778, "text": "Devlog #5 . Project Context: . This is a Server Side Rendering Library for Flutter that allows you to update the User Interface of app without completely re-building the app granting control from server-side and natively render all widgets instead of WIdget. . . In This Update I’ve added Image Widget Complete Support in Daikon Renderer along with SVG Support Daikon Debugger Variable Display and Setting ButtonGroup Widget too! You can see the attached video!!."}, {"post_id": 5810, "ts": "2026-06-09T18:58:11Z", "hours": 1.1883, "text": "Devlog #4 . Context for thoose who don’t know: I’m making an Server Side Rendering Library, Where You can Update your App without updating the entire app everywhere. Write in JS, Works in FLutter . Updates: Add New Widgets such as Card, Image, Feedback Widget (CircularProgressIndicator, LinearProgressIndicator, Button), Add Actions for Simple Reactivity . It uses the ID_Database to Manage Visibility of Widgets (Demo Given), The Actions can also invoke Navigation Push and Push Replace. and Also Show TOAST!! . Hope to see more coming changes soon to make it productional use ;) 😋. Thanks Kiwi"}, {"post_id": 5536, "ts": "2026-06-09T10:51:53Z", "hours": 2.0575, "text": "Devlog #3.1 . Context for thoose who don’t know: I’m making a library that can render user interface for flutter from JavaScript, You can also refer it as Server Side UI Rendering, Where you can update your flutter apps without Updating the entire app. . I’ve added Some More Widgets such as Card, Image, Expanded, Container support to Flutter Render too! . Some Feedback Widgets are also added such as CircularProgressIndicator and LinearProgressIndicator . I’m also planning on idDatabase Manipulation and doAction() to perform actions as well. . I’m planning on to adding more and also an Tiny JS Runtime as well for Reactivvity (i’ve planend it for now) . More things Coming ;) 🥰"}, {"post_id": 5395, "ts": "2026-06-09T04:36:02Z", "hours": 1.1511, "text": "Devlog #3 . Context for thoose who don’t know: I’m making a library that can render user interface for flutter from JavaScript, You can also refer it as Server Side UI Rendering, Where you can update your flutter apps without Updating the entire app. . I’ve finally made it to parse and render the User Interface in Flutter, I’ts really minimal right now. . I’m focusing to add more Widgets and stuff and reactivity of widgets in the end. . There’s lot more things coming ;;33😉"}, {"post_id": 5041, "ts": "2026-06-08T18:19:18Z", "hours": 1.4267, "text": "I have partially done the flutter renderer, haven’t tested it yet. will continue working tomorrow."}, {"post_id": 4852, "ts": "2026-06-08T11:53:22Z", "hours": 1.4711, "text": "Hi there, I’m working on a Server Side UI Rendering Linking Flutter and JavaScript. . You will write the code in javascript and it will be converted into JSON, which the flutter will parse and render. it is much more effective than WebView Apps. . And Since it’s Native means Native Performance too. . Currently I’ve only added few widgets in TypeScript only. . Scaffold, Center, Container, EdgeInsets, Expanded, Padding, SizedBox, Column, Row, SingleChildScrollView, Flex, Text, TextStyle . And Some Enums as well. . I’ve not made Flutter Renderer Yet. The lib/* currently looks like."}]...
|
Title: NeneUI (@neneys/ui) by @pksmkwe26 | Stardan Title: NeneUI (@neneys/ui) by @pksmkwe26 | Stardance
Devlogs:
Hi there, I’m working on a Server Side UI Rendering Linking Flutter and JavaScript. . You will write the code in javascript and it will be converted into JSON, which the flutter will parse and render. it is much more effective than WebView Apps. . And Since it’s Native means Native Performance too. . Currently I’ve only added few widgets in TypeScript only. . Scaffold, Center, Container, EdgeInsets, Expanded, Padding, SizedBox, Column, Row, SingleChildScrollView, Flex, Text, TextStyle . And Some Enums as well. . I’ve not made Flutter Renderer Yet. The lib/* currently looks like.
I have partially done the flutter renderer, haven’t tested it yet. will continue working tomorrow.
Devlog #3 . Context for thoose who don’t know: I’m making a library that can render user interface for flutter from JavaScript, You can also refer it as Server Side UI Rendering, Where you can update your flutter apps without Updating the entire app. . I’ve finally made it to parse and render the User Interface in Flutter, I’ts really minimal right now. . I’m focusing to add more Widgets and stuff and reactivity of widgets in the end. . There’s lot more things coming ;;33😉
Devlog #3.1 . Context for thoose who don’t know: I’m making a library that can render user interface for flutter from JavaScript, You can also refer it as Server Side UI Rendering, Where you can update your flutter apps without Updating the entire app. . I’ve added Some More Widgets such as Card, Image, Expanded, Container support to Flutter Render too! . Some Feedback Widgets are also added such as CircularProgressIndicator and LinearProgressIndicator . I’m also planning on idDatabase Manipulation and doAction() to perform actions as well. . I’m planning on to adding more and also an Tiny JS Runtime as well for Reactivvity (i’ve planend it for now) . More things Coming ;) 🥰
Devlog #4 . Context for thoose who don’t know: I’m making an Server Side Rendering Library, Where You can Update your App without updating the entire app everywhere. Write in JS, Works in FLutter . Updates: Add New Widgets such as Card, Image, Feedback Widget (CircularProgressIndicator, LinearProgressIndicator, Button), Add Actions for Simple Reactivity . It uses the ID_Database to Manage Visibility of Widgets (Demo Given), The Actions can also invoke Navigation Push and Push Replace. and Also Show TOAST!! . Hope to see more coming changes soon to make it productional use ;) 😋. Thanks Kiwi
Devlog #5 . Project Context: . This is a Server Side Rendering Library for Flutter that allows you to update the User Interface of app without completely re-building the app granting control from server-side and natively render all widgets instead of WIdget. . . In This Update I’ve added Image Widget Complete Support in Daikon Renderer along with SVG Support Daikon Debugger Variable Display and Setting ButtonGroup Widget too! You can see the attached video!!.
Devlog 6 . . Context: It is an Server Side Rendering Library for Flutter Apps so the UI can be updated without even touching flutter’s code and re-compiling the entire app. . New Features Introduced CheckBox and TextField widgets with state reading support Added Context Menu functionality for various widgets Added NavigationItem, NavigationGroup, and NavigationDivider components Implemented Compare() for conditional UI rendering Added Refresh Interface option in Daikon Debug Integrated Iconify API for dynamic icon resolution and rendering . . I Plan to add More Features sooner enough. Completing NeneUI.
Devlog 7 . Context: it is an Server-Side Rendering Library for Flutter Apps so the UI can be updated without even touching flutter’s code or re-compiling the app. . . New Features Added NeneHTTP and NeneCallback for Callback (IPC-like) Add AlertDialog Support Add HoverCard Widget Improve Types of Widgets to Ensure Easy Integration Remove Unused Imports Half-Done ForEach Support, Quite Difficult but will try to implement it soon. FormSubmit Button Widget Added Widget Props Manipulation as well to Manipulate or Replace Widget at any place. . I’m working on more new features to integrate, hopefully they get integrated with ease.
Devlog (No.7) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere I’ve been thinking and working on new features which would make it possible for NeneUI to be used productionally by all the developers New Features ForEach Widget Support to ForEach Terms Column ( ' #forEachTest ' , { mainAxisAlignment : MainAxis . start , crossAxisAlignment : CrossAxis . start , foreach : true , children : ForEach ( ' #forEachW ' , { varToForEach : " testMap " , namespaceVar : " testMap " , child : Row ( ' #roWCh ' , { children : [ Text ( ' #TextABC ' , { text : Var ({ template : " Hello, %1 (%2) " , variable : " for.title,for.gender " }) }) ] }) }) }) The Code ForEach will only work inside children:[] where multiple widgets can be rendered Such as Row, Flex, Table Frame Widget Frame ( ' #frame ' , { framePath : " /ui/test " }) This Widget Functions just like IFrames in HTML to render something inside another page Table Widgets The Table Widgets Include Table , TableCell , TableFooter , TableRow , TableSize DatePicker Widget DatePicker ( ' #dtp ' , { mode : PromptMode . dialog , defaultDate : DateTime . now () }) PromptMode and DateTime are now integrated within Core.ts JavaScript Code Execution!! YOU CAN NOW EXECUTE JAVASCRIPT CODE TOO!! DoAction ( Action . JAVASCRIPT , `console.log("Var: "+getVariable("#userName.controller")); action(' ${ Action . SHOW_TOAST } ', Date.now() + ' Hello World ' + getVariable("#userName.controller"));` ) Currently Using flutter_js which in turn uses QJS behind the scenes Modifications Image now supports Variable URL Support as well showScaffold Flag has been added to Daikon Renderer for Frame Planned Stuffs ListView and GridView Support in Future Updates Usable JS Features OTP Input and More Shadcn_flutter Widgets Thanks for Reading!!!!
Devlog (No.8) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere I’ve thought of more useful features and added them as well, and you will love it Here are the list of the features i’ve added File Uploads!! Breadcrumbs PropsReplacement Improved Nene HTTP ColorPickers! Some Docs Image Memory File uploads was the hardest part to do, it took a lot of time debugging and working around then there was loading image from memory i had to figure out what to do, so i just made it to load the selected file from memory Known Funny Issue: Please don’t try uploading a GB worth of file, it freezes up your system, i think i may try writing an exception that prevents 500MB+ file being uploaded otherwise it’s disaster I’m planning to ship 1st release by next blog soon enough, working on it from now on so it would be easier for everyone to use it Here’s the Screenshot
Devlog (No.9) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere I hope this is the last Devlog, before shipping the first version Here’s the List of Changes made Added an Sample Project Extended Docs and Readme.md Fixed Bugs in TS Library Themes Support! showDialog -> showOverlay Package Renamed to as @neneys /ui I really love this project, i always hoped for an Remote Server Side Native UI Rendering, And here we are with first release!!! I hope for your genuine support and love for this project! Thanks, I love everyone ❤️ !
Devlog (No.10) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Here are the changes that were made and are planned NeneUI Tester Pre-hosted NeneUI Examples @neneys /payments system Video, Audio Players Custom Widget SharedPreferences Please suggest more changes that can be added to @neneys /ui Love you all ❤️
Devlog (No.11) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Widget (as a plugin) : VideoFrame Widget, Currently this is an prototype and i don’t gurantee complete stableness in this VideoFrame. Other Major Changes Migrated to Latest Flutter SDK Removed Material Mentions Upgraded shadcn_flutter New Fatal Error When Starting up I have re-designed the Fatal Error when NeneUI couldn’t be initialized for some reason, now you can Try Again or even copy the Stacktrace on why is it happening What are the plans? Improve Stability & Performance Focus more on Documentation Theese Suggestions were given by Anon in Review, and i think i should focus on them more. And that’s it for now Thank you, for reading Love you all 😘😘
Devlog (No.12) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Bug Fixes & Improvements Larger Files Now Do not Freeze The Entire App It can now process Large Files (e.g. Ubuntu ISO) A Single Error in Widget (exclusion of RenderOverflows) now don’t block entire app, As seen in Screenshot (2) below Error Handling has been improved. Re-Designed: NeneUI Testing Tool It has been Renamed into NeneUI Testing Kit It now has a Nice Looking UI with Nene in Right! Links to Project now included and Confirmation of Launch App and Plugins Selection Anyways, That’s it for Today! Thank you! Love you all 🤞🥰
Devlog (No.13) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Bug Fixes And Improvements Fix Bug where FormSubmit would .pop the context out Upgrade flutter_js to flutter_quickjs Improve NeneUI Testing Kit for Android Setup Plugins Support New Features @neneys /payments - Yes, You can Accept Payments from NeneUI now too! Docs - Working on a Documentation based on Docusaurus What’s Next? Improving JS Execution and Making it More Secure Working on Form Submission to fix some issues An Proper Docs for every Humans! Making @neneys /payments on Flutter to use url_launcher or Native Plugins instead of rendering it in Web, would be better. More Plugins!! Hey, i’ve been thinking would it be good idea, if we make it an Electron like Windows/Linux/macOS App Making too but instead of Chromium it’ll be flutter render?? Thanks, kwee26 Love you all 🥰
Devlog (No.14) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Docs, Finally! Tho it’s not complete but foundation is now laid! Using Docsaurus for the Docs Changes in NeneUI? Upgrade Sample App Version Publish 0.0.6 to Dart for Combability Docs is available at https://kwe26.github.io/neneui/ NeneUI is becoming more and more productional! New Features & Bug Fixes Coming on the WAY!!! NOTE: Only a few components are documented as of now! Thanks for Reading Love you all 😘😘
Devlog (No.15) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere What’s New in Docs? -> I’ve Separated Base Components and Form Components -> TextField, ColorPicker, CheckBox Docs Added -> Sample Callback has been added What’s Next? Add Actions and DoAction Docs and Explaining Callbacks Navigation System What did i discover? Appearently if you do not have Scaffold in a new page, Flutter makes it completly black page. It seems like Scaffold is required to be defined from NeneUI Server-Side. Plans in NeneUI Implement More Controlled JavaScript Environment and Allow Enabling and Disabling JavaScript. Restrictions and More Functions to Manipulate Widgets One More thing Apparently, The NPM Package and Flutter Package is recieving alot of Downloads in week, idk how, But I’m very happy and i really want to thank them. . Anyways . Thank you for reading my devlog. Love you all!!!! 🥰🥰
Devlog (No.16) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Bug Fixes in NeneUI Fixed a Bug where Padding caused Null Error in Some Widgets Fixed Card not having color passed down to UI Renderer Docs Updates The Documentation of Actions and Forms is now Complete!! Next Up Feedback and more! Example App (WIP) The Example app is located in stardance_ui.ts <– It’s an utilisation of Stardance API to show something and render it in NeneUI! (It’s in very very early stage also it’s letting me discover more stability bugs along with it.) Info on Plugins I’m planning to pause on Plugins development and not include the @neneys /payments plugin in Testing Kit for Now. Desktop App (Electron-like Solution) - [Planned] I’m planning to make an Electron-like Framework but instead of Chromium we’ll use NeneUI to render the Desktop App. Thank you for reading!! I love the readers ;)
Devlog (No.17) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Bug Fixes Fix where Height/Width of Image’s Default Value was always 0. Docs Progress Added Content Documentation Added Feedback Widgets Docs such as Progress, CircularProgressIndicator, etc. Experiment Tried to Experiment with Rust Renderer, It did not work as i don’t know rust much properly Desktop Apps - Planning Update I’ve planned to make the Desktop Apps be static but built from TypeScript and Bundle Flutter + Bun Shipping Desktop Apps. Stardance Example In the Stardance Example, I’ve added Banner Images Support if available and Creation Date and Devlog Count. More to come on the way. Thanks for reading everyone Love you all >3…..
Devlog (No.18) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Feature & Changes Changed Overlay Circular Progress Indicator to LinearProgressIndicator near AppBar for Form Submit New Action RELOAD UI (Soft-reloads UI) DebugBar (A.k.a Orb) Stays always active Docs Changes Add Layouts Docs (Column,Row) Avatar Widget Docs Button, ButtonGroup MainAxis, CrossAxis Documented That’s it for today, Thanks for Reading!!
Devlog (No.19) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Changes Added a Mouse Hover Effect like in Inspect Element for Debug Bar Docs Changes Added Docs about SingleChildScrollView Compare & Variables Documentation Breadcrumbs Future Changes Custom Widgets Layout Widgets mostly Custom BottomNavBar Possible WebUI for SEO Purposes I’ve planned with PHP, Next.js but i have to yet choose which one would be easier to implement and best SEO. I’m having a slight fever, so i’m unable to update many things i’ve planned in my mind, i apologise for it. Anyways Thanks everyone, Love you for the support ❤️
Devlog (No.20) - A tiny update NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere CUSTOM WIDGET YAY!!!! NeneBottomNavbar Bottom Navigation Bar for NeneUI Apps! With Two Types for Now normal , float About NeneNavbottom and NeneNavItem are the new widgets added. Any New Widget? Yes, NeneSidebar as well and NeneDisplay for Route and SPA System THANKS for Reading !!! Love you all.
Devlog (No.21) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Widget & Major Feature Added NeneDisplay to Change the Area of the Screen with a custom route, Like we see on normal apps. NeneDisplay It follows the index of bottomNavbar (or prescribed Variable) and loads the corresponding Page on the Area specified. Only Scaffold Body as a whole is supported as of now. NeneDisplay ({ urlMap : { 0 : " /ui/route_a " , 1 : " /ui/route_b " } }) It has urlMap and followIndex arguments only. Quick Note: It does not create a complete new Nene IDDB, It exists on top of the existing one so the variables do not disappear that were assigned by previous page . Thanks for reading today!! I hope your day goes well Love you all >3
Devlog (No.22) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere NeneWorld - An Sample App NeneWorld is an Sample App for @neneys /ui Showcasing some Little Things of NeneUI. *Who Made It? : * Claude! Yes SKILL.md is coming soon to everyone, where the AI can read SKILL.md and create an App using NeneUI Library. Features? of this Sample App Demo of NeneBottomnav, NeneDisplay Images Buttons and Callback Pokedex Dw, Only the Sample is AI-written, The Main Project @neneys /ui Library is still an human-made project. And i do not want AI to take over NeneUI and write it itself, that would ruin this Library Why Skill.MD? So, that Users Can make an App using NeneUI and also ask AI For Help where they feel stuck. Tho it consumes tokens alot, cus NeneUI is becoming an more larger library Excuz me what is NeneUI? As i told earlier, NeneUI allows you to write the entire App UI in TypeScript and Render it Server-Side and produce in front of User. AND NO NENEUI IS NOT A WEBVIEW. It translates TypeScript into NATIVE Flutter Widgets. So the Interface feels native and uses Less RAM in this RAM Crisis Economy. Status? NeneUI is still in early stages, as i consider it. It still lacks many things such as an shared_preferences Implementation, WebSockets and proper Secure JavaScript Execution System. Conclusion I love if i get even tiny support for NeneUI and the people reading this devlog, I love you all who support me ;) Love you >3… Thanks for reading…!!!!
Devlog (No.23) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Features Shared Preferences ReqType Action.SOFT_RELOAD SharedPreferences You can use SET_PREFS and REM_PREFS Action to Set or Remove and PREF_EXISTS with exists and not parameters for functions GetPrefs When ReqType.POST is present you could use GetPrefs to get the preference value in UI/Callback Route GetFile Returns File Uploaded’s Path as in uploads/file.extension only works in Callback as that’s the place where you could recieve file. Action.SOFT_RELOAD Reloads the Screen without Changing any State or Position of Page. Other Changes :- Remove Old docs/ folder and SKILL.md for AI Agents to utilise NeneUI properly Thanks for reading. love you all 🥰🥰
Devlog (No.24) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere WebSocket Support NeneUI now supports WebSocket Rendering and Execution WebSocket ({ url : " ws://localhost:3500/ws/home " , }) What Can it Do? Show Widgets Over WebSockets Execute Actions Use Cases? ChatBots Live News? Messaging? New Action Action.SEND_SOCKET Uses FormSubmitAction as Parameter with :socket: as the callbackPath New Functions SendWidget(socket, Widget) SendAction(socket, DoAction) Thanks for Reading! Love you all readers >3!
Devlog (No.25) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere New Widget Layouts Layout Layouts and Layout It helps you make an Layout on Screen as show in Screenshot. And It can be arranged via an Handle too, It supports unlimited Layout on Screen as much as space is there. Removed Removed Skeleton Widget from Docs as it was no-longer rendering properly README.md The README.md is now updated with some Images and Decorative Work for looking more nicer and attractive New Action New Action such as ACTION.SET_DISPLAY_INDEX and ACTION.CLOSE_OVERLAY AlertDialog is now documented under FeedBack Section Nene Desktop Runtime Nene Desktop Runtime is half-done and still has some issues, will try to fix it and make it install and run Apps soon! Thanks for reading!! I love you all >3
Devlog (No.26) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere Web - Platform Support Finally, @neneys /ui is now supported on Web (Flutter Web). The Inconsistencies are now managed making @neneys /ui work directly on Web Too. *Limitations on Web * Same as Flutter Web - It’s hard for crawlers to idenitfy content of web pages. I’m trying to fix that issue by double-rendering. Mostly by Setting-up an PHP to Interept the UI into HTML for Crawlers Making SEO work good! README.md Changes FAQ Added into README (Address the Linux Compile Issue in FAQ related to quickjs_engine) More Decorative Elements Github Actions Nene UI Testing Kit finally compiles on all 5 (Windows, Linux, Android, iOS, macOS) successfuly. Linux, macOS - May require libmpv to be installed or available on system path We seem to be very close to first v1 Release with maximum widgets and support. Thanks for Reading!! I love you all 3<.!!!
Devlog (No.27) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere JavascriptEngine JavaScriptEngine({…}) which could control Whether JS should be enabled or not and how much stackSize should be specified. xhr should be enabled or disabled SEO Support for Flutter Web With the Help of PHP to Render Text, Image and some minimal data. PHP can provide basic Page to Crawlers requesting the site. So that SEO could be utilised. However, PHP Version Selection is limited to only allow the recently patched PHP versions for Security Reasons. Github Actions Added Nene Desktop Runtime to be built in Github Actions Bug FIxes @neneys /ui had a Critical Memory and GPU Leak issue which kept the GPU usage at constant high even when not being used and being left Idle. Docs Updates JavaScript Execution and SEO Setup are now documented in the Docs and pub.dev and npmjs packages are now updated NeneUI Testing Kit NeneUI Testing Kit are now available on Web https://kwe26.github.io/neneui/tester However It could only open HTTPS and Cors (*) Apps only and is kind of limited with some JS Execution Issues. The User Interface of Testing Kit is also quite updated. Close to Release NeneUI is now Close to being 1.0.0 Release finally! Within 1-2 devlogs i’ll be shipping soon.!! Thanks for reading! Love you <3!
Devlog (No.28) NeneUI is an Server Side User Interface Rendering Library allowing developers to design user interface purely server-side without worrying about updating the code everywhere README.md README.md has been improved alot with visual designs and details with Links and References Provided too and some Yashiro Nene based Images. Figma File is provided in link. Docs Updates The Home Page of Docs has been updated to look better and provide more information about NeneUI. The Docs Is now extended and now includes more information about implemented Widgets and Link to NeneUI Testing Kit NeneUI Testing Kit The NeneUI Testing Kit has been updated to show examples of @neneys /ui One being an AI Chat Application and other being an random Test with Pokedex, etc. Nene Desktop Runtime While Still Work in Progress, You can now follow the docs to Launch and test the Desktop Runtime. The Desktop Runtime is a standalone application that could embed @neneys /ui in it and Make Desktop Applications with just TypeScript. A Stable Release NeneUI will be released as a stable version 1.0.0 with Pub.dev and NPM Versions available soon as possible and will be kept updated Thanks for your support till 1.0.0 Release! I hope we meet soon! Thanks <3333
Ships:
I made an Server-Side Rendering Library for Flutter, You write the Code in TypeScript and the Flutter Renderer (i named it Daikon) parses it into Native Code, Without WebViews! Completely Native. The Challenges i faced were, how to like index the widgets to be used while JSON becomes parsed and the handling of #ids and most importantly, ForEach Option and the JS Option. I used shadcn_flutter for UI Elements that were rendered, i really like shadcn_flutter’s Design. it’s really cool. I tried to keep it as much as user-friendly as possible, by adding TypeScript Types so VSCode Auto-complete could work. I have also added File Uploads feature with In-Memory Image Display too, if it’s an Image, it is really helpful, even with Server Callbacks and such things Theese are necessary for an production application. And Actions such as TOAST, DIALOG, NAVIGATE, etc. This is the intresting part too!! You can try out the library at https://www.npmjs.com/@neneys/ui for testing it out! While the docs is still not complete, i hope that the documented Widgets could work for your expirment too! I plan to continue this Library even after the program ends!! Love you all! 🥰
@neneys /ui - NeneUI It is an Server-Driven UI Library Which Interpretes TypeScript into an Native Rendered Flutter Widget. Basically, You can write your Entire App in TypeScript and It gets Rendered Into Native Flutter Widgets without WebView. Why? We need Server-Driven UI to ensure that we do not need to update an entire app for a little UI changes or even major overhauls of the App Interface, We could just change it on Server-Side and updated without going through the process of Approval and such. Major Updates After the Previous Ship NeneUI Testing Kit has been buffed with Debug Bar and More Platforms Support for WebSocket Rendering Web Support (along with SEO PHP for Web Crawlers) Memory/GPU Leak issues fixed! Advanced & Improved + Detailed Documentation Decorated README.md Documentation The New Documentation is now written in Docsaurus and hosted in Github Pages at https://kwe26.github.io/neneui/ along with the NeneUI Testing Kit at https://kwe26.github.io/neneui/tester . While it took alot of time documenting each working Widgets but it has now made using @neneys /ui more easier. New Widgets That were Added NeneDisplay and NeneNavbottom - Theese Two Widgets Now help you construct an Bottom Bar with Various Pages as Content that can be now switched from one place to another without reloading the entire page. Layouts and Layout - This allows you to put many Content on Side of Each Other and allow you the drag wheel to drag and arrange the size. WebSocket Widget - It can also render Widgets over WS live real-time making it an really useful feature. Some New Action Callbacks were also added such as SOFTRELOAD that softly reloads the UI without changing the states and maintains the UI. DebugBar The Testing Kit Now includes and Debug Bar to help Developers Reload the UI or check the #id Declarations and Variables Value NeneDesktopRuntime An Desktop Runtime that is WIP but could help replace Electron.js where everything is WebView and sucks alot of ram. But NeneDesktopRuntime can render the Widgets with TypeScript into Native Widgets. Examples There are now examples bundled with NeneUI Testing Kit, One is an AI Chat Application and other is called NeneWorld with Pokedex and Weather API and Country API uses to showcase the Widgets FAQ Page An FAQ Page has been added to ensure the Users dont get stuck somewhere in the library and could get some reference on it Such as the Linux issue with quickjs where the fix is provided. Conclusion There were alot of challenges while making this library with my Laptop dropping to 0.47GHz at random moments and searching the pub.dev docs for shadcn_flutter and upgrading sub-libraries and testing stuff the major headache being the Navigation and Web Support (SEO is done via PHP to show Web Crawlers meangingful HTML to index)....
|
1792961553.299962
|
1793047953.299962
|
|
53406
|
Iris by @Hamna | Stardance
|
Hamna
|
1
|
144.68
|
1521
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-18T22:02:27Z", "hours": 131.0, "multiplier": 13.36, "payout": 1521, "blessing": "neutral", "text": "This is my booking website for wellness (my family hotel). There’s a public site, online checkout, a Reception console and a Management console The most difficult part to stop double bookings btw the website and the front desk,I fixed this by making a hold time of 10 mints on suites I’m really so proud of this project as this was something I was planning to make for my family and it turned out to so amazing and I got to learn so much about security (P.S , This is my last project on Hackclub , I really had the cool experience here, This platform really motivated me to make this project)", "repo": "https://github.com/lilithCode/Iris_ChatBot", "demo": "https://iris-chat-bot-lac.vercel.app/"}]...
|
[{"post_id": 76064, "ts": "202 [{"post_id": 76064, "ts": "2026-10-02T07:21:18Z", "hours": 6.8922, "text": "Changed the UI a bit"}, {"post_id": 73916, "ts": "2026-09-26T09:52:32Z", "hours": 2.9411, "text": "There were some UI erros in the git pages file i made, so this is the last final verison for this project for the demo link: hope you’ll like this : )"}, {"post_id": 71239, "ts": "2026-09-20T14:41:31Z", "hours": 3.8447, "text": "Fixed it today! I replaced ChatInterface in the Space with a gr.Interface that takes the history as a JSON input, so the conversation actually reaches the model now. I also added a history count to the logs so I can see it arriving with every message. This fixes Amadeus too, since they share the same Space. Iris finally remembers what we’re talking about, and that feels like the right place to call this project complete"}, {"post_id": 70295, "ts": "2026-09-18T21:53:46Z", "hours": 4.7014, "text": "Spent today debugging the memory problem. The frontend was sending the chat history and the router was clearly using it, but the model was answering like every message was the first one. I asked “what did I just ask?” and got a totally random reply. Then I checked the Space’s API info and found the problem: Gradio 6’s ChatInterface hides the history from the API, so it was silently throwing the whole conversation away"}, {"post_id": 69607, "ts": "2026-09-17T12:20:33Z", "hours": 5.0708, "text": "Tested the new pipeline today. I asked “who won the last cricket world cup?” and it searched, found the facts and answered “Australia” correctly. Iris knowing current events feels like a huge upgrade. But while chatting normally I noticed something weird: it kept saying “Hai haii” to everything and had no idea what we’d been talking about"}, {"post_id": 69182, "ts": "2026-09-16T15:25:12Z", "hours": 4.86, "text": "Big backend day. I made Iris use the exact same backend as my other project, Amadeus: the same Hugging Face ZeroGPU Space, plus a RAG pipeline. Now a small router model on Hack Club AI rewrites the question, decides whether it needs a web search, and remembers facts about the user. If it needs current info, it searches the web with Exa and passes verified facts to the model. The UI stayed exactly the same"}, {"post_id": 67350, "ts": "2026-09-13T13:00:04Z", "hours": 8.9375, "text": "Tried Modal as another hosting option today, to compare it with ZeroGPU. I switched the route to call a Modal endpoint with an API key. It worked, but managing two setups for two projects (Iris and Amadeus) was getting messy, and I started thinking about putting both on the same backend"}, {"post_id": 66168, "ts": "2026-09-11T20:25:17Z", "hours": 11.0492, "text": "Came back to Iris after a while because responses were way too slow on free CPU hosting. Today I moved the model to Hugging Face ZeroGPU, so it actually runs on a GPU now. I rewrote the backend route to call the Space through the Gradio API, with retries and fallback messages in case something fail"}, {"post_id": 65771, "ts": "2026-09-11T04:17:48Z", "hours": 6.2706, "text": "Final UI touches today. I polished the About modal, updated the project links and rewrote the README with the whole training pipeline. Then I deployed it on Vercel. Iris is officially live and I shared the link with everyone"}, {"post_id": 65244, "ts": "2026-09-10T07:34:11Z", "hours": 8.7197, "text": "Today I connected the frontend to the real Hugging Face backend instead of the placeholder. Seeing Iris reply on my own website, in Senpai’s style, felt unreal. Responses were slow, but it was talking, and I spent way too long just chatting with it"}, {"post_id": 64336, "ts": "2026-09-08T17:12:01Z", "hours": 3.4358, "text": "I replaced the old playlist with songs that match the vibe better and made new covers for each track. Some of the song links broke right after, so I fixed those, and one mp3 was way too big, so I compressed it. Small stuff, but the radio station panel feels complete now"}, {"post_id": 64109, "ts": "2026-09-08T09:37:59Z", "hours": 4.6706, "text": "I didn’t like how the UI looked yesterday, so today I redesigned almost all of it. I went with a soft lavender pastel theme that feels more like Iris, removed the cyber cursor and added a cute Senpai avatar that pops up with little messages. I also made the whole thing responsive so it works on phones too"}, {"post_id": 63712, "ts": "2026-09-07T17:27:59Z", "hours": 9.7992, "text": "Started the frontend today with Next.js and Tailwind. I built the main layout: a chat panel in the middle, a music player on the left, and a side panel on the right. I also added a loading screen and little send/receive sound effects, because a chatbot without sounds feels lifeless. Pushed the first commit with the UI, routing and model connection all together"}, {"post_id": 62439, "ts": "2026-09-05T19:40:06Z", "hours": 11.1208, "text": "Training ran for 1000 steps today and I watched the loss drop from about 2.5 to 0.3. When I tested it, it replied with “Kk” and an eye roll emoji, and that’s literally how Senpai texts. I sent screenshots to my friends and they were all shocked. That was the best moment of the project so far"}, {"post_id": 61489, "ts": "2026-09-04T13:05:44Z", "hours": 22.205, "text": "Set up my Kaggle notebook today with Unsloth and Llama-3 8B as the base model. Most of the day went into fighting configs and memory errors on the T4 x2 GPUs. After a lot of trial and error I settled on a 2048 sequence length and a 5e-5 learning rate. It finally started training without crashing, and I almost cried"}, {"post_id": 59161, "ts": "2026-08-31T19:49:02Z", "hours": 12.4886, "text": "Today I turned the cleaned chats into proper training data. Senpai sends five short messages in a row instead of one long one, so I grouped consecutive messages together to keep that natural texting flow. I ended up with 12,613 dialogue samples. Seeing that number made it feel like a real project for the first time"}, {"post_id": 56717, "ts": "2026-08-28T16:11:34Z", "hours": 7.4811, "text": "Spent the whole day cleaning the WhatsApp export. It was around 81,000 lines of pure chaos: timestamps, “media omitted”, deleted messages, random links. I wrote a script to strip all the junk out and kept only the actual conversations. My eyes hurt, but the data finally looks usable"}, {"post_id": 54957, "ts": "2026-08-26T12:02:23Z", "hours": 9.8514, "text": "Today I finally started something I’d been thinking about for a while. Every AI chatbot I’ve used feels so polite and robotic, like it has zero aura. So I decided to make one that talks like a real person, specifically my friend “Senpai”. I exported our WhatsApp chats and just stared at them for a bit, wondering what I’d gotten myself into"}]...
|
Title: Iris by @Hamna | Stardance
Devlogs:
Today Title: Iris by @Hamna | Stardance
Devlogs:
Today I finally started something I’d been thinking about for a while. Every AI chatbot I’ve used feels so polite and robotic, like it has zero aura. So I decided to make one that talks like a real person, specifically my friend “Senpai”. I exported our WhatsApp chats and just stared at them for a bit, wondering what I’d gotten myself into
Spent the whole day cleaning the WhatsApp export. It was around 81,000 lines of pure chaos: timestamps, “media omitted”, deleted messages, random links. I wrote a script to strip all the junk out and kept only the actual conversations. My eyes hurt, but the data finally looks usable
Today I turned the cleaned chats into proper training data. Senpai sends five short messages in a row instead of one long one, so I grouped consecutive messages together to keep that natural texting flow. I ended up with 12,613 dialogue samples. Seeing that number made it feel like a real project for the first time
Set up my Kaggle notebook today with Unsloth and Llama-3 8B as the base model. Most of the day went into fighting configs and memory errors on the T4 x2 GPUs. After a lot of trial and error I settled on a 2048 sequence length and a 5e-5 learning rate. It finally started training without crashing, and I almost cried
Training ran for 1000 steps today and I watched the loss drop from about 2.5 to 0.3. When I tested it, it replied with “Kk” and an eye roll emoji, and that’s literally how Senpai texts. I sent screenshots to my friends and they were all shocked. That was the best moment of the project so far
Started the frontend today with Next.js and Tailwind. I built the main layout: a chat panel in the middle, a music player on the left, and a side panel on the right. I also added a loading screen and little send/receive sound effects, because a chatbot without sounds feels lifeless. Pushed the first commit with the UI, routing and model connection all together
I didn’t like how the UI looked yesterday, so today I redesigned almost all of it. I went with a soft lavender pastel theme that feels more like Iris, removed the cyber cursor and added a cute Senpai avatar that pops up with little messages. I also made the whole thing responsive so it works on phones too
I replaced the old playlist with songs that match the vibe better and made new covers for each track. Some of the song links broke right after, so I fixed those, and one mp3 was way too big, so I compressed it. Small stuff, but the radio station panel feels complete now
Today I connected the frontend to the real Hugging Face backend instead of the placeholder. Seeing Iris reply on my own website, in Senpai’s style, felt unreal. Responses were slow, but it was talking, and I spent way too long just chatting with it
Final UI touches today. I polished the About modal, updated the project links and rewrote the README with the whole training pipeline. Then I deployed it on Vercel. Iris is officially live and I shared the link with everyone
Came back to Iris after a while because responses were way too slow on free CPU hosting. Today I moved the model to Hugging Face ZeroGPU, so it actually runs on a GPU now. I rewrote the backend route to call the Space through the Gradio API, with retries and fallback messages in case something fail
Tried Modal as another hosting option today, to compare it with ZeroGPU. I switched the route to call a Modal endpoint with an API key. It worked, but managing two setups for two projects (Iris and Amadeus) was getting messy, and I started thinking about putting both on the same backend
Big backend day. I made Iris use the exact same backend as my other project, Amadeus: the same Hugging Face ZeroGPU Space, plus a RAG pipeline. Now a small router model on Hack Club AI rewrites the question, decides whether it needs a web search, and remembers facts about the user. If it needs current info, it searches the web with Exa and passes verified facts to the model. The UI stayed exactly the same
Tested the new pipeline today. I asked “who won the last cricket world cup?” and it searched, found the facts and answered “Australia” correctly. Iris knowing current events feels like a huge upgrade. But while chatting normally I noticed something weird: it kept saying “Hai haii” to everything and had no idea what we’d been talking about
Spent today debugging the memory problem. The frontend was sending the chat history and the router was clearly using it, but the model was answering like every message was the first one. I asked “what did I just ask?” and got a totally random reply. Then I checked the Space’s API info and found the problem: Gradio 6’s ChatInterface hides the history from the API, so it was silently throwing the whole conversation away
Fixed it today! I replaced ChatInterface in the Space with a gr.Interface that takes the history as a JSON input, so the conversation actually reaches the model now. I also added a history count to the logs so I can see it arriving with every message. This fixes Amadeus too, since they share the same Space. Iris finally remembers what we’re talking about, and that feels like the right place to call this project complete
There were some UI erros in the git pages file i made, so this is the last final verison for this project for the demo link: hope you’ll like this : )
Changed the UI a bit
Ships:
This is my booking website for wellness (my family hotel). There’s a public site, online checkout, a Reception console and a Management console The most difficult part to stop double bookings btw the website and the front desk,I fixed this by making a hold time of 10 mints on suites I’m really so proud of this project as this was something I was planning to make for my family and it turned out to so amazing and I got to learn so much about security (P.S , This is my last project on Hackclub , I really had the cool experience here, This platform really motivated me to make this project)...
|
1792856876.8815353
|
1792943276.8815353
|
|
9316
|
OMNI-Chess by @thestarviper | Stardance
|
thestarviper
|
2
|
102.0
|
1511
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T01:14:49Z", "hours": 63.0, "multiplier": 17.79, "payout": 873, "blessing": "neutral", "text": "I made a chess engine in raylib with puzzle functionality and a movelog with a nature theme. Migrating from pygame to raylib was a big challenge that took me a while to fix all the kinks. idk the leaves are hoverable for a cool fidget thing and have fun!", "repo": "https://github.com/TheStarViper/chess-eng", "demo": "https://thestarviper.itch.io/chess-engine"}, {"ship_num": 2, "ts": "2026-06-15T03:47:41Z", "hours": 39.0, "multiplier": 16.63, "payout": 638, "blessing": "neutral", "text": "I made a chess game where you locally 1v1 someone with a move log to see move history and all the special rules/draw conditions like 50 move rule, 3 fold, insufficient material, castling, enpessent. It was challenging doing the historical move rendering because you have to keep track of all the previous board positions and the checks and square highlights Im proud of the move log because its cool yall should know that it’s low res cuz it’s not that efficient and uses pygame and am working on a re-release utilizing raylib for more proformance", "repo": "https://github.com/TheStarViper/chess-eng", "demo": "https://thestarviper.itch.io/chess-engine"}]...
|
[{"post_id": 20435, "ts": "202 [{"post_id": 20435, "ts": "2026-07-02T00:59:11Z", "hours": 4.7919, "text": "UPDATE #13 This is the last update before i ship So basically this was just the last update for this project cuz i decided i would start work on a different project, the changes i made this update are just to get ready to ship and complete the project: removed fps counter removed openings and play menu removed variants from selection as they arent polished enough removed misc debug features audio bug fixed on button hovers audio bug fixed on puzzle win"}, {"post_id": 17944, "ts": "2026-06-28T22:04:11Z", "hours": 17.1667, "text": "UPDATE #12 added features added variants support added giveaway chess added duckchess (kinda) added the start of a play screen, still working on it not much yet added easing functions to some visuals so they appear instead of popping in fixed bugs/cleanup (like 50% of this devlog) split code back into multiple files fixed that puzzle code was directly in frame update loop tons of crash fixes todo with variants and puzzles animation broke on variants draw legal moves didn’t work on custom pieces future ideas clock bots particle system effects screen shake randomize leaves menu transitions i was mainly struggling to fix crash bugs this devlog as there were multiple that i had to fix, most notably there was a crash bug when swapping between the game and puzzle menus, and loading a new ruleset for variants. My current plan now is to finish the create game screen, then work on fixing the last duckchess bugs, programming a bot then variants + polish. I may ship again if i get a chance before i finish this though. Screenshot here shots duckchess in action but I made the duck sprite using AI just so we’re clear about that because i am bad at art."}, {"post_id": 15352, "ts": "2026-06-24T23:25:28Z", "hours": 9.0172, "text": "Update #11 Added Features added puzzle side menu added puzzle streak counter skip retry hint puzzle buttons sucess rate puzzle counter sound effect for hovering button puzzles are basically done Fixed Bugs 3 fold occured in puzzle mode if you made the same wrong move 3 times same thing with 50 move rule as 3 fold puzzle would start with you instead of the computer swaps turn on failed move animations didn’t work in puzzles fixed you can select the opponent’s pieces in the puzzle during animation if you hit a frameperfect from the animation finishing on the puzzle screen and switch to the game screen it moves the piece in the game screen if there was a piece on the starting tile same bug with next puzzle button leaves sfx looped infinitely Smart Bool I added a new datatype to make my life easier called a smartbool, this is basically a boolean with a third state called NewTrue which is only true for the first cycle the boolean is updated to true. This boolean is useful for when you want to play a sound effect on hover but if you use a traditional boolean it will play every frame. you can use it like a normal boolean too like smartbool = true; or if (smartbool){} . But this new datatype makes the code easier to understand for me. struct smartbool { enum State { False, NewTrue, True }; State state = False; void operator=(bool value) {this->set(value);} operator bool() const {return state != False; } bool is_new_true() const { return state == NewTrue; } void set(bool value) { if (value) { if (state == False) state = NewTrue; } else { state = False; } } void update() { if (state == NewTrue) { state = True; } } }; Future Ideas clock bots variants more moving graphics/sfx randomize leaves on borders menu transitions (maybe) finish polishing puzzles (pretty much done)"}, {"post_id": 13961, "ts": "2026-06-22T22:21:46Z", "hours": 16.5194, "text": "UPDATE #10 added features/changes added a sidebar added a settings page with the ability to toggle 50 move counter,3 fold counter,board markings with more settings to come like high contrast and animation speed added a makefile to compile code to test instead of running a bunch of commands back to back added puzzles to the puzzle tab pulls random puzzle out of a csv things before next ship more sfx click and drag to move piece sfx plays infinitely on hovers randomize leaves placements menu transitions polish puzzles page and get rid of bugs general ideas theme switcher animation speed control move clock In this update i messed up my codebase so massively bad trying to refactor the code so alot of my time was fixing the nuke i dropped into my codebase. uhhh one of the big bugs i had to squash before this that took eternity was playing sound effects would just crash the game. It turned out the reason was i didnt add the compile flag to my makefile causing the audio mixer to crash the game. After that i added sound effects back in and then started to work on puzzles. for puzzles i took the lichess puzzle database of 6m puzzles and condensed it down to 100k for file space. I pull a random row from this file to create the puzzle and it kinda works but its still in progress."}, {"post_id": 11768, "ts": "2026-06-19T04:42:16Z", "hours": 7.4614, "text": "UPDATE #9 I presented my changes in the stardance slack and was able to get some new ideas like adding a theme switcher. I added the leaves cuz i thought it would add to the theme and then after seeing the leaves, they looked very interactable so i made them interactable. idk thats about it changes/added features leaves on outside of board leaves enlarge on hover for fidgeting i guess idk its fun tho made move log more narrow to fit a sidebar on the left added a 3 fold repetition warning that appears after 2x repetition (make togglable) added a background i got from itchio made hover dots enlarge on hover again fixed animation issues changed board markers to inside the board like originally in python updated itchio page things before next ship add sound effects back click and drag to move piece add sidebar"}, {"post_id": 10951, "ts": "2026-06-17T23:23:52Z", "hours": 7.9317, "text": "UPDATE #8 This version is not live yet as there are a few bugs that need fixing still as the port from python introduced alot. Some things i liked about porting from python to c++ is that i was able to fine tune things more and use namespaces which i like. ENUMs are also a feature i like. changes/added features Updated graphics to use pieces from itchio 50 move rule counter under game log (i plan to make it togglable) says whos turn it is to play in top right ontop of the highlighting changed entire game to pixelart because i found some assets on itchio that i thought looked really nice things needed for next ship going to add a sidebar on the left side instead of the right side add sound effects back add a background click and drag to move piece animation issues fold repetition counter under move log make itchio page look better next devlog should be when i update the itchio page and other stuff also i spent closer to 15-16 hours on this cuz it includes the last devlog"}, {"post_id": 9054, "ts": "2026-06-15T03:36:13Z", "hours": 8.3464, "text": "UPDATE #7 i wanna have the time logged for shipping but basically all i did was change some file formats for web assembly and turned down the resolution so that it would automatically scale so that it’s playable. I’m currently in the process of converting the game from pygame to c++ raylib since i know c++ already and c++ is better for WASM thats about ittttttttt live ver: https://thestarviper.itch.io/chess-engine"}, {"post_id": 7870, "ts": "2026-06-13T03:53:24Z", "hours": 8.3592, "text": "UPDATE #6 fixed bugs: all game end conditions were broken move log scrollbar didn’t appear on pawn promotion move log didnt use proper notation canceling pawn promotion didnt undo move log canceling pawn promotion capture didnt undo capture when going back in move log, if there was a check the square didnt light red couldn’t change piece to move after selecting a piece added features/changes: promotion menu is inline column added sfx better sprites for pieces draw and resign buttons now use icons move log text now uses the Audiowide regular fond massive code restructure things needed for shipping: optimization, didn’t optimize since last devlog maybe learn WHAT DA HAIL bitboards are to optimize yk click and drag to move piece pieces flicker for a frame when transitioning from animation to static on the board"}, {"post_id": 6680, "ts": "2026-06-11T05:52:38Z", "hours": 3.0944, "text": "UPDATE #5 fixed bugs: checkmate didnt work (again) when king is in check the square didnt light red move log overflowed when filling up so i added a scroll feature added features/changes: promotion gui is now like chess.com and vertical move log is striped and alternates colors for each row board markings for the rows and columns things needed before shipping: optimization, still runs at like 45fps on itch.io sound effects maybe change fonts cuz im using default ugly ones draw/resign icons instead of text click and drag to move piece better sprites for pieces (BUG) can’t move a different piece after selecting one (BUG) draw conditions are broken (BUG) sidebar buttons are broken even though they dont do anything (BUG) when looking back in the move log when the king is in check the square stays red"}, {"post_id": 6058, "ts": "2026-06-10T05:41:11Z", "hours": 5.0128, "text": "UPDATE #4 I fixed preformance :D heres how: i drew the move log table 3x per frame instead of once so i made it do it once now was calculating if someone was in checkmate every frame which was checking if anyone had legal moves every single frame, changed it to check for checkmate on clicks which is every time someone made a move some of the stuff we were rendering were static background elements that never changed and they were being drawn every frame. So instead we render them once at the start and cache it so that we don’t render static elements so many times. (i accidentally changed the opacity of the background and dont feel like retaking the screenshot and accidentally moved the sidebar) FPS my machine 30-40 -> 200+ FPS itch.io 10 -> 45 we still have a ways to go to get a fully smooth experience but 10 to 45 fps from the demo link is much much more playable and i thought i would get a devlog out. next update ill continue to optimize and polish to get ready to ship!"}, {"post_id": 5727, "ts": "2026-06-09T17:02:19Z", "hours": 3.425, "text": "UPDATE #3 things added in this update: added a subtle background added a sidebar added “Game Log” text moved board and bar to the right a bit added a GitHub readme rounded corners of chess board and other stuff Issues: I started to notice the rendering of my chess pieces moving were slightly lagging, after doing a performance test of my code using python’s profile tool i noticed that my logic for getting legal moves was called 160k+ times and my pieces were rendered 50k+ times. This made my chess engine run at 30-50 fps so i will have to fix the performance issues soon. Next update will prolly be addressing these issues and adding more UI changes"}, {"post_id": 5349, "ts": "2026-06-09T02:49:21Z", "hours": 2.9911, "text": "UPDATE #2 things added in this update: created an itch.io page to demo the game by compiled the PYgame with pygbag added a move log with the ability to look back in time legal move dots now enlarge on hover i plan on actually making the itch.io page look good and actually add a readme to my github repo that looks good but i plan on doing that later. next update i think will be gui changes then after that i will work on QOL changes then feature additions like variants Fully functional game though and i did work on my laptop without wakatime so sad it wasnt tracked :c"}, {"post_id": 4605, "ts": "2026-06-07T23:34:09Z", "hours": 7.4347, "text": "UPDATE #1 I have created using pygame a chess engine complete with all of the rules of chess and is fully playable for local 1v1 with the features: on piece hover, piece tilts a bit piece moves to next square instead of teleporting checkmate resign and draw buttons stalemate 3 fold repetition 50 move rule en pessant castling captured pieces are shown on the side that captured them captured piece zone is aligned to board pawn promotion FUTURE IDEAS: SFX Better GUI on loss/draw screens Better GUI for promotion Main menu variants (atomic,duckchess,giveaway chess, Horde, etc) time control bots (pinging chess.com api idk how to code a chess bot from scratch) color change of boards better graphics for pieces move log when hovering on dot of the move you want to make the dot becomes bigge pull and drag pieces around board to make moves like chess.com"}]...
|
Title: OMNI-Chess by @thestarviper | Stardance
De Title: OMNI-Chess by @thestarviper | Stardance
Devlogs:
UPDATE #1 I have created using pygame a chess engine complete with all of the rules of chess and is fully playable for local 1v1 with the features: on piece hover, piece tilts a bit piece moves to next square instead of teleporting checkmate resign and draw buttons stalemate 3 fold repetition 50 move rule en pessant castling captured pieces are shown on the side that captured them captured piece zone is aligned to board pawn promotion FUTURE IDEAS: SFX Better GUI on loss/draw screens Better GUI for promotion Main menu variants (atomic,duckchess,giveaway chess, Horde, etc) time control bots (pinging chess.com api idk how to code a chess bot from scratch) color change of boards better graphics for pieces move log when hovering on dot of the move you want to make the dot becomes bigge pull and drag pieces around board to make moves like chess.com
UPDATE #2 things added in this update: created an itch.io page to demo the game by compiled the PYgame with pygbag added a move log with the ability to look back in time legal move dots now enlarge on hover i plan on actually making the itch.io page look good and actually add a readme to my github repo that looks good but i plan on doing that later. next update i think will be gui changes then after that i will work on QOL changes then feature additions like variants Fully functional game though and i did work on my laptop without wakatime so sad it wasnt tracked :c
UPDATE #3 things added in this update: added a subtle background added a sidebar added “Game Log” text moved board and bar to the right a bit added a GitHub readme rounded corners of chess board and other stuff Issues: I started to notice the rendering of my chess pieces moving were slightly lagging, after doing a performance test of my code using python’s profile tool i noticed that my logic for getting legal moves was called 160k+ times and my pieces were rendered 50k+ times. This made my chess engine run at 30-50 fps so i will have to fix the performance issues soon. Next update will prolly be addressing these issues and adding more UI changes
UPDATE #4 I fixed preformance :D heres how: i drew the move log table 3x per frame instead of once so i made it do it once now was calculating if someone was in checkmate every frame which was checking if anyone had legal moves every single frame, changed it to check for checkmate on clicks which is every time someone made a move some of the stuff we were rendering were static background elements that never changed and they were being drawn every frame. So instead we render them once at the start and cache it so that we don’t render static elements so many times. (i accidentally changed the opacity of the background and dont feel like retaking the screenshot and accidentally moved the sidebar) FPS my machine 30-40 -> 200+ FPS itch.io 10 -> 45 we still have a ways to go to get a fully smooth experience but 10 to 45 fps from the demo link is much much more playable and i thought i would get a devlog out. next update ill continue to optimize and polish to get ready to ship!
UPDATE #5 fixed bugs: checkmate didnt work (again) when king is in check the square didnt light red move log overflowed when filling up so i added a scroll feature added features/changes: promotion gui is now like chess.com and vertical move log is striped and alternates colors for each row board markings for the rows and columns things needed before shipping: optimization, still runs at like 45fps on itch.io sound effects maybe change fonts cuz im using default ugly ones draw/resign icons instead of text click and drag to move piece better sprites for pieces (BUG) can’t move a different piece after selecting one (BUG) draw conditions are broken (BUG) sidebar buttons are broken even though they dont do anything (BUG) when looking back in the move log when the king is in check the square stays red
UPDATE #6 fixed bugs: all game end conditions were broken move log scrollbar didn’t appear on pawn promotion move log didnt use proper notation canceling pawn promotion didnt undo move log canceling pawn promotion capture didnt undo capture when going back in move log, if there was a check the square didnt light red couldn’t change piece to move after selecting a piece added features/changes: promotion menu is inline column added sfx better sprites for pieces draw and resign buttons now use icons move log text now uses the Audiowide regular fond massive code restructure things needed for shipping: optimization, didn’t optimize since last devlog maybe learn WHAT DA HAIL bitboards are to optimize yk click and drag to move piece pieces flicker for a frame when transitioning from animation to static on the board
UPDATE #7 i wanna have the time logged for shipping but basically all i did was change some file formats for web assembly and turned down the resolution so that it would automatically scale so that it’s playable. I’m currently in the process of converting the game from pygame to c++ raylib since i know c++ already and c++ is better for WASM thats about ittttttttt live ver: https://thestarviper.itch.io/chess-engine
UPDATE #8 This version is not live yet as there are a few bugs that need fixing still as the port from python introduced alot. Some things i liked about porting from python to c++ is that i was able to fine tune things more and use namespaces which i like. ENUMs are also a feature i like. changes/added features Updated graphics to use pieces from itchio 50 move rule counter under game log (i plan to make it togglable) says whos turn it is to play in top right ontop of the highlighting changed entire game to pixelart because i found some assets on itchio that i thought looked really nice things needed for next ship going to add a sidebar on the left side instead of the right side add sound effects back add a background click and drag to move piece animation issues fold repetition counter under move log make itchio page look better next devlog should be when i update the itchio page and other stuff also i spent closer to 15-16 hours on this cuz it includes the last devlog
UPDATE #9 I presented my changes in the stardance slack and was able to get some new ideas like adding a theme switcher. I added the leaves cuz i thought it would add to the theme and then after seeing the leaves, they looked very interactable so i made them interactable. idk thats about it changes/added features leaves on outside of board leaves enlarge on hover for fidgeting i guess idk its fun tho made move log more narrow to fit a sidebar on the left added a 3 fold repetition warning that appears after 2x repetition (make togglable) added a background i got from itchio made hover dots enlarge on hover again fixed animation issues changed board markers to inside the board like originally in python updated itchio page things before next ship add sound effects back click and drag to move piece add sidebar
UPDATE #10 added features/changes added a sidebar added a settings page with the ability to toggle 50 move counter,3 fold counter,board markings with more settings to come like high contrast and animation speed added a makefile to compile code to test instead of running a bunch of commands back to back added puzzles to the puzzle tab pulls random puzzle out of a csv things before next ship more sfx click and drag to move piece sfx plays infinitely on hovers randomize leaves placements menu transitions polish puzzles page and get rid of bugs general ideas theme switcher animation speed control move clock In this update i messed up my codebase so massively bad trying to refactor the code so alot of my time was fixing the nuke i dropped into my codebase. uhhh one of the big bugs i had to squash before this that took eternity was playing sound effects would just crash the game. It turned out the reason was i didnt add the compile flag to my makefile causing the audio mixer to crash the game. After that i added sound effects back in and then started to work on puzzles. for puzzles i took the lichess puzzle database of 6m puzzles and condensed it down to 100k for file space. I pull a random row from this file to create the puzzle and it kinda works but its still in progress.
Update #11 Added Features added puzzle side menu added puzzle streak counter skip retry hint puzzle buttons sucess rate puzzle counter sound effect for hovering button puzzles are basically done Fixed Bugs 3 fold occured in puzzle mode if you made the same wrong move 3 times same thing with 50 move rule as 3 fold puzzle would start with you instead of the computer swaps turn on failed move animations didn’t work in puzzles fixed you can select the opponent’s pieces in the puzzle during animation if you hit a frameperfect from the animation finishing on the puzzle screen and switch to the game screen it moves the piece in the game screen if there was a piece on the starting tile same bug with next puzzle button leaves sfx looped infinitely Smart Bool I added a new datatype to make my life easier called a smartbool, this is basically a boolean with a third state called NewTrue which is only true for the first cycle the boolean is updated to true. This boolean is useful for when you want to play a sound effect on hover but if you use a traditional boolean it will play every frame. you can use it like a normal boolean too like smartbool = true; or if (smartbool){} . But this new datatype makes the code easier to understand for me. struct smartbool { enum State { False, NewTrue, True }; State state = False; void operator=(bool value) {this->set(value);} operator bool() const {return state != False; } bool is_new_true() const { return state == NewTrue; } void set(bool value) { if (value) { if (state == False) state = NewTrue; } else { state = False; } } void update() { if (state == NewTrue) { state = True; } } }; Future Ideas clock bots variants more moving graphics/sfx randomize leaves on borders menu transitions (maybe) finish polishing puzzles (pretty much done)
UPDATE #12 added features added variants support added giveaway chess added duckchess (kinda) added the start of a play screen, still working on it not much yet added easing functions to some visuals so they appear instead of popping in fixed bugs/cleanup (like 50% of this devlog) split code back into multiple files fixed that puzzle code was directly in frame update loop tons of crash fixes todo with variants and puzzles animation broke on variants draw legal moves didn’t work on custom pieces future ideas clock bots particle system effects screen shake randomize leaves menu transitions i was mainly struggling to fix crash bugs this devlog as there were multiple that i had to fix, most notably there was a crash bug when swapping between the game and puzzle menus, and loading a new ruleset for variants. My current plan now is to finish the create game screen, then work on fixing the last duckchess bugs, programming a bot then variants + polish. I may ship again if i get a chance before i finish this though. Screenshot here shots duckchess in action but I made the duck sprite using AI just so we’re clear about that because i am bad at art.
UPDATE #13 This is the last update before i ship So basically this was just the last update for this project cuz i decided i would start work on a different project, the changes i made this update are just to get ready to ship and complete the project: removed fps counter removed openings and play menu removed variants from selection as they arent polished enough removed misc debug features audio bug fixed on button hovers audio bug fixed on puzzle win
Ships:
I made a chess game where you locally 1v1 someone with a move log to see move history and all the special rules/draw conditions like 50 move rule, 3 fold, insufficient material, castling, enpessent. It was challenging doing the historical move rendering because you have to keep track of all the previous board positions and the checks and square highlights Im proud of the move log because its cool yall should know that it’s low res cuz it’s not that efficient and uses pygame and am working on a re-release utilizing raylib for more proformance
I made a chess engine in raylib with puzzle functionality and a movelog with a nature theme. Migrating from pygame to raylib was a big challenge that took me a while to fix all the kinks. idk the leaves are hoverable for a cool fidget thing and have fun!...
|
1792983320.135912
|
1793069720.135912
|
|
7968
|
Chess Now! by @AngelCMHxD | Stardance
|
AngelCMHxD
|
1
|
140.11
|
1509
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-30T15:00:21Z", "hours": 137.0, "multiplier": 18.82, "payout": 1509, "blessing": "neutral", "text": "This is Chess Now! A real-time chess API with challenges handling, matches, friends, and much more! The idea is for anyone to be able to make a custom client, bot or integration with the platform, thus it’s as open as it can possibly be while trying to also stay secure. One of the biggest parts of the proyect was doing that many clients, especially the TUI client. While I learned Vue doing the TUI client, I found it’s behaviour kinda… unintuitive in some way I can’t really explain. Though at the end I felt that Vue is better than React by a mile (now I only have to try out Svelte) I am proud of how well structured the API is, and while I’m sure it can be improved, the bases feel pretty solid. I’m also proud of how much I learned doing this. I mean, I tried a lot of things I’ve been meaning to try for some time already: Vue, Better Auth, Drizzle ORM, actually deploying a Next.js app, React mail + Resend, Elysia, and Fumadocs. And probably something else I already forgot about hehe Would I do something different if I started right now? Probably, but mostly just to try out even more things, which is the main reason why I do most of my projects. If you want to try out the project, you should probably just check the instance hosted at https://chessnow.angelcmh.com/ , create an account and play against a bot. You should also check out the docs, or the npm package over at https://www.npmjs.com/package/@chess-now/api if you are interested. Thanks for reading till the end, have a great day! ;P", "repo": "https://github.com/AngelCMHxD/chess-now", "demo": "https://chessnow.angelcmh.com/"}]...
|
[{"post_id": 62578, "ts": "202 [{"post_id": 62578, "ts": "2026-09-06T01:20:34Z", "hours": 3.1125, "text": "aaaa, so… long time no see! also, super star!!! So, I’ve began doing some things that I’ve meant to do before, but completely forgot as I got quite busy… lol I fixed an error which made the TUI not work on Linux, it works now! It was an issue as I was building on NixOS, and the linker path was on my /nix/store folder instead of the usual /lib one. that means it also broke for me after an update lol You can now configure challenges! This needed to be implemented on all clients, hence why it took a little while lol Select whether you want to start with white, black or random. The opponent will be able to see which color you selected before accepting the challenge though! :P Also, meet unrankeds! You can now also mark a match as unranked so it doesn’t affect your ELO ratings at all . Take into account that there is decay though! so if you don’t play ranked for a while, your next match ELO diffs might be a little bit different Fun fact: The starting color option has been available on the API for a while already, even documented. so, if you did API calls directly, you could have selected a starting color and the opponent would not have been able to notice! as none of the clients showed it. except for the Discord bot… I think… or if you requested the match through the API too ;D"}, {"post_id": 37641, "ts": "2026-07-30T14:59:49Z", "hours": 0.8269, "text": "Hewo! This devlog was unexpected. I prepared a small video/trailer so I had something to upload when shipping the project, and when I tried to upload it I realized that you can only upload images when shipping a project :/ So here is that video as it won’t go to waste. I tried my best, hope my voice doesn’t sound awkward, I’m not a native speaker Also, check out the shipped project! As I probably shipped it right after this devlog"}, {"post_id": 37305, "ts": "2026-07-29T22:23:23Z", "hours": 3.36, "text": "Well, I set up the domain + reverse proxy and all kind of problems arose. I changed the package so you only need to instantiate the class without any arguments to use the default server over at https://chessnow.angelcmh.com though you can still pass an optional baseUrl in case you selfhost your own instance at first nothing worked, but then i noticed that I had a port conflict on my VPS with two things trying to use the same port lol i also tried to improve SEO on the main page as much as I could, though im not an expert on that. i also added an official bots section so you can challenge some bots without having to look at any docs to find them shipping in some minutes!"}, {"post_id": 36858, "ts": "2026-07-29T05:39:21Z", "hours": 6.6392, "text": "Hewo! Last devlog till ship here (i think) I didn’t think I’d add anything else, but you can now forfeit matches or ask the opponent for a draw! They just seemed like something that should exist on the shipped project… Each player can request only one draw per match, so you think before you do it. why did i do it like that? well, asking for a draw pauses the whole match, an neither player can do any moves until the draw request is answered. in order to prevent one of the users spamming draws, i simply limited to only one per match. also, ending the match in a draw doesn’t mean that your ELO isn’t affected, it is affected. depending on the elo of your opponent, you’ll lose/earn elo on a draw, just as you’d do on a stalemate. I also added a piece promotion selector. i forgot i made it so it always chose the queen by default, but in some matches that might not be wanted, so now you get a popup to select the piece you want to promote to well, i don’t really know if i’m missing any other things, as that was all that was i had on my TODO list, so i guess i’ll start setting up the prod environment below is a video showing the forfeit and draw flows, along with the promotion popup. don’t worry about the first match being a valid checkmate but the match continued being active, i already fixed that bug but it didn’t apply to already affected matches :P i also sped up (is that the correct way to say it?) and cutted out some parts of the video to prevent it from being 6 minutes of me playing the match lol"}, {"post_id": 34658, "ts": "2026-07-25T15:44:56Z", "hours": 9.5286, "text": "Well, that took way longer than expected. The docs are way more polished now! All endpoints have example responses so you know exactly what each one will return, along with a small description. HTTP endpoints that trigger a WebSocket event for any user (like friend requests, challenges, match moves, etc), mention it on their descriptions. I also added some headers to the PGN strings, as they were previously filled with “?“s. This mostly took this long due to a LOT of issues with the account deletion process, but it works perfectly now. When you delete your account, your user is replaced in all the matches you’ve played to @deleted_user . This is to keep the match data available even after any user deletes it. After that, your account is deleted from the DB. Due to how the DB is configured with cascade deletes, that will delete all other rows that reference the user (friendships, friend requests, pending challenges, etc.) except for matches, as they no longer reference the user that is being deleted. I’m am quite close to the ship, which I’m kinda nervous about. I want the project to be in the best state and as polished as possible, without any bugs (well, any known bugs lol). Which is mostly the reason this project as a whole has taken soo long :/ Below is a small video showing the docs with the example data. At the end is the delete account flow, which have lot’s of confirmations as it currently doesn’t send an email. I’m thinking it probably should send one lol See you in the next (and probably last) devlog! (I fixed my OBS settings, the video should look a bit better than the previous ones :P)"}, {"post_id": 33878, "ts": "2026-07-24T04:38:40Z", "hours": 5.6958, "text": "ELO system! let’s go!! At the end, I did add an ELO system. Well, it’s not really ELO, it’s Glicko . I used the glicko2-lite library, which is stateless unlike other glicko implementations I found. I wanted a stateless one because I’m saving the data on the DB anyways, so making it stateful would only make it use more resources (primarly RAM). You start with a rating of 1500. After every match your rating will go up/down depending on whether you win or lose. How much you win or lose depends on how many matches you have played (the first one are worth a bit more to get you to the optimal points), and depending on the rating of your oponent. If you win against someone with a bigger rating than yours, you’ll gain way more points than if you win agains someone around your rating or less. I also added a settings page so you can change your name and username, along with a page to change your password. Below is a small video showing how the ELO Glicko system works: What remains is just to also add the name/username change for bots and improve the docs. I also made a Stockfish bot which you can try to play against. (Keyword: try , because it’s probably almost impossible)"}, {"post_id": 33281, "ts": "2026-07-23T02:11:49Z", "hours": 2.855, "text": "User page done! You can now see all of the matches and friends of other people, along with a small list of stats. I’m thinking about implementing the ELO system. While I previously said that I wouldn’t be able to moderate people artificially inflating it (by selfbotting), having it without a leaderboard wouldn’t really make it that enticing to abuse. And personally, if there isn’t a leaderboard, I don’t think moderating it would be that important, what would the user gain more than having a bigger number on their profile? Still thinking about it though I’m not sure about adding custom profile pictures or really any other user generated content. It would be nice to have, but it also involves moderation in order to prevent anything inappropriate from being uploaded (i mean, we all know how the internet works :/) Below is a small video showing the user page, along with the bot auto accepting any new friend requests :P"}, {"post_id": 32786, "ts": "2026-07-22T05:22:14Z", "hours": 6.9678, "text": "Well, the web client is done!! I used react-chessboard and it’s a pretty good library. I didn’t add click-to-move pieces as it makes the logic a LOT more complex, so I didn’t want to do it for now I also used the API package from before, so we can use the websocket connection and listen for any changes. I also added it onto the matches page so any updates on the boards are reflected in real-time (which would probably look amazing if you have multiple automated matches running lol), and any new matches are added to the list without needing to refresh the page. I also want to add it onto the friends page, so it also updates in real-time I had to change the icons on the discord bot as I realized they were Chess.com’s icons, and they aren’t free to use, so I removed them and replaced them with a pack named Caliente , which look amazing. It’s the same one I use on the web client I think I should add a popup once the match is over as the current result feels quite plain. I also gotta add another page where you can spectate the match of other people, as the current one has too many logic already I prefer to duplicate it and remove the need of handling input and what not. I also haven’t added a profiles page yet, so that’s still on the TODO list hahah Below is a small video of me playing a match against a bot. Two disclaimers: I used AI to fix some issues I had with the CSS on the page, though it didn’t change anything other than fix some class names, and the whole logic was made by me. I played horribly against the bot, as the difficulty is set quite low lol Additional disclaimer: Ignore the -55s duration on one of the matches, it was an old bug but I’ve gotten lazy and haven’t fixed the match on the DB yet .-."}, {"post_id": 32426, "ts": "2026-07-21T16:34:43Z", "hours": 0.685, "text": "The TUI is 100% done! (I think…) There is no longer any mock data and it works with the actual API. You can send and receive challenges and friend requests, and you can see/play your running matches. I think that, for the account management, I’ll remove email signups and only allow social OAuth2 (currently Google and Discord). As with email/password signups I need to handle email verification and password reset, and while Resend (what I use right now) is REALLY good and it’s free tier is great (3000 mails a month, 100 daily), if someone tries to spam the endpoints, it’s gonna eat up the limit. Though I might just put a rate limiter in place, and with Cloudflare Turnstile I already combat at least some botting, still thinking about it… I’ll probably start with the web client for now, which might be the last thing to do Below is a little video showing the TUI in action, while playing a match: (I took quite a bit of time thinking about the move I should make till I remembered I was just recording a test video lol)"}, {"post_id": 32210, "ts": "2026-07-21T07:10:56Z", "hours": 0.5875, "text": "And… This devlog is just to show the web dashboard, which I have forgotten to do a devlog for it all this time, which is why the logged time is so low lol I used the Next.js framework to build the web dashboard (well, the whole dashboard + welcome page and just the whole web thing). I also used the shadcn/ui components library, as I’m not that good making frontend stuff, so that helped a lot. The dashboard layout is actually a template you can find on the shadcn site, I love the huge amount of things they have I didn’t know what else to put as a welcome to the dashboard, so I left a little welcome message as seen at the beginning of the video And I also forgot to show (mostly because there wasn’t any) the notifications button, where you can find any incoming challenges and friend requests. The whole bot creation process works, at the end it gives you a token that you can use as if it were a user auth token, but you have all the scopes by default, so you can do anything you want with the account What remains to do on this web part is to be able to see the profile of other users, along with their recent matches. And also a web client so you can play without downloading the TUI client or needing to use the discord bot"}, {"post_id": 32193, "ts": "2026-07-21T06:11:10Z", "hours": 5.3728, "text": "Edit: I realized right after posting this devlog: 100 hours! This has taken me more time than what I expected and gone quite big at this point hahah Welp, the bots are done, and now I’ve tested the Discord integration. I made the bots using the js-chess-engine package. Why that instead of something like stockfish? it simply was way easier to do as it’s a full js/ts engine lol Though, that doesn’t mean that the stockfish engine wouldn’t be posible to integrate! as anyone can create bots, that also means that anyone could create a stockfish bot if they wanted to. In case you don’t know what Stockfish is: It’s a really powerful and popular chess engine written in C++. Also, while writing this devlog, I found this package , which could be used to make a stockfish bot really easily. Though the ELO of the stockfish bot is really high, so I don’t really regret choosing js-chess-engine as a simpler engine means people can at least win against it lol Here is a small video showing a match running on the discord bot. There are some small coordinates on the image so writing the SAN/LAN notation is easier, though it’s quire hard to see them on the video due to compression. While it has support for everything (friend requests, send challenges, accept challenges, etc), I kinda forgot to record the rest :P"}, {"post_id": 31519, "ts": "2026-07-20T00:11:39Z", "hours": 9.0231, "text": "Well, making the TUI has gone quite well. While I initially thought that Vue seemed weird for doing TUIs, it’s actually not that bad. No wonder Ink is so popular. (Though I’m liking Vue more than I like React, and Ink felt kinda clunky at times when I first tried it) If you want to do TUIs with TypeScript/JavaScript, I’d recommend you give Vue TermUI a try. It also supports the Vue Router, so it’s easy to make a lot of pages and then navigate through them. The data show in the video is just mock data. So it still doesn’t use the actual API, though progress have gone quite well without many hiccups. The send friend request button, and the accept/reject challenge buttons do use the actual API, but they just throw an error because it tries to accept/reject a challenge that doesn’t actually exist, as it’s just mock data. The app doesn’t crash on error though, it displays the error message right below the button, that way the user can see what went wrong without having the whole app crash or any other unexpected behavior. What remains now is making some bots, that way I can make the whole “Playing a game” page, as having mock data for the WHOLE game state is not very… easy? I mean, I’ll have to do some bots anyway, so why not do them now instead of creating some weird mock functions hahah I also think that the icons on the authorization page feel weird. I dont know if maybe they are too big or if I should just change them to other ones. I also have to change the card after approval or denial instead of just showing the toast at the bottom, as it doesnt give feedback to the user Below is a small video of the TUI in action: (Disclaimer: Some AI was used, primarily to create the mock data so I could focus on the TUI itself)"}, {"post_id": 30506, "ts": "2026-07-18T04:16:32Z", "hours": 8.6408, "text": "Welp, designing how to do the TUI was kinda… complex. I mostly know JS/TS, so I wanted to use that. And that made everything way more complex, as there aren’t so many options as you might have with something like how good Bubble Tea is on Go. So these were the options I considered: Ink : Which didn’t have mouse support and uses React, which I’ve felt kinda clunky while doing the webpage, so I wanted try something else. Rezi : Which, at first, was AMAZING. But it had some bugs where focus didn’t work at all and I couldn’t interact with the TUI, or just started getting weird. OpenTUI : tbf, I didn’t test it out that much, couldn’t really understand it’s TS bindings So what I ended up going with? Something not listed above: I ended up going with Vue TermUI ( for now ). Why? Well, I’ve wanted to try out Vue for some time now, and it uses OpenTUI under the hood, so it’s backend is probably pretty stable, or so I think, i don’t really know. It does handles mouse input and focus management, making it quite easy to use. Will I stay with Vue TermUI? I don’t really know yet. I’m just beginning to try it out, and I’m curious to see how it ends up. Especially because Vue for TUI sounds pretty weird lol I actually really liked Rezi and you should check it out, as the issues I had were probably because I was doing something wrong hahah"}, {"post_id": 24535, "ts": "2026-07-08T04:57:03Z", "hours": 62.6878, "text": "Welp, I’ve been working for quite a while and this is quite a long devlog. If this seems interesting to you, leave a comment with suggestions! Maybe I could do some of them depending on their difficulty I now have a pretty good API structure. It has normal HTTP endpoints and also a subscription system using WebSockets so you can get event-based messages, all of it working already. I also did a JS/TS package so it’s easier to implement it on your proyects. (Still not published to npm) I currently have the following systems working: Account, Friends, Challenges, Matches, Bot management and Device auth (the thing where the app can show you an 8 character code to login). I also did a scopes system, that way you can know exactly what data the app will have access to and what actions it’d be able to do on your behalf I made the backend using Elysia , while the whole storage is a PostgreSQL database that I interface with using Drizzle . The doc pages were done using Fumadocs , I love the way they look :D A secondary DB, using Redis (or Redis-compatible DB) is also optional, quite useful as some thing like board movements might be done by players quite fast on low timers (like 1 min) and should be replied to as fast as possible to prevent the DB write speeds and reply time from counting against a player’s timer or affecting the match playability, though I still haven’t implemented timers lol If the secondary Redis DB isn’t setup, then that data will be stored on RAM in order to keep it fast. Things like match status is kept there until the match ends, that means if the API server restarts, the matches that are currently being played are restarted too. I thought this isn’t as bad of a tradeoff in order to have a fast API reply, especially because you can solve it by setting up the Redis DB, and then you can restart the API server without worry, as the data is stored on the Redis server. While the whole API is done, the account dashboard still requires some work to do, and I’m planning to do some integrations to make it easy to test, like a Discord bot (which is already done), a TUI, or maybe a web interface, though frontend interactivity isn’t something I’m really good at, and still haven’t gotten used to doing things “the React way” :P I also added some bot management endpoints. That way someone can create a bot account under their user and be able to create any “bot opponent” to play against, something that I also want to do so anyone trying out the API or implementations can test it without requiring another available opponent Don’t know if I should make an ELO/Leaderboard system, as those could be easily cheated and can’t really moderate them, and doing skill based match making wouldn’t work with a small user base."}, {"post_id": 7750, "ts": "2026-06-12T22:58:59Z", "hours": 14.0508, "text": "This is Chess Now! An open-source (soon!) API to control chess games. The idea is for anyone to be able to create and integrate their apps and be able to control the games from there. This also means that you could be playing on App1 while your opponent can be playing on App2, as the server-side is shared between them. I’ve added the whole auth flow and database integration. Better Auth really helped a lot in this regard, the docs were awesome. I used some templates for the hero and login/signup flow as I don’t have almost any experience with frontend development (and a side-goal for me is to not use AI for codegen while making this project), though I’ve been learning a LOT about frontend doing this. I’ll begin planning the whole API structure, I still don’t know where to begin hahah"}]...
|
Title: Chess Now! by @AngelCMHxD | Stardance
Devl Title: Chess Now! by @AngelCMHxD | Stardance
Devlogs:
This is Chess Now! An open-source (soon!) API to control chess games. The idea is for anyone to be able to create and integrate their apps and be able to control the games from there. This also means that you could be playing on App1 while your opponent can be playing on App2, as the server-side is shared between them. I’ve added the whole auth flow and database integration. Better Auth really helped a lot in this regard, the docs were awesome. I used some templates for the hero and login/signup flow as I don’t have almost any experience with frontend development (and a side-goal for me is to not use AI for codegen while making this project), though I’ve been learning a LOT about frontend doing this. I’ll begin planning the whole API structure, I still don’t know where to begin hahah
Welp, I’ve been working for quite a while and this is quite a long devlog. If this seems interesting to you, leave a comment with suggestions! Maybe I could do some of them depending on their difficulty I now have a pretty good API structure. It has normal HTTP endpoints and also a subscription system using WebSockets so you can get event-based messages, all of it working already. I also did a JS/TS package so it’s easier to implement it on your proyects. (Still not published to npm) I currently have the following systems working: Account, Friends, Challenges, Matches, Bot management and Device auth (the thing where the app can show you an 8 character code to login). I also did a scopes system, that way you can know exactly what data the app will have access to and what actions it’d be able to do on your behalf I made the backend using Elysia , while the whole storage is a PostgreSQL database that I interface with using Drizzle . The doc pages were done using Fumadocs , I love the way they look :D A secondary DB, using Redis (or Redis-compatible DB) is also optional, quite useful as some thing like board movements might be done by players quite fast on low timers (like 1 min) and should be replied to as fast as possible to prevent the DB write speeds and reply time from counting against a player’s timer or affecting the match playability, though I still haven’t implemented timers lol If the secondary Redis DB isn’t setup, then that data will be stored on RAM in order to keep it fast. Things like match status is kept there until the match ends, that means if the API server restarts, the matches that are currently being played are restarted too. I thought this isn’t as bad of a tradeoff in order to have a fast API reply, especially because you can solve it by setting up the Redis DB, and then you can restart the API server without worry, as the data is stored on the Redis server. While the whole API is done, the account dashboard still requires some work to do, and I’m planning to do some integrations to make it easy to test, like a Discord bot (which is already done), a TUI, or maybe a web interface, though frontend interactivity isn’t something I’m really good at, and still haven’t gotten used to doing things “the React way” :P I also added some bot management endpoints. That way someone can create a bot account under their user and be able to create any “bot opponent” to play against, something that I also want to do so anyone trying out the API or implementations can test it without requiring another available opponent Don’t know if I should make an ELO/Leaderboard system, as those could be easily cheated and can’t really moderate them, and doing skill based match making wouldn’t work with a small user base.
Welp, designing how to do the TUI was kinda… complex. I mostly know JS/TS, so I wanted to use that. And that made everything way more complex, as there aren’t so many options as you might have with something like how good Bubble Tea is on Go. So these were the options I considered: Ink : Which didn’t have mouse support and uses React, which I’ve felt kinda clunky while doing the webpage, so I wanted try something else. Rezi : Which, at first, was AMAZING. But it had some bugs where focus didn’t work at all and I couldn’t interact with the TUI, or just started getting weird. OpenTUI : tbf, I didn’t test it out that much, couldn’t really understand it’s TS bindings So what I ended up going with? Something not listed above: I ended up going with Vue TermUI ( for now ). Why? Well, I’ve wanted to try out Vue for some time now, and it uses OpenTUI under the hood, so it’s backend is probably pretty stable, or so I think, i don’t really know. It does handles mouse input and focus management, making it quite easy to use. Will I stay with Vue TermUI? I don’t really know yet. I’m just beginning to try it out, and I’m curious to see how it ends up. Especially because Vue for TUI sounds pretty weird lol I actually really liked Rezi and you should check it out, as the issues I had were probably because I was doing something wrong hahah
Well, making the TUI has gone quite well. While I initially thought that Vue seemed weird for doing TUIs, it’s actually not that bad. No wonder Ink is so popular. (Though I’m liking Vue more than I like React, and Ink felt kinda clunky at times when I first tried it) If you want to do TUIs with TypeScript/JavaScript, I’d recommend you give Vue TermUI a try. It also supports the Vue Router, so it’s easy to make a lot of pages and then navigate through them. The data show in the video is just mock data. So it still doesn’t use the actual API, though progress have gone quite well without many hiccups. The send friend request button, and the accept/reject challenge buttons do use the actual API, but they just throw an error because it tries to accept/reject a challenge that doesn’t actually exist, as it’s just mock data. The app doesn’t crash on error though, it displays the error message right below the button, that way the user can see what went wrong without having the whole app crash or any other unexpected behavior. What remains now is making some bots, that way I can make the whole “Playing a game” page, as having mock data for the WHOLE game state is not very… easy? I mean, I’ll have to do some bots anyway, so why not do them now instead of creating some weird mock functions hahah I also think that the icons on the authorization page feel weird. I dont know if maybe they are too big or if I should just change them to other ones. I also have to change the card after approval or denial instead of just showing the toast at the bottom, as it doesnt give feedback to the user Below is a small video of the TUI in action: (Disclaimer: Some AI was used, primarily to create the mock data so I could focus on the TUI itself)
Edit: I realized right after posting this devlog: 100 hours! This has taken me more time than what I expected and gone quite big at this point hahah Welp, the bots are done, and now I’ve tested the Discord integration. I made the bots using the js-chess-engine package. Why that instead of something like stockfish? it simply was way easier to do as it’s a full js/ts engine lol Though, that doesn’t mean that the stockfish engine wouldn’t be posible to integrate! as anyone can create bots, that also means that anyone could create a stockfish bot if they wanted to. In case you don’t know what Stockfish is: It’s a really powerful and popular chess engine written in C++. Also, while writing this devlog, I found this package , which could be used to make a stockfish bot really easily. Though the ELO of the stockfish bot is really high, so I don’t really regret choosing js-chess-engine as a simpler engine means people can at least win against it lol Here is a small video showing a match running on the discord bot. There are some small coordinates on the image so writing the SAN/LAN notation is easier, though it’s quire hard to see them on the video due to compression. While it has support for everything (friend requests, send challenges, accept challenges, etc), I kinda forgot to record the rest :P
And… This devlog is just to show the web dashboard, which I have forgotten to do a devlog for it all this time, which is why the logged time is so low lol I used the Next.js framework to build the web dashboard (well, the whole dashboard + welcome page and just the whole web thing). I also used the shadcn/ui components library, as I’m not that good making frontend stuff, so that helped a lot. The dashboard layout is actually a template you can find on the shadcn site, I love the huge amount of things they have I didn’t know what else to put as a welcome to the dashboard, so I left a little welcome message as seen at the beginning of the video And I also forgot to show (mostly because there wasn’t any) the notifications button, where you can find any incoming challenges and friend requests. The whole bot creation process works, at the end it gives you a token that you can use as if it were a user auth token, but you have all the scopes by default, so you can do anything you want with the account What remains to do on this web part is to be able to see the profile of other users, along with their recent matches. And also a web client so you can play without downloading the TUI client or needing to use the discord bot
The TUI is 100% done! (I think…) There is no longer any mock data and it works with the actual API. You can send and receive challenges and friend requests, and you can see/play your running matches. I think that, for the account management, I’ll remove email signups and only allow social OAuth2 (currently Google and Discord). As with email/password signups I need to handle email verification and password reset, and while Resend (what I use right now) is REALLY good and it’s free tier is great (3000 mails a month, 100 daily), if someone tries to spam the endpoints, it’s gonna eat up the limit. Though I might just put a rate limiter in place, and with Cloudflare Turnstile I already combat at least some botting, still thinking about it… I’ll probably start with the web client for now, which might be the last thing to do Below is a little video showing the TUI in action, while playing a match: (I took quite a bit of time thinking about the move I should make till I remembered I was just recording a test video lol)
Well, the web client is done!! I used react-chessboard and it’s a pretty good library. I didn’t add click-to-move pieces as it makes the logic a LOT more complex, so I didn’t want to do it for now I also used the API package from before, so we can use the websocket connection and listen for any changes. I also added it onto the matches page so any updates on the boards are reflected in real-time (which would probably look amazing if you have multiple automated matches running lol), and any new matches are added to the list without needing to refresh the page. I also want to add it onto the friends page, so it also updates in real-time I had to change the icons on the discord bot as I realized they were Chess.com’s icons, and they aren’t free to use, so I removed them and replaced them with a pack named Caliente , which look amazing. It’s the same one I use on the web client I think I should add a popup once the match is over as the current result feels quite plain. I also gotta add another page where you can spectate the match of other people, as the current one has too many logic already I prefer to duplicate it and remove the need of handling input and what not. I also haven’t added a profiles page yet, so that’s still on the TODO list hahah Below is a small video of me playing a match against a bot. Two disclaimers: I used AI to fix some issues I had with the CSS on the page, though it didn’t change anything other than fix some class names, and the whole logic was made by me. I played horribly against the bot, as the difficulty is set quite low lol Additional disclaimer: Ignore the -55s duration on one of the matches, it was an old bug but I’ve gotten lazy and haven’t fixed the match on the DB yet .-.
User page done! You can now see all of the matches and friends of other people, along with a small list of stats. I’m thinking about implementing the ELO system. While I previously said that I wouldn’t be able to moderate people artificially inflating it (by selfbotting), having it without a leaderboard wouldn’t really make it that enticing to abuse. And personally, if there isn’t a leaderboard, I don’t think moderating it would be that important, what would the user gain more than having a bigger number on their profile? Still thinking about it though I’m not sure about adding custom profile pictures or really any other user generated content. It would be nice to have, but it also involves moderation in order to prevent anything inappropriate from being uploaded (i mean, we all know how the internet works :/) Below is a small video showing the user page, along with the bot auto accepting any new friend requests :P
ELO system! let’s go!! At the end, I did add an ELO system. Well, it’s not really ELO, it’s Glicko . I used the glicko2-lite library, which is stateless unlike other glicko implementations I found. I wanted a stateless one because I’m saving the data on the DB anyways, so making it stateful would only make it use more resources (primarly RAM). You start with a rating of 1500. After every match your rating will go up/down depending on whether you win or lose. How much you win or lose depends on how many matches you have played (the first one are worth a bit more to get you to the optimal points), and depending on the rating of your oponent. If you win against someone with a bigger rating than yours, you’ll gain way more points than if you win agains someone around your rating or less. I also added a settings page so you can change your name and username, along with a page to change your password. Below is a small video showing how the ELO Glicko system works: What remains is just to also add the name/username change for bots and improve the docs. I also made a Stockfish bot which you can try to play against. (Keyword: try , because it’s probably almost impossible)
Well, that took way longer than expected. The docs are way more polished now! All endpoints have example responses so you know exactly what each one will return, along with a small description. HTTP endpoints that trigger a WebSocket event for any user (like friend requests, challenges, match moves, etc), mention it on their descriptions. I also added some headers to the PGN strings, as they were previously filled with “?“s. This mostly took this long due to a LOT of issues with the account deletion process, but it works perfectly now. When you delete your account, your user is replaced in all the matches you’ve played to @deleted_user . This is to keep the match data available even after any user deletes it. After that, your account is deleted from the DB. Due to how the DB is configured with cascade deletes, that will delete all other rows that reference the user (friendships, friend requests, pending challenges, etc.) except for matches, as they no longer reference the user that is being deleted. I’m am quite close to the ship, which I’m kinda nervous about. I want the project to be in the best state and as polished as possible, without any bugs (well, any known bugs lol). Which is mostly the reason this project as a whole has taken soo long :/ Below is a small video showing the docs with the example data. At the end is the delete account flow, which have lot’s of confirmations as it currently doesn’t send an email. I’m thinking it probably should send one lol See you in the next (and probably last) devlog! (I fixed my OBS settings, the video should look a bit better than the previous ones :P)
Hewo! Last devlog till ship here (i think) I didn’t think I’d add anything else, but you can now forfeit matches or ask the opponent for a draw! They just seemed like something that should exist on the shipped project… Each player can request only one draw per match, so you think before you do it. why did i do it like that? well, asking for a draw pauses the whole match, an neither player can do any moves until the draw request is answered. in order to prevent one of the users spamming draws, i simply limited to only one per match. also, ending the match in a draw doesn’t mean that your ELO isn’t affected, it is affected. depending on the elo of your opponent, you’ll lose/earn elo on a draw, just as you’d do on a stalemate. I also added a piece promotion selector. i forgot i made it so it always chose the queen by default, but in some matches that might not be wanted, so now you get a popup to select the piece you want to promote to well, i don’t really know if i’m missing any other things, as that was all that was i had on my TODO list, so i guess i’ll start setting up the prod environment below is a video showing the forfeit and draw flows, along with the promotion popup. don’t worry about the first match being a valid checkmate but the match continued being active, i already fixed that bug but it didn’t apply to already affected matches :P i also sped up (is that the correct way to say it?) and cutted out some parts of the video to prevent it from being 6 minutes of me playing the match lol
Well, I set up the domain + reverse proxy and all kind of problems arose. I changed the package so you only need to instantiate the class without any arguments to use the default server over at https://chessnow.angelcmh.com though you can still pass an optional baseUrl in case you selfhost your own instance at first nothing worked, but then i noticed that I had a port conflict on my VPS with two things trying to use the same port lol i also tried to improve SEO on the main page as much as I could, though im not an expert on that. i also added an official bots section so you can challenge some bots without having to look at any docs to find them shipping in some minutes!
Hewo! This devlog was unexpected. I prepared a small video/trailer so I had something to upload when shipping the project, and when I tried to upload it I realized that you can only upload images when shipping a project :/ So here is that video as it won’t go to waste. I tried my best, hope my voice doesn’t sound awkward, I’m not a native speaker Also, check out the shipped project! As I probably shipped it right after this devlog
aaaa, so… long time no see! also, super star!!! So, I’ve began doing some things that I’ve meant to do before, but completely forgot as I got quite busy… lol I fixed an error which made the TUI not work on Linux, it works now! It was an issue as I was building on NixOS, and the linker path was on my /nix/store folder instead of the usual /lib one. that means it also broke for me after an update lol You can now configure challenges! This needed to be implemented on all clients, hence why it took a little while lol Select whether you want to start with white, black or random. The opponent will be able to see which color you selected before accepting the challenge though! :P Also, meet unrankeds! You can now also mark a match as unranked so it doesn’t affect your ELO ratings at all . Take into account that there is decay though! so if you don’t play ranked for a while, your next match ELO diffs might be a little bit different Fun fact: The starting color option has been available on the API for a while already, even documented. so, if you did API calls directly, you could have selected a starting color and the opponent would not have been able to notice! as none of the clients showed it. except for the Discord bot… I think… or if you requested the match through the API too ;D
Ships:
This is Chess Now! A real-time chess API with challenges handling, matches, friends, and much more! The idea is for anyone to be able to make a custom client, bot or integration with the platform, thus it’s as open as it can possibly be while trying to also stay secure. One of the biggest parts of the proyect was doing that many clients, especially the TUI client. While I learned Vue doing the TUI client, I found it’s behaviour kinda… unintuitive in some way I can’t really explain. Though at the end I felt that Vue is better than React by a mile (now I only have to try out Svelte) I am proud of how well structured the API is, and while I’m sure it can be improved, the bases feel pretty solid. I’m also proud of how much I learned doing this. I mean, I tried a lot of things I’ve been meaning to try for some time already: Vue, Better Auth, Drizzle ORM, actually deploying a Next.js app, React mail + Resend, Elysia, and Fumadocs. And probably something else I already forgot about hehe Would I do something different if I started right now? Probably, but mostly just to try out even more things, which is the main reason why I do most of my projects. If you want to try out the project, you should probably just check the instance hosted at https://chessnow.angelcmh.com/ , create an account and play against a bot. You should also check out the docs, or the npm package over at https://www.npmjs.com/package/@chess-now/api if you are interested. Thanks for reading till the end, have a great day! ;P...
|
1792986608.2230716
|
1793073008.2230716
|
|
32474
|
IELTS Only - Learning and Practice Platform by @Im IELTS Only - Learning and Practice Platform by @ImLuke | Stardance...
|
ImLuke
|
1
|
107.47
|
1502
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-06T04:44:27Z", "hours": 100.0, "multiplier": 16.43, "payout": 1502, "blessing": "neutral", "text": "Q: What did I make? - A: As you can see, learning IELTS nowaday is becoming much more expensive, making it harder for youngster, whose need that certification the most for their study career, to afford it. So I have made IELTS Only, the completely free IELTS learning & practicing platform that can help people to study IELTS easily. Q: What was challenging? - A: There were a lot of challenges that I faced when doing this project, such as coding, fixing bugs. But the hardest thing is the imitation of real IELTS interface, I need to research a lot on it. Q: What am I proud of? - A: I proud of myself because I have done something good for the social and learn a lot of value lesson. Q: What should people know so they can test my project? - A: You just simply click on the “Try project” button below, it will direct you to my website (It kinda lag… im dont have much money to buy a web hosting sr…)", "repo": "https://github.com/nploc1209/IELTSOnly", "demo": "https://ieltsonly.imluke.hackclub.app"}]...
|
[{"post_id": 58876, "ts": "202 [{"post_id": 58876, "ts": "2026-08-31T13:30:20Z", "hours": 7.4714, "text": "IELTS Only - Version 1.1.0 - Writing Updates Hi y’all, long time no see! So today, I have made a real writing interface, I tried to copy exactly what IELTS writing interface have,…"}, {"post_id": 41727, "ts": "2026-08-06T03:43:36Z", "hours": 1.5814, "text": "IELTS Only - Version 1.0.0 - Reading & Grammar release! For a long long long long longggggg time, I have finished the first two skill, which is Reading and Grammar, get ready for the first ship to the world"}, {"post_id": 40281, "ts": "2026-08-03T18:20:21Z", "hours": 5.2558, "text": "IELTS Only - Version 0.15.2 - Writing Update 0.15.1: I built the real Writing interface, it is easy because I just change some of element in real Reading interface which I struggle for a long time 0.15.2: I also built the writing creation page. It also easy compared to reading and grammar as you can see in the second picture."}, {"post_id": 38706, "ts": "2026-08-01T07:40:18Z", "hours": 8.8911, "text": "IELTS Only - Version 0.14.3 - Grammar Lesson Update So I’ve spent 8 hours making three major updates: 0.14.0: I upgraded the grammar interface from version 0.12.0 so now it becoming more clean and easy to interact with. 0.14.1: I built the grammar dashboard with widget as you can see in the third picture. It quite easy because it the same as reading dashboard so it don’t take much time. 0.14.2: I built the grammar question creation, this is the hardest one because i face a lot of error while doing it. And make database to save the work. 0.14.3: Fixing some minor bugs of grammar."}, {"post_id": 37662, "ts": "2026-07-30T15:36:19Z", "hours": 8.4631, "text": "IELTS Only - Version 0.13.0 - Optimization Update Recently, I have optimized the website by some of the useful trick I learned on Instagram like instead of showing the loading spin, we can use skeleton loading to make user think it will be more faster to load,…"}, {"post_id": 35219, "ts": "2026-07-26T14:41:44Z", "hours": 11.4536, "text": "IELTS Only - Version 0.12.0 - Grammar Practice Interface Update After hours and hours, Reading section still in progress but i kinda bored. So I have changed to build Grammar Interface instead. I really like the interface of Duolingo so I tried to build almost as same as its interface (don’t worry I will not copy 100%). It still in progress and I hope to finish it soon!"}, {"post_id": 33078, "ts": "2026-07-22T17:38:07Z", "hours": 12.9244, "text": "IELTS Only - Version 0.11.0 - Error Page Update Today I made the Error page so when ever someone run into an error, I can use the trace code to trace the error and easy for me to fix the web. (Jury will be the main website’s mascot too)"}, {"post_id": 30768, "ts": "2026-07-18T17:11:06Z", "hours": 14.0036, "text": "IELTS Only - Version 0.10.0 - Infrastructure Update This update is mostly happening behind the scenes, but it is a big one 🔧 IELTS Only’s infrastructure has been rebuilt to make the platform more stable, faster, and easier to scale. It still in progress, I will update soon! P/S: It took me like 1 hour to draw the painting below! Like if you love it ♥️"}, {"post_id": 29657, "ts": "2026-07-16T18:39:17Z", "hours": 4.1644, "text": "IELTS Only - Version 0.9.0 - Reading Dashboard Update The Reading dashboard just got a fresh new look ✨ Tests are now easier to browse with clearer passage filters, useful details at a glance, and quick filtering by progress, source, or question type. I also added custom pixel-art covers to give each passage a bit more personality. A few small details are still being polished, but the dashboard is now cleaner, faster, and much more fun to use."}, {"post_id": 29020, "ts": "2026-07-15T17:49:32Z", "hours": 7.8081, "text": "IELTS Only - Version 0.8.0 - Complete Real IELTS Interface Update Pheww, It took me quite a long time to copy the real IELTS Interface and made it work!"}, {"post_id": 28321, "ts": "2026-07-14T14:33:17Z", "hours": 4.5064, "text": "IELTS Only - Version 0.7.16 - The Editor Update I change from Quill into Tiptap for more features and more easy to use! Love it because I can easily modify text like Word/Google Docs instead of using Markdown which is quite hard for low-tech people P/S: Do you think ⭐️ STARDANCE should have an update like me:)?"}, {"post_id": 27179, "ts": "2026-07-12T14:42:06Z", "hours": 2.4275, "text": "IELTS Only - Version 0.7.15 - IELTS Reading Test Creation Portal Update I build the preview, so teacher/creater can be easily see what is going on!"}, {"post_id": 26757, "ts": "2026-07-11T18:44:29Z", "hours": 4.8289, "text": "IELTS Only - Version 0.7.14 - IELTS Reading Test Creation Portal Update This is the hardest part so far, I’m very struggling with this because I need to think what to design to make it simple, so for the low-tech people, they can still easily use it. 0.7.0: Changed the Single and Multiple Choice selection buttons from blue to IELTS Only red. 0.7.1: Added dropdown answer selection directly beside each heading in Matching Headings questions. 0.7.2: Made dropdown answer limits and important instructions bold and easier to notice. 0.7.3: Redesigned Sentence Completion with one flexible text editor instead of separate sentence inputs. 0.7.4: Added automatic blank detection using [] placeholders inside completion-question content. 0.7.5: Limited the answer fields to exactly match the number of [] blanks detected in the text. 0.7.6: Applied the same flexible text-and-placeholder system to Summary, Note, and other completion question types. 0.7.7: Removed unnecessary content containers from question types that do not require 0.7.8: formatted passage content. 0.7.9: Started designing an Excel-like editor for creating custom Table Completion layouts. 0.7.10: Started designing a visual flowchart builder for Flow-chart Completion questions. 0.7.11: Started designing a simple paint-style canvas for Diagram Labelling and Completion questions. 0.7.12: Reviewed the entire Reading Test Creation Portal to improve consistency, clarity, spacing, and usability. 0.7.13: Simplified labels, controls, and workflows so first-time and low-tech users can create questions more easily. 0.7.14: Reduced repetitive inputs and automated as many complicated setup steps as possible."}, {"post_id": 26452, "ts": "2026-07-11T08:06:31Z", "hours": 3.0911, "text": "IELTS Only - Version 0.6.3 - Real IELTS Reading Interface Update - 0.6.0: Build the exact interface of IELTS Reading test I researched on Google but cannot found any real IETLS Reading interface. Luckily, on YouTube, IDP has posted the instruction for doing Reading in computer-based system which including the real IELTS Reading interface in the video. So I build side-by-side with that. - 0.6.1: I made the hamburger icon work! Now user can change the theme or text size like official IELTS test. - 0.6.2: I made a small change in the lower board, user can watch time and adjust the volume that best fit to the user (I know Reading does not contain any sound but anyway in the actual IELTS it also included it) - 0.6.3: I researched on Google and found that IELTS does not allow to find (Crtl/Command + F) so I make the system listen to that key to prevent it perform find. Copy-paste still works!"}, {"post_id": 25827, "ts": "2026-07-10T09:32:36Z", "hours": 1.1781, "text": "IELTS Only - Version 0.5.0 - Reading Section Update I made the filter so user can easy to filter what lesson they want to do!"}, {"post_id": 25786, "ts": "2026-07-10T07:35:52Z", "hours": 3.4886, "text": "IELTS Only - Version 0.4.1 - Setting Updates 0.4.0: Personal Information Update I build the pages for user to change their information. Moreover, they can also delete their account. The system will delete all the data belong to the UUID of the user to erase all their data. 0.4.1: Statistic Update: I make the activity grid! The idea to make it from Codeforces, it really motivated to see the activity grid full of colors. And also and activity history so user can see what they have done."}, {"post_id": 25408, "ts": "2026-07-09T17:46:31Z", "hours": 3.1411, "text": "IELTS Only - Version 0.3.0 - Authentication Update The logic is very straightforward: The user enters their email. If that email already exists in the database, they will be asked to enter their password. The system then checks the password and logs them in. If the email does not exist yet, the user will be asked to enter their name and create a password. After that, they will be logged in. This is my idea for combining login and registration into one simple flow. I use Supabase to store the user database, ensuring security and transparency."}, {"post_id": 25188, "ts": "2026-07-09T08:09:06Z", "hours": 1.9067, "text": "IELTS Only - Version 0.2.0 - Dashboard Update I tried my best to make it as simple as possible. How I have these lovely people art when my drawing is bad! The solution is that I sketched it and then using Nano Banana Pro to enhance my drawing."}, {"post_id": 24545, "ts": "2026-07-08T05:20:36Z", "hours": 0.6847, "text": "IELTS Only - Version 0.1.0 - Brand Kit Update"}]...
|
Title: IELTS Only - Learning and Practice Platform Title: IELTS Only - Learning and Practice Platform by @ImLuke | Stardance
Devlogs:
IELTS Only - Version 0.1.0 - Brand Kit Update
IELTS Only - Version 0.2.0 - Dashboard Update I tried my best to make it as simple as possible. How I have these lovely people art when my drawing is bad! The solution is that I sketched it and then using Nano Banana Pro to enhance my drawing.
IELTS Only - Version 0.3.0 - Authentication Update The logic is very straightforward: The user enters their email. If that email already exists in the database, they will be asked to enter their password. The system then checks the password and logs them in. If the email does not exist yet, the user will be asked to enter their name and create a password. After that, they will be logged in. This is my idea for combining login and registration into one simple flow. I use Supabase to store the user database, ensuring security and transparency.
IELTS Only - Version 0.4.1 - Setting Updates 0.4.0: Personal Information Update I build the pages for user to change their information. Moreover, they can also delete their account. The system will delete all the data belong to the UUID of the user to erase all their data. 0.4.1: Statistic Update: I make the activity grid! The idea to make it from Codeforces, it really motivated to see the activity grid full of colors. And also and activity history so user can see what they have done.
IELTS Only - Version 0.5.0 - Reading Section Update I made the filter so user can easy to filter what lesson they want to do!
IELTS Only - Version 0.6.3 - Real IELTS Reading Interface Update - 0.6.0: Build the exact interface of IELTS Reading test I researched on Google but cannot found any real IETLS Reading interface. Luckily, on YouTube, IDP has posted the instruction for doing Reading in computer-based system which including the real IELTS Reading interface in the video. So I build side-by-side with that. - 0.6.1: I made the hamburger icon work! Now user can change the theme or text size like official IELTS test. - 0.6.2: I made a small change in the lower board, user can watch time and adjust the volume that best fit to the user (I know Reading does not contain any sound but anyway in the actual IELTS it also included it) - 0.6.3: I researched on Google and found that IELTS does not allow to find (Crtl/Command + F) so I make the system listen to that key to prevent it perform find. Copy-paste still works!
IELTS Only - Version 0.7.14 - IELTS Reading Test Creation Portal Update This is the hardest part so far, I’m very struggling with this because I need to think what to design to make it simple, so for the low-tech people, they can still easily use it. 0.7.0: Changed the Single and Multiple Choice selection buttons from blue to IELTS Only red. 0.7.1: Added dropdown answer selection directly beside each heading in Matching Headings questions. 0.7.2: Made dropdown answer limits and important instructions bold and easier to notice. 0.7.3: Redesigned Sentence Completion with one flexible text editor instead of separate sentence inputs. 0.7.4: Added automatic blank detection using [] placeholders inside completion-question content. 0.7.5: Limited the answer fields to exactly match the number of [] blanks detected in the text. 0.7.6: Applied the same flexible text-and-placeholder system to Summary, Note, and other completion question types. 0.7.7: Removed unnecessary content containers from question types that do not require 0.7.8: formatted passage content. 0.7.9: Started designing an Excel-like editor for creating custom Table Completion layouts. 0.7.10: Started designing a visual flowchart builder for Flow-chart Completion questions. 0.7.11: Started designing a simple paint-style canvas for Diagram Labelling and Completion questions. 0.7.12: Reviewed the entire Reading Test Creation Portal to improve consistency, clarity, spacing, and usability. 0.7.13: Simplified labels, controls, and workflows so first-time and low-tech users can create questions more easily. 0.7.14: Reduced repetitive inputs and automated as many complicated setup steps as possible.
IELTS Only - Version 0.7.15 - IELTS Reading Test Creation Portal Update I build the preview, so teacher/creater can be easily see what is going on!
IELTS Only - Version 0.7.16 - The Editor Update I change from Quill into Tiptap for more features and more easy to use! Love it because I can easily modify text like Word/Google Docs instead of using Markdown which is quite hard for low-tech people P/S: Do you think ⭐️ STARDANCE should have an update like me:)?
IELTS Only - Version 0.8.0 - Complete Real IELTS Interface Update Pheww, It took me quite a long time to copy the real IELTS Interface and made it work!
IELTS Only - Version 0.9.0 - Reading Dashboard Update The Reading dashboard just got a fresh new look ✨ Tests are now easier to browse with clearer passage filters, useful details at a glance, and quick filtering by progress, source, or question type. I also added custom pixel-art covers to give each passage a bit more personality. A few small details are still being polished, but the dashboard is now cleaner, faster, and much more fun to use.
IELTS Only - Version 0.10.0 - Infrastructure Update This update is mostly happening behind the scenes, but it is a big one 🔧 IELTS Only’s infrastructure has been rebuilt to make the platform more stable, faster, and easier to scale. It still in progress, I will update soon! P/S: It took me like 1 hour to draw the painting below! Like if you love it ♥️
IELTS Only - Version 0.11.0 - Error Page Update Today I made the Error page so when ever someone run into an error, I can use the trace code to trace the error and easy for me to fix the web. (Jury will be the main website’s mascot too)
IELTS Only - Version 0.12.0 - Grammar Practice Interface Update After hours and hours, Reading section still in progress but i kinda bored. So I have changed to build Grammar Interface instead. I really like the interface of Duolingo so I tried to build almost as same as its interface (don’t worry I will not copy 100%). It still in progress and I hope to finish it soon!
IELTS Only - Version 0.13.0 - Optimization Update Recently, I have optimized the website by some of the useful trick I learned on Instagram like instead of showing the loading spin, we can use skeleton loading to make user think it will be more faster to load,…
IELTS Only - Version 0.14.3 - Grammar Lesson Update So I’ve spent 8 hours making three major updates: 0.14.0: I upgraded the grammar interface from version 0.12.0 so now it becoming more clean and easy to interact with. 0.14.1: I built the grammar dashboard with widget as you can see in the third picture. It quite easy because it the same as reading dashboard so it don’t take much time. 0.14.2: I built the grammar question creation, this is the hardest one because i face a lot of error while doing it. And make database to save the work. 0.14.3: Fixing some minor bugs of grammar.
IELTS Only - Version 0.15.2 - Writing Update 0.15.1: I built the real Writing interface, it is easy because I just change some of element in real Reading interface which I struggle for a long time 0.15.2: I also built the writing creation page. It also easy compared to reading and grammar as you can see in the second picture.
IELTS Only - Version 1.0.0 - Reading & Grammar release! For a long long long long longggggg time, I have finished the first two skill, which is Reading and Grammar, get ready for the first ship to the world
IELTS Only - Version 1.1.0 - Writing Updates Hi y’all, long time no see! So today, I have made a real writing interface, I tried to copy exactly what IELTS writing interface have,…
Ships:
Q: What did I make? - A: As you can see, learning IELTS nowaday is becoming much more expensive, making it harder for youngster, whose need that certification the most for their study career, to afford it. So I have made IELTS Only, the completely free IELTS learning & practicing platform that can help people to study IELTS easily. Q: What was challenging? - A: There were a lot of challenges that I faced when doing this project, such as coding, fixing bugs. But the hardest thing is the imitation of real IELTS interface, I need to research a lot on it. Q: What am I proud of? - A: I proud of myself because I have done something good for the social and learn a lot of value lesson. Q: What should people know so they can test my project? - A: You just simply click on the “Try project” button below, it will direct you to my website (It kinda lag… im dont have much money to buy a web hosting sr…)...
|
1792972397.344788
|
1793058797.344788
|
|
18394
|
myMusic by @cluelessfr | Stardance
|
cluelessfr
|
3
|
105.0
|
1498
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-01T04:09:47Z", "hours": 49.0, "multiplier": 12.73, "payout": 608, "blessing": "neutral", "text": "I made myMusic, a Windows/Linux app that allows you to download your favorite songs. It works by searching YouTube/YouTube music for videos of your song. Then, using yt-dlp, it is able to download your song as an mp3 file. Finally it adds all of the metadata, allowing you to properly listen to your music offline. This is ship #3 of my project, so let me explain all of the changes since the last ship: First I finally added support for playlist and album downloads. Now instead of putting in each separate track individually you can combine it into a playlist and download that all together. For this I also had to update the GUI in order to fit all of the song information together. Second I improved the song searching and reliability. I made things consistent with how YouTube expects them (ASCII, Unicode characters, etc.). I also combine YouTube Music and YouTube candidates, so you get the best of both worlds. The app also tries multiple candidates before declaring that track a fail. Third I introduced explicit-version matching. Before, you would sometimes get the clean version of an explicit song. To fix this I switched to ytmusicapi, which allows me to compare matches to determine which one fits the criteria the best. The API also allows me to see whether or not the song is clean, which makes matching easier. Fourth (and probably the biggest update) I was able to add a Spicetify extension with the app. Because of this you are now able to download your favorite songs directly from the Spotify windows app. It reuses Spotify’s native download button rows, which make it easy to download your songs. It also preserves native behavior if you are already on Spotify Premium. It also shows notifications about the status of your download. This is only available on Windows. Fifth in order to make the Spotify integration work, the app now opens up a FastAPI/Uvicorn server bound to 127.0.0.1:18492. I chose a far away port in order for it not to affect any other local host processes. Sixth I also added background behavior for the app. This keeps the app open in the background without it being open on the gui (you will still be able to see it in your system tray). This allows the Spotify integration to run seamlessly without interfering with your every day work. Seventh I greatly improved the in app updater speed. Before it would greatly lag your computer because the chunk sizes were so small and it had to do a lot of writes to your disk. Now I increased the chunk size, and updated the packaging configurations to further boost the download speed and app size. These were all the main updates I did to my app, hope you like it!", "repo": "https://github.com/cluelessfr/myMusic", "demo": "https://github.com/cluelessfr/myMusic/releases/tag/v2.0.1"}, {"ship_num": 2, "ts": "2026-07-06T17:31:14Z", "hours": 34.0, "multiplier": 18.59, "payout": 611, "blessing": "neutral", "text": "I made myMusic, a Windows desktop app that takes a Spotify track link, previews the song details, finds a matching audio result, downloads it, converts it to MP3, and saves it with basic metadata tags. This is Ship #2 of my project. There have been a quite a few changes since my last ship, so let me list them all: First I added a folder-picking dialog. This allows the user to change the directory their songs are downloaded to, instead of being forced to always download to the “Downloads” directory. The app also saves the last chosen directory, so even if you close and reopen the app the directory is still saved. I then bundled Deno into the app, which helps yt-dlp solve JS challenges. Then I added the Spotify oEmbed metadata as fallback metadata if the SpotifyScraper python package fails. I also added YouTube as a partner with YouTube Music to get the best results from both platforms. I then a ranking system for the songs. The program adds and removes points from the top 6 matches from both platforms based on a few criteria, then it tries downloading from highest to least ranked. Then I also started embedding cover art. The app now takes in the cover art link, streams it, then writes it to the audio file. Next I added in-app update checking. The app can search the github repo for the latest version, checks to see if it is newer, then can automatically download and installer it. I also polished up the UI so that the controls and labels are more organized. Finally, I added Linux x64 and Linux ARM64 support. This has the same behavior as the Windows app, but the dependencies are now installed natively on that platform, which makes the app run more reliably on Linux. The current latest version at the time of this ship is v1.3.0.", "repo": "https://github.com/cluelessfr/myMusic", "demo": "https://github.com/cluelessfr/myMusic/releases/tag/v2.0.1"}, {"ship_num": 3, "ts": "2026-06-18T06:15:48Z", "hours": 22.0, "multiplier": 13.37, "payout": 279, "blessing": "neutral", "text": "I made myMusic, a Windows desktop app that takes a Spotify track link, previews the song details, finds a matching audio result, downloads it, converts it to MP3, and saves it with basic metadata tags. The hardest part was turning it from a local Python project into something other people can actually run: bundling FFmpeg, building the Windows executable, creating an installer, and writing clear install/testing instructions. These were all new steps that I wasn’t familiar with before, so I had to heavily research them and get familiar with them before shipping. I am proud that I was able to get it working as a real, bundled Windows desktop app, instead of a small project that runs only on my computer. To test it, use the Try Project link, download the v1.0.1 Windows installer, install it, open myMusic, paste a Spotify track link, click Preview Song Details, then click Download. The finished MP3 should appear in your Downloads folder. Windows may show SmartScreen because the app is unsigned; the release notes explain how to continue.", "repo": "https://github.com/cluelessfr/myMusic", "demo": "https://github.com/cluelessfr/myMusic/releases/tag/v2.0.1"}]...
|
[{"post_id": 38621, "ts": "202 [{"post_id": 38621, "ts": "2026-08-01T03:30:24Z", "hours": 2.9203, "text": "Devlog 39: I was finally able to get the Linux guards in place, and also packaged the new builds and released them to GitHub has a new version. The guards were mostly simple, as they were just a few checks that asked what operating system the user was on. And depending on that it decided whether or not to install the Spicetify extensions."}, {"post_id": 38528, "ts": "2026-07-31T23:36:25Z", "hours": 7.4581, "text": "Devlog 38: I worked on functions that helped install the Spicetify extension into the Spicetify configuration. I had to ensure Spicetify was installer, had to find its path, had to find its extensions path, then finally copy over the extension. I also added system tray behavior and multiple instance detection for the app, so that now when you close the app it doesn’t close but instead goes to the system tray. This allows the Spotify integration to work even if the app itself isn’t visible. The multiple instance detection ensures the app runs properly, and ensures that the app doesn’t try to use the same http port twice, resulting in errors. This did take a while but now all I have to do is create guards for Linux, so that the Spotify integration only works on Windows and doesn’t create unexpected errors on Linux."}, {"post_id": 37449, "ts": "2026-07-30T06:15:53Z", "hours": 4.1092, "text": "Devlog 37: I am very close to shipping now. I added the Spotify status/progress update messages, so now you can see when the tracks have finished downloading. I also fixed three (kinda major) bugs. First of all there was an error when searching for the songs on YouTube/YouTube Music. Basically what happened was that the title didn’t follow the same ASCII conventions that was used by YouTube. Because of this the app would reject good title matches even though they were the same. This produced quite a few errors, especially when trying to download songs with apostrophes. The second error I fixed was the some songs would automatically have the clean version downloaded. To fix this I switched to the ytmusicapi python package. This package also returned whether the song was explicit or not. Because of this I was able to check whether or not the song was intended to be that way, and if not I could prevent that match from being downloaded. I did have to edit a few functions to accept the new format, but in the end everything worked. Third I fixed a simple error that messed up the searching. This time it wasn’t really a bug, but instead an edge case that I missed. I was catching keywords like “feat.” and “featuring”, but I didn’t catch words like “From (and tv show, etc.)”. Because of this some matches were getting left out. I fixed this by adding another regex pattern that removes this as well."}, {"post_id": 37238, "ts": "2026-07-29T19:53:38Z", "hours": 2.6647, "text": "Devlog 36: I am almost done with the first phase of the integration. When the download button is clicked inside of Spotify, Spicetify intercepts it and now posts a request to the open web server. Then the python script gets notified of that request, decodes it, then automatically starts downloading the song/playlist/album. The only thing is that the myMusic app has to be open while doing this, but I will remove that requirement in the future (not now). The next step would be to add status reports to Spotify so that the user knows what the status of their download is."}, {"post_id": 36598, "ts": "2026-07-28T20:17:16Z", "hours": 2.8025, "text": "Devlog 35: The app now creates its own server on a very distant and far port so that your other local host stuff doesn’t get affected. I did this with uvicorn and threading, so that creating the port doesn’t make the app freeze. With this functionality the app can get the requests made inside Spotify and automatically download them. The next step is to get the app to report the statuses of the download jobs (queued, downloading, completed, failed, etc.). Then I would actually have to connect both parts, let Spotify send messages and the app receive the message."}, {"post_id": 35435, "ts": "2026-07-26T20:46:18Z", "hours": 4.8314, "text": "Devlog 34: I have been working on creating a queue for the requests. This ensures that the user can download multiple songs at once without having to wait for the previous ones to be finished. So far I have been able to create a request id for each request. The app can update the attributes of each request, such as its status, and error message. On top of this once a request is completed the app also automatically removes that request."}, {"post_id": 31912, "ts": "2026-07-20T18:12:07Z", "hours": 3.5339, "text": "Devlog 33: The app is now able to understand and automatically download any received links. Now the problem is that Spotify isn’t able to send any normal requests to via the computer. Because of this I need to find a way for Spotify to send and get data. I know that Spotify (using Spicetify) can send and get http requests. Because of that I am planning to use FastAPI and a local http server to be able to send and get data so the app can automatically download tracks. I will ensure to keep the server in a high index to ensure it doesn’t get in the way of any other local servers."}, {"post_id": 29252, "ts": "2026-07-16T01:35:08Z", "hours": 6.2167, "text": "Devlog 32: (sorry for the late post) I have been working on a really cool feature for the app. Basically what I am trying to do is integrate the myMusic pipeline into the windows Spotify app itself. When you right click a playlist or album, there will be a menu that pops up. Usually for normal Spotify users (not on premium) there will be a greyed out download button. What I am trying to do is two things: add a download button for tracks (because there isn’t one right now), and make the playlist/album button actually work. Right now what I have accomplished is adding a new button for the track and making the playlist/album button clickable. I was able to do this by using Spicetify and its framework. Because I already have it installed on my computer I am using it to test everything out but later I will bundle it with my app. What I did was build a custom Spicetify extension (I had to learn JavaScript) that creates a new button. I was able to make the original playlist/album button work because it was only “aria-disabled”, not actually disabled. This means that it was only disabled at the UI level, but Spotify still recorded clicks. By applying some UI changes I was able to make the button look enabled and still record clicks. My next step is to actually hook this up to the Python script. I think this is a really cool feature."}, {"post_id": 28364, "ts": "2026-07-14T16:05:28Z", "hours": 2.7422, "text": "Devlog 31: This devlog was mainly focused on the efficiency and speed of updating the app. Before the data would come in really small packets, meaning the cpu would have to write to the drive about 130,000 times in total (I know 😭). I adjusted this so it now comes in larger packets so the cpu doesn’t have to do more work. I also adjusted the compression and a few other Inno Setup settings (number of threads, etc.) to make the app more efficient in general. Another issue that I found is that once the app updated (specifically in Windows, idk about other platforms) the settings app would still show the older version for some time. This was an issue with the timing, so I had to adjust some of the delays to get it to work properly. Overall I think this is a pretty good update."}, {"post_id": 27877, "ts": "2026-07-13T19:39:38Z", "hours": 6.6931, "text": "Devlog 30: I FINALLY implemented playlist and album support. At first I thought it would be simple, just looping though each song in the playlist/album. Oh was I wrong. First I had to add two more methods that looped though each song, one for playlists and one for albums. There had to be two different ones because each returned metadata differently. Then I had to kind of change the format of the whole thing, because I had to store all of the songs in a list, but currently I was only returning dictionaries from all of my methods. After getting all of that sorted out I had to actually fix the GUI/downloading part. I had to update the downloading method to handle playlist/album links, then I had to properly handle all of the status message for each song (“Ready”, “Downloading”, “Failed”). Finally I had to work on fixing the bugs I had introduced and handling the edge cases. After all of that I FINALLY had playlist and album support. One thing that was sorta tough was handling the status for each track individually. Before I was just looping through the entire list and setting all of the statuses to the same thing, but I was able to create a new method and change each song status as it was being downloaded, not for every song as a whole."}, {"post_id": 25666, "ts": "2026-07-10T02:30:59Z", "hours": 5.3094, "text": "Devlog 29: This is kind of a messy devlog, so I’ll lay it out as best as I can. First, I update the UI in preparation for playlist/album support. Before it was three static text fields that could only display one song at a time. Now I replaced it with a scrollable frame, with the ability to add more sections inside the frame for more songs. This frame also has the ability to display metadata. I also introduced a status message that shows different messages and colors depending on the status. While I was doing that (and I am not done with it), I decided to stop in the middle and fix another bug. This bug (that was reported by other people as well as my testing) prevented good matches from ranked properly. This was a problem with how I compared the titles in my ranker. To fix this I added two new functions, one that normalizes the candidate title, and another that normalizes the actual Spotify song name (mainly to exclude features and get just the song name). To do this I messed around a lot with regex patterns, so I learned a lot. Now I have to go back and continue working on the new UI for playlists and albums."}, {"post_id": 23538, "ts": "2026-07-06T15:46:31Z", "hours": 3.8236, "text": "Devlog 28: Based on feedback from my first ship, I have decided to introduce Linux support. I thought it would be easy, but it turned out to be a little harder than I thought. The first thing I had to do was rewrite some of the Path code that saves the users download directory. This is because Linux and Windows have different file systems, and I had to account for both. Then came the hard part, Packaging. For ARM, I decided to do this on my Raspberry Pi, where I downloaded the project files from git, downloaded the OS specific FFMPEG and Deno, then repackaged the app as a .tar.gz. I decided to do it this way because this is sort of simply an experimental release. For x64 I decided to use GitHub Actions, which allowed me to download the dependencies and compile without having to spin up a new Virtual Machine. I also decided to keep this as a .tar.gz. Later, once I get more feedback about the Linux versions, I am planning to release a more universal app package (.flatpak). I also had to change the update checkers, because each OS version has to check its own corresponding file. In the end this was a very unique experience and I learned a lot of things about packaging apps on Linux."}, {"post_id": 21260, "ts": "2026-07-03T03:02:23Z", "hours": 5.4692, "text": "Devlog 27: This is a pretty major update. The myMusic can now automatically download and install updates, without the user having to go and download the github repository. Before, the user would manually have to go and download the installer from github, and set it up like a completely new install. Now, the app itself has a “Check for Updates” button. This button checks the github for the latest version, and if there is a newer version available it gives the user an option to download and install that. If they change their mind during the download, there is a cancel option as well. This works by first getting the github version (latest), then seeing if the current app version matches that. If it does, the app is up to date. If not, then the app can fetch the executable using the github API and automatically download the latest installer. On top of this some inno setup tools allow the app to close the app, install the new version, and reopen the app by itself. The only caveat is that this only works starting from v1.2.0. This means that if you have an older version you will have to manually download v1.2.0 in order to start getting automatic app updates."}, {"post_id": 20302, "ts": "2026-07-01T21:16:28Z", "hours": 1.2353, "text": "Devlog 26: Added a function to help with auto-downloading new updates. I haven’t hooked it up to the UI yet, but that is my next step. The function takes in the name of the installer and the link to download it. It first downloads the installer to a temp file, then once everything is good it saves it to a real executable."}, {"post_id": 19419, "ts": "2026-06-30T18:55:12Z", "hours": 1.0339, "text": "Devlog 25: This update was about implementing the update checker from the last devlog. Now there is an in-app button that allows you to check for new updates. The implementation was similar to all the other buttons and didn’t take too long because I already had the function ready. The next step is to allow the app to actually download and install the update, instead of just pointing out it is available."}, {"post_id": 19007, "ts": "2026-06-30T05:16:32Z", "hours": 1.6642, "text": "Devlog 24: I have started adding implementations that checks for the latest version of the app from github. It uses the github API endpoint for my specific project, then reads the json to get any version information. Using that we can compare the current version to the latest version on the github to see if there are any updates available. Currently I have only created the function and am yet to implement this feature into the actual app/GUI."}, {"post_id": 18082, "ts": "2026-06-29T02:24:36Z", "hours": 1.4658, "text": "Devlog 23: Today I added the feature that embeds cover art into the mp3 files. To do this I had to first use the requests library in Python to get the image itself. Instead of downloading the image I kept it in memory using the ‘io’ library. This made the metadata tagging safer and faster. Finally the app uses mutagen to embed the cover art into the mp3 file. I used a try and except loop, which ensures that even if the cover art adding fails the mp3 file still gets returned, just without the art."}, {"post_id": 17306, "ts": "2026-06-28T01:07:06Z", "hours": 1.4167, "text": "Devlog 22 This update was about further increasing the matching strength. Before the program would automatically download the highest ranked candidate, even if it was very low. Now the app downloads the highest ranked candidate only if its ranked above a certain thresh hold. If there are no qualifying matches then the app simply returns a no matches found error. This wasn’t that complicated, but I had to modify a few functions so that the score was returned properly and in a usable format."}, {"post_id": 16647, "ts": "2026-06-27T02:18:17Z", "hours": 2.3261, "text": "Devlog 21: Now added real YouTube (YT) to the match finding instead of just YouTube Music (YTM). Before the songs were found only on YTM, but I realist that normal YT has a larger list of songs, so I decided to add that to the algorithm as well. Now, the program takes 3 songs from YTM and 3 songs from YT, and uses the ranking function I created before to sort them from best to worst. Then the program starts by trying to download the best match. If it can’t, it goes through the list until if finds one it can download. If none of them download, then it sends an error message. One thing with this step was that I tried not to repeat big chunks of code, as a lot of this was similar to the original YTM downloading method."}, {"post_id": 16559, "ts": "2026-06-26T22:37:04Z", "hours": 1.9589, "text": "Devlog 20: Added the Spotify OEmbed fallback. Now even if the SpotifyScraper python package fails we have a fallback to get as much metadata as we can. This wasn’t that hard, as I already had the file from a previous time. The hard part was accounting for all the different cases, such as the title being missing or an empty string. I had to account for all of those while integrating the new file."}, {"post_id": 15864, "ts": "2026-06-25T19:50:13Z", "hours": 0.3722, "text": "Devlog 19: Implemented the ranking feature from the last devlog. Now, the best candidates are ranked in order from best to worst, and that is the order in which they are downloaded."}, {"post_id": 15836, "ts": "2026-06-25T19:07:36Z", "hours": 0.9022, "text": "Devlog 18: I implemented a way to start scoring the candidates returned by YT-DLP. This ensures that even if the first candidate returned is not the best, the program can automatically filter out the bad ones using key words and ensure the best candidate is always selected. I have only coded this function for now, and I have to wire it in to the real app soon."}, {"post_id": 15337, "ts": "2026-06-24T22:21:13Z", "hours": 3.4889, "text": "Devlog 17: Did some major code cleanups. No new features, but made the code more efficient. Also reorganized some files. The hard part was keeping the functionality the same while trying to make the code non-repetitive and more efficient. I also tried to fix any warnings that were present in the code that were caught by the IDE."}, {"post_id": 13864, "ts": "2026-06-22T18:38:18Z", "hours": 1.5628, "text": "Devlog 16: Simple update, but I added a new error message to account for a yt-dlp botting error. Now, when YouTube sends an error saying that the request was blocked due to botting being suspected, it sends a properly formatted error message instead of the raw yt-dlp text. I retested everything to ensure the previous functionality of the app remained the same."}, {"post_id": 13481, "ts": "2026-06-22T02:29:05Z", "hours": 3.7828, "text": "Devlog 15: Improved song selection algorithm, so it selects the next best track if the first selection is invalid. Before if the first track selected by YT-DLP didn’t work/was invalid, then the whole program would fail. Now it moves on to the next if the first one doesn’t work. I also update the progress messages, so it shows which match it is trying."}, {"post_id": 11619, "ts": "2026-06-18T22:25:28Z", "hours": 3.6753, "text": "Devlog 14: I have implemented two new features. First I implemented a feature that allows users to switch the directory where songs get downloaded. This took some time, but I was able to get it in the end. It works by creating a new button which opens a folder picking dialogue. The path that the user seclects inside this dialogue then gets saved to a local json file. Everytime the user changes the path it gets saved to the json, which allows the program to always open up the last directory selected by the user. I had to implement some checks to ensure that the program would work even if the json file was missing or corrupted. The second feature is more of an update. The static “Downloading” progress message is now updated with real time info on what the program is doing. The next step would be adding a dynamic progress bar."}, {"post_id": 11117, "ts": "2026-06-18T05:51:42Z", "hours": 1.4456, "text": "Devlog 13: I added an installer .exe file, added screenshots to the readme, and added a new release on GitHub. Configuring the installer was a little hard, as I was new to this process and didn’t know where to start. I used Codex to help me figure out that I could use a program called Inno. This handled the installer file, uninstall, as well as configuring it with Windows. Codex guided me through how to set that up, and eventually I got everything working. Finally I created a new version on Git and pushed everything."}, {"post_id": 10999, "ts": "2026-06-18T00:51:48Z", "hours": 1.1539, "text": "Devlog 12: I compiled the app into a .exe, updated the readme, and pushed the first version to git. I ran into some issues when compiling the app. Specifically after the initial compiling YT-DLP couldn’t see the location of FFMPEG. Because of this I had to update the “get_app_root.py” file so it accounted for the file changes when compiling."}, {"post_id": 10925, "ts": "2026-06-17T22:01:48Z", "hours": 1.1078, "text": "Devlog 11: I added a preview button to the GUI so that users could see the song details and confirm they were right before downloading the song. also prepared for packaging this file into an executable (.exe)."}, {"post_id": 10860, "ts": "2026-06-17T20:15:14Z", "hours": 1.8986, "text": "Devlog 10: Added app.py and introduced a GUI window using Custom Tkinter. Now when users run app.py they see a new desktop window open up, see a text box and a download button. Once they paste in a Spotify link they see status messages like “Downloading”. At the end they also see the downloaded path. On top of this if there are any errors during the download (like fetching metadata), this also displays as a status message. This took a little bit because I get to get familiar with Custom Tkinter, add another function that gets called by the button, and add some safeguards/quality of life updates. The main safeguard was disabling the download button while the song was downloading, which ensured the user didn’t spam processes. The quality of life update was that the download path now wraps the text to multiple lines if the path is very long."}, {"post_id": 10426, "ts": "2026-06-17T04:14:00Z", "hours": 0.4461, "text": "Devlog 09 Simple update, but it now uses Mutagen to add track name, artists, and album name to the downloaded files."}, {"post_id": 10333, "ts": "2026-06-17T00:33:23Z", "hours": 1.6983, "text": "Devlog 08 Introduced FFMPEG to the project to be able to convert downloads from .webm to .mp3 files. Also change the song title to be the title of the song. Introduced a file check to ensure file names are valid and accepted by Windows."}, {"post_id": 10283, "ts": "2026-06-16T22:29:59Z", "hours": 1.0183, "text": "Devlog 07 The program now automatically uses YT-DLP to download the best match found. This works by using YT-DLP’s build in “Download” method. I pass in the number 1 match found by YT-DLP (built in the last devlog), and it downloads it to the users default “Downloads” folder. This is a major step in the project, and I am almost ready to ship the first version."}, {"post_id": 10156, "ts": "2026-06-16T19:30:33Z", "hours": 2.4497, "text": "Devlog 06 Major Update: Now added YT-DLP to the project. Now whenever you put in a valid link you get more than just the metadata. You also get the top 5 best matches from YouTube Music. This took a while because I had to learn to properly call and use the YT-DLP package in python. I created 3 helper functions. The first created the search query using the metadata, the second returned the search results, and the last one formatted and returned the results. I created one last function as a wrapper, such that when I passed in the metadata it returned the YouTube Music search results. When calling yt_dlp.YoutubeDL(), I got a type error when passing the parameters. This was because the package expected its own datatype, while I was simply passing a dictionary. I was able to fix this by setting the type to “Any” when passing in the argument. I also changed main.py to include the YouTube search results. Now, whenever you pass in a Spotify link you get the song metadata as well as well as the top 5 best matches from YouTube Music."}, {"post_id": 9712, "ts": "2026-06-16T04:05:09Z", "hours": 0.4872, "text": "Devlog 05 This is a pretty small update, all I did was add a small test file to be able to consistently check for errors and functionality."}, {"post_id": 9667, "ts": "2026-06-16T02:27:43Z", "hours": 3.6628, "text": "Devlog 04 This was a big change in the metadata retrieving/handling. Last devlog I explained how the new restrictions on the Spotify API made it difficult to fetch the metadata, so I had to use the public oEmbed API. This didn’t give much information and was hard to work with. After researching some more I found a python package that does the metadata fetching for me, “SpotifyScraper”. this package takes in a spotify url (which the user will be providing), and can get information like song names, artists, duration, etc. This was very useful for me when coding the metadata functions. On top of this it supports playlist and album inputs as well, which is great for future updates. I spent this time rewriting the metadata retrieving functions and cleaning everything up. I removed a few redundant functions and introduced proper error messages."}, {"post_id": 9279, "ts": "2026-06-15T16:04:31Z", "hours": 2.2303, "text": "Devlog 03 After getting the link cleaner to work, I wanted to use the Spotify API to get the metadata of the song. The problem with this is that Spotify introduced heavy limitations on its API earlier this year. Because of this I had to fallback to the Spotify oEmbed, which gives only provides the song name. I am still researching for more options."}, {"post_id": 9003, "ts": "2026-06-15T00:31:15Z", "hours": 3.3114, "text": "Devlog 02 This took a while, but I was able to make the program that strips the input down to only the Spotify link. This ensures that (for the most part) that only the Spotify link gets used, and not any other whitespace/extra characters that might have appeared. It took a while because I was researching and learning how to use the ‘re’ library in Python, and it took some trial and error/debugging to get the logic to work. How this works; The user inputs into the text field First the type of track gets identified (single track, playlist, album) Then it uses the ‘re’ library to detect the pattern of Spotify URLs and URIs. This ensures that the Spotify track is actually valid. It then uses the ‘.group()’ function to capture the matching section out of the input Finally the functions are checked to ensure everything is valid, then the type of track and song url are returned."}, {"post_id": 8718, "ts": "2026-06-14T14:15:06Z", "hours": 0.7378, "text": "Devlog 01 This is the initial commit for the myMusic project. I created the file system locally, then opened the project inside IntelliJ Idea. I kept things simple and only introduced a README for now. I ran into a few problems when pushing to GitHub. Mainly, the .gitignore was being placed inside a .idea folder (I think because I was using IntelliJ). Because of this I had to go back into the IDE and move the .gitignore into the main branch and not into a subfolder."}]...
|
Title: myMusic by @cluelessfr | Stardance
Devlogs Title: myMusic by @cluelessfr | Stardance
Devlogs:
Devlog 01 This is the initial commit for the myMusic project. I created the file system locally, then opened the project inside IntelliJ Idea. I kept things simple and only introduced a README for now. I ran into a few problems when pushing to GitHub. Mainly, the .gitignore was being placed inside a .idea folder (I think because I was using IntelliJ). Because of this I had to go back into the IDE and move the .gitignore into the main branch and not into a subfolder.
Devlog 02 This took a while, but I was able to make the program that strips the input down to only the Spotify link. This ensures that (for the most part) that only the Spotify link gets used, and not any other whitespace/extra characters that might have appeared. It took a while because I was researching and learning how to use the ‘re’ library in Python, and it took some trial and error/debugging to get the logic to work. How this works; The user inputs into the text field First the type of track gets identified (single track, playlist, album) Then it uses the ‘re’ library to detect the pattern of Spotify URLs and URIs. This ensures that the Spotify track is actually valid. It then uses the ‘.group()’ function to capture the matching section out of the input Finally the functions are checked to ensure everything is valid, then the type of track and song url are returned.
Devlog 03 After getting the link cleaner to work, I wanted to use the Spotify API to get the metadata of the song. The problem with this is that Spotify introduced heavy limitations on its API earlier this year. Because of this I had to fallback to the Spotify oEmbed, which gives only provides the song name. I am still researching for more options.
Devlog 04 This was a big change in the metadata retrieving/handling. Last devlog I explained how the new restrictions on the Spotify API made it difficult to fetch the metadata, so I had to use the public oEmbed API. This didn’t give much information and was hard to work with. After researching some more I found a python package that does the metadata fetching for me, “SpotifyScraper”. this package takes in a spotify url (which the user will be providing), and can get information like song names, artists, duration, etc. This was very useful for me when coding the metadata functions. On top of this it supports playlist and album inputs as well, which is great for future updates. I spent this time rewriting the metadata retrieving functions and cleaning everything up. I removed a few redundant functions and introduced proper error messages.
Devlog 05 This is a pretty small update, all I did was add a small test file to be able to consistently check for errors and functionality.
Devlog 06 Major Update: Now added YT-DLP to the project. Now whenever you put in a valid link you get more than just the metadata. You also get the top 5 best matches from YouTube Music. This took a while because I had to learn to properly call and use the YT-DLP package in python. I created 3 helper functions. The first created the search query using the metadata, the second returned the search results, and the last one formatted and returned the results. I created one last function as a wrapper, such that when I passed in the metadata it returned the YouTube Music search results. When calling yt_dlp.YoutubeDL(), I got a type error when passing the parameters. This was because the package expected its own datatype, while I was simply passing a dictionary. I was able to fix this by setting the type to “Any” when passing in the argument. I also changed main.py to include the YouTube search results. Now, whenever you pass in a Spotify link you get the song metadata as well as well as the top 5 best matches from YouTube Music.
Devlog 07 The program now automatically uses YT-DLP to download the best match found. This works by using YT-DLP’s build in “Download” method. I pass in the number 1 match found by YT-DLP (built in the last devlog), and it downloads it to the users default “Downloads” folder. This is a major step in the project, and I am almost ready to ship the first version.
Devlog 08 Introduced FFMPEG to the project to be able to convert downloads from .webm to .mp3 files. Also change the song title to be the title of the song. Introduced a file check to ensure file names are valid and accepted by Windows.
Devlog 09 Simple update, but it now uses Mutagen to add track name, artists, and album name to the downloaded files.
Devlog 10: Added app.py and introduced a GUI window using Custom Tkinter. Now when users run app.py they see a new desktop window open up, see a text box and a download button. Once they paste in a Spotify link they see status messages like “Downloading”. At the end they also see the downloaded path. On top of this if there are any errors during the download (like fetching metadata), this also displays as a status message. This took a little bit because I get to get familiar with Custom Tkinter, add another function that gets called by the button, and add some safeguards/quality of life updates. The main safeguard was disabling the download button while the song was downloading, which ensured the user didn’t spam processes. The quality of life update was that the download path now wraps the text to multiple lines if the path is very long.
Devlog 11: I added a preview button to the GUI so that users could see the song details and confirm they were right before downloading the song. also prepared for packaging this file into an executable (.exe).
Devlog 12: I compiled the app into a .exe, updated the readme, and pushed the first version to git. I ran into some issues when compiling the app. Specifically after the initial compiling YT-DLP couldn’t see the location of FFMPEG. Because of this I had to update the “get_app_root.py” file so it accounted for the file changes when compiling.
Devlog 13: I added an installer .exe file, added screenshots to the readme, and added a new release on GitHub. Configuring the installer was a little hard, as I was new to this process and didn’t know where to start. I used Codex to help me figure out that I could use a program called Inno. This handled the installer file, uninstall, as well as configuring it with Windows. Codex guided me through how to set that up, and eventually I got everything working. Finally I created a new version on Git and pushed everything.
Devlog 14: I have implemented two new features. First I implemented a feature that allows users to switch the directory where songs get downloaded. This took some time, but I was able to get it in the end. It works by creating a new button which opens a folder picking dialogue. The path that the user seclects inside this dialogue then gets saved to a local json file. Everytime the user changes the path it gets saved to the json, which allows the program to always open up the last directory selected by the user. I had to implement some checks to ensure that the program would work even if the json file was missing or corrupted. The second feature is more of an update. The static “Downloading” progress message is now updated with real time info on what the program is doing. The next step would be adding a dynamic progress bar.
Devlog 15: Improved song selection algorithm, so it selects the next best track if the first selection is invalid. Before if the first track selected by YT-DLP didn’t work/was invalid, then the whole program would fail. Now it moves on to the next if the first one doesn’t work. I also update the progress messages, so it shows which match it is trying.
Devlog 16: Simple update, but I added a new error message to account for a yt-dlp botting error. Now, when YouTube sends an error saying that the request was blocked due to botting being suspected, it sends a properly formatted error message instead of the raw yt-dlp text. I retested everything to ensure the previous functionality of the app remained the same.
Devlog 17: Did some major code cleanups. No new features, but made the code more efficient. Also reorganized some files. The hard part was keeping the functionality the same while trying to make the code non-repetitive and more efficient. I also tried to fix any warnings that were present in the code that were caught by the IDE.
Devlog 18: I implemented a way to start scoring the candidates returned by YT-DLP. This ensures that even if the first candidate returned is not the best, the program can automatically filter out the bad ones using key words and ensure the best candidate is always selected. I have only coded this function for now, and I have to wire it in to the real app soon.
Devlog 19: Implemented the ranking feature from the last devlog. Now, the best candidates are ranked in order from best to worst, and that is the order in which they are downloaded.
Devlog 20: Added the Spotify OEmbed fallback. Now even if the SpotifyScraper python package fails we have a fallback to get as much metadata as we can. This wasn’t that hard, as I already had the file from a previous time. The hard part was accounting for all the different cases, such as the title being missing or an empty string. I had to account for all of those while integrating the new file.
Devlog 21: Now added real YouTube (YT) to the match finding instead of just YouTube Music (YTM). Before the songs were found only on YTM, but I realist that normal YT has a larger list of songs, so I decided to add that to the algorithm as well. Now, the program takes 3 songs from YTM and 3 songs from YT, and uses the ranking function I created before to sort them from best to worst. Then the program starts by trying to download the best match. If it can’t, it goes through the list until if finds one it can download. If none of them download, then it sends an error message. One thing with this step was that I tried not to repeat big chunks of code, as a lot of this was similar to the original YTM downloading method.
Devlog 22 This update was about further increasing the matching strength. Before the program would automatically download the highest ranked candidate, even if it was very low. Now the app downloads the highest ranked candidate only if its ranked above a certain thresh hold. If there are no qualifying matches then the app simply returns a no matches found error. This wasn’t that complicated, but I had to modify a few functions so that the score was returned properly and in a usable format.
Devlog 23: Today I added the feature that embeds cover art into the mp3 files. To do this I had to first use the requests library in Python to get the image itself. Instead of downloading the image I kept it in memory using the ‘io’ library. This made the metadata tagging safer and faster. Finally the app uses mutagen to embed the cover art into the mp3 file. I used a try and except loop, which ensures that even if the cover art adding fails the mp3 file still gets returned, just without the art.
Devlog 24: I have started adding implementations that checks for the latest version of the app from github. It uses the github API endpoint for my specific project, then reads the json to get any version information. Using that we can compare the current version to the latest version on the github to see if there are any updates available. Currently I have only created the function and am yet to implement this feature into the actual app/GUI.
Devlog 25: This update was about implementing the update checker from the last devlog. Now there is an in-app button that allows you to check for new updates. The implementation was similar to all the other buttons and didn’t take too long because I already had the function ready. The next step is to allow the app to actually download and install the update, instead of just pointing out it is available.
Devlog 26: Added a function to help with auto-downloading new updates. I haven’t hooked it up to the UI yet, but that is my next step. The function takes in the name of the installer and the link to download it. It first downloads the installer to a temp file, then once everything is good it saves it to a real executable.
Devlog 27: This is a pretty major update. The myMusic can now automatically download and install updates, without the user having to go and download the github repository. Before, the user would manually have to go and download the installer from github, and set it up like a completely new install. Now, the app itself has a “Check for Updates” button. This button checks the github for the latest version, and if there is a newer version available it gives the user an option to download and install that. If they change their mind during the download, there is a cancel option as well. This works by first getting the github version (latest), then seeing if the current app version matches that. If it does, the app is up to date. If not, then the app can fetch the executable using the github API and automatically download the latest installer. On top of this some inno setup tools allow the app to close the app, install the new version, and reopen the app by itself. The only caveat is that this only works starting from v1.2.0. This means that if you have an older version you will have to manually download v1.2.0 in order to start getting automatic app updates.
Devlog 28: Based on feedback from my first ship, I have decided to introduce Linux support. I thought it would be easy, but it turned out to be a little harder than I thought. The first thing I had to do was rewrite some of the Path code that saves the users download directory. This is because Linux and Windows have different file systems, and I had to account for both. Then came the hard part, Packaging. For ARM, I decided to do this on my Raspberry Pi, where I downloaded the project files from git, downloaded the OS specific FFMPEG and Deno, then repackaged the app as a .tar.gz. I decided to do it this way because this is sort of simply an experimental release. For x64 I decided to use GitHub Actions, which allowed me to download the dependencies and compile without having to spin up a new Virtual Machine. I also decided to keep this as a .tar.gz. Later, once I get more feedback about the Linux versions, I am planning to release a more universal app package (.flatpak). I also had to change the update checkers, because each OS version has to check its own corresponding file. In the end this was a very unique experience and I learned a lot of things about packaging apps on Linux.
Devlog 29: This is kind of a messy devlog, so I’ll lay it out as best as I can. First, I update the UI in preparation for playlist/album support. Before it was three static text fields that could only display one song at a time. Now I replaced it with a scrollable frame, with the ability to add more sections inside the frame for more songs. This frame also has the ability to display metadata. I also introduced a status message that shows different messages and colors depending on the status. While I was doing that (and I am not done with it), I decided to stop in the middle and fix another bug. This bug (that was reported by other people as well as my testing) prevented good matches from ranked properly. This was a problem with how I compared the titles in my ranker. To fix this I added two new functions, one that normalizes the candidate title, and another that normalizes the actual Spotify song name (mainly to exclude features and get just the song name). To do this I messed around a lot with regex patterns, so I learned a lot. Now I have to go back and continue working on the new UI for playlists and albums.
Devlog 30: I FINALLY implemented playlist and album support. At first I thought it would be simple, just looping though each song in the playlist/album. Oh was I wrong. First I had to add two more methods that looped though each song, one for playlists and one for albums. There had to be two different ones because each returned metadata differently. Then I had to kind of change the format of the whole thing, because I had to store all of the songs in a list, but currently I was only returning dictionaries from all of my methods. After getting all of that sorted out I had to actually fix the GUI/downloading part. I had to update the downloading method to handle playlist/album links, then I had to properly handle all of the status message for each song (“Ready”, “Downloading”, “Failed”). Finally I had to work on fixing the bugs I had introduced and handling the edge cases. After all of that I FINALLY had playlist and album support. One thing that was sorta tough was handling the status for each track individually. Before I was just looping through the entire list and setting all of the statuses to the same thing, but I was able to create a new method and change each song status as it was being downloaded, not for every song as a whole.
Devlog 31: This devlog was mainly focused on the efficiency and speed of updating the app. Before the data would come in really small packets, meaning the cpu would have to write to the drive about 130,000 times in total (I know 😭). I adjusted this so it now comes in larger packets so the cpu doesn’t have to do more work. I also adjusted the compression and a few other Inno Setup settings (number of threads, etc.) to make the app more efficient in general. Another issue that I found is that once the app updated (specifically in Windows, idk about other platforms) the settings app would still show the older version for some time. This was an issue with the timing, so I had to adjust some of the delays to get it to work properly. Overall I think this is a pretty good update.
Devlog 32: (sorry for the late post) I have been working on a really cool feature for the app. Basically what I am trying to do is integrate the myMusic pipeline into the windows Spotify app itself. When you right click a playlist or album, there will be a menu that pops up. Usually for normal Spotify users (not on premium) there will be a greyed out download button. What I am trying to do is two things: add a download button for tracks (because there isn’t one right now), and make the playlist/album button actually work. Right now what I have accomplished is adding a new button for the track and making the playlist/album button clickable. I was able to do this by using Spicetify and its framework. Because I already have it installed on my computer I am using it to test everything out but later I will bundle it with my app. What I did was build a custom Spicetify extension (I had to learn JavaScript) that creates a new button. I was able to make the original playlist/album button work because it was only “aria-disabled”, not actually disabled. This means that it was only disabled at the UI level, but Spotify still recorded clicks. By applying some UI changes I was able to make the button look enabled and still record clicks. My next step is to actually hook this up to the Python script. I think this is a really cool feature.
Devlog 33: The app is now able to understand and automatically download any received links. Now the problem is that Spotify isn’t able to send any normal requests to via the computer. Because of this I need to find a way for Spotify to send and get data. I know that Spotify (using Spicetify) can send and get http requests. Because of that I am planning to use FastAPI and a local http server to be able to send and get data so the app can automatically download tracks. I will ensure to keep the server in a high index to ensure it doesn’t get in the way of any other local servers.
Devlog 34: I have been working on creating a queue for the requests. This ensures that the user can download multiple songs at once without having to wait for the previous ones to be finished. So far I have been able to create a request id for each request. The app can update the attributes of each request, such as its status, and error message. On top of this once a request is completed the app also automatically removes that request.
Devlog 35: The app now creates its own server on a very distant and far port so that your other local host stuff doesn’t get affected. I did this with uvicorn and threading, so that creating the port doesn’t make the app freeze. With this functionality the app can get the requests made inside Spotify and automatically download them. The next step is to get the app to report the statuses of the download jobs (queued, downloading, completed, failed, etc.). Then I would actually have to connect both parts, let Spotify send messages and the app receive the message.
Devlog 36: I am almost done with the first phase of the integration. When the download button is clicked inside of Spotify, Spicetify intercepts it and now posts a request to the open web server. Then the python script gets notified of that request, decodes it, then automatically starts downloading the song/playlist/album. The only thing is that the myMusic app has to be open while doing this, but I will remove that requirement in the future (not now). The next step would be to add status reports to Spotify so that the user knows what the status of their download is.
Devlog 37: I am very close to shipping now. I added the Spotify status/progress update messages, so now you can see when the tracks have finished downloading. I also fixed three (kinda major) bugs. First of all there was an error when searching for the songs on YouTube/YouTube Music. Basically what happened was that the title didn’t follow the same ASCII conventions that was used by YouTube. Because of this the app would reject good title matches even though they were the same. This produced quite a few errors, especially when trying to download songs with apostrophes. The second error I fixed was the some songs would automatically have the clean version downloaded. To fix this I switched to the ytmusicapi python package. This package also returned whether the song was explicit or not. Because of this I was able to check whether or not the song was intended to be that way, and if not I could prevent that match from being downloaded. I did have to edit a few functions to accept the new format, but in the end everything worked. Third I fixed a simple error that messed up the searching. This time it wasn’t really a bug, but instead an edge case that I missed. I was catching keywords like “feat.” and “featuring”, but I didn’t catch words like “From (and tv show, etc.)”. Because of this some matches were getting left out. I fixed this by adding another regex pattern that removes this as well.
Devlog 38: I worked on functions that helped install the Spicetify extension into the Spicetify configuration. I had to ensure Spicetify was installer, had to find its path, had to find its extensions path, then finally copy over the extension. I also added system tray behavior and multiple instance detection for the app, so that now when you close the app it doesn’t close but instead goes to the system tray. This allows the Spotify integration to work even if the app itself isn’t visible. The multiple instance detection ensures the app runs properly, and ensures that the app doesn’t try to use the same http port twice, resulting in errors. This did take a while but now all I have to do is create guards for Linux, so that the Spotify integration only works on Windows and doesn’t create unexpected errors on Linux.
Devlog 39: I was finally able to get the Linux guards in place, and also packaged the new builds and released them to GitHub has a new version. The guards were mostly simple, as they were just a few checks that asked what operating system the user was on. And depending on that it decided whether or not to install the Spicetify extensions.
Ships:
I made myMusic, a Windows desktop app that takes a Spotify track link, previews the song details, finds a matching audio result, downloads it, converts it to MP3, and saves it with basic metadata tags. The hardest part was turning it from a local Python project into something other people can actually run: bundling FFmpeg, building the Windows executable, creating an installer, and writing clear install/testing instructions. These were all new steps that I wasn’t familiar with before, so I had to heavily research them and get familiar with them before shipping. I am proud that I was able to get it working as a real, bundled Windows desktop app, instead of a small project that runs only on my computer. To test it, use the Try Project link, download the v1.0.1 Windows installer, install it, open myMusic, paste a Spotify track link, click Preview Song Details, then click Download. The finished MP3 should appear in your Downloads folder. Windows may show SmartScreen because the app is unsigned; the release notes explain how to continue.
I made myMusic, a Windows desktop app that takes a Spotify track link, previews the song details, finds a matching audio result, downloads it, converts it to MP3, and saves it with basic metadata tags. This is Ship #2 of my project. There have been a quite a few changes since my last ship, so let me list them all: First I added a folder-picking dialog. This allows the user to change the directory their songs are downloaded to, instead of being forced to always download to the “Downloads” directory. The app also saves the last chosen directory, so even if you close and reopen the app the directory is still saved. I then bundled Deno into the app, which helps yt-dlp solve JS challenges. Then I added the Spotify oEmbed metadata as fallback metadata if the SpotifyScraper python package fails. I also added YouTube as a partner with YouTube Music to get the best results from both platforms. I then a ranking system for the songs. The program adds and removes points from the top 6 matches from both platforms based on a few criteria, then it tries downloading from highest to least ranked. Then I also started embedding cover art. The app now takes in the cover art link, streams it, then writes it to the audio file. Next I added in-app update checking. The app can search the github repo for the latest version, checks to see if it is newer, then can automatically download and installer it. I also polished up the UI so that the controls and labels are more organized. Finally, I added Linux x64 and Linux ARM64 support. This has the same behavior as the Windows app, but the dependencies are now installed natively on that platform, which makes the app run more reliably on Linux. The current latest version at the time of this ship is v1.3.0.
I made myMusic, a Windows/Linux app that allows you to download your favorite songs. It works by searching YouTube/YouTube music for videos of your song. Then, using yt-dlp, it is able to download your song as an mp3 file. Finally it adds all of the metadata, allowing you to properly listen to your music offline. This is ship #3 of my project, so let me explain all of the changes since the last ship: First I finally added support for playlist and album downloads. Now instead of putting in each separate track individually you can combine it into a playlist and download that all together. For this I also had to update the GUI in order to fit all of the song information together. Second I improved the song searching and reliability. I made things consistent with how YouTube expects them (ASCII, Unicode characters, etc.). I also combine YouTube Music and YouTube candidates, so you get the best of both worlds. The app also tries multiple candidates before declaring that track a fail. Third I introduced explicit-version matching. Before, you would sometimes get the clean version of an explicit song. To fix this I switched to ytmusicapi, which allows me to compare matches to determine which one fits the criteria the best. The API also allows me to see whether or not the song is clean, which makes matching easier. Fourth (and probably the biggest update) I was able to add a Spicetify extension with the app. Because of this you are now able to download your favorite songs directly from the Spotify windows app. It reuses Spotify’s native download button rows, which make it easy to download your songs. It also preserves native behavior if you are already on Spotify Premium. It also shows notifications about the status of your download. This is only available on Windows. Fifth in order to make the Spotify integration work, the app now opens up a FastAPI/Uvicorn server bound to 127.0.0.1:18492. I chose a far away port in order for it not to affect any other local host processes. Sixth I also added background behavior for the app. This keeps the app open in the background without it being open on the gui (you will still be able to see it in your system tray). This allows the Spotify integration to run seamlessly without interfering with your every day work. Seventh I greatly improved the in app updater speed. Before it would greatly lag your computer because the chunk sizes were so small and it had to do a lot of writes to your disk. Now I increased the chunk size, and updated the packaging configurations to further boost the download speed and app size. These were all the main updates I did to my app, hope you like it!...
|
1792997767.216144
|
1793084167.216144
|
|
2006
|
Flob (a platformer) by @potheterr | Stardance
|
potheterr
|
2
|
103.68
|
1489
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-03T13:26:56Z", "hours": 53.0, "multiplier": 17.22, "payout": 912, "blessing": "neutral", "text": "Welcome to FLOB 0.2.0.0!! This is the second of three updates I’d like to get out before the end of Stardance which will more than likely be the last update. This ship, I focused a lot on making new systems and expanding on old ones, all giving me unique challenges. I’m not the proudest of how the code turned out, but everything works for the most part so I will take it and run. I’ve also added a little tiny bit of a story that will be continued through my other projects I make in the future, which I am very excited for. Overall, this update was extremely fun to work on and I’m so happy with the way it turned out. That being said, the macOS and Linux builds of the game are UNTESTED, so if there are any huge issues find some way to let me know ASAP. Enjoy!", "repo": "https://github.com/JamesCorradinoGit/flowFreePlatformer", "demo": "https://potheterr.itch.io/flob"}, {"ship_num": 2, "ts": "2026-07-13T03:52:13Z", "hours": 50.0, "multiplier": 11.46, "payout": 577, "blessing": "neutral", "text": "This is a DEMO VERSION of my first published game, Flob! There are so many edge cases and bugs that I need to fix which is by far going to be the hardest part of this challenge, but I’m ready for it. Hopefully you all enjoy! (A video of the game is attached on the itch page).", "repo": "https://github.com/JamesCorradinoGit/flowFreePlatformer", "demo": "https://potheterr.itch.io/flob"}]...
|
[{"post_id": 45742, "ts": "202 [{"post_id": 45742, "ts": "2026-08-12T13:04:25Z", "hours": 0.6797, "text": "Hey everyone! Just reporting that I’ve been really burnt out with the game and I think I might call it here. I’ll probably return to it in future but as of right now I think it’s in a solid enough state. Thank you all!"}, {"post_id": 39756, "ts": "2026-08-02T22:33:00Z", "hours": 6.1347, "text": "Hello everyone! I’ve been much more focused on music and sounds over the last 2-3 days and I’m confident that there’s enough new content for a new ship. As for future content, I think 2 more worlds will be enough to round out the game. See y’all whenever I ship the update!"}, {"post_id": 37981, "ts": "2026-07-31T02:25:03Z", "hours": 8.7875, "text": "Hello everyone! Over the last two days, I’ve been working on new levels and many more features. My current issue is that I have a major logic issue with the moving platforms that I’m going to try to spend tomorrow fixing. See y’all soon!"}, {"post_id": 36561, "ts": "2026-07-28T19:13:31Z", "hours": 8.85, "text": "Hello everyone! Over the last couple of days I’ve been implementing some pretty cool light related stuff. I’ve also recoded many of the button systems and interactions with them because my coding of the systems originally were not my proudest work. (Pretty exciting stuff) In other news: I would like to reiterate that none of my work on this project or its related stuff (devlogs, READMEs, etc.) has been assisted with AI. I do not believe that the technology is fit for a majority of creative spaces and the day I use generative AI on one of my projects is long past the day I die. Until next time!"}, {"post_id": 34925, "ts": "2026-07-26T01:12:23Z", "hours": 4.9117, "text": "Hello again everyone! Over the last couple of days, I’ve been focusing on finishing up world 1 levels and doing lots and lots of general polish. However, now I am at an impasse. I need your help! If you’ve been following the project or are just passing by, please give your answer! Should I ship the new update as is and continue to ship small updates, or should I add another world or two and have a huge major ship? See y’all around!"}, {"post_id": 33861, "ts": "2026-07-24T03:51:47Z", "hours": 8.0322, "text": "Hello everyone! Lots more work has been done and I’m very very happy with the way things have been going, especially with reworking the tutorial text / instructions (which were mainly done in an hour on original release). Check out the video below for some tutorial revamp goodies. In other news: Flob is officially a super star project!!! This was so unexpected and I am so very honored to receive the super star award! There are so many other phenomenal projects that I personally believe deserve it way more than I do, but despite that I am so eternally grateful that I’ve made something people enjoy and are looking forward to full release of. See y’all again soon!"}, {"post_id": 32036, "ts": "2026-07-20T22:19:45Z", "hours": 8.0317, "text": "Hello everyone! I wasn’t expecting another devlog so soon, but here we are! I’ve had an obnoxious amount of free time so instead of doing real important stuff I’m going back and updating some UI to make it not look as “rushed”. Hopefully after I’m done with the slog that is user interface, I can return to gameplay!"}, {"post_id": 30683, "ts": "2026-07-18T13:47:51Z", "hours": 8.2372, "text": "It has been a long, long week for me over at Flob Inc. The 13th is when I got my wisdom teeth removed, so I got lots of time to reflect on my project so far. Speaking of which, Thank you everyone for the feedback after demo ship #1! It was so awesome seeing lots of good stuff to keep in mind for future updates along with my future projects. For now, here’s a glance at one of the new levels! See y’all soon!"}, {"post_id": 27498, "ts": "2026-07-13T03:38:28Z", "hours": 3.0597, "text": "Everything is complete…"}, {"post_id": 26171, "ts": "2026-07-10T20:21:24Z", "hours": 5.6414, "text": "For the last three or so days, I’ve been in audio burnout hell which reminds me that I am not cut out to be a sound engineer. That being said, the demo now has (mostly all) sound effects and I just need to make 2 more music tracks! After the release of the demo, I’ll most likely get the help of someone who knows what their doing, but for right now I say it passes. Expect a ship soon!"}, {"post_id": 24226, "ts": "2026-07-07T17:26:34Z", "hours": 6.4161, "text": "Ever since I almost ruined my project twice, I’ve started to work on lots and lots of polishing for my game! I’ll show off more whenever I have more finished, but for now take a look at this pseudo-screensaver I made (which is surprisingly performant) See y’all soon!"}, {"post_id": 21836, "ts": "2026-07-03T23:37:48Z", "hours": 0.6083, "text": "Logging again to make sure I’m not fully messing everything up. Had to rollback everything AGAIN because I am a stupid silly human being (my day is going phenomenally)"}, {"post_id": 21732, "ts": "2026-07-03T20:30:02Z", "hours": 3.9531, "text": "Today I almost ruined my entire project!! I accidentally deleted something that I thought was a leftover placeholder but it turns out it was the lynchpin holding my entire project together (which is funny because I only use it in one place pictured below) but all has been saved thanks to version control! Logging my time now just in case this breaks the godot plugin :P"}, {"post_id": 19579, "ts": "2026-06-30T22:28:47Z", "hours": 6.3931, "text": "Finally a devlog where I have interesting things to share! Over the last three or four days, I’ve highkey lowkey been doing way too much work with UI. Here is a cursory look at what I’ve done so far. A lot of the project is still unfinished (such as the options button doing nothing right now), but I’m happy I set up this baseline for myself. Almost everything when it comes to level selection, creation, and potential future additions are completely modular which means my life will be significantly easier as I wrap up this DEMO of the game. I will also be going back and edit my past devlogs to better represent what I’ve actually been up to rather than some terse statements!! See you soon!"}, {"post_id": 15905, "ts": "2026-06-25T21:00:53Z", "hours": 8.8308, "text": "It’s been more than a week…….. I loveee ui so so much…… For real though, I’ve been spending a lot of time on the UI of the game and how the general menu feel is. Everything shown is a prototype and is destined to change."}, {"post_id": 10035, "ts": "2026-06-16T16:25:49Z", "hours": 3.5228, "text": "There’s been no actual devlog updates for a week because I’ve been making the main menu music for the game! Yes, I know it is very early in the process to be worrying about the sound of the game, but I needed a break from coding and building so as to not get burnt out; however, now that the music is done I will get back to the coding magic!!"}, {"post_id": 5723, "ts": "2026-06-09T16:55:10Z", "hours": 4.7789, "text": "Over the last week, I feel as though I’ve figured out the main systems to get them in a position good enough to start real level design. The circle on the left is the way the PLAYER NODE completes their half of the whole level, with the other half being the puzzle solving with grids. This current first level contains no grids as it is a way to warm the player up to the movement of the game, but the rest of the game will almost always contain a grid puzzle that needs to be completed."}, {"post_id": 2294, "ts": "2026-06-04T18:16:27Z", "hours": 1.0494, "text": "Core update!! Core update!! Grids can be completed now! The grid system now has lots of customizability as there is the potential of custom grid edges (they’re all currently walls, but the possibilities are nearly endless) along with the interior of grid spaces, which are currently being used to spawn the line nodes and receivers which the player can interact with."}, {"post_id": 2101, "ts": "2026-06-04T13:04:51Z", "hours": 1.1253, "text": "Hello again again!! I’ve slightly updated the player movement so it is not as static as the default Godot player movement defaults. The movement still needs an immense amount of polish as I want to add variable jump heights, a proper state machine, and lots and lots of customizability in terms of how the player functions. Now that I have a working prototype of movement, I will focus on level creation and finishing up grid systems."}, {"post_id": 1196, "ts": "2026-06-03T01:37:36Z", "hours": 1.3769, "text": "I have returned with amazing news of modularity. A majority of actual grid work is done! This current rendition of the grids are fully modular in that you can adjust the X size and Y size to form a rectangular grid. Time for not default player control!"}, {"post_id": 984, "ts": "2026-06-02T19:22:12Z", "hours": 1.8433, "text": "Hello again! Good news, grid snapping works!! This means that one of the fundamental halves of the game is now fairly operational minus a few edge cases (that I am aware of). Next step is immediate grid fixes and the ability to actually detect a solved grid."}, {"post_id": 574, "ts": "2026-06-02T02:09:06Z", "hours": 1.7192, "text": "First one of these! Game progress is going fairly well (granted I basically just started outside of a line system I had made a week prior) as I just started making many of the core systems not be held together with duct tape and spaghetti."}]...
|
Title: Flob (a platformer) by @potheterr | Stardan Title: Flob (a platformer) by @potheterr | Stardance
Devlogs:
First one of these! Game progress is going fairly well (granted I basically just started outside of a line system I had made a week prior) as I just started making many of the core systems not be held together with duct tape and spaghetti.
Hello again! Good news, grid snapping works!! This means that one of the fundamental halves of the game is now fairly operational minus a few edge cases (that I am aware of). Next step is immediate grid fixes and the ability to actually detect a solved grid.
I have returned with amazing news of modularity. A majority of actual grid work is done! This current rendition of the grids are fully modular in that you can adjust the X size and Y size to form a rectangular grid. Time for not default player control!
Hello again again!! I’ve slightly updated the player movement so it is not as static as the default Godot player movement defaults. The movement still needs an immense amount of polish as I want to add variable jump heights, a proper state machine, and lots and lots of customizability in terms of how the player functions. Now that I have a working prototype of movement, I will focus on level creation and finishing up grid systems.
Core update!! Core update!! Grids can be completed now! The grid system now has lots of customizability as there is the potential of custom grid edges (they’re all currently walls, but the possibilities are nearly endless) along with the interior of grid spaces, which are currently being used to spawn the line nodes and receivers which the player can interact with.
Over the last week, I feel as though I’ve figured out the main systems to get them in a position good enough to start real level design. The circle on the left is the way the PLAYER NODE completes their half of the whole level, with the other half being the puzzle solving with grids. This current first level contains no grids as it is a way to warm the player up to the movement of the game, but the rest of the game will almost always contain a grid puzzle that needs to be completed.
There’s been no actual devlog updates for a week because I’ve been making the main menu music for the game! Yes, I know it is very early in the process to be worrying about the sound of the game, but I needed a break from coding and building so as to not get burnt out; however, now that the music is done I will get back to the coding magic!!
It’s been more than a week…….. I loveee ui so so much…… For real though, I’ve been spending a lot of time on the UI of the game and how the general menu feel is. Everything shown is a prototype and is destined to change.
Finally a devlog where I have interesting things to share! Over the last three or four days, I’ve highkey lowkey been doing way too much work with UI. Here is a cursory look at what I’ve done so far. A lot of the project is still unfinished (such as the options button doing nothing right now), but I’m happy I set up this baseline for myself. Almost everything when it comes to level selection, creation, and potential future additions are completely modular which means my life will be significantly easier as I wrap up this DEMO of the game. I will also be going back and edit my past devlogs to better represent what I’ve actually been up to rather than some terse statements!! See you soon!
Today I almost ruined my entire project!! I accidentally deleted something that I thought was a leftover placeholder but it turns out it was the lynchpin holding my entire project together (which is funny because I only use it in one place pictured below) but all has been saved thanks to version control! Logging my time now just in case this breaks the godot plugin :P
Logging again to make sure I’m not fully messing everything up. Had to rollback everything AGAIN because I am a stupid silly human being (my day is going phenomenally)
Ever since I almost ruined my project twice, I’ve started to work on lots and lots of polishing for my game! I’ll show off more whenever I have more finished, but for now take a look at this pseudo-screensaver I made (which is surprisingly performant) See y’all soon!
For the last three or so days, I’ve been in audio burnout hell which reminds me that I am not cut out to be a sound engineer. That being said, the demo now has (mostly all) sound effects and I just need to make 2 more music tracks! After the release of the demo, I’ll most likely get the help of someone who knows what their doing, but for right now I say it passes. Expect a ship soon!
Everything is complete…
It has been a long, long week for me over at Flob Inc. The 13th is when I got my wisdom teeth removed, so I got lots of time to reflect on my project so far. Speaking of which, Thank you everyone for the feedback after demo ship #1! It was so awesome seeing lots of good stuff to keep in mind for future updates along with my future projects. For now, here’s a glance at one of the new levels! See y’all soon!
Hello everyone! I wasn’t expecting another devlog so soon, but here we are! I’ve had an obnoxious amount of free time so instead of doing real important stuff I’m going back and updating some UI to make it not look as “rushed”. Hopefully after I’m done with the slog that is user interface, I can return to gameplay!
Hello everyone! Lots more work has been done and I’m very very happy with the way things have been going, especially with reworking the tutorial text / instructions (which were mainly done in an hour on original release). Check out the video below for some tutorial revamp goodies. In other news: Flob is officially a super star project!!! This was so unexpected and I am so very honored to receive the super star award! There are so many other phenomenal projects that I personally believe deserve it way more than I do, but despite that I am so eternally grateful that I’ve made something people enjoy and are looking forward to full release of. See y’all again soon!
Hello again everyone! Over the last couple of days, I’ve been focusing on finishing up world 1 levels and doing lots and lots of general polish. However, now I am at an impasse. I need your help! If you’ve been following the project or are just passing by, please give your answer! Should I ship the new update as is and continue to ship small updates, or should I add another world or two and have a huge major ship? See y’all around!
Hello everyone! Over the last couple of days I’ve been implementing some pretty cool light related stuff. I’ve also recoded many of the button systems and interactions with them because my coding of the systems originally were not my proudest work. (Pretty exciting stuff) In other news: I would like to reiterate that none of my work on this project or its related stuff (devlogs, READMEs, etc.) has been assisted with AI. I do not believe that the technology is fit for a majority of creative spaces and the day I use generative AI on one of my projects is long past the day I die. Until next time!
Hello everyone! Over the last two days, I’ve been working on new levels and many more features. My current issue is that I have a major logic issue with the moving platforms that I’m going to try to spend tomorrow fixing. See y’all soon!
Hello everyone! I’ve been much more focused on music and sounds over the last 2-3 days and I’m confident that there’s enough new content for a new ship. As for future content, I think 2 more worlds will be enough to round out the game. See y’all whenever I ship the update!
Hey everyone! Just reporting that I’ve been really burnt out with the game and I think I might call it here. I’ll probably return to it in future but as of right now I think it’s in a solid enough state. Thank you all!
Ships:
This is a DEMO VERSION of my first published game, Flob! There are so many edge cases and bugs that I need to fix which is by far going to be the hardest part of this challenge, but I’m ready for it. Hopefully you all enjoy! (A video of the game is attached on the itch page).
Welcome to FLOB 0.2.0.0!! This is the second of three updates I’d like to get out before the end of Stardance which will more than likely be the last update. This ship, I focused a lot on making new systems and expanding on old ones, all giving me unique challenges. I’m not the proudest of how the code turned out, but everything works for the most part so I will take it and run. I’ve also added a little tiny bit of a story that will be continued through my other projects I make in the future, which I am very excited for. Overall, this update was extremely fun to work on and I’m so happy with the way it turned out. That being said, the macOS and Linux builds of the game are UNTESTED, so if there are any huge issues find some way to let me know ASAP. Enjoy!...
|
1792994066.750957
|
1793080466.750957
|
|
19478
|
Searchuse 1.4.4 by @ai_zamden | Stardance
|
ai_zamden
|
3
|
135.0
|
1486
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-07T22:47:37Z", "hours": 33.0, "multiplier": 11.36, "payout": 340, "blessing": "neutral", "text": "Hey guys, this is my third ship for my turn-based strategy game Searchuse. A lot of you guys suggested to add a tutorial, so I made one, and now it’s a lot easier to figure out how to play the game! I hope you enjoy.", "repo": "https://github.com/aidenzma/Searchuse", "demo": "https://ai-zamden.itch.io/searchuse"}, {"ship_num": 2, "ts": "2026-07-17T01:35:02Z", "hours": 77.0, "multiplier": 14.75, "payout": 853, "blessing": "neutral", "text": "I’ve listened to the people and have tried to make as many improvements as I could. UI has been improved Art has been pixel-adjusted Controls are specified in the README Main Menu button has been added Searchuse is now available on Linux AND Searchuse is now available on BROWSER (itch.io, the demo link) So now everyone is theoretically able to try it! A large portion of my time was spent creating a neural network for the bot (that can only be experienced in Train Bot, there’s a hardcoded bot and a neural network bot.) (The neural network bot is still very inexperienced currently.) (Admittedly, Gemini helped me a lot with setting up that portion of the game.) For specific help in downloading the zips, visit the README.", "repo": "https://github.com/aidenzma/Searchuse", "demo": "https://ai-zamden.itch.io/searchuse"}, {"ship_num": 3, "ts": "2026-06-25T04:03:09Z", "hours": 25.0, "multiplier": 12.05, "payout": 293, "blessing": "neutral", "text": "I made a turn-based strategy game called Searchuse, where you search for and then use various items with different mechanics. A challenge in the process was getting all of the turn-based logic right. (For cooldowns and lasting effects, the timing can be surprisingly complicated to get down.) I’m proud that there aren’t any glaring bugs in the game right now. To play, move around using arrow keys, and press the buttons search or use. There are deeper mechanics you can learn, but the surface-level controls should be intuitive! Here’s the trailer: https://youtu.be/wL6j5aslFXA Join the Discord: https://discord.gg/NpBV6vHc7", "repo": "https://github.com/aidenzma/Searchuse", "demo": "https://ai-zamden.itch.io/searchuse"}]...
|
[{"post_id": 63898, "ts": "202 [{"post_id": 63898, "ts": "2026-09-07T22:44:08Z", "hours": 3.3097, "text": "I’m finished with the tutorial, so now you guys can easily learn how to play Searchuse!"}, {"post_id": 63059, "ts": "2026-09-06T17:21:51Z", "hours": 9.2094, "text": "I’m making a tutorial to teach new users how to play the game, as requested by feedback for my latest ship."}, {"post_id": 36775, "ts": "2026-07-29T01:24:16Z", "hours": 12.9503, "text": "I did a massive overhaul of the inner workings of the inventory system, changing the data tracking from only ints representing the itemIDs to structs which provide a container for data of items. I did this because I had to add individual item durability."}, {"post_id": 34389, "ts": "2026-07-25T02:19:17Z", "hours": 7.4644, "text": "After a long while, some new content is finally added to Searchuse. Introducing: Armor Piercing Rounds: Use with certain weapons to allow damage to be done as if the opponent were wearing no armor! Beretta+: An upgraded version of the Beretta, this weapon allows you to do damage the the enemy’s max health, a groundbreaking new mechanic added in this update. Fixed: Energy Orb edge bug: Now, the Energy Orb and other explosives will explode when hitting the edge of the map instead of not doing anything! Smoke vision bug: A small error in FOV rendering while in a smoked area was fixed. Factory edge bug: A visual glitch that resulted in Factory tiles peeking out from under the greyed out vision area was fixed."}, {"post_id": 29881, "ts": "2026-07-17T01:27:03Z", "hours": 1.3161, "text": "Searchuse is now available on Linux and Browser!"}, {"post_id": 29302, "ts": "2026-07-16T04:03:09Z", "hours": 7.9944, "text": "I’ve made major UI improvements to the game!"}, {"post_id": 26990, "ts": "2026-07-12T03:45:34Z", "hours": 10.4197, "text": "I’ve set up the system so that my hardcoded bot can train the neural network bot. This is gonna be fun!"}, {"post_id": 26063, "ts": "2026-07-10T17:29:06Z", "hours": 8.1575, "text": "I started building a neural network for the bot so that I can train it and it can learn. This is what the data file looks like for all of the weights and nodes."}, {"post_id": 24880, "ts": "2026-07-08T18:45:45Z", "hours": 2.7314, "text": "I coded an algorithm that allows the bot to scan the map, and the resulting data lists are represented here by colors! Red = near mountains & hills Green = near cover (caves & trees) Blue = near loot (buildings)"}, {"post_id": 24522, "ts": "2026-07-08T03:50:22Z", "hours": 15.1186, "text": "I added a world map to Searchuse!"}, {"post_id": 21711, "ts": "2026-07-03T20:06:43Z", "hours": 7.6906, "text": "I’ve upgraded the bot’s intelligence. Instead of only being aware of the enemy when they are in its immediate vision, the bot now remembers where it previously saw the enemy, keeps track of how many opportunities to move the enemy had since then, and precisely calculates all the squares the enemy could be on using a flood fill algorithm, based on how many moves the bot thinks the enemy had. (The eye icons represent what the bot thinks are the possible positions of my player based on where it last saw my player. (Sometimes the player can “escape” the eyes by having more moves than what the bot thinks the player has.) (Otherwise, if the bot is right about how many moves the player has, the player should not be able to move to a square without an eye icon.))"}, {"post_id": 20077, "ts": "2026-07-01T16:24:44Z", "hours": 23.2564, "text": "I worked on the enemy AI for my turn-based game Searchuse. The enemy can now use tools, such as invisibility potions, binoculars, radars, UAVs, and traps like landmines or C4s, and can also get airdrops."}, {"post_id": 15456, "ts": "2026-06-25T03:54:38Z", "hours": 4.6358, "text": "I added a few final features to match my turn-based strategy on Unity to its Scratch predecessor. Added: Hitmarker: When you’re hit with an unsuppressed weapon or bomb, a red arrow appears, telling you in which direction on your player’s character’s body you felt the impact. Cooldown visualiser: When you press c, a visual will show up that will show you all the items you have on cooldown and how many turns it is before you can use them next. 4 turn heavy weapons rule: In the first 4 turns, it is now impossible to find any weapon that totals a damage greater than 25 per turn. 3 weapon limit: You can only carry 3 weapons at a time. (By weapons I mean those that stay in your inventory, so something like Grenade doesn’t count.) If you find another weapon while you’re at your limit, you can choose to switch. Turns text: You can now press t to show the turns text, which is below the moves text and shows how many turns it’s been. Turn indicator: On the bottom of your screen, you’ll now find a green or blue landscape that indicates whose turn it is. (Green meaning your turn, blue meaning the enemy’s turn.)"}, {"post_id": 14868, "ts": "2026-06-24T04:17:21Z", "hours": 2.3808, "text": "Added: Message in a Floating Bottle: Like a book, it gives you a random powerup, but its rarity is lower than that of a book. However, its upside is that it is granted immediately after searching. Can only be found in water. AK-47: The world’s most iconic rifle is now in Searchuse! With 2 shots of 20 damage each, this addition provides more mid-tier weapon choices. AK-74: An upgrade of the AK-47, this gun matches the damage done by the M4A1, but it has a lesser cooldown, making it the more desirable option. Meat Stick: This item provides a solid mid-tier healing option, giving you 40 health in one bite. Spikes: This item gives you three more moves, but takes up an armor slot and provides 0 armor. (my beautiful art below)"}, {"post_id": 14567, "ts": "2026-06-23T18:50:46Z", "hours": 10.5353, "text": "I added a bunch of features, a new item, and fixed some bugs for my turn-based strategy game Searchuse. Added: Replay for when Vital Signs run out Replay for when Binoculars runs out Book: when read, gives you a random skill. These skills range from increasing moves to getting 2 searches per turn, so put on your reading glasses and pick up a book! You can also now press b to see your book inventory. Use arrow keys to navigate. Roll Chances Information: press L to open Roll Chances Information, which will tell you the chances of getting each rarity on each tile when you press search. Use arrow keys to navigate. Changed: Sound when picking up Thermal Vision Goggles Fixed: Not being able to start your turn on bot mode glitch Normalized speeds for UAV animation, texts, and movement"}, {"post_id": 11694, "ts": "2026-06-19T01:46:35Z", "hours": 7.0461, "text": "I added an airdrop to my turn-based strategy game Searchuse, which, instead of one, gives you three options to choose from when you press search."}, {"post_id": 9970, "ts": "2026-06-16T14:36:33Z", "hours": 0.32, "text": "I added a UAV to my turn-based strategy game Searchuse, which tracks down the enemy."}]...
|
Title: Searchuse 1.4.4 by @ai_zamden | Stardance
Title: Searchuse 1.4.4 by @ai_zamden | Stardance
Devlogs:
I added a UAV to my turn-based strategy game Searchuse, which tracks down the enemy.
I added an airdrop to my turn-based strategy game Searchuse, which, instead of one, gives you three options to choose from when you press search.
I added a bunch of features, a new item, and fixed some bugs for my turn-based strategy game Searchuse. Added: Replay for when Vital Signs run out Replay for when Binoculars runs out Book: when read, gives you a random skill. These skills range from increasing moves to getting 2 searches per turn, so put on your reading glasses and pick up a book! You can also now press b to see your book inventory. Use arrow keys to navigate. Roll Chances Information: press L to open Roll Chances Information, which will tell you the chances of getting each rarity on each tile when you press search. Use arrow keys to navigate. Changed: Sound when picking up Thermal Vision Goggles Fixed: Not being able to start your turn on bot mode glitch Normalized speeds for UAV animation, texts, and movement
Added: Message in a Floating Bottle: Like a book, it gives you a random powerup, but its rarity is lower than that of a book. However, its upside is that it is granted immediately after searching. Can only be found in water. AK-47: The world’s most iconic rifle is now in Searchuse! With 2 shots of 20 damage each, this addition provides more mid-tier weapon choices. AK-74: An upgrade of the AK-47, this gun matches the damage done by the M4A1, but it has a lesser cooldown, making it the more desirable option. Meat Stick: This item provides a solid mid-tier healing option, giving you 40 health in one bite. Spikes: This item gives you three more moves, but takes up an armor slot and provides 0 armor. (my beautiful art below)
I added a few final features to match my turn-based strategy on Unity to its Scratch predecessor. Added: Hitmarker: When you’re hit with an unsuppressed weapon or bomb, a red arrow appears, telling you in which direction on your player’s character’s body you felt the impact. Cooldown visualiser: When you press c, a visual will show up that will show you all the items you have on cooldown and how many turns it is before you can use them next. 4 turn heavy weapons rule: In the first 4 turns, it is now impossible to find any weapon that totals a damage greater than 25 per turn. 3 weapon limit: You can only carry 3 weapons at a time. (By weapons I mean those that stay in your inventory, so something like Grenade doesn’t count.) If you find another weapon while you’re at your limit, you can choose to switch. Turns text: You can now press t to show the turns text, which is below the moves text and shows how many turns it’s been. Turn indicator: On the bottom of your screen, you’ll now find a green or blue landscape that indicates whose turn it is. (Green meaning your turn, blue meaning the enemy’s turn.)
I worked on the enemy AI for my turn-based game Searchuse. The enemy can now use tools, such as invisibility potions, binoculars, radars, UAVs, and traps like landmines or C4s, and can also get airdrops.
I’ve upgraded the bot’s intelligence. Instead of only being aware of the enemy when they are in its immediate vision, the bot now remembers where it previously saw the enemy, keeps track of how many opportunities to move the enemy had since then, and precisely calculates all the squares the enemy could be on using a flood fill algorithm, based on how many moves the bot thinks the enemy had. (The eye icons represent what the bot thinks are the possible positions of my player based on where it last saw my player. (Sometimes the player can “escape” the eyes by having more moves than what the bot thinks the player has.) (Otherwise, if the bot is right about how many moves the player has, the player should not be able to move to a square without an eye icon.))
I added a world map to Searchuse!
I coded an algorithm that allows the bot to scan the map, and the resulting data lists are represented here by colors! Red = near mountains & hills Green = near cover (caves & trees) Blue = near loot (buildings)
I started building a neural network for the bot so that I can train it and it can learn. This is what the data file looks like for all of the weights and nodes.
I’ve set up the system so that my hardcoded bot can train the neural network bot. This is gonna be fun!
I’ve made major UI improvements to the game!
Searchuse is now available on Linux and Browser!
After a long while, some new content is finally added to Searchuse. Introducing: Armor Piercing Rounds: Use with certain weapons to allow damage to be done as if the opponent were wearing no armor! Beretta+: An upgraded version of the Beretta, this weapon allows you to do damage the the enemy’s max health, a groundbreaking new mechanic added in this update. Fixed: Energy Orb edge bug: Now, the Energy Orb and other explosives will explode when hitting the edge of the map instead of not doing anything! Smoke vision bug: A small error in FOV rendering while in a smoked area was fixed. Factory edge bug: A visual glitch that resulted in Factory tiles peeking out from under the greyed out vision area was fixed.
I did a massive overhaul of the inner workings of the inventory system, changing the data tracking from only ints representing the itemIDs to structs which provide a container for data of items. I did this because I had to add individual item durability.
I’m making a tutorial to teach new users how to play the game, as requested by feedback for my latest ship.
I’m finished with the tutorial, so now you guys can easily learn how to play Searchuse!
Ships:
I made a turn-based strategy game called Searchuse, where you search for and then use various items with different mechanics. A challenge in the process was getting all of the turn-based logic right. (For cooldowns and lasting effects, the timing can be surprisingly complicated to get down.) I’m proud that there aren’t any glaring bugs in the game right now. To play, move around using arrow keys, and press the buttons search or use. There are deeper mechanics you can learn, but the surface-level controls should be intuitive! Here’s the trailer: https://youtu.be/wL6j5aslFXA Join the Discord: https://discord.gg/NpBV6vHc7
I’ve listened to the people and have tried to make as many improvements as I could. UI has been improved Art has been pixel-adjusted Controls are specified in the README Main Menu button has been added Searchuse is now available on Linux AND Searchuse is now available on BROWSER (itch.io, the demo link) So now everyone is theoretically able to try it! A large portion of my time was spent creating a neural network for the bot (that can only be experienced in Train Bot, there’s a hardcoded bot and a neural network bot.) (The neural network bot is still very inexperienced currently.) (Admittedly, Gemini helped me a lot with setting up that portion of the game.) For specific help in downloading the zips, visit the README.
Hey guys, this is my third ship for my turn-based strategy game Searchuse. A lot of you guys suggested to add a tutorial, so I made one, and now it’s a lot easier to figure out how to play the game! I hope you enjoy....
|
1792994080.973617
|
1793080480.973617
|
|
36890
|
Mine and Dine - 26.2 Minecraft Mod by @RevComInter Mine and Dine - 26.2 Minecraft Mod by @RevComInteractives | Stardance...
|
RevComInteractives
|
2
|
86.0
|
1463
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T19:49:16Z", "hours": 29.0, "multiplier": 14.54, "payout": 420, "blessing": "neutral", "text": "Mine & Dine is a Minecraft mod that aims to overhaul the minecraft cooking system, because I always thought that it was a little bit shallow and lacked depth. Therefore I have set the goal for myself to transform the cooking system into something I always wanted. My mod adds six new blockentities and over 70 new items that do exactly that. (You can find a deeper explanation of the contents in my ReadMe) This mod is by far not finished but I think it’s gotten to a point where I would say it is playable and enjoyable, that’s why I decided to ship it now. Especially now that I’ve successfully ported it to version 26.2. What I’m especially proud of is how far my skills as a mod developer have come since I started this project. I have made a couple of smaller mods before the stardance challenge but never something quite like this. I was even able to upload it to Modrinth where the whole world can see it. (Modrinth is also the easiest way to play my mod btw) This step of shipping my final project for this challenge really feels like I’ve achieved something. Thanks in advance to everyone who plays my mod, I hope you’ll enjoy it. If you encounter any bugs (And its not unlikely you do) please report them on my github page. Anyways that’s everything I have to say for now, see you around!", "repo": "https://github.com/JhStudi0/MineAndDine-26.2", "demo": "https://modrinth.com/mod/mine-and-dine"}, {"ship_num": 2, "ts": "2026-09-01T19:51:42Z", "hours": 57.0, "multiplier": 18.17, "payout": 1043, "blessing": "neutral", "text": "Mine & Dine is a Minecraft mod that aims to overhaul the minecraft cooking system, because I always thought that it was a little bit shallow and lacked depth. Therefore I have set the goal for myself to transform the cooking system into something I always wanted. My mod adds five new blockentities and over 60 new items that do exactly that. (You can find a deeper explanation of the contents in my ReadMe) This mod is by far not finished but I think it’s gotten to a point where I would say it is playable and enjoyable, that’s why I decided to ship it now. What I’m especially proud of is how far my skills as a mod developer have come since I started this project. I have made a couple of smaller mods before the stardance challenge but never something quite like this. I was even able to upload it to Modrinth where the whole world can see it. (Modrinth is also the easiest way to play my mod) This step of shipping my first project really feels like I’ve achieved something. Thanks in advance to everyone who plays my mod, I hope you’ll enjoy it. If you encounter any bugs (And its not unlikely you do) please report them on my github page. Anyways that’s everything I have to say for now, see you around!", "repo": "https://github.com/JhStudi0/MineAndDine-26.2", "demo": "https://modrinth.com/mod/mine-and-dine"}]...
|
[{"post_id": 74612, "ts": "202 [{"post_id": 74612, "ts": "2026-09-27T19:38:37Z", "hours": 1.8344, "text": "Hi people! This will probably be my last update in this challenge as I have now finally fixed the bugs that were bothering me. The item renderers work now and have their actual colors. Also the progress arrow is now only one arrow and not 100. I’ll be shipping my project now in the hopes that it will get accepted and rated as well as the last time I shipped. By the way this doesn’t mean I’m done with the mod at all, I still think it could use more updates and improvements so my development is by no means finished. It’ll just happen outside of this challenge and maybe not as frequent as it did now. Anyways that’s all from me for now, I’ll hope to see you around!"}, {"post_id": 70876, "ts": "2026-09-19T22:15:59Z", "hours": 4.2711, "text": "Hi people! I’ve been busy the last couple of days and I can now announce that I can finally run my game again in Minecraft 26.2. So the majority of the update is finished! That being said there are some to be fair kind of funny bugs that I still need to fix (and honestly right now I don’t really have a clue how but oh well I guess we’ll have to see) One example is that somehow my progress arrow in my menu does this really weird thing where it just duplicates a couple times and stretches weirdly across my screen. I mean I don’t know what I did but I’m sure there’s a way to fix that. And the other thing is that for some to me unknown reason, my display items are just red. For example on my cutting board. They’re not at all supposed to look like that and the issue is consistent across all my item renders… Yeah honestly no clue why. Also the display doesnt dissapear when you craft and item but I already had that issue with the last version and I managed to fix that so I’m sure that won’t be a big problem. There are some minor bugs that I still have to resolve, like the item models of my blocks not loading in correctly or my item displays in the cooking pot not working but I’m sure that won’t be too difficult. Anyways that’s all from me for today, I’ll see you around!"}, {"post_id": 69362, "ts": "2026-09-16T21:54:54Z", "hours": 1.3753, "text": "Hi people! It’s looking a lot less red now, doesnt it? I’ve been able to update both the pan and the mixer to the newest version, and that leaves only the cutting board and the scraper before I’ll be able to finally run the game again (hopefully) So yeah I feel like I’m close to finally being finished with the update and then I can finally start working on actual new features. I want to add at least a little bit of actually new content before I ship again. Anyways that’s all from me for today, hope to see you around!"}, {"post_id": 68266, "ts": "2026-09-14T20:21:22Z", "hours": 2.2772, "text": "Hi people! My cooking pot is now working! (Hopefully) It took me longer than I expected because I had a lot of “fun” with the codec of the recipes. But thankfully now that that’s working I can recycle a lot of code for my pan and mixer which will hopefully make that part a lot easier. The cutting board and scraper will probably be another story though. But I’m positive that I’ll be able to finish everything by the ned of the week. That’s all from me for today see you around!"}, {"post_id": 67663, "ts": "2026-09-13T20:21:37Z", "hours": 2.4153, "text": "Hi people! My CornGrinderRecipeBuilder works again! That also means that I managed to get my corn grinder as a whole at least to a state where I would assume that it runs again. So yes, I have reworked both the custom block, teh block entity and the recipe handling. And let’s just say I wouldnt exactly say that I had fun… It’s just really annoying trying to find out why i cant refer to a method in another class only to then find out that I forgot that I forgot to rename one type. To apply that to what cost me the most time, I tried to call my tick() method from my block entity in the custom block (so the crafting actually progresses) but I forgot to change the type of my blockEntityType and it referred to the wrong blockentity. It took me forever to catch that problem. Anyways only five more crafting blockentities I have to port over frustrated scream . I just hope it will be easier since i now roughly know what I’m supposed to do. I can only hope now that school starts again for me… Anyways that’s everything from me today, see you around!"}, {"post_id": 66973, "ts": "2026-09-12T23:35:17Z", "hours": 6.5831, "text": "Hi people! I have been quiet for a few days now but trust me I’ve been busy. The port to the newest Minecraft version is almost complete so be on the lookout for that. Since I last posted a devlog I updated all the items, tags and the loottable modifiers. Also I updated the playerJoinEvent that gives you a cookbook when you first join into a world. Now to the places that still need updating: The ModBlocks, but just those with a blockentity with crafting functions. Therefore ModEntites and the custom recipe types and generators are obviously still missing too. And probably the least amount of work will be updating the missing recipes in my ModRecipeProvider class (It auto generates all my recipes) I have already updated the vanilla style recipes so the ones in a crafting table or oven but my custom recipes are still missing. And of course I gotta debug all my code when all that is done. Anyways I hope I’ll finish this update at some time next week so I can finally start adding some new stuff. That being said I don’t think I’ll be able to code as much starting from Monday, because where I live school is starting again so yeah… Anyways that’s all from me today, hope to see you around!"}, {"post_id": 64432, "ts": "2026-09-08T20:09:14Z", "hours": 2.0831, "text": "Hey people! So I decided to start porting my mod to 26.2 because I hate myself or something. This creenshot really captures my current state of mind quite well, and I’m really contemplating why I decided to do this. Well, it’s the next logical step that’s why I did it but it’s till so annoying. But seriously, why does Mojang have to change their code in every update? Anyways, by the time I uploaded this devlog, I was able to port most of the items plus the model generator which roughly leaves the blocks + their entities and screens and everything, the tag datagen, the cookbook pages (I dont want to) and all the recipes. Damn that’s a lot of work why did I sign up for this. Anyways that’s all from me today, see you around!"}, {"post_id": 64233, "ts": "2026-09-08T14:19:01Z", "hours": 8.0308, "text": "Hello people! I’ve been busy again. But before we dive into what I added I want to say thank you to everyone who rated my project so incredibly high. I couldn’t be happier with all the feedback you gave me. I want to address a few things though that I found which I think caused problems for some of the playtesters. I was under the assumption that the Modrinth version detection would work and therefor my mod was playable on all 1.21.X The problem is that the mod is only compatible with 1.21.1. As much as I would like to blame all of that on Modrinth I do have to admit that I could have just playtested it on the other versions. So to everyone who had problems with playing my mod I want to say a sorry and I hope that this fixes your issues. But now to what I’ve been doing the last couple of days: I’m from southern Germany and therefor I wanted to implement the most iconic dish from my region: Käsespätzle. Käsespätzle (something like cheese spaetzle in english) are like the german kind of noodles just baked with cheese. It may sound a but lame but trust me they are delicious. Now implementing them proved to be a bit more challenging than I had thought because I had no cheese whatsoever so I implemented that together with it’s aging mechanic. And furthermore spätzle are made on a special type of scraper which I also had to implement. It inserts the raw spätzle directly into the cooking pot. I’m currently also contemplating where I want to go with this mod. I’m not going to abandon it, that’s for sure but I just don’t know if i want to keep adding stuff in 1.21 or if I should migrate to the newest version of the game (that’s something that a lot of raters wanted) I’ll have to think about that a bit more but until then see you around!"}, {"post_id": 59779, "ts": "2026-09-01T18:30:25Z", "hours": 0.2781, "text": "Hello People! Today I just wanted to share a quick video with you. It shows how you make an apple pie in my mod. I thought it would be a good showcase for some of the mechanics my mod has to offer. And if the video quality isnt so good, I’m sorry but its the only way I could upload the video on this platform :( Anyways see you around!"}, {"post_id": 59078, "ts": "2026-08-31T18:05:33Z", "hours": 6.0342, "text": "Hi people! I’ve been busy the last couple of days and let me tell you I’m so close to shipping my first iteration of the mod. I’m so close to being done I just have a add a last few things and maybe film a few short showcases and then I’ll be ready to ship this thing. Anyways the most interesting additions that I added are a few new item (textures) and finally after weeks of them being untextured, my mixer and grinder have gotten their models. Anyways that’s all from me for today. The next time you’ll hear from me is probably with a ship so stay tuned. See you!"}, {"post_id": 54808, "ts": "2026-08-25T22:58:00Z", "hours": 2.2117, "text": "Hello people! As promised I have finished the cookbook (at least to a point where I’d say it’s complete enough) and I can now give you some sneakpeeks. Sadly I cant show you everything ‘cause I can only attach four pictures but I think I got a good selection. So the first picture you can see is the opening page of the cookbook, so just some general stuff. The second picture shows a segment of the contents list. All the pink things are links to the corresponding pages you can click on to quickly navigate through the book. And lastly you can see an extract from one of the recipes (in this case for an apple pie). I’m somewhat happy with the design but I’m especially happy with the display of the item on the corresponding page. It is defintely a pain to set up (at least the way I did it) but I think it’s well worth it. But I think that’s all from me for today. I’ll be adding the last textures and little things over the next few days so I can finally push out my first ship :) See you around!"}, {"post_id": 54153, "ts": "2026-08-24T23:55:27Z", "hours": 8.1442, "text": "Hello people! I havent posted anything in quite some time but trust me I’ve been busy. The reason why I’ve shown you so little is because there isn’t much that I could show you. I’ve added a lot of background stuff that I just had to add because I’m planning on shipping soon. One sneakpeak I can give you is this (see picture). Any idea what it is? Well I’ll tell you: It’s a cookbook. I think it’s nice for the immersion if you have a cookbook where you can find all the cooking recipes for my mod. I’ll show you more about it in the future once I’m done with it. Until then that’s all from me. Hope to see you around!"}, {"post_id": 50679, "ts": "2026-08-19T23:55:47Z", "hours": 1.1469, "text": "Hello people! You can now enjoy a nice apple pie at your farm because I have been busy. I added eight new items today to aid you on your cooking journey. First I added cinnamon sticks and powder. Right now you get cinnamon sticks from stripping jungle logs on a cutting board. I’m planning on adding actual cinnamon trees in the future but for now I figured jungle wood would be the most fitting since cinnamon is also a tropical plant. With the addtition of cinnamon I finally made it possible to craft pumpkin pie with the mechanics of my mod. That’s also why I added the middle row of items. On the left we have the pumkin slice which you can bake into the grilled pumpkin slice (middle). I’ll probably have to rework this texture in the future cause you can’t really tell the difference :P. And with that item you can then craft the unbaked pumpkin pie which, as the name suggests, can be baked into the minecraft pumpkin pie. The last three items I added are for my apple pie. First up we have apple chunks which you can then use to make the unbaked apple pie which of course can be baked into the finished apple pie. I hope you like my new additions and that’s also everything from me for today. See you around :)"}, {"post_id": 49899, "ts": "2026-08-18T21:16:14Z", "hours": 1.3992, "text": "Hi people! I’ve been doing a lot of background work today for future stuff so sadly I don’t have too much to show you today. I still coded some more things that I can already hsow you that are worth taking the look at. On the left is the new powdered sugar that you get by grinding sugar in the grinder. It is also used to craft the next item, the pie dough in the mixer. On the cutting board oyu can then transform the dough into the pie base. This item will be used later when making different kinds of pies. What I immediately have in mind is of course the oumpkin pie that is already in vanilla minecraft but also the apple pie and the sweet berry pie. Both of these fruits are of course already in the base game so I think the addition of a pie would make sense. I’m also planning on adding more fruit so I can add more pies. Anyways that’s all from me for today, see you around :)"}, {"post_id": 49262, "ts": "2026-08-17T23:15:11Z", "hours": 1.035, "text": "Hello People! I’ve worked a bit more on expanding the cutting board functionality. I’ve added another tool that can be used in the recipes and that’s the rolling pin (first pic, top left) It does exactly what it sounds like it flattens the ingredients, like for example with my tortilla dough (top right). You can see the process in the second picture. And because it would have felt weird to stop the production chain there, I added the function to put the raw torilla into my frying pan where it gets fired into a finished tortilla. I’m really looking forward on adding more recipes with my tortilla but for now I’m kind of missing some more ingredients, like red beans that I want to put in there. Anyways, that’s all I have time for today :( I’ll see you around :)"}, {"post_id": 48545, "ts": "2026-08-16T23:47:04Z", "hours": 1.04, "text": "Hi people! I’ve been putting my new block entities to some good use today. (From left to right) First of all I added the bun dough. You get it by cutting bread dough on the cutting board. Then there is the bun which you obviously get by smelting bun dough in a furnance. Next up is the cookie dough. You get it by mixing the needed ingredients for a cookie in a mixer. And last is the heavy cream. I’ve added the item a little while back but only now found the time and motivation (especially the latter XD) to make the texture and give it a proper crafting recipe. You get it by mixing milk and butter in the mixer. I believe that that is roughly how heavy cream is made in real life, at least after my five minute google research. I’ve also added crafting recipes for some other things but those aren’t anything special really just in a crafting table. Anyways that’s all from me today, see you around :)"}, {"post_id": 47737, "ts": "2026-08-15T21:06:10Z", "hours": 3.92, "text": "Okay damn I didn’t think that this would take me this long But hi people! I finally added a cutting board to my mod! It came up a while back as a suggestion for how to get my chicken legs and let me say I think it was a good suggestion. The cutting board just fits right in. It works pretty much as you may know it from farmer’s delight, where you put an item on it and then click on it with a tool in this case a knife (which I also added today but that was pretty simple) and it drops the outcome. I’m planning on adding onto that mechanic with more tools like a roling pin for example and definitely more recipes. I have to say now that it is in the game I really like it but damn was it annoying to implement. I mean it was my fault (I forgot one function so it didn’t work) but it nontheless send me down an existentiell crisis ‘cause there was no error message whatsoever. Don’t we love that XD Anyways that’s all from me for today, I’ll see you around :)"}, {"post_id": 47170, "ts": "2026-08-14T21:14:02Z", "hours": 0.7811, "text": "Hello people! I didn’t have a lot of time today since I’m currently renovating my new room :) and it takes a lot of time. Anyways I still managed to get something done today and that is working on the immersion of my mod. The cooking pot and pan now emit smoke when they are cooking. That’s all from me today and I’ll hopefully get back to you with more things :) See ya!"}, {"post_id": 46592, "ts": "2026-08-13T22:46:26Z", "hours": 1.5181, "text": "Hi People! Today I added another Block Entity: The mixer. It works similarly to the cooking pot and pan so I was able to copy a lot of that code. I just had to add the rest of the slots and remove the container slot. I’ll use the mixer as a way to make different kinds of doughs later but for now it can just make bread dough, you can bake into bread in a furnance. I’m really looking forward on making pasta dough and then expanding on that. I was kind of thinking of making a noodle press so you can make different kinds of pasta (I’m speaking spagetti, tortelini, etc.) I kind of want it to work like a stone cutter, where you put in the dough and then select one shape of noodle. But those are still thoughts for the future. Anyways that’s all from me today, see you next time :)"}, {"post_id": 46033, "ts": "2026-08-12T23:12:08Z", "hours": 1.6828, "text": "Hello people! I’ve been somewhat productive today: So first of all I added a provisional model for my pan. Its that orange thing next to the cooking pot. Then I’ve also reworked the crafting logic of my pan so it supports recipes that don’t need a bowl or similar, like you can see in the second picture. I feel like for the vanilla meat items that apporach makes the most sense. And I’ve added sunflower seeds, ground sunflower seeds and sunflower oil into my game. For now you just have to believe me, because I dont have any textures made for them just yet XD. In the third screenshot you can see how sunflower seeds are ground into ground sunflower seeds. In the last picture you can see the crafting recipe for sunflower oil fron ground sunflower seeds. It’s very simplified from the way one would actually make sunflower oil but it’s still just minecraft so I think it fits. Anyways that’s everything I have for you today, see you tomorrow!"}, {"post_id": 45458, "ts": "2026-08-11T22:46:37Z", "hours": 2.2208, "text": "Hi people! I’m back from my holidays in London so I can finally continue the project. It’s been a while so I felt motivated and decided to start adding a new block entity: the pan! So far the block entity already has a screen but there are still a few things missing, like the model/texture and a proper crafting system. So far I can only implement recipes with a container like a bowl or plate (since I recycled a lot of code from my cooking pot) but that wouldnt make a lot of sense if I just wanted to get e.g. the standard minecraft cooked beef since it has no container, so yeah, I’ll have to find a way to make that work. I also added a new decoravtive block: the counter. It’s the brick with a layer of polished deepslate at the top. And I’ve found out that it not only works well as a counter but also as the top of a brisk wall. Anyways that’s all I had time for today, see you tomorrow!"}, {"post_id": 40198, "ts": "2026-08-03T16:29:35Z", "hours": 1.3703, "text": "Hi people! This is probably the last devlog I’ll post before I leave for a week to go on vacation to London, unless I get a sudden sweep of motivation or somthing XD. Anyways I got some new stuff for you. So first you see the work of my boredom, my farm that I build. Then I finally added the stove with texture and everything so that’s done now. And to celebrate that I added the carrot soup that can be crafted in the cooking pot. And I’ve added the new garlic crop with seeds and the garlic itself of course. Not really sure yet what I’m going to do with that but better have it than not have it. Besides garlic bread is always an answer, am I right. Anyways that’s all from me for today, see you guys in a week or so :)"}, {"post_id": 39687, "ts": "2026-08-02T20:29:38Z", "hours": 2.6472, "text": "New Crop Alert! Meet the newest crop addition to Mine and Dine: The onion can now be grown. On my way to making my mod survival friendly this really helps quite a lot. The onion can, like the other seeds, be obtained through breaking grass. But to be honest texturing the growth stages of a crop will forever be the most annoying part of the process. I’ve also done some more tweaking, like adding sounds and map colors to my blocks. Plus a I added a German language pack to my mod. Here are some of my favourite (with that I mean wildest) translations: Vanilla Bean Seeds = Vanilleschotensamen Dark Chocolate covered Apple = Apfel mit Zartbitterschokoladenüberzug And the other ones sound kind of weird too, even though German is my mother tongue. Guess it really does’nt make a difference if you read the english version all the time without thinking of the translation XD Anyways have a good day and see you next time."}, {"post_id": 39187, "ts": "2026-08-01T23:47:08Z", "hours": 0.3183, "text": "Didn’t have time for much toady so all i did was finally create a loot table for my block entities and implemented their strength so they wouldn’t be instamine anymore. (I know the dropped cooking pot is a bit big but I’ll change that in the future.) See you next time :)"}, {"post_id": 38495, "ts": "2026-07-31T22:06:56Z", "hours": 0.8517, "text": "Here’s my devlog for toady :) So I played around a bit with my cooking pot and added the function that they only work, when they have a warm block underneath them, like the ones you can see below. What I’m working on next is probably something like a stove so you can have a nice looking block that gives off heat because all the warm blocks look a bit weird and I don’t think it would make sense to count a furnance that isn’t on as a warm block. I also made three new item models to complete them one after another. From left to right we now have the oinigiri, the salmon sushi, the cod sushi and an item model for my plate because i thought it would look better to have a 2d texture instead of the 3d model. Hope to see you in my next devlog :) and feel free to leave suggestions on what I could add to my mod."}, {"post_id": 37633, "ts": "2026-07-30T14:49:09Z", "hours": 3.5092, "text": "Now that the summer holidays have finally begun where I live I can finally show you the working cooking pot. While the model (the thing on the burning furnance) defintely needs a rework I’m pretty happy with the function. The most annoying part defintely was getting the screen (the menu) to run and look correctly. I currently have the crafting recipe for cooking rice and tomato sauce implemented and I’m working on adding the vanilla soup/stews but there are still a few textures missing until I want to show you those. Anyways feel free to leave some ideas on recipes to add in the comments, see you next time :)"}, {"post_id": 36571, "ts": "2026-07-28T19:40:24Z", "hours": 1.5392, "text": "Currently working on giving this little thing a proper function. For now it was just my earliest Block Entity experiement, but now I want to give my cooking pot an actual fuction. I want it to function similarly to Farmer’s Delight’s pot. So the crafting doesnt follow a shape, but is shapeless. I already have rewritten a lot like the custom block and block entity and I’ve written the cooking pot recipe (input). Thankfully I was able to recycle a lot of code from my grinder. The big task now is to rewrite the screen and screen handler and to make the whole thing work as a whole so I can finally craft everything I want :) Can’t wait to finish this! I’d love some suggestions on where to go on from the finished cooking pot. I’ve already thought about adding a frying pan, which would make sense in my head since you don’t cook everything in a pot."}, {"post_id": 35944, "ts": "2026-07-27T18:35:20Z", "hours": 0.7631, "text": "On my road to making my mod survival friendly, I have now added all my seeds to the loot table of short and tall grass.It took longer than I had hoped for because I may or may not have forgotten that silk touch has no effect on grass and I may or may not have tried to implement the silk touch exception regardless.Wasn’t exactly my brightest moments once i figured it out after like 20 minutes of wasting my time."}, {"post_id": 35214, "ts": "2026-07-26T14:30:57Z", "hours": 1.3289, "text": "It’s me again! My grinder now has a custom recipe type. It can now grind sugarcane into sugar as well as wheat into flour. That’s also the reason why I decided to rename it just into grinder. I think it fits the purpose a bit better. I even managed to add a way to get my recipes to get easily generated with the fabric data gen. And I added a grilled corn cib because I wanted to. Now my focus will probably shift towards making what I have survival friendly because for now the mod only work in creative. For the different kinds of seeds I think I’ll just add them to the loot table to grass, like wheat seeds. But I’m always open for better suggestions!"}, {"post_id": 34580, "ts": "2026-07-25T13:03:48Z", "hours": 1.4089, "text": "My Corn Grinder is now a Block Entity! It has an inventory now where you can input your wheat to get flour. Next I will add a custom recipe type so I can add more types of things to grind down. I was thinking about grinding corn seeds into corn flour for example so in the future I could add nachos or taco shells. I’d be open for more suggestions on what grinding recipes to add."}, {"post_id": 34344, "ts": "2026-07-24T23:15:12Z", "hours": 1.5892, "text": "So I didnt code a lot today that I can show you because it’s all still unfinished and doesnt work but I have other exciting news: My mod got approved on Modrinth so you can download it through the Modrinth Website now! Please keep in mind that I have a version from a few days back on there so it’s not perfectly up to date but it’s still a playable version (in creative, though I’m working on making it survival friendly) Here’s a screenshot of my mod’s page:"}, {"post_id": 33640, "ts": "2026-07-23T18:31:51Z", "hours": 0.6331, "text": "Hi people! Didn’t have time for much today, so all I did was restucture my Item Groups a bit to have them in a logical order. So now there are Seeds, Ingredients, finished Dishes and Utensils."}, {"post_id": 33102, "ts": "2026-07-22T18:31:45Z", "hours": 1.7647, "text": "I mentioned it in an earlier devlog and now here they are: the plates! They can be placed down to display you’re crafted dishes (and other items). The texture is still to be made properly."}, {"post_id": 32577, "ts": "2026-07-21T20:56:34Z", "hours": 0.3733, "text": "Didn’t have time for much so I just added two new items: chicken legs and onigiris. The latter already has a crafting recipe. For the chicken leg I still have to figure out how I want it to be obtainable."}, {"post_id": 31950, "ts": "2026-07-20T19:25:31Z", "hours": 2.7164, "text": "Hi guys, here’s my devlog for today. So down below you can see a few new items, some of which I havent textured yet (shame on me). (from left to right) A bowl of rice, yeast, fermented yeast, dough (which you can bake into bread) and sushi with cod and salmon. On the left you can also see that I experimented a bit with block entities and I think i will turn this conept into some sort of display plate that would also be used for crafting dishes in the future. Anyways hope you liked my little devlog for today, see you for the next one :)"}, {"post_id": 31441, "ts": "2026-07-19T20:12:44Z", "hours": 1.1936, "text": "Alright fixed it. Thankfully the mods running again and I even got the alpha-1.1 version up on modrinth for approval. I’ll keep you updated once its live."}, {"post_id": 31364, "ts": "2026-07-19T18:07:29Z", "hours": 2.9633, "text": "Currently fixing my modpack :( I tried to make it into a git repo and it broke and now I have to do it all again. Thankfully I can just copy over the code but it’s still really annoying. I’ll keep you updated. In the meantime enjoy a picture of an older 3d model of mine."}, {"post_id": 30779, "ts": "2026-07-18T17:32:00Z", "hours": 0.6333, "text": "It might not look like it but this is a custom block I programmed. It’s a grinder used for grinding down things like wheat into flour. The model’s obviously not made yet but I’m definitely going to do it at some point."}, {"post_id": 30726, "ts": "2026-07-18T15:28:41Z", "hours": 0.3822, "text": "Hi people this is the first devlog on my Minecraft cooking mod in which I aim to overhaul the cooking system in minecraft. attached are some screenshots on what I’ve been working on so far. I’ve added a couple new food items and there will be many more to come."}]...
|
Title: Mine and Dine - 26.2 Minecraft Mod by @RevC Title: Mine and Dine - 26.2 Minecraft Mod by @RevComInteractives | Stardance
Devlogs:
Hi people this is the first devlog on my Minecraft cooking mod in which I aim to overhaul the cooking system in minecraft. attached are some screenshots on what I’ve been working on so far. I’ve added a couple new food items and there will be many more to come.
It might not look like it but this is a custom block I programmed. It’s a grinder used for grinding down things like wheat into flour. The model’s obviously not made yet but I’m definitely going to do it at some point.
Currently fixing my modpack :( I tried to make it into a git repo and it broke and now I have to do it all again. Thankfully I can just copy over the code but it’s still really annoying. I’ll keep you updated. In the meantime enjoy a picture of an older 3d model of mine.
Alright fixed it. Thankfully the mods running again and I even got the alpha-1.1 version up on modrinth for approval. I’ll keep you updated once its live.
Hi guys, here’s my devlog for today. So down below you can see a few new items, some of which I havent textured yet (shame on me). (from left to right) A bowl of rice, yeast, fermented yeast, dough (which you can bake into bread) and sushi with cod and salmon. On the left you can also see that I experimented a bit with block entities and I think i will turn this conept into some sort of display plate that would also be used for crafting dishes in the future. Anyways hope you liked my little devlog for today, see you for the next one :)
Didn’t have time for much so I just added two new items: chicken legs and onigiris. The latter already has a crafting recipe. For the chicken leg I still have to figure out how I want it to be obtainable.
I mentioned it in an earlier devlog and now here they are: the plates! They can be placed down to display you’re crafted dishes (and other items). The texture is still to be made properly.
Hi people! Didn’t have time for much today, so all I did was restucture my Item Groups a bit to have them in a logical order. So now there are Seeds, Ingredients, finished Dishes and Utensils.
So I didnt code a lot today that I can show you because it’s all still unfinished and doesnt work but I have other exciting news: My mod got approved on Modrinth so you can download it through the Modrinth Website now! Please keep in mind that I have a version from a few days back on there so it’s not perfectly up to date but it’s still a playable version (in creative, though I’m working on making it survival friendly) Here’s a screenshot of my mod’s page:
My Corn Grinder is now a Block Entity! It has an inventory now where you can input your wheat to get flour. Next I will add a custom recipe type so I can add more types of things to grind down. I was thinking about grinding corn seeds into corn flour for example so in the future I could add nachos or taco shells. I’d be open for more suggestions on what grinding recipes to add.
It’s me again! My grinder now has a custom recipe type. It can now grind sugarcane into sugar as well as wheat into flour. That’s also the reason why I decided to rename it just into grinder. I think it fits the purpose a bit better. I even managed to add a way to get my recipes to get easily generated with the fabric data gen. And I added a grilled corn cib because I wanted to. Now my focus will probably shift towards making what I have survival friendly because for now the mod only work in creative. For the different kinds of seeds I think I’ll just add them to the loot table to grass, like wheat seeds. But I’m always open for better suggestions!
On my road to making my mod survival friendly, I have now added all my seeds to the loot table of short and tall grass.It took longer than I had hoped for because I may or may not have forgotten that silk touch has no effect on grass and I may or may not have tried to implement the silk touch exception regardless.Wasn’t exactly my brightest moments once i figured it out after like 20 minutes of wasting my time.
Currently working on giving this little thing a proper function. For now it was just my earliest Block Entity experiement, but now I want to give my cooking pot an actual fuction. I want it to function similarly to Farmer’s Delight’s pot. So the crafting doesnt follow a shape, but is shapeless. I already have rewritten a lot like the custom block and block entity and I’ve written the cooking pot recipe (input). Thankfully I was able to recycle a lot of code from my grinder. The big task now is to rewrite the screen and screen handler and to make the whole thing work as a whole so I can finally craft everything I want :) Can’t wait to finish this! I’d love some suggestions on where to go on from the finished cooking pot. I’ve already thought about adding a frying pan, which would make sense in my head since you don’t cook everything in a pot.
Now that the summer holidays have finally begun where I live I can finally show you the working cooking pot. While the model (the thing on the burning furnance) defintely needs a rework I’m pretty happy with the function. The most annoying part defintely was getting the screen (the menu) to run and look correctly. I currently have the crafting recipe for cooking rice and tomato sauce implemented and I’m working on adding the vanilla soup/stews but there are still a few textures missing until I want to show you those. Anyways feel free to leave some ideas on recipes to add in the comments, see you next time :)
Here’s my devlog for toady :) So I played around a bit with my cooking pot and added the function that they only work, when they have a warm block underneath them, like the ones you can see below. What I’m working on next is probably something like a stove so you can have a nice looking block that gives off heat because all the warm blocks look a bit weird and I don’t think it would make sense to count a furnance that isn’t on as a warm block. I also made three new item models to complete them one after another. From left to right we now have the oinigiri, the salmon sushi, the cod sushi and an item model for my plate because i thought it would look better to have a 2d texture instead of the 3d model. Hope to see you in my next devlog :) and feel free to leave suggestions on what I could add to my mod.
Didn’t have time for much toady so all i did was finally create a loot table for my block entities and implemented their strength so they wouldn’t be instamine anymore. (I know the dropped cooking pot is a bit big but I’ll change that in the future.) See you next time :)
New Crop Alert! Meet the newest crop addition to Mine and Dine: The onion can now be grown. On my way to making my mod survival friendly this really helps quite a lot. The onion can, like the other seeds, be obtained through breaking grass. But to be honest texturing the growth stages of a crop will forever be the most annoying part of the process. I’ve also done some more tweaking, like adding sounds and map colors to my blocks. Plus a I added a German language pack to my mod. Here are some of my favourite (with that I mean wildest) translations: Vanilla Bean Seeds = Vanilleschotensamen Dark Chocolate covered Apple = Apfel mit Zartbitterschokoladenüberzug And the other ones sound kind of weird too, even though German is my mother tongue. Guess it really does’nt make a difference if you read the english version all the time without thinking of the translation XD Anyways have a good day and see you next time.
Hi people! This is probably the last devlog I’ll post before I leave for a week to go on vacation to London, unless I get a sudden sweep of motivation or somthing XD. Anyways I got some new stuff for you. So first you see the work of my boredom, my farm that I build. Then I finally added the stove with texture and everything so that’s done now. And to celebrate that I added the carrot soup that can be crafted in the cooking pot. And I’ve added the new garlic crop with seeds and the garlic itself of course. Not really sure yet what I’m going to do with that but better have it than not have it. Besides garlic bread is always an answer, am I right. Anyways that’s all from me for today, see you guys in a week or so :)
Hi people! I’m back from my holidays in London so I can finally continue the project. It’s been a while so I felt motivated and decided to start adding a new block entity: the pan! So far the block entity already has a screen but there are still a few things missing, like the model/texture and a proper crafting system. So far I can only implement recipes with a container like a bowl or plate (since I recycled a lot of code from my cooking pot) but that wouldnt make a lot of sense if I just wanted to get e.g. the standard minecraft cooked beef since it has no container, so yeah, I’ll have to find a way to make that work. I also added a new decoravtive block: the counter. It’s the brick with a layer of polished deepslate at the top. And I’ve found out that it not only works well as a counter but also as the top of a brisk wall. Anyways that’s all I had time for today, see you tomorrow!
Hello people! I’ve been somewhat productive today: So first of all I added a provisional model for my pan. Its that orange thing next to the cooking pot. Then I’ve also reworked the crafting logic of my pan so it supports recipes that don’t need a bowl or similar, like you can see in the second picture. I feel like for the vanilla meat items that apporach makes the most sense. And I’ve added sunflower seeds, ground sunflower seeds and sunflower oil into my game. For now you just have to believe me, because I dont have any textures made for them just yet XD. In the third screenshot you can see how sunflower seeds are ground into ground sunflower seeds. In the last picture you can see the crafting recipe for sunflower oil fron ground sunflower seeds. It’s very simplified from the way one would actually make sunflower oil but it’s still just minecraft so I think it fits. Anyways that’s everything I have for you today, see you tomorrow!
Hi People! Today I added another Block Entity: The mixer. It works similarly to the cooking pot and pan so I was able to copy a lot of that code. I just had to add the rest of the slots and remove the container slot. I’ll use the mixer as a way to make different kinds of doughs later but for now it can just make bread dough, you can bake into bread in a furnance. I’m really looking forward on making pasta dough and then expanding on that. I was kind of thinking of making a noodle press so you can make different kinds of pasta (I’m speaking spagetti, tortelini, etc.) I kind of want it to work like a stone cutter, where you put in the dough and then select one shape of noodle. But those are still thoughts for the future. Anyways that’s all from me today, see you next time :)
Hello people! I didn’t have a lot of time today since I’m currently renovating my new room :) and it takes a lot of time. Anyways I still managed to get something done today and that is working on the immersion of my mod. The cooking pot and pan now emit smoke when they are cooking. That’s all from me today and I’ll hopefully get back to you with more things :) See ya!
Okay damn I didn’t think that this would take me this long But hi people! I finally added a cutting board to my mod! It came up a while back as a suggestion for how to get my chicken legs and let me say I think it was a good suggestion. The cutting board just fits right in. It works pretty much as you may know it from farmer’s delight, where you put an item on it and then click on it with a tool in this case a knife (which I also added today but that was pretty simple) and it drops the outcome. I’m planning on adding onto that mechanic with more tools like a roling pin for example and definitely more recipes. I have to say now that it is in the game I really like it but damn was it annoying to implement. I mean it was my fault (I forgot one function so it didn’t work) but it nontheless send me down an existentiell crisis ‘cause there was no error message whatsoever. Don’t we love that XD Anyways that’s all from me for today, I’ll see you around :)
Hi people! I’ve been putting my new block entities to some good use today. (From left to right) First of all I added the bun dough. You get it by cutting bread dough on the cutting board. Then there is the bun which you obviously get by smelting bun dough in a furnance. Next up is the cookie dough. You get it by mixing the needed ingredients for a cookie in a mixer. And last is the heavy cream. I’ve added the item a little while back but only now found the time and motivation (especially the latter XD) to make the texture and give it a proper crafting recipe. You get it by mixing milk and butter in the mixer. I believe that that is roughly how heavy cream is made in real life, at least after my five minute google research. I’ve also added crafting recipes for some other things but those aren’t anything special really just in a crafting table. Anyways that’s all from me today, see you around :)
Hello People! I’ve worked a bit more on expanding the cutting board functionality. I’ve added another tool that can be used in the recipes and that’s the rolling pin (first pic, top left) It does exactly what it sounds like it flattens the ingredients, like for example with my tortilla dough (top right). You can see the process in the second picture. And because it would have felt weird to stop the production chain there, I added the function to put the raw torilla into my frying pan where it gets fired into a finished tortilla. I’m really looking forward on adding more recipes with my tortilla but for now I’m kind of missing some more ingredients, like red beans that I want to put in there. Anyways, that’s all I have time for today :( I’ll see you around :)
Hi people! I’ve been doing a lot of background work today for future stuff so sadly I don’t have too much to show you today. I still coded some more things that I can already hsow you that are worth taking the look at. On the left is the new powdered sugar that you get by grinding sugar in the grinder. It is also used to craft the next item, the pie dough in the mixer. On the cutting board oyu can then transform the dough into the pie base. This item will be used later when making different kinds of pies. What I immediately have in mind is of course the oumpkin pie that is already in vanilla minecraft but also the apple pie and the sweet berry pie. Both of these fruits are of course already in the base game so I think the addition of a pie would make sense. I’m also planning on adding more fruit so I can add more pies. Anyways that’s all from me for today, see you around :)
Hello people! You can now enjoy a nice apple pie at your farm because I have been busy. I added eight new items today to aid you on your cooking journey. First I added cinnamon sticks and powder. Right now you get cinnamon sticks from stripping jungle logs on a cutting board. I’m planning on adding actual cinnamon trees in the future but for now I figured jungle wood would be the most fitting since cinnamon is also a tropical plant. With the addtition of cinnamon I finally made it possible to craft pumpkin pie with the mechanics of my mod. That’s also why I added the middle row of items. On the left we have the pumkin slice which you can bake into the grilled pumpkin slice (middle). I’ll probably have to rework this texture in the future cause you can’t really tell the difference :P. And with that item you can then craft the unbaked pumpkin pie which, as the name suggests, can be baked into the minecraft pumpkin pie. The last three items I added are for my apple pie. First up we have apple chunks which you can then use to make the unbaked apple pie which of course can be baked into the finished apple pie. I hope you like my new additions and that’s also everything from me for today. See you around :)
Hello people! I havent posted anything in quite some time but trust me I’ve been busy. The reason why I’ve shown you so little is because there isn’t much that I could show you. I’ve added a lot of background stuff that I just had to add because I’m planning on shipping soon. One sneakpeak I can give you is this (see picture). Any idea what it is? Well I’ll tell you: It’s a cookbook. I think it’s nice for the immersion if you have a cookbook where you can find all the cooking recipes for my mod. I’ll show you more about it in the future once I’m done with it. Until then that’s all from me. Hope to see you around!
Hello people! As promised I have finished the cookbook (at least to a point where I’d say it’s complete enough) and I can now give you some sneakpeeks. Sadly I cant show you everything ‘cause I can only attach four pictures but I think I got a good selection. So the first picture you can see is the opening page of the cookbook, so just some general stuff. The second picture shows a segment of the contents list. All the pink things are links to the corresponding pages you can click on to quickly navigate through the book. And lastly you can see an extract from one of the recipes (in this case for an apple pie). I’m somewhat happy with the design but I’m especially happy with the display of the item on the corresponding page. It is defintely a pain to set up (at least the way I did it) but I think it’s well worth it. But I think that’s all from me for today. I’ll be adding the last textures and little things over the next few days so I can finally push out my first ship :) See you around!
Hi people! I’ve been busy the last couple of days and let me tell you I’m so close to shipping my first iteration of the mod. I’m so close to being done I just have a add a last few things and maybe film a few short showcases and then I’ll be ready to ship this thing. Anyways the most interesting additions that I added are a few new item (textures) and finally after weeks of them being untextured, my mixer and grinder have gotten their models. Anyways that’s all from me for today. The next time you’ll hear from me is probably with a ship so stay tuned. See you!
Hello People! Today I just wanted to share a quick video with you. It shows how you make an apple pie in my mod. I thought it would be a good showcase for some of the mechanics my mod has to offer. And if the video quality isnt so good, I’m sorry but its the only way I could upload the video on this platform :( Anyways see you around!
Hello people! I’ve been busy again. But before we dive into what I added I want to say thank you to everyone who rated my project so incredibly high. I couldn’t be happier with all the feedback you gave me. I want to address a few things though that I found which I think caused problems for some of the playtesters. I was under the assumption that the Modrinth version detection would work and therefor my mod was playable on all 1.21.X The problem is that the mod is only compatible with 1.21.1. As much as I would like to blame all of that on Modrinth I do have to admit that I could have just playtested it on the other versions. So to everyone who had problems with playing my mod I want to say a sorry and I hope that this fixes your issues. But now to what I’ve been doing the last couple of days: I’m from southern Germany and therefor I wanted to implement the most iconic dish from my region: Käsespätzle. Käsespätzle (something like cheese spaetzle in english) are like the german kind of noodles just baked with cheese. It may sound a but lame but trust me they are delicious. Now implementing them proved to be a bit more challenging than I had thought because I had no cheese whatsoever so I implemented that together with it’s aging mechanic. And furthermore spätzle are made on a special type of scraper which I also had to implement. It inserts the raw spätzle directly into the cooking pot. I’m currently also contemplating where I want to go with this mod. I’m not going to abandon it, that’s for sure but I just don’t know if i want to keep adding stuff in 1.21 or if I should migrate to the newest version of the game (that’s something that a lot of raters wanted) I’ll have to think about that a bit more but until then see you around!
Hey people! So I decided to start porting my mod to 26.2 because I hate myself or something. This creenshot really captures my current state of mind quite well, and I’m really contemplating why I decided to do this. Well, it’s the next logical step that’s why I did it but it’s till so annoying. But seriously, why does Mojang have to change their code in every update? Anyways, by the time I uploaded this devlog, I was able to port most of the items plus the model generator which roughly leaves the blocks + their entities and screens and everything, the tag datagen, the cookbook pages (I dont want to) and all the recipes. Damn that’s a lot of work why did I sign up for this. Anyways that’s all from me today, see you around!
Hi people! I have been quiet for a few days now but trust me I’ve been busy. The port to the newest Minecraft version is almost complete so be on the lookout for that. Since I last posted a devlog I updated all the items, tags and the loottable modifiers. Also I updated the playerJoinEvent that gives you a cookbook when you first join into a world. Now to the places that still need updating: The ModBlocks, but just those with a blockentity with crafting functions. Therefore ModEntites and the custom recipe types and generators are obviously still missing too. And probably the least amount of work will be updating the missing recipes in my ModRecipeProvider class (It auto generates all my recipes) I have already updated the vanilla style recipes so the ones in a crafting table or oven but my custom recipes are still missing. And of course I gotta debug all my code when all that is done. Anyways I hope I’ll finish this update at some time next week so I can finally start adding some new stuff. That being said I don’t think I’ll be able to code as much starting from Monday, because where I live school is starting again so yeah… Anyways that’s all from me today, hope to see you around!
Hi people! My CornGrinderRecipeBuilder works again! That also means that I managed to get my corn grinder as a whole at least to a state where I would assume that it runs again. So yes, I have reworked both the custom block, teh block entity and the recipe handling. And let’s just say I wouldnt exactly say that I had fun… It’s just really annoying trying to find out why i cant refer to a method in another class only to then find out that I forgot that I forgot to rename one type. To apply that to what cost me the most time, I tried to call my tick() method from my block entity in the custom block (so the crafting actually progresses) but I forgot to change the type of my blockEntityType and it referred to the wrong blockentity. It took me forever to catch that problem. Anyways only five more crafting blockentities I have to port over frustrated scream . I just hope it will be easier since i now roughly know what I’m supposed to do. I can only hope now that school starts again for me… Anyways that’s everything from me today, see you around!
Hi people! My cooking pot is now working! (Hopefully) It took me longer than I expected because I had a lot of “fun” with the codec of the recipes. But thankfully now that that’s working I can recycle a lot of code for my pan and mixer which will hopefully make that part a lot easier. The cutting board and scraper will probably be another story though. But I’m positive that I’ll be able to finish everything by the ned of the week. That’s all from me for today see you around!
Hi people! It’s looking a lot less red now, doesnt it? I’ve been able to update both the pan and the mixer to the newest version, and that leaves only the cutting board and the scraper before I’ll be able to finally run the game again (hopefully) So yeah I feel like I’m close to finally being finished with the update and then I can finally start working on actual new features. I want to add at least a little bit of actually new content before I ship again. Anyways that’s all from me for today, hope to see you around!
Hi people! I’ve been busy the last couple of days and I can now announce that I can finally run my game again in Minecraft 26.2. So the majority of the update is finished! That being said there are some to be fair kind of funny bugs that I still need to fix (and honestly right now I don’t really have a clue how but oh well I guess we’ll have to see) One example is that somehow my progress arrow in my menu does this really weird thing where it just duplicates a couple times and stretches weirdly across my screen. I mean I don’t know what I did but I’m sure there’s a way to fix that. And the other thing is that for some to me unknown reason, my display items are just red. For example on my cutting board. They’re not at all supposed to look like that and the issue is consistent across all my item renders… Yeah honestly no clue why. Also the display doesnt dissapear when you craft and item but I already had that issue with the last version and I managed to fix that so I’m sure that won’t be a big problem. There are some minor bugs that I still have to resolve, like the item models of my blocks not loading in correctly or my item displays in the cooking pot not working but I’m sure that won’t be too difficult. Anyways that’s all from me for today, I’ll see you around!
Hi people! This will probably be my last update in this challenge as I have now finally fixed the bugs that were bothering me. The item renderers work now and have their actual colors. Also the progress arrow is now only one arrow and not 100. I’ll be shipping my project now in the hopes that it will get accepted and rated as well as the last time I shipped. By the way this doesn’t mean I’m done with the mod at all, I still think it could use more updates and improvements so my development is by no means finished. It’ll just happen outside of this challenge and maybe not as frequent as it did now. Anyways that’s all from me for now, I’ll hope to see you around!
Ships:
Mine & Dine is a Minecraft mod that aims to overhaul the minecraft cooking system, because I always thought that it was a little bit shallow and lacked depth. Therefore I have set the goal for myself to transform the cooking system into something I always wanted. My mod adds five new blockentities and over 60 new items that do exactly that. (You can find a deeper explanation of the contents in my ReadMe) This mod is by far not finished but I think it’s gotten to a point where I would say it is playable and enjoyable, that’s why I decided to ship it now. What I’m especially proud of is how far my skills as a mod developer have come since I started this project. I have made a couple of smaller mods before the stardance challenge but never something quite like this. I was even able to upload it to Modrinth where the whole world can see it. (Modrinth is also the easiest way to play my mod) This step of shipping my first project really feels like I’ve achieved something. Thanks in advance to everyone who plays my mod, I hope you’ll enjoy it. If you encounter any bugs (And its not unlikely you do) please report them on my github page. Anyways that’s everything I have to say for now, see you around!
Mine & Dine is a Minecraft mod that aims to overhaul the minecraft cooking system, because I always thought that it was a little bit shallow and lacked depth. Therefore I have set the goal for myself to transform the cooking system into something I always wanted. My mod adds six new blockentities and over 70 new items that do exactly that. (You can find a deeper explanation of the contents in my ReadMe) This mod is by far not finished but I think it’s gotten to a point where I would say it is playable and enjoyable, that’s why I decided to ship it now. Especially now that I’ve successfully ported it to version 26.2. What I’m especially proud of is how far my skills as a mod developer have come since I started this project. I have made a couple of smaller mods before the stardance challenge but never something quite like this. I was even able to upload it to Modrinth where the whole world can see it. (Modrinth is also the easiest way to play my mod btw) This step of shipping my final project for this challenge really feels like I’ve achieved something. Thanks in advance to everyone who plays my mod, I hope you’ll enjoy it. If you encounter any bugs (And its not unlikely you do) please report them on my github page. Anyways that’s everything I have to say for now, see you around!...
|
1792993784.461345
|
1793080184.461345
|
|
3856
|
Super Beach Ball by @Olebsbo | Stardance
|
Olebsbo
|
1
|
76.27
|
1455
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-13T00:41:48Z", "hours": 76.0, "multiplier": 19.15, "payout": 1455, "blessing": "neutral", "text": "This is the ship for my beach volleyball game! :D I’m really proud of this project. I had to learn so many new things about UI, music, SFX, and other things that I just never got around to in my previous projects because I never reached the point where I could actually release my previous games. I struggled a lot with these things at first, but now I really think that I can make them all work well in my future projects! I should probably mention a few things (this might be a bit long, but please try to read it, the itch.io page also has some of the same info but this one is probably better for people specifically coming from Stardance) First of all, while the game is available to play in the browser, it seems that the lighting and particles get messed up. I think it is because of Godot’s way of exporting to HTML (I think it has to downgrade the graphics a bit to make it work properly), so unfortunately, if you do play it in browser you will have to deal with some weird lighting. The particles can be turned off in the options menu. The downloaded version is just fine, so if you can use that, that would be great! Although, I perfectly understand if you don’t want to download from a random stranger on the internet, and I haven’t tested the Mac or Linux versions (look at the download info on the itch.io page for more). Second, while I have tested the game with my friends, I’m still very uncertain about how effective the tutorial is. I believe that it should be fine if you read through carefully. If you find it confusing, then I sincerely apologize and hope you don’t take it to represent the entire game, and you can tell me what you found difficult. Also, the game is WAY more fun when you play with friends/family! Like, seriously, get someone to go through the tutorial and play with you. The competitiveness makes it so much more enjoyable! And if you’re friends can’t play with you at the moment, then playing against the AI can still be fun. If there are any bugs, please tell me! Just give me the situation that it happened in and what the bug actually was. And finally, thank you for trying my game! I worked very hard on it, and I’m really glad that it turned out the way it did! And if you don’t like it… uhhh please don’t cook the rating ⊙﹏⊙∥ remember to rate fairly!", "repo": "https://github.com/Olebsbo/SuperBeachBall", "demo": "https://olebsbo.itch.io/super-beach-ball"}]...
|
[{"post_id": 28064, "ts": "202 [{"post_id": 28064, "ts": "2026-07-14T02:48:17Z", "hours": 0.2658, "text": "I’ve made some really quick QOL adjustments to my game! It was some pretty basic stuff that I just didn’t account for previously because I just didn’t think of it before. Some changes include: Trying to account for weird resolutions (not 16:9) by adding black bars to the side (cannot confirm if it works yet) Adding additional information to the itch.io page to remind people about the tutorial and to mention that there might be some lag at the start of the web version Sorry I had to add this after the ship, but these changes were really simple and important, so I just felt like I had to! Also, I’d assume that this isn’t considered fraud or anything because it’s just a quick QOL update after the ship that doesn’t change anything major, just makes the experience better for players, and actual games do these kinds of emergency updates all the time. Also, I haven’t seen anything about this kind of thing being a possible problem. IF YOU ARE RATING , could you please take this information into account as well? It isn’t included in the ship information, but this info is also important."}, {"post_id": 27436, "ts": "2026-07-13T00:13:54Z", "hours": 1.4775, "text": "This is my final devlog! I’ve posted the itch.io page! And then itch went down for a couple minutes… But I should be ready to ship now. If you’d like, you should be able to play the game now! Thanks for reading!"}, {"post_id": 26372, "ts": "2026-07-11T03:49:25Z", "hours": 1.8675, "text": "I’m finally finished with my beach volleyball game! (Hopefully) I’ve pretty much just been touching up on some small things like making the background look a bit more interesting and adjusting some variables to make playing the game more intuitive. It’s basically done now! I plan on playtesting it one more time, and then after that I may do some minor adjustments, but the actual game is complete and I don’t plan on changing any of the gameplay anymore. I’ve been working on this project for 75 hours now, and I’m really proud of it; hopefully the next devlog will be the final one! :D"}, {"post_id": 25683, "ts": "2026-07-10T03:24:15Z", "hours": 4.0469, "text": "I’m actually getting pretty close to being done with my beach volleyball game! q(≧▽≦q) I’m done with the music for the win screen. I’ve also added a couple of small details like some boats and birds in the background to make the ocean look a little less empty, and some general bug fixing stuff. I also changed the volleyball color slightly because I kinda realized that it looks too much like a Mikasa volleyball and while I think I’ll be fine I don’t want to get sued (´。_。`) In general, I’m pretty close to being done! I think I’ll keep on working on touching up some small things, but I should be ready to ship soon!"}, {"post_id": 25140, "ts": "2026-07-09T05:08:14Z", "hours": 7.6383, "text": "I’ve done some more work on the music for my beach volleyball game! I think that I’m pretty much done with the main menu theme and the gameplay theme. I just have to do the win screen music now, and I think I have a pretty good idea of how I want it to sound. I think the music could definitely be better, but since I don’t do this kind of thing much, I’m pretty happy with how it’s come out!"}, {"post_id": 23831, "ts": "2026-07-07T00:15:23Z", "hours": 9.4881, "text": "I’ve been working on a bunch of polishing for my beach volleyball game! Now there’s a bunch of particle effects! There’s wind and leaf particles in the background that appear in random quantities. As the game progresses, the amount of each slowly increases so it looks like the game is getting really intense. I included a screenshot below of me testing the particles with godot icons as placeholders, and I think it looks pretty goofy. There’s also sand particles when the players move. Also, I’ve made it so that after 10 rallies, the ball starts moving faster to challenge high level players. It also gets set on fire and becomes more and more red as it gets faster, because fire is pretty cool :D Finally, I’ve been working a bit on the audio side of things. I’m a beginner at making music and sound effects, so I don’t think they’ll be too good, but I think that it’s good to try anyways and learn!"}, {"post_id": 21922, "ts": "2026-07-04T03:24:21Z", "hours": 4.9758, "text": "I got some good feedback from some playtesters, and I’ve added some solid changes to my beach volleyball game! There’s now a tutorial manual in the menu! I found that the actual interactive tutorial can be a bit difficult in terms of fully conveying the game’s rules to the player, so I decided that a tutorial manual for some of the more complicated things would be best. I also made a couple of small changes, like adding an indicator to show which character the player is controlling and fixing some smaller bugs, like how the ball used to detect multiple spikes if you spammed the spike button. There weren’t too many major changes, but I think that I’m definitely getting toward a more polished experience now :)"}, {"post_id": 20481, "ts": "2026-07-02T02:44:56Z", "hours": 5.6242, "text": "I’ve started work on a tutorial for my beach volleyball game! I’m not gonna lie, my game is WAY harder to explain than I thought it would be 😅. Making a tutorial was pretty weird because a lot of the rules and whatnot would be pretty confusing for somebody who’s never seen volleyball being played before. I’ve tried to make the tutorial as interactive as I could, but some things are just not very easy to show and I have to use a bunch of text to explain them. I’ll have to test the tutorial on some of my friends for now, but I think it’s a good start."}, {"post_id": 19700, "ts": "2026-07-01T02:54:53Z", "hours": 3.5767, "text": "I think I’ve finally got a good end screen for my beach volleyball game! It took a while, but I think I’ve got something I’m pretty happy with! I might work on it a bit more in future, but for now I think that it works well enough. There’s currently two randomized animations that the winning team might do, and I’ve shown an example of each below in the screenshot and the screen recording respectively."}, {"post_id": 18950, "ts": "2026-06-30T04:02:23Z", "hours": 4.53, "text": "I’ve been working some more on my beach volleyball game… Do you know that thing where people say that making something only takes 20% of the time but making it good takes 80% of the time? Yeah… I’ve been working on the game end screen for like 3 hours now and I just can’t get it to look right. The screenshot below is what I got after like 5 different prototypes and is nowhere near done. A lot of the effects that I’m trying to add seem to not work very well with Godot’s control nodes either, so they looked pretty jittery when I tried to set them up. Thankfully, I did get something good done! You can now access a menu during a match which allows you to adjust settings or leave the match and go back to the main menu."}, {"post_id": 16630, "ts": "2026-06-27T01:36:36Z", "hours": 2.4983, "text": "I finally got around to adding local PVP! So far, you’ve only been able to play against an AI, but I’ve made it so that there’s an option to select local PVP now, and it actually works! The left team is controlled by WASD, and the right team is controlled by the arrow keys. It honestly took way longer to implement than I thought. Maybe I shouldn’t have made so much spaghetti code… (▔﹏▔) I had to fix so many dependencies that I made initially just to set up the gameplay quickly. Really, it probably should have taken like 10 minutes since I already had all the logic down for player movement and gameplay. Still, I was able to finish it in the end. I won’t be able to work on this project for a bit since I’ll be out over the weekend, but I’ve definitely got a good idea of what I’ll be doing next!"}, {"post_id": 16069, "ts": "2026-06-26T03:43:29Z", "hours": 5.6756, "text": "I’ve finally set up a main menu for my beach volleyball game! Honestly, it might look a bit too good, because now the actual gameplay feels like it needs to be way better (┬┬﹏┬┬) But really, I’m proud of how it looks because I’ve never done a main menu before. The buttons are super satisfying to hover over, and in general, I think it looks really professional now. Plus, it worked almost first try! ( with the help of a couple youtube tutorials, but the slide in and hover animations of the buttons, as well as a bunch of other styling choices were all done by me! )"}, {"post_id": 15698, "ts": "2026-06-25T15:01:43Z", "hours": 10.4783, "text": "I’ve made some great progress on my beach volleyball game! Now you’re actually playing on a beach! It looks a bit empty though… I’ll probably add more to it later. I’ve also been working on making the game feel good. I added a bit of screenshake whenever the ball gets hit. I’ve also made it so that the camera zooms in when the ball gets hit up. There’s also a diamond transition and a score counter whenever a point is scored. Finally, bug fixing! Originally, if the ball hit the top of the net, the AI would think that the ball had hit the ground and would stop playing, but the ball is technically still in play. To fix this, I changed it so that the AI would recalculate where to move if the ball has substantially changed its trajectory, i.e. the ball bounces off the net, so it lands somewhere that wasn’t where it originally thought it would land. Also, I encountered a pretty funny bug while making it so that the ball would spin when it gets hit. It turns out you shouldn’t make a 2D sprite rotate in ALL directions! (screenshot below) Overall, I’m pretty happy with how things are going. I plan to continue polishing the game up as much as possible, so I don’t think I’ll be shipping for a while. Still, I think it should all be worth it!"}, {"post_id": 13923, "ts": "2026-06-22T20:39:01Z", "hours": 3.4772, "text": "I’ve gotten a lot of work done on my beach volleyball game! I’ve finished up all the animations, so all the player characters are actually moving and stuff. I also added some sprites for the net and the ball, so they actually look pretty nice now. I’ve also added a couple of effects to make the game a lot more interesting to look at as well as a lot more balanced. I noticed that it’s pretty much impossible to react to the enemy spikes instantly, so I added a small pause whenever one of the players spike or receive, both of which look really cool as well as make the game a lot more reasonable to play. I also made it so that the camera moves a little to follow the ball. All in all, I think that I’m on a good track to make a really solid finished product! I should probably also mention that the little blue outlines in the screenshot and the recording are debug lines to see collisions and raycasts. They’re not going to be there in the final game, they’re only there for testing. They do look pretty cool tho :p"}, {"post_id": 12886, "ts": "2026-06-21T03:23:01Z", "hours": 4.7542, "text": "I’ve finally got some player art for my beach volleyball game! I still need to set up animations though… still, I’ve got all the frames that I need, and I’ve already begun setting up animations for one of the player characters. I’m still balancing the actual gameplay, but I think that it should all be in a good state soon!"}, {"post_id": 12328, "ts": "2026-06-20T03:32:35Z", "hours": 4.41, "text": "I’ve been working some more on my beach volleyball game. Now you can play against an AI! It took me ages to figure out how to make the AI move exactly to the right location to hit the ball, but I was able to finally figure it out using a bunch of parabola equations (high school physics finally coming in clutch). Lowkey, the AI is way better at my game than me though😭 I’ll probably be able to work on some proper art soon, but for now I’m pretty satisfied with how things have turned out! Also, if you know how actual volleyball works, you probably know that people usually serve after the receive. I considered doing this, but I figured it would just complicate things, so I kept it at just a receive and a spike. And yes, I did in fact make this game because I loved the anime Haikyuu! (you should watch it too) BTW, I’m trying to upload a screen recording here, but I’m not completely sure if it will work or not. If it doesn’t, please tell me how I can make it work, and I’ll post an updated devlog."}, {"post_id": 11685, "ts": "2026-06-19T01:16:02Z", "hours": 1.4906, "text": "WHY IS HE GETTING CLOSER?!?! I’m working on a beach volleyball game. The game has 2D graphics, but I plan on making the background 3D, so the game uses 3D physics. It turns out that if you leave the Z position of the player a little off, they start sliding towards the camera. I’m still working on prototyping, so art isn’t final, but I’ve already set up a ball (the purple godot icon) that bounces and can be hit, so I should have something functional soon!"}, {"post_id": 1216, "ts": "2026-06-03T02:20:24Z", "hours": 0.4764, "text": "Just started, I’ve got a simple 3d scene set up for now with basic movement, I’m planning on eventually making it into a 2d beach volleyball game with 3d graphics (probably will have to get through finals week first tho). Should be pretty cool!"}]...
|
Title: Super Beach Ball by @Olebsbo | Stardance
D Title: Super Beach Ball by @Olebsbo | Stardance
Devlogs:
Just started, I’ve got a simple 3d scene set up for now with basic movement, I’m planning on eventually making it into a 2d beach volleyball game with 3d graphics (probably will have to get through finals week first tho). Should be pretty cool!
WHY IS HE GETTING CLOSER?!?! I’m working on a beach volleyball game. The game has 2D graphics, but I plan on making the background 3D, so the game uses 3D physics. It turns out that if you leave the Z position of the player a little off, they start sliding towards the camera. I’m still working on prototyping, so art isn’t final, but I’ve already set up a ball (the purple godot icon) that bounces and can be hit, so I should have something functional soon!
I’ve been working some more on my beach volleyball game. Now you can play against an AI! It took me ages to figure out how to make the AI move exactly to the right location to hit the ball, but I was able to finally figure it out using a bunch of parabola equations (high school physics finally coming in clutch). Lowkey, the AI is way better at my game than me though😭 I’ll probably be able to work on some proper art soon, but for now I’m pretty satisfied with how things have turned out! Also, if you know how actual volleyball works, you probably know that people usually serve after the receive. I considered doing this, but I figured it would just complicate things, so I kept it at just a receive and a spike. And yes, I did in fact make this game because I loved the anime Haikyuu! (you should watch it too) BTW, I’m trying to upload a screen recording here, but I’m not completely sure if it will work or not. If it doesn’t, please tell me how I can make it work, and I’ll post an updated devlog.
I’ve finally got some player art for my beach volleyball game! I still need to set up animations though… still, I’ve got all the frames that I need, and I’ve already begun setting up animations for one of the player characters. I’m still balancing the actual gameplay, but I think that it should all be in a good state soon!
I’ve gotten a lot of work done on my beach volleyball game! I’ve finished up all the animations, so all the player characters are actually moving and stuff. I also added some sprites for the net and the ball, so they actually look pretty nice now. I’ve also added a couple of effects to make the game a lot more interesting to look at as well as a lot more balanced. I noticed that it’s pretty much impossible to react to the enemy spikes instantly, so I added a small pause whenever one of the players spike or receive, both of which look really cool as well as make the game a lot more reasonable to play. I also made it so that the camera moves a little to follow the ball. All in all, I think that I’m on a good track to make a really solid finished product! I should probably also mention that the little blue outlines in the screenshot and the recording are debug lines to see collisions and raycasts. They’re not going to be there in the final game, they’re only there for testing. They do look pretty cool tho :p
I’ve made some great progress on my beach volleyball game! Now you’re actually playing on a beach! It looks a bit empty though… I’ll probably add more to it later. I’ve also been working on making the game feel good. I added a bit of screenshake whenever the ball gets hit. I’ve also made it so that the camera zooms in when the ball gets hit up. There’s also a diamond transition and a score counter whenever a point is scored. Finally, bug fixing! Originally, if the ball hit the top of the net, the AI would think that the ball had hit the ground and would stop playing, but the ball is technically still in play. To fix this, I changed it so that the AI would recalculate where to move if the ball has substantially changed its trajectory, i.e. the ball bounces off the net, so it lands somewhere that wasn’t where it originally thought it would land. Also, I encountered a pretty funny bug while making it so that the ball would spin when it gets hit. It turns out you shouldn’t make a 2D sprite rotate in ALL directions! (screenshot below) Overall, I’m pretty happy with how things are going. I plan to continue polishing the game up as much as possible, so I don’t think I’ll be shipping for a while. Still, I think it should all be worth it!
I’ve finally set up a main menu for my beach volleyball game! Honestly, it might look a bit too good, because now the actual gameplay feels like it needs to be way better (┬┬﹏┬┬) But really, I’m proud of how it looks because I’ve never done a main menu before. The buttons are super satisfying to hover over, and in general, I think it looks really professional now. Plus, it worked almost first try! ( with the help of a couple youtube tutorials, but the slide in and hover animations of the buttons, as well as a bunch of other styling choices were all done by me! )
I finally got around to adding local PVP! So far, you’ve only been able to play against an AI, but I’ve made it so that there’s an option to select local PVP now, and it actually works! The left team is controlled by WASD, and the right team is controlled by the arrow keys. It honestly took way longer to implement than I thought. Maybe I shouldn’t have made so much spaghetti code… (▔﹏▔) I had to fix so many dependencies that I made initially just to set up the gameplay quickly. Really, it probably should have taken like 10 minutes since I already had all the logic down for player movement and gameplay. Still, I was able to finish it in the end. I won’t be able to work on this project for a bit since I’ll be out over the weekend, but I’ve definitely got a good idea of what I’ll be doing next!
I’ve been working some more on my beach volleyball game… Do you know that thing where people say that making something only takes 20% of the time but making it good takes 80% of the time? Yeah… I’ve been working on the game end screen for like 3 hours now and I just can’t get it to look right. The screenshot below is what I got after like 5 different prototypes and is nowhere near done. A lot of the effects that I’m trying to add seem to not work very well with Godot’s control nodes either, so they looked pretty jittery when I tried to set them up. Thankfully, I did get something good done! You can now access a menu during a match which allows you to adjust settings or leave the match and go back to the main menu.
I think I’ve finally got a good end screen for my beach volleyball game! It took a while, but I think I’ve got something I’m pretty happy with! I might work on it a bit more in future, but for now I think that it works well enough. There’s currently two randomized animations that the winning team might do, and I’ve shown an example of each below in the screenshot and the screen recording respectively.
I’ve started work on a tutorial for my beach volleyball game! I’m not gonna lie, my game is WAY harder to explain than I thought it would be 😅. Making a tutorial was pretty weird because a lot of the rules and whatnot would be pretty confusing for somebody who’s never seen volleyball being played before. I’ve tried to make the tutorial as interactive as I could, but some things are just not very easy to show and I have to use a bunch of text to explain them. I’ll have to test the tutorial on some of my friends for now, but I think it’s a good start.
I got some good feedback from some playtesters, and I’ve added some solid changes to my beach volleyball game! There’s now a tutorial manual in the menu! I found that the actual interactive tutorial can be a bit difficult in terms of fully conveying the game’s rules to the player, so I decided that a tutorial manual for some of the more complicated things would be best. I also made a couple of small changes, like adding an indicator to show which character the player is controlling and fixing some smaller bugs, like how the ball used to detect multiple spikes if you spammed the spike button. There weren’t too many major changes, but I think that I’m definitely getting toward a more polished experience now :)
I’ve been working on a bunch of polishing for my beach volleyball game! Now there’s a bunch of particle effects! There’s wind and leaf particles in the background that appear in random quantities. As the game progresses, the amount of each slowly increases so it looks like the game is getting really intense. I included a screenshot below of me testing the particles with godot icons as placeholders, and I think it looks pretty goofy. There’s also sand particles when the players move. Also, I’ve made it so that after 10 rallies, the ball starts moving faster to challenge high level players. It also gets set on fire and becomes more and more red as it gets faster, because fire is pretty cool :D Finally, I’ve been working a bit on the audio side of things. I’m a beginner at making music and sound effects, so I don’t think they’ll be too good, but I think that it’s good to try anyways and learn!
I’ve done some more work on the music for my beach volleyball game! I think that I’m pretty much done with the main menu theme and the gameplay theme. I just have to do the win screen music now, and I think I have a pretty good idea of how I want it to sound. I think the music could definitely be better, but since I don’t do this kind of thing much, I’m pretty happy with how it’s come out!
I’m actually getting pretty close to being done with my beach volleyball game! q(≧▽≦q) I’m done with the music for the win screen. I’ve also added a couple of small details like some boats and birds in the background to make the ocean look a little less empty, and some general bug fixing stuff. I also changed the volleyball color slightly because I kinda realized that it looks too much like a Mikasa volleyball and while I think I’ll be fine I don’t want to get sued (´。_。`) In general, I’m pretty close to being done! I think I’ll keep on working on touching up some small things, but I should be ready to ship soon!
I’m finally finished with my beach volleyball game! (Hopefully) I’ve pretty much just been touching up on some small things like making the background look a bit more interesting and adjusting some variables to make playing the game more intuitive. It’s basically done now! I plan on playtesting it one more time, and then after that I may do some minor adjustments, but the actual game is complete and I don’t plan on changing any of the gameplay anymore. I’ve been working on this project for 75 hours now, and I’m really proud of it; hopefully the next devlog will be the final one! :D
This is my final devlog! I’ve posted the itch.io page! And then itch went down for a couple minutes… But I should be ready to ship now. If you’d like, you should be able to play the game now! Thanks for reading!
I’ve made some really quick QOL adjustments to my game! It was some pretty basic stuff that I just didn’t account for previously because I just didn’t think of it before. Some changes include: Trying to account for weird resolutions (not 16:9) by adding black bars to the side (cannot confirm if it works yet) Adding additional information to the itch.io page to remind people about the tutorial and to mention that there might be some lag at the start of the web version Sorry I had to add this after the ship, but these changes were really simple and important, so I just felt like I had to! Also, I’d assume that this isn’t considered fraud or anything because it’s just a quick QOL update after the ship that doesn’t change anything major, just makes the experience better for players, and actual games do these kinds of emergency updates all the time. Also, I haven’t seen anything about this kind of thing being a possible problem. IF YOU ARE RATING , could you please take this information into account as well? It isn’t included in the ship information, but this info is also important.
Ships:
This is the ship for my beach volleyball game! :D I’m really proud of this project. I had to learn so many new things about UI, music, SFX, and other things that I just never got around to in my previous projects because I never reached the point where I could actually release my previous games. I struggled a lot with these things at first, but now I really think that I can make them all work well in my future projects! I should probably mention a few things (this might be a bit long, but please try to read it, the itch.io page also has some of the same info but this one is probably better for people specifically coming from Stardance) First of all, while the game is available to play in the browser, it seems that the lighting and particles get messed up. I think it is because of Godot’s way of exporting to HTML (I think it has to downgrade the graphics a bit to make it work properly), so unfortunately, if you do play it in browser you will have to deal with some weird lighting. The particles can be turned off in the options menu. The downloaded version is just fine, so if you can use that, that would be great! Although, I perfectly understand if you don’t want to download from a random stranger on the internet, and I haven’t tested the Mac or Linux versions (look at the download info on the itch.io page for more). Second, while I have tested the game with my friends, I’m still very uncertain about how effective the tutorial is. I believe that it should be fine if you read through carefully. If you find it confusing, then I sincerely apologize and hope you don’t take it to represent the entire game, and you can tell me what you found difficult. Also, the game is WAY more fun when you play with friends/family! Like, seriously, get someone to go through the tutorial and play with you. The competitiveness makes it so much more enjoyable! And if you’re friends can’t play with you at the moment, then playing against the AI can still be fun. If there are any bugs, please tell me! Just give me the situation that it happened in and what the bug actually was. And finally, thank you for trying my game! I worked very hard on it, and I’m really glad that it turned out the way it did! And if you don’t like it… uhhh please don’t cook the rating ⊙﹏⊙∥ remember to rate fairly!...
|
1792972130.755098
|
1793058530.755098
|
|
41645
|
ScriptCanvas by @M-Mrk | Stardance
|
M-Mrk
|
1
|
73.0
|
1445
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T12:25:53Z", "hours": 73.0, "multiplier": 19.83, "payout": 1445, "blessing": "neutral", "text": "I made a web app where you can make simple scripts to create interesting outputs. Its really fun to see what patterns and stuff you can create from very simple logic! The web app is statically hosted on github pages and does not need any server. It is build on a very performant stack. The main UI thread dispatches a request to a web worker which on a separate thread executes optimized rust WASM. That WASM compiles the script to an AST and then evaluates it a bunch of times across all the needed scopes. Finally the web worker can message the main UI thread back. This separation is needed to not freeze the UI during script evaluation, but because there is a memory separation it was very annoying to work with. I used a vanilla-ish stack with no web framework, but with TS. I learned a lot about CSS and TS/JS. Using a framework would have probably sped up development but I wanted to first really understand what a framework would need to do under the hood before moving to that. All in all I am very proud of this project! Hopefully others find the concept as interesting as I do!", "repo": "https://github.com/M-Mrk/ScriptCanvas", "demo": "https://m-mrk.github.io/ScriptCanvas/"}]...
|
[{"post_id": 70586, "ts": "202 [{"post_id": 70586, "ts": "2026-09-19T12:16:31Z", "hours": 7.545, "text": "Final touches Spelling mistakes I fixed a lot of spelling mistakes in the tutorial and help box sections. I think I should keep writing tutorials and docs to times before 1 am. Plot I also added a new output the plot ! The script gets a x value and returns the matching y value. Those pairs then get displayed on a plot using graph.js. During this addition I also reworked the core rust 🦀 engine a bit so now stuff that should be output independent, like creating a Rhai engine or compiling a Rhai script to an AST, is in its own file. Then I added the rust logic and it just returns an array of X and Y value pairs when done. Adding the UI and lifecycle stuff for the plot was rather easy because I kept everything pretty modular with easy expansion in mind. However styling the plot was rather complicated and I now have a enormous JavaScript Object detailing all the small bits and pieces to make the plot look alright! Repo PixelMatrix was always a temporary name as it is only really fitting for the grid output, so I renamed this project to ScriptCanvas. I think this is more fitting because it does use scripts and it also draws those on canvas elements! I also added a README to the repo. As testing on chrome and firefox also looked good I think I am ready to ship !"}, {"post_id": 65338, "ts": "2026-09-10T12:44:05Z", "hours": 7.6142, "text": "Help, Docs and a Tutorial Help menu and Docs I added a Help modal under the “?” button. It has some actions like opening the tutorial again and features some docs. There are docs on the specific output explaining what the output expects and listing all available variables in scope of the output. So for Grid it explains how the script will be evaluated over all pixels in a grid and the script returns an RGB value setting that pixels color. Then it lists all the variables, like ‘x’ the x-coordinate of the pixel. Tutorial I also added a short tutorial which explains how to get a running script under Grid. I hope it explains all the concepts step by step and that it is understandable. Originally it was more of a tour of the UI and explained all the buttons, but I think that most of that is pretty self explanatory and the new tutorial is better at explaining how to actually use this. Next up I will add 1 more output before shipping!"}, {"post_id": 62520, "ts": "2026-09-05T22:45:09Z", "hours": 8.4306, "text": "Coming to an end I am kind off getting frustrated with this project, I cant handle this stack anymore , I yearn for hardware again. I am aiming to finish this in the next 2 weeks! Well any ways here is what I did: Output stretching Until now the grid output was always a square, so if you had a non-square resolution it would be stretched to one. Now it actually gets the shape of the resolution and it uses the most of the usable space it can. I also added a option to return to the original method. Blur Initially I had some problems with drawing pixels to the canvas. I drew rectangles to the canvas but some image smoothing settings were adding anti-aliasing and similar stuff making the pixels look weird. I fixed that by just creating raw image data, but it was a cool effect for some situations, like generating a gradient. So I added a option to toggle this image smoothing of the browser. Sadly as it is browser based I’d probably has very different results on different browsers. Small UI I did a bunch of css fixes to make the ui more resizable and trigger a bunch of stuff on resizing. Then I added a tabbar and reduced the layout. In the normal layout the editor and output are side by side and when the screen is too small only one is shown and you can switch with the tabbar. It also moves the top bar actions into a setting pop up. Tip box Some features might not be self explanatory, so I added this small tip tool when hovering above stuff for some time. To not be stuck on this for too much longer I scrapped the idea of the landing page and I will instead add a tutorial."}, {"post_id": 55286, "ts": "2026-08-27T00:47:28Z", "hours": 8.4031, "text": "Layouting, resizing and a console Console I finally got everything working together. This means that you can now use print() and debug() in the script and it’ll output to the console ! It’ll tell you what was printed and at what pixel, e.g. [x:2|y:4] => here! . I’ve attached a diagram of why some parts of this project are really painful to work with. Its largely due to the amount of wrappers needed, because of the memory and thread separation of the web worker/wasm. Reworking this was really not fun and just doing it better the 1. time would’ve saved me a lot of time. The console won’t be in use all the time and not everyone will use it so I also wanted to limit the space it takes. I firstly reduced the standard space it gets down to 5% of the view height and then made it drag resizable. You can press and hold on the drag handle of the console and stretch it out over the output and editor. This way you can decide how much screen space you want to sacrifice. I used the pointer API so in theory this should work with all kinds of stuff from fingers to pens. In the end the console was way more css intensive then I thought as it needs some and css tomfoolery in order to scroll without blowing up the DOM. Performance increases I learned about Abstract Syntax Trees and made the wasm precompile the script to an AST before rerunning it a bunch of times with different scopes. This was another substantial performance increase decreasing the per pixel time form 0.04ms down to 0.004ms. Wow was the wasm unoptimized Error highlighting I finally added error highlighting. The line with an error now gets highlighted in the editor. During adding this feature with the Monaco editor I also accidently bumped my bundled js to 500kb . This was due to it importing a bunch of syntax stuff for different languages. Thankfully changing one Monaco.something to monaco.something resolved this QoL errors get cleared when rerunning script add resolution to script scope UI I noticed that you couldn’t resize the app to something smaller. You could however make it smaller and then reload. Meaning that it was able to come up with a good layout but something was greedy and holding on to its space. Width wise this was easy to fix by adding a dynamic sizing flag to the editor and some min-width: 0 s to some elements, but height wise i couldn’t get it to work. Turns out even with dynamic sizing the editor is still not the biggest fan of being resized so I had to add a ResizeObserver and call the editors layout method to make it reconsider its size Next up I will now implement a better UI for smaller screens, but first I need to declutter my css and html to make it more maintainable . Other additions/fixes"}, {"post_id": 52430, "ts": "2026-08-22T15:34:18Z", "hours": 9.8981, "text": "Continuing on improving the ui and some refactors Number input styling Those now also have better tui like styling. I added sqaure brackets [] to the ends, the hover background highlighting and a blinking underscore if you focus on it. Though am unsure whether it is clear enough that you are supposed to enter text into them. If you’ve got any improvement ideas let me know. Loading indicator When something is loading I can add the loading class which displays the typical tui animation spinner before it. The one made up of brail dots ⠧ Central Icon I felt that the run button could be unnoticed so I added an icon to the middle of screen. It also shows the loading to make it more clear that the script is actually being run. Error pop up Instead of just having some red text in the console I add a real error pop up with a blinking dashed red outline. Performance increase I spent some time thinking about doing a bunch of stuff to make my wasm multi threaded and async, which included using nightly features, a service worker shim to change http headers, etc. Because I felt that the script running was way too slow and I wanted better performance and the ability to easily cancel the running wasm. Currently the wasm is blocking and goes over each pixel one by one. But before I implemented that I did some other performance changes, like only creating 1 shared rhai engine for all pixels. Before every pixel created its own rhai engine. This change was way more substantial than I thought, as it took the per pixel time from 0.5ms down to 0.04ms . This means 255*255 pixel or 65k pixel don’t take 12s but 2s. This is such a change that I think implementing all the async and multi threading would just be a waste of time, so I’ll stash that idea for now. console I also styled the console part and added all the ui logic. I want to give the user the option to use a print function in there script for debugging purposes. Then in the console it’ll show on which pixel the debug comes from and what it says. But as the image can get pretty big and the user might print once or more per pixel, just adding some Nodes to a console div would probably blow up everything. So at first I experimented with a canvas. The canvas overlays on the console div and then behind it is a big spacer which allows for scrolling, some code would then change what the canvas shows based on where the back is scrolled to. After I had gotten it to display some logs nicely, I realized that this way doesn’t allow the user to highlight and copy the logs, which is probably something someone might want to do. So I switched the canvas out with a normal div. Instead of drawing the logs to a canvas the logs do get added as nodes, but only the visible ones and the scrolling changes which are shown. This way the user can interact with them like normal text and the DOM doesn’t have to render 1k+ nodes. This seems to work really good, the only problem was getting the scrolling to work while the log nodes occupy the same space, but with some css trickery and EventListeners I can pass any scrolling done on the logs through to the background scrolling element. Refactoring I am still working on the wasm part of allowing the user to use print(). While implementing that i had to change what it outputs and refactored the rust project structure. When I then got to the part where the browsers main ui thread interacts with the web worker which runs the wasm, I realized how badly that part was written, with so many loose interfaces and strings. So I am currently still refactoring that and trying not to loose my mind. Still not a big fan of and"}, {"post_id": 48552, "ts": "2026-08-17T00:09:58Z", "hours": 9.9247, "text": "New UI plans and some QoL features Features Auto clamp 🗜️ It can be really frustrating if the output exceeds 255 and everything errors out. So I added a auto clamp checkbox, which just clamps the output to the expected range of 0 to 255. Hot reload I also added a check box for hot reloading. When you stop typing, the script will automatically run. No need to press the run button. Probably a bit annoying on larger resolutions so you can disable it. New UI I also started building the real UI. Initially I just did the layout: top bar with global settings middle part with editor and output console output, where print calls and errors will go. The output part also has a tool bar with output specific settings. An explanation of the app will go on the index and it will have a link to /app where the actual stuff is. This way I don’t have to give any screen space up for an introduction when not needed. Currently the index is just a redirect. Initially I wanted to go with a windows 8 panel style UI, so nothing rounded and only big rectangular tiles. But during experimenting I made the tile only as big as its text and when the background color got highlighted it reminded me of a TUI button. So from that point on I decided to try and style my entire site like that. I think I can pull this TUI look off, but the current styling is definitely not finished. I do however already like the checkboxes, which are styled like [ ] and [*], and the dropdown select. The select was way harder to do as you can’t really style the vanilla element, as it depends on os and browser styling. So you have to create your own. I would say I learned a lot new things about css. Especially stuff like ::before and ::after are super handy for the look I am going for."}, {"post_id": 42180, "ts": "2026-08-06T19:57:02Z", "hours": 10.0303, "text": "DEMO HERE and as soon as github gets itself back together I can also push the newest changes to it! Refactor, refactor and some more refactoring Actual new features I added options to the top. You can switch the output type and script language. But seeing as there currently is only 1 language (Rhai) and 1 output type (Grid) they are kinda pointless. I also added output specific options, for Grid it is currently just the resolution. Also I added a spinner to the run button to indicate that the script is running but that didn’t work until a refactor/feature mentioned later. Refactors The rest of the time was all spent on refactoring. But I do think it was worth it and it is now way easier to add new features. Modularity I introduced a state system where each output type has its own module. Each output only exposes a common interface with a init, deinit and pipeline method. This way other parts, don’t need to deal with what output is set. Each output also deals with its specific settings and UI itself. -> I fully switched from to . I was kind of fed up with the loosey goosey attitude of javascript where nothing is really defined. Typescript doesn’t fix that entirely but does help to find a lot more bugs when writing the code and not at runtime. Vite As does need some sort of bundler/builder I set up vite for the project. This also means I can make the repo more source files only. Before I had the compiled wasm also in the repo, but now it gets compiled together with vite’s build process in the github action. Probably vite also has some other performance benefits. Web Worker As I mentioned before I added a spinner to when the script was being run to show that something is actually happening, but the that wasn’t showing. Because I had everything running off of the main thread calling the WASM blocked everything else even the UI and the browser would ask whether to close the page. The solution is to move it to a web worker, which runs in a separate thread. This was probably the most difficult thing, because it required major changes and it is a bit more complicated because of WASM. When a WASM function returns something, it normally uses a pointer to shared memory, so that there is no unnecessary cloning, but because the WASM runs in the memory of the web worker the main thread can’t access it. So I had to work around that."}, {"post_id": 39133, "ts": "2026-08-01T21:00:01Z", "hours": 5.4594, "text": "FOR CURRENT DEMO CLICK HERE Rhai support I got rhai to work. It took a bit to figure out how to expect the script to return an array of 3 u8’s, but after figuring out that all rhai numbers are i64 and then figuring out how to downsize that to u8 it works! Later I then added the current coordinates into the scope and a rand function to generate noise. Monaco A bare textarea element for script input is pretty bad so I switched to the monaco editor. Its the same one VSCode uses so most of us should be pretty familar with it and its keybinds. It took some time to figure out how to load monaco from CDN and not build locally. I also had some cosmetic bugs with the minimap, so I just disabled it as the scripts should be rather short and its not that useful anyways. Using localstorage the script now also persist between sessions. Anti-Aliasing As you can see the output isn’t clear but has these weird white lines. These do go away after running the script multiple times. This due to the browser doing some post processing like anti-aliasing on the drawn rectangles and it adds some semi-transparent pixels to the edges. This is especially bad if you pass use decimal values as coordinates to draw to the canvas, which I am doing to fit my pixels on there. I tried multiple methods to disable this post-processing for drawing filled rectangles, but nothing worked. The solution is to use a hidden canvas, draw the output at native resolution to it and then transfer the image from that canvas to the real one. The putImage function does allow me to disable post processing and adjust the destination size. Now it works and the bare minimum is here . As always you can test it here ! It automatically runs off of the latest commit."}, {"post_id": 38401, "ts": "2026-07-31T19:09:15Z", "hours": 5.5975, "text": "Idea I really like experimenting with random functions and math relations and then displaying them. So I want to make this website where you can write a script to run on every pixel and then display the result. Originally this was just rust code creating ppm pictures, but a web app is more accessible. Implementation I am still not the biggest JS fan and more comfortable with rust, so I will use WASM to make rust run in the browser. This also has some performance benefits and I can easily add scripting languages Canvas The first step was to have something I can draw pixels to with JS. I went with a canvas and drawing filled rects to it. WASM Rust to WASM seems to have a very mature pipeline and its very easy. You just write normal rust code and all functions, types, etc you want to expose to JS you can use #[wasm_bindgen] from the wasm-bindgen crate. Then after installing wasm-pack you can run wasm-pack build --target web to compile the rust to wasm. It also automatically generates the JS glue and TS headers. In JS you just have to import a init function and the exposed wasm functions you want to use. The browser does the rest! Everything will run locally in the browser, which also means we can use githubs free static hosting , which I already setup with a github action, check it out here ! Currently I have only got a bare minimum UI and no language support. Next on my list is adding Rhai support (scripting language similar to rust) and getting that to actually output some pixels."}]...
|
Title: ScriptCanvas by @M-Mrk | Stardance
Devlogs Title: ScriptCanvas by @M-Mrk | Stardance
Devlogs:
Idea I really like experimenting with random functions and math relations and then displaying them. So I want to make this website where you can write a script to run on every pixel and then display the result. Originally this was just rust code creating ppm pictures, but a web app is more accessible. Implementation I am still not the biggest JS fan and more comfortable with rust, so I will use WASM to make rust run in the browser. This also has some performance benefits and I can easily add scripting languages Canvas The first step was to have something I can draw pixels to with JS. I went with a canvas and drawing filled rects to it. WASM Rust to WASM seems to have a very mature pipeline and its very easy. You just write normal rust code and all functions, types, etc you want to expose to JS you can use #[wasm_bindgen] from the wasm-bindgen crate. Then after installing wasm-pack you can run wasm-pack build --target web to compile the rust to wasm. It also automatically generates the JS glue and TS headers. In JS you just have to import a init function and the exposed wasm functions you want to use. The browser does the rest! Everything will run locally in the browser, which also means we can use githubs free static hosting , which I already setup with a github action, check it out here ! Currently I have only got a bare minimum UI and no language support. Next on my list is adding Rhai support (scripting language similar to rust) and getting that to actually output some pixels.
FOR CURRENT DEMO CLICK HERE Rhai support I got rhai to work. It took a bit to figure out how to expect the script to return an array of 3 u8’s, but after figuring out that all rhai numbers are i64 and then figuring out how to downsize that to u8 it works! Later I then added the current coordinates into the scope and a rand function to generate noise. Monaco A bare textarea element for script input is pretty bad so I switched to the monaco editor. Its the same one VSCode uses so most of us should be pretty familar with it and its keybinds. It took some time to figure out how to load monaco from CDN and not build locally. I also had some cosmetic bugs with the minimap, so I just disabled it as the scripts should be rather short and its not that useful anyways. Using localstorage the script now also persist between sessions. Anti-Aliasing As you can see the output isn’t clear but has these weird white lines. These do go away after running the script multiple times. This due to the browser doing some post processing like anti-aliasing on the drawn rectangles and it adds some semi-transparent pixels to the edges. This is especially bad if you pass use decimal values as coordinates to draw to the canvas, which I am doing to fit my pixels on there. I tried multiple methods to disable this post-processing for drawing filled rectangles, but nothing worked. The solution is to use a hidden canvas, draw the output at native resolution to it and then transfer the image from that canvas to the real one. The putImage function does allow me to disable post processing and adjust the destination size. Now it works and the bare minimum is here . As always you can test it here ! It automatically runs off of the latest commit.
DEMO HERE and as soon as github gets itself back together I can also push the newest changes to it! Refactor, refactor and some more refactoring Actual new features I added options to the top. You can switch the output type and script language. But seeing as there currently is only 1 language (Rhai) and 1 output type (Grid) they are kinda pointless. I also added output specific options, for Grid it is currently just the resolution. Also I added a spinner to the run button to indicate that the script is running but that didn’t work until a refactor/feature mentioned later. Refactors The rest of the time was all spent on refactoring. But I do think it was worth it and it is now way easier to add new features. Modularity I introduced a state system where each output type has its own module. Each output only exposes a common interface with a init, deinit and pipeline method. This way other parts, don’t need to deal with what output is set. Each output also deals with its specific settings and UI itself. -> I fully switched from to . I was kind of fed up with the loosey goosey attitude of javascript where nothing is really defined. Typescript doesn’t fix that entirely but does help to find a lot more bugs when writing the code and not at runtime. Vite As does need some sort of bundler/builder I set up vite for the project. This also means I can make the repo more source files only. Before I had the compiled wasm also in the repo, but now it gets compiled together with vite’s build process in the github action. Probably vite also has some other performance benefits. Web Worker As I mentioned before I added a spinner to when the script was being run to show that something is actually happening, but the that wasn’t showing. Because I had everything running off of the main thread calling the WASM blocked everything else even the UI and the browser would ask whether to close the page. The solution is to move it to a web worker, which runs in a separate thread. This was probably the most difficult thing, because it required major changes and it is a bit more complicated because of WASM. When a WASM function returns something, it normally uses a pointer to shared memory, so that there is no unnecessary cloning, but because the WASM runs in the memory of the web worker the main thread can’t access it. So I had to work around that.
New UI plans and some QoL features Features Auto clamp 🗜️ It can be really frustrating if the output exceeds 255 and everything errors out. So I added a auto clamp checkbox, which just clamps the output to the expected range of 0 to 255. Hot reload I also added a check box for hot reloading. When you stop typing, the script will automatically run. No need to press the run button. Probably a bit annoying on larger resolutions so you can disable it. New UI I also started building the real UI. Initially I just did the layout: top bar with global settings middle part with editor and output console output, where print calls and errors will go. The output part also has a tool bar with output specific settings. An explanation of the app will go on the index and it will have a link to /app where the actual stuff is. This way I don’t have to give any screen space up for an introduction when not needed. Currently the index is just a redirect. Initially I wanted to go with a windows 8 panel style UI, so nothing rounded and only big rectangular tiles. But during experimenting I made the tile only as big as its text and when the background color got highlighted it reminded me of a TUI button. So from that point on I decided to try and style my entire site like that. I think I can pull this TUI look off, but the current styling is definitely not finished. I do however already like the checkboxes, which are styled like [ ] and [*], and the dropdown select. The select was way harder to do as you can’t really style the vanilla element, as it depends on os and browser styling. So you have to create your own. I would say I learned a lot new things about css. Especially stuff like ::before and ::after are super handy for the look I am going for.
Continuing on improving the ui and some refactors Number input styling Those now also have better tui like styling. I added sqaure brackets [] to the ends, the hover background highlighting and a blinking underscore if you focus on it. Though am unsure whether it is clear enough that you are supposed to enter text into them. If you’ve got any improvement ideas let me know. Loading indicator When something is loading I can add the loading class which displays the typical tui animation spinner before it. The one made up of brail dots ⠧ Central Icon I felt that the run button could be unnoticed so I added an icon to the middle of screen. It also shows the loading to make it more clear that the script is actually being run. Error pop up Instead of just having some red text in the console I add a real error pop up with a blinking dashed red outline. Performance increase I spent some time thinking about doing a bunch of stuff to make my wasm multi threaded and async, which included using nightly features, a service worker shim to change http headers, etc. Because I felt that the script running was way too slow and I wanted better performance and the ability to easily cancel the running wasm. Currently the wasm is blocking and goes over each pixel one by one. But before I implemented that I did some other performance changes, like only creating 1 shared rhai engine for all pixels. Before every pixel created its own rhai engine. This change was way more substantial than I thought, as it took the per pixel time from 0.5ms down to 0.04ms . This means 255*255 pixel or 65k pixel don’t take 12s but 2s. This is such a change that I think implementing all the async and multi threading would just be a waste of time, so I’ll stash that idea for now. console I also styled the console part and added all the ui logic. I want to give the user the option to use a print function in there script for debugging purposes. Then in the console it’ll show on which pixel the debug comes from and what it says. But as the image can get pretty big and the user might print once or more per pixel, just adding some Nodes to a console div would probably blow up everything. So at first I experimented with a canvas. The canvas overlays on the console div and then behind it is a big spacer which allows for scrolling, some code would then change what the canvas shows based on where the back is scrolled to. After I had gotten it to display some logs nicely, I realized that this way doesn’t allow the user to highlight and copy the logs, which is probably something someone might want to do. So I switched the canvas out with a normal div. Instead of drawing the logs to a canvas the logs do get added as nodes, but only the visible ones and the scrolling changes which are shown. This way the user can interact with them like normal text and the DOM doesn’t have to render 1k+ nodes. This seems to work really good, the only problem was getting the scrolling to work while the log nodes occupy the same space, but with some css trickery and EventListeners I can pass any scrolling done on the logs through to the background scrolling element. Refactoring I am still working on the wasm part of allowing the user to use print(). While implementing that i had to change what it outputs and refactored the rust project structure. When I then got to the part where the browsers main ui thread interacts with the web worker which runs the wasm, I realized how badly that part was written, with so many loose interfaces and strings. So I am currently still refactoring that and trying not to loose my mind. Still not a big fan of and
Layouting, resizing and a console Console I finally got everything working together. This means that you can now use print() and debug() in the script and it’ll output to the console ! It’ll tell you what was printed and at what pixel, e.g. [x:2|y:4] => here! . I’ve attached a diagram of why some parts of this project are really painful to work with. Its largely due to the amount of wrappers needed, because of the memory and thread separation of the web worker/wasm. Reworking this was really not fun and just doing it better the 1. time would’ve saved me a lot of time. The console won’t be in use all the time and not everyone will use it so I also wanted to limit the space it takes. I firstly reduced the standard space it gets down to 5% of the view height and then made it drag resizable. You can press and hold on the drag handle of the console and stretch it out over the output and editor. This way you can decide how much screen space you want to sacrifice. I used the pointer API so in theory this should work with all kinds of stuff from fingers to pens. In the end the console was way more css intensive then I thought as it needs some and css tomfoolery in order to scroll without blowing up the DOM. Performance increases I learned about Abstract Syntax Trees and made the wasm precompile the script to an AST before rerunning it a bunch of times with different scopes. This was another substantial performance increase decreasing the per pixel time form 0.04ms down to 0.004ms. Wow was the wasm unoptimized Error highlighting I finally added error highlighting. The line with an error now gets highlighted in the editor. During adding this feature with the Monaco editor I also accidently bumped my bundled js to 500kb . This was due to it importing a bunch of syntax stuff for different languages. Thankfully changing one Monaco.something to monaco.something resolved this QoL errors get cleared when rerunning script add resolution to script scope UI I noticed that you couldn’t resize the app to something smaller. You could however make it smaller and then reload. Meaning that it was able to come up with a good layout but something was greedy and holding on to its space. Width wise this was easy to fix by adding a dynamic sizing flag to the editor and some min-width: 0 s to some elements, but height wise i couldn’t get it to work. Turns out even with dynamic sizing the editor is still not the biggest fan of being resized so I had to add a ResizeObserver and call the editors layout method to make it reconsider its size Next up I will now implement a better UI for smaller screens, but first I need to declutter my css and html to make it more maintainable . Other additions/fixes
Coming to an end I am kind off getting frustrated with this project, I cant handle this stack anymore , I yearn for hardware again. I am aiming to finish this in the next 2 weeks! Well any ways here is what I did: Output stretching Until now the grid output was always a square, so if you had a non-square resolution it would be stretched to one. Now it actually gets the shape of the resolution and it uses the most of the usable space it can. I also added a option to return to the original method. Blur Initially I had some problems with drawing pixels to the canvas. I drew rectangles to the canvas but some image smoothing settings were adding anti-aliasing and similar stuff making the pixels look weird. I fixed that by just creating raw image data, but it was a cool effect for some situations, like generating a gradient. So I added a option to toggle this image smoothing of the browser. Sadly as it is browser based I’d probably has very different results on different browsers. Small UI I did a bunch of css fixes to make the ui more resizable and trigger a bunch of stuff on resizing. Then I added a tabbar and reduced the layout. In the normal layout the editor and output are side by side and when the screen is too small only one is shown and you can switch with the tabbar. It also moves the top bar actions into a setting pop up. Tip box Some features might not be self explanatory, so I added this small tip tool when hovering above stuff for some time. To not be stuck on this for too much longer I scrapped the idea of the landing page and I will instead add a tutorial.
Help, Docs and a Tutorial Help menu and Docs I added a Help modal under the “?” button. It has some actions like opening the tutorial again and features some docs. There are docs on the specific output explaining what the output expects and listing all available variables in scope of the output. So for Grid it explains how the script will be evaluated over all pixels in a grid and the script returns an RGB value setting that pixels color. Then it lists all the variables, like ‘x’ the x-coordinate of the pixel. Tutorial I also added a short tutorial which explains how to get a running script under Grid. I hope it explains all the concepts step by step and that it is understandable. Originally it was more of a tour of the UI and explained all the buttons, but I think that most of that is pretty self explanatory and the new tutorial is better at explaining how to actually use this. Next up I will add 1 more output before shipping!
Final touches Spelling mistakes I fixed a lot of spelling mistakes in the tutorial and help box sections. I think I should keep writing tutorials and docs to times before 1 am. Plot I also added a new output the plot ! The script gets a x value and returns the matching y value. Those pairs then get displayed on a plot using graph.js. During this addition I also reworked the core rust 🦀 engine a bit so now stuff that should be output independent, like creating a Rhai engine or compiling a Rhai script to an AST, is in its own file. Then I added the rust logic and it just returns an array of X and Y value pairs when done. Adding the UI and lifecycle stuff for the plot was rather easy because I kept everything pretty modular with easy expansion in mind. However styling the plot was rather complicated and I now have a enormous JavaScript Object detailing all the small bits and pieces to make the plot look alright! Repo PixelMatrix was always a temporary name as it is only really fitting for the grid output, so I renamed this project to ScriptCanvas. I think this is more fitting because it does use scripts and it also draws those on canvas elements! I also added a README to the repo. As testing on chrome and firefox also looked good I think I am ready to ship !
Ships:
I made a web app where you can make simple scripts to create interesting outputs. Its really fun to see what patterns and stuff you can create from very simple logic! The web app is statically hosted on github pages and does not need any server. It is build on a very performant stack. The main UI thread dispatches a request to a web worker which on a separate thread executes optimized rust WASM. That WASM compiles the script to an AST and then evaluates it a bunch of times across all the needed scopes. Finally the web worker can message the main UI thread back. This separation is needed to not freeze the UI during script evaluation, but because there is a memory separation it was very annoying to work with. I used a vanilla-ish stack with no web framework, but with TS. I learned a lot about CSS and TS/JS. Using a framework would have probably sped up development but I wanted to first really understand what a framework would need to do under the hood before moving to that. All in all I am very proud of this project! Hopefully others find the concept as interesting as I do!...
|
1792850228.393208
|
1792936628.393208
|
|
35107
|
Black Hole Simulation by @huncikoma | Stardance
|
huncikoma
|
1
|
99.0
|
1426
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-25T14:32:04Z", "hours": 99.0, "multiplier": 14.93, "payout": 1426, "blessing": "neutral", "text": "I made a real BlackHole simulation using python, Nvdia Cuda accelaration, It was very challenging to write the code plus understand the physics behind it as a 14 years old, the idea came from the Interstellar scene in the Black Hole simulation that the IBM supercomputer simulated. This is my version but this simulation is very power consuming, my 5070 hitting 2.2fps in the highest quality, I beg you dear reader to download and test it, because the demo site is just a demo not a real simulation, not Cuda and python like the real one if you download, and you can’t acces the settings that i made in the real so please download and try it not just the demo site because it is not the same feeling. Enjoy your trip at my simulated Black Hole. (Note: this is only works with Nvdia graphics card because of the Cuda (Sorry AMD))", "repo": "https://github.com/huncikoma-code/BlackHole", "demo": "https://huncikoma-code.github.io/BlackHole/"}]...
|
[{"post_id": 54436, "ts": "202 [{"post_id": 54436, "ts": "2026-08-25T13:25:05Z", "hours": 4.6667, "text": "Devlog#13 Finally, I finished the project, it is working, I created an install and a run batch file, and it is working, EVERYTHING!!! here a demonstration video (Sorry for the quality i have to shrinf from 201mb to 49mb) in the max level i’m getting 2.2 fps with a 5070!!!"}, {"post_id": 53013, "ts": "2026-08-23T12:14:59Z", "hours": 7.7, "text": "Devlog#12 Finally!!! I finished the main code, however I must do some bugfixes, and write a batch file to automaticly download python libaries, extensions , drivers to work. In the next devlog I can finally show you simulation footage."}, {"post_id": 52199, "ts": "2026-08-22T09:14:41Z", "hours": 9.1278, "text": "Devlog#11 In this section I worked a lot, I made the render section and the dynamic resolution scaling (auto mode)."}, {"post_id": 51555, "ts": "2026-08-21T10:22:36Z", "hours": 6.89, "text": "Devlog#10 Today I almost finished the Application part, doing some bug fixes, collecting the requirements, and I also did the rotating camera function and the orbit function as well"}, {"post_id": 50854, "ts": "2026-08-20T09:21:40Z", "hours": 7.7883, "text": "Devlog#9 Today I made the buffers and the screen size types to work but I can’t try it yet. because I has to finish the code"}, {"post_id": 49375, "ts": "2026-08-18T05:06:50Z", "hours": 7.5914, "text": "Devlog #8 I continued the aplication part, I made the screenshot option, this project is huge and I am very excited about it."}, {"post_id": 48740, "ts": "2026-08-17T08:35:41Z", "hours": 7.7036, "text": "Devlog#7 Finally I’m ready with the quality part, and I am working now on the Apllication and the Cuda drivers, In this section the Ai hellped me with the Cuda accelaration part because as I mentioned in my devlogs I didn’t work with Cuda before and I’m learning in the meantime with the help of Ai."}, {"post_id": 47345, "ts": "2026-08-15T07:12:43Z", "hours": 7.8725, "text": "Devlog#6 Today I worked around the graphics section more and I made the windows options: Fulscreen, windowed etc…"}, {"post_id": 46773, "ts": "2026-08-14T08:41:01Z", "hours": 5.1619, "text": "Devlog #5 In this part I fixed a lot of bugs around the cuda and the kernel section, I searched the compatible Cuda acceleration drivers."}, {"post_id": 45134, "ts": "2026-08-11T13:02:46Z", "hours": 7.0336, "text": "I made the Quallity settings for the reendering, I swear the 8K will be brutal."}, {"post_id": 39412, "ts": "2026-08-02T11:13:03Z", "hours": 8.2039, "text": "Devlog #3 — Post-processing and cameraRaw output from the renderer is HDR — values way above 1.0 around the disk."}, {"post_id": 38723, "ts": "2026-08-01T08:38:59Z", "hours": 5.7339, "text": "Devlog #2 — The render kernel Every pixel is one GPU thread, each tracing a photon backwards from the camera."}, {"post_id": 38110, "ts": "2026-07-31T10:13:41Z", "hours": 14.0203, "text": "Devlog #1: Black hole raytracer, the GPU side New project. This time it’s a real-time black hole renderer, including gravitational lensing and the accretion disk. It’s in Python, which feels familiar after working on the ISS tracker.The main idea is to shoot a ray for every pixel and bend it according to the Schwarzschild geodesic equation as it passes the black hole."}]...
|
Title: Black Hole Simulation by @huncikoma | Stard Title: Black Hole Simulation by @huncikoma | Stardance
Devlogs:
Devlog #1: Black hole raytracer, the GPU side New project. This time it’s a real-time black hole renderer, including gravitational lensing and the accretion disk. It’s in Python, which feels familiar after working on the ISS tracker.The main idea is to shoot a ray for every pixel and bend it according to the Schwarzschild geodesic equation as it passes the black hole.
Devlog #2 — The render kernel Every pixel is one GPU thread, each tracing a photon backwards from the camera.
Devlog #3 — Post-processing and cameraRaw output from the renderer is HDR — values way above 1.0 around the disk.
I made the Quallity settings for the reendering, I swear the 8K will be brutal.
Devlog #5 In this part I fixed a lot of bugs around the cuda and the kernel section, I searched the compatible Cuda acceleration drivers.
Devlog#6 Today I worked around the graphics section more and I made the windows options: Fulscreen, windowed etc…
Devlog#7 Finally I’m ready with the quality part, and I am working now on the Apllication and the Cuda drivers, In this section the Ai hellped me with the Cuda accelaration part because as I mentioned in my devlogs I didn’t work with Cuda before and I’m learning in the meantime with the help of Ai.
Devlog #8 I continued the aplication part, I made the screenshot option, this project is huge and I am very excited about it.
Devlog#9 Today I made the buffers and the screen size types to work but I can’t try it yet. because I has to finish the code
Devlog#10 Today I almost finished the Application part, doing some bug fixes, collecting the requirements, and I also did the rotating camera function and the orbit function as well
Devlog#11 In this section I worked a lot, I made the render section and the dynamic resolution scaling (auto mode).
Devlog#12 Finally!!! I finished the main code, however I must do some bugfixes, and write a batch file to automaticly download python libaries, extensions , drivers to work. In the next devlog I can finally show you simulation footage.
Devlog#13 Finally, I finished the project, it is working, I created an install and a run batch file, and it is working, EVERYTHING!!! here a demonstration video (Sorry for the quality i have to shrinf from 201mb to 49mb) in the max level i’m getting 2.2 fps with a 5070!!!
Ships:
I made a real BlackHole simulation using python, Nvdia Cuda accelaration, It was very challenging to write the code plus understand the physics behind it as a 14 years old, the idea came from the Interstellar scene in the Black Hole simulation that the IBM supercomputer simulated. This is my version but this simulation is very power consuming, my 5070 hitting 2.2fps in the highest quality, I beg you dear reader to download and test it, because the demo site is just a demo not a real simulation, not Cuda and python like the real one if you download, and you can’t acces the settings that i made in the real so please download and try it not just the demo site because it is not the same feeling. Enjoy your trip at my simulated Black Hole. (Note: this is only works with Nvdia graphics card because of the Cuda (Sorry AMD))...
|
1792878674.4165645
|
1793742674.4165645
|
|
38971
|
Canvas Sweeper by @GeorgeZ | Stardance
|
GeorgeZ
|
1
|
120.0
|
1426
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-15T06:30:59Z", "hours": 120.0, "multiplier": 11.9, "payout": 1426, "blessing": "neutral", "text": "Canvas Sweeper is officially shipped. canvassweeper.com The problem I wanted to solve was pretty simple: Canvas tells you what assignments you have, but it does not tell you how to fit all of that work into your actual life. Canvas Sweeper connects to Canvas, pulls your courses and assignments, tracks due dates and missing work, prioritizes what matters most, and turns everything into an actual study schedule based on your routines, school schedule, preferred study times, workload limits, and other commitments. It also includes: Google login Canvas connection + assignment sync assignment workspace smart prioritization automatic study plan generation recurring routines for school, rowing, clubs, commute, meals, sleep, work, and custom blocks student profile + study preferences Google Calendar integration Canvai ( Canvas ai ) account/privacy controls account deletion AI history deletion settings security checks, testing, Docker, CI/CD, and a self-hosted Ubuntu deployment 3 major quality-of-life improvements 1. Turns Canvas into an actual plan Instead of seeing a giant list of assignments and figuring everything out yourself, Canvas Sweeper decides when there is actually time to work on each assignment. 2. Plans around your real life School, practices, clubs, commute, sleep, meals, work, and other routines can all be added so it does not schedule homework when you are busy. 3. Automatically prioritizes important work Deadlines, missing assignments, tests, workload, and your preferences are considered so the most important work gets attention first. Why this is a QoL improvement The goal is to remove a bunch of repetitive planning. Instead of checking Canvas, checking your calendar, thinking about everything due, finding free time, and manually deciding what to work on, Canvas Sweeper brings those steps together. Working project The app is live and usable. Google login works, Canvas connection works, assignments can sync, routines/preferences can be configured, and the planning system can turn active assignments into a schedule. The Canvas integration is complete. Google Calendar can be connected, but its public OAuth configuration is still going through Google’s verification process, which can take a few weeks. Google may currently show an unverified-app warning during that connection flow, and testers can continue through the advanced option if they choose to. One note about the demo video: I currently have no active Canvas assignments, so there is nothing for Canvas Sweeper to turn into a study schedule in the recording. Effort / execution This ended up becoming way bigger than I originally expected. I built the frontend and backend, Canvas and Google integrations, database, authentication, planning logic, security systems, testing, Docker setup, CI/CD, and deployment. I also decided to self-host the actual application on my own Ubuntu server instead of using a normal app hosting platform, so I ended up learning Linux, Docker, networking, HTTPS, OAuth, APIs, databases, security, and production deployment along the way. Definitely a lot of hours went into this. Canvas Sweeper is live!!! Thanks for watching the journey!!", "repo": "https://github.com/georgeSzielinski/canvas-sweeper-demo", "demo": "https://canvassweeper.com/"}]...
|
[{"post_id": 46175, "ts": "202 [{"post_id": 46175, "ts": "2026-08-13T06:23:36Z", "hours": 0.3, "text": "finally found the issue - i set up google auth wrong and accidentally made it so only one person could sign up fixing that tomorrow, hopefully nothing else breaks."}, {"post_id": 45623, "ts": "2026-08-12T07:20:07Z", "hours": 0.3667, "text": "trying to get google auth working for hours and it still refuses to cooperate canvas sweeper coming soon 👀"}, {"post_id": 44990, "ts": "2026-08-11T03:50:19Z", "hours": 1.9667, "text": "Canvas Sweeper - Authentication Testing( Devlog #16 ) Had to reconnect Supabase today, which took a bit longer than expected. I’m now testing the full authentication flow with Google OAuth and fixing the last few signup/login issues. If everything goes smoothly, Canvas Sweeper will probably launch over the weekend 👀"}, {"post_id": 44441, "ts": "2026-08-10T06:00:29Z", "hours": 4.8, "text": "Unfortunately I have somehow gone in a complete circle trying to launch this I have never deployed anything before, so I guess there’s a first time for everything. 97.3% chance Canvas Sweeper launches tomorrow. Sorry for the delay. Was definitely not part of the plan."}, {"post_id": 43753, "ts": "2026-08-09T05:24:18Z", "hours": 3.3, "text": "Canvas Sweeper Launch Prep ( Devlog #15 ) Today I finished the final prep for launching canvas sweeper online. I spent most of the time making sure everything was secure, stable, and ready instead of rushing. I completed the Docker setup, hardened the frontend and backend containers, added security checks, verified the deployment pipeline, and prepared the Ubuntu server deploymen. I also finished the final testing, image verification, and release preparation needed before putting the app online. What’s Next Finish the final server setup Connect the deployment Launch Canvas Sweeper online tomorrow THANKS FOR READING!!!!"}, {"post_id": 43155, "ts": "2026-08-08T08:27:30Z", "hours": 6.7667, "text": "Canvas Sweeper Deployment ( Devlog #14 ) I’m finally getting Canvas Sweeper ready to go online. I’m going to host it on my own Ubuntu server using Docker, then connect the frontend, backend, database, HTTPS, and the public URL. Since I already have the server, I won’t pay for hosting like Vercel or Render, which is pretty cool because I can run the whole thing myself and keep upgrading it later. Today I worked on getting the release ready and security. I added and tested rate limits, user isolation, secret scanning, CodeQL, Gitleaks, container scanning, safer Docker builds, and a full GitHub release pipeline. I also spent a lot of time fixing random CI issues that only showed up once everything started running in GitHub. What’s Next Finish the last security checks Set up the server Connect the domain Put Canvas Sweeper online"}, {"post_id": 42482, "ts": "2026-08-07T07:54:14Z", "hours": 9.0333, "text": "Canvas Sweeper - Beta Security & Release Preparation ( Devlog #13 ) Features / Improvements Added AI safety improvements: AI claim grounding so canvai cannot make stupid academic conclusions Structured ai responses tied to real evidence Prompt injection protection Ai context and replay safety improvements Added AI privacy controls: ai enable/disable preference ai history deletion Account deletion system Updated ai disclosures and privacy explanations Added security protections: User isolation testing to prevent students from accessing other users data Rate limiting for authentication, Canvas, Calendar, planning, and Canvai ai Request size limits to prevent abuse Operation locks to prevent duplicate expensive tasks Error and logging sanitization Security headers and authenticated response cache protection Secret scanning and CI security improvements Added deployment and release preparation: Beta deployment configuration Secure Docker boundaries CI/CD security improvements Dependency and supply chain checks Updated privacy policy and terms of service Data retention and deletion documentation Security Work Completed Authentication hardening Authorization and user isolation testing API abuse protection ai security review Provider security boundaries Data lifecycle controls Account deletion testing Privacy and legal preparation What’s Next!!!! Finish final deployment steps Connect the beta URL Prepare Canvai for its first public users The first public beta release should be ready tomorrow.!!!!! THANKS FOR READING!!!"}, {"post_id": 41820, "ts": "2026-08-06T08:37:50Z", "hours": 8.8656, "text": "Canvas Sweeper — Beta Preparation & AI Upgrade ( Devlog # 12 ) Recently, I finished a lot of the final polish before letting other people test it. All major pages and workflows have been added, and I have been focusing on making the experience feel like a real product. the most annoying bugs I fixed was the Canvas connection status. I probably spent 4 hours fixing a tiny red connection box that was not turning green. It ended up being sync states, cached data, and different parts of the app interpreting connection status differently. What’s Next Before releasing a beta, I’m focusing on making Canvas Sweeper safe and ready for real users: Improving security and protecting student data Creating privacy policies and terms of service Improving AI privacy, safety, and transparency Testing user data isolation Preparing the app for a private beta launch THANKS FOR READING!!!"}, {"post_id": 41188, "ts": "2026-08-05T07:36:41Z", "hours": 8.0667, "text": "Canvai AI - Making Canvas Smarter ( Devlog # 11 ) Canvai has grown a lot since the last update. I finished building the foundation for Canvai ai and started preparing the next phase of the project. Features Complete Canvas assignment integration Automatic study planning with Google Calendar Student modeling based on completed work and feedback Adaptive Planning with workload analysis, simulations, and recommendations Canvai ai foundation with NVIDIA ai integration Safe ai architecture with read-only tools and evidence-based responses Redesigned Adaptive Planning experience to match the final product design What I Learned Designing ai systems around existing data instead of replacing them Building safe ai features with strict boundaries ( so nobody drains my pockets ) Creating large full stack applications with many connected systems Improving user experience through design reviews and testing How much work goes into turning a prototype into a real product What’s Next I’m currently working on redesigning Canvai Assistant and making the ai features feel like a real assistant. The goal is to let students ask questions about their assignments, schedules, risks, and progress while keeping everything evidence based and safe. THANKS FOR READING!! Page of free Nvidia ai APIs"}, {"post_id": 40614, "ts": "2026-08-04T08:38:54Z", "hours": 5.5667, "text": "Canvas Sweeper - Building the Brain( Devlog #10 ) Canvas Sweeper has grown a lot since the last update. Over the past few missions, I built the core systems that power Canvai: Features Canvas assignment intelligence: analyzes deadlines, workload, risk, and priority Smart scheduling engine: creates realistic study plans around school, rowing, and personal commitments Google Calendar integration: lets approved study plans become real calendar events Learning system: tracks completed work and improves understanding of planning accuracy Student modeling: learns from completed sessions and creates evidence-based insights Canvai assistant foundation: explains plans, risks, and recommendations without using AI yet Advanced planning: workload forecasting, exam planning, dependencies, and what-if scenarios Built With Next.js FastAPI PostgreSQL / SQLite Docker Google Calendar API Canvas API TypeScript Python What I learned this session Building large full stack systems takes much more than just writing features Designing reliable data models before adding AI is important Creating explainable systems is much harder than creating simple automation Testing, migrations, and security What’s Next The foundation for Canvai (canvas ai) is finally coming together. The next step is improving the user experience and preparing the system for the future AI phase. I am also making the page for the ai assistant and brain. THANKS FOR READING!!!"}, {"post_id": 39930, "ts": "2026-08-03T07:42:03Z", "hours": 6.2856, "text": "Canvas Sweeper = Final Stages! hopefully ( Devlog #9 ) Canvas Sweeper is finally fully functional and looking much better than before. I’ve connected the new UI to the real app and finished most of the core planning system. Built with Next.js + React FastAPI SQLAlchemy + Alembic SQLite Canvas API Google Calendar API Docker What it can do Sync real Canvas assignments Build study plans around your schedule Review and edit sessions Publish approved plans to Google Calendar Track progress and reschedule work Next Supabase/PostgreSQL Vercel deployment ( Hopefully soon ) Custom domain ( Already setting up ) Security and privacy improvements Invite only beta Background syncing AI task breakdown and smarter estimates THANKS FOR READING!!!"}, {"post_id": 39325, "ts": "2026-08-02T07:23:28Z", "hours": 7.9786, "text": "I Severely Underestimated This UI Redesign ( Devlog #8 ) I thought implementing the new Canvas Sweeper UI would be a quick frontend update. It was not… I’ve added the new dashboard, assignments page, and plan page, but I still need to finish the rest, including settings and all the smaller screens. Then I have to connect everything properly and make sure every button, state, animation, and real data flow actually works .😬 So this has officially turned into a multi day project, but it’s finally starting to come together. After the UI is fully finished and working, I can finally move on to the AI phase. THANKS FOR READING!!"}, {"post_id": 38697, "ts": "2026-08-01T06:48:05Z", "hours": 9.1, "text": "Canvas Sweeper’s New UI Is Almost Done ( Devlog #7 ) I implemented the new dashboard, assignments pages, planner screens, settings, and the rest of the redesigned app. At the moment everything is using demo data while I connect the new frontend to the real Canvas and Google Calendar systems. This took way longer than I expected because I had to rebuild a lot of the frontend stack without breaking the existing backend, authentication, scheduling system, or calendar publishing. The hardest parts were recreating all the animations, keeping the design consistent across every page, and making sure the new UI could still work with the real data. What I worked on New dashboard Assignments and detail pages Planner and scheduling screens Settings and account pages New animations and design system The new pages should be fully functional tomorrow or the day after. After that, I’m finally moving on to the AI phase"}, {"post_id": 38032, "ts": "2026-07-31T05:52:47Z", "hours": 7.5, "text": "My Own Server ( Devlog #6 ) (Picture of the server 😬, hopefully getting a case soon) Every day this project just keeps getting bigger. What started as a software project is now growing into a hardware project too. I wanted to make my own server to run my projects locally and create a dedicated machine for development, as my computer could not handle it anymore. I built this server completely from parts I found through thrift stores, garage sales, and things I was able to get for free. It has been really cool taking old hardware and turning it into something useful. Features 🖥️ Dedicated local server for running projects ⚙️ Full-stack development environment 🌐 Local hosting for applications and services 🔒 Remote access through SSH Hardware Intel Xeon 22-core / 44-thread processor 64GB DDR3 ECC RAM 1GB DDR3 VRAM GPU 1000W Power Supply Built with Ubuntu Server OpenSSH Python development tools Full stack development tools What I Learned Setting up this server took much longer than expected. Installing Ubuntu Server, configuring everything, and fixing all the small issues was definitely a challenge, but I learned a lot about hardware, Linux, and server management. Next Steps I am currently continuing development on the full stack side of things and getting everything ready to run locally on this server. Once that is finished, I will start working on the AI phase and adding more advanced features. Also ignore whats on the homepage"}, {"post_id": 37456, "ts": "2026-07-30T06:45:05Z", "hours": 8.1889, "text": "Building the Rest of Canvas Sweeper! The animated landing page from my last devlog is officially finished! 🎉 Now we are working on designing the rest of the app to match, including the dashboard, assignments, planner, and settings pages so everything feels more polished. At the same time, I’m wrapping up Phase 4, which is all about making sure the scheduling system can create, review, and publish reliable study plans before moving on to Phase 5, where I’ll start adding AI to make planning even smarter. Working on now 🎨 Dashboard & app pages 📅 Final Phase 4 scheduling improvements 🤖 Getting ready for the AI phase"}, {"post_id": 36865, "ts": "2026-07-29T06:23:15Z", "hours": 8.1667, "text": "Redesigning Canvas Sweeper! Me and my friends took a short break from adding new features to completely redesign the Canvas Sweeper UI. I wanted the landing page to feel more like an Apple product page, with smooth scroll animations that show assignments turning into an organized study schedule. I just finished implementing the new landing page and UI style! Next, I’m redesigning the dashboard, assignments, planner, settings, and the rest of the app to match. What I worked on Animated landing page Visual Canvas-to-calendar story Cleaner typography and layout Hopefully stop looking vide coded"}, {"post_id": 36238, "ts": "2026-07-28T05:58:07Z", "hours": 8.3333, "text": "Canvas Sweeper is getting smarter (no ai yet) I have no active assignments at the moment since it is summer time but you can see all of your previous assignments and late assignments, thus canvas connection is working Since my last devlog, I finished connecting Canvas Sweeper to my real Canvas account and Google Calendar, and I started building the main scheduling system. The app can now use my assignments, deadlines, existing calendar events, sleep schedule, school, rowing, and other commitments to find free time and build a study plan around my actual schedule. The biggest challenge has been making Google Calendar publishing safe. I’ve been fixing bugs involving duplicate events, sleep hour scheduling, rescheduling, and failed calendar syncs. Next, I’m finishing testing and making sure everything is reliable before moving on to the next phase, which is to implement ai."}, {"post_id": 35635, "ts": "2026-07-27T06:03:24Z", "hours": 6.6808, "text": "After about 6 and a half hours of work, Canvas Sweeper is finally connecting to my real Canvas account and Google Calendar! 🎉 The app can now import my actual courses and assignments, and the foundation for the scheduling system is in place. Eventually, it will look at my calendar, see when I’m busy with things like school and rowing, and automatically build a study schedule around my free time. The hardest bug so far was getting rid of “Demo Mode.” Everything on the backend was working, but the frontend still thought my account was fake. After lots of debugging, I finally got it and got everything working with real data. Next up is building the intelligent scheduling engine and removing the last bits of demo and hardcoded data before the app eventually goes public"}, {"post_id": 33863, "ts": "2026-07-24T04:01:27Z", "hours": 8.5814, "text": "AI Canvas Planner Its highkey broken,I can’t fix it for now and the ui sucks but this is my newest project! AI Canvas Planner is a full stack web application that automatically turns my Canvas assignments into an intelligent study schedule. Instead of just copying due dates onto a calendar, it connects to my Google Calendar, sees my existing schedule (school, rowing, appointments, etc.), and builds personalized study sessions around my free time. Right now it’s designed for my own workflow, but once it’s polished I plan to make it public so other students can use it too. Features:: 📚 Connects to Canvas to import assignments and courses 📅 Connects to Google Calendar to see existing events and availability 🧠 Automatically makes study sessions around your schedule ⚡ Prioritizes missing assignments, upcoming deadlines, and important work 🎯 Designed to be fully configurable so everyone can customize how their schedule is built 🔄 One-click assignment synchronization 🔐 Secure Google OAuth authentication 📱 Modern responsive interface with real-time updates 🚀 Planned public release after the scheduling engine is fully completed Built With: Next.js React TypeScript FastAPI Python SQLite (development) Docker & Docker Compose Google Calendar API Google OAuth 2.0 Canvas LMS API Alembic SQLAlchemy Vitest Playwright Pytest APIs & Services: Google Calendar API Google OAuth Canvas LMS REST API Docker GitHub Biggest Challenges So Far One of the hardest parts has been getting multiple APIs to work together. Google OAuth, Google Calendar, and Canvas all have different authentication flows and edge cases. I also spent a long time fixing down timezone bugs where Canvas timestamps and SQLite stored dates differently, causing assignments to crash until I normalized everything to UTC. Another frustrating bug happened after I connected Canvas successfully. The backend was working perfectly, but the frontend kept thinking it was still in demo mode, so it showed that Canvas wasn’t connected even though all of the API requests were succeeding. Bugs like these have taught me a lot about debugging full-stack applications and how frontend and backend state can get out of sync. What I Learned Building a full-stack web application from scratch Implementing secure OAuth authentication Working with multiple REST APIs at the same time Designing database schemas and migrations Debugging frontend and backend communication Managing Docker containers and local development environments Writing automated tests for both frontend and backend Handling timezones and date serialization correctly Building software that solves a real problem I deal with every day"}]...
|
Title: Canvas Sweeper by @GeorgeZ | Stardance
Dev Title: Canvas Sweeper by @GeorgeZ | Stardance
Devlogs:
AI Canvas Planner Its highkey broken,I can’t fix it for now and the ui sucks but this is my newest project! AI Canvas Planner is a full stack web application that automatically turns my Canvas assignments into an intelligent study schedule. Instead of just copying due dates onto a calendar, it connects to my Google Calendar, sees my existing schedule (school, rowing, appointments, etc.), and builds personalized study sessions around my free time. Right now it’s designed for my own workflow, but once it’s polished I plan to make it public so other students can use it too. Features:: 📚 Connects to Canvas to import assignments and courses 📅 Connects to Google Calendar to see existing events and availability 🧠 Automatically makes study sessions around your schedule ⚡ Prioritizes missing assignments, upcoming deadlines, and important work 🎯 Designed to be fully configurable so everyone can customize how their schedule is built 🔄 One-click assignment synchronization 🔐 Secure Google OAuth authentication 📱 Modern responsive interface with real-time updates 🚀 Planned public release after the scheduling engine is fully completed Built With: Next.js React TypeScript FastAPI Python SQLite (development) Docker & Docker Compose Google Calendar API Google OAuth 2.0 Canvas LMS API Alembic SQLAlchemy Vitest Playwright Pytest APIs & Services: Google Calendar API Google OAuth Canvas LMS REST API Docker GitHub Biggest Challenges So Far One of the hardest parts has been getting multiple APIs to work together. Google OAuth, Google Calendar, and Canvas all have different authentication flows and edge cases. I also spent a long time fixing down timezone bugs where Canvas timestamps and SQLite stored dates differently, causing assignments to crash until I normalized everything to UTC. Another frustrating bug happened after I connected Canvas successfully. The backend was working perfectly, but the frontend kept thinking it was still in demo mode, so it showed that Canvas wasn’t connected even though all of the API requests were succeeding. Bugs like these have taught me a lot about debugging full-stack applications and how frontend and backend state can get out of sync. What I Learned Building a full-stack web application from scratch Implementing secure OAuth authentication Working with multiple REST APIs at the same time Designing database schemas and migrations Debugging frontend and backend communication Managing Docker containers and local development environments Writing automated tests for both frontend and backend Handling timezones and date serialization correctly Building software that solves a real problem I deal with every day
After about 6 and a half hours of work, Canvas Sweeper is finally connecting to my real Canvas account and Google Calendar! 🎉 The app can now import my actual courses and assignments, and the foundation for the scheduling system is in place. Eventually, it will look at my calendar, see when I’m busy with things like school and rowing, and automatically build a study schedule around my free time. The hardest bug so far was getting rid of “Demo Mode.” Everything on the backend was working, but the frontend still thought my account was fake. After lots of debugging, I finally got it and got everything working with real data. Next up is building the intelligent scheduling engine and removing the last bits of demo and hardcoded data before the app eventually goes public
Canvas Sweeper is getting smarter (no ai yet) I have no active assignments at the moment since it is summer time but you can see all of your previous assignments and late assignments, thus canvas connection is working Since my last devlog, I finished connecting Canvas Sweeper to my real Canvas account and Google Calendar, and I started building the main scheduling system. The app can now use my assignments, deadlines, existing calendar events, sleep schedule, school, rowing, and other commitments to find free time and build a study plan around my actual schedule. The biggest challenge has been making Google Calendar publishing safe. I’ve been fixing bugs involving duplicate events, sleep hour scheduling, rescheduling, and failed calendar syncs. Next, I’m finishing testing and making sure everything is reliable before moving on to the next phase, which is to implement ai.
Redesigning Canvas Sweeper! Me and my friends took a short break from adding new features to completely redesign the Canvas Sweeper UI. I wanted the landing page to feel more like an Apple product page, with smooth scroll animations that show assignments turning into an organized study schedule. I just finished implementing the new landing page and UI style! Next, I’m redesigning the dashboard, assignments, planner, settings, and the rest of the app to match. What I worked on Animated landing page Visual Canvas-to-calendar story Cleaner typography and layout Hopefully stop looking vide coded
Building the Rest of Canvas Sweeper! The animated landing page from my last devlog is officially finished! 🎉 Now we are working on designing the rest of the app to match, including the dashboard, assignments, planner, and settings pages so everything feels more polished. At the same time, I’m wrapping up Phase 4, which is all about making sure the scheduling system can create, review, and publish reliable study plans before moving on to Phase 5, where I’ll start adding AI to make planning even smarter. Working on now 🎨 Dashboard & app pages 📅 Final Phase 4 scheduling improvements 🤖 Getting ready for the AI phase
My Own Server ( Devlog #6 ) (Picture of the server 😬, hopefully getting a case soon) Every day this project just keeps getting bigger. What started as a software project is now growing into a hardware project too. I wanted to make my own server to run my projects locally and create a dedicated machine for development, as my computer could not handle it anymore. I built this server completely from parts I found through thrift stores, garage sales, and things I was able to get for free. It has been really cool taking old hardware and turning it into something useful. Features 🖥️ Dedicated local server for running projects ⚙️ Full-stack development environment 🌐 Local hosting for applications and services 🔒 Remote access through SSH Hardware Intel Xeon 22-core / 44-thread processor 64GB DDR3 ECC RAM 1GB DDR3 VRAM GPU 1000W Power Supply Built with Ubuntu Server OpenSSH Python development tools Full stack development tools What I Learned Setting up this server took much longer than expected. Installing Ubuntu Server, configuring everything, and fixing all the small issues was definitely a challenge, but I learned a lot about hardware, Linux, and server management. Next Steps I am currently continuing development on the full stack side of things and getting everything ready to run locally on this server. Once that is finished, I will start working on the AI phase and adding more advanced features. Also ignore whats on the homepage
Canvas Sweeper’s New UI Is Almost Done ( Devlog #7 ) I implemented the new dashboard, assignments pages, planner screens, settings, and the rest of the redesigned app. At the moment everything is using demo data while I connect the new frontend to the real Canvas and Google Calendar systems. This took way longer than I expected because I had to rebuild a lot of the frontend stack without breaking the existing backend, authentication, scheduling system, or calendar publishing. The hardest parts were recreating all the animations, keeping the design consistent across every page, and making sure the new UI could still work with the real data. What I worked on New dashboard Assignments and detail pages Planner and scheduling screens Settings and account pages New animations and design system The new pages should be fully functional tomorrow or the day after. After that, I’m finally moving on to the AI phase
I Severely Underestimated This UI Redesign ( Devlog #8 ) I thought implementing the new Canvas Sweeper UI would be a quick frontend update. It was not… I’ve added the new dashboard, assignments page, and plan page, but I still need to finish the rest, including settings and all the smaller screens. Then I have to connect everything properly and make sure every button, state, animation, and real data flow actually works .😬 So this has officially turned into a multi day project, but it’s finally starting to come together. After the UI is fully finished and working, I can finally move on to the AI phase. THANKS FOR READING!!
Canvas Sweeper = Final Stages! hopefully ( Devlog #9 ) Canvas Sweeper is finally fully functional and looking much better than before. I’ve connected the new UI to the real app and finished most of the core planning system. Built with Next.js + React FastAPI SQLAlchemy + Alembic SQLite Canvas API Google Calendar API Docker What it can do Sync real Canvas assignments Build study plans around your schedule Review and edit sessions Publish approved plans to Google Calendar Track progress and reschedule work Next Supabase/PostgreSQL Vercel deployment ( Hopefully soon ) Custom domain ( Already setting up ) Security and privacy improvements Invite only beta Background syncing AI task breakdown and smarter estimates THANKS FOR READING!!!
Canvas Sweeper - Building the Brain( Devlog #10 ) Canvas Sweeper has grown a lot since the last update. Over the past few missions, I built the core systems that power Canvai: Features Canvas assignment intelligence: analyzes deadlines, workload, risk, and priority Smart scheduling engine: creates realistic study plans around school, rowing, and personal commitments Google Calendar integration: lets approved study plans become real calendar events Learning system: tracks completed work and improves understanding of planning accuracy Student modeling: learns from completed sessions and creates evidence-based insights Canvai assistant foundation: explains plans, risks, and recommendations without using AI yet Advanced planning: workload forecasting, exam planning, dependencies, and what-if scenarios Built With Next.js FastAPI PostgreSQL / SQLite Docker Google Calendar API Canvas API TypeScript Python What I learned this session Building large full stack systems takes much more than just writing features Designing reliable data models before adding AI is important Creating explainable systems is much harder than creating simple automation Testing, migrations, and security What’s Next The foundation for Canvai (canvas ai) is finally coming together. The next step is improving the user experience and preparing the system for the future AI phase. I am also making the page for the ai assistant and brain. THANKS FOR READING!!!
Canvai AI - Making Canvas Smarter ( Devlog # 11 ) Canvai has grown a lot since the last update. I finished building the foundation for Canvai ai and started preparing the next phase of the project. Features Complete Canvas assignment integration Automatic study planning with Google Calendar Student modeling based on completed work and feedback Adaptive Planning with workload analysis, simulations, and recommendations Canvai ai foundation with NVIDIA ai integration Safe ai architecture with read-only tools and evidence-based responses Redesigned Adaptive Planning experience to match the final product design What I Learned Designing ai systems around existing data instead of replacing them Building safe ai features with strict boundaries ( so nobody drains my pockets ) Creating large full stack applications with many connected systems Improving user experience through design reviews and testing How much work goes into turning a prototype into a real product What’s Next I’m currently working on redesigning Canvai Assistant and making the ai features feel like a real assistant. The goal is to let students ask questions about their assignments, schedules, risks, and progress while keeping everything evidence based and safe. THANKS FOR READING!! Page of free Nvidia ai APIs
Canvas Sweeper — Beta Preparation & AI Upgrade ( Devlog # 12 ) Recently, I finished a lot of the final polish before letting other people test it. All major pages and workflows have been added, and I have been focusing on making the experience feel like a real product. the most annoying bugs I fixed was the Canvas connection status. I probably spent 4 hours fixing a tiny red connection box that was not turning green. It ended up being sync states, cached data, and different parts of the app interpreting connection status differently. What’s Next Before releasing a beta, I’m focusing on making Canvas Sweeper safe and ready for real users: Improving security and protecting student data Creating privacy policies and terms of service Improving AI privacy, safety, and transparency Testing user data isolation Preparing the app for a private beta launch THANKS FOR READING!!!
Canvas Sweeper - Beta Security & Release Preparation ( Devlog #13 ) Features / Improvements Added AI safety improvements: AI claim grounding so canvai cannot make stupid academic conclusions Structured ai responses tied to real evidence Prompt injection protection Ai context and replay safety improvements Added AI privacy controls: ai enable/disable preference ai history deletion Account deletion system Updated ai disclosures and privacy explanations Added security protections: User isolation testing to prevent students from accessing other users data Rate limiting for authentication, Canvas, Calendar, planning, and Canvai ai Request size limits to prevent abuse Operation locks to prevent duplicate expensive tasks Error and logging sanitization Security headers and authenticated response cache protection Secret scanning and CI security improvements Added deployment and release preparation: Beta deployment configuration Secure Docker boundaries CI/CD security improvements Dependency and supply chain checks Updated privacy policy and terms of service Data retention and deletion documentation Security Work Completed Authentication hardening Authorization and user isolation testing API abuse protection ai security review Provider security boundaries Data lifecycle controls Account deletion testing Privacy and legal preparation What’s Next!!!! Finish final deployment steps Connect the beta URL Prepare Canvai for its first public users The first public beta release should be ready tomorrow.!!!!! THANKS FOR READING!!!
Canvas Sweeper Deployment ( Devlog #14 ) I’m finally getting Canvas Sweeper ready to go online. I’m going to host it on my own Ubuntu server using Docker, then connect the frontend, backend, database, HTTPS, and the public URL. Since I already have the server, I won’t pay for hosting like Vercel or Render, which is pretty cool because I can run the whole thing myself and keep upgrading it later. Today I worked on getting the release ready and security. I added and tested rate limits, user isolation, secret scanning, CodeQL, Gitleaks, container scanning, safer Docker builds, and a full GitHub release pipeline. I also spent a lot of time fixing random CI issues that only showed up once everything started running in GitHub. What’s Next Finish the last security checks Set up the server Connect the domain Put Canvas Sweeper online
Canvas Sweeper Launch Prep ( Devlog #15 ) Today I finished the final prep for launching canvas sweeper online. I spent most of the time making sure everything was secure, stable, and ready instead of rushing. I completed the Docker setup, hardened the frontend and backend containers, added security checks, verified the deployment pipeline, and prepared the Ubuntu server deploymen. I also finished the final testing, image verification, and release preparation needed before putting the app online. What’s Next Finish the final server setup Connect the deployment Launch Canvas Sweeper online tomorrow THANKS FOR READING!!!!
Unfortunately I have somehow gone in a complete circle trying to launch this I have never deployed anything before, so I guess there’s a first time for everything. 97.3% chance Canvas Sweeper launches tomorrow. Sorry for the delay. Was definitely not part of the plan.
Canvas Sweeper - Authentication Testing( Devlog #16 ) Had to reconnect Supabase today, which took a bit longer than expected. I’m now testing the full authentication flow with Google OAuth and fixing the last few signup/login issues. If everything goes smoothly, Canvas Sweeper will probably launch over the weekend 👀
trying to get google auth working for hours and it still refuses to cooperate canvas sweeper coming soon 👀
finally found the issue - i set up google auth wrong and accidentally made it so only one person could sign up fixing that tomorrow, hopefully nothing else breaks.
Ships:
Canvas Sweeper is officially shipped. canvassweeper.com The problem I wanted to solve was pretty simple: Canvas tells you what assignments you have, but it does not tell you how to fit all of that work into your actual life. Canvas Sweeper connects to Canvas, pulls your courses and assignments, tracks due dates and missing work, prioritizes what matters most, and turns everything into an actual study schedule based on your routines, school schedule, preferred study times, workload limits, and other commitments. It also includes: Google login Canvas connection + assignment sync assignment workspace smart prioritization automatic study plan generation recurring routines for school, rowing, clubs, commute, meals, sleep, work, and custom blocks student profile + study preferences Google Calendar integration Canvai ( Canvas ai ) account/privacy controls account deletion AI history deletion settings security checks, testing, Docker, CI/CD, and a self-hosted Ubuntu deployment 3 major quality-of-life improvements 1. Turns Canvas into an actual plan Instead of seeing a giant list of assignments and figuring everything out yourself, Canvas Sweeper decides when there is actually time to work on each assignment. 2. Plans around your real life School, practices, clubs, commute, sleep, meals, work, and other routines can all be added so it does not schedule homework when you are busy. 3. Automatically prioritizes important work Deadlines, missing assignments, tests, workload, and your preferences are considered so the most important work gets attention first. Why this is a QoL improvement The goal is to remove a bunch of repetitive planning. Instead of checking Canvas, checking your calendar, thinking about everything due, finding free time, and manually deciding what to work on, Canvas Sweeper brings those steps together. Working project The app is live and usable. Google login works, Canvas connection works, assignments can sync, routines/preferences can be configured, and the planning system can turn active assignments into a schedule. The Canvas integration is complete. Google Calendar can be connected, but its public OAuth configuration is still going through Google’s verification process, which can take a few weeks. Google may currently show an unverified-app warning during that connection flow, and testers can continue through the advanced option if they choose to. One note about the demo video: I currently have no active Canvas assignments, so there is nothing for Canvas Sweeper to turn into a study schedule in the recording. Effort / execution This ended up becoming way bigger than I originally expected. I built the frontend and backend, Canvas and Google integrations, database, authentication, planning logic, security systems, testing, Docker setup, CI/CD, and deployment. I also decided to self-host the actual application on my own Ubuntu server instead of using a normal app hosting platform, so I ended up learning Linux, Docker, networking, HTTPS, OAuth, APIs, databases, security, and production deployment along the way. Definitely a lot of hours went into this. Canvas Sweeper is live!!! Thanks for watching the journey!!...
|
1792878727.513517
|
1793742727.513517
|
|
11696
|
FlatCraft by @Blxm | Stardance
|
Blxm
|
1
|
115.21
|
1405
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T23:31:01Z", "hours": 113.0, "multiplier": 12.47, "payout": 1405, "blessing": "neutral", "text": "FlatCraft Basic Info FlatCraft is an open source, MIT licensed 2d Minecraft inspired game. It uses LittleJS for the rendering, and vanilla HTML/CSS/JavaScript for the UI. All the rest was written by me. Challenges: One of the biggest challenge was world generation. The idea was to use simplex noise to make terrain, but there was one problem: It’s uncontrolability. I wanted real biomes, but that coudn’t happen because I didn’t know how to control simplex noise. Nor did I know how to make mountains. I solved it by realizing that this is just a silly 2d Minecraft game for a program designed to get teens to make something, not for teens to make some complex minecraft like game, so I decided to bite the bullet and to just make an array for each biome, and have that array contain the y level of the highest block, and use that array to make the terrain. It’s basically like [1,1,2,2,3,3]. Nothing complicated, and if you played this game long enough you’ll see that each biomes are litterally the same. Most Proud of: I’m actually most proud of the custom skins part of flatcraft. It’s really not that complex, but it took a mesruable amount of time to get it working. I had to learn node.js, finally had a use for a server! and used my old chromebook as my server. I made the precaution of adding a ratelimiter just in case someone tried to take it down or whatever, but yeah. That’s what I’m most proud of. What I learned: Making classes in js NodeJS LittleJS engine Stuff that didnt make it into the game: Game music Mobs Credits Art: Me, mostly me, My little brother Inspired by https://www.planetminecraft.com/texture-pack/digs-simple-pack-1-15-100-complete/ , and https://bloxd.io Programming: Me Libraries used: LittleJS", "repo": "https://github.com/BlxCode/FlatCraft", "demo": "https://flatcraft.blxm.me"}]...
|
[{"post_id": 72489, "ts": "202 [{"post_id": 72489, "ts": "2026-09-23T02:15:22Z", "hours": 0.3167, "text": "FIxed bug where jumping wasn’t scaled to your fps Simple really! it’s on the title Changes & Bug Fixes fixed bug where jumping wasn’t scaled to your fps that bug would have made high fps players not able to jump high, and low fps players to jump SUPER high"}, {"post_id": 71071, "ts": "2026-09-20T08:19:33Z", "hours": 1.8978, "text": "Fixed some issues regarding prod (wont get paied for this 😭) ALright, even though i just shipped, there were stuff that were broken, first of all i realized that if you have a expensive 4k 240 hz ahh monitor, the game would get very fast due to the fact that I didn’t introduce deltat time, so i introduced delta time. Bug fixes Fixed bug when you were very fast on a 60hz+ monitor Fixed glitch where the animation state changes between falling and breaking a block while breaking a block while falling"}, {"post_id": 70883, "ts": "2026-09-19T23:01:44Z", "hours": 5.6633, "text": "Sprinting this will be my last ever devlog! New Features: FULL Random world generation: It works like this: Seeds: Seeds are not that important, though they do play a part for terrain generation. Terrain: The terrain is basically just a huge array with preset Y levels depending on the terrain type, ie: mountianus, hilly, flat. Ores: Ores are truly random. It dosn’t depend on the seed. Trees: Trees are also truly random Sprinting: Double press the key in the direction you want to go to sprint that’s it! plz rate it well"}, {"post_id": 69200, "ts": "2026-09-16T16:09:37Z", "hours": 6.2003, "text": "Saving worlds… I hope Honsetly, school has been removing litterally half of the day I would have used to do flatcraft, so… yeah. im also writing this at school cuz i needed to sleep. dont tell anyone lol New Features: Saving It’s quite simple actually. Just saving an object with some world data to local storage. Honestly, that’s it. Flower flower. very cool Terrain generation Terrain generation, no ore generation lol"}, {"post_id": 66474, "ts": "2026-09-12T09:52:21Z", "hours": 5.9692, "text": "Tools Update!!!!111 3 more hard gh issues to go! yay it’s like 2:30 on a friday. not bad, but considering school is back, not good either. Honestly, i swear Idk if i can actually finish this before sep 20th, so if i can’t i’ll actually do 100 pushups. and it WILL be on a devlog. so uhh… yeh. idk why but you can see me do 100 pushups. defenatly not in a row tho my arms are actually twigs bro. ok enough yapping, let’s actually get into this. New Features: Tools!!111 tools. the final implementaiton was quite simple actually. I just added tools to the textures, and added them to the metadata, added a few bits of code for the speeding up of breaking blocks and boom! tools. Changes & Bugfixes: Compleated Metadata Drops now produce 80% less lag (by making sure that only 1 shadow per x coord can exist)"}, {"post_id": 62583, "ts": "2026-09-06T01:30:40Z", "hours": 8.5536, "text": "Lighting & Dropping stuff i’ve been slacking off recently, and I mean it. I’ve coded less, and played more games due to the uhhh looming school season starting again but like… i’ve still managed to make things like lighting, dropping stuff, and shuffeling stuff in ur inventory by using the number keys. Features Lighting At first, this was one of the reasons why I decided to switch to little js, but like their system is not designed for 2d minecraft use, so I had to improvise. The lighting system consists of two basic things. One is the ambient lighting, which basically fills the whole screen with light / filling the whole screen without light, and the second thing is like “light objects” by that, I mean like point lights, which are like round lightbulbs per say, and they emit light. Those would be used for stuff like torches. Q Dropping things with q didn’t exist in the 2 part drops update, cuz i was too lazy to implement that. But now, I added that. It’s simple really, it just creates a new droppped item every time u press q. and if u press q with control, then it drops everything in the hotbar slot hovered, and u can drop things in ur inven by hovering over it. Moving things around in ur inventory with the top number keys I added that cuz im just used to that in uhhh…. bloxd.io so yeah, i just added that. Attack anim press mouse button 0 to attack. currently just attack animation for now Changes & Bug fixes Random tick events for stuff like grass turning into dirt or vice versa *greijodkmgrfd idk, it was in my commits smth to do with promises"}, {"post_id": 58560, "ts": "2026-08-31T00:30:24Z", "hours": 1.4617, "text": "Custom Skins Settings Front End Uhhhh it’s in the title… nothing interesting. https://github.com/users/BlxCode/projects/5 New Features Custom Skins are now FULLY 100% Out! custom skins. How it works: A gallery with a bunch of skins and their ids a textbox for the skin ids reload Changes & Bug Fixes None lol"}, {"post_id": 57793, "ts": "2026-08-30T02:50:18Z", "hours": 8.83, "text": "Inventory Ok so i’ve basically just coded the inventory system. uhhh New Features Inventory System Ok so this is how it works: There is an object that has all the invetory data There is a function that renders it it works like that so u dont render the inventory every frame. that would cause SOO MUCH LAG Place blocks Uhhh… place blocks and it also checks if the block u placed collides with any blocks or players and if it is next to a block Changes & Bug Fixes Fixed some weird crouching behavior that I cant really explain cuz it’s like weird. Dont mind the fact that the game bugged out… it’s cuz i forgot to add metadata to the pine logs and rickroll block thingy"}, {"post_id": 54123, "ts": "2026-08-24T22:58:00Z", "hours": 8.3086, "text": "Drops Part 2 Last devlog, I finished the drop part of drops! This time, I finished the pickup part of drops, and the hold part, though I feel like I do need to tweak the values, I just don’t know by how much. New Features Pick up: The pickup part of drops is basically just an if statement that runs like every frame to see whether or not the player is near enough to a dropped item for them to pick it up. It’s quite simple. Hotbar: I feel like I finished the hotbar, not the inventory system yet, just the hotbar. I finished the “rendering” part, by that I mean like viewing the inventory object and rendering the stuff that is on the hotbar. Changes: Renamed the id of the Inventory div to the Hotbar Readded the FPS counter, and gave it an overhaul The lower arm animation actually plays now"}, {"post_id": 50200, "ts": "2026-08-19T10:30:30Z", "hours": 8.8847, "text": "Drops Part 1 Drops! Though… you can’t pick them up yet… uhhh, and I’m nearing the 10-hour mark, so… yeah. I also completely rewrote the movement code and tweaked the values in collision detection, so that’s like half of the time. Also, it turns out I am not an engineer, as I rewrote my own drops code TWICE in the span of TWO HOURS because of chatgippity roasting me and me roasting myself, respectively. (Also, new dev log format, yay!) New Features Drops (partially) Drops were annoying to implement, partially because I’m a skill issue, and also because I had to learn new things like making classes and stuff like that. Changes & Bug Fixes Collision system revamp The old system was weird and also sometimes inconsistent, so I rewrote the movement system and tweaked the collision system. Overall, a bit of a smaller update if you ask me, and its ONE AND ONLY FEATURE wasn’t complete. Oh well… looks like we’re going to get the next dev log soon."}, {"post_id": 46768, "ts": "2026-08-14T08:07:02Z", "hours": 8.0811, "text": "Block Breaking and Particles! half of the time was spent fixing bugs uhh… ignore that youtube video… New Features: Shadow Particles when touching ground after falling, walking, and after breaking a block Block Breaking Changes & Fixes: Added more things to the block metadata object Fixed collisions not colliding"}, {"post_id": 43802, "ts": "2026-08-09T07:19:22Z", "hours": 0.2828, "text": "Bug Fix: I didn’t include the no falling if you are crouching in the last update so i just quickly added an if statement to include that feature."}, {"post_id": 43193, "ts": "2026-08-08T09:59:34Z", "hours": 1.7314, "text": "Players! Players are finally out. After what? 2 progress updates? Wow, that was harder than I imagined. Especially the physics. I had to think creatively and outside of the box for this. Also, this devlog continues from the last one. Just pretend that the progress updates like didn’t exist or just aren’t canon. Finished Features: Players: Player Physics Player Animations Changes: Slightly adjusted dirt texture Increased label elements’ font size Patched weird css border glitch Deleted unnecessary assets (like the custom cursor that only existed for like 5 minutes, 2 months ago) What’s Next (In order): Crouching, and not falling ✅ Drawing tools (hardest one, btw) ✅ Breaking blocks with tools and fists Custom Skins (it’s literally 90 % complete now, but my server is down due to some real life events so have to wait) ✅ Sandbox world Mobs if i have time ship ps. if you are wondering why the screen recording has some static noise, it’s because i have a small desktop fan running like really close, because it’s kinda hot indoors. I don’t know why it’s making tha t sound, it dosnt make that sound irl to be clear. I think it’s because i accidently turned on my mic and my mic is currently my crappy very quiet laptop mic"}, {"post_id": 41831, "ts": "2026-08-06T09:09:42Z", "hours": 8.1389, "text": "Progress Update #3 I’m too stupid to do physics. I should have made everything with Box2D. I’m currently fiddling with side collisions, as all other collisions (I hope) are done. I’ve also finished jumping and falling physics. Also, I’ve spent another 8 hours, and I want every minute to be for my new 3d printer. Finished Features Jumping My Jumping physics thingy is like the poor and stupid man’s way to do it, but hey… at least it works. It kinda just has a jump multiplyer and it goes down every frame and every frame the player goes up something like 0.05 block units multiplied by the jump multiplier Falling Falling is basically the same as the jumping one. i added sky yes, its a sky :D only a gradient. ill add sun and moon soon prob hopefully idk if there will be night, idk if i can create a night in time. Unfinished Features Side collisions This is stupidlly harder cuz my blocks’ x center is at 0, not 0.5. this means that a block spans from like -0.5 to 0.5. My brain cant handle this… thing."}, {"post_id": 39389, "ts": "2026-08-02T10:30:17Z", "hours": 10.1594, "text": "Progress Update #2: Why, you may ask, do I do progress updates? It’s because only 10 hours MAX can be logged per dev log, and uhh… I think you get the picture. So, without further adieu, this is what I’ve been working on. Unfinished Features: Players (85% Complete) That’s a huge jump from the last time I’ve updated you on the progress on players. Now the thing is, physics is annoying. And I’m not old enough to study calculus at my high school. Which is a shame, as I really like the idea of calculating values based off of differentiating values. I’ve literally just been playing around with the physics at 3 am!??!? Wow! It’s literally 3:30 in the morning. I should go get some sleep. The jumping and crouching are a bit finicky, but I’ll fix them sometime later. Closing Remarks: First of all, a lot of the 10 hours in this progress update have been miscellaneous things like bug fixes or just general tweaks. I’ve also been realizing that this project is big. But the end of the tunnel is still nowhere in sight. Yet, if I can stop sitting around and start sprinting towards, uhh… any direction, there will be light at the end of the tunnel. I hope I can finish this project before school starts. I’ll have to grind like a lot, and especially at night because my siblings are quite brain-rotted, annoying, and loud."}, {"post_id": 33370, "ts": "2026-07-23T07:19:45Z", "hours": 2.5872, "text": "Custom Skins! After a lot of time getting the back-end setup (with some help from ChatGPT, I’d have to admit), custom skins are here! (Granted… players aren’t here yet so you can’t really try them out lol.) New Features New page ( https://blxcode.github.io/FlatCraft/upload-skin/ ) Think of it like skindex but with a worse ui Searching for skins Skin Uploading Changes & Bug-Fixes Grass Retexture Dirt Retexture"}, {"post_id": 32173, "ts": "2026-07-21T04:55:32Z", "hours": 8.2811, "text": "Progress report: I have been grinding this, and I haven’t posted a dev log in a while because I haven’t really finished anything, so this will be a progress report. Finished Features: New dirt, and grass textures The old textures suck, because in between blocks there would be like a small section where there is like no detail, so I added those details and recolored the grass bit of the grass texture because the old one was too “limy.” Added bedrock Self-explanatory; no interesting thing happened that I would want to yap about Updated Game rendering Last devlog, I ported my rendering side of the game to LittleJS, a browser game engine. Why? Because I realized that I wouldn’t have the time and effort to manually do advanced stuff like lighting and particles. Hence, I ported to LittleJS. Now, in the days after the port, I had to fix a lot of things and bugs. Originally, the game would render everything, even if it wasn’t on screen, so I fixed that. I made it so that if you couldn’t see the blocks in the camera, they wouldn’t be rendered. Unfinished Features: Flat Game Mode (90% Done): I decided that tinkering with sandbox mode first would be stupid, as I would still have to make players, inventory system, etc. I feel like I’ve finished everything, but there is something missing. The sky. I still need to make the sky. I don’t know if it should be an image or something else. Players (10% Done): All I have done for players is literally a goffy ahh skin (which I should make better) and a player variable. I think you would be able to piece together what I want for this. Custom skins (60% Done): I want to make custom skins. I have completed the UI, the security part of the server-side (aka my old broken ahh Chromebook) code, and a simple UI for it. All I need to make now is server-side code to store the custom skin and deliver it to the client."}, {"post_id": 22640, "ts": "2026-07-05T06:00:35Z", "hours": 5.6808, "text": "The LittleJS Update Yes, this doesn’t look like much, but it took 5 hours over the span of multiple days and a LOT of trial and error to get to this point! I had to learn so many things, like Promises, async and await, how to make new classes, and LittleJS. But why? Why go through so much trouble? That’s because I’ve realized that I would not, in my current state, be capable of making a full Minecraft clone using only the vanilla HTML Canvas. I chose littleJS because of the promise of fast and lean, and I had already tried it before but failed; I wanted to redeem myself. New Features The rendering part of the game is now done with LittleJS Popups now have minimum width and heights Create new world form now has placeholder text for those who are lazy to type stuff Fixes Renamed Ebony to Cedar because Ebony trees are not pine trees Removed the useless pausing system Removed all of the old rendering system (NEXT UPDATE: Create worlds from seeds 😭 i need help with this)"}, {"post_id": 14909, "ts": "2026-06-24T06:37:35Z", "hours": 4.1328, "text": "The Terrain Preparation Update This is a BIG UI update, and in the next update I’ll add scripting to most of the world menu UI, which has not yet been scripted. New Features: Play Button (shows after the loading screen is finished (in order to get the main menu audio to play)) Main menu music (from opengameart.org) World Menus UI World Creation UI Temporary Gradient Background (To be replaced by game screenshots) Scrollable Credits Fixes Fixed some spelling mistakes in the code"}, {"post_id": 10957, "ts": "2026-06-17T23:33:42Z", "hours": 2.9889, "text": "The Loading Screen Update Added a loading screen which goes to 90% and then waits for the CrazyGames SDK. Removed all NPM dependancies and replaced them with CDNs Added a squeeze in animation when closing Loading screen and Main Menu And much more! (NEXT UPDATE: Create worlds frm seeds with basic terrein 😭 i need help with this)"}, {"post_id": 8555, "ts": "2026-06-14T06:57:09Z", "hours": 1.3439, "text": "The Backdrop Update Added Backdrops to all popups Added a “pausing” system (just disabling keyboard input for now) Added Animations like popup to the main menu elements Added some NPM packages"}, {"post_id": 7631, "ts": "2026-06-12T19:08:43Z", "hours": 2.4183, "text": "main menu, new cursor"}, {"post_id": 5344, "ts": "2026-06-09T02:33:51Z", "hours": 0.4506, "text": "re-done block rendering, adding a function instead of just drawing it onto the canvas, added more textures (gems in block form) and redid dirt texture. Also added movement (only canvas movemnt)"}, {"post_id": 4754, "ts": "2026-06-08T06:28:44Z", "hours": 0.9686, "text": "maple (oak) trees and fps counter"}, {"post_id": 4657, "ts": "2026-06-08T02:00:46Z", "hours": 1.7033, "text": "Inventory UI, Block Creation, some textures"}]...
|
Title: FlatCraft by @Blxm | Stardance
Devlogs:
In Title: FlatCraft by @Blxm | Stardance
Devlogs:
Inventory UI, Block Creation, some textures
maple (oak) trees and fps counter
re-done block rendering, adding a function instead of just drawing it onto the canvas, added more textures (gems in block form) and redid dirt texture. Also added movement (only canvas movemnt)
main menu, new cursor
The Backdrop Update Added Backdrops to all popups Added a “pausing” system (just disabling keyboard input for now) Added Animations like popup to the main menu elements Added some NPM packages
The Loading Screen Update Added a loading screen which goes to 90% and then waits for the CrazyGames SDK. Removed all NPM dependancies and replaced them with CDNs Added a squeeze in animation when closing Loading screen and Main Menu And much more! (NEXT UPDATE: Create worlds frm seeds with basic terrein 😭 i need help with this)
The Terrain Preparation Update This is a BIG UI update, and in the next update I’ll add scripting to most of the world menu UI, which has not yet been scripted. New Features: Play Button (shows after the loading screen is finished (in order to get the main menu audio to play)) Main menu music (from opengameart.org) World Menus UI World Creation UI Temporary Gradient Background (To be replaced by game screenshots) Scrollable Credits Fixes Fixed some spelling mistakes in the code
The LittleJS Update Yes, this doesn’t look like much, but it took 5 hours over the span of multiple days and a LOT of trial and error to get to this point! I had to learn so many things, like Promises, async and await, how to make new classes, and LittleJS. But why? Why go through so much trouble? That’s because I’ve realized that I would not, in my current state, be capable of making a full Minecraft clone using only the vanilla HTML Canvas. I chose littleJS because of the promise of fast and lean, and I had already tried it before but failed; I wanted to redeem myself. New Features The rendering part of the game is now done with LittleJS Popups now have minimum width and heights Create new world form now has placeholder text for those who are lazy to type stuff Fixes Renamed Ebony to Cedar because Ebony trees are not pine trees Removed the useless pausing system Removed all of the old rendering system (NEXT UPDATE: Create worlds from seeds 😭 i need help with this)
Progress report: I have been grinding this, and I haven’t posted a dev log in a while because I haven’t really finished anything, so this will be a progress report. Finished Features: New dirt, and grass textures The old textures suck, because in between blocks there would be like a small section where there is like no detail, so I added those details and recolored the grass bit of the grass texture because the old one was too “limy.” Added bedrock Self-explanatory; no interesting thing happened that I would want to yap about Updated Game rendering Last devlog, I ported my rendering side of the game to LittleJS, a browser game engine. Why? Because I realized that I wouldn’t have the time and effort to manually do advanced stuff like lighting and particles. Hence, I ported to LittleJS. Now, in the days after the port, I had to fix a lot of things and bugs. Originally, the game would render everything, even if it wasn’t on screen, so I fixed that. I made it so that if you couldn’t see the blocks in the camera, they wouldn’t be rendered. Unfinished Features: Flat Game Mode (90% Done): I decided that tinkering with sandbox mode first would be stupid, as I would still have to make players, inventory system, etc. I feel like I’ve finished everything, but there is something missing. The sky. I still need to make the sky. I don’t know if it should be an image or something else. Players (10% Done): All I have done for players is literally a goffy ahh skin (which I should make better) and a player variable. I think you would be able to piece together what I want for this. Custom skins (60% Done): I want to make custom skins. I have completed the UI, the security part of the server-side (aka my old broken ahh Chromebook) code, and a simple UI for it. All I need to make now is server-side code to store the custom skin and deliver it to the client.
Custom Skins! After a lot of time getting the back-end setup (with some help from ChatGPT, I’d have to admit), custom skins are here! (Granted… players aren’t here yet so you can’t really try them out lol.) New Features New page ( https://blxcode.github.io/FlatCraft/upload-skin/ ) Think of it like skindex but with a worse ui Searching for skins Skin Uploading Changes & Bug-Fixes Grass Retexture Dirt Retexture
Progress Update #2: Why, you may ask, do I do progress updates? It’s because only 10 hours MAX can be logged per dev log, and uhh… I think you get the picture. So, without further adieu, this is what I’ve been working on. Unfinished Features: Players (85% Complete) That’s a huge jump from the last time I’ve updated you on the progress on players. Now the thing is, physics is annoying. And I’m not old enough to study calculus at my high school. Which is a shame, as I really like the idea of calculating values based off of differentiating values. I’ve literally just been playing around with the physics at 3 am!??!? Wow! It’s literally 3:30 in the morning. I should go get some sleep. The jumping and crouching are a bit finicky, but I’ll fix them sometime later. Closing Remarks: First of all, a lot of the 10 hours in this progress update have been miscellaneous things like bug fixes or just general tweaks. I’ve also been realizing that this project is big. But the end of the tunnel is still nowhere in sight. Yet, if I can stop sitting around and start sprinting towards, uhh… any direction, there will be light at the end of the tunnel. I hope I can finish this project before school starts. I’ll have to grind like a lot, and especially at night because my siblings are quite brain-rotted, annoying, and loud.
Progress Update #3 I’m too stupid to do physics. I should have made everything with Box2D. I’m currently fiddling with side collisions, as all other collisions (I hope) are done. I’ve also finished jumping and falling physics. Also, I’ve spent another 8 hours, and I want every minute to be for my new 3d printer. Finished Features Jumping My Jumping physics thingy is like the poor and stupid man’s way to do it, but hey… at least it works. It kinda just has a jump multiplyer and it goes down every frame and every frame the player goes up something like 0.05 block units multiplied by the jump multiplier Falling Falling is basically the same as the jumping one. i added sky yes, its a sky :D only a gradient. ill add sun and moon soon prob hopefully idk if there will be night, idk if i can create a night in time. Unfinished Features Side collisions This is stupidlly harder cuz my blocks’ x center is at 0, not 0.5. this means that a block spans from like -0.5 to 0.5. My brain cant handle this… thing.
Players! Players are finally out. After what? 2 progress updates? Wow, that was harder than I imagined. Especially the physics. I had to think creatively and outside of the box for this. Also, this devlog continues from the last one. Just pretend that the progress updates like didn’t exist or just aren’t canon. Finished Features: Players: Player Physics Player Animations Changes: Slightly adjusted dirt texture Increased label elements’ font size Patched weird css border glitch Deleted unnecessary assets (like the custom cursor that only existed for like 5 minutes, 2 months ago) What’s Next (In order): Crouching, and not falling ✅ Drawing tools (hardest one, btw) ✅ Breaking blocks with tools and fists Custom Skins (it’s literally 90 % complete now, but my server is down due to some real life events so have to wait) ✅ Sandbox world Mobs if i have time ship ps. if you are wondering why the screen recording has some static noise, it’s because i have a small desktop fan running like really close, because it’s kinda hot indoors. I don’t know why it’s making tha t sound, it dosnt make that sound irl to be clear. I think it’s because i accidently turned on my mic and my mic is currently my crappy very quiet laptop mic
Bug Fix: I didn’t include the no falling if you are crouching in the last update so i just quickly added an if statement to include that feature.
Block Breaking and Particles! half of the time was spent fixing bugs uhh… ignore that youtube video… New Features: Shadow Particles when touching ground after falling, walking, and after breaking a block Block Breaking Changes & Fixes: Added more things to the block metadata object Fixed collisions not colliding
Drops Part 1 Drops! Though… you can’t pick them up yet… uhhh, and I’m nearing the 10-hour mark, so… yeah. I also completely rewrote the movement code and tweaked the values in collision detection, so that’s like half of the time. Also, it turns out I am not an engineer, as I rewrote my own drops code TWICE in the span of TWO HOURS because of chatgippity roasting me and me roasting myself, respectively. (Also, new dev log format, yay!) New Features Drops (partially) Drops were annoying to implement, partially because I’m a skill issue, and also because I had to learn new things like making classes and stuff like that. Changes & Bug Fixes Collision system revamp The old system was weird and also sometimes inconsistent, so I rewrote the movement system and tweaked the collision system. Overall, a bit of a smaller update if you ask me, and its ONE AND ONLY FEATURE wasn’t complete. Oh well… looks like we’re going to get the next dev log soon.
Drops Part 2 Last devlog, I finished the drop part of drops! This time, I finished the pickup part of drops, and the hold part, though I feel like I do need to tweak the values, I just don’t know by how much. New Features Pick up: The pickup part of drops is basically just an if statement that runs like every frame to see whether or not the player is near enough to a dropped item for them to pick it up. It’s quite simple. Hotbar: I feel like I finished the hotbar, not the inventory system yet, just the hotbar. I finished the “rendering” part, by that I mean like viewing the inventory object and rendering the stuff that is on the hotbar. Changes: Renamed the id of the Inventory div to the Hotbar Readded the FPS counter, and gave it an overhaul The lower arm animation actually plays now
Inventory Ok so i’ve basically just coded the inventory system. uhhh New Features Inventory System Ok so this is how it works: There is an object that has all the invetory data There is a function that renders it it works like that so u dont render the inventory every frame. that would cause SOO MUCH LAG Place blocks Uhhh… place blocks and it also checks if the block u placed collides with any blocks or players and if it is next to a block Changes & Bug Fixes Fixed some weird crouching behavior that I cant really explain cuz it’s like weird. Dont mind the fact that the game bugged out… it’s cuz i forgot to add metadata to the pine logs and rickroll block thingy
Custom Skins Settings Front End Uhhhh it’s in the title… nothing interesting. https://github.com/users/BlxCode/projects/5 New Features Custom Skins are now FULLY 100% Out! custom skins. How it works: A gallery with a bunch of skins and their ids a textbox for the skin ids reload Changes & Bug Fixes None lol
Lighting & Dropping stuff i’ve been slacking off recently, and I mean it. I’ve coded less, and played more games due to the uhhh looming school season starting again but like… i’ve still managed to make things like lighting, dropping stuff, and shuffeling stuff in ur inventory by using the number keys. Features Lighting At first, this was one of the reasons why I decided to switch to little js, but like their system is not designed for 2d minecraft use, so I had to improvise. The lighting system consists of two basic things. One is the ambient lighting, which basically fills the whole screen with light / filling the whole screen without light, and the second thing is like “light objects” by that, I mean like point lights, which are like round lightbulbs per say, and they emit light. Those would be used for stuff like torches. Q Dropping things with q didn’t exist in the 2 part drops update, cuz i was too lazy to implement that. But now, I added that. It’s simple really, it just creates a new droppped item every time u press q. and if u press q with control, then it drops everything in the hotbar slot hovered, and u can drop things in ur inven by hovering over it. Moving things around in ur inventory with the top number keys I added that cuz im just used to that in uhhh…. bloxd.io so yeah, i just added that. Attack anim press mouse button 0 to attack. currently just attack animation for now Changes & Bug fixes Random tick events for stuff like grass turning into dirt or vice versa *greijodkmgrfd idk, it was in my commits smth to do with promises
Tools Update!!!!111 3 more hard gh issues to go! yay it’s like 2:30 on a friday. not bad, but considering school is back, not good either. Honestly, i swear Idk if i can actually finish this before sep 20th, so if i can’t i’ll actually do 100 pushups. and it WILL be on a devlog. so uhh… yeh. idk why but you can see me do 100 pushups. defenatly not in a row tho my arms are actually twigs bro. ok enough yapping, let’s actually get into this. New Features: Tools!!111 tools. the final implementaiton was quite simple actually. I just added tools to the textures, and added them to the metadata, added a few bits of code for the speeding up of breaking blocks and boom! tools. Changes & Bugfixes: Compleated Metadata Drops now produce 80% less lag (by making sure that only 1 shadow per x coord can exist)
Saving worlds… I hope Honsetly, school has been removing litterally half of the day I would have used to do flatcraft, so… yeah. im also writing this at school cuz i needed to sleep. dont tell anyone lol New Features: Saving It’s quite simple actually. Just saving an object with some world data to local storage. Honestly, that’s it. Flower flower. very cool Terrain generation Terrain generation, no ore generation lol
Sprinting this will be my last ever devlog! New Features: FULL Random world generation: It works like this: Seeds: Seeds are not that important, though they do play a part for terrain generation. Terrain: The terrain is basically just a huge array with preset Y levels depending on the terrain type, ie: mountianus, hilly, flat. Ores: Ores are truly random. It dosn’t depend on the seed. Trees: Trees are also truly random Sprinting: Double press the key in the direction you want to go to sprint that’s it! plz rate it well
Fixed some issues regarding prod (wont get paied for this 😭) ALright, even though i just shipped, there were stuff that were broken, first of all i realized that if you have a expensive 4k 240 hz ahh monitor, the game would get very fast due to the fact that I didn’t introduce deltat time, so i introduced delta time. Bug fixes Fixed bug when you were very fast on a 60hz+ monitor Fixed glitch where the animation state changes between falling and breaking a block while breaking a block while falling
FIxed bug where jumping wasn’t scaled to your fps Simple really! it’s on the title Changes & Bug Fixes fixed bug where jumping wasn’t scaled to your fps that bug would have made high fps players not able to jump high, and low fps players to jump SUPER high
Ships:
FlatCraft Basic Info FlatCraft is an open source, MIT licensed 2d Minecraft inspired game. It uses LittleJS for the rendering, and vanilla HTML/CSS/JavaScript for the UI. All the rest was written by me. Challenges: One of the biggest challenge was world generation. The idea was to use simplex noise to make terrain, but there was one problem: It’s uncontrolability. I wanted real biomes, but that coudn’t happen because I didn’t know how to control simplex noise. Nor did I know how to make mountains. I solved it by realizing that this is just a silly 2d Minecraft game for a program designed to get teens to make something, not for teens to make some complex minecraft like game, so I decided to bite the bullet and to just make an array for each biome, and have that array contain the y level of the highest block, and use that array to make the terrain. It’s basically like [1,1,2,2,3,3]. Nothing complicated, and if you played this game long enough you’ll see that each biomes are litterally the same. Most Proud of: I’m actually most proud of the custom skins part of flatcraft. It’s really not that complex, but it took a mesruable amount of time to get it working. I had to learn node.js, finally had a use for a server! and used my old chromebook as my server. I made the precaution of adding a ratelimiter just in case someone tried to take it down or whatever, but yeah. That’s what I’m most proud of. What I learned: Making classes in js NodeJS LittleJS engine Stuff that didnt make it into the game: Game music Mobs Credits Art: Me, mostly me, My little brother Inspired by https://www.planetminecraft.com/texture-pack/digs-simple-pack-1-15-100-complete/ , and https://bloxd.io Programming: Me Libraries used: LittleJS...
|
1792853712.4246504
|
1792940112.4246504
|
|
34756
|
Anixweb by @imnottimaq | Stardance
|
imnottimaq
|
1
|
108.14
|
1395
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-14T23:49:54Z", "hours": 83.0, "multiplier": 16.81, "payout": 1395, "blessing": "neutral", "text": "Hi! I want to present my project called Anixweb. Anixweb is an open-source web client for Anixart, a mobile app popular in the Russian-speaking community. I created it because I have been using Anixart on my phone for about five years, and I have always wanted to use it on my PC. I also wanted to learn JavaScript, TypeScript, and React by building a real project. It has many of the features you would expect: watchlists, favorites, and watch history; a huge selection of anime with Russian dubs or subtitles; search and advanced filters; user profiles, friends, comments, and ratings; notifications about new releases and episodes; and much more! In addition to recreating the core functionality of the official app, I also developed two features of my own: Watch Together and Upscale. Watch Together allows you to synchronize video playback with other people. It supports both public and private rooms. You can discover and join public rooms through the room browser, while private rooms can be joined using a room code or an invitation link. Episode selection, pauses, seeking, playback position, and playback speed are synchronized through a WebSocket server. Room owners can also allow other participants to control playback and select episodes. Upscale is an optional feature that uses WebGPU and Anime4K shaders to improve the viewing experience by sharpening the image and reducing blur in real time. All processing happens locally on your device, without manually re-encoding or uploading the video. I used: React and React Router; TypeScript; Vite; HLS.js for video playback; WebSockets for room synchronization; Anime4K-WebGPU for real-time image enhancement; CSS Modules for styling. One of the hardest parts was managing the video player lifecycle: switching streams, recovering from HLS errors, preserving playback progress, and keeping multiple users synchronized without creating feedback loops. I spent more than 90 hours working on this project. Along the way, I learned a lot about accessibility, video streaming, WebGPU pipelines, API integration, localization, and managing and structuring a medium-sized React application. This is an independent project and is not affiliated with the SwiftSoft Team in any way.", "repo": "https://github.com/imnottimaq/anixweb", "demo": "https://imnottimaq.github.io/anixweb/"}]...
|
[{"post_id": 80987, "ts": "202 [{"post_id": 80987, "ts": "2026-10-19T14:56:50Z", "hours": 7.1439, "text": "i havent looked into original app for a while, a month ago there was a huge update which added a lot of things first one is feed, implemented it initially but it requires reputation level 3 just to be able to post, which is kinda lame but it serves as antibot i guess improve watch together (better layout, controls and permissions) now you can move around categories in home and favorites to change order, on right click you can select default one and also there is new category in api called donghua, also implemented fixed bug that prevented you from login if you already had invalid token in cookie now you can properly download episodes as mp4 instead on hls fragments, but the speeds are kinda bad (0.5 - 1.5 mbps), will look into it bunch of minor changes: broader test coverage improved import/export of lists fullscreen photo viewer fixed recommendations if no description provided, it now says “no description provided” instead of blank space"}, {"post_id": 79651, "ts": "2026-10-14T22:11:57Z", "hours": 11.3022, "text": "forgot about devlogs, hour lost basically new settings auto fullscreen on episode start custom menu on right click cloud settings which are linked to anixart account and are saved on worker import/export of mal or shikimori lists new theme settings compact mode auto pause on focus loss download episodes(hls fragments for now only, proper mp4 planned for next devlog) chat in watch together (text, voice messages, reactions) prolly there is something else i have done but i cant remember, but this is the most important changes i kinda lied about maintenance only state xd"}, {"post_id": 77952, "ts": "2026-10-08T22:55:52Z", "hours": 6.6942, "text": "revamped watch together feature (for now only initial v2 release, needs more testing) also as a part of v2 server i unified proxies and room server into one worker, dont think this will affect something, but i just didnt like the idea of keeping proxy separately as it is like 200-300 lines fixed a lot of player bugs, in particular: if you switch to another episode, resume prompt is now not skipped when you change quality, player sometimes could lose progress upscaler implementation is now much stable and reliable initial test coverage, aiming for atleast 70% coverage for the next devlog, for now 90% for core logic and 15-20% across all codebase from now on, i probably wont add new features to the project, focusing on bugfixes and layout changes etc"}, {"post_id": 45968, "ts": "2026-08-12T19:50:30Z", "hours": 3.4922, "text": "friends management screen ability to change notifications per release fixed notifications setting, apparently they were broken now you can rate release editable player keybinds updated dependencies because react router had 2 vulnerabilities small changes here and there project is almost ready to ship, will ship today or tomorrow idk"}, {"post_id": 44777, "ts": "2026-08-10T19:39:13Z", "hours": 7.7881, "text": "collections screen, ability to save/create/comment collection asked claude to unify design, looks really better now and very well rounded fixed some linter error but not all(i dont know how to fix syncronous setState) some internal stuff that allowed me to reduce code size a bit removed swiper dependency(gallery i used in release screen) new buttons in overview but they are not fully functional yet reworked comments section a bit and also there is +1 hour for room server for watch together (fully vibecoded btw)"}, {"post_id": 40331, "ts": "2026-08-03T19:29:42Z", "hours": 1.9294, "text": "did a overview screen, looks cool im getting close to ship (80-85% i would say), mostly some polishing is left and the most major feature i havent implemented yet is collections, but for now ill focus more on polishing things instead"}, {"post_id": 40053, "ts": "2026-08-03T12:34:55Z", "hours": 0.5283, "text": "franchise screen"}, {"post_id": 39783, "ts": "2026-08-02T23:41:32Z", "hours": 2.2006, "text": "changed all names to anixweb to avoid having issues with the devs of original app in the future made account edit screen where you can change for now nickname, avatar, socials and some settings related to who can send you friend requests etc. friend requests is also a thing i implemented, but honestly i dont know why it even exists. it doesnt have any functionallity like chat or something, it just exists maybe ill implement like inviting your friend to the watch together room but idk about that one, my current worker will not be enough probably if site will be used by more than 100 people at the time also added proxy for images as an option cuz for me their images storage is not reachable via standard link, and with proxy it works good and also added like roles(which is not super important, did it just for the parity with the api), but like only 0.5% users of this app have any role roles is essentially like groups for example some dubbers team"}, {"post_id": 39178, "ts": "2026-08-01T23:31:26Z", "hours": 4.9144, "text": "god it took me like whole day to do it notifications screen itself wasnt hard to do, but settings was. it wasnt documented at all so i had to pull up mitmproxy + android emulator and find out and that alone took me 2 hours (not counted in the total time) also wanted to make notifications via web push api, but it isnt possible unfortunately overhaul of api client, now its a bit more unified lazy loading of components so it takes less time to load if you open website first time upgraded node on actions small improvements here and there"}, {"post_id": 38374, "ts": "2026-07-31T18:34:22Z", "hours": 2.495, "text": "after 3 and a half hours im finally done fixed account screen implemented “watch together feature” which is beta for now as it is a buggy mess as of writing this devlog and i actually found one more bug as i am writing this, ill fix it later i promise next time will implement ability to search on english as a toggle in settings through shikimori api (kinda like myanimelist but russian) this will probably make search slower but it will work"}, {"post_id": 38180, "ts": "2026-07-31T13:26:35Z", "hours": 2.0006, "text": "added this section that api sometimes returns fixed a few bugs with player: player doesnt show controls while fullscreen if webgpu is not available in your browser quality upgrade option will now gray out controls now disappear after sometime if server returns broken hls stream, it will try to gracefully recover now also changed things around in login/register/forgot password: token is now moved to cookies instead of localstorage as its more secure(but its still not very secure because api requires to send token as a query parameter and token doesnt change between devices until password reset) cleaned up some logging to console as its not really necessary now favorites page now shows popup for user to login to access this page oh and also settings button and also asked ai to implement translation, this will be removed probably after i ship project, as this site is not meant to be used by non-russian speakers"}, {"post_id": 37921, "ts": "2026-07-30T22:32:47Z", "hours": 2.9978, "text": "anime4k upscale works, but on chromium-based browsers only(firefox has bug that doesnt let it work) settings screen fully functional started working on translation to english, honestly at first i tried to look at browser translation feature, but it was horrible, so i decided to make it will be hard to implement to properly but i think 3-4 hours and i’ll be done"}, {"post_id": 37555, "ts": "2026-07-30T11:24:59Z", "hours": 3.7247, "text": "search is now a thing and it works fine redesigned cards on home screen and you can select between horizontal and vertical card (for now only through changing localstorage xd) some improvements here and there like a little bit better design of release screen next up i will probably finally do player settings and implement anime4k maybe"}, {"post_id": 36603, "ts": "2026-07-28T20:24:18Z", "hours": 0.9431, "text": "i finally understood that i suck at design and asked ai to design it. now it looks amazing. next i will ask it to look at release screen cause i like the layout of it but design is half good half sucks"}, {"post_id": 36109, "ts": "2026-07-28T00:06:39Z", "hours": 2.8711, "text": "draft for account page, for now copied design from mobile app, tomorrow will propery design, and now im going to sleep good night"}, {"post_id": 36004, "ts": "2026-07-27T20:24:53Z", "hours": 2.6617, "text": "okay found a way to make it work edited cors proxy to also include route with anixart user agent this could be bannable, but at most they will ban proxy ip on the api and that is not crucial, cors proxy will work just fine voting, posting a comment/reply, editing comment, deleting it was implemented"}, {"post_id": 35515, "ts": "2026-07-27T00:16:28Z", "hours": 1.9069, "text": "from now on i’ll try to make devlogs more often tried to make replies to comments but hit the wall: api does not allow adding comments/replies without anixart user agent. same goes with voting on comments (like/dislike kinda like reddit system) so i spend 2 hours just to discover that it will not work"}, {"post_id": 35200, "ts": "2026-07-26T13:56:38Z", "hours": 5.2744, "text": "ok i finally deployed it to github pages and also pushed source code to github also added favorites screen where you can see your history, favorites and each list (watched, planned, watching etc) added popup when you open site first time that its not official and im not responsible for your account oh and also tabs on home screen to see latest, ongoing, announced etc probably will add settings screen next time and also finish player"}, {"post_id": 34109, "ts": "2026-07-24T16:22:08Z", "hours": 6.7553, "text": "player 80 percent ready(settings is the only thing that does not work) refactored code a bit, mostly tried to reduce eslint errors/warnings started rewriting modal logic(repeating same logic on every new modal => separate model template component from which other modals will inherit from) and also rewriting modals to use that also, the project is nowhere near mvp, so probably no github pages deploy until that (30 percent rn i would say i spent too much time perfecting release page im dumb)"}, {"post_id": 32658, "ts": "2026-07-21T23:06:39Z", "hours": 7.9831, "text": "okay, its time to make a devlog proper dub/source select modal (eyeball shows that you already watched that episode and in the future i plan to implement time where you stopped but first i need to make proper player) began defining settings proper login screen and ability to create account/recover password (to be honest i thought it was impossible to make but after some reverse engineering via mitmproxy and android 7 emulator i found out that api reference that i was using is either outdated or not properly documented) ability to view comment replies and started working full comment section tried to implement voting on comments but its impossible unfortunately, api checks for allowed user agent and i cant change that moved things around internally, now project structure is more refined i think by the time i have to do next devlog i’ll deploy this site via github actions/github pages so i dont have to pay for hosting(application is fully client-side anyway)"}, {"post_id": 31486, "ts": "2026-07-19T21:56:15Z", "hours": 8.7089, "text": "release page almost ready, final touches left also spent too much time on dealing with cors error (kodik, one of the main players, was throwing cors error, so i asked codex to create simple cors proxy and deployed it to vercel, but kodik still sent broken data, turns out it was because of us ip adress, i moved proxy to cloudflare workers and now it parses fine) used linkparser from thedesconnet/anixartjs (this stuff is too wacky for me to deal with it myself) random anime button on header proper player is still wip (1% ready xd) will ask codex to do it cuz i dont even know where to start from also spent too much time to design this page but now it looks amazing hope to make proper player by the next devlog but this whole thing is new to me so im not sure"}, {"post_id": 29843, "ts": "2026-07-17T00:02:39Z", "hours": 8.4994, "text": "god that took a while, but you can finally watch something using this site, also login works now but no new account registration"}, {"post_id": 28527, "ts": "2026-07-14T20:47:13Z", "hours": 3.0678, "text": "As of now, webpage looks like this: Now you can open release and as of now it will show poster, play button, favorite button and dropdown where you are supposed to select whether you watch it right now, plan to watch it, or dropped it(there is more im too lazy to describe them all) Next up i will implement ability to watch episodes and log into your account (maybe sign in too im not sure)"}, {"post_id": 28016, "ts": "2026-07-14T00:26:24Z", "hours": 2.2583, "text": "Today i finally started working on it, threw together something basic as im new to react/js"}]...
|
Title: Anixweb by @imnottimaq | Stardance
Devlogs Title: Anixweb by @imnottimaq | Stardance
Devlogs:
Today i finally started working on it, threw together something basic as im new to react/js
As of now, webpage looks like this: Now you can open release and as of now it will show poster, play button, favorite button and dropdown where you are supposed to select whether you watch it right now, plan to watch it, or dropped it(there is more im too lazy to describe them all) Next up i will implement ability to watch episodes and log into your account (maybe sign in too im not sure)
god that took a while, but you can finally watch something using this site, also login works now but no new account registration
release page almost ready, final touches left also spent too much time on dealing with cors error (kodik, one of the main players, was throwing cors error, so i asked codex to create simple cors proxy and deployed it to vercel, but kodik still sent broken data, turns out it was because of us ip adress, i moved proxy to cloudflare workers and now it parses fine) used linkparser from thedesconnet/anixartjs (this stuff is too wacky for me to deal with it myself) random anime button on header proper player is still wip (1% ready xd) will ask codex to do it cuz i dont even know where to start from also spent too much time to design this page but now it looks amazing hope to make proper player by the next devlog but this whole thing is new to me so im not sure
okay, its time to make a devlog proper dub/source select modal (eyeball shows that you already watched that episode and in the future i plan to implement time where you stopped but first i need to make proper player) began defining settings proper login screen and ability to create account/recover password (to be honest i thought it was impossible to make but after some reverse engineering via mitmproxy and android 7 emulator i found out that api reference that i was using is either outdated or not properly documented) ability to view comment replies and started working full comment section tried to implement voting on comments but its impossible unfortunately, api checks for allowed user agent and i cant change that moved things around internally, now project structure is more refined i think by the time i have to do next devlog i’ll deploy this site via github actions/github pages so i dont have to pay for hosting(application is fully client-side anyway)
player 80 percent ready(settings is the only thing that does not work) refactored code a bit, mostly tried to reduce eslint errors/warnings started rewriting modal logic(repeating same logic on every new modal => separate model template component from which other modals will inherit from) and also rewriting modals to use that also, the project is nowhere near mvp, so probably no github pages deploy until that (30 percent rn i would say i spent too much time perfecting release page im dumb)
ok i finally deployed it to github pages and also pushed source code to github also added favorites screen where you can see your history, favorites and each list (watched, planned, watching etc) added popup when you open site first time that its not official and im not responsible for your account oh and also tabs on home screen to see latest, ongoing, announced etc probably will add settings screen next time and also finish player
from now on i’ll try to make devlogs more often tried to make replies to comments but hit the wall: api does not allow adding comments/replies without anixart user agent. same goes with voting on comments (like/dislike kinda like reddit system) so i spend 2 hours just to discover that it will not work
okay found a way to make it work edited cors proxy to also include route with anixart user agent this could be bannable, but at most they will ban proxy ip on the api and that is not crucial, cors proxy will work just fine voting, posting a comment/reply, editing comment, deleting it was implemented
draft for account page, for now copied design from mobile app, tomorrow will propery design, and now im going to sleep good night
i finally understood that i suck at design and asked ai to design it. now it looks amazing. next i will ask it to look at release screen cause i like the layout of it but design is half good half sucks
search is now a thing and it works fine redesigned cards on home screen and you can select between horizontal and vertical card (for now only through changing localstorage xd) some improvements here and there like a little bit better design of release screen next up i will probably finally do player settings and implement anime4k maybe
anime4k upscale works, but on chromium-based browsers only(firefox has bug that doesnt let it work) settings screen fully functional started working on translation to english, honestly at first i tried to look at browser translation feature, but it was horrible, so i decided to make it will be hard to implement to properly but i think 3-4 hours and i’ll be done
added this section that api sometimes returns fixed a few bugs with player: player doesnt show controls while fullscreen if webgpu is not available in your browser quality upgrade option will now gray out controls now disappear after sometime if server returns broken hls stream, it will try to gracefully recover now also changed things around in login/register/forgot password: token is now moved to cookies instead of localstorage as its more secure(but its still not very secure because api requires to send token as a query parameter and token doesnt change between devices until password reset) cleaned up some logging to console as its not really necessary now favorites page now shows popup for user to login to access this page oh and also settings button and also asked ai to implement translation, this will be removed probably after i ship project, as this site is not meant to be used by non-russian speakers
after 3 and a half hours im finally done fixed account screen implemented “watch together feature” which is beta for now as it is a buggy mess as of writing this devlog and i actually found one more bug as i am writing this, ill fix it later i promise next time will implement ability to search on english as a toggle in settings through shikimori api (kinda like myanimelist but russian) this will probably make search slower but it will work
god it took me like whole day to do it notifications screen itself wasnt hard to do, but settings was. it wasnt documented at all so i had to pull up mitmproxy + android emulator and find out and that alone took me 2 hours (not counted in the total time) also wanted to make notifications via web push api, but it isnt possible unfortunately overhaul of api client, now its a bit more unified lazy loading of components so it takes less time to load if you open website first time upgraded node on actions small improvements here and there
changed all names to anixweb to avoid having issues with the devs of original app in the future made account edit screen where you can change for now nickname, avatar, socials and some settings related to who can send you friend requests etc. friend requests is also a thing i implemented, but honestly i dont know why it even exists. it doesnt have any functionallity like chat or something, it just exists maybe ill implement like inviting your friend to the watch together room but idk about that one, my current worker will not be enough probably if site will be used by more than 100 people at the time also added proxy for images as an option cuz for me their images storage is not reachable via standard link, and with proxy it works good and also added like roles(which is not super important, did it just for the parity with the api), but like only 0.5% users of this app have any role roles is essentially like groups for example some dubbers team
franchise screen
did a overview screen, looks cool im getting close to ship (80-85% i would say), mostly some polishing is left and the most major feature i havent implemented yet is collections, but for now ill focus more on polishing things instead
collections screen, ability to save/create/comment collection asked claude to unify design, looks really better now and very well rounded fixed some linter error but not all(i dont know how to fix syncronous setState) some internal stuff that allowed me to reduce code size a bit removed swiper dependency(gallery i used in release screen) new buttons in overview but they are not fully functional yet reworked comments section a bit and also there is +1 hour for room server for watch together (fully vibecoded btw)
friends management screen ability to change notifications per release fixed notifications setting, apparently they were broken now you can rate release editable player keybinds updated dependencies because react router had 2 vulnerabilities small changes here and there project is almost ready to ship, will ship today or tomorrow idk
revamped watch together feature (for now only initial v2 release, needs more testing) also as a part of v2 server i unified proxies and room server into one worker, dont think this will affect something, but i just didnt like the idea of keeping proxy separately as it is like 200-300 lines fixed a lot of player bugs, in particular: if you switch to another episode, resume prompt is now not skipped when you change quality, player sometimes could lose progress upscaler implementation is now much stable and reliable initial test coverage, aiming for atleast 70% coverage for the next devlog, for now 90% for core logic and 15-20% across all codebase from now on, i probably wont add new features to the project, focusing on bugfixes and layout changes etc
forgot about devlogs, hour lost basically new settings auto fullscreen on episode start custom menu on right click cloud settings which are linked to anixart account and are saved on worker import/export of mal or shikimori lists new theme settings compact mode auto pause on focus loss download episodes(hls fragments for now only, proper mp4 planned for next devlog) chat in watch together (text, voice messages, reactions) prolly there is something else i have done but i cant remember, but this is the most important changes i kinda lied about maintenance only state xd
i havent looked into original app for a while, a month ago there was a huge update which added a lot of things first one is feed, implemented it initially but it requires reputation level 3 just to be able to post, which is kinda lame but it serves as antibot i guess improve watch together (better layout, controls and permissions) now you can move around categories in home and favorites to change order, on right click you can select default one and also there is new category in api called donghua, also implemented fixed bug that prevented you from login if you already had invalid token in cookie now you can properly download episodes as mp4 instead on hls fragments, but the speeds are kinda bad (0.5 - 1.5 mbps), will look into it bunch of minor changes: broader test coverage improved import/export of lists fullscreen photo viewer fixed recommendations if no description provided, it now says “no description provided” instead of blank space
Ships:
Hi! I want to present my project called Anixweb. Anixweb is an open-source web client for Anixart, a mobile app popular in the Russian-speaking community. I created it because I have been using Anixart on my phone for about five years, and I have always wanted to use it on my PC. I also wanted to learn JavaScript, TypeScript, and React by building a real project. It has many of the features you would expect: watchlists, favorites, and watch history; a huge selection of anime with Russian dubs or subtitles; search and advanced filters; user profiles, friends, comments, and ratings; notifications about new releases and episodes; and much more! In addition to recreating the core functionality of the official app, I also developed two features of my own: Watch Together and Upscale. Watch Together allows you to synchronize video playback with other people. It supports both public and private rooms. You can discover and join public rooms through the room browser, while private rooms can be joined using a room code or an invitation link. Episode selection, pauses, seeking, playback position, and playback speed are synchronized through a WebSocket server. Room owners can also allow other participants to control playback and select episodes. Upscale is an optional feature that uses WebGPU and Anime4K shaders to improve the viewing experience by sharpening the image and reducing blur in real time. All processing happens locally on your device, without manually re-encoding or uploading the video. I used: React and React Router; TypeScript; Vite; HLS.js for video playback; WebSockets for room synchronization; Anime4K-WebGPU for real-time image enhancement; CSS Modules for styling. One of the hardest parts was managing the video player lifecycle: switching streams, recovering from HLS errors, preserving playback progress, and keeping multiple users synchronized without creating feedback loops. I spent more than 90 hours working on this project. Along the way, I learned a lot about accessibility, video streaming, WebGPU pipelines, API integration, localization, and managing and structuring a medium-sized React application. This is an independent project and is not affiliated with the SwiftSoft Team in any way....
|
1792993755.3180041
|
1793080155.3180041
|
|
14535
|
Issued YSWS by @Acidicts | Stardance
|
Acidicts
|
1
|
91.58
|
1383
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-01T17:03:11Z", "hours": 89.0, "multiplier": 15.53, "payout": 1383, "blessing": "neutral", "text": "Shipped!!! There are a bunch of features and stuff that I have added to this since flavortown, from the ordering system to devlogs and ship flow. Project Info This is the ruby on rails app for the ysws draft #issued where YS: Designs made with Code WS: Clothes and other swag with those designs Features added: A bunch of features have been added and I have separated them to 3 categories Major ones for functionality, quality of life for feel and use, security for data security. New Major Features: Designs view now is more detailed including hackatime projects and images from devlogs and ships Ship flow system so you can submit to the ysws Product Design system (admin only - for making the shop items by importing from printful via api) Order system using lots of hotwired turbo (choose color, design placement rotation and scale) Notifications (3 types Normal which provides info and 2 others Boolean which gets a yes or no answer and text which gets a written answer Reviewer Panel which shows pending ships to review with some data on (need to add hackatime info for it though) Storing Reviewer proof videos in a cloudflare R2 storage Quality-Of-Life: Added better UI/UX with some issues with need for ironing out (eg font change from workbench to ‘lexend’ and ‘space mono’ Kept a consistent style through the site, although some panels might need better border colour On login it redirects to the page you logged in by Security: I added User DB encryption to protect user data stored on the postgres database instance, such as name and email Summary Made the functional part of the ysws site (Designs, ordering, shipping) Added more security for user data Improved UI(Font and colour scheme)", "repo": "https://github.com/Acidicts/Issued", "demo": "https://issued.bing-bong.uk"}]...
|
[{"post_id": 78879, "ts": "202 [{"post_id": 78879, "ts": "2026-10-11T21:05:08Z", "hours": 2.5772, "text": "I created the fulfilment system for a fulfilment team to use Recent changes Removed redundant save! calls and updated fulfillment tests to reduce unnecessary database operations and align test logic with current behavior 9acc056 . Added a fulfillment role, batch pipeline, and popup controller to support new workflow automation and UI interactions afa7a20 . The popup controller likely handles transient UI elements like notifications or modals. Fixed a crash in /designs preview rendering by resolving an issue blocking Ruby scan/lint CI, ensuring previews no longer fail unexpectedly ( 911f035 ). Corrected a stray question mark in a design preview image tag to prevent malformed HTML output ( 955dd6c ). Added a note about YSWS draft sponsorship documentation, possibly for tracking external partnerships or funding discussions ( d92d571 ). No performance optimizations or subsystem overhauls were addressed in this cycle. Next steps depend on external feedback and test coverage improvements implied by recent test updates."}, {"post_id": 75924, "ts": "2026-10-01T16:48:57Z", "hours": 0.6297, "text": "Deploying on coolify and fixing bugs with that + encrypting current db"}, {"post_id": 75729, "ts": "2026-09-30T21:34:41Z", "hours": 1.0775, "text": "Recent changes - Installed Bundler 4.0.4 in the Dockerfile to standardize gem management across environments ( 88ba659 ). - Ensured the verification directory exists for SVG upload tests, addressing missing file system setup in test workflows ( 83f2e53 ). - Resolved a Turbo conflict in order steps, likely related to event streaming or frame rendering in Rails views ( e8d08f4 ). Updated navigation unread counts dynamically from notification events, improving real-time feedback for user activity ( a75f6ff )."}, {"post_id": 75254, "ts": "2026-09-29T16:08:17Z", "hours": 3.9967, "text": "## Recent changes Notifications: Unanswered notifications now retain their unread status until explicitly addressed. This ensures users can distinguish between pending and resolved interactions without relying on manual state updates ( 751a370 ). Security: Authentication workflows, file uploads, and resource authorization checks have been updated with additional safeguards. Specifics include input validation and access control refinements, though implementation details are not disclosed in the commit message ( 97e48db )."}, {"post_id": 74657, "ts": "2026-09-27T21:33:33Z", "hours": 2.8042, "text": "Made Notifications Useful Recent changes Persistent unread state for unanswered boolean notifications Notifications with unresolved boolean actions (e.g., approvals) now remain marked as unread until explicitly addressed. This ensures users revisit pending decisions. Commit: 39aabb2 . Interactive notification replies with approval time tracking Added support for direct replies to notifications, along with timestamp logging for when approvals are finalized. This enables granular tracking of response times for actionable alerts. Commit: 6ac80f9 ."}, {"post_id": 74176, "ts": "2026-09-26T21:01:23Z", "hours": 9.8606, "text": "Recent changes Added ship request reviews, resubmission logic, and R2 storage integration for tracking reviewed submissions ( 41b1e43 ). Started on the review workflow Started on Resubmission logic Set up support for cloudflare R2 Guarded Hack Club token persistence behind encryption configuration, ensuring tokens are only stored when encryption is explicitly enabled ( a4b6d0c )."}, {"post_id": 71158, "ts": "2026-09-20T11:24:58Z", "hours": 2.1222, "text": "Recent changes Comment delete, Turbo Comment Box, and ship request fade functionality Add #destroy functionality to the comments with owner permission, path, delete button, and dependent comments. Make use of valid commentable_type/id while building comments and make responses as Turbo streams and wrap up comments within a Turbo frame. Resize the comment box according to the content changes detected by the MutationObserver. Make ship request modal and overlay fade in and out. Consider higher level ship request as blockers for all ship requests. Comment card and comment list styling."}, {"post_id": 70827, "ts": "2026-09-19T20:44:04Z", "hours": 7.9789, "text": "Recent changes Add comments to devlogs and ship requests Implement polymorphic Comment model with CommentsController, Stimulus-driven collapsing comment box, markdown preview form, and styles. Comments will be rendered by Turbo frames and allow editing by owner/admin. This is what else is included in this change: Encryption of hackclub_access_token and hackclub_refresh_token through ActiveRecord encryption, including config, env sample and migration task for already existing non-encrypted tokens. SSL enforcement in production (assume_ssl, force_ssl). Update filter_parameters to strip out sensitive information and OAuth tokens from logs. Fix ExchangeRate API call to include Bearer authentication header. Sanitization of devlogs HTML output through SafeListSanitizer. Update Design#can_make_devlog to can_make_devlog? method and restrict can_ship? check to devlogs without ship request. Add SRI integrity attribute to marked/DOMPurify scripts loaded from CDNs. UI improvements: styles for disabled buttons, utility class for hover-underline effect, devlog cards layout and info icons."}, {"post_id": 65654, "ts": "2026-09-10T22:45:01Z", "hours": 4.65, "text": "Recent changes Ship request flow and SVG conversion : Added support for processing ship requests, handling SVG conversions, and validating devlog images before submission 8ca9b5d9 . Nil safety for Hackatime projects : Wrapped the @hackatime_projects variable in an Array structure to prevent nil errors when retrieving project data a29691ff . CI environment and test ordering : Set RAILS_ENV=test for the CI setup process and reordered the sequence of test steps to improve execution reliability 2968d162 . Authorization consolidation : Refactored authorization guards and consolidated the linking logic for Hackatime projects 4c2b1836 ."}, {"post_id": 63555, "ts": "2026-09-07T13:59:01Z", "hours": 4.54, "text": "Recent changes Fixed a failure in the CI/CD pipeline commit Implemented status tracking for balance events and refined the underlying thread logic associated with them commit Refactored the token rendering component for render_encoded to allow {{design: design.id}} making a pill, to improve display fidelity and added an edit functionality for devlog entries commit Integrated support for uploading images directly within the devlog interface and established links to corresponding Hackatime projects commit"}, {"post_id": 62972, "ts": "2026-09-06T15:23:56Z", "hours": 7.4994, "text": "Added Devlogs and changed hackatime projects to be multi model per design. Move hackatime project linkage from a single designs.hackatime_project column to a has_many hackatime_projects model, syncing each project’s time and aggregating totals on designs. Add devlogs, ship_requests, ships, and comments models/routes/views for design logging and shipping, and make balance_events polymorphic.Update designs controller, helpers, and views to render multiple project pills, allow adding/removing linked projects, and show a combined hackatime/image/devlog layout. Add redcarpet for Markdown rendering and adjust CSS for dark mode, responsive galleries, and pill controls. Added Devlogs and the prep for adding the shipping flow I added devlogs to the project in prep for the shipping flow"}, {"post_id": 61811, "ts": "2026-09-04T21:55:13Z", "hours": 3.1611, "text": "Recent changes Added support for balance events and thread adjustments to improve financial tracking accuracy. This also included an update to the notification rendering system to safely handle these new data types without breaking existing templates (commit: ( faed39b57619 )). Fixed the positioning of the design box within the product editor. This specifically addresses display issues occurring when editing products via /admin/products/<id>/edit (commit: ( aa4e314b5dcd ))."}, {"post_id": 60507, "ts": "2026-09-02T21:52:42Z", "hours": 5.5383, "text": "I’ve focused on refining the shop page styling, header positioning, and cost handling logic ( d10a9c51 ). The recent batch of work involved schema adjustments for a product enabled flag, adding support for cost and thread costs ( 82f9f2d1 ), applying a schema fix ( 3f8bcb8a ), fixing CI pipeline issues ( 71e98a ), and pushing updates to production ( ca19da29 ). Recent changes Added an image variants system and updated views to utilize thumb and display variants specifically ( a2e4eb28 ). Implemented cost handling updates, including a specific support for thread costs alongside general product cost tracking ( 82f9f2d1 ). Added an auto annotaterb script executed within the Rails migration process ( 7d07d278 ). Applied schema fixes to ensure data integrity during the recent updates ( 3f8bcb8a ). Updated the RSVP page styles and refreshed the thanks template ( 217945eb ). Refined header positioning and shop page styling across the frontend ( d10a9c51 ). Added a product enabled flag to control product visibility and state in the system ( 82f9f2d1 ). Whats next: Umm, so whats next I think would be adding balance_events so you can trace changes in balances(spending/earning)"}, {"post_id": 59213, "ts": "2026-08-31T21:41:46Z", "hours": 2.8433, "text": "Since the last update, I’ve focused on enhancing the order preview system to support complex design workflows and improving image navigation for multi-image configurations. Recent changes Added multi-image preview navigation with left/right arrow buttons and an index display (e.g., “Image 2 of 5”) to streamline design review workflows ( b269fe5 ). This change directly addresses the need to review multiple design iterations in a single view without page reloads. Refactored the order preview component to support multiple print areas with independently configurable design images. This involved restructuring the preview logic to handle dynamic print area definitions while maintaining consistent state across design selections ( 0545118 ). The refactor enables customers to visualize different designs on separate print areas (e.g., front/back/ sleeves) within the same order preview."}, {"post_id": 58236, "ts": "2026-08-30T16:26:21Z", "hours": 8.9714, "text": "Print area management UI & backend ( a42a00d ): Built a full stack for managing print areas (think “where the design goes” on a shirt front or back). This includes models to store print area dimensions, controllers to handle CRUD ops, and RESTful routes to tie it all together. The frontend now lets users drag/drop to define print zones with responsive positioning ( position: absolute + transform: scale to handle dynamic sizing). Edge case: Products with multiple print areas (e.g., front + back) now render distinct configurations without clobbering state. Printful service & stock syncing ( 7b5d817 ): Added printful_id to product models to map Issued products to Printful’s inventory. UI updates to display Printful sync status (green checkmarks for success, red alerts for failures). Technical tangents The print area system was a slow make. For example: To ensure designs stay within printable bounds, I had to calculate dynamic margins based on product type (e.g., a hoodie’s print area ≠ a mug’s). This involved hacking some trigonometry into the frontend to snap selections to “safe zones.” On the backend, I’m using ActiveRecord callbacks to validate print area dimensions against product specs. If a user tries to set a print area wider than the product allows It raises a PrintAreaOutOfBounds error Future features The actual ship flow and being able to edit multiple print areas instead of just the one"}, {"post_id": 53048, "ts": "2026-08-23T13:14:54Z", "hours": 4.1422, "text": "Added Variants for size and colors with stock for each printful region facility. Stimulus target which groups the variants by colour and deletes empty groups"}, {"post_id": 50653, "ts": "2026-08-19T22:27:11Z", "hours": 3.3331, "text": "Created Printful API Integration and improved order screen to allow better customisations Add Printful import endpoint and order preview UI improvementsImplemented Printful product import, added order preview generation, UI styles, and controller changes for drag‑resize‑rotate preview."}, {"post_id": 37237, "ts": "2026-07-29T19:53:07Z", "hours": 0.3972, "text": "Improved the New Order Page to be neater, and better themed along the colour scheme"}, {"post_id": 37220, "ts": "2026-07-29T19:25:45Z", "hours": 1.2728, "text": "Rename admin-product to products and refactor CSS, controller, and views. Updated class names and CSS variables, added .no-product-grid and .dashed-break styles. Simplified image loading logic in the product preview controller, and replaced large inline layout styles with external stylesheet includes."}, {"post_id": 35739, "ts": "2026-07-27T11:35:58Z", "hours": 1.3936, "text": "Add brand colors, badge styles, and redesign pagesAdd brand color variables, badge styles, and a full redesign of design pages with responsive layouts, fixed redirect stuff, optimised by using one erb engine call for designs"}, {"post_id": 35463, "ts": "2026-07-26T22:10:06Z", "hours": 1.1911, "text": "Dropdown Styling & Component Replacement The design form’s dropdown interface was overhauled to improve visual consistency and user experience. A native <select> element was replaced with a custom-styled solution using 3ab7405 , allowing for greater flexibility in aligning with the project’s aesthetic goals. This change ensures smoother integration with the overall theme and avoids browser-specific styling quirks. CSS Refactoring & Theme Variables Design form styling was fully refactored in 928b7b0 , introducing global theme variables to streamline color, spacing, and typography management. This move simplifies future theme adjustments and promotes code reuse. Model defaults were also standardized to reduce redundancy in form initialization logic, making the codebase more maintainable. Admin Test Redirects In 2af0071 , the admin test workflow was updated to automatically redirect to the products list URL after test submissions. This improves user navigation by providing immediate feedback and next steps, ensuring a cohesive backend experience. Current Status The frontend is now more thematically consistent, with design forms serving as a primary focus area. Admin workflows are being optimized for clarity and efficiency, though backend test processing logic remains pending integration. The codebase is gradually adopting a modular structure, particularly for UI components and configuration. Things Learnt Custom dropdowns using CSS and JavaScript offer better cross-browser compatibility than styling native <select> elements. Theme variables significantly reduce the effort required for UI adjustments, especially as the project scales. Redirects in admin flows should be designed with user context in mind to avoid confusion."}, {"post_id": 34704, "ts": "2026-07-25T17:05:22Z", "hours": 1.6431, "text": "Project Summary: Admin & Infrastructure Progress Key Milestones & Features Built 🛠️ Admin Product Management UI : Added a full admin interface for product management, including preview capabilities, environment variable integration, and updated order flow logic. This enables admins to efficiently manage product listings and track orders. 🆓 Privacy Enhancements : Implemented a “hide PII” controller to anonymize user data in the UI, ensuring sensitive information is protected in user-facing tables. 🧪 Product Cost Handling : Validated GBP pricing logic for products, ensuring accurate cost handling in the British Pounds currency. 🛠️ CI/CD & Dependency Updates : Configured PostgreSQL in CI pipelines, updated database URLs, and bumped Ruby gem versions to ensure a stable, up-to-date environment. 🎨 Styling Cleanup : Replaced inline styles in admin views with stylesheet_link_tag imports, improving maintainability and separation of concerns. Current Status The project now has a functional admin dashboard for product and order management, with privacy features baked into user data displays. Infrastructure is PostgreSQL-ready in CI, and styling practices align with modern Rails conventions. Core e-commerce logic (pricing, currency) is under testing, with environment variables streamlining configuration. Lessons Learned Privacy by Design : Integrating PII protection early simplifies compliance and reduces technical debt. Infrastructure as Code : Automating PostgreSQL setup in CI saves manual effort and reduces environment inconsistencies. Maintainable Styles : Moving to external stylesheets improves collaboration and long-term code hygiene. Order Page Started Created a functional order page Currency Handling : Explicit GBP validation highlights the need for clear financial logic in order systems."}, {"post_id": 32945, "ts": "2026-07-22T13:01:39Z", "hours": 1.1947, "text": "Replace admin view inline styles with stylesheet_link_tag importsRemoved large embedded CSS from multiple admin templates and switched to external stylesheet links for consistency and maintainability."}, {"post_id": 32314, "ts": "2026-07-21T12:27:35Z", "hours": 0.3503, "text": "Add CurrencyConvertible include and cost conversion helpersInclude CurrencyConvertible in ApplicationHelper and Product, add cost_usd and cost_gbp methods, remove obsolete gbp_to_usd, usd_per_gbp and fetch_usd_conversion_rates, rename cost column comment, and adjust product inheritance."}, {"post_id": 32039, "ts": "2026-07-20T22:30:02Z", "hours": 1.2369, "text": "Update README, moved CSS files, fixed issues between pages (styling)Include planning file entry, revise README wording, and remove dashboard and notifications stylesheet files."}, {"post_id": 30900, "ts": "2026-07-18T21:33:53Z", "hours": 0.9747, "text": "feat(database): migrate from SQLite to PostgreSQL and switch to Redis infrastructure- replace sqlite3 with PostgreSQL database adapter in Gemfile and config configure Redis for caching, Action Cable, and Active Job instead of Solid adapters add guide attribute to User model for onboarding flow control implement user existence validation in ApplicationController refactor CSS architecture by moving stylesheets to components directory create shared designs.css stylesheet for design pages with responsive styling update todo partial to check guide flag before displaying onboarding prompts add migration for guide column on users table"}, {"post_id": 26210, "ts": "2026-07-10T21:30:31Z", "hours": 0.6197, "text": "Key Milestones & Features The project has made solid strides in building out core admin functionality and refining user interactions: Admin Controller Tests : Comprehensive tests for the dashboard, orders, and products controllers were added, ensuring reliability and laying groundwork for future expansions. Form Submission Control : A disable button feature was implemented in the design-form component to prevent multiple submissions, improving UX and reducing backend load. Dashboard Updates : The dashboard_controller.rb received updates (specifics pending documentation), likely enhancing core admin workflows. Current Status The admin interface is shaping up with test-covered controllers and polished frontend interactions. Testing prioritization suggests a focus on stability, while form improvements reflect attention to user-centric details. The project appears in an active development phase, with July 2026 commits indicating recent momentum. Things Learnt Test-Driven Practices : Adding controller tests early highlights the team’s emphasis on maintainable, scalable code. Form UX Nuances : Disabling submission buttons during processing is a small but impactful tweak to prevent errors and improve responsiveness. Documentation Gaps : The vague “Update dashboard_controller.rb” commit underscores the importance of descriptive commit messages for clarity in collaborative projects."}, {"post_id": 20347, "ts": "2026-07-01T22:27:04Z", "hours": 0.7008, "text": "fix(auth): update product params to include thread_cost instead of cost_gbp - replace deprecated cost_gbp parameter with thread_cost in product creation/update - adjust database migration to add thread_cost column to products table, added shop, added notification page"}, {"post_id": 19576, "ts": "2026-06-30T22:24:00Z", "hours": 1.3847, "text": "Used claude to brainstorm colour schemes and layouts. Created this new dashboard design and transitioned the rest of the site to follow the colour scheme"}, {"post_id": 13382, "ts": "2026-06-21T22:29:32Z", "hours": 0.6847, "text": "Add design image gallery with viewer page- Add image route, controller action, and full-size viewer template Add gallery grid on show page with hover overlays and timestamps Fix partial render syntax (collection with as: :image)"}, {"post_id": 12184, "ts": "2026-06-19T21:59:46Z", "hours": 2.8486, "text": "Summary Major update: background removal, UI improvements, model fixes, and CI stability. Changes Added RemoveBackgroundJob with rembg CLI for automatic background removal Created Image and DesignEditSession models; updated schema comments Added brand.css and regulated form partial for new/edit designs Added dark mode support and image preview scaling Enabled PostgreSQL extensions; switched dev DB to SQLite Removed stale migrations (verified, trust columns from users) Cleaned up model validations and associations Fixed CI test suite with updated fixtures Removed node_modules from git; added to .gitignore Removed unused editor and dashboard views Updated Gemfile/Gemfile.lock dependencies"}]...
|
Title: Issued YSWS by @Acidicts | Stardance
Devlo Title: Issued YSWS by @Acidicts | Stardance
Devlogs:
Summary Major update: background removal, UI improvements, model fixes, and CI stability. Changes Added RemoveBackgroundJob with rembg CLI for automatic background removal Created Image and DesignEditSession models; updated schema comments Added brand.css and regulated form partial for new/edit designs Added dark mode support and image preview scaling Enabled PostgreSQL extensions; switched dev DB to SQLite Removed stale migrations (verified, trust columns from users) Cleaned up model validations and associations Fixed CI test suite with updated fixtures Removed node_modules from git; added to .gitignore Removed unused editor and dashboard views Updated Gemfile/Gemfile.lock dependencies
Add design image gallery with viewer page- Add image route, controller action, and full-size viewer template Add gallery grid on show page with hover overlays and timestamps Fix partial render syntax (collection with as: :image)
Used claude to brainstorm colour schemes and layouts. Created this new dashboard design and transitioned the rest of the site to follow the colour scheme
fix(auth): update product params to include thread_cost instead of cost_gbp - replace deprecated cost_gbp parameter with thread_cost in product creation/update - adjust database migration to add thread_cost column to products table, added shop, added notification page
Key Milestones & Features The project has made solid strides in building out core admin functionality and refining user interactions: Admin Controller Tests : Comprehensive tests for the dashboard, orders, and products controllers were added, ensuring reliability and laying groundwork for future expansions. Form Submission Control : A disable button feature was implemented in the design-form component to prevent multiple submissions, improving UX and reducing backend load. Dashboard Updates : The dashboard_controller.rb received updates (specifics pending documentation), likely enhancing core admin workflows. Current Status The admin interface is shaping up with test-covered controllers and polished frontend interactions. Testing prioritization suggests a focus on stability, while form improvements reflect attention to user-centric details. The project appears in an active development phase, with July 2026 commits indicating recent momentum. Things Learnt Test-Driven Practices : Adding controller tests early highlights the team’s emphasis on maintainable, scalable code. Form UX Nuances : Disabling submission buttons during processing is a small but impactful tweak to prevent errors and improve responsiveness. Documentation Gaps : The vague “Update dashboard_controller.rb” commit underscores the importance of descriptive commit messages for clarity in collaborative projects.
feat(database): migrate from SQLite to PostgreSQL and switch to Redis infrastructure- replace sqlite3 with PostgreSQL database adapter in Gemfile and config configure Redis for caching, Action Cable, and Active Job instead of Solid adapters add guide attribute to User model for onboarding flow control implement user existence validation in ApplicationController refactor CSS architecture by moving stylesheets to components directory create shared designs.css stylesheet for design pages with responsive styling update todo partial to check guide flag before displaying onboarding prompts add migration for guide column on users table
Update README, moved CSS files, fixed issues between pages (styling)Include planning file entry, revise README wording, and remove dashboard and notifications stylesheet files.
Add CurrencyConvertible include and cost conversion helpersInclude CurrencyConvertible in ApplicationHelper and Product, add cost_usd and cost_gbp methods, remove obsolete gbp_to_usd, usd_per_gbp and fetch_usd_conversion_rates, rename cost column comment, and adjust product inheritance.
Replace admin view inline styles with stylesheet_link_tag importsRemoved large embedded CSS from multiple admin templates and switched to external stylesheet links for consistency and maintainability.
Project Summary: Admin & Infrastructure Progress Key Milestones & Features Built 🛠️ Admin Product Management UI : Added a full admin interface for product management, including preview capabilities, environment variable integration, and updated order flow logic. This enables admins to efficiently manage product listings and track orders. 🆓 Privacy Enhancements : Implemented a “hide PII” controller to anonymize user data in the UI, ensuring sensitive information is protected in user-facing tables. 🧪 Product Cost Handling : Validated GBP pricing logic for products, ensuring accurate cost handling in the British Pounds currency. 🛠️ CI/CD & Dependency Updates : Configured PostgreSQL in CI pipelines, updated database URLs, and bumped Ruby gem versions to ensure a stable, up-to-date environment. 🎨 Styling Cleanup : Replaced inline styles in admin views with stylesheet_link_tag imports, improving maintainability and separation of concerns. Current Status The project now has a functional admin dashboard for product and order management, with privacy features baked into user data displays. Infrastructure is PostgreSQL-ready in CI, and styling practices align with modern Rails conventions. Core e-commerce logic (pricing, currency) is under testing, with environment variables streamlining configuration. Lessons Learned Privacy by Design : Integrating PII protection early simplifies compliance and reduces technical debt. Infrastructure as Code : Automating PostgreSQL setup in CI saves manual effort and reduces environment inconsistencies. Maintainable Styles : Moving to external stylesheets improves collaboration and long-term code hygiene. Order Page Started Created a functional order page Currency Handling : Explicit GBP validation highlights the need for clear financial logic in order systems.
Dropdown Styling & Component Replacement The design form’s dropdown interface was overhauled to improve visual consistency and user experience. A native <select> element was replaced with a custom-styled solution using 3ab7405 , allowing for greater flexibility in aligning with the project’s aesthetic goals. This change ensures smoother integration with the overall theme and avoids browser-specific styling quirks. CSS Refactoring & Theme Variables Design form styling was fully refactored in 928b7b0 , introducing global theme variables to streamline color, spacing, and typography management. This move simplifies future theme adjustments and promotes code reuse. Model defaults were also standardized to reduce redundancy in form initialization logic, making the codebase more maintainable. Admin Test Redirects In 2af0071 , the admin test workflow was updated to automatically redirect to the products list URL after test submissions. This improves user navigation by providing immediate feedback and next steps, ensuring a cohesive backend experience. Current Status The frontend is now more thematically consistent, with design forms serving as a primary focus area. Admin workflows are being optimized for clarity and efficiency, though backend test processing logic remains pending integration. The codebase is gradually adopting a modular structure, particularly for UI components and configuration. Things Learnt Custom dropdowns using CSS and JavaScript offer better cross-browser compatibility than styling native <select> elements. Theme variables significantly reduce the effort required for UI adjustments, especially as the project scales. Redirects in admin flows should be designed with user context in mind to avoid confusion.
Add brand colors, badge styles, and redesign pagesAdd brand color variables, badge styles, and a full redesign of design pages with responsive layouts, fixed redirect stuff, optimised by using one erb engine call for designs
Rename admin-product to products and refactor CSS, controller, and views. Updated class names and CSS variables, added .no-product-grid and .dashed-break styles. Simplified image loading logic in the product preview controller, and replaced large inline layout styles with external stylesheet includes.
Improved the New Order Page to be neater, and better themed along the colour scheme
Created Printful API Integration and improved order screen to allow better customisations Add Printful import endpoint and order preview UI improvementsImplemented Printful product import, added order preview generation, UI styles, and controller changes for drag‑resize‑rotate preview.
Added Variants for size and colors with stock for each printful region facility. Stimulus target which groups the variants by colour and deletes empty groups
Print area management UI & backend ( a42a00d ): Built a full stack for managing print areas (think “where the design goes” on a shirt front or back). This includes models to store print area dimensions, controllers to handle CRUD ops, and RESTful routes to tie it all together. The frontend now lets users drag/drop to define print zones with responsive positioning ( position: absolute + transform: scale to handle dynamic sizing). Edge case: Products with multiple print areas (e.g., front + back) now render distinct configurations without clobbering state. Printful service & stock syncing ( 7b5d817 ): Added printful_id to product models to map Issued products to Printful’s inventory. UI updates to display Printful sync status (green checkmarks for success, red alerts for failures). Technical tangents The print area system was a slow make. For example: To ensure designs stay within printable bounds, I had to calculate dynamic margins based on product type (e.g., a hoodie’s print area ≠ a mug’s). This involved hacking some trigonometry into the frontend to snap selections to “safe zones.” On the backend, I’m using ActiveRecord callbacks to validate print area dimensions against product specs. If a user tries to set a print area wider than the product allows It raises a PrintAreaOutOfBounds error Future features The actual ship flow and being able to edit multiple print areas instead of just the one
Since the last update, I’ve focused on enhancing the order preview system to support complex design workflows and improving image navigation for multi-image configurations. Recent changes Added multi-image preview navigation with left/right arrow buttons and an index display (e.g., “Image 2 of 5”) to streamline design review workflows ( b269fe5 ). This change directly addresses the need to review multiple design iterations in a single view without page reloads. Refactored the order preview component to support multiple print areas with independently configurable design images. This involved restructuring the preview logic to handle dynamic print area definitions while maintaining consistent state across design selections ( 0545118 ). The refactor enables customers to visualize different designs on separate print areas (e.g., front/back/ sleeves) within the same order preview.
I’ve focused on refining the shop page styling, header positioning, and cost handling logic ( d10a9c51 ). The recent batch of work involved schema adjustments for a product enabled flag, adding support for cost and thread costs ( 82f9f2d1 ), applying a schema fix ( 3f8bcb8a ), fixing CI pipeline issues ( 71e98a ), and pushing updates to production ( ca19da29 ). Recent changes Added an image variants system and updated views to utilize thumb and display variants specifically ( a2e4eb28 ). Implemented cost handling updates, including a specific support for thread costs alongside general product cost tracking ( 82f9f2d1 ). Added an auto annotaterb script executed within the Rails migration process ( 7d07d278 ). Applied schema fixes to ensure data integrity during the recent updates ( 3f8bcb8a ). Updated the RSVP page styles and refreshed the thanks template ( 217945eb ). Refined header positioning and shop page styling across the frontend ( d10a9c51 ). Added a product enabled flag to control product visibility and state in the system ( 82f9f2d1 ). Whats next: Umm, so whats next I think would be adding balance_events so you can trace changes in balances(spending/earning)
Recent changes Added support for balance events and thread adjustments to improve financial tracking accuracy. This also included an update to the notification rendering system to safely handle these new data types without breaking existing templates (commit: ( faed39b57619 )). Fixed the positioning of the design box within the product editor. This specifically addresses display issues occurring when editing products via /admin/products/<id>/edit (commit: ( aa4e314b5dcd )).
Added Devlogs and changed hackatime projects to be multi model per design. Move hackatime project linkage from a single designs.hackatime_project column to a has_many hackatime_projects model, syncing each project’s time and aggregating totals on designs. Add devlogs, ship_requests, ships, and comments models/routes/views for design logging and shipping, and make balance_events polymorphic.Update designs controller, helpers, and views to render multiple project pills, allow adding/removing linked projects, and show a combined hackatime/image/devlog layout. Add redcarpet for Markdown rendering and adjust CSS for dark mode, responsive galleries, and pill controls. Added Devlogs and the prep for adding the shipping flow I added devlogs to the project in prep for the shipping flow
Recent changes Fixed a failure in the CI/CD pipeline commit Implemented status tracking for balance events and refined the underlying thread logic associated with them commit Refactored the token rendering component for render_encoded to allow {{design: design.id}} making a pill, to improve display fidelity and added an edit functionality for devlog entries commit Integrated support for uploading images directly within the devlog interface and established links to corresponding Hackatime projects commit
Recent changes Ship request flow and SVG conversion : Added support for processing ship requests, handling SVG conversions, and validating devlog images before submission 8ca9b5d9 . Nil safety for Hackatime projects : Wrapped the @hackatime_projects variable in an Array structure to prevent nil errors when retrieving project data a29691ff . CI environment and test ordering : Set RAILS_ENV=test for the CI setup process and reordered the sequence of test steps to improve execution reliability 2968d162 . Authorization consolidation : Refactored authorization guards and consolidated the linking logic for Hackatime projects 4c2b1836 .
Recent changes Add comments to devlogs and ship requests Implement polymorphic Comment model with CommentsController, Stimulus-driven collapsing comment box, markdown preview form, and styles. Comments will be rendered by Turbo frames and allow editing by owner/admin. This is what else is included in this change: Encryption of hackclub_access_token and hackclub_refresh_token through ActiveRecord encryption, including config, env sample and migration task for already existing non-encrypted tokens. SSL enforcement in production (assume_ssl, force_ssl). Update filter_parameters to strip out sensitive information and OAuth tokens from logs. Fix ExchangeRate API call to include Bearer authentication header. Sanitization of devlogs HTML output through SafeListSanitizer. Update Design#can_make_devlog to can_make_devlog? method and restrict can_ship? check to devlogs without ship request. Add SRI integrity attribute to marked/DOMPurify scripts loaded from CDNs. UI improvements: styles for disabled buttons, utility class for hover-underline effect, devlog cards layout and info icons.
Recent changes Comment delete, Turbo Comment Box, and ship request fade functionality Add #destroy functionality to the comments with owner permission, path, delete button, and dependent comments. Make use of valid commentable_type/id while building comments and make responses as Turbo streams and wrap up comments within a Turbo frame. Resize the comment box according to the content changes detected by the MutationObserver. Make ship request modal and overlay fade in and out. Consider higher level ship request as blockers for all ship requests. Comment card and comment list styling.
Recent changes Added ship request reviews, resubmission logic, and R2 storage integration for tracking reviewed submissions ( 41b1e43 ). Started on the review workflow Started on Resubmission logic Set up support for cloudflare R2 Guarded Hack Club token persistence behind encryption configuration, ensuring tokens are only stored when encryption is explicitly enabled ( a4b6d0c ).
Made Notifications Useful Recent changes Persistent unread state for unanswered boolean notifications Notifications with unresolved boolean actions (e.g., approvals) now remain marked as unread until explicitly addressed. This ensures users revisit pending decisions. Commit: 39aabb2 . Interactive notification replies with approval time tracking Added support for direct replies to notifications, along with timestamp logging for when approvals are finalized. This enables granular tracking of response times for actionable alerts. Commit: 6ac80f9 .
## Recent changes Notifications: Unanswered notifications now retain their unread status until explicitly addressed. This ensures users can distinguish between pending and resolved interactions without relying on manual state updates ( 751a370 ). Security: Authentication workflows, file uploads, and resource authorization checks have been updated with additional safeguards. Specifics include input validation and access control refinements, though implementation details are not disclosed in the commit message ( 97e48db ).
Recent changes - Installed Bundler 4.0.4 in the Dockerfile to standardize gem management across environments ( 88ba659 ). - Ensured the verification directory exists for SVG upload tests, addressing missing file system setup in test workflows ( 83f2e53 ). - Resolved a Turbo conflict in order steps, likely related to event streaming or frame rendering in Rails views ( e8d08f4 ). Updated navigation unread counts dynamically from notification events, improving real-time feedback for user activity ( a75f6ff ).
Deploying on coolify and fixing bugs with that + encrypting current db
I created the fulfilment system for a fulfilment team to use Recent changes Removed redundant save! calls and updated fulfillment tests to reduce unnecessary database operations and align test logic with current behavior 9acc056 . Added a fulfillment role, batch pipeline, and popup controller to support new workflow automation and UI interactions afa7a20 . The popup controller likely handles transient UI elements like notifications or modals. Fixed a crash in /designs preview rendering by resolving an issue blocking Ruby scan/lint CI, ensuring previews no longer fail unexpectedly ( 911f035 ). Corrected a stray question mark in a design preview image tag to prevent malformed HTML output ( 955dd6c ). Added a note about YSWS draft sponsorship documentation, possibly for tracking external partnerships or funding discussions ( d92d571 ). No performance optimizations or subsystem overhauls were addressed in this cycle. Next steps depend on external feedback and test coverage improvements implied by recent test updates.
Ships:
Shipped!!! There are a bunch of features and stuff that I have added to this since flavortown, from the ordering system to devlogs and ship flow. Project Info This is the ruby on rails app for the ysws draft #issued where YS: Designs made with Code WS: Clothes and other swag with those designs Features added: A bunch of features have been added and I have separated them to 3 categories Major ones for functionality, quality of life for feel and use, security for data security. New Major Features: Designs view now is more detailed including hackatime projects and images from devlogs and ships Ship flow system so you can submit to the ysws Product Design system (admin only - for making the shop items by importing from printful via api) Order system using lots of hotwired turbo (choose color, design placement rotation and scale) Notifications (3 types Normal which provides info and 2 others Boolean which gets a yes or no answer and text which gets a written answer Reviewer Panel which shows pending ships to review with some data on (need to add hackatime info for it though) Storing Reviewer proof videos in a cloudflare R2 storage Quality-Of-Life: Added better UI/UX with some issues with need for ironing out (eg font change from workbench to ‘lexend’ and ‘space mono’ Kept a consistent style through the site, although some panels might need better border colour On login it redirects to the page you logged in by Security: I added User DB encryption to protect user data stored on the postgres database instance, such as name and email Summary Made the functional part of the ysws site (Designs, ordering, shipping) Added more security for user data Improved UI(Font and colour scheme)...
|
1792853754.3961873
|
1792940154.3961873
|
|
47431
|
the LAST SIGNAL by @Makkonen | Stardance
|
Makkonen
|
1
|
82.0
|
1366
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-12T09:50:10Z", "hours": 82.0, "multiplier": 16.6, "payout": 1366, "blessing": "neutral", "text": "How to play Go to my itch.io page (the demo link) and download the game, extract the .zip file and launch the file called LAST SIGNAL.EXE If you are on another OS than windows Just go to the GitHub readme and there will be an link to my unity play page. MY CUSTOM SHADER DOESNT WORK IN THE BROWSER SO PLEASE TEST THE ACTUAL VERSION IF YOU CAN! What did i make? I made an horror game in unity from scratch with the following made by me: All of the 3D models All of the scripts Whole storyline Majority of the music All of the scripts What is it about? LASTSIGNAL follows an story of an random guy finding himself inside weird rooms, later he realizes that this is an simulation and he has to find his way out, in the game the objective shifts from just finding an way out, to destroying the simulation and freeing everybody in there. How did i make it? I made the 3D models in blockbench, made scripts in VS code using C# and made the storyline in my head :D Controls In the game you will use your mouse to look around and WASD to move, you can interact with objects by looking at them and pressing E. In the end of the game in the parkour sections you will have to use SHIFT to sprint and SPACE to jump. Secrets and easter eggs I have made paper files all around the game telling the stories of other people in the simulation, i also made easter eggs hinting at stardance and my other projects. Minigames LASTSIGNAL has many minigames like hacking, password remembering and submitting codes.", "repo": "https://github.com/MakkonenHugo/LASTSIGNAL", "demo": "https://hugo-virtanen.itch.io/lastsignal"}]...
|
[{"post_id": 66471, "ts": "202 [{"post_id": 66471, "ts": "2026-09-12T09:49:21Z", "hours": 0.8703, "text": "Last changes before shipping Itch.io and unity play I have made an working itch.io page and an unity play page Small changes I have made small changes all around the game, like in level 2 i added an fade transition when leaving I also made changes to the first room with better dialogue and more interactable stuff. Bug fixes I fixed bugs like in the first parkour section where the teleport back up wasnt working, or when some sounds didnt work in some levels So this is my LAST DEVLOG (pun intended) and thanks to everyone who has been liking my devlogs and stuff!"}, {"post_id": 66048, "ts": "2026-09-11T16:40:58Z", "hours": 8.6517, "text": "Improvements! Sounds Now every time dialogue shows up, an small keyboard soundeffect is played with every character, i think it improves the game alot! Now some objects have interaction sounds, for example, when listening to the radio, you will hear the radios startup beep. Every level has either ambiance sounds or music of some kind! New physical stuff Now, every level has new stuff to interact with or just for show, like: wires, coffee cups, vents, pencils, trash cans! I have also positioned some stuff better, for example in level 2, jeff is now more away from the radio, but still looking at it! Easter eggs and stuff to find I have added “documents” and “logs” about previous subjects all around the game, for example in level 2 there now is an table with some guy called Gary’s note. In level 4 there is an hint to LuckyOS in an paper stack, and in Level 9, you can find an laptop that has an reference to StarDance! Ending changes I made small improvements to the ending scene, like how the fire is and how Jeff appears sometimes. I also now have completely finished the first and second parkour sections!"}, {"post_id": 64923, "ts": "2026-09-09T17:20:23Z", "hours": 8.1214, "text": "Ending! Parkour After level 9 you will get to have some “fun”… Its an PARKOUR SECTION! Actually two of them, in the first one you have to jump to different platforms while an REALLY good breakcore track plays and alarms are yelling, i also added alarm lights so it sets the vibe. In the second section you will have to just run straight and avoid obstacles in the way. Ending In the end you will go into the main server room and open up an… OPERATING SYSTEM! It has currently one app only but i might make it better (or worse). In the OS you will click on an Simulation Manager icon, and it opens an app, where you DELETE the whole simulation. But you realise IT ISNT ENOUGH! So you do the only logical thing… BURN THE WHOLE PLACE DOWN! So after you delete the simulation, you interact with anything in the room (exept the pc) and the scene fades to an burning server room with the pc setup completely in pieces, and even Jeff kinda flickers in the room from time to time! Bad ending So now in level 8 you have another portal, the stay portal! Its only an model right now but i will make it so it will lead to an bad ending. You gettng turned into… JEFF 2! (get it cuz you are Jeff too, but also the second jeff so jeff2) Intro or startup! I added an small animation when you start the game, it first shows my studios logo, and then it does this typewriter effect with. “LASTSIGNAL” “Finding signal…” “SIgnal lost” and then an glitch effect! The whole thing is packed with soundeffects too so it feels nice!"}, {"post_id": 64080, "ts": "2026-09-08T07:21:49Z", "hours": 8.1936, "text": "New levels and effects! Level 7, the CHASE I really dont want to be the guy to spoil anything, but i kinda have to. Level 7 will be an ACTION filled level, it will be really short, around 1 minute, but it will be fun! In the level you will have this GIANT hallway in front of you with GIANT furniture, and then an small table and radio infront of you! When you listen to the radio it will say: “ITS A TRAP! RUN!” And then chase music that I MADE will start playing, and your camera will start to shake violently, your mouse gets locked to an few degrees and these red messages will start showing saying “RUN” “IT’S BEHIND YOU” and so on, right now its so if you dont get out of the level in an generous 50 seconds, the level restarts, no “you died” nothing, just an do it again. Level 8 Level 8 will feature an big gray room, with nothing than an radio, when you listen to the radio the lights dim and your mouse gets locked, music starts playing and the radio starts speaking, this dialouge contains TOO MUCH spoilers, so i will not put it in this devlog, after that you will turn around and walk into an EXIT portal, you get sent straight THROUGH the floor, your vision will pixelate to 16 and 9 pixels (REALLY PIXELATED) and you will get teleported to… the real world! Level 9, the real world In level 9 the first thing you will realize is that this is an office, there are many office desks with computers on them, in the real world there is NO PIXELATION! You will realize that the door is LOCKED! With an same kind of lock than in level 4, but now there aren’t just papers on the ground… There are THE PC’s! You will need to check them for vulnerabilities and HACK them for the door code! (in this level there even is an STARDANCE easter egg :D) Small stuff Password minigame I added an password remembering game to lvl 6! In there the game you will have to look at passwords, remember them, and type them! Right now it serves no purpose but idk i might make it have something after completeon! Minigame visual upgrade! Some people might remember my other project, the hacking panel, so i made the matrix rain feature from there to LASTSIGNAL! Now everytime you are in an minigame, there will be green glowing text in the background!"}, {"post_id": 62911, "ts": "2026-09-06T13:28:14Z", "hours": 9.3292, "text": "New levels! Storyline impact Level 5 will be kind of an “filler level”, it introduses the player to the new objective of the game, destroying the signal world! Thats right, the games objective has switched from just getting out, to putting an stop to this! MASSIVE graphics update! I made an custom shader, to make the game PIXELATED! I know, “so many games are pixelated do something of your own” IM NOT GOOD WITH MODELING, OK!? My models are pretty bad and i dont want it to be the downfall of my game. But thats not really the reason, the reason is, that when an game is pixelated, it looks good if done right, and also when the graphics are bad, the players have to use their imagination, and THAT is the true reason, i want the players to imagine, to theorise what is going on and how everything looks. I also made an crosshair, because my very nice and good playtester @silvonik left some REALLY GOOD feedback and gave me the idea to make an crosshair! Thank you silvonik :D Level 5 In level 5, you spawn into an two section room, in the first section there will be an laptop and the radio, the radio has some interesting dialogue that tells you how to HACK THE SYSTEM until the message cuts off, and another voice comes trough telling you the message cannot be played, the hacking minigame is this pause at the right time type of game, i added some… “interesting” log messages to the screens right, “hugoAPT” comes from “sudoAPT” but sudo is LITERALLY JUST MY NAME. In the second section, theres an actual pc and an monitor, where by pressing E you can actually watch cameras from the levels you have survived. Level 6 THATS RIGHT! Level 6 is already in developement and it will feature… FLICKERING LIGHTS, who doesnt love those? AN HALLUSINATION, of Jeff… You havent seen him in some time? NORMAL MUSIC THAT BECOMES DISTORTED, thats one way to make ambiance… SELF SLAMMING DOORS, wow so spooky! DISTANT SOUNDS, are they there or are you going crazy? MOVING OBJECTS, level 2’s chair is proud! The level itself is just an box and an hallway, lets just say that the hallway leads to some prettyyyy… “Intensive” stuff… MORE SETTINGS! I realized that the settings was looking an little thin… so i got into work and i made more. Headbob toggle, some people might get nauseous or feel discomfort if the camera is shaking all over the place, so you can now toggle it! Crosshair, i added an toggle to the crosshair, because it could ruin the immersion for some people. Sensitivity, this one is kind of self explanatory, every game needs an sensitivity slider."}, {"post_id": 61000, "ts": "2026-09-03T18:13:08Z", "hours": 8.1131, "text": "AHH EVERYTHING IS BREAKING! Bug fixing Soo it has not been rly “sunshines and rainbows” developing LASTSIGNAL so ive spent an long time fixing bugs, here are an few i have fixed: Camera glitching when spawning, radio not working, objects not vanishing, objects not spawning, interacion breaking COMPLETELY, TWO “press E to interact” prompts, “press E to interact” flashing, interaction detector NOT SEEING THE OBJECTS, after interacting some objects you cant do anything anymore. Level 4 developement So now the good stuff, Level 4 is mostly done! (yay) Ill still polish it an little bit but its in good shape! Level 4 is an GIANT in terms of the LORE, it features the radio not working as normal… it wont open the door because the door has an CODE LOCK! You will have to look at manu pieces of paper to find the code and put the code into the number pad next to the door to get out. This levels background music is activated when interacting with an laptop, the laptop has been live streaming for infinite hours? its really clear time works differently here… (go crazy with the theories) The level tells about “subjects” and that there have been many befor you here… Or have there!? Is this just all mind games? Are you actually just sleeping?(ill answer this one: no you are not sleeping it would be so boring if you were) Level 3 changes I have changed the radio messages to imply more of that sweet LORE. The radio goes along the lines of “Do you know that Jeff guy? Hes weird, but hes been here more than you have, more than anyone has, i cant say too much now… Somebody is ALWAYS LISTENING” Wow so lore :O ! Small stuff I have updated the lvl 1 dialogue to again, make more LOREEEEE! And i also added some more credits to the main menu! Nothing much this time!"}, {"post_id": 59087, "ts": "2026-08-31T18:21:29Z", "hours": 5.6414, "text": "Small changes and level 4 development Level 1 update In the last devlog, i promised an level 1 update, so that is what i made, first i modeled an office desk, drawers, and stacks of paper, i put them on the empty side of the room. after that i created two scripts (similar to the chair event) First is an script that makes an object/objects vanish when you are not looking (after listening to dialogue) And the other one does the complete OPPOSITE, it makes an object/objects appear when you are not looking, (you guessed it, after listening to dialogue) So now, when you inspect the office desk, an paper stack appears in front of the door, the paper tells you to look at the desk again, but when you turn around the desk is gone, and when you look back at the paper, its NOT THERE! Level transition rework Before, you just walked into an trigger and it teleported you into the next level, now it does just that but with an cool ANIMATION (so cool) So now loading to the next level, you will have an fade in and out animation! Level 4 Im happy to say, level 4 IS IN DEVELOPEMENT! (hooray, took me long enough) Level 4 is going to be an studio room that gets the player REALLY thinking what is going on… But if that gets you thinking, just WAIT WHAT LEVEL 5 IS GOING TO BE! Plans for the future In the next devlog i think i will add more settings and make the main menu better, maybe ill even add some cheat codes or something in the README… AS ALWAYS STAY TUNED FOR FUTURE STUFF!"}, {"post_id": 58063, "ts": "2026-08-30T12:33:06Z", "hours": 5.5022, "text": "(major) Third level update! Lights out update First off, i updated the lights out mechanic, so now it isnt as snappy and is pretty smooth, the table is where it was before and everything looks nice :D New trigger! Now after the lights go out, you walk to the the door, where its still locked, so you have to go back, but at the door you just walked through an invisible trigger that spawned the radio and an mysterious object…(an sign) when you walk to the other side of the hallway, you see an sign, the sign says “why do you want to leave?” Hmm, who could have put that there… and when you interact with the radio and turn around, THE SIGN IS GONE :O More mysterious stuff After interacting with the radio, you will see more stuff that was not there in the beginning, an cardboard box, and an MICROWAVE? (sorry i ran out of ideas) Just kidding, i chose those two because they are random and get the player to question what is happening, and also to indicate, the mc doesnt feel hunger or thirst, so maybe this is all an dream? Maybe none of this is real? STAY TUNED TO FIND OUT! Lvl 1 styling Im also working on making the first level better, i already modeled an desk and drawers for it so stay tuned… Bug fixes! Yes so game developing isnt all sunshine and rainbows because of THE BUGS! Today i fixed an bug where the camera would randomly just tweak out and move on its own, and i also fixed an bug with the interaction detector where the text would just start flashing REALLY fast and it REALLY got on my nerves but they are fixed now!"}, {"post_id": 57335, "ts": "2026-08-29T13:36:10Z", "hours": 8.1325, "text": "BIG changes and lvl3 test version Changes to looking around For an long time i was trying to make an little change how looking around feels, by making the look speed accelerate and decelerate when moving the mouse, but that made an very big problem, the camera would just snap around when looking at an interractable object, so i tried to fix it numerous times but with no luck, but FINALLY after 2 days of bug fixing i finally got it to work and the game feels smooth to play! Camera overlay Now, because of the looking around effect(idk what to call it sry :D ) looking around feels kind of heavy, so i thought that it could be that the mc would be holding an camera! So thats what i did, the camera has an battery indicator and then the cool part, the time recorded is ACTUALLY the time the scene has been loaded! Level 3 Level 3 now has an event called lights out event, “what does it do?” well when you are close to the door, suddenly the lights go out and when they come back, the door is suddenly farther away. It works using an empty game object that i put my script in and made it an trigger, when the lights are out you get teleported to an different hallway that is identical to the first one exept its bigger, so it creates the illusion that the hallway has stretched."}, {"post_id": 55102, "ts": "2026-08-26T15:39:45Z", "hours": 5.5144, "text": "This is another big devlog First off, i added an pausemenu where right now you can only exit the game, resume, and adjust your settings. The “settings” is only the games volume right now but there will be more once i just think about what… Another big thing is the main menu I added an mainmenu that shows up when you start the game where you can “continue” (right now just start from lvl 1 bc the game has no checkpoints but i will add them later) tweak the settings, quit the game and wiew the credits, there currently is no settings or credits but i will add them an little bit later. The design for the settings and menu Both the settings and mainmenu have this starry live wallpaper feel and if you look closely, you might see an shootting star… I also added an glitch hover effect to the buttons because it fits the weird theme of the game. (every buttons effect is different) And i also started working on lvl3 its an hallway that doesnt behave like an normal hallway… But there really isnt much there so you will hear more about lvl3 in the next devlog :O (i also just now discovered headings so thats nice)"}, {"post_id": 53224, "ts": "2026-08-23T17:45:03Z", "hours": 3.3136, "text": "Alright, things just got interesting… First off i added an walking sound effect so now when you are walking in lvl2 you will be rustling the grass below you, and it also depends what sound it is on what surface you are walking on (GTA 6 has some competition am i right) And then i spent TOO LONG on making this headbob feature so now when you are walking your head will bounce up and down! And then i added this weird chair that moves after you inspect it and look away! And i made some bug fixes like how the interaction box was too small for some reason and also i made some little changes like wich way the door opens and stuff. :O"}, {"post_id": 51628, "ts": "2026-08-21T12:28:14Z", "hours": 6.0508, "text": "Alright this is an pretty big devlog. Well first, i added an door opening feature, where after the radio event, you can interract with the door and open it! I also made some small bug fixes like the camera snapping into somewhere else when you tried to interract. And now is the interesting part, i made an second levelm, but first, how do you get into the second level? Well after opening the door in lvl 1 you jump into the void and pass 3 triggers, first one plays an swoosh sound effect, second puts an picture where i drew LASTSIGNAL, and the third teleports you to the second room. Now, the second room is not an room at all, it is an grassy field with an bed in the middle, an house, and ofc Jeff and the radio, the gameplay is: spawn, look around, inspect stuff, find Jeff and the radio, get scared bc of jeff(probably just me), listen to what the radio has to say(actual lore now), open the door and get out of there. The level is focused around dreamcore and liminal spaces so it ofc has some lil creepy but calming music too!"}, {"post_id": 47959, "ts": "2026-08-16T07:29:31Z", "hours": 1.2506, "text": "so we now got alot of stuff so first i remodeled jeff and made him tall so now hes kinda scary, and going with the scary theme i also made the room pretty dark and added some fog, i put an light source on the table so players wouldnt have problems using the radio. The first room is purposelly small not much to do but now im making the second room/level, im thinking ill make it this low poly grass field kinda like an liminal space or something.AND i also added an ambiance soundtrack that (sadly) isnt self made but if i find some good free software i will make everything myself"}, {"post_id": 47334, "ts": "2026-08-15T06:45:18Z", "hours": 1.9967, "text": "Alright, big game update, i added an door to the room(3D modeled myself) and added that guy whos name is jeff(also modeled) and an table and an radio ontop of the table(also modeled) and then made an system where when you are close enough and looking at something you can press E and inspect it, i will probably add an inspection to everything bc its so easy to do! And i added an little gameplay too, first you spawn in, inspect jeff, the table and then you inspect the radio, first it says the radio isnt plugged in but then an voice comes through, jeff is gone, and the door is open. Pretty nice :O"}, {"post_id": 46472, "ts": "2026-08-13T18:26:56Z", "hours": 1.6111, "text": "I 3D modeled (Myself) an little test room and wrote “LAB” in it so i could test my scripts, but as you can see, its just an gray box. I think even though this is just an test room, it will be seen in the game at some point for the weird feeling. And then i added two C# scripts, one for walking around and the other one for looking around. I also made an little soundtrack for the game but it doesnt show in the time. I will make an actual map and something more tomorrow :O and also if you have any ideas let me know!"}]...
|
Title: the LAST SIGNAL by @Makkonen | Stardance
D Title: the LAST SIGNAL by @Makkonen | Stardance
Devlogs:
I 3D modeled (Myself) an little test room and wrote “LAB” in it so i could test my scripts, but as you can see, its just an gray box. I think even though this is just an test room, it will be seen in the game at some point for the weird feeling. And then i added two C# scripts, one for walking around and the other one for looking around. I also made an little soundtrack for the game but it doesnt show in the time. I will make an actual map and something more tomorrow :O and also if you have any ideas let me know!
Alright, big game update, i added an door to the room(3D modeled myself) and added that guy whos name is jeff(also modeled) and an table and an radio ontop of the table(also modeled) and then made an system where when you are close enough and looking at something you can press E and inspect it, i will probably add an inspection to everything bc its so easy to do! And i added an little gameplay too, first you spawn in, inspect jeff, the table and then you inspect the radio, first it says the radio isnt plugged in but then an voice comes through, jeff is gone, and the door is open. Pretty nice :O
so we now got alot of stuff so first i remodeled jeff and made him tall so now hes kinda scary, and going with the scary theme i also made the room pretty dark and added some fog, i put an light source on the table so players wouldnt have problems using the radio. The first room is purposelly small not much to do but now im making the second room/level, im thinking ill make it this low poly grass field kinda like an liminal space or something.AND i also added an ambiance soundtrack that (sadly) isnt self made but if i find some good free software i will make everything myself
Alright this is an pretty big devlog. Well first, i added an door opening feature, where after the radio event, you can interract with the door and open it! I also made some small bug fixes like the camera snapping into somewhere else when you tried to interract. And now is the interesting part, i made an second levelm, but first, how do you get into the second level? Well after opening the door in lvl 1 you jump into the void and pass 3 triggers, first one plays an swoosh sound effect, second puts an picture where i drew LASTSIGNAL, and the third teleports you to the second room. Now, the second room is not an room at all, it is an grassy field with an bed in the middle, an house, and ofc Jeff and the radio, the gameplay is: spawn, look around, inspect stuff, find Jeff and the radio, get scared bc of jeff(probably just me), listen to what the radio has to say(actual lore now), open the door and get out of there. The level is focused around dreamcore and liminal spaces so it ofc has some lil creepy but calming music too!
Alright, things just got interesting… First off i added an walking sound effect so now when you are walking in lvl2 you will be rustling the grass below you, and it also depends what sound it is on what surface you are walking on (GTA 6 has some competition am i right) And then i spent TOO LONG on making this headbob feature so now when you are walking your head will bounce up and down! And then i added this weird chair that moves after you inspect it and look away! And i made some bug fixes like how the interaction box was too small for some reason and also i made some little changes like wich way the door opens and stuff. :O
This is another big devlog First off, i added an pausemenu where right now you can only exit the game, resume, and adjust your settings. The “settings” is only the games volume right now but there will be more once i just think about what… Another big thing is the main menu I added an mainmenu that shows up when you start the game where you can “continue” (right now just start from lvl 1 bc the game has no checkpoints but i will add them later) tweak the settings, quit the game and wiew the credits, there currently is no settings or credits but i will add them an little bit later. The design for the settings and menu Both the settings and mainmenu have this starry live wallpaper feel and if you look closely, you might see an shootting star… I also added an glitch hover effect to the buttons because it fits the weird theme of the game. (every buttons effect is different) And i also started working on lvl3 its an hallway that doesnt behave like an normal hallway… But there really isnt much there so you will hear more about lvl3 in the next devlog :O (i also just now discovered headings so thats nice)
BIG changes and lvl3 test version Changes to looking around For an long time i was trying to make an little change how looking around feels, by making the look speed accelerate and decelerate when moving the mouse, but that made an very big problem, the camera would just snap around when looking at an interractable object, so i tried to fix it numerous times but with no luck, but FINALLY after 2 days of bug fixing i finally got it to work and the game feels smooth to play! Camera overlay Now, because of the looking around effect(idk what to call it sry :D ) looking around feels kind of heavy, so i thought that it could be that the mc would be holding an camera! So thats what i did, the camera has an battery indicator and then the cool part, the time recorded is ACTUALLY the time the scene has been loaded! Level 3 Level 3 now has an event called lights out event, “what does it do?” well when you are close to the door, suddenly the lights go out and when they come back, the door is suddenly farther away. It works using an empty game object that i put my script in and made it an trigger, when the lights are out you get teleported to an different hallway that is identical to the first one exept its bigger, so it creates the illusion that the hallway has stretched.
(major) Third level update! Lights out update First off, i updated the lights out mechanic, so now it isnt as snappy and is pretty smooth, the table is where it was before and everything looks nice :D New trigger! Now after the lights go out, you walk to the the door, where its still locked, so you have to go back, but at the door you just walked through an invisible trigger that spawned the radio and an mysterious object…(an sign) when you walk to the other side of the hallway, you see an sign, the sign says “why do you want to leave?” Hmm, who could have put that there… and when you interact with the radio and turn around, THE SIGN IS GONE :O More mysterious stuff After interacting with the radio, you will see more stuff that was not there in the beginning, an cardboard box, and an MICROWAVE? (sorry i ran out of ideas) Just kidding, i chose those two because they are random and get the player to question what is happening, and also to indicate, the mc doesnt feel hunger or thirst, so maybe this is all an dream? Maybe none of this is real? STAY TUNED TO FIND OUT! Lvl 1 styling Im also working on making the first level better, i already modeled an desk and drawers for it so stay tuned… Bug fixes! Yes so game developing isnt all sunshine and rainbows because of THE BUGS! Today i fixed an bug where the camera would randomly just tweak out and move on its own, and i also fixed an bug with the interaction detector where the text would just start flashing REALLY fast and it REALLY got on my nerves but they are fixed now!
Small changes and level 4 development Level 1 update In the last devlog, i promised an level 1 update, so that is what i made, first i modeled an office desk, drawers, and stacks of paper, i put them on the empty side of the room. after that i created two scripts (similar to the chair event) First is an script that makes an object/objects vanish when you are not looking (after listening to dialogue) And the other one does the complete OPPOSITE, it makes an object/objects appear when you are not looking, (you guessed it, after listening to dialogue) So now, when you inspect the office desk, an paper stack appears in front of the door, the paper tells you to look at the desk again, but when you turn around the desk is gone, and when you look back at the paper, its NOT THERE! Level transition rework Before, you just walked into an trigger and it teleported you into the next level, now it does just that but with an cool ANIMATION (so cool) So now loading to the next level, you will have an fade in and out animation! Level 4 Im happy to say, level 4 IS IN DEVELOPEMENT! (hooray, took me long enough) Level 4 is going to be an studio room that gets the player REALLY thinking what is going on… But if that gets you thinking, just WAIT WHAT LEVEL 5 IS GOING TO BE! Plans for the future In the next devlog i think i will add more settings and make the main menu better, maybe ill even add some cheat codes or something in the README… AS ALWAYS STAY TUNED FOR FUTURE STUFF!
AHH EVERYTHING IS BREAKING! Bug fixing Soo it has not been rly “sunshines and rainbows” developing LASTSIGNAL so ive spent an long time fixing bugs, here are an few i have fixed: Camera glitching when spawning, radio not working, objects not vanishing, objects not spawning, interacion breaking COMPLETELY, TWO “press E to interact” prompts, “press E to interact” flashing, interaction detector NOT SEEING THE OBJECTS, after interacting some objects you cant do anything anymore. Level 4 developement So now the good stuff, Level 4 is mostly done! (yay) Ill still polish it an little bit but its in good shape! Level 4 is an GIANT in terms of the LORE, it features the radio not working as normal… it wont open the door because the door has an CODE LOCK! You will have to look at manu pieces of paper to find the code and put the code into the number pad next to the door to get out. This levels background music is activated when interacting with an laptop, the laptop has been live streaming for infinite hours? its really clear time works differently here… (go crazy with the theories) The level tells about “subjects” and that there have been many befor you here… Or have there!? Is this just all mind games? Are you actually just sleeping?(ill answer this one: no you are not sleeping it would be so boring if you were) Level 3 changes I have changed the radio messages to imply more of that sweet LORE. The radio goes along the lines of “Do you know that Jeff guy? Hes weird, but hes been here more than you have, more than anyone has, i cant say too much now… Somebody is ALWAYS LISTENING” Wow so lore :O ! Small stuff I have updated the lvl 1 dialogue to again, make more LOREEEEE! And i also added some more credits to the main menu! Nothing much this time!
New levels! Storyline impact Level 5 will be kind of an “filler level”, it introduses the player to the new objective of the game, destroying the signal world! Thats right, the games objective has switched from just getting out, to putting an stop to this! MASSIVE graphics update! I made an custom shader, to make the game PIXELATED! I know, “so many games are pixelated do something of your own” IM NOT GOOD WITH MODELING, OK!? My models are pretty bad and i dont want it to be the downfall of my game. But thats not really the reason, the reason is, that when an game is pixelated, it looks good if done right, and also when the graphics are bad, the players have to use their imagination, and THAT is the true reason, i want the players to imagine, to theorise what is going on and how everything looks. I also made an crosshair, because my very nice and good playtester @silvonik left some REALLY GOOD feedback and gave me the idea to make an crosshair! Thank you silvonik :D Level 5 In level 5, you spawn into an two section room, in the first section there will be an laptop and the radio, the radio has some interesting dialogue that tells you how to HACK THE SYSTEM until the message cuts off, and another voice comes trough telling you the message cannot be played, the hacking minigame is this pause at the right time type of game, i added some… “interesting” log messages to the screens right, “hugoAPT” comes from “sudoAPT” but sudo is LITERALLY JUST MY NAME. In the second section, theres an actual pc and an monitor, where by pressing E you can actually watch cameras from the levels you have survived. Level 6 THATS RIGHT! Level 6 is already in developement and it will feature… FLICKERING LIGHTS, who doesnt love those? AN HALLUSINATION, of Jeff… You havent seen him in some time? NORMAL MUSIC THAT BECOMES DISTORTED, thats one way to make ambiance… SELF SLAMMING DOORS, wow so spooky! DISTANT SOUNDS, are they there or are you going crazy? MOVING OBJECTS, level 2’s chair is proud! The level itself is just an box and an hallway, lets just say that the hallway leads to some prettyyyy… “Intensive” stuff… MORE SETTINGS! I realized that the settings was looking an little thin… so i got into work and i made more. Headbob toggle, some people might get nauseous or feel discomfort if the camera is shaking all over the place, so you can now toggle it! Crosshair, i added an toggle to the crosshair, because it could ruin the immersion for some people. Sensitivity, this one is kind of self explanatory, every game needs an sensitivity slider.
New levels and effects! Level 7, the CHASE I really dont want to be the guy to spoil anything, but i kinda have to. Level 7 will be an ACTION filled level, it will be really short, around 1 minute, but it will be fun! In the level you will have this GIANT hallway in front of you with GIANT furniture, and then an small table and radio infront of you! When you listen to the radio it will say: “ITS A TRAP! RUN!” And then chase music that I MADE will start playing, and your camera will start to shake violently, your mouse gets locked to an few degrees and these red messages will start showing saying “RUN” “IT’S BEHIND YOU” and so on, right now its so if you dont get out of the level in an generous 50 seconds, the level restarts, no “you died” nothing, just an do it again. Level 8 Level 8 will feature an big gray room, with nothing than an radio, when you listen to the radio the lights dim and your mouse gets locked, music starts playing and the radio starts speaking, this dialouge contains TOO MUCH spoilers, so i will not put it in this devlog, after that you will turn around and walk into an EXIT portal, you get sent straight THROUGH the floor, your vision will pixelate to 16 and 9 pixels (REALLY PIXELATED) and you will get teleported to… the real world! Level 9, the real world In level 9 the first thing you will realize is that this is an office, there are many office desks with computers on them, in the real world there is NO PIXELATION! You will realize that the door is LOCKED! With an same kind of lock than in level 4, but now there aren’t just papers on the ground… There are THE PC’s! You will need to check them for vulnerabilities and HACK them for the door code! (in this level there even is an STARDANCE easter egg :D) Small stuff Password minigame I added an password remembering game to lvl 6! In there the game you will have to look at passwords, remember them, and type them! Right now it serves no purpose but idk i might make it have something after completeon! Minigame visual upgrade! Some people might remember my other project, the hacking panel, so i made the matrix rain feature from there to LASTSIGNAL! Now everytime you are in an minigame, there will be green glowing text in the background!
Ending! Parkour After level 9 you will get to have some “fun”… Its an PARKOUR SECTION! Actually two of them, in the first one you have to jump to different platforms while an REALLY good breakcore track plays and alarms are yelling, i also added alarm lights so it sets the vibe. In the second section you will have to just run straight and avoid obstacles in the way. Ending In the end you will go into the main server room and open up an… OPERATING SYSTEM! It has currently one app only but i might make it better (or worse). In the OS you will click on an Simulation Manager icon, and it opens an app, where you DELETE the whole simulation. But you realise IT ISNT ENOUGH! So you do the only logical thing… BURN THE WHOLE PLACE DOWN! So after you delete the simulation, you interact with anything in the room (exept the pc) and the scene fades to an burning server room with the pc setup completely in pieces, and even Jeff kinda flickers in the room from time to time! Bad ending So now in level 8 you have another portal, the stay portal! Its only an model right now but i will make it so it will lead to an bad ending. You gettng turned into… JEFF 2! (get it cuz you are Jeff too, but also the second jeff so jeff2) Intro or startup! I added an small animation when you start the game, it first shows my studios logo, and then it does this typewriter effect with. “LASTSIGNAL” “Finding signal…” “SIgnal lost” and then an glitch effect! The whole thing is packed with soundeffects too so it feels nice!
Improvements! Sounds Now every time dialogue shows up, an small keyboard soundeffect is played with every character, i think it improves the game alot! Now some objects have interaction sounds, for example, when listening to the radio, you will hear the radios startup beep. Every level has either ambiance sounds or music of some kind! New physical stuff Now, every level has new stuff to interact with or just for show, like: wires, coffee cups, vents, pencils, trash cans! I have also positioned some stuff better, for example in level 2, jeff is now more away from the radio, but still looking at it! Easter eggs and stuff to find I have added “documents” and “logs” about previous subjects all around the game, for example in level 2 there now is an table with some guy called Gary’s note. In level 4 there is an hint to LuckyOS in an paper stack, and in Level 9, you can find an laptop that has an reference to StarDance! Ending changes I made small improvements to the ending scene, like how the fire is and how Jeff appears sometimes. I also now have completely finished the first and second parkour sections!
Last changes before shipping Itch.io and unity play I have made an working itch.io page and an unity play page Small changes I have made small changes all around the game, like in level 2 i added an fade transition when leaving I also made changes to the first room with better dialogue and more interactable stuff. Bug fixes I fixed bugs like in the first parkour section where the teleport back up wasnt working, or when some sounds didnt work in some levels So this is my LAST DEVLOG (pun intended) and thanks to everyone who has been liking my devlogs and stuff!
Ships:
How to play Go to my itch.io page (the demo link) and download the game, extract the .zip file and launch the file called LAST SIGNAL.EXE If you are on another OS than windows Just go to the GitHub readme and there will be an link to my unity play page. MY CUSTOM SHADER DOESNT WORK IN THE BROWSER SO PLEASE TEST THE ACTUAL VERSION IF YOU CAN! What did i make? I made an horror game in unity from scratch with the following made by me: All of the 3D models All of the scripts Whole storyline Majority of the music All of the scripts What is it about? LASTSIGNAL follows an story of an random guy finding himself inside weird rooms, later he realizes that this is an simulation and he has to find his way out, in the game the objective shifts from just finding an way out, to destroying the simulation and freeing everybody in there. How did i make it? I made the 3D models in blockbench, made scripts in VS code using C# and made the storyline in my head :D Controls In the game you will use your mouse to look around and WASD to move, you can interact with objects by looking at them and pressing E. In the end of the game in the parkour sections you will have to use SHIFT to sprint and SPACE to jump. Secrets and easter eggs I have made paper files all around the game telling the stories of other people in the simulation, i also made easter eggs hinting at stardance and my other projects. Minigames LASTSIGNAL has many minigames like hacking, password remembering and submitting codes....
|
1792853350.207952
|
1792939750.207952
|
|
42278
|
Monado Phone Driver by @ttomf | Stardance
|
ttomf
|
3
|
76.94
|
1364
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-16T16:44:11Z", "hours": 22.0, "multiplier": 19.73, "payout": 430, "blessing": "neutral", "text": "I made Monado Phone Driver - a bridge between VR app and phone in cardboard headset. This allows you to play VR games just with Linux PC and Android phone, without buying expensive VR headset. There are alternatives, like ALVR and WiVRn , but my driver has 6DOF tracking (you can move and rotate in space) and hand tracking (it takes hand landmarks from PC or phone camera). Since last ship, I improved stability, added Android app settings, created auto installer, and mainly tracking from PC camera, because phone has small FOV and limited performance.", "repo": "https://github.com/ttomf/monado-phone", "demo": "https://github.com/ttomf/monado-phone/releases/"}, {"ship_num": 2, "ts": "2026-09-04T08:04:23Z", "hours": 32.0, "multiplier": 19.12, "payout": 609, "blessing": "neutral", "text": "Hi! This is my second ship of this project, Monado Phone Driver. It’s bridge between your VR app and your phone in headset ( Google Cardboard ). I wanted to make it better than ALVR , because it has only 3DOF tracking, so I created 6DOF tracking and hand tracking, like professional headsets. The most challenging part of this was debugging all of these. From Vulkan swapchain management and GStreamer pipeline to hand and 6DOF tracking. I am proud of it, because this will help people without VR headsets to enjoy VR games. NOTE: Hand tracking is done the best possible way, but I think it still doesn’t compete with real VR headsets. Next ship should add better tracking with PC camera.", "repo": "https://github.com/ttomf/monado-phone", "demo": "https://github.com/ttomf/monado-phone/releases/"}, {"ship_num": 3, "ts": "2026-08-05T13:16:21Z", "hours": 19.0, "multiplier": 17.05, "payout": 325, "blessing": "neutral", "text": "Hi! I ship my Monado Phone Driver ! I worked on it for last week and it was really challenging. My vision was to build something with what you can play VR games on phone (with Google Cardboard), like iVRy, but open-source and simple. I worked on streaming pipeline, UDP discovery, pose tracking and gluing it all together with Monado. I hope this will help people that wanted to play VR games without expensive headset.", "repo": "https://github.com/ttomf/monado-phone", "demo": "https://github.com/ttomf/monado-phone/releases/"}]...
|
[{"post_id": 73208, "ts": "202 [{"post_id": 73208, "ts": "2026-09-24T16:33:26Z", "hours": 3.9361, "text": "Hi! So I’m here again after many exams (I didn’t have time and strength to iteratively test this ) and I’m gonna make this better using better Hand Landmarkers and (hopefully) run on Window$."}, {"post_id": 69212, "ts": "2026-09-16T16:31:16Z", "hours": 1.6044, "text": "I think it’s time to new release! I merged upstream, created tag, built app and driver and published on GitHub."}, {"post_id": 68141, "ts": "2026-09-14T16:07:57Z", "hours": 3.4667, "text": "I am working on implementing hand controller using same data as hand tracking does. It also includes the “aim pose” - where does controller point. On video, it’s shown as red line, I take it from the index finger. I hope I will be able to play some better VR games!"}, {"post_id": 66631, "ts": "2026-09-12T14:11:34Z", "hours": 5.8714, "text": "I’ve fixed some bugs and leaks, added more configuration to Android app and created hand tracking vizualization for the PC script. Also, I am working on integrating hands as controllers (because controllers have better support across games)."}, {"post_id": 63611, "ts": "2026-09-07T15:18:52Z", "hours": 3.8808, "text": "YEAH! I have finally done the PC camera hand tracking! It has much better FOV than phone camera and more computing power. It’s just Python script with MediaPipe, sending the data to 127.0.0.1 to hand port, and it has same format, so the driver doesn’t even know the data is sending someone other than phone. You will ofc need to disable phone hand tracking, otherwise they will collide. As you see in the video, I can move the hands far and they still get tracked. (End of the video is when I took off the headset - it was also tracked :D)"}, {"post_id": 62773, "ts": "2026-09-06T09:09:55Z", "hours": 1.3114, "text": "Now I am making just minor changes to the driver as the base is nearly done. I added screen size synchronization with phone, so the driver now can send right stream. Also I am making small bugfixes and improvements."}, {"post_id": 62286, "ts": "2026-09-05T16:11:29Z", "hours": 1.7353, "text": "I added settings on phone, so now you can really configure the ports on both sides! Also there’s option to disable hand tracking or 6DOF (then it will send only rotation of headset)"}, {"post_id": 62060, "ts": "2026-09-05T09:18:28Z", "hours": 3.9211, "text": "I created simple terminal installer in python that downloads and setups Monado Phone Driver. Thanks also for the positive reviews and the 19.12x stardust multiplier — when I started this project, I didn’t think I’d ever finish it :D"}, {"post_id": 61371, "ts": "2026-09-04T07:52:18Z", "hours": 0.4617, "text": "Last devlog before ship! I just merged upstream monado, built release binaries and created GitHub release."}, {"post_id": 61334, "ts": "2026-09-04T06:19:09Z", "hours": 2.1025, "text": "So I finished the hand tracking! I tried to make it as good as possible on a phone, and it looks like it might actually work! Even though I’m limited by the hardware, you can see in the video that it tracks pretty well. (video from openxr-simple-playground )"}, {"post_id": 60746, "ts": "2026-09-03T09:54:46Z", "hours": 5.6369, "text": "I am enhancing hand tracking now, and it’s starting to look good! Here is how: I use MediaPipe by Google to analyze image from front camera. MediaPipe Hand Landmarker returns hand landmarks in camera-relative format in two dimensions, so I need to make depth (z-coordinate). I measure distance between wrist and fingers, in 2D space this means distance from camera (the farther away they are, the smaller they get). Now, they are 3D, but still relative to camera. Then I simply send both hands as UDP packet for the driver. The driver (PC side) computes real-world coordinates of the hands using saved earlier sent from ARCore and pushes them into Monado."}, {"post_id": 59610, "ts": "2026-09-01T15:01:51Z", "hours": 6.9739, "text": "I worked hard on both the Android app and the Monado driver and finally: I have working hand tracking! It is very laggy, needs many optimizations, and isn’t even in alpha state yet, but I can see that it is possible to do it. This was my dream when I began this project, and finally, it has come true. I hope it will help many people who cannot afford a professional headset :D"}, {"post_id": 58719, "ts": "2026-08-31T08:20:00Z", "hours": 2.2467, "text": "So today I finished image settings (you can configure them in the config file). They control how the image is rendered, because every headset has different lenses, distance between lenses, distance from screen to lenses etc. To find your headset’s properties, go to https://wwgc.firebaseapp.com/ ."}, {"post_id": 58171, "ts": "2026-08-30T15:09:22Z", "hours": 3.5397, "text": "I created new TCP socket logic for configuration sharing and added logic for loading configuration file. Now I am trying to change the x265enc software encoding to something faster on GPU. Unfortunately, nvenc (nvidia encoding) is really hard to configure properly, as you can see for yourselves."}, {"post_id": 57515, "ts": "2026-08-29T17:59:31Z", "hours": 9.2639, "text": "Phew, I almost went over the time limit (10 hours) :D I tried to get it running on Windows, and I partially succeeded, but it’s still not stable. Aside from that, I mostly cleaned up the code, improved usability, and removed unnecessary modules from CMake. Now I’m working on an improved distortion using Monado’s u_distortion_cardboard_calculate (cardboard stands for Google Cardboard btw) And one more thing: thanks to everyone for the positive feedback on the project — I really didn’t expect that!"}, {"post_id": 46899, "ts": "2026-08-14T13:22:12Z", "hours": 1.6314, "text": "Since nobody reviewed my submission, I don’t want to add more features, so I only updated the README and made small changes to the app. If anyone wants to play VR games on their phone, they can just download the files from Releases and run them without hard compiling!"}, {"post_id": 41279, "ts": "2026-08-05T12:09:23Z", "hours": 6.8658, "text": "Devlog 4 : I replaced boilerplate LLM code with my own. I also wrote README with instructions, so you can now try it!"}, {"post_id": 40628, "ts": "2026-08-04T09:25:23Z", "hours": 0.6022, "text": "I am making minor adjustments to run with SteamVR. I use opencomposite as layer between OpenXR and OpenVR/SteamVR. Video is phone screencap from free Steam game “Aircar”."}, {"post_id": 39990, "ts": "2026-08-03T10:37:11Z", "hours": 3.0761, "text": "Devlog 3 : I made 6DOF (6 degrees of freedom = position+rotation in space) tracking with ARCore. It’s a bit laggy, but it works. This is just test, I plan to optimize it later. Video is from xrgears with looking around."}, {"post_id": 39422, "ts": "2026-08-02T11:32:08Z", "hours": 1.5058, "text": "Devlog 2 : Finally I made working streaming pipeline! My driver takes image from Monado, gstreamer encodes it and sends via UDP. On phone, there is AMediaCodec that takes the packets, joins them and renders. Used codec is HEVC (H265). Video is from xrgears demo."}, {"post_id": 38950, "ts": "2026-08-01T15:47:39Z", "hours": 4.6072, "text": "So now I’m basically stuck. Three hours of debugging the streaming pipeline, refractoring with Opencode and trying to make it work. As you see, even Deepseek is struggling with it… Wish me luck 🤞"}, {"post_id": 38092, "ts": "2026-07-31T09:43:03Z", "hours": 2.3839, "text": "Hi! So I have started this project because I want to play VR games, but I don’t have any headset, only Google Cardboard. I know there is ALVR and iVRy, but: ALVR doesn’t have support for hand tracking and 6DOF iVRy is closed-source and wants to pay Sorry, but I don’t plan to add Windows support soon. Devlog 1 : I forked Monado and made some bureaucracy (like adding my driver to CMakeLists.txt etc.) I made simple Android app that pairs over UDP multicast with my driver. The image is from editor, because I don’t have anything interesting to post (except maybe positive logs 😁)"}]...
|
Title: Monado Phone Driver by @ttomf | Stardance
Title: Monado Phone Driver by @ttomf | Stardance
Devlogs:
Hi! So I have started this project because I want to play VR games, but I don’t have any headset, only Google Cardboard. I know there is ALVR and iVRy, but: ALVR doesn’t have support for hand tracking and 6DOF iVRy is closed-source and wants to pay Sorry, but I don’t plan to add Windows support soon. Devlog 1 : I forked Monado and made some bureaucracy (like adding my driver to CMakeLists.txt etc.) I made simple Android app that pairs over UDP multicast with my driver. The image is from editor, because I don’t have anything interesting to post (except maybe positive logs 😁)
So now I’m basically stuck. Three hours of debugging the streaming pipeline, refractoring with Opencode and trying to make it work. As you see, even Deepseek is struggling with it… Wish me luck 🤞
Devlog 2 : Finally I made working streaming pipeline! My driver takes image from Monado, gstreamer encodes it and sends via UDP. On phone, there is AMediaCodec that takes the packets, joins them and renders. Used codec is HEVC (H265). Video is from xrgears demo.
Devlog 3 : I made 6DOF (6 degrees of freedom = position+rotation in space) tracking with ARCore. It’s a bit laggy, but it works. This is just test, I plan to optimize it later. Video is from xrgears with looking around.
I am making minor adjustments to run with SteamVR. I use opencomposite as layer between OpenXR and OpenVR/SteamVR. Video is phone screencap from free Steam game “Aircar”.
Devlog 4 : I replaced boilerplate LLM code with my own. I also wrote README with instructions, so you can now try it!
Since nobody reviewed my submission, I don’t want to add more features, so I only updated the README and made small changes to the app. If anyone wants to play VR games on their phone, they can just download the files from Releases and run them without hard compiling!
Phew, I almost went over the time limit (10 hours) :D I tried to get it running on Windows, and I partially succeeded, but it’s still not stable. Aside from that, I mostly cleaned up the code, improved usability, and removed unnecessary modules from CMake. Now I’m working on an improved distortion using Monado’s u_distortion_cardboard_calculate (cardboard stands for Google Cardboard btw) And one more thing: thanks to everyone for the positive feedback on the project — I really didn’t expect that!
I created new TCP socket logic for configuration sharing and added logic for loading configuration file. Now I am trying to change the x265enc software encoding to something faster on GPU. Unfortunately, nvenc (nvidia encoding) is really hard to configure properly, as you can see for yourselves.
So today I finished image settings (you can configure them in the config file). They control how the image is rendered, because every headset has different lenses, distance between lenses, distance from screen to lenses etc. To find your headset’s properties, go to https://wwgc.firebaseapp.com/ .
I worked hard on both the Android app and the Monado driver and finally: I have working hand tracking! It is very laggy, needs many optimizations, and isn’t even in alpha state yet, but I can see that it is possible to do it. This was my dream when I began this project, and finally, it has come true. I hope it will help many people who cannot afford a professional headset :D
I am enhancing hand tracking now, and it’s starting to look good! Here is how: I use MediaPipe by Google to analyze image from front camera. MediaPipe Hand Landmarker returns hand landmarks in camera-relative format in two dimensions, so I need to make depth (z-coordinate). I measure distance between wrist and fingers, in 2D space this means distance from camera (the farther away they are, the smaller they get). Now, they are 3D, but still relative to camera. Then I simply send both hands as UDP packet for the driver. The driver (PC side) computes real-world coordinates of the hands using saved earlier sent from ARCore and pushes them into Monado.
So I finished the hand tracking! I tried to make it as good as possible on a phone, and it looks like it might actually work! Even though I’m limited by the hardware, you can see in the video that it tracks pretty well. (video from openxr-simple-playground )
Last devlog before ship! I just merged upstream monado, built release binaries and created GitHub release.
I created simple terminal installer in python that downloads and setups Monado Phone Driver. Thanks also for the positive reviews and the 19.12x stardust multiplier — when I started this project, I didn’t think I’d ever finish it :D
I added settings on phone, so now you can really configure the ports on both sides! Also there’s option to disable hand tracking or 6DOF (then it will send only rotation of headset)
Now I am making just minor changes to the driver as the base is nearly done. I added screen size synchronization with phone, so the driver now can send right stream. Also I am making small bugfixes and improvements.
YEAH! I have finally done the PC camera hand tracking! It has much better FOV than phone camera and more computing power. It’s just Python script with MediaPipe, sending the data to 127.0.0.1 to hand port, and it has same format, so the driver doesn’t even know the data is sending someone other than phone. You will ofc need to disable phone hand tracking, otherwise they will collide. As you see in the video, I can move the hands far and they still get tracked. (End of the video is when I took off the headset - it was also tracked :D)
I’ve fixed some bugs and leaks, added more configuration to Android app and created hand tracking vizualization for the PC script. Also, I am working on integrating hands as controllers (because controllers have better support across games).
I am working on implementing hand controller using same data as hand tracking does. It also includes the “aim pose” - where does controller point. On video, it’s shown as red line, I take it from the index finger. I hope I will be able to play some better VR games!
I think it’s time to new release! I merged upstream, created tag, built app and driver and published on GitHub.
Hi! So I’m here again after many exams (I didn’t have time and strength to iteratively test this ) and I’m gonna make this better using better Hand Landmarkers and (hopefully) run on Window$.
Ships:
Hi! I ship my Monado Phone Driver ! I worked on it for last week and it was really challenging. My vision was to build something with what you can play VR games on phone (with Google Cardboard), like iVRy, but open-source and simple. I worked on streaming pipeline, UDP discovery, pose tracking and gluing it all together with Monado. I hope this will help people that wanted to play VR games without expensive headset.
Hi! This is my second ship of this project, Monado Phone Driver. It’s bridge between your VR app and your phone in headset ( Google Cardboard ). I wanted to make it better than ALVR , because it has only 3DOF tracking, so I created 6DOF tracking and hand tracking, like professional headsets. The most challenging part of this was debugging all of these. From Vulkan swapchain management and GStreamer pipeline to hand and 6DOF tracking. I am proud of it, because this will help people without VR headsets to enjoy VR games. NOTE: Hand tracking is done the best possible way, but I think it still doesn’t compete with real VR headsets. Next ship should add better tracking with PC camera.
I made Monado Phone Driver - a bridge between VR app and phone in cardboard headset. This allows you to play VR games just with Linux PC and Android phone, without buying expensive VR headset. There are alternatives, like ALVR and WiVRn , but my driver has 6DOF tracking (you can move and rotate in space) and hand tracking (it takes hand landmarks from PC or phone camera). Since last ship, I improved stability, added Android app settings, created auto installer, and mainly tracking from PC camera, because phone has small FOV and limited performance....
|
1792986625.0380526
|
1793073025.0380526
|
|
12084
|
fraktalized by @swedishsplidney | Stardance
|
swedishsplidney
|
1
|
70.0
|
1361
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T06:36:27Z", "hours": 70.0, "multiplier": 19.43, "payout": 1361, "blessing": "neutral", "text": "fraktalized ship: fraktalized is an an open-source, cross-platform, ultra smooth real time fractal explorer built using a hybrid architecture of Qt6 (QML/C++) and openGL (GLSL 330 core / 4.3 compute shaders). fraktalized currently has 10 fractal sets: mandelbrot set: the classic fractal set julia set: cool swirly stuff, complete with adjustable constant coords burning ship set: cool pointy stuff newton set: kinda spidery looking buddhabrot: like the mandelbrot but galaxy looking anti-buddhabrot: reverse buddhabrot barnsley fern: looks very naturey mandelbulb: like the mandelbrot but 3d menger sponge: cube, but with infinite* surface ar a icebox: spiky box! there is both a set of 3 precompiled binaries on the github and a demo video: https://youtu.be/x9lH_pPzvbw", "repo": "https://github.com/swedishsplidney/fraktalized", "demo": "https://github.com/swedishsplidney/fraktalized/releases"}]...
|
[{"post_id": 20591, "ts": "202 [{"post_id": 20591, "ts": "2026-07-02T06:34:20Z", "hours": 0.7767, "text": "extra ui tweaks and readme updates added some images of 3d fractals to the readme, did some general ui tweaks, and some idiot proofing now its time to ship!!!"}, {"post_id": 20559, "ts": "2026-07-02T05:22:07Z", "hours": 4.9961, "text": "probably the final commit :o most of this was spent idiot proofing, going through all my code and making sure that everything works well and actually makes sense i also updated the tutorial to be a bit better a major amount of time was spent figuring out how to get windows to actually compile i swear windows is the bane of my entire existence its not reflected in the devlog hours, but i did also make a demo video to show off some of the features mystery link other than that, it was mostly ui and readme updates :)"}, {"post_id": 19733, "ts": "2026-07-01T03:52:28Z", "hours": 9.76, "text": "i set up a full tutorial system the hard part was doing the whole thing where it darkens everywhere except the thing the tutorial is yapping about… also, right now, the tutorial is really really easy to break, so i might have to implement some idiot proofing or something to be honest, adding the whole darkening thing was really simple, but actually getting it to work was really annoying for some reason. it essentially just gets the xy coord for each corner of the specified element, and then makes a dark block everywhere except inside those 4 corners. also, i made it so the tutorial saves to the same json file as the preset manager, so that you only have to do the tutorial one time and it doesnt just get in your way every single time you open it. aside from that, most of this time was spent trying to figure out how to get it to automatically build on github when i push a release. i did this successfully for my other project, but the problem so far has been linking the qml for the binaries on the different platforms. specifically, windows just really really doesnt want to behave, its starting to feel like getting a discord mod to eat anything other than gamersupps and pizza rolls overall, maybe getting close to shipping? it honestly just depends on how much more features and idiot proofing i want to add if this sounds interesting, check out (and star ) the repo here"}, {"post_id": 14222, "ts": "2026-06-23T07:20:06Z", "hours": 8.5239, "text": "3d wasd controls (wowie zowie) the math for this was super hard, especially because i want it to work alongside with the other classic orbit style controls lol i ended up adding a toggle in the sidebar, which felt like the cleanest way to do it, but did mean doing more qml also, i pretty much had to guess when setting up all my vectors so i spent like 15 presidential terms messing around with positives and negatives and 1.0f / 0.0f everywhere until doing stuff in the right directions actually did the right thing, which was hard also had to implement auto horizon correction so things d also added some live 3d settings, which took a while, but now theres a live slider for both the mandelbulb power (exponent), and the brightness (which was hard) and, theres now a math section in the readme, which i spent a lot of time pondering while making, but if you’re at all, check out the “mathy information” section of the readme https://github.com/swedishsplidney/fraktalized (also star the repo ) exploring the mandelbulb in wasd mode genuinely feels like exploring an alien planet in a spaceship, lowk super fun"}, {"post_id": 11771, "ts": "2026-06-19T04:47:05Z", "hours": 8.7492, "text": "3d is finally working!!!!! i have been having an epic samurai battle against opengl and 3d fractal math for what feels like forever, but it finally works, and I have a working 3d mandelbulb explorer!!! i have actually been working on getting 3d working for the past multiple devlogs, it just took me sooo incredibly long to actually figure it out that i never really mentioned it. the longest step was figuring out the controls. when i first started working on the 3d mode, then it was literally just a cube, and i had to figure out a good way to be able to rotate it the hard part wasn’t even trying to figure out how to do the math to rotate the vertices, the hard part was trying to figure out how the thing should actually rotate what i figured out how to do is having an orbit style camera, where dragging side to side rotates the model along its own local yaw, and then dragging up and down changes the camera’s global pitch. this way the model’s roll never changes (because that makes the model look tilted or skewed). i had to spend an embarassingly long amount of time trying to figure the logic of an orbital camera… the camera is also slerped (like lerping but 3d) so it feels smooth color mappping on the 3d was actually surprisingly easy, i just did it in a very similar way to the 2d escape time ones, except with an extra dimension (its not as hard as it sounds) one other major change was when i added the ability to add and remove gradient stops. this way, instead of always having 4 gradient stops, you can have anywhere from 2 to 16 stops, for more customizeability. also, the readme is updated, go check it out! (and star the repo ) https://github.com/swedishsplidney/fraktalized below: video demonstrating the 3d and camera system"}, {"post_id": 10469, "ts": "2026-06-17T06:25:16Z", "hours": 7.9178, "text": "added iterative function system fractals basically, iterative function fractals are fractals that start at a set point, then repeatedly apply the same affine transformations (scaling, rotating, shifting), making an infinitely repeating, self-same fractal. as far as actually getting this setup and working, i had to make a whole new compute shader that involves a lot of math and for loops to iterate forever getting ifs fractals to render was a particular challenge, and i almost exploded my gpu and accidentally caused a vram cache overflow causing my display output to break. in the end, it turns out the trick was to not send 4,000,000 worker threads to the gpu all at once, and to do them 3-4 at a time also finally got working on the whole 3d system, which will likely take forever, and completely does not work right now, but hopefully i will have figured out how in the world to get working 3d stuff by the next devlog 🙏 check out the github! -> https://github.com/swedishsplidney/fraktalized image: barnsley fern, rendered in 4k"}, {"post_id": 9130, "ts": "2026-06-15T08:45:47Z", "hours": 6.9228, "text": "added support for trajectory based fractals most people know the normal fractals (the ones ive covered so far), such as the mandelbrot and julia sets, that test wether or not a point escapes and maps how long it takes to escape trajectory fractals look really cool, and the difference is that they map the trajectory that 𝑧 takes on its way out, while incrementing a counter for every pixel it steps on. getting this to work was a lot of work, and required to write a whole new shader file from scratch, except instead of a .frag/.vert combo, it was a compute shader (.glsl). instead of simply running a loop and writing color data to each independent pixel like with the escape-time fractals do, the trajectory shader has to pick a random (x, y) starting coord, and then track its orbit across the complex plane, writing data to random pixels as it goes. this required me to use atomics, because if 2 orbits cross, instead of one overwriting each other, you have to use imageAtomicAdd() to make sure that the brightness stacks up. one other issue was that at first it was super grainy, which was fixed by assigning each gpu thread 50 random sampled to increase detail substantially. i also nearly exploded my gpu because i accidentally had the render system run 50+ compute sequences at the same time, so i now have each compute wait for the one before it to finish in other happenings, there is now a preset feature that writes your current color setup set, zoom, center, etc. to a JSON file to be loaded later also added the newton set, but its a less interesting escape-time fractal, so not covered in as much detail image: buddhabrot set, rendered at 4k"}, {"post_id": 7949, "ts": "2026-06-13T08:09:58Z", "hours": 5.9558, "text": "added the burning ship fractal, anti aliasing, and completely overhauled the color system to use a gradient input instead of one color. burning ship fractal: so the burning ship fractal is made when you take the mandelbrot equation, but you take the absolute value of the real and imaginary parts before squaring, basically destroying the symmetry: 𝑧ₙ₊₁ = (|𝑅𝑒(𝑍ₙ)| + 𝑖|𝐼𝑚(𝑍ₙ)|)² + 𝐶 this makes it look super duper cool (as seen in the image below) gradient-based color mapping so before, the color was just calculated using one color tint and boosting brightness quadratically near the edges. now, it takes in a gradient (calculated between 4 color inputs), and does the same color mapping but essentially moves what color it uses as the iterations increase. the hard part is figuring out how to get a good input system in qml with this, but I was able to do it using some colordialogues and a lot of trial and error. the new color input system is kinda like creating a gradient in photoshop or illustrator, with 4 little handles that you can drag across and change their colors. anti aliasing also added anti aliasing, or more specifically, ssaa (super sampling anti aliasing), with a selector to choose between off, 2x, and 3x so basically it renders the entire fractal at a higher resolution (2x or 3x) and then averages the color of every pixel block (2x2 or 3x3 respectively) and then displays that. this results in a much, much smoother image at the cost of much higher resource usage. while i was screwing around with dynamic resolutions, i also added a resolution slider to change the rendered resolution to anywhere from 25 to 150% of the window resolution. turning it up past 100% basically just gives the ssaa architecture more information to work with, making it even smoother my graphics card isnt very powerful and it basically stays pinned at 99% usage and 100% clock when i have anti aliasing turned on and the iterations above like 200. image: burning ship fractal, rendered at 4k with 150% resolution scale and 3x ssaa"}, {"post_id": 6713, "ts": "2026-06-11T07:42:55Z", "hours": 4.1331, "text": "now has a render to file feature basically you just import a custom resolution and it takes your current center and renders at that resolution with your current parameters. the hard part is that it uses a completely different framebuffer object from the regular viewport. while testing i did almost explode my gpu when pushing the resolution to almost 32k, which is kinda unreasonable, but this was a good opportunity to add a tiled render system basically it just splits up the image into 2000x2000 pixel sections and renders them, and then it does some math to position it the weird thing is that opengl is kinda goofy and likes to mirror stuff for some reason (literally no idea why) so theres some math to render it in reverse (which means that its actually correct) also increased the rendering to 64 bit, meaning it is now 536,870,912 times more accurate compared to the 32 bit one, and also means you can zoom in more than twice as far with better quality, but it is much more gpu intensive… this image is one of the cooler ones i rendered out at 4k, it kinda looks like colliding galaxies or something"}, {"post_id": 6139, "ts": "2026-06-10T10:13:47Z", "hours": 6.7264, "text": "is now fully interactive and honestly feels super great, especially compared to my last devlog where it was static and unchanging entirely added working real-time render parameters such as panning and zooming with mouse, and custom iteration setup and color setup on the sidebar. lots and lots and lots of quality of life features, such as: the reset button for if you get lost adjustable iteration slider min/max direct text enter for iterations hideable iteration min/max menu camera smoothing color clamping so it doesnt look deep fried also added the julia set (which is what is in the image) so basically, both the mandelbrot and julia sets are the same quadratic recurrence relation on the complex plane: 𝑧ₙ₊₁ = (𝑧ₙ)² + 𝑐 the main difference is that you start at the origin (𝑧₀ = 0) and change the constant 𝑐 for every single pixel on the screen based on its coordinates, but with the julia set the constant 𝑐 is the same everywhere, and the starting point 𝑧₀ changes based on the pixel’s coordinate, so you are testing how different starting points react to the same gravitational pull of 𝑐. the nice thing is that you can change the constant 𝑐 in the julia set, and completely change how the fractal looks, so i added that as an input field too looks really really cool lowk"}, {"post_id": 4855, "ts": "2026-06-08T12:00:00Z", "hours": 5.5808, "text": "working mandelbrot fractal rendering through opengl!!!!! using qt/qml and raw opengl shaders together was a mistake they really dont like working together and i had to spend 3 straight hours (its 5:42am at the time of this devlog) debugging an eternal tug of war between qt and opengl because qt kept overwriting what i wanted to happen the worst part is that an opengl fragment shader cant really debug to the log so if something is on fire over there i just kinda have to guess to fix it eventually i just gave up and switched to framebuffer objects, which i lowk should have done from the start the funnest part was actually writing the equations for the mandelbrot set lol (it also looks super pretty): so basically the Mandelbrot set is the set of all complex parameters 𝑐 ∈ ℂ for which the orbit of 𝑧₀ = 0 under quadratic recurrence remains bounded. in the shader, i just separate its multiplication into real and imaginary components: Re(𝑧ₙ₊₁) = 𝑥² + 𝑦² + Re(𝑐) Im(𝑧ₙ₊₁) = 2𝑥𝑦 + Im(𝑐) also infinity is impossible so the iterations are capped at 100 sorry if this was too nerdy or long lmao"}]...
|
Title: fraktalized by @swedishsplidney | Stardance Title: fraktalized by @swedishsplidney | Stardance
Devlogs:
working mandelbrot fractal rendering through opengl!!!!! using qt/qml and raw opengl shaders together was a mistake they really dont like working together and i had to spend 3 straight hours (its 5:42am at the time of this devlog) debugging an eternal tug of war between qt and opengl because qt kept overwriting what i wanted to happen the worst part is that an opengl fragment shader cant really debug to the log so if something is on fire over there i just kinda have to guess to fix it eventually i just gave up and switched to framebuffer objects, which i lowk should have done from the start the funnest part was actually writing the equations for the mandelbrot set lol (it also looks super pretty): so basically the Mandelbrot set is the set of all complex parameters 𝑐 ∈ ℂ for which the orbit of 𝑧₀ = 0 under quadratic recurrence remains bounded. in the shader, i just separate its multiplication into real and imaginary components: Re(𝑧ₙ₊₁) = 𝑥² + 𝑦² + Re(𝑐) Im(𝑧ₙ₊₁) = 2𝑥𝑦 + Im(𝑐) also infinity is impossible so the iterations are capped at 100 sorry if this was too nerdy or long lmao
is now fully interactive and honestly feels super great, especially compared to my last devlog where it was static and unchanging entirely added working real-time render parameters such as panning and zooming with mouse, and custom iteration setup and color setup on the sidebar. lots and lots and lots of quality of life features, such as: the reset button for if you get lost adjustable iteration slider min/max direct text enter for iterations hideable iteration min/max menu camera smoothing color clamping so it doesnt look deep fried also added the julia set (which is what is in the image) so basically, both the mandelbrot and julia sets are the same quadratic recurrence relation on the complex plane: 𝑧ₙ₊₁ = (𝑧ₙ)² + 𝑐 the main difference is that you start at the origin (𝑧₀ = 0) and change the constant 𝑐 for every single pixel on the screen based on its coordinates, but with the julia set the constant 𝑐 is the same everywhere, and the starting point 𝑧₀ changes based on the pixel’s coordinate, so you are testing how different starting points react to the same gravitational pull of 𝑐. the nice thing is that you can change the constant 𝑐 in the julia set, and completely change how the fractal looks, so i added that as an input field too looks really really cool lowk
now has a render to file feature basically you just import a custom resolution and it takes your current center and renders at that resolution with your current parameters. the hard part is that it uses a completely different framebuffer object from the regular viewport. while testing i did almost explode my gpu when pushing the resolution to almost 32k, which is kinda unreasonable, but this was a good opportunity to add a tiled render system basically it just splits up the image into 2000x2000 pixel sections and renders them, and then it does some math to position it the weird thing is that opengl is kinda goofy and likes to mirror stuff for some reason (literally no idea why) so theres some math to render it in reverse (which means that its actually correct) also increased the rendering to 64 bit, meaning it is now 536,870,912 times more accurate compared to the 32 bit one, and also means you can zoom in more than twice as far with better quality, but it is much more gpu intensive… this image is one of the cooler ones i rendered out at 4k, it kinda looks like colliding galaxies or something
added the burning ship fractal, anti aliasing, and completely overhauled the color system to use a gradient input instead of one color. burning ship fractal: so the burning ship fractal is made when you take the mandelbrot equation, but you take the absolute value of the real and imaginary parts before squaring, basically destroying the symmetry: 𝑧ₙ₊₁ = (|𝑅𝑒(𝑍ₙ)| + 𝑖|𝐼𝑚(𝑍ₙ)|)² + 𝐶 this makes it look super duper cool (as seen in the image below) gradient-based color mapping so before, the color was just calculated using one color tint and boosting brightness quadratically near the edges. now, it takes in a gradient (calculated between 4 color inputs), and does the same color mapping but essentially moves what color it uses as the iterations increase. the hard part is figuring out how to get a good input system in qml with this, but I was able to do it using some colordialogues and a lot of trial and error. the new color input system is kinda like creating a gradient in photoshop or illustrator, with 4 little handles that you can drag across and change their colors. anti aliasing also added anti aliasing, or more specifically, ssaa (super sampling anti aliasing), with a selector to choose between off, 2x, and 3x so basically it renders the entire fractal at a higher resolution (2x or 3x) and then averages the color of every pixel block (2x2 or 3x3 respectively) and then displays that. this results in a much, much smoother image at the cost of much higher resource usage. while i was screwing around with dynamic resolutions, i also added a resolution slider to change the rendered resolution to anywhere from 25 to 150% of the window resolution. turning it up past 100% basically just gives the ssaa architecture more information to work with, making it even smoother my graphics card isnt very powerful and it basically stays pinned at 99% usage and 100% clock when i have anti aliasing turned on and the iterations above like 200. image: burning ship fractal, rendered at 4k with 150% resolution scale and 3x ssaa
added support for trajectory based fractals most people know the normal fractals (the ones ive covered so far), such as the mandelbrot and julia sets, that test wether or not a point escapes and maps how long it takes to escape trajectory fractals look really cool, and the difference is that they map the trajectory that 𝑧 takes on its way out, while incrementing a counter for every pixel it steps on. getting this to work was a lot of work, and required to write a whole new shader file from scratch, except instead of a .frag/.vert combo, it was a compute shader (.glsl). instead of simply running a loop and writing color data to each independent pixel like with the escape-time fractals do, the trajectory shader has to pick a random (x, y) starting coord, and then track its orbit across the complex plane, writing data to random pixels as it goes. this required me to use atomics, because if 2 orbits cross, instead of one overwriting each other, you have to use imageAtomicAdd() to make sure that the brightness stacks up. one other issue was that at first it was super grainy, which was fixed by assigning each gpu thread 50 random sampled to increase detail substantially. i also nearly exploded my gpu because i accidentally had the render system run 50+ compute sequences at the same time, so i now have each compute wait for the one before it to finish in other happenings, there is now a preset feature that writes your current color setup set, zoom, center, etc. to a JSON file to be loaded later also added the newton set, but its a less interesting escape-time fractal, so not covered in as much detail image: buddhabrot set, rendered at 4k
added iterative function system fractals basically, iterative function fractals are fractals that start at a set point, then repeatedly apply the same affine transformations (scaling, rotating, shifting), making an infinitely repeating, self-same fractal. as far as actually getting this setup and working, i had to make a whole new compute shader that involves a lot of math and for loops to iterate forever getting ifs fractals to render was a particular challenge, and i almost exploded my gpu and accidentally caused a vram cache overflow causing my display output to break. in the end, it turns out the trick was to not send 4,000,000 worker threads to the gpu all at once, and to do them 3-4 at a time also finally got working on the whole 3d system, which will likely take forever, and completely does not work right now, but hopefully i will have figured out how in the world to get working 3d stuff by the next devlog 🙏 check out the github! -> https://github.com/swedishsplidney/fraktalized image: barnsley fern, rendered in 4k
3d is finally working!!!!! i have been having an epic samurai battle against opengl and 3d fractal math for what feels like forever, but it finally works, and I have a working 3d mandelbulb explorer!!! i have actually been working on getting 3d working for the past multiple devlogs, it just took me sooo incredibly long to actually figure it out that i never really mentioned it. the longest step was figuring out the controls. when i first started working on the 3d mode, then it was literally just a cube, and i had to figure out a good way to be able to rotate it the hard part wasn’t even trying to figure out how to do the math to rotate the vertices, the hard part was trying to figure out how the thing should actually rotate what i figured out how to do is having an orbit style camera, where dragging side to side rotates the model along its own local yaw, and then dragging up and down changes the camera’s global pitch. this way the model’s roll never changes (because that makes the model look tilted or skewed). i had to spend an embarassingly long amount of time trying to figure the logic of an orbital camera… the camera is also slerped (like lerping but 3d) so it feels smooth color mappping on the 3d was actually surprisingly easy, i just did it in a very similar way to the 2d escape time ones, except with an extra dimension (its not as hard as it sounds) one other major change was when i added the ability to add and remove gradient stops. this way, instead of always having 4 gradient stops, you can have anywhere from 2 to 16 stops, for more customizeability. also, the readme is updated, go check it out! (and star the repo ) https://github.com/swedishsplidney/fraktalized below: video demonstrating the 3d and camera system
3d wasd controls (wowie zowie) the math for this was super hard, especially because i want it to work alongside with the other classic orbit style controls lol i ended up adding a toggle in the sidebar, which felt like the cleanest way to do it, but did mean doing more qml also, i pretty much had to guess when setting up all my vectors so i spent like 15 presidential terms messing around with positives and negatives and 1.0f / 0.0f everywhere until doing stuff in the right directions actually did the right thing, which was hard also had to implement auto horizon correction so things d also added some live 3d settings, which took a while, but now theres a live slider for both the mandelbulb power (exponent), and the brightness (which was hard) and, theres now a math section in the readme, which i spent a lot of time pondering while making, but if you’re at all, check out the “mathy information” section of the readme https://github.com/swedishsplidney/fraktalized (also star the repo ) exploring the mandelbulb in wasd mode genuinely feels like exploring an alien planet in a spaceship, lowk super fun
i set up a full tutorial system the hard part was doing the whole thing where it darkens everywhere except the thing the tutorial is yapping about… also, right now, the tutorial is really really easy to break, so i might have to implement some idiot proofing or something to be honest, adding the whole darkening thing was really simple, but actually getting it to work was really annoying for some reason. it essentially just gets the xy coord for each corner of the specified element, and then makes a dark block everywhere except inside those 4 corners. also, i made it so the tutorial saves to the same json file as the preset manager, so that you only have to do the tutorial one time and it doesnt just get in your way every single time you open it. aside from that, most of this time was spent trying to figure out how to get it to automatically build on github when i push a release. i did this successfully for my other project, but the problem so far has been linking the qml for the binaries on the different platforms. specifically, windows just really really doesnt want to behave, its starting to feel like getting a discord mod to eat anything other than gamersupps and pizza rolls overall, maybe getting close to shipping? it honestly just depends on how much more features and idiot proofing i want to add if this sounds interesting, check out (and star ) the repo here
probably the final commit :o most of this was spent idiot proofing, going through all my code and making sure that everything works well and actually makes sense i also updated the tutorial to be a bit better a major amount of time was spent figuring out how to get windows to actually compile i swear windows is the bane of my entire existence its not reflected in the devlog hours, but i did also make a demo video to show off some of the features mystery link other than that, it was mostly ui and readme updates :)
extra ui tweaks and readme updates added some images of 3d fractals to the readme, did some general ui tweaks, and some idiot proofing now its time to ship!!!
Ships:
fraktalized ship: fraktalized is an an open-source, cross-platform, ultra smooth real time fractal explorer built using a hybrid architecture of Qt6 (QML/C++) and openGL (GLSL 330 core / 4.3 compute shaders). fraktalized currently has 10 fractal sets: mandelbrot set: the classic fractal set julia set: cool swirly stuff, complete with adjustable constant coords burning ship set: cool pointy stuff newton set: kinda spidery looking buddhabrot: like the mandelbrot but galaxy looking anti-buddhabrot: reverse buddhabrot barnsley fern: looks very naturey mandelbulb: like the mandelbrot but 3d menger sponge: cube, but with infinite* surface ar a icebox: spiky box! there is both a set of 3 precompiled binaries on the github and a demo video: https://youtu.be/x9lH_pPzvbw...
|
1792968563.9409862
|
1793054963.9409862
|
|
14477
|
Celestial Capitalist by @Ratseer | Stardance
|
Ratseer
|
1
|
80.0
|
1360
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-18T08:46:59Z", "hours": 80.0, "multiplier": 19.18, "payout": 1360, "blessing": "neutral", "text": "Celestial Capitalist is a simulation game where the player simultaneously builds and ascends the corporate ladder from the bottom of the street to the self-built throne at the top of the cosmos. Beg your way from homelessness, run a lemonade stand, scam grandmas on the internet, start a cult, play union-buster tower defence, and generally just have a grand stupid time while the world slowly bends to your will. Currently on FIRST BETA! Contains the slightly unpolished first stage, Rock Bottom, with basic progression, a bunch of minigames and… style!. You’re homeless and you needa earn money to get out of it. Also you can’t save yet. And the volume is broken. WE’LL FIX IT ONE DAY. Controls are all point and clicked + arrow keys for the Fake Injury minigame. Windows only for the moment - will support more soon. Unzip and run ccap1.0exe. By @idi0cy and RatseerOfRattesse Made for Hack Club Stardance. Tribulations Coding is notorious for producing the kind of mistakes one looks through for an entire night and solves in a second of effort. We had a lot of that. The amount of stupid crap on the way here is immense and we’ve still not cleared out all of it. But, @idi0cy and I hope you will enjoy what we’ve made, cuz we sure did enjoy making it. Celestial Capitalist by @idi0cy and @Ratseer .", "repo": "https://github.com/idi0cy/Celestial-Capitalist", "demo": "https://ratseerofrattesse.itch.io/celestial-capitalist"}]...
|
[{"post_id": 70013, "ts": "202 [{"post_id": 70013, "ts": "2026-09-18T08:42:14Z", "hours": 3.6286, "text": "Celestial Capitalist - Beta Complete! After four hours of horrifically annoying bugfixing with @idi0cy , CC is ship ready! We did a lot of misc fixes. There was some really stupid code we left in such as ‘check if x > y’ and consecutively in that one ‘check if x < y’. We’re geniuses. Anyway, we just added a sound slider that doesn’t work outside the editor 😭 . There were also a bunch of balancing issues to fix, such as me labelling a bottle of soy sauce as 45 dollars. But it’s done, oh lord it’s done. Check it out! https://ratseerofrattesse.itch.io/celestial-capitalist"}, {"post_id": 67110, "ts": "2026-09-13T05:19:16Z", "hours": 10.2817, "text": "Revamped Tutorial Gave the new tutorial put in place by @idi0cy some flair. It now also contains a text box for you to pick a save name, which will automatically show up in the ledger where the account name thing is. It may be the save name, but we’re not going to be implementing saves before shipping as we’re lazy and have things to do. The revamp has also made the game through anywhere from 1-103 data.tree is null errors but it ain’t crashing and I’m done solving that crap. Two Bowls of Chili We now have the two bowls of chili as per request by a friend of @idi0cy . New Item Mechanics I’ve changed the item system so that they can take on far more data than just an item type. They now have an additionalProperties , which is a Dictionary that is meant to take a string key and value. This allows us to store pretty much any data we want in there. This was done so that I could make items give temporary skill buffs with ease, as a lot of them are currently only good for selling. So now, you can use a pencil and gain a minute of +1 dexterity (which helps in the fake injury and stealth steal minigames), among other buffs. Miscellaneous fixes We are nearing release, and so we’ve begun to review a lot of stuff and make balancing/bugfixing changes. Deathscreen now returns you to title screen. Made perception affect scavenge quality and charisma affect market quality Added a bajillion tooltips to explain stuff Haggle difficulty has been made easier Fixed an issue in scavenge that made all the loot 0 quality Made event popups stack Made it so other windows can’t open if a scavenge game is happening Celestial Capitalist , dubiously developed by @Ratseer and @idi0cy ."}, {"post_id": 56846, "ts": "2026-08-28T19:55:57Z", "hours": 12.85, "text": "Vitals System Added a health, hydration, and satiation system. Satiation controls max health, and if your hydration hits 0, you begin taking damage over time. When you take damage or your health is low, your screen has a damage overlay. Celestial Capitalist in collaboration with @idi0cy ."}, {"post_id": 42247, "ts": "2026-08-06T21:19:59Z", "hours": 10.2553, "text": "The Great Organization So while @idi0cy over there has been coding new stuff, I’ve been over here cleaning after his mess. I’m currently in the process of adding documentation comments to everything so we know what the hell anything is after we code it. Suffice to say, it’s not going that great but it’s coming along. This man literally wrote a variable called lengthOfTimeUnitThingHi_rAt_D_ontWeLovenamingConVentIons just to piss me off. Another part of the organization effort is adding these #region and #endregion comments everywhere so we can close and expand large sections of code. The Great Centralization I’ve also been working on centralizing certain things. I’ve added a new InventoryHelper class, which contains methods used for inventories such as the market stalls, loot boxes, the actual inventory, and the pick to sell menu. Attached below is the documentation comments for the Resources class containing pretty much every texture, dialogue line, name, and utility function and now a lot of the scripts extend it."}, {"post_id": 23270, "ts": "2026-07-06T03:47:42Z", "hours": 5.2578, "text": "The Market I’ve added a shop system! At exactly 00:00 every day the Market tab refreshes with a new market stall, with randomly generated name, products, and an owner profile for the funnies. This system isn’t really for you to buy and flip prices in the get money tab - this is supposed to drag money out of you when you’re starving for food and also purchase upgrades for your run. Said upgrades have not yet been implemented, but - Using Items Items that can be used now pop up a use item button in the inventory. Monetary items now return money to your ledger and food items now add to your vitals - which hasn’t been implemented yet. We’ll also be adding more items and usages - such as those aforementioned upgrades. Celestial Capitalist in collaboration with @idi0cy"}, {"post_id": 14197, "ts": "2026-06-23T06:03:54Z", "hours": 15.8422, "text": "Celestial Capitalist: Scavenging WOW that took a while! Probably should have posted some breadcrumbs midway but whatever. The SCAVENGING FEATURE IS COMPLETE. This is basically loot box opening simulator + squid game dalgona cookies. This will be your main way to get items to sell (therefore earn money). The value of each item is based off that quality value we’ve been showing off, as well as the item’s base value and your minigame performance. Loot even scales as you gain more money (which I do in the video with a debug keybind), allowing you to go from looting trash cans to looting discarded packages and dropped briefcases. To spice up the loot, I’ve also added WAYYY too many items (yes, I did the textures myself). The hardest part of this whole thing was making a proper weighted loot system. That was a pain, because I could never quite fine tune the results to what I wanted - still really haven’t, but it works well enough. The other hardest part was me, as a relative beginner to programming, discovering that assigning a new variable to an array in fact synced both arrays. Godot what the hell is duplicate_deep() 😭 Celestial Capitalist in collaboration with @idi0cy"}, {"post_id": 11810, "ts": "2026-06-19T06:57:08Z", "hours": 3.935, "text": "Celestial Capitalist: Randomized Stranger Names Just made random names for all the strangers - which was a damn pain because @idi0cy , despite his all-knowing-ness, decided to name the index of the button icons with the stranger sprites ‘index’, then proceeded to reference those same values in a different function under the name ‘place’ whilst the argument ‘index’ in said function was something entirely different. This confused me for at least an hour. You will also notice that we have a new merry little cast of sprites, for those strangers. I tried to make them look as dystopian as possible. Think it worked. Would probably have gone for more distorted faces too if I had the time. As you can see below, I spent way too long getting a massive list of names - mostly from Orteil’s RandomGen, and then a few references to media I like. We’ll definitely be adding more."}, {"post_id": 11148, "ts": "2026-06-18T07:16:54Z", "hours": 2.7939, "text": "Celestial Capitalist: Inventory Revamp + Misc Fixes Revamped the inventory item inspector and made it prettier, as seen below Also did various other internal fixes with code and stuff such as renaming a button, adding lines to the fake injury game, and item flavour text edit: just noticed the screenshot is horrendous so i replaced it edit two: nvm apparently stardance just crops it 😭 wtf"}, {"post_id": 11063, "ts": "2026-06-18T03:06:53Z", "hours": 2.9181, "text": "Celestial Capitalist: Randomized Dialogue little mini update while i do more stuff This and 15 more stupid lines per each dialogue option"}, {"post_id": 8514, "ts": "2026-06-14T05:01:46Z", "hours": 2.7608, "text": "Celestial Capitalist: Daily Monetaries + Tooltips Added a general purpose tooltip scene for instancing with the _make_custom_tooltip() method. That was a pain to get right - I spent a good half hour trying to figure out why it wouldn’t work before realizing the root had to be a container node. Control nodes stink and I hate them. In practical terms, I’ve added a method to append daily costs and profits to the ledger interface. Nothing actually uses it yet, so the values in here are from a debug keybind I was using."}, {"post_id": 8010, "ts": "2026-06-13T11:16:41Z", "hours": 3.9717, "text": "Celestial Capitalist: The Ledger Bit of an annoyance to make, but it works :D This is where you can keep track of your transactions and balance, as well as a hub for future financial stats that have yet to be implemented. Did a bunch of tomfoolery with containers and control nodes and all that weird stuff trying to make the collapsible boxes work - ended up just changing minimum sizes myself instead of bothering with the FoldableContainers. Other stuff In terms of backend stuff I guess you’d call it, I made some changes to the project settings for window scaling + added some font settings so we can apply them everywhere easier, as well as a button template script that won’t actually do anything. That’s for the tooltips on the daily buttons in the legder - for later!"}, {"post_id": 7783, "ts": "2026-06-13T00:11:11Z", "hours": 3.9939, "text": "Celestial Capitalist Dynamic Background Background now changes based on night cycle. Damn this was a pain - mostly because the issue wasn’t even the programming it was the frickin math. I hate math. I hate math so much. Also godot what the hell do you mean ‘70 is out of bounds of 70’ i’m dying The following showcase vid has time passing so quickly because I added a keybind to add hours to the clock for debug purposes. Also my laptop’s a bit laggy lmao Still needs polish, but hey, it works."}, {"post_id": 6529, "ts": "2026-06-10T23:42:25Z", "hours": 1.6681, "text": "Celestial Capitalist: Sprite Refresh Just did a big ol’ redo of all the placeholder sprite art + redid inventory grid to have five columns instead of ten so those 32*32 textures don’t go to waste. Also, this definitely took longer than an hour and a half. Unfortunately, I can’t log Krita. Anyw check out @idi0cy , he’s doing the code for this and original concept."}]...
|
Title: Celestial Capitalist by @Ratseer | Stardanc Title: Celestial Capitalist by @Ratseer | Stardance
Devlogs:
Celestial Capitalist: Sprite Refresh Just did a big ol’ redo of all the placeholder sprite art + redid inventory grid to have five columns instead of ten so those 32*32 textures don’t go to waste. Also, this definitely took longer than an hour and a half. Unfortunately, I can’t log Krita. Anyw check out @idi0cy , he’s doing the code for this and original concept.
Celestial Capitalist Dynamic Background Background now changes based on night cycle. Damn this was a pain - mostly because the issue wasn’t even the programming it was the frickin math. I hate math. I hate math so much. Also godot what the hell do you mean ‘70 is out of bounds of 70’ i’m dying The following showcase vid has time passing so quickly because I added a keybind to add hours to the clock for debug purposes. Also my laptop’s a bit laggy lmao Still needs polish, but hey, it works.
Celestial Capitalist: The Ledger Bit of an annoyance to make, but it works :D This is where you can keep track of your transactions and balance, as well as a hub for future financial stats that have yet to be implemented. Did a bunch of tomfoolery with containers and control nodes and all that weird stuff trying to make the collapsible boxes work - ended up just changing minimum sizes myself instead of bothering with the FoldableContainers. Other stuff In terms of backend stuff I guess you’d call it, I made some changes to the project settings for window scaling + added some font settings so we can apply them everywhere easier, as well as a button template script that won’t actually do anything. That’s for the tooltips on the daily buttons in the legder - for later!
Celestial Capitalist: Daily Monetaries + Tooltips Added a general purpose tooltip scene for instancing with the _make_custom_tooltip() method. That was a pain to get right - I spent a good half hour trying to figure out why it wouldn’t work before realizing the root had to be a container node. Control nodes stink and I hate them. In practical terms, I’ve added a method to append daily costs and profits to the ledger interface. Nothing actually uses it yet, so the values in here are from a debug keybind I was using.
Celestial Capitalist: Randomized Dialogue little mini update while i do more stuff This and 15 more stupid lines per each dialogue option
Celestial Capitalist: Inventory Revamp + Misc Fixes Revamped the inventory item inspector and made it prettier, as seen below Also did various other internal fixes with code and stuff such as renaming a button, adding lines to the fake injury game, and item flavour text edit: just noticed the screenshot is horrendous so i replaced it edit two: nvm apparently stardance just crops it 😭 wtf
Celestial Capitalist: Randomized Stranger Names Just made random names for all the strangers - which was a damn pain because @idi0cy , despite his all-knowing-ness, decided to name the index of the button icons with the stranger sprites ‘index’, then proceeded to reference those same values in a different function under the name ‘place’ whilst the argument ‘index’ in said function was something entirely different. This confused me for at least an hour. You will also notice that we have a new merry little cast of sprites, for those strangers. I tried to make them look as dystopian as possible. Think it worked. Would probably have gone for more distorted faces too if I had the time. As you can see below, I spent way too long getting a massive list of names - mostly from Orteil’s RandomGen, and then a few references to media I like. We’ll definitely be adding more.
Celestial Capitalist: Scavenging WOW that took a while! Probably should have posted some breadcrumbs midway but whatever. The SCAVENGING FEATURE IS COMPLETE. This is basically loot box opening simulator + squid game dalgona cookies. This will be your main way to get items to sell (therefore earn money). The value of each item is based off that quality value we’ve been showing off, as well as the item’s base value and your minigame performance. Loot even scales as you gain more money (which I do in the video with a debug keybind), allowing you to go from looting trash cans to looting discarded packages and dropped briefcases. To spice up the loot, I’ve also added WAYYY too many items (yes, I did the textures myself). The hardest part of this whole thing was making a proper weighted loot system. That was a pain, because I could never quite fine tune the results to what I wanted - still really haven’t, but it works well enough. The other hardest part was me, as a relative beginner to programming, discovering that assigning a new variable to an array in fact synced both arrays. Godot what the hell is duplicate_deep() 😭 Celestial Capitalist in collaboration with @idi0cy
The Market I’ve added a shop system! At exactly 00:00 every day the Market tab refreshes with a new market stall, with randomly generated name, products, and an owner profile for the funnies. This system isn’t really for you to buy and flip prices in the get money tab - this is supposed to drag money out of you when you’re starving for food and also purchase upgrades for your run. Said upgrades have not yet been implemented, but - Using Items Items that can be used now pop up a use item button in the inventory. Monetary items now return money to your ledger and food items now add to your vitals - which hasn’t been implemented yet. We’ll also be adding more items and usages - such as those aforementioned upgrades. Celestial Capitalist in collaboration with @idi0cy
The Great Organization So while @idi0cy over there has been coding new stuff, I’ve been over here cleaning after his mess. I’m currently in the process of adding documentation comments to everything so we know what the hell anything is after we code it. Suffice to say, it’s not going that great but it’s coming along. This man literally wrote a variable called lengthOfTimeUnitThingHi_rAt_D_ontWeLovenamingConVentIons just to piss me off. Another part of the organization effort is adding these #region and #endregion comments everywhere so we can close and expand large sections of code. The Great Centralization I’ve also been working on centralizing certain things. I’ve added a new InventoryHelper class, which contains methods used for inventories such as the market stalls, loot boxes, the actual inventory, and the pick to sell menu. Attached below is the documentation comments for the Resources class containing pretty much every texture, dialogue line, name, and utility function and now a lot of the scripts extend it.
Vitals System Added a health, hydration, and satiation system. Satiation controls max health, and if your hydration hits 0, you begin taking damage over time. When you take damage or your health is low, your screen has a damage overlay. Celestial Capitalist in collaboration with @idi0cy .
Revamped Tutorial Gave the new tutorial put in place by @idi0cy some flair. It now also contains a text box for you to pick a save name, which will automatically show up in the ledger where the account name thing is. It may be the save name, but we’re not going to be implementing saves before shipping as we’re lazy and have things to do. The revamp has also made the game through anywhere from 1-103 data.tree is null errors but it ain’t crashing and I’m done solving that crap. Two Bowls of Chili We now have the two bowls of chili as per request by a friend of @idi0cy . New Item Mechanics I’ve changed the item system so that they can take on far more data than just an item type. They now have an additionalProperties , which is a Dictionary that is meant to take a string key and value. This allows us to store pretty much any data we want in there. This was done so that I could make items give temporary skill buffs with ease, as a lot of them are currently only good for selling. So now, you can use a pencil and gain a minute of +1 dexterity (which helps in the fake injury and stealth steal minigames), among other buffs. Miscellaneous fixes We are nearing release, and so we’ve begun to review a lot of stuff and make balancing/bugfixing changes. Deathscreen now returns you to title screen. Made perception affect scavenge quality and charisma affect market quality Added a bajillion tooltips to explain stuff Haggle difficulty has been made easier Fixed an issue in scavenge that made all the loot 0 quality Made event popups stack Made it so other windows can’t open if a scavenge game is happening Celestial Capitalist , dubiously developed by @Ratseer and @idi0cy .
Celestial Capitalist - Beta Complete! After four hours of horrifically annoying bugfixing with @idi0cy , CC is ship ready! We did a lot of misc fixes. There was some really stupid code we left in such as ‘check if x > y’ and consecutively in that one ‘check if x < y’. We’re geniuses. Anyway, we just added a sound slider that doesn’t work outside the editor 😭 . There were also a bunch of balancing issues to fix, such as me labelling a bottle of soy sauce as 45 dollars. But it’s done, oh lord it’s done. Check it out! https://ratseerofrattesse.itch.io/celestial-capitalist
Ships:
Celestial Capitalist is a simulation game where the player simultaneously builds and ascends the corporate ladder from the bottom of the street to the self-built throne at the top of the cosmos. Beg your way from homelessness, run a lemonade stand, scam grandmas on the internet, start a cult, play union-buster tower defence, and generally just have a grand stupid time while the world slowly bends to your will. Currently on FIRST BETA! Contains the slightly unpolished first stage, Rock Bottom, with basic progression, a bunch of minigames and… style!. You’re homeless and you needa earn money to get out of it. Also you can’t save yet. And the volume is broken. WE’LL FIX IT ONE DAY. Controls are all point and clicked + arrow keys for the Fake Injury minigame. Windows only for the moment - will support more soon. Unzip and run ccap1.0exe. By @idi0cy and RatseerOfRattesse Made for Hack Club Stardance. Tribulations Coding is notorious for producing the kind of mistakes one looks through for an entire night and solves in a second of effort. We had a lot of that. The amount of stupid crap on the way here is immense and we’ve still not cleared out all of it. But, @idi0cy and I hope you will enjoy what we’ve made, cuz we sure did enjoy making it. Celestial Capitalist by @idi0cy and @Ratseer ....
|
1792853679.015367
|
1792940079.015367
|
|
34098
|
Rust 6502 by @Wirenux | Stardance
|
Wirenux
|
3
|
74.0
|
1354
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:19:09Z", "hours": 7.0, "multiplier": 18.98, "payout": 127, "blessing": "neutral", "text": "Rust 6502 A MOS 6502 emulator TUI with a lot of features Before reading this Ship you should take a look at Ship 1 & Ship 2 What did you add ? Here is a list of everything that I have added since the last Ship Features Breakpoints : press “F” to set a breakpoint at any address, the emulator halts the moment PC reaches it Watchpoints : same idea, but for memory Conditional Breakpoints : halt execution when a register (AC, XR, YR, SP) meets a comparison (!=, ==, >=, <=, >, <) against a target value Step Back : press “B” to rewind execution one instruction at a time, restoring the CPU and memory exactly as they were before Random Number Generator : a memory-mapped register at $BFF3 that returns a random byte from the host PC on every read, so ASM programs can have real random number Keybind Panel : a popup listing every keyboard shortcut and control, and removed the old footer keybind list to make room for it Demo Program Snake : updated to pull apple placement from the new RNG instead of the old pseudo random method ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What was challenging ? Wiring the conditional breakpoint into the run loop without breaking the existing breakpoint/watchpoint checks was harder than I though. Also getting a dropdown-style menu to choose the operator working in Ratatui was tought since there’s no native dropdown widget. So I ended up building a little spinner (▲ value ▼) that cycles through the operators instead ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What are you proud of ? I’m proud that my emulator now has real debugging tools like : breakpoints, watchpoints, conditional breakpoints, and step-back. What should people know so they can test your project ? A Nerd Font is recommended in your terminal for a better rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! Things to try Load snake_demo.bin and play :D Set a breakpoint on an address inside a demo program (check the keybind panel for the shortcut!) and watch execution halt exactly there Try a conditional breakpoint : for example, halt whenever XR == 0F and watch it stop right when the register hits that value Press “B” to step backward and rewind the CPU state instruction by instruction Press the keybind panel shortcut to see the full list of controls", "repo": "https://github.com/wirenux/Rust-6502", "demo": "https://crates.io/crates/rust6502"}, {"ship_num": 2, "ts": "2026-08-08T15:59:06Z", "hours": 28.0, "multiplier": 17.86, "payout": 504, "blessing": "neutral", "text": "=== Rust 6502 === A MOS 6502 emulator TUI with a lot of features ============================================ Before reading this Ship you should take a look at Ship #1 == What did you add ? == Here is a list of everything that I have added since the last Ship = Features = Serial Monitor : you connect to localhost:8080 using netcat. Useful for the Apple 1 OS or for debugging with text. The monitor can be used to display text but also to send text like a keyboard (useful for the Apple 1 OS) PS/2 Keyboard : a full PS/2 keyboard emulation (used in Snake) Use the UI with a Mouse: On the Home Menu and in the Emulator you can click on button, toggle, scroll, etc… Interrupt : IRQ & NMI Tips in the Settings Panel Modify speed with Hz & MHz (like a real 6502 chip) Reset Vector: The emulator will look at $FFFC & $FFFD to find the start address of the program (when the Force Address toggle is off) Set PC Address: keyboard shortcut to change the position of the PC (Program Counter) = Demo Program = Apple 1 OS (Wozmon) : I have modified the orginal Apple 1 code to fit my emulator, like Serial Monitor address, Keyboard etc… Snake : Just the Snake game ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ Keyboard Demo: Print every key press on the screen using a custom font Serial Monitor Demo: Show how the Serial Monitor works == What was challenging ? == The most challenging part of this 2nd ship was creating a Serial Monitor that works via a local port, and making a PS/2 Keyboard emulation. And of course, modifying the Apple 1 OS to make it work on this emulator ! (I was having a lot of bugs, so I rewrite a big part of the OS) ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ == What are you proud of ? == I am really proud of my self for the implementation of the Serial monitor that run on different CPU thread than the emulator itself and the fact that it work via the local network. And beyond everything the fact that my emulator can run : games, utility and the Apple 1 OS !!! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io. == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: ================== cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load snake_demo.bin to play at a classic game using the 32x32 screen and the PS/2 keyboard emulation Load wozmon.bin to use the Apple 1 OS ! You should see the documentation related to Wozmon : https://github.com/wirenux/Rust-6502/blob/main/AppleI.md Load keyboard_demo.bin to see every key you press show up on the 32x32 screen using a custom font The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!", "repo": "https://github.com/wirenux/Rust-6502", "demo": "https://crates.io/crates/rust6502"}, {"ship_num": 3, "ts": "2026-07-23T16:03:44Z", "hours": 39.0, "multiplier": 19.83, "payout": 723, "blessing": "neutral", "text": "=== Rust 6502 === A legendary 8-bit CPU right in your terminal! 🦀 ᕙ( •̀ ᗜ •́ )ᕗ == What did you make ? == I built a fully functional emulator for the MOS 6502 (the microprocessor that powered the Apple II, Commodre 64, and the NES) from scratch using Rust ! Instead of a standard graphical window, I built a Terminal User Interface (TUI) using Ratatui. Here is what’s inside: Full CPU Emulation: Execute 6502 machine code with live register (AC, XR, YR, SP) and status flag tracking Virtual Screen: A 32x32 memory-mapped display ($0200-$05FF) rendered right in the terminal using Unicode Half-Block and a custom 16-color palette Live Disassembler & Hex Viewer: Watch the RAM change in real-time and see the raw binary machine code translated back into readable assembly instructions on the fly Built-in File Browser: A visual menu with Nerd Font icons to navigate your system and load compiled .bin ROMs Available on crates.io : You can download it via Cargo == What was challenging ? == The Disassembler: Writing a disassembler that parses raw .bin files is tricky because they don’t have headers. I ran into a massive issue where my image data (using the color byte $0A) was being read by the disassembler as infinite ASL A (Shift Left) instructions! I had to engineer a way for the disassembler to properly halt when it hit a BRK instruction so it wouldn’t try to execute my pixel art. Terminal UI Architecture: Designing a dashboard (hex grids, scrolling stacks, changing colors) required a really solid state-management architecture to keep the UI smooth and responsive while the CPU loop spins at thousands of instructions per second. == What are you proud of ? == I am proud of using this project to learn Rust in a fun way! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io, meaning anyone can install and run my emulator with a single command == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load hackclub_logo_demo.bin to see the terminal render a 32x32 pixel art logo using 6502 assembly Load rainbow_demo.bin to watch a shifting color gradient animation directly manipulating video memory. Load helloworld_demo.bin to watch a centered Hello world message The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!", "repo": "https://github.com/wirenux/Rust-6502", "demo": "https://crates.io/crates/rust6502"}]...
|
[{"post_id": 53188, "ts": "202 [{"post_id": 53188, "ts": "2026-08-23T17:01:36Z", "hours": 1.3231, "text": "+ 1h20 So… this might be the last devlog for this project. I just released the v1.3.0 . And here is what I added since the last devlog : A RNG documentation Snake now use a real RNG I recorded the Asciinema .cast file Update the python tools to generate memory diagrams Update the Memory documentation So next step is the 3rd Ship"}, {"post_id": 52497, "ts": "2026-08-22T17:18:02Z", "hours": 1.6328, "text": "+ 1h35 ! This might be the last feature I add to Rust 6502. Since I ran out of idea and for me the project seem to be finished. Anyway, here are the things I added : A RNG address : $BFF3 . The program just read from it and get a random value via the Host computer ( 4feb4d8 ) A conditional breakpoint : A top bar in the Breakpoint popup to add a conditional breakpoint (like : If AC != 0F -> Break) ( 1b7bc81 )"}, {"post_id": 51750, "ts": "2026-08-21T16:03:37Z", "hours": 1.4139, "text": "+1h 25 min ! Since the last time I have added the keybind panel. Where there is… all the keybinds I also remove the keybind on the footer to only get Keybind “K”"}, {"post_id": 48226, "ts": "2026-08-16T15:08:41Z", "hours": 0.8658, "text": "Okay so… I have added the Breakpoint and the Watchpoint . When you set the breakpoint to $C00C the CPU will stop before running the instruction at $C00C. The watchpoint stop if a value at an address at been changed."}, {"post_id": 47602, "ts": "2026-08-15T16:26:45Z", "hours": 0.8536, "text": "I added the step-back function. It work by pressing “B”, it’s just rewinding the emulator up to 500 opcode. Only work when moving in step-by-step mode (with Enter)"}, {"post_id": 45822, "ts": "2026-08-12T15:29:34Z", "hours": 0.5942, "text": "v1.2.0 Here are the changes attached to this release : fix: a bug on windows, with ghost key press ( c3c6009 ) add: a Scroll bar on the file explorer ( 94b2abb )"}, {"post_id": 43337, "ts": "2026-08-08T15:14:19Z", "hours": 0.2753, "text": "YAY Now rust6502 Version 1.1.0 is released ! On github with all the demo file and on crates.io / cargo !"}, {"post_id": 43315, "ts": "2026-08-08T14:47:20Z", "hours": 2.8169, "text": "Here is what I have done in 2h 50 . First I wrote a lot of docs, for the keyboard, Serial Monitor, Wozmon etc… This was so boring . But at least now I will be ready to ship soon ! Second, I have fixed the Wozmon list content of address. Before when you was doing FF00.FFFF it was just showing the byte at $FF00 and the byte at $FFFF now it list all the byte between !"}, {"post_id": 43203, "ts": "2026-08-08T10:26:46Z", "hours": 0.2706, "text": "New little update ! I have created a Python tools to create memory map for my emulator docs !"}, {"post_id": 43187, "ts": "2026-08-08T09:47:21Z", "hours": 0.5125, "text": "Little update ! I have added tips in the settings menu. The change randomly using the UNIX Epoch value"}, {"post_id": 42870, "ts": "2026-08-07T20:34:53Z", "hours": 0.6192, "text": "Little update, I added a Program Counter (PC) input to move it in when running a program. I also added a cursor for the start input on the Home Screen !"}, {"post_id": 42844, "ts": "2026-08-07T19:42:37Z", "hours": 1.9044, "text": "After 1h50 I have added a Snake demo program that use the PS/2 keyboard !!! I also make a demo program to test the Serial Monitor using netcat nc"}, {"post_id": 42206, "ts": "2026-08-06T20:22:37Z", "hours": 3.5697, "text": "Wow, just WOW. I have added a serial monitor, and Apple 1 OS Serial Monitor Here is the way the monitor work, you load character to $BFE0 like this : lda #'A' sta $BFE0 Then you run the program in the emulator like normal, then you open another terminal and you connect to localhost port 8080 using netcat nc like this : nc 127.0.0.1 8080 And now if you already launch the program, when you connect to localhost ( 127.0.0.1 is localhost) you will see a A in your terminal ! You can also type in the serial monitor ! Here is a code that show the number of characters typed by using the pixels in the 32x32 screen ! start: ldx #$FF txs ldx #$00 main_loop: bit $BFE1 bpl main_loop lda $BFE0 sta $BFE0 lda #WHITE_COLOR sta $0200, x inx jmp main_loop Apple 1 This is a very damn big part. To be short, I have recreated the Apple 1 OS (Wozmon) created by Steve Wozniak. In short I took the code given in the Apple 1 User Manual, modify it to use the Serial Monitor and Keyboard, fix some issue with the prompt. I can even run the classic program from the manual to print all the available characters. With Wozmon you can also write and read data from the memory so you can show some pixel on the screen ! Here is the program running and the serial monitor."}, {"post_id": 41544, "ts": "2026-08-05T20:29:50Z", "hours": 4.6692, "text": "Okay soo….. it’s been 4 hours and 35 minutes . I have done so much and not that much at the same time (I know it’s weird ) I have added a demo program who print the pressed character ! I have spend 2 hours on a little bug but yeah now it’s working ! So with the program I drew all the key on a PS/2 keyboard . I also fixed some little inattention problem in my code. I also created a little python script to help me convert .png drawing into raw .inc value ! ( Did you find the secret phrase ?)"}, {"post_id": 40862, "ts": "2026-08-04T17:37:24Z", "hours": 0.6206, "text": "Now there is all the number & lower case letter (a-z) & and the Space bar icon !"}, {"post_id": 40720, "ts": "2026-08-04T13:13:58Z", "hours": 0.6008, "text": "I want to create a ASM program who print the pressed key to the screen, and for that I need to create the font/image for each key. There is ~100 key . So here is the first one !"}, {"post_id": 40191, "ts": "2026-08-03T16:23:25Z", "hours": 2.2289, "text": "Wow that was… difficult . But now there is a PS/2 keyboard Emulation ! The I/O port is map on $BFF0-$BBF2. The PS/2 keyboard work with 3 addresses $BFF0 : KBD_DATA $BFF1 : KBD_STATUS $BFF2 : KBD_ACK To activate to keyboard in the emulator you can press on the screen container and to exit it just click anywhere else ! (The number you can see in the memory viewer at $0000 is the code from different key !) Maybe next time I will create a program to see each letter"}, {"post_id": 39675, "ts": "2026-08-02T20:07:26Z", "hours": 1.4747, "text": "YAY ! Now there is mouse control on the home screen, this mean that you can click every where to change the focus and in the file explorer you can double-click to open a folder and double-click to open a file directly, you can also with a simple click enable or disable Force Address Mode"}, {"post_id": 38319, "ts": "2026-07-31T17:15:48Z", "hours": 8.67, "text": "Ok so… it’s been 8h40 . I have done a lot (I mean it’s logic it’s been 8h and 40 minutes) In time order I have done : Replace self.pc + 1 to self.pc.wrapping_add(1) so it’s like on the real 6502 if the current PC is $FFFF and you add 1 it will be $0000 . Added a panic hook, before when the program was crashing (for a bad ASM program by example) the terminal was still in RAW mode (so if you click, move the mouse etc… it will print a bunch of garbage number) but now it exit the raw mode in a clean way ! Remove unused import Change the start of the Stack Pointer to $1FFF Added a memory reset function Write a bunch of test programs Replace IPS (instruction per seconds) by Hz and MHz like in real life (so i’ve adapted the UI for the change) Now the disassembler disassemble the whole program (neat right ? ) using .len() . (yes before it was an hard-coded number Optimize the screen render method. Before I was refreshing the screen even if nothings has been changed, now i check if somethings have been changed to update the screen Added address of each “quarter” of the screen in the screen documentation Fixed foreground and background color of the Frequency selector (on the Home Screen) Write a program to test IRQ and NMI Keybinds the I and N key to IRQ and NMI Changed the Hello World program to be rainbow The emulator will look by it self to the reset vector ( $FFFC and $FFFD ) to set the PC at the correct address Added a force address toggle to… force the the start address When the force addr toggle is off you can’t modify the start Addr and it’s darker Every file or folder who start by a . (dot) is not shown in the file selector Moved the hackclub logo raw binary data to a .inc file Added a self crashing test program (Next time I might add a PS/2 keyboard emulation… )"}, {"post_id": 33529, "ts": "2026-07-23T15:42:24Z", "hours": 0.2847, "text": "Last devlogs before Ship #1 Wow 37h of work. I have made an Asciinema video, Youtube video and update the README.md Wish me luck !"}, {"post_id": 33447, "ts": "2026-07-23T12:32:34Z", "hours": 0.8183, "text": "I have been writing a LOT of documentation on how to create a 6502 ASM program, Screen documentation. And the project is now published in version 1.0.0 on Github and Cargo https://github.com/wirenux/Rust-6502 https://crates.io/crates/rust6502"}, {"post_id": 33416, "ts": "2026-07-23T10:42:45Z", "hours": 0.8144, "text": "I have added a new program called HackClub Logo First, I have draw the hackclub logo in aseprite with a 32x32 pixel file using my custom color palette. Second, I have created a simple python script who take a .png in input and output ASM raw data for the image (using my color palette). Third, I have create a simple ASM program to print the logo on the screen !"}, {"post_id": 33164, "ts": "2026-07-22T20:28:05Z", "hours": 0.3019, "text": "WOW 35H 🎉 I have added a file : DemoProgram.md to show all the demo program"}, {"post_id": 33159, "ts": "2026-07-22T20:10:35Z", "hours": 3.8867, "text": "WOW 4h 😅 I have done the full README.md, documentation about the screen, color palette and fix some little bugs."}, {"post_id": 32560, "ts": "2026-07-21T20:27:52Z", "hours": 0.6103, "text": "Little bug fix: Now when we select a file in the Home File Selector the filename appear in the Opcode container. I have also reorganize the tui.rs code !"}, {"post_id": 32540, "ts": "2026-07-21T19:47:40Z", "hours": 0.3697, "text": "WOW already 30 hours ?! 😅 I now have added the home logo ! I also changed the step for the speed selection on Home Menu from 500 to 100 for each step"}, {"post_id": 32522, "ts": "2026-07-21T19:16:08Z", "hours": 2.0906, "text": "Wow that was damn hard 😭. But the Home Menu is finally here 🎉. There is the logo (might change). The select file container with full navigation (folder, parent directory, file), Icon (require a Nerd Font) and Colors. The selected file path update in real time with the absolute path of the file. The start address automatically change if the file selected is a demo file (end with “_demo.bin”) to $C000. The start address it editable with Alpha numeric character (hexadecimal). And the emulation speed work ! There is control on the footer bar."}, {"post_id": 32416, "ts": "2026-07-21T16:21:09Z", "hours": 1.2358, "text": "New demo program… HelloWorld_demo ! Print Hello World ! centered on the screen all in pure 6502 Assembly. I also modified the way the disassembler work, now even if there is a BRK it will continue to read the file until the end. The ASM part was really really haaarrddd."}, {"post_id": 32338, "ts": "2026-07-21T13:23:35Z", "hours": 0.4014, "text": "Now if I press R I can reset the program. I also modify the footer bar"}, {"post_id": 32323, "ts": "2026-07-21T12:48:13Z", "hours": 0.5539, "text": "I have update the color from word to RGB value so if a different terminal theme is applied the color are the same. I also added a footer bar with the keybinds."}, {"post_id": 32296, "ts": "2026-07-21T11:32:52Z", "hours": 1.4164, "text": "New panel 🥁🥁🥁…. the ✨ SETTINGS ✨ ! In this panel there is a smaller version of the Logo and the settings to modify the speed of the CPU. There is also the link to the github repo and stardance project"}, {"post_id": 31921, "ts": "2026-07-20T18:22:48Z", "hours": 0.2858, "text": "Now the name of the file currently running is in the title. I also finished the rainbow program to fill the whole screen."}, {"post_id": 31910, "ts": "2026-07-20T18:01:58Z", "hours": 1.7158, "text": "New feature 🥁🥁🥁 ✨ THE SCREEN ✨ This was very very hard. The screen use the Unicode half-block character “▀”, to write to the screen you just need to send value like this : LDA #$02 ; load \"02\" into the accumulator STA $0200 ; store it at memory address $0200 (the 1st pixel) Here the 02 is the color RED. Here is the color palette: fn palette_color ( index : u8 ) -> Color { match index & 0x0F { 0 => Color :: Black , 1 => Color :: White , 2 => Color :: Red , 3 => Color :: Cyan , 4 => Color :: Magenta , 5 => Color :: Green , 6 => Color :: Blue , 7 => Color :: Yellow , 8 => Color :: Rgb ( 255 , 165 , 0 ), // Orange 9 => Color :: Rgb ( 153 , 76 , 0 ), // Brown 10 => Color :: DarkGray , 11 => Color :: Gray , 12 => Color :: LightRed , 13 => Color :: LightBlue , 14 => Color :: LightGreen , _ => Color :: Reset , // 15 transparent } } The color may vary between terminal theme. I also had created an ASM program to print a rainbow on the 1st quarter of the screen. I also added the feature that when a BRK instruction is hit the program turn to HALT mode (in the UI). I also added the indentation system to BEQ, BNE, BCC, BCS, BMI, BPL, BVC, BVS. I also added a new way of calculating the speed of the program."}, {"post_id": 31806, "ts": "2026-07-20T14:10:36Z", "hours": 0.4183, "text": "Choosing between a variety of logo (2 first screen shot are in Apple Terminal the last is in ghostty with a Catpuccin Mocha theme)"}, {"post_id": 31786, "ts": "2026-07-20T13:41:37Z", "hours": 0.9217, "text": "I have added a top bar in the memory container with the last part of the address (to be more easy to read). I also fixed all the scroll bar from scrolling outside the container and just see nothings"}, {"post_id": 31761, "ts": "2026-07-20T12:25:55Z", "hours": 0.3808, "text": "I have fixed the cursor in the Stack Container to scroll automaticly when needed and when running. I also optimised the code !"}, {"post_id": 31735, "ts": "2026-07-20T11:29:19Z", "hours": 1.0997, "text": "A lot has been going on ! I have added the Memory Viewer, Scroll bar to the Stack Viewer and Memory Viewer (work with the 🥁…. SCROLL WHEEL !). I also reduce the space taken by the opcode list so we can see the memory viewer !"}, {"post_id": 31230, "ts": "2026-07-19T13:48:00Z", "hours": 0.4708, "text": "I have added a Stack Viewer on the left ! The container scroll it self when the “cursor”/current position of the Stack Pointer (SP). I also have fix the text for the SP in the register container"}, {"post_id": 30873, "ts": "2026-07-18T20:31:08Z", "hours": 0.5025, "text": "I have tried to implement multi-threading but realize that it’s not worth it for a simple emulator like this one."}, {"post_id": 30853, "ts": "2026-07-18T20:00:15Z", "hours": 0.4039, "text": "I have clean the code a little bit 🧹 and added a RUN or PAUSED indicator :"}, {"post_id": 30789, "ts": "2026-07-18T17:52:51Z", "hours": 1.2636, "text": "The UI is going forward one step after another ! I have changed a some little like the place where is the Flag Container, now it’s on the left side. And I also have added a LOT a things like: Register Container (under the Flag Container) Now when there is a JMP (or any type or jump like RST, etc…) the code indent it self Up and Down key move the cursor 🥁…. ✨UP & DOWN ✨ New color for the ADDR in the Opcode container Things I have removed: BYTES section in the Opcode container because I don’t think it’s really useful"}, {"post_id": 30680, "ts": "2026-07-18T13:37:25Z", "hours": 0.2903, "text": "YAY now the Flags can be shown ! Green Bold when active and Dark Gray classic when not"}, {"post_id": 30669, "ts": "2026-07-18T13:18:54Z", "hours": 0.5522, "text": "I have made a program to disassemble the program so the code could be shown in the TUI. And it work !"}, {"post_id": 30661, "ts": "2026-07-18T12:46:07Z", "hours": 1.1003, "text": "I am now making the TUI part of this emulator ! I am using Ratatui to make the TUI. This mean I have to change all the printing part of my existing program"}, {"post_id": 30627, "ts": "2026-07-18T10:52:26Z", "hours": 0.465, "text": "YAY Now EVERY opcode and EVERY addressing mode are implemented 🎉 (wow 1478 lines of pure opcodes)"}, {"post_id": 30355, "ts": "2026-07-17T20:40:38Z", "hours": 0.2844, "text": "I have fix some little print in 3-4 instruction and the IRQ function"}, {"post_id": 30342, "ts": "2026-07-17T20:21:23Z", "hours": 1.0506, "text": "I’m being closer and closer of getting all opcode and all Addressing mode implemented Here are the list of opcode I have implemented and there Addressing Mode: ADC Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y AND Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y CMP Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y EOR Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y I also fixed the CLD instruction. I was doing a : cpu .sr | = ! CPU :: DECIMAL_FLAG ; but the right one was this: cpu .sr &= ! CPU :: DECIMAL_FLAG ;"}, {"post_id": 29763, "ts": "2026-07-16T21:06:40Z", "hours": 0.9353, "text": "New opcode time ! LDY ZeroPageX STA ZeroPageX AbsoluteY IndirectX IndirectY STX ZeroPageY Absolute STY ZeroPageX Absolute"}, {"post_id": 29468, "ts": "2026-07-16T13:13:24Z", "hours": 1.3792, "text": "Add interruption with NMI + IRQ. Add option to the user to start at a specific address"}, {"post_id": 29172, "ts": "2026-07-15T21:55:25Z", "hours": 0.4572, "text": "New opcode STA Absolute X"}, {"post_id": 29083, "ts": "2026-07-15T18:53:21Z", "hours": 0.73, "text": "I’ve just passed 40min to fix an interruption problem to final look back and see that my original code what working perfectly fine 😭 . I’ve also change my build tools to ca65 + ld65"}, {"post_id": 29035, "ts": "2026-07-15T18:04:18Z", "hours": 0.5122, "text": "YAY I have added a BUNCH of new Opcodes : BCS BCC BPL BIT with ZeroPage & Absolute BMI BVC BVS"}, {"post_id": 29003, "ts": "2026-07-15T17:27:28Z", "hours": 0.6717, "text": "New opcode TXS (transfer X to stack pointer) TSX (transfer stack pointer to X) ldx_absolute_Y lda_indirect_x lda_indirect_y ldx_zeropage_y New Addressing Mode: AbsoluteY ZeroPageY IndirectX IndirectY"}, {"post_id": 28387, "ts": "2026-07-14T16:45:14Z", "hours": 0.4636, "text": "✨ NEW OPCODE ✨ : PHP (Push Processor Status: push current value of all the flag to the stack) PLP (Pull Processor Status: pull current value of all the flag to the stack) But I have also add a memory dump with page (at the end of a program) to debug ! (1st screenshot) and i also add a fixed (address) memory viewer when running (2nd screenshot)"}, {"post_id": 28368, "ts": "2026-07-14T16:14:05Z", "hours": 0.3953, "text": "There now is 4 new opcode: ROR ROL ROR Memory ROL Memory"}, {"post_id": 28355, "ts": "2026-07-14T15:47:50Z", "hours": 0.7244, "text": "New Opcode : PLA (Pull Accumulator) PHA (Push Accumulator) ASL memory LSR memory"}, {"post_id": 27919, "ts": "2026-07-13T20:54:45Z", "hours": 0.3947, "text": "The now is new opcode ! : EOR ORA AND LDA (ZeroPageX) And some new AddressingMode : ZeroPageX AbsoluteX"}, {"post_id": 27728, "ts": "2026-07-13T15:22:17Z", "hours": 0.7697, "text": "Now there is a pop_stack function who return the top value of the stack (Last In First Out). I’ve also added those opcode : JSR RST And made this test code :"}, {"post_id": 27647, "ts": "2026-07-13T12:27:38Z", "hours": 1.7306, "text": "I’ve done a LOT of work. Added Opcodes: BEQ BNE SBC Immediate + Zeropage I’ve also done a lot of refractorisation. Code before : match opcode { 0x18 => { self .sr &= ! CPU :: CARRY_FLAG ; self .set_instr ( format! ( \"{:02X}\" , opcode ), \"CLC\" .to_string (), 2 ); }, // ... } VS now : match opcode { 0x18 => self .clc ( opcode ), // ... } So now every opcode have his own function !"}, {"post_id": 27367, "ts": "2026-07-12T21:19:13Z", "hours": 0.5197, "text": "I’ve added those instruction: ADC (Add with Carry) CLC (Clear Carry Flag) SEC (Set Carry Flag) I’ve also made this little ASM 6502 program to test those opcode .org $8000 START: SEC ; to test CLC LDA #$FF ; A = 255 CLC ; Clear Carry Flag before addition ADC #$02 ; 255 + 2 = 1, Carry is now 1 (0x01FF + 0x0002 = 0x0201) STA $20 ; Store Low Byte result (01) at $20 LDA #$00 ; Load 0 for the high byte ADC #$00 ; 0 + 0 + 1 (Carry from previous instruction) = 1 STA $21 ; Store High Byte result (01) at $21 ; SEC use SEC ; Carry = 1 LDA #$01 ; A = 1 ADC #$00 ; 1 + 0 + 1 (Carry) = 2 BRK And it work just fine !"}, {"post_id": 27343, "ts": "2026-07-12T20:41:04Z", "hours": 0.885, "text": "I’ve added a bunch of opcode like : STA, STX, STY (Zero Page, Absolute) LDX, LDY (Immediate, Zero Page, Absolute) JMP (Absolute), JMP (Indirect) (the screen shot is a new program that i’ve made and test on virtual 6502 and my project)"}, {"post_id": 27311, "ts": "2026-07-12T19:40:23Z", "hours": 0.3989, "text": "I’ve added a new UI and AddressingMode"}, {"post_id": 27261, "ts": "2026-07-12T17:42:19Z", "hours": 4.3097, "text": "Hi ! Right now in my project I have added : Bus with ram read & write function load from file function CPU All registry (a, x, y, sp, pc, sr) reset cpu function update Z & N flag function clock_tick with those opcode in it : BRK; DEY; TXA; TYA; TAY; LDA; TAX; INY; DEX; INX; NOP (1st screenshot is official emulator 2nd is mine)"}]...
|
Title: Rust 6502 by @Wirenux | Stardance
Devlogs: Title: Rust 6502 by @Wirenux | Stardance
Devlogs:
Hi ! Right now in my project I have added : Bus with ram read & write function load from file function CPU All registry (a, x, y, sp, pc, sr) reset cpu function update Z & N flag function clock_tick with those opcode in it : BRK; DEY; TXA; TYA; TAY; LDA; TAX; INY; DEX; INX; NOP (1st screenshot is official emulator 2nd is mine)
I’ve added a new UI and AddressingMode
I’ve added a bunch of opcode like : STA, STX, STY (Zero Page, Absolute) LDX, LDY (Immediate, Zero Page, Absolute) JMP (Absolute), JMP (Indirect) (the screen shot is a new program that i’ve made and test on virtual 6502 and my project)
I’ve added those instruction: ADC (Add with Carry) CLC (Clear Carry Flag) SEC (Set Carry Flag) I’ve also made this little ASM 6502 program to test those opcode .org $8000 START: SEC ; to test CLC LDA #$FF ; A = 255 CLC ; Clear Carry Flag before addition ADC #$02 ; 255 + 2 = 1, Carry is now 1 (0x01FF + 0x0002 = 0x0201) STA $20 ; Store Low Byte result (01) at $20 LDA #$00 ; Load 0 for the high byte ADC #$00 ; 0 + 0 + 1 (Carry from previous instruction) = 1 STA $21 ; Store High Byte result (01) at $21 ; SEC use SEC ; Carry = 1 LDA #$01 ; A = 1 ADC #$00 ; 1 + 0 + 1 (Carry) = 2 BRK And it work just fine !
I’ve done a LOT of work. Added Opcodes: BEQ BNE SBC Immediate + Zeropage I’ve also done a lot of refractorisation. Code before : match opcode { 0x18 => { self .sr &= ! CPU :: CARRY_FLAG ; self .set_instr ( format! ( "{:02X}" , opcode ), "CLC" .to_string (), 2 ); }, // ... } VS now : match opcode { 0x18 => self .clc ( opcode ), // ... } So now every opcode have his own function !
Now there is a pop_stack function who return the top value of the stack (Last In First Out). I’ve also added those opcode : JSR RST And made this test code :
The now is new opcode ! : EOR ORA AND LDA (ZeroPageX) And some new AddressingMode : ZeroPageX AbsoluteX
New Opcode : PLA (Pull Accumulator) PHA (Push Accumulator) ASL memory LSR memory
There now is 4 new opcode: ROR ROL ROR Memory ROL Memory
✨ NEW OPCODE ✨ : PHP (Push Processor Status: push current value of all the flag to the stack) PLP (Pull Processor Status: pull current value of all the flag to the stack) But I have also add a memory dump with page (at the end of a program) to debug ! (1st screenshot) and i also add a fixed (address) memory viewer when running (2nd screenshot)
New opcode TXS (transfer X to stack pointer) TSX (transfer stack pointer to X) ldx_absolute_Y lda_indirect_x lda_indirect_y ldx_zeropage_y New Addressing Mode: AbsoluteY ZeroPageY IndirectX IndirectY
YAY I have added a BUNCH of new Opcodes : BCS BCC BPL BIT with ZeroPage & Absolute BMI BVC BVS
I’ve just passed 40min to fix an interruption problem to final look back and see that my original code what working perfectly fine 😭 . I’ve also change my build tools to ca65 + ld65
New opcode STA Absolute X
Add interruption with NMI + IRQ. Add option to the user to start at a specific address
New opcode time ! LDY ZeroPageX STA ZeroPageX AbsoluteY IndirectX IndirectY STX ZeroPageY Absolute STY ZeroPageX Absolute
I’m being closer and closer of getting all opcode and all Addressing mode implemented Here are the list of opcode I have implemented and there Addressing Mode: ADC Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y AND Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y CMP Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y EOR Zeropage Zeropage X Absolute Absolute X Absolute Y Indirect X Indirect Y I also fixed the CLD instruction. I was doing a : cpu .sr | = ! CPU :: DECIMAL_FLAG ; but the right one was this: cpu .sr &= ! CPU :: DECIMAL_FLAG ;
I have fix some little print in 3-4 instruction and the IRQ function
YAY Now EVERY opcode and EVERY addressing mode are implemented 🎉 (wow 1478 lines of pure opcodes)
I am now making the TUI part of this emulator ! I am using Ratatui to make the TUI. This mean I have to change all the printing part of my existing program
I have made a program to disassemble the program so the code could be shown in the TUI. And it work !
YAY now the Flags can be shown ! Green Bold when active and Dark Gray classic when not
The UI is going forward one step after another ! I have changed a some little like the place where is the Flag Container, now it’s on the left side. And I also have added a LOT a things like: Register Container (under the Flag Container) Now when there is a JMP (or any type or jump like RST, etc…) the code indent it self Up and Down key move the cursor 🥁…. ✨UP & DOWN ✨ New color for the ADDR in the Opcode container Things I have removed: BYTES section in the Opcode container because I don’t think it’s really useful
I have clean the code a little bit 🧹 and added a RUN or PAUSED indicator :
I have tried to implement multi-threading but realize that it’s not worth it for a simple emulator like this one.
I have added a Stack Viewer on the left ! The container scroll it self when the “cursor”/current position of the Stack Pointer (SP). I also have fix the text for the SP in the register container
A lot has been going on ! I have added the Memory Viewer, Scroll bar to the Stack Viewer and Memory Viewer (work with the 🥁…. SCROLL WHEEL !). I also reduce the space taken by the opcode list so we can see the memory viewer !
I have fixed the cursor in the Stack Container to scroll automaticly when needed and when running. I also optimised the code !
I have added a top bar in the memory container with the last part of the address (to be more easy to read). I also fixed all the scroll bar from scrolling outside the container and just see nothings
Choosing between a variety of logo (2 first screen shot are in Apple Terminal the last is in ghostty with a Catpuccin Mocha theme)
New feature 🥁🥁🥁 ✨ THE SCREEN ✨ This was very very hard. The screen use the Unicode half-block character “▀”, to write to the screen you just need to send value like this : LDA #$02 ; load "02" into the accumulator STA $0200 ; store it at memory address $0200 (the 1st pixel) Here the 02 is the color RED. Here is the color palette: fn palette_color ( index : u8 ) -> Color { match index & 0x0F { 0 => Color :: Black , 1 => Color :: White , 2 => Color :: Red , 3 => Color :: Cyan , 4 => Color :: Magenta , 5 => Color :: Green , 6 => Color :: Blue , 7 => Color :: Yellow , 8 => Color :: Rgb ( 255 , 165 , 0 ), // Orange 9 => Color :: Rgb ( 153 , 76 , 0 ), // Brown 10 => Color :: DarkGray , 11 => Color :: Gray , 12 => Color :: LightRed , 13 => Color :: LightBlue , 14 => Color :: LightGreen , _ => Color :: Reset , // 15 transparent } } The color may vary between terminal theme. I also had created an ASM program to print a rainbow on the 1st quarter of the screen. I also added the feature that when a BRK instruction is hit the program turn to HALT mode (in the UI). I also added the indentation system to BEQ, BNE, BCC, BCS, BMI, BPL, BVC, BVS. I also added a new way of calculating the speed of the program.
Now the name of the file currently running is in the title. I also finished the rainbow program to fill the whole screen.
New panel 🥁🥁🥁…. the ✨ SETTINGS ✨ ! In this panel there is a smaller version of the Logo and the settings to modify the speed of the CPU. There is also the link to the github repo and stardance project
I have update the color from word to RGB value so if a different terminal theme is applied the color are the same. I also added a footer bar with the keybinds.
Now if I press R I can reset the program. I also modify the footer bar
New demo program… HelloWorld_demo ! Print Hello World ! centered on the screen all in pure 6502 Assembly. I also modified the way the disassembler work, now even if there is a BRK it will continue to read the file until the end. The ASM part was really really haaarrddd.
Wow that was damn hard 😭. But the Home Menu is finally here 🎉. There is the logo (might change). The select file container with full navigation (folder, parent directory, file), Icon (require a Nerd Font) and Colors. The selected file path update in real time with the absolute path of the file. The start address automatically change if the file selected is a demo file (end with “_demo.bin”) to $C000. The start address it editable with Alpha numeric character (hexadecimal). And the emulation speed work ! There is control on the footer bar.
WOW already 30 hours ?! 😅 I now have added the home logo ! I also changed the step for the speed selection on Home Menu from 500 to 100 for each step
Little bug fix: Now when we select a file in the Home File Selector the filename appear in the Opcode container. I have also reorganize the tui.rs code !
WOW 4h 😅 I have done the full README.md, documentation about the screen, color palette and fix some little bugs.
WOW 35H 🎉 I have added a file : DemoProgram.md to show all the demo program
I have added a new program called HackClub Logo First, I have draw the hackclub logo in aseprite with a 32x32 pixel file using my custom color palette. Second, I have created a simple python script who take a .png in input and output ASM raw data for the image (using my color palette). Third, I have create a simple ASM program to print the logo on the screen !
I have been writing a LOT of documentation on how to create a 6502 ASM program, Screen documentation. And the project is now published in version 1.0.0 on Github and Cargo https://github.com/wirenux/Rust-6502 https://crates.io/crates/rust6502
Last devlogs before Ship #1 Wow 37h of work. I have made an Asciinema video, Youtube video and update the README.md Wish me luck !
Ok so… it’s been 8h40 . I have done a lot (I mean it’s logic it’s been 8h and 40 minutes) In time order I have done : Replace self.pc + 1 to self.pc.wrapping_add(1) so it’s like on the real 6502 if the current PC is $FFFF and you add 1 it will be $0000 . Added a panic hook, before when the program was crashing (for a bad ASM program by example) the terminal was still in RAW mode (so if you click, move the mouse etc… it will print a bunch of garbage number) but now it exit the raw mode in a clean way ! Remove unused import Change the start of the Stack Pointer to $1FFF Added a memory reset function Write a bunch of test programs Replace IPS (instruction per seconds) by Hz and MHz like in real life (so i’ve adapted the UI for the change) Now the disassembler disassemble the whole program (neat right ? ) using .len() . (yes before it was an hard-coded number Optimize the screen render method. Before I was refreshing the screen even if nothings has been changed, now i check if somethings have been changed to update the screen Added address of each “quarter” of the screen in the screen documentation Fixed foreground and background color of the Frequency selector (on the Home Screen) Write a program to test IRQ and NMI Keybinds the I and N key to IRQ and NMI Changed the Hello World program to be rainbow The emulator will look by it self to the reset vector ( $FFFC and $FFFD ) to set the PC at the correct address Added a force address toggle to… force the the start address When the force addr toggle is off you can’t modify the start Addr and it’s darker Every file or folder who start by a . (dot) is not shown in the file selector Moved the hackclub logo raw binary data to a .inc file Added a self crashing test program (Next time I might add a PS/2 keyboard emulation… )
YAY ! Now there is mouse control on the home screen, this mean that you can click every where to change the focus and in the file explorer you can double-click to open a folder and double-click to open a file directly, you can also with a simple click enable or disable Force Address Mode
Wow that was… difficult . But now there is a PS/2 keyboard Emulation ! The I/O port is map on $BFF0-$BBF2. The PS/2 keyboard work with 3 addresses $BFF0 : KBD_DATA $BFF1 : KBD_STATUS $BFF2 : KBD_ACK To activate to keyboard in the emulator you can press on the screen container and to exit it just click anywhere else ! (The number you can see in the memory viewer at $0000 is the code from different key !) Maybe next time I will create a program to see each letter
I want to create a ASM program who print the pressed key to the screen, and for that I need to create the font/image for each key. There is ~100 key . So here is the first one !
Now there is all the number & lower case letter (a-z) & and the Space bar icon !
Okay soo….. it’s been 4 hours and 35 minutes . I have done so much and not that much at the same time (I know it’s weird ) I have added a demo program who print the pressed character ! I have spend 2 hours on a little bug but yeah now it’s working ! So with the program I drew all the key on a PS/2 keyboard . I also fixed some little inattention problem in my code. I also created a little python script to help me convert .png drawing into raw .inc value ! ( Did you find the secret phrase ?)
Wow, just WOW. I have added a serial monitor, and Apple 1 OS Serial Monitor Here is the way the monitor work, you load character to $BFE0 like this : lda #'A' sta $BFE0 Then you run the program in the emulator like normal, then you open another terminal and you connect to localhost port 8080 using netcat nc like this : nc 127.0.0.1 8080 And now if you already launch the program, when you connect to localhost ( 127.0.0.1 is localhost) you will see a A in your terminal ! You can also type in the serial monitor ! Here is a code that show the number of characters typed by using the pixels in the 32x32 screen ! start: ldx #$FF txs ldx #$00 main_loop: bit $BFE1 bpl main_loop lda $BFE0 sta $BFE0 lda #WHITE_COLOR sta $0200, x inx jmp main_loop Apple 1 This is a very damn big part. To be short, I have recreated the Apple 1 OS (Wozmon) created by Steve Wozniak. In short I took the code given in the Apple 1 User Manual, modify it to use the Serial Monitor and Keyboard, fix some issue with the prompt. I can even run the classic program from the manual to print all the available characters. With Wozmon you can also write and read data from the memory so you can show some pixel on the screen ! Here is the program running and the serial monitor.
After 1h50 I have added a Snake demo program that use the PS/2 keyboard !!! I also make a demo program to test the Serial Monitor using netcat nc
Little update, I added a Program Counter (PC) input to move it in when running a program. I also added a cursor for the start input on the Home Screen !
Little update ! I have added tips in the settings menu. The change randomly using the UNIX Epoch value
New little update ! I have created a Python tools to create memory map for my emulator docs !
Here is what I have done in 2h 50 . First I wrote a lot of docs, for the keyboard, Serial Monitor, Wozmon etc… This was so boring . But at least now I will be ready to ship soon ! Second, I have fixed the Wozmon list content of address. Before when you was doing FF00.FFFF it was just showing the byte at $FF00 and the byte at $FFFF now it list all the byte between !
YAY Now rust6502 Version 1.1.0 is released ! On github with all the demo file and on crates.io / cargo !
v1.2.0 Here are the changes attached to this release : fix: a bug on windows, with ghost key press ( c3c6009 ) add: a Scroll bar on the file explorer ( 94b2abb )
I added the step-back function. It work by pressing “B”, it’s just rewinding the emulator up to 500 opcode. Only work when moving in step-by-step mode (with Enter)
Okay so… I have added the Breakpoint and the Watchpoint . When you set the breakpoint to $C00C the CPU will stop before running the instruction at $C00C. The watchpoint stop if a value at an address at been changed.
+1h 25 min ! Since the last time I have added the keybind panel. Where there is… all the keybinds I also remove the keybind on the footer to only get Keybind “K”
+ 1h35 ! This might be the last feature I add to Rust 6502. Since I ran out of idea and for me the project seem to be finished. Anyway, here are the things I added : A RNG address : $BFF3 . The program just read from it and get a random value via the Host computer ( 4feb4d8 ) A conditional breakpoint : A top bar in the Breakpoint popup to add a conditional breakpoint (like : If AC != 0F -> Break) ( 1b7bc81 )
+ 1h20 So… this might be the last devlog for this project. I just released the v1.3.0 . And here is what I added since the last devlog : A RNG documentation Snake now use a real RNG I recorded the Asciinema .cast file Update the python tools to generate memory diagrams Update the Memory documentation So next step is the 3rd Ship
Ships:
=== Rust 6502 === A legendary 8-bit CPU right in your terminal! 🦀 ᕙ( •̀ ᗜ •́ )ᕗ == What did you make ? == I built a fully functional emulator for the MOS 6502 (the microprocessor that powered the Apple II, Commodre 64, and the NES) from scratch using Rust ! Instead of a standard graphical window, I built a Terminal User Interface (TUI) using Ratatui. Here is what’s inside: Full CPU Emulation: Execute 6502 machine code with live register (AC, XR, YR, SP) and status flag tracking Virtual Screen: A 32x32 memory-mapped display ($0200-$05FF) rendered right in the terminal using Unicode Half-Block and a custom 16-color palette Live Disassembler & Hex Viewer: Watch the RAM change in real-time and see the raw binary machine code translated back into readable assembly instructions on the fly Built-in File Browser: A visual menu with Nerd Font icons to navigate your system and load compiled .bin ROMs Available on crates.io : You can download it via Cargo == What was challenging ? == The Disassembler: Writing a disassembler that parses raw .bin files is tricky because they don’t have headers. I ran into a massive issue where my image data (using the color byte $0A) was being read by the disassembler as infinite ASL A (Shift Left) instructions! I had to engineer a way for the disassembler to properly halt when it hit a BRK instruction so it wouldn’t try to execute my pixel art. Terminal UI Architecture: Designing a dashboard (hex grids, scrolling stacks, changing colors) required a really solid state-management architecture to keep the UI smooth and responsive while the CPU loop spins at thousands of instructions per second. == What are you proud of ? == I am proud of using this project to learn Rust in a fun way! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io, meaning anyone can install and run my emulator with a single command == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load hackclub_logo_demo.bin to see the terminal render a 32x32 pixel art logo using 6502 assembly Load rainbow_demo.bin to watch a shifting color gradient animation directly manipulating video memory. Load helloworld_demo.bin to watch a centered Hello world message The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!
=== Rust 6502 === A MOS 6502 emulator TUI with a lot of features ============================================ Before reading this Ship you should take a look at Ship #1 == What did you add ? == Here is a list of everything that I have added since the last Ship = Features = Serial Monitor : you connect to localhost:8080 using netcat. Useful for the Apple 1 OS or for debugging with text. The monitor can be used to display text but also to send text like a keyboard (useful for the Apple 1 OS) PS/2 Keyboard : a full PS/2 keyboard emulation (used in Snake) Use the UI with a Mouse: On the Home Menu and in the Emulator you can click on button, toggle, scroll, etc… Interrupt : IRQ & NMI Tips in the Settings Panel Modify speed with Hz & MHz (like a real 6502 chip) Reset Vector: The emulator will look at $FFFC & $FFFD to find the start address of the program (when the Force Address toggle is off) Set PC Address: keyboard shortcut to change the position of the PC (Program Counter) = Demo Program = Apple 1 OS (Wozmon) : I have modified the orginal Apple 1 code to fit my emulator, like Serial Monitor address, Keyboard etc… Snake : Just the Snake game ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ Keyboard Demo: Print every key press on the screen using a custom font Serial Monitor Demo: Show how the Serial Monitor works == What was challenging ? == The most challenging part of this 2nd ship was creating a Serial Monitor that works via a local port, and making a PS/2 Keyboard emulation. And of course, modifying the Apple 1 OS to make it work on this emulator ! (I was having a lot of bugs, so I rewrite a big part of the OS) ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ == What are you proud of ? == I am really proud of my self for the implementation of the Serial monitor that run on different CPU thread than the emulator itself and the fact that it work via the local network. And beyond everything the fact that my emulator can run : games, utility and the Apple 1 OS !!! ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ I’m also really proud that it’s officially published on crates.io. == What should people know so they can test your project ? == Note: A Nerd Font is recommended in your terminal emulator for a proper rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: ================== cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! == Things to try == Load snake_demo.bin to play at a classic game using the 32x32 screen and the PS/2 keyboard emulation Load wozmon.bin to use the Apple 1 OS ! You should see the documentation related to Wozmon : https://github.com/wirenux/Rust-6502/blob/main/AppleI.md Load keyboard_demo.bin to see every key you press show up on the 32x32 screen using a custom font The Debugger: go to the Settings menu inside the TUI and slow down the CPU speed. Then watch the Memory Viewer and Disassembler track exactly what the code is doing in real-time!
Rust 6502 A MOS 6502 emulator TUI with a lot of features Before reading this Ship you should take a look at Ship 1 & Ship 2 What did you add ? Here is a list of everything that I have added since the last Ship Features Breakpoints : press “F” to set a breakpoint at any address, the emulator halts the moment PC reaches it Watchpoints : same idea, but for memory Conditional Breakpoints : halt execution when a register (AC, XR, YR, SP) meets a comparison (!=, ==, >=, <=, >, <) against a target value Step Back : press “B” to rewind execution one instruction at a time, restoring the CPU and memory exactly as they were before Random Number Generator : a memory-mapped register at $BFF3 that returns a random byte from the host PC on every read, so ASM programs can have real random number Keybind Panel : a popup listing every keyboard shortcut and control, and removed the old footer keybind list to make room for it Demo Program Snake : updated to pull apple placement from the new RNG instead of the old pseudo random method ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What was challenging ? Wiring the conditional breakpoint into the run loop without breaking the existing breakpoint/watchpoint checks was harder than I though. Also getting a dropdown-style menu to choose the operator working in Ratatui was tought since there’s no native dropdown widget. So I ended up building a little spinner (▲ value ▼) that cycles through the operators instead ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧ What are you proud of ? I’m proud that my emulator now has real debugging tools like : breakpoints, watchpoints, conditional breakpoints, and step-back. What should people know so they can test your project ? A Nerd Font is recommended in your terminal for a better rendering of the UI icons on the Home page How to test: Install the emulator directly from crates.io by running: cargo install rust6502 Download all the .bin files on the GitHub Releases page. Launch the emulator by running rust6502 and use the built-in Home menu to select one of the demo .bin files! Things to try Load snake_demo.bin and play :D Set a breakpoint on an address inside a demo program (check the keybind panel for the shortcut!) and watch execution halt exactly there Try a conditional breakpoint : for example, halt whenever XR == 0F and watch it stop right when the register hits that value Press “B” to step backward and rewind the CPU state instruction by instruction Press the keybind panel shortcut to see the full list of controls...
|
1792979591.720019
|
1793065991.720019
|
|
57535
|
Atom Simulator by @Rezz | Stardance
|
Rezz
|
1
|
67.08
|
1350
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T13:44:19Z", "hours": 65.0, "multiplier": 17.4, "payout": 1350, "blessing": "neutral", "text": "ATOM SIMULATOR!! Simulate an atom by adding subatomic particles manually or selecting elements directly from the periodic table and learn about every ground state isotope humanity has ever discovered! When I was starting this project I wanted to make something that I could show to others and be proud of it and this is what I have made! You can add any amount of subatomic particles and see the details of the isotope you have created. (Trust me there are many surprising combinations which actually exist). There are 3588 isotopes which exist in ground state and all are in the database of this project. This is a great opportunity to learn about the properties of every isotope in a fun and interactive way! What I built: :> The main canvas with the simulation of the atom. :> The element panel shows the information of the element you have created. :> The isotope panel gives you all the information about the current isotope you created and also visually highlights invalid isotopes, :> The control buttons let you ADD/REMOVE subatomic particles with full control. :> The periodic table with all the elements with proper buttons to jump to elements. :> Proper animation of the atom in the canvas. How I made it easy to use: :>Deployed it to GitHub pages so that anyone can easily access it without having to clone the repository. :> +10/-10 button help users to jump between atoms easily as well as see a satisfying animation. :> Added the ability to type in the desired number of subatomic particles for even more accessibility. :> The periodic table lets people jump to any desired element they want, so they do not have to struggle to reach any desired element. :> Made it so that the periodic table pops up with one click and disappears instantly when the user clicks an element or outside the table for a smooth and fast user experience. :> Colour coded each element in the periodic table depending on their types. :> If the user creates an invalid isotope, the isotope panels visually highlight it so that the user does not get confused. Technicalities A lot of things have been used in this project I have listed the things I learnt below: HTML5 Canvas Canvas Drawing Canvas Coordinate Systems requestAnimationFrame() Graphics / Animation Loops Mathematical Animation Polar / Circular Positioning Trigonometry in Programming Canvas Transformations 2.5D / Depth Illusion Painter’s Algorithm / Draw Order Dynamic Geometry State-Driven Graphics Data-Driven Application Design Managing Dynamic Object Collections Animation State Interpolated Animation Dynamic Numbers of Animated Objects Dynamic Shell Allocation UI State I am currently learning web development and these are my early steps. This is my first time using canvas so I gave it my best. The project may look very long in itself but it would have been way longer if you add the time spent reading documentation and watching videos about canvas Api. Since I started in stardance I have gone from not even knowing html syntax to here and I plan to further improve my understanding of canvas by making a game next. So, wish me luck. Please read the README for detailed explanation of my project!", "repo": "https://github.com/KartikeyaMishra-Ark/Atom-Simulation", "demo": "https://kartikeyamishra-ark.github.io/Atom-Simulation/"}]...
|
[{"post_id": 70719, "ts": "202 [{"post_id": 70719, "ts": "2026-09-19T17:27:55Z", "hours": 2.0822, "text": "Complete UI change!! The shipwrights told me my theme was very generic and looked very AI generated so I changed it into the theme of star charts used by astronomers in 17th-18th centuries. Renamed the periodic table to the atlas and over all made everything look like a diagram made on parchment. Also added a trail to the electrons to make it look a little bit more unique. My project is based on the Bohr model which was based on astronomy of that time which emerged from these star charts so I decided to use this theme to have a little personality and originality. Thanks for reading!!"}, {"post_id": 70545, "ts": "2026-09-19T10:33:05Z", "hours": 0.8514, "text": "Final Devlog is here guys after so many hours!! I have redone the UI to look less generic and a little more unique. The canvas is now having invisible borders so it blends in with the background. Added a header. Added red colour in case of invalid isotope and moved status to the to for better user experience. Also set the cap to 118 on both electrons and protons. Fixed the plus 10 button so it goes up to 118 instead of stopping if there is less than 10 electrons left to 118. That will be all I will ship this and other features will come in future updates like exit animations and ion panel. There is a lot more I could do but I have refined everything I made in this and that will be all for now as adding new things will create an unrefined product. I have set the default atom to chromium-24 just because it is not too small and not too big to help the users go lower and upward pretty quick. It was a long run and genuinely tough project. The amount of documentation I had to read was unreal. Thanks for reading!!!!!!!!!!!!!!"}, {"post_id": 70489, "ts": "2026-09-19T08:45:53Z", "hours": 5.8706, "text": "I have completed the animation now. The other electrons now move slowly into their new positions and make space for the incoming electron. I also made it so that it is fluid for +10 electrons as well. I also am moving towards my final UI so everything is black now instead of blue and I plan on making it more space like. Now comes the part where I tell you my struggles. I spent a lot of time trying to perfect the animation. To do this I had to make changes in a lot of my functions and I finally was at the end of my struggles after about 3 hours of work and there was just one bug I was unable to fix which was that whenever I spam added electrons they would go into one place and then teleport into their dedicated locations. To fix that I made a lot of changes. The problem was that the canvas was not giving new space assignment to the electron when it was being spam added and foolish me without committing decided to fix it and broke everything. I managed to break it so bad that program broke when adding a new shell. And because I had made so many changes I was not gonna spend another 3 hours fixing them one by one so I had no choice but to delete everything since the last commit which was my last devlog. and then I had to remake it from there. Lesson learnt. Thanks for reading!!!"}, {"post_id": 69615, "ts": "2026-09-17T12:54:50Z", "hours": 3.5044, "text": "I have finally added an animation to the addition of the electrons!! You can see in the video I have made it so that every added electron comes from outside the canvas and takes its place in the orbit. It is far from perfect right now but it’s the first step. The biggest problem in this was making sure it came in at the proper angle so it feels smooth and injects itself properly. I am thinking of animating the other electrons to slowly move and make space for the new electron so it doesn’t look like a flicker every electron added. The nucleus is still the same I am leaving it alone I will fix it in the end it’s too much for me. Also did a lot of CSS changes in the periodic table and the isotope panel and the control buttons. I am trying to make it look like an instrument more Than a button so hopefully it can happen. The next move is refining this animation and once it’s done I will redo the entire CSS to a space, science, observatory theme. Thanks for reading!!"}, {"post_id": 69163, "ts": "2026-09-16T14:35:00Z", "hours": 5.3294, "text": "This is making me give up guys. I cannot fix this nucleus this just isn’t working. I have been spending so many hours on this I used to do so much more daily but I just rage quit when I can’t fix this. You can see in the video is is still working in a sequence I cannot fix it. I did fix the flicker which happens every time a particle is added so it is very smooth now. also I added rotation to the shells by adjusting my already existing drawshell function. I made some changes in css though they are not noticable in the video as I removed most of them because the light theme didn’t suit the project. I am trying to make the theme more space and science like more like an observatory. I really wanna start on animations but I am holding it off for everything else to start working first. Thanks for reading!!"}, {"post_id": 68152, "ts": "2026-09-14T16:32:40Z", "hours": 6.3133, "text": "I am so freaking done with this!! I have been sitting here for so many hours trying to fix the nucleus and for some reason it is never working. I have created multiple new functions deleted those, changed those and one time is became a spiral pattern. Then I tried to randomise it and it became like a random splash. then the neutrons disappeared. then the count got messed up so every ten neutrons added get on screen. Then neutrons did not show up until we reached 24 of them. I tried every different way I could think of solving this but this is not working. At last I thought I should just go back to my old configuration because it was good enough but now it became like this and is overlapping into the first shell. I guess I deleted my old function where I had set its parameter to not overlap the inner shell but here we are. Also I found a way to make the periodic table work properly. It now pops up on screen so the user doesn’t have to scroll and disappears with th user input or if the user clicks the background. I will make it transparent in the future. Also I hope I can fix this nucleus this is so not it. Thanks for reading."}, {"post_id": 67356, "ts": "2026-09-13T13:10:52Z", "hours": 4.5983, "text": "COMPLETE CSS OVERHAUL. I have redone the entire CSS to make it look WAYYY better and you can see the results. I am adopting a dark theme. I do want it to look more like space but I will see to it later. I added a toggle function for the periodic table. It looks kind of useless now but what I wanna do is make it appear on the screen instead of appearing below so that the use can select without having to scroll. Also the nucleus must be catching your eye. I tried to randomise it but for some reason it is randomising every frame so I have to figure out how to fix it. I am pretty sure it is a very simple fix that I am wasting so much time on. Also changed the colour of the shell, electrons and nucleus and gave the particles a little glow for dramatic effect. Also gave the elements in the periodic table colours according to their categories like Alkali metals, noble gases etc. Next I am going to fix the nucleus. Make the periodic table appear on screen and try to make the UI look better. I am also thing of any features I can add. Thanks for reading!!"}, {"post_id": 66047, "ts": "2026-09-11T16:36:57Z", "hours": 8.6878, "text": "Sorry for so long undevlogged hours. First time I got a warning. I really procrastinate on devlogs. There are many changes I made, the first being the addition of radioactive/stable status, half-life, decay mode, spin/parity, and atomic mass into the isotope tab. My vision is that I want people to explore the isotopes when they play around manually with the subatomic particles. This increased my database for isotopes to 45k lines, hopefully the person who told me it’s ok to use AI for data collection was true. And for enhanced UX I added +10 and -10 buttons as well as the ability to type the number of electrons in. And the biggest and the most obvious update was the periodic table. I spent so long figuring it out. At first I tried doing the entire thing in CSS, but thankfully the array of elements with so many seemingly useless information I created at the start helped out and I was able to assign each of them groups and periods to look like a periodic table through JavaScript, but La and Ac were acting up because they kept going down to the f block. I moved them up but it still looks not as good. I then added each element on the table to be clickable and the user would instantly move to the desired element and be able to test what isotopes it has and also all their properties. Also I removed the configuration because I am making the Bohr model visible so it’s inaccurate to have the Aufbau configuration. I am 1000% going to do frequent devlogs please forgive me for my past 3 devlogs. Also I made sure the most commonly used isotope is there by default on the isotope panel when the periodic table is clicked. I think I will look how to make the UI better first as the periodic table being on the bottom feels so weird and bad UI because the user needs to scroll to see the change. I’ll think for a fix. Thanks for reading!!!!!"}, {"post_id": 63762, "ts": "2026-09-07T18:39:18Z", "hours": 8.0033, "text": "Now this is a big one! I have spent hours trying different ways to add isotopes to this. I thought I would add some common isotopes and not let the user make any other atom. Then I ditched it and tried to just say not in data. Then I tried to reduce the number of elements then I thought that how many isotopes can I actually add? So Iooked up on how many isotopes exist of all known elements I found a study of NUBASE in 2022 with 3588 ground state isotopes in their website. It had a lot of detail. I have used clause to parse it into a json file and it has 25k lines. I have asked the shipwrights and they said it’s fine so I did it. So now I have each possible ground state isotope and its basic properties in my project so I just linked it to javascript and then decided I wanted an entire window dedicated to isotopes and as my project had been bad for so long so I redid the html and finally touched css. Didn’t take me too long it has become very easy to create basic cards after my last project. Then I created a few functions for the isotopes which basically act as a validator which I made previously for protons. Also I deleted a lot of my code. So as seen in the video, Isotopes are divided into stable, radioactive and invalid. Any isotope which my database doesn’t have does not exist in ground state which is way bigger of a scale I was thinking about so I am proud of it. Also the name and symbol have been changed as well. the css looks very bad as I just did it very fast so that it at least looks like it is real. Next is redoing the nucleus to increase the randomisation and maybe I am thinking of redoing the isotopes window and the UI. Mostly thinking of working on UI now but idk what I do tomorrow. Thanks for reading!!"}, {"post_id": 62851, "ts": "2026-09-06T11:40:28Z", "hours": 6.7181, "text": "Very long devlog here. I have added a lot of stuff and have failed to add a lot of stuff too. The first task at my hand was making the nucleus into individual particles.The problem I ran into was when there were less than 14 nuclear particles they were too far away from each other. So I made a few if statements for better alignment in lower atomic number elements. Then I added colours for identification I will change them in the future. After adding colour I saw that the protons and neutrons aren’t mixing and are forming rings instead and so far I cannot fix it. Next thing I added was electronic configuration. I have used Aufbau’s principle for the electronic configuration which is kinda inaccurate as my model doesn’t use it but I added it because I can. Also I have not added all the exceptions like chromium. The next step was adding ions and isotopes. I spent so much time adding isotopes and failed terribly but the ions have been working out. Currently they are also inaccurate because I have yet to add a block for impossible structures and also the names just add ion instead of saying oxide or chloride. There is a type section currently because I first added just anion neutral and cation detector but then decided I want all ions and isotopes as well. The most amount of time spent this time is for sure the failure of my isotopes addition. Also I have been tweaking the tilts to make them look better. My devlog makes it look simple but it took so much freaking trial and error to do all this I am seriously burned out now. But it’s too fun for me to stop. Thanks for reading!!"}, {"post_id": 62205, "ts": "2026-09-05T13:55:38Z", "hours": 2.9883, "text": "I have now added buttons for user to add and remove subatomic particles. The neutrons are kind of useless because I have currently linked it to the periodic table I added to the code (yes I added all the elements as mentioned in previous devlogs). So the atomic mass is hardcoded for every element but in the future I will switch back to mass number when I add isotopes to the this. And now the most obvious change. I have added a tilt to all the electron paths and the shells so that I can have a 3d effect. I looked up on how to make this 3d and decided it was wayyy too out of my league, though what I am doing is already out of it, but I decided I will try a 2.5d style and this is as far as I have gotten. I have also made it so that the outer shells move faster than inner ones for better effect. It looks kinda ugly as I have neglected css but I am waiting for a general structure to be finished before I do that. I have to say that canvas is very complicated. And I am having to use a lot of loops and I am having difficulty understanding my own code. I hope by moving forwards I can get more comfortable with all this. Thanks for reading!!"}, {"post_id": 62052, "ts": "2026-09-05T08:52:41Z", "hours": 2.5119, "text": "I have added functions to calculate the mass number and the charge on each configuration. Then I have added the properties of each element in the periodic table into the code and made a div so that it can be seen in the web page. In the video below I am changing the number of electrons and protons to showcase it working I am yet to add an input on the screen. Also for each element I have added its atomic number, symbol, name, atomic mass, period, group and category. I believe it will prove useful in the future when I add a proper description. I am also going to add isotopes in the future. It was very boring to copy all the elements from he periodic table though. Thanks for reading!! edit: I just noticed a bug. I am not changing the number of neutrons so the mass number is wrong in every case. As I set the detection of each element by the number of protons I didn’t realise it. Sorry for the error"}, {"post_id": 61724, "ts": "2026-09-04T19:24:00Z", "hours": 2.265, "text": "The visual difference in this update may not look a lot but the code has changed a lot. Previously all of the stuff was just hardcoded values and now I have turned them all into proper dynamic values. I have given it a configuration to accommodate all 118 elements properly. Also made it so that the increasing number of shells reduces the spacing so the shells don’t clip out of bounds. Also having lesser shells spreads them out more so it looks zoomed in. All seems to work fine now. Almost all hardcoded values are turned into functions so I am going to try to add a way so the user can directly add an electron to the system. I am yet to touch the protons it’s still just balls revolving in a certain configuration, far from my vision. Thanks for reading!!"}, {"post_id": 61588, "ts": "2026-09-04T16:00:47Z", "hours": 4.2703, "text": "So I redid all the code of the javascript. I created different functions for the shells, nucleus and the electrons. After that I made a loop for the electrons so that they spawn in the shell structure of 2,8,8 and don’t overlap and another loop inside that to make sure that they all are revolving around the nucleus in their own shells. Then I made a loop for the shells with the same calculation of the radius so that they form properly along the revolving electrons. And damn was all of that hard to understand and create. In my previous projects I had not worked much with loops so I had to learn all about them and damn does this project use a lot of maths. It’s lowkey kind of fun playing with numbers and seeing varying results on screen. I think I will have to ditch these functions in the future because my end goal is to get all the 118 elements in there but this is an important learning step for me. Thanks for reading!!"}, {"post_id": 61336, "ts": "2026-09-04T06:26:06Z", "hours": 0.7969, "text": "Finally figured out how to move the electron along the path. Had to use Sine and Cosines to designate the movement. One problem which came up was that the new frame was not erasing the previous position of the electron so I did a clearRect so erase the previous frame but it currently is clearing everything including the shell and the nucleus. I am going to re write everything into separate functions to fix it."}, {"post_id": 61172, "ts": "2026-09-03T23:32:27Z", "hours": 1.9469, "text": "This project is kind of ambitious for me as it is a complicated one, but as a science. student I have always wanted to build something like this. I just spent a couple of hours experimenting and learning about canvas. First time using it. I really love that I have to use maths, physics and chemistry to make a project. The vision I have with this project is having a way to add electrons and protons and neutrons to make different elements and their isotopes. I will try to get then entire periodic table. And as my previous projects I don’t know how I will do it. I will learn as I build. This is very fun so far and I hope it doesn’t take as long as the last one. Thanks for reading!!"}]...
|
Title: Atom Simulator by @Rezz | Stardance
Devlog Title: Atom Simulator by @Rezz | Stardance
Devlogs:
This project is kind of ambitious for me as it is a complicated one, but as a science. student I have always wanted to build something like this. I just spent a couple of hours experimenting and learning about canvas. First time using it. I really love that I have to use maths, physics and chemistry to make a project. The vision I have with this project is having a way to add electrons and protons and neutrons to make different elements and their isotopes. I will try to get then entire periodic table. And as my previous projects I don’t know how I will do it. I will learn as I build. This is very fun so far and I hope it doesn’t take as long as the last one. Thanks for reading!!
Finally figured out how to move the electron along the path. Had to use Sine and Cosines to designate the movement. One problem which came up was that the new frame was not erasing the previous position of the electron so I did a clearRect so erase the previous frame but it currently is clearing everything including the shell and the nucleus. I am going to re write everything into separate functions to fix it.
So I redid all the code of the javascript. I created different functions for the shells, nucleus and the electrons. After that I made a loop for the electrons so that they spawn in the shell structure of 2,8,8 and don’t overlap and another loop inside that to make sure that they all are revolving around the nucleus in their own shells. Then I made a loop for the shells with the same calculation of the radius so that they form properly along the revolving electrons. And damn was all of that hard to understand and create. In my previous projects I had not worked much with loops so I had to learn all about them and damn does this project use a lot of maths. It’s lowkey kind of fun playing with numbers and seeing varying results on screen. I think I will have to ditch these functions in the future because my end goal is to get all the 118 elements in there but this is an important learning step for me. Thanks for reading!!
The visual difference in this update may not look a lot but the code has changed a lot. Previously all of the stuff was just hardcoded values and now I have turned them all into proper dynamic values. I have given it a configuration to accommodate all 118 elements properly. Also made it so that the increasing number of shells reduces the spacing so the shells don’t clip out of bounds. Also having lesser shells spreads them out more so it looks zoomed in. All seems to work fine now. Almost all hardcoded values are turned into functions so I am going to try to add a way so the user can directly add an electron to the system. I am yet to touch the protons it’s still just balls revolving in a certain configuration, far from my vision. Thanks for reading!!
I have added functions to calculate the mass number and the charge on each configuration. Then I have added the properties of each element in the periodic table into the code and made a div so that it can be seen in the web page. In the video below I am changing the number of electrons and protons to showcase it working I am yet to add an input on the screen. Also for each element I have added its atomic number, symbol, name, atomic mass, period, group and category. I believe it will prove useful in the future when I add a proper description. I am also going to add isotopes in the future. It was very boring to copy all the elements from he periodic table though. Thanks for reading!! edit: I just noticed a bug. I am not changing the number of neutrons so the mass number is wrong in every case. As I set the detection of each element by the number of protons I didn’t realise it. Sorry for the error
I have now added buttons for user to add and remove subatomic particles. The neutrons are kind of useless because I have currently linked it to the periodic table I added to the code (yes I added all the elements as mentioned in previous devlogs). So the atomic mass is hardcoded for every element but in the future I will switch back to mass number when I add isotopes to the this. And now the most obvious change. I have added a tilt to all the electron paths and the shells so that I can have a 3d effect. I looked up on how to make this 3d and decided it was wayyy too out of my league, though what I am doing is already out of it, but I decided I will try a 2.5d style and this is as far as I have gotten. I have also made it so that the outer shells move faster than inner ones for better effect. It looks kinda ugly as I have neglected css but I am waiting for a general structure to be finished before I do that. I have to say that canvas is very complicated. And I am having to use a lot of loops and I am having difficulty understanding my own code. I hope by moving forwards I can get more comfortable with all this. Thanks for reading!!
Very long devlog here. I have added a lot of stuff and have failed to add a lot of stuff too. The first task at my hand was making the nucleus into individual particles.The problem I ran into was when there were less than 14 nuclear particles they were too far away from each other. So I made a few if statements for better alignment in lower atomic number elements. Then I added colours for identification I will change them in the future. After adding colour I saw that the protons and neutrons aren’t mixing and are forming rings instead and so far I cannot fix it. Next thing I added was electronic configuration. I have used Aufbau’s principle for the electronic configuration which is kinda inaccurate as my model doesn’t use it but I added it because I can. Also I have not added all the exceptions like chromium. The next step was adding ions and isotopes. I spent so much time adding isotopes and failed terribly but the ions have been working out. Currently they are also inaccurate because I have yet to add a block for impossible structures and also the names just add ion instead of saying oxide or chloride. There is a type section currently because I first added just anion neutral and cation detector but then decided I want all ions and isotopes as well. The most amount of time spent this time is for sure the failure of my isotopes addition. Also I have been tweaking the tilts to make them look better. My devlog makes it look simple but it took so much freaking trial and error to do all this I am seriously burned out now. But it’s too fun for me to stop. Thanks for reading!!
Now this is a big one! I have spent hours trying different ways to add isotopes to this. I thought I would add some common isotopes and not let the user make any other atom. Then I ditched it and tried to just say not in data. Then I tried to reduce the number of elements then I thought that how many isotopes can I actually add? So Iooked up on how many isotopes exist of all known elements I found a study of NUBASE in 2022 with 3588 ground state isotopes in their website. It had a lot of detail. I have used clause to parse it into a json file and it has 25k lines. I have asked the shipwrights and they said it’s fine so I did it. So now I have each possible ground state isotope and its basic properties in my project so I just linked it to javascript and then decided I wanted an entire window dedicated to isotopes and as my project had been bad for so long so I redid the html and finally touched css. Didn’t take me too long it has become very easy to create basic cards after my last project. Then I created a few functions for the isotopes which basically act as a validator which I made previously for protons. Also I deleted a lot of my code. So as seen in the video, Isotopes are divided into stable, radioactive and invalid. Any isotope which my database doesn’t have does not exist in ground state which is way bigger of a scale I was thinking about so I am proud of it. Also the name and symbol have been changed as well. the css looks very bad as I just did it very fast so that it at least looks like it is real. Next is redoing the nucleus to increase the randomisation and maybe I am thinking of redoing the isotopes window and the UI. Mostly thinking of working on UI now but idk what I do tomorrow. Thanks for reading!!
Sorry for so long undevlogged hours. First time I got a warning. I really procrastinate on devlogs. There are many changes I made, the first being the addition of radioactive/stable status, half-life, decay mode, spin/parity, and atomic mass into the isotope tab. My vision is that I want people to explore the isotopes when they play around manually with the subatomic particles. This increased my database for isotopes to 45k lines, hopefully the person who told me it’s ok to use AI for data collection was true. And for enhanced UX I added +10 and -10 buttons as well as the ability to type the number of electrons in. And the biggest and the most obvious update was the periodic table. I spent so long figuring it out. At first I tried doing the entire thing in CSS, but thankfully the array of elements with so many seemingly useless information I created at the start helped out and I was able to assign each of them groups and periods to look like a periodic table through JavaScript, but La and Ac were acting up because they kept going down to the f block. I moved them up but it still looks not as good. I then added each element on the table to be clickable and the user would instantly move to the desired element and be able to test what isotopes it has and also all their properties. Also I removed the configuration because I am making the Bohr model visible so it’s inaccurate to have the Aufbau configuration. I am 1000% going to do frequent devlogs please forgive me for my past 3 devlogs. Also I made sure the most commonly used isotope is there by default on the isotope panel when the periodic table is clicked. I think I will look how to make the UI better first as the periodic table being on the bottom feels so weird and bad UI because the user needs to scroll to see the change. I’ll think for a fix. Thanks for reading!!!!!
COMPLETE CSS OVERHAUL. I have redone the entire CSS to make it look WAYYY better and you can see the results. I am adopting a dark theme. I do want it to look more like space but I will see to it later. I added a toggle function for the periodic table. It looks kind of useless now but what I wanna do is make it appear on the screen instead of appearing below so that the use can select without having to scroll. Also the nucleus must be catching your eye. I tried to randomise it but for some reason it is randomising every frame so I have to figure out how to fix it. I am pretty sure it is a very simple fix that I am wasting so much time on. Also changed the colour of the shell, electrons and nucleus and gave the particles a little glow for dramatic effect. Also gave the elements in the periodic table colours according to their categories like Alkali metals, noble gases etc. Next I am going to fix the nucleus. Make the periodic table appear on screen and try to make the UI look better. I am also thing of any features I can add. Thanks for reading!!
I am so freaking done with this!! I have been sitting here for so many hours trying to fix the nucleus and for some reason it is never working. I have created multiple new functions deleted those, changed those and one time is became a spiral pattern. Then I tried to randomise it and it became like a random splash. then the neutrons disappeared. then the count got messed up so every ten neutrons added get on screen. Then neutrons did not show up until we reached 24 of them. I tried every different way I could think of solving this but this is not working. At last I thought I should just go back to my old configuration because it was good enough but now it became like this and is overlapping into the first shell. I guess I deleted my old function where I had set its parameter to not overlap the inner shell but here we are. Also I found a way to make the periodic table work properly. It now pops up on screen so the user doesn’t have to scroll and disappears with th user input or if the user clicks the background. I will make it transparent in the future. Also I hope I can fix this nucleus this is so not it. Thanks for reading.
This is making me give up guys. I cannot fix this nucleus this just isn’t working. I have been spending so many hours on this I used to do so much more daily but I just rage quit when I can’t fix this. You can see in the video is is still working in a sequence I cannot fix it. I did fix the flicker which happens every time a particle is added so it is very smooth now. also I added rotation to the shells by adjusting my already existing drawshell function. I made some changes in css though they are not noticable in the video as I removed most of them because the light theme didn’t suit the project. I am trying to make the theme more space and science like more like an observatory. I really wanna start on animations but I am holding it off for everything else to start working first. Thanks for reading!!
I have finally added an animation to the addition of the electrons!! You can see in the video I have made it so that every added electron comes from outside the canvas and takes its place in the orbit. It is far from perfect right now but it’s the first step. The biggest problem in this was making sure it came in at the proper angle so it feels smooth and injects itself properly. I am thinking of animating the other electrons to slowly move and make space for the new electron so it doesn’t look like a flicker every electron added. The nucleus is still the same I am leaving it alone I will fix it in the end it’s too much for me. Also did a lot of CSS changes in the periodic table and the isotope panel and the control buttons. I am trying to make it look like an instrument more Than a button so hopefully it can happen. The next move is refining this animation and once it’s done I will redo the entire CSS to a space, science, observatory theme. Thanks for reading!!
I have completed the animation now. The other electrons now move slowly into their new positions and make space for the incoming electron. I also made it so that it is fluid for +10 electrons as well. I also am moving towards my final UI so everything is black now instead of blue and I plan on making it more space like. Now comes the part where I tell you my struggles. I spent a lot of time trying to perfect the animation. To do this I had to make changes in a lot of my functions and I finally was at the end of my struggles after about 3 hours of work and there was just one bug I was unable to fix which was that whenever I spam added electrons they would go into one place and then teleport into their dedicated locations. To fix that I made a lot of changes. The problem was that the canvas was not giving new space assignment to the electron when it was being spam added and foolish me without committing decided to fix it and broke everything. I managed to break it so bad that program broke when adding a new shell. And because I had made so many changes I was not gonna spend another 3 hours fixing them one by one so I had no choice but to delete everything since the last commit which was my last devlog. and then I had to remake it from there. Lesson learnt. Thanks for reading!!!
Final Devlog is here guys after so many hours!! I have redone the UI to look less generic and a little more unique. The canvas is now having invisible borders so it blends in with the background. Added a header. Added red colour in case of invalid isotope and moved status to the to for better user experience. Also set the cap to 118 on both electrons and protons. Fixed the plus 10 button so it goes up to 118 instead of stopping if there is less than 10 electrons left to 118. That will be all I will ship this and other features will come in future updates like exit animations and ion panel. There is a lot more I could do but I have refined everything I made in this and that will be all for now as adding new things will create an unrefined product. I have set the default atom to chromium-24 just because it is not too small and not too big to help the users go lower and upward pretty quick. It was a long run and genuinely tough project. The amount of documentation I had to read was unreal. Thanks for reading!!!!!!!!!!!!!!
Complete UI change!! The shipwrights told me my theme was very generic and looked very AI generated so I changed it into the theme of star charts used by astronomers in 17th-18th centuries. Renamed the periodic table to the atlas and over all made everything look like a diagram made on parchment. Also added a trail to the electrons to make it look a little bit more unique. My project is based on the Bohr model which was based on astronomy of that time which emerged from these star charts so I decided to use this theme to have a little personality and originality. Thanks for reading!!
Ships:
ATOM SIMULATOR!! Simulate an atom by adding subatomic particles manually or selecting elements directly from the periodic table and learn about every ground state isotope humanity has ever discovered! When I was starting this project I wanted to make something that I could show to others and be proud of it and this is what I have made! You can add any amount of subatomic particles and see the details of the isotope you have created. (Trust me there are many surprising combinations which actually exist). There are 3588 isotopes which exist in ground state and all are in the database of this project. This is a great opportunity to learn about the properties of every isotope in a fun and interactive way! What I built: :> The main canvas with the simulation of the atom. :> The element panel shows the information of the element you have created. :> The isotope panel gives you all the information about the current isotope you created and also visually highlights invalid isotopes, :> The control buttons let you ADD/REMOVE subatomic particles with full control. :> The periodic table with all the elements with proper buttons to jump to elements. :> Proper animation of the atom in the canvas. How I made it easy to use: :>Deployed it to GitHub pages so that anyone can easily access it without having to clone the repository. :> +10/-10 button help users to jump between atoms easily as well as see a satisfying animation. :> Added the ability to type in the desired number of subatomic particles for even more accessibility. :> The periodic table lets people jump to any desired element they want, so they do not have to struggle to reach any desired element. :> Made it so that the periodic table pops up with one click and disappears instantly when the user clicks an element or outside the table for a smooth and fast user experience. :> Colour coded each element in the periodic table depending on their types. :> If the user creates an invalid isotope, the isotope panels visually highlight it so that the user does not get confused. Technicalities A lot of things have been used in this project I have listed the things I learnt below: HTML5 Canvas Canvas Drawing Canvas Coordinate Systems requestAnimationFrame() Graphics / Animation Loops Mathematical Animation Polar / Circular Positioning Trigonometry in Programming Canvas Transformations 2.5D / Depth Illusion Painter’s Algorithm / Draw Order Dynamic Geometry State-Driven Graphics Data-Driven Application Design Managing Dynamic Object Collections Animation State Interpolated Animation Dynamic Numbers of Animated Objects Dynamic Shell Allocation UI State I am currently learning web development and these are my early steps. This is my first time using canvas so I gave it my best. The project may look very long in itself but it would have been way longer if you add the time spent reading documentation and watching videos about canvas Api. Since I started in stardance I have gone from not even knowing html syntax to here and I plan to further improve my understanding of canvas by making a game next. So, wish me luck. Please read the README for detailed explanation of my project!...
|
1792853827.402444
|
1792940227.402444
|
|
41825
|
Asobi by @PAPER_01 | Stardance
|
PAPER_01
|
1
|
67.01
|
1349
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-28T10:15:24Z", "hours": 62.0, "multiplier": 18.18, "payout": 1349, "blessing": "neutral", "text": "Asobi is a site I am planning to make a mini-game collection. It will be containing tones of games in the future and I am integrating full frontend and backend on it especially for the Leaderbaord and login . Along with to prevent cheating on some game like Guess The Number [sorry , i suck at naming (ᵕ—ᴗ—)]. Currently I have added only one game , but It took me more time as I had to make the inital pages like landing , gamelist, leaderboard, signup and more like that. Please consider reading ReadMe on github for detail explaination , I really hope you will enjoy playing the game . Thank you so much for reading , Have a nice day =)", "repo": "https://github.com/shrestha-01/Asobi", "demo": "https://shrestha-project-08.66ghz.com/"}]...
|
[{"post_id": 63450, "ts": "202 [{"post_id": 63450, "ts": "2026-09-07T09:43:39Z", "hours": 2.5128, "text": "Asobi Devlog #17 Hello everyone, welcome to Devlog #17 of Asobi! (ノ◕ヮ◕)ノ*:・゚ Clicker Game Update Okay, umm.. I’m writing this devlog to update you about the The Clicker game of Asobi . So, I have added a basic CSS design to the game. I also tried a couple of other designs as well. . But decided to go with this design . I will add a screenshot below. Currently, I have this one, but I’m still not sure what I’m going to use . I’m still experimenting with the design, so if I change anything, I’ll let you all know in the next devlog. ( ̄▽ ̄)ゞ That’s It! And yeah, That’s all for this devlog. If you want me to explain something, then please do tell me in the comments. I’ll try my best to explain it as well. (≧▽≦) Thank you so much for reading, and have a very nice day! (ノ´ヮ`)ノ*:・゚✧"}, {"post_id": 60274, "ts": "2026-09-02T15:25:32Z", "hours": 2.5, "text": "Asobi Devlog #16 Hello everyone, welcome to Devlog #16 of Asobi! So, I just started working on the new game, the Clicker . Code Refinement Okay, so talking about the updates, I did some code refinement . I mean, I just cleaned up some code in the old game. Nothing major, but I thought it would be better to clean things up before moving forward. Clicker Game And yeah, I have started working on the Clicker game . Though it looks too empty right now, I have only worked on the HTML and JavaScript part for now. I guess the main thing I worked on this time was working on the precision. Precision Problem I was trying different ways to count the clicks, and I was facing an issue with maintaining the precision . I was not able to get anything more precise than two digits. For example, something like: 3.7 After the 7 , I could not really attain any significant number. But I did search online and looked at other similar games and found out about the performance.now() in JavaScript, which I didn’t know about before. So yeah, that was a lesson for me as well . ( ̄▽ ̄)ゞ Now I can use it to get much more precise timing for calculating the clicks per second. 10 Seconds Challenge For now, I have selected only 10 seconds of time in this game During those 10 seconds, the user can click the button as many times as they can, and the game will count their CPS (Clicks Per Second) . Though this is just the beginning, I’m planning to add lots of things in the future . Current Progress I’ll still add a screenshot of the current progress. Though, honestly, it will be quite empty and blank right now. =D But yeah, this is just the beginning of the Clicker game. That’s It! Yeah, that’s all for this devlog! If you think I did not explain something properly, or you want to know anything about the game, then please do tell me in the comments. I’ll try my best to explain it there. Thank you so much for reading! Have a nice day! (≧▽≦)"}, {"post_id": 56523, "ts": "2026-08-28T10:02:42Z", "hours": 1.0314, "text": "Finally, Shipping Soon! Hello everyone, welcome to Devlog #16 of Asobi! Final Changes Before Shipping So, the few changes I did before shipping are: Site Icon I have added the icon for the site . GIF to WEBM I converted all the GIFs to WEBM files , as there was some glitche with the GIF files because of which the file size was becoming too large. Because of this, the site’s loading screen was sometimes being shown for over a minute . So, I converted them to WEBM to reduce the file size and improve the loading time. Loading Screen I have also added the same loading screen to the Game List page as well . While the images and game list logos are being loaded, it will now show a loading screen instead of leaving the page empty. I guess that’s it! Finally Shipping! You can check out the game here: https://shrestha-project-08.66ghz.com/ Play in full screen for better experience [Press F11] Also I will attach a overview video of the site You can play the game using the link above. Thank you so much for reading, and I hope you all enjoy! Have a nice day! =)"}, {"post_id": 55311, "ts": "2026-08-27T01:47:11Z", "hours": 2.25, "text": "Asobi Devlog #15 Hello everyone, welcome to Devlog #15 of Asobi! Okay, so in this update,I have to inform about the bugs fixed and some hosting issue I am facing … Bug Fixes I fixed some bugs related to the scores . Sometimes, scores were not being updated properly , and sometimes I was being redirected from the username page back to the game list again and again . And yes, I did use AI to help me help me spot and debug these bugs. Leaderboard Icon Removed I also removed the Leaderboard sign from the game list . Obviously, there isn’t really a reason to show the leaderboard there because no game has been selected yet , so there is no specific leaderboard to display. Trying to Ship Asobi Right now, I am trying to ship Asobi as soon as possible , but I haven’t been able to find a reliable hosting site yet. Previously, I used InfinityFree , but due to some problems, I am currently unable to properly ship the site using it. To be more precise, I uploaded a GIF that is around 700 KB , but as soon as I reload the file manager in Infinityfree, for some reason its size increases to around 6 MB . Because the file becomes much larger, the loading time also increases, which makes the site feel slow adn laggy . I found another hosting service as well, but I forgot its name. I will mention it below once I remember. (AwardSpace) The problem with that one is that it **doesn’t provide SSL certification for free **, so the browser keeps showing warnings such as “Not Secure site” . So yeah, if I find a reliable hosting service, or if the problem with InfinityFree gets fixed, I should be able to ship Asobi really soon . Loading Screen One more thing I added is a loading screen . For now,I have only added it to guess.html . README Update I have also added the credits to the README regarding the loading screen design =) That’s It! Yeah, that’s pretty much it for this devlog! If you didn’t understand something or if you think I didnt explain anything properly then please do tell me in the comments, and I will try to explain it again. Also, if anyone knows a reliable hosting site that supports PHP and SQL , please do tell me in the comments. That would be a great help ! Thank you so much for reading, and have a nice day! =)"}, {"post_id": 53788, "ts": "2026-08-24T14:21:36Z", "hours": 6.1097, "text": "Asobi Devlog #14 Hello everyone, welcome to Devlog #14 of Asobi! So this time, I have tried to move almost everything to the backend . Moving Everything to the Backend Previously, things like the number generation, checking, score calculation, and results were handled on the frontend. But that had a pretty obvious problem. When I created this type of game previously, some people would simply console.log the random number and get the correct answer almost like i mean everytime. And Some people even executed the saveScore function themselves (╥﹏╥) So, to avoid that this time, I have moved almost everything to the backend . The number generation, checking, score calculation, and other important game logic are now handled by the server in the backend. Lets hope everything will be fair now (ᵕ—ᴗ—) Best Score on Difficulty Levels Along with that, I have also made some visual changes . Previously, the best score or rather, the number of tries was displayed as plain text at a constant place . Now, whenever you click on a difficulty level, your best result will be displayed at the bottom-right of that particular level label . I will attach a image below , I guess thats the only image i can show for this update (ó﹏ò。) It shows the lowest number of tries in which you have ever completed that difficulty level. And obviously, the lower the number of tries, the better . Points System And I also wanted to make one thing clear. Yes, this time I have used a points system instead of directly using the number of tries for the leaderboard. Let me explain why. Previously, when I made this type of game, I used the number of tries to determine the ranking. For example, if the Beginner difficulty is from 1–10 and you completed it in: 1 try → Rank 1 2 tries → Rank 2 3 tries → Rank 3 And so on… But there was a problem with this system. A lot of people were able to complete the lower-level difficulties in just 1 try . This meant that there could be around 8 or 9 people with Rank 1 on some of the easier levels , it kinda made the rank 1 less special or look cheap tbh. Technically, that was fair, but it didn’t felt quite right. It was something like , Once you got Rank 1, there was also basically nothing more to achieve . So this time, I implemented a points system . The basic idea is: Lower number of tries = More points This gives players more room to compete instead of simply having multiple people stuck at the same rank and maybe also encouraging them to collect more points. ##Responsiveness I will be honest about this , I am not really good at making sites responsive so i took the help of Gemini for making the site responsive. That’s It! I guess thats it, So yeah, that’s basically what I have added this time. Also,I thought of shipping it by today but there is another bug (sometimes the score is not being saved and it is requiring me to logout and login, i honestly havent still figured it out why its happening yet, But I am hoping to fix it soon and Also ship it soon. I hope I was able to explain everything clearly. If something was unclear, please tell me in the comments, and I will try to explain it again. Thank you so much for reading, and have a nice day! =)"}, {"post_id": 52831, "ts": "2026-08-23T05:57:32Z", "hours": 7.3242, "text": "Asobi Devlog #13 Hello everyone, welcome to Devlog #13 of Asobi! Okay, in this devlog, I would say there are quite a few additions , but I assume these two can be considered the main ones. Sign Up & Login The first major addition is the Sign Up and Login feature . When you try to log in for the first time, you will need to create an account first. You don’t really need to verify your email or anything like that. I did think about using OTP verification , but I felt like that would be a bit too much pain tbh So, I tried keeping it simple .૮₍ ´ ꒳ `₎ა You just need to: Enter a unique username Enter a password Confirm your password And you’re ready to start playing! That’s basically it. Leaderboard Time Filters Apart from user authentication, another major and somewhat time-consuming addition was the leaderboard time filter . Now, you can change the leaderboard based on different time periods: Last 24 Hours This Week All Time I thought this would be better because someone who is new to the game shouldn’t have to immediately compete with someone who has been playing for a long time. With the Last 24 Hours leaderboard, new players at least have a chance to compete and get themselves onto the leaderboard. Other Small Changes There are also a few other smaller additions and changes. I have changed the color of some text , including the numbers, and made some other minor visual adjustments. I have also changed some of the text throughout the game . These changes aren’t anything too significant, but they should be noticeable. New Game Banner And finally, I have added a banner for the next game that I will be working on later. The game is going to be a The Clicker . I will be updating it soon, but for now, I’ll be skipping this project and working on other parts of Asobi first. That’s It! And yeah, I guess that’s it for this devlog! I will be working on making the site calculation , like the generating and checking number saving server side so that no one cheats like before (╥﹏╥) .(old story short , I have made similar game before too where many people cheated as everything was done in frontend but it was deleted and I am making better version of it from the scratch) If anything was unclear please tell me in the comments and I will try again to explain . Thank You so much Thank you so much for reading, and have a nice day! =)"}, {"post_id": 51430, "ts": "2026-08-21T04:09:53Z", "hours": 6.5903, "text": "Asobi Devlog #12 Hello everyone, welcome to Devlog #12 of Asobi! So, umm… the main change—or addition, I would say—is the Hint Reaction . Hint Reaction GIFs GIFs are always fun, so to make the game more interesting, I have added GIFs to the game. But their role is actually more than that . For Hardcore Mode players (as well as normal players), the GIFs can sometimes act as a Secret Hint . Let me explain. There are a total of 18 GIFs that will be displayed randomly in the game: (The concept is same as my old game which was taken down, but i m trying to make it even better this time) 3 GIFs hint you to guess lower 3 GIFs hint you to guess higher The other 12 GIFs are just for fun This means there is a 33.33% chance that the GIF you get is actually a hint! =) And dont worry you wont be displayed the gifs to guess higher when the random number choosen is lower =). This feature is applied to all levels and modes . Top 3 Leaderboard Texture Okay, the next change is that I have added a sort of texture to the backgrounds of the Top 3 players . This has been added to both: The leaderboard on the main game page The full leaderboard page Difficulty Backgrounds I have also added a little background color to the difficulty levels , such as: Beginner Normal Hard etc. Before it was plain text and honestly i agree it didnt even seems clickable SVGs on the Navigation Bar Another change is that I have added SVG icons to the navigation bar at the top . あそび — Asobi And finally, I added the Japanese text あそび , meaning Asobi , below the logo. That’s All! I guess that’s all for this devlog! If anything was unclear, please do tell me in the comments, and I will try again to explain it. Thank you for reading, and have a nice day! =)"}, {"post_id": 50123, "ts": "2026-08-19T06:27:55Z", "hours": 6.6922, "text": "Devlog #11 - Asobi (あそび) Hello everyone, welcome to Devlog #11 of Asobi. Update So, I have finally finished working on the leaderboard page , and i have alos added a score card , which will be helping you understand about the pointing system of the game . I will attach a video below instead of explaining what i just made , i guess that would be much better than words =) And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 46310, "ts": "2026-08-13T13:22:27Z", "hours": 4.5028, "text": "Devlog #10 - Asobi (あそび) Hello everyone, welcome to Devlog #10 of Asobi. Update I just added a point system and am currently working on a seperate page to show leaderbaord and few other info like total games and stuff. so Let me explain the point system. Each difficulty has base point , if you guess the number in just one try , you get the base point ,and if you do it in more no. of tries/attempts you will lose points. Also there is a limit in how much you will get despite the no. of time you attempt , For an example if you even go like 100 attempts to guess the number between 1 to 10 then you will get at least 2 points in the beginner level . Its different for different level. I will try to make a table below. Difficulty | Base Points | Points Lost | Minimum Beginner | 10 | -1 | 2 Normal | 25 | -2 | 5 Hard | 50 | -3 | 10 Expert | 100 | -4 | 20 Master | 200 | -5 | 40 Impossible | 500 | -6 | 100 #Also The custom games are not eligible for Gaining points This devlog might have gotten abit big. Sorry about that, but i need to explain things. Also the main formula to calcualte points Points = Base Points - (Attempts - 1) × Attempt Penalty And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 45610, "ts": "2026-08-12T06:50:57Z", "hours": 2.6717, "text": "Devlog #09 - Asobi (あそび) Hello everyone, welcome to Devlog #09 of Asobi. Update Finally Database is connected and actually working . I spent half an hour doing everything to fix , but not turning on mariaDB (╥﹏╥) . But anyway Finally the leaderboard is working , but It currently show all the tries , so still need to work on alots of thing, and still have to move the number generation to backend as i dont want to end up like my old Binary Bound . I am still working on backend to conclude , except for a design on the leaderboard players list design. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 45128, "ts": "2026-08-11T12:48:02Z", "hours": 2.5367, "text": "Devlog #08 - Asobi (あそび) Hello everyone, welcome to Devlog #08 of Asobi. Update I have completed working on the layout of the gamelist section where all the mini games will be displayed ,currently I have only made Guess the Numeber so i have kept only that for now. Also I have finally started working on the backend (php ,sql). I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 44602, "ts": "2026-08-10T14:07:37Z", "hours": 2.2981, "text": "Devlog #07 - Asobi (あそび) Hello everyone, welcome to Devlog #07 of Asobi. Update I have just completed working on the html and css part of the Asobi username , where username will be asked to the new users[entire js part is untouched right now]. I will upload a short video , i think that might be better than explain the design. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 44523, "ts": "2026-08-10T10:43:41Z", "hours": 6.8644, "text": "Devlog #06 - Asobi (あそび) Hello everyone, welcome to Devlog #06 of Asobi. Update I have completed working on the landing page . Also I wanted to share how I take steps . Umm so basically I first go to chatgpt and tell to generate image of what i am going to make and then i ask it what the site should look like , and later i write code and make my site look same as the reference image (I also keep the reference image in the github, you can check it out). [The screenshot below is image of site itself] I also added some animated button design on the “Play Custom” button . I will put 2 screenshots if I am allowed to . And currently I am working on the page to accept the username . Also I have added sound effect on hover of the each letter of A S O B I I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 40723, "ts": "2026-08-04T13:15:48Z", "hours": 3.5592, "text": "Devlog #05 - Asobi (あそび) Hello everyone, welcome to Devlog #05 of Asobi. Update I have almost finished the layout .Additionally , I have changed the New Game btn design , and Guess design . I will provide the link of them in the Credits session of readme later on . I will attach a short video rather then explain with words , ig that would be much better =) I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)"}, {"post_id": 39925, "ts": "2026-08-03T07:37:30Z", "hours": 1.8361, "text": "Devlog #04 - Asobi (あそび) Hello everyone, welcome to Devlog #04 of Asobi. Update I actually dont have much to give update about , i have been struggling with the layout , I know tools like figma exists but i dont really know how to use it (and neither tried ) but i am still working the layout, i made a layout design on paint which i will attach here . Sorry , Hopefully i will be able to share something intresting next time (╥﹏╥) Also I have my entrance exam soon , so will not be able to work much for around a week. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. (Reference img (AI generated) available in GitHub) Thank you so much for reading, and have a nice day. =)"}, {"post_id": 38992, "ts": "2026-08-01T16:51:43Z", "hours": 2.7197, "text": "Devlog #03 - Asobi (あそび) Hello everyone, welcome to Devlog #03 of Asobi. Update I will be trying to keep it short. Custom Game Here you can select the lower and higher limit yourself and choose options like minimum number , maximum number, no of guesses. Colors to the Arrow in history. Input limit Now i have added input limit which means if there its a beginner level with range from 1 to 10 then , and if you try to enter 99 or any number greater than 10 , then it will autocorrect it self to the highest and will also display a range msg =) Still working on the layout… Also I have my entrance exam soon , so will not be able to work much for around a week. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. ( ̄︶ ̄)↗ Thank you so much for reading, and have a nice day. (≧◡≦)"}, {"post_id": 38162, "ts": "2026-07-31T12:37:26Z", "hours": 3.6875, "text": "Devlog #02 - Asobi (あそび) Hello everyone, welcome to Devlog #02 of Asobi. Update I have added a few more features, and I will try to summarize them in short. Added different levels: Beginner (1-10) Easy (1-50) Normal (1-100) Medium (1-500) Hard (1-1K) Expert (1-10K) Master (1-100K) Impossible (1-1M) Extra hint When your guess is 5% close or lower to the required randomNum , it will show a message like “You are very close.” When your guess is 20% close or lower , it will show a message like “You are close.” And if it’s away by more than 20% , it will show a message like “Nah, too far.” I have also added a history, which shows your recent choices, with an arrow indicating whether your choice was higher or lower than the required number. I know that all these hints will make the game easier, but don’t worry. I will make sure to add things that make the game interesting as well as a bit difficult. ( •̀ ω •́ )✧ I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. ( ̄︶ ̄)↗ Thank you so much for reading, and have a nice day. (≧◡≦) ♡"}, {"post_id": 37488, "ts": "2026-07-30T08:22:18Z", "hours": 1.1131, "text": "Devlog #01 - Asobi (あそび) Hello everyone, welcome to Devlog #01 of Asobi. A lot of things happened, but let’s keep working. I’m currently working on Asobi, あそび (which means “play” in Japanese). It will be a website that will contain a collection of games. Currently working on Guess the number game, will add tones of game soooon I’m planning to add features like leaderboards, achievements, levels, effects, and many more things. I’ll be adding those features one by one over time (if I get enough ideas -_-). Right now, I’ve only finished the simple basic design and js code for the 1 to 100 guessing game. Also, I’m using a neumorphism design (like before, to be honest), but the code is completely different. I’ll keep the link to the website from which I’m taking the design below. (It’s allowed, I asked about it on Slack, so don’t go banning me for that. ( ̄▽ ̄”) ) Neumorphism: https://neumorphism.io/#e0e0e0 I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain you there. ( ̄︶ ̄)↗ Thank you so much for reading and have a nice day. (≧◡≦) Also Thanks @Sam for support =)"}]...
|
Title: Asobi by @PAPER_01 | Stardance
Devlogs:
De Title: Asobi by @PAPER_01 | Stardance
Devlogs:
Devlog #01 - Asobi (あそび) Hello everyone, welcome to Devlog #01 of Asobi. A lot of things happened, but let’s keep working. I’m currently working on Asobi, あそび (which means “play” in Japanese). It will be a website that will contain a collection of games. Currently working on Guess the number game, will add tones of game soooon I’m planning to add features like leaderboards, achievements, levels, effects, and many more things. I’ll be adding those features one by one over time (if I get enough ideas -_-). Right now, I’ve only finished the simple basic design and js code for the 1 to 100 guessing game. Also, I’m using a neumorphism design (like before, to be honest), but the code is completely different. I’ll keep the link to the website from which I’m taking the design below. (It’s allowed, I asked about it on Slack, so don’t go banning me for that. ( ̄▽ ̄”) ) Neumorphism: https://neumorphism.io/#e0e0e0 I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain you there. ( ̄︶ ̄)↗ Thank you so much for reading and have a nice day. (≧◡≦) Also Thanks @Sam for support =)
Devlog #02 - Asobi (あそび) Hello everyone, welcome to Devlog #02 of Asobi. Update I have added a few more features, and I will try to summarize them in short. Added different levels: Beginner (1-10) Easy (1-50) Normal (1-100) Medium (1-500) Hard (1-1K) Expert (1-10K) Master (1-100K) Impossible (1-1M) Extra hint When your guess is 5% close or lower to the required randomNum , it will show a message like “You are very close.” When your guess is 20% close or lower , it will show a message like “You are close.” And if it’s away by more than 20% , it will show a message like “Nah, too far.” I have also added a history, which shows your recent choices, with an arrow indicating whether your choice was higher or lower than the required number. I know that all these hints will make the game easier, but don’t worry. I will make sure to add things that make the game interesting as well as a bit difficult. ( •̀ ω •́ )✧ I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. ( ̄︶ ̄)↗ Thank you so much for reading, and have a nice day. (≧◡≦) ♡
Devlog #03 - Asobi (あそび) Hello everyone, welcome to Devlog #03 of Asobi. Update I will be trying to keep it short. Custom Game Here you can select the lower and higher limit yourself and choose options like minimum number , maximum number, no of guesses. Colors to the Arrow in history. Input limit Now i have added input limit which means if there its a beginner level with range from 1 to 10 then , and if you try to enter 99 or any number greater than 10 , then it will autocorrect it self to the highest and will also display a range msg =) Still working on the layout… Also I have my entrance exam soon , so will not be able to work much for around a week. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. ( ̄︶ ̄)↗ Thank you so much for reading, and have a nice day. (≧◡≦)
Devlog #04 - Asobi (あそび) Hello everyone, welcome to Devlog #04 of Asobi. Update I actually dont have much to give update about , i have been struggling with the layout , I know tools like figma exists but i dont really know how to use it (and neither tried ) but i am still working the layout, i made a layout design on paint which i will attach here . Sorry , Hopefully i will be able to share something intresting next time (╥﹏╥) Also I have my entrance exam soon , so will not be able to work much for around a week. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. (Reference img (AI generated) available in GitHub) Thank you so much for reading, and have a nice day. =)
Devlog #05 - Asobi (あそび) Hello everyone, welcome to Devlog #05 of Asobi. Update I have almost finished the layout .Additionally , I have changed the New Game btn design , and Guess design . I will provide the link of them in the Credits session of readme later on . I will attach a short video rather then explain with words , ig that would be much better =) I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #06 - Asobi (あそび) Hello everyone, welcome to Devlog #06 of Asobi. Update I have completed working on the landing page . Also I wanted to share how I take steps . Umm so basically I first go to chatgpt and tell to generate image of what i am going to make and then i ask it what the site should look like , and later i write code and make my site look same as the reference image (I also keep the reference image in the github, you can check it out). [The screenshot below is image of site itself] I also added some animated button design on the “Play Custom” button . I will put 2 screenshots if I am allowed to . And currently I am working on the page to accept the username . Also I have added sound effect on hover of the each letter of A S O B I I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #07 - Asobi (あそび) Hello everyone, welcome to Devlog #07 of Asobi. Update I have just completed working on the html and css part of the Asobi username , where username will be asked to the new users[entire js part is untouched right now]. I will upload a short video , i think that might be better than explain the design. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #08 - Asobi (あそび) Hello everyone, welcome to Devlog #08 of Asobi. Update I have completed working on the layout of the gamelist section where all the mini games will be displayed ,currently I have only made Guess the Numeber so i have kept only that for now. Also I have finally started working on the backend (php ,sql). I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #09 - Asobi (あそび) Hello everyone, welcome to Devlog #09 of Asobi. Update Finally Database is connected and actually working . I spent half an hour doing everything to fix , but not turning on mariaDB (╥﹏╥) . But anyway Finally the leaderboard is working , but It currently show all the tries , so still need to work on alots of thing, and still have to move the number generation to backend as i dont want to end up like my old Binary Bound . I am still working on backend to conclude , except for a design on the leaderboard players list design. I guess that’s it for this devlog. And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #10 - Asobi (あそび) Hello everyone, welcome to Devlog #10 of Asobi. Update I just added a point system and am currently working on a seperate page to show leaderbaord and few other info like total games and stuff. so Let me explain the point system. Each difficulty has base point , if you guess the number in just one try , you get the base point ,and if you do it in more no. of tries/attempts you will lose points. Also there is a limit in how much you will get despite the no. of time you attempt , For an example if you even go like 100 attempts to guess the number between 1 to 10 then you will get at least 2 points in the beginner level . Its different for different level. I will try to make a table below. Difficulty | Base Points | Points Lost | Minimum Beginner | 10 | -1 | 2 Normal | 25 | -2 | 5 Hard | 50 | -3 | 10 Expert | 100 | -4 | 20 Master | 200 | -5 | 40 Impossible | 500 | -6 | 100 #Also The custom games are not eligible for Gaining points This devlog might have gotten abit big. Sorry about that, but i need to explain things. Also the main formula to calcualte points Points = Base Points - (Attempts - 1) × Attempt Penalty And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Devlog #11 - Asobi (あそび) Hello everyone, welcome to Devlog #11 of Asobi. Update So, I have finally finished working on the leaderboard page , and i have alos added a score card , which will be helping you understand about the pointing system of the game . I will attach a video below instead of explaining what i just made , i guess that would be much better than words =) And as always, if anything was unclear in my explanation, then plz comment and I will try to explain it there. Thank you so much for reading, and have a nice day. =)
Asobi Devlog #12 Hello everyone, welcome to Devlog #12 of Asobi! So, umm… the main change—or addition, I would say—is the Hint Reaction . Hint Reaction GIFs GIFs are always fun, so to make the game more interesting, I have added GIFs to the game. But their role is actually more than that . For Hardcore Mode players (as well as normal players), the GIFs can sometimes act as a Secret Hint . Let me explain. There are a total of 18 GIFs that will be displayed randomly in the game: (The concept is same as my old game which was taken down, but i m trying to make it even better this time) 3 GIFs hint you to guess lower 3 GIFs hint you to guess higher The other 12 GIFs are just for fun This means there is a 33.33% chance that the GIF you get is actually a hint! =) And dont worry you wont be displayed the gifs to guess higher when the random number choosen is lower =). This feature is applied to all levels and modes . Top 3 Leaderboard Texture Okay, the next change is that I have added a sort of texture to the backgrounds of the Top 3 players . This has been added to both: The leaderboard on the main game page The full leaderboard page Difficulty Backgrounds I have also added a little background color to the difficulty levels , such as: Beginner Normal Hard etc. Before it was plain text and honestly i agree it didnt even seems clickable SVGs on the Navigation Bar Another change is that I have added SVG icons to the navigation bar at the top . あそび — Asobi And finally, I added the Japanese text あそび , meaning Asobi , below the logo. That’s All! I guess that’s all for this devlog! If anything was unclear, please do tell me in the comments, and I will try again to explain it. Thank you for reading, and have a nice day! =)
Asobi Devlog #13 Hello everyone, welcome to Devlog #13 of Asobi! Okay, in this devlog, I would say there are quite a few additions , but I assume these two can be considered the main ones. Sign Up & Login The first major addition is the Sign Up and Login feature . When you try to log in for the first time, you will need to create an account first. You don’t really need to verify your email or anything like that. I did think about using OTP verification , but I felt like that would be a bit too much pain tbh So, I tried keeping it simple .૮₍ ´ ꒳ `₎ა You just need to: Enter a unique username Enter a password Confirm your password And you’re ready to start playing! That’s basically it. Leaderboard Time Filters Apart from user authentication, another major and somewhat time-consuming addition was the leaderboard time filter . Now, you can change the leaderboard based on different time periods: Last 24 Hours This Week All Time I thought this would be better because someone who is new to the game shouldn’t have to immediately compete with someone who has been playing for a long time. With the Last 24 Hours leaderboard, new players at least have a chance to compete and get themselves onto the leaderboard. Other Small Changes There are also a few other smaller additions and changes. I have changed the color of some text , including the numbers, and made some other minor visual adjustments. I have also changed some of the text throughout the game . These changes aren’t anything too significant, but they should be noticeable. New Game Banner And finally, I have added a banner for the next game that I will be working on later. The game is going to be a The Clicker . I will be updating it soon, but for now, I’ll be skipping this project and working on other parts of Asobi first. That’s It! And yeah, I guess that’s it for this devlog! I will be working on making the site calculation , like the generating and checking number saving server side so that no one cheats like before (╥﹏╥) .(old story short , I have made similar game before too where many people cheated as everything was done in frontend but it was deleted and I am making better version of it from the scratch) If anything was unclear please tell me in the comments and I will try again to explain . Thank You so much Thank you so much for reading, and have a nice day! =)
Asobi Devlog #14 Hello everyone, welcome to Devlog #14 of Asobi! So this time, I have tried to move almost everything to the backend . Moving Everything to the Backend Previously, things like the number generation, checking, score calculation, and results were handled on the frontend. But that had a pretty obvious problem. When I created this type of game previously, some people would simply console.log the random number and get the correct answer almost like i mean everytime. And Some people even executed the saveScore function themselves (╥﹏╥) So, to avoid that this time, I have moved almost everything to the backend . The number generation, checking, score calculation, and other important game logic are now handled by the server in the backend. Lets hope everything will be fair now (ᵕ—ᴗ—) Best Score on Difficulty Levels Along with that, I have also made some visual changes . Previously, the best score or rather, the number of tries was displayed as plain text at a constant place . Now, whenever you click on a difficulty level, your best result will be displayed at the bottom-right of that particular level label . I will attach a image below , I guess thats the only image i can show for this update (ó﹏ò。) It shows the lowest number of tries in which you have ever completed that difficulty level. And obviously, the lower the number of tries, the better . Points System And I also wanted to make one thing clear. Yes, this time I have used a points system instead of directly using the number of tries for the leaderboard. Let me explain why. Previously, when I made this type of game, I used the number of tries to determine the ranking. For example, if the Beginner difficulty is from 1–10 and you completed it in: 1 try → Rank 1 2 tries → Rank 2 3 tries → Rank 3 And so on… But there was a problem with this system. A lot of people were able to complete the lower-level difficulties in just 1 try . This meant that there could be around 8 or 9 people with Rank 1 on some of the easier levels , it kinda made the rank 1 less special or look cheap tbh. Technically, that was fair, but it didn’t felt quite right. It was something like , Once you got Rank 1, there was also basically nothing more to achieve . So this time, I implemented a points system . The basic idea is: Lower number of tries = More points This gives players more room to compete instead of simply having multiple people stuck at the same rank and maybe also encouraging them to collect more points. ##Responsiveness I will be honest about this , I am not really good at making sites responsive so i took the help of Gemini for making the site responsive. That’s It! I guess thats it, So yeah, that’s basically what I have added this time. Also,I thought of shipping it by today but there is another bug (sometimes the score is not being saved and it is requiring me to logout and login, i honestly havent still figured it out why its happening yet, But I am hoping to fix it soon and Also ship it soon. I hope I was able to explain everything clearly. If something was unclear, please tell me in the comments, and I will try to explain it again. Thank you so much for reading, and have a nice day! =)
Asobi Devlog #15 Hello everyone, welcome to Devlog #15 of Asobi! Okay, so in this update,I have to inform about the bugs fixed and some hosting issue I am facing … Bug Fixes I fixed some bugs related to the scores . Sometimes, scores were not being updated properly , and sometimes I was being redirected from the username page back to the game list again and again . And yes, I did use AI to help me help me spot and debug these bugs. Leaderboard Icon Removed I also removed the Leaderboard sign from the game list . Obviously, there isn’t really a reason to show the leaderboard there because no game has been selected yet , so there is no specific leaderboard to display. Trying to Ship Asobi Right now, I am trying to ship Asobi as soon as possible , but I haven’t been able to find a reliable hosting site yet. Previously, I used InfinityFree , but due to some problems, I am currently unable to properly ship the site using it. To be more precise, I uploaded a GIF that is around 700 KB , but as soon as I reload the file manager in Infinityfree, for some reason its size increases to around 6 MB . Because the file becomes much larger, the loading time also increases, which makes the site feel slow adn laggy . I found another hosting service as well, but I forgot its name. I will mention it below once I remember. (AwardSpace) The problem with that one is that it **doesn’t provide SSL certification for free **, so the browser keeps showing warnings such as “Not Secure site” . So yeah, if I find a reliable hosting service, or if the problem with InfinityFree gets fixed, I should be able to ship Asobi really soon . Loading Screen One more thing I added is a loading screen . For now,I have only added it to guess.html . README Update I have also added the credits to the README regarding the loading screen design =) That’s It! Yeah, that’s pretty much it for this devlog! If you didn’t understand something or if you think I didnt explain anything properly then please do tell me in the comments, and I will try to explain it again. Also, if anyone knows a reliable hosting site that supports PHP and SQL , please do tell me in the comments. That would be a great help ! Thank you so much for reading, and have a nice day! =)
Finally, Shipping Soon! Hello everyone, welcome to Devlog #16 of Asobi! Final Changes Before Shipping So, the few changes I did before shipping are: Site Icon I have added the icon for the site . GIF to WEBM I converted all the GIFs to WEBM files , as there was some glitche with the GIF files because of which the file size was becoming too large. Because of this, the site’s loading screen was sometimes being shown for over a minute . So, I converted them to WEBM to reduce the file size and improve the loading time. Loading Screen I have also added the same loading screen to the Game List page as well . While the images and game list logos are being loaded, it will now show a loading screen instead of leaving the page empty. I guess that’s it! Finally Shipping! You can check out the game here: https://shrestha-project-08.66ghz.com/ Play in full screen for better experience [Press F11] Also I will attach a overview video of the site You can play the game using the link above. Thank you so much for reading, and I hope you all enjoy! Have a nice day! =)
Asobi Devlog #16 Hello everyone, welcome to Devlog #16 of Asobi! So, I just started working on the new game, the Clicker . Code Refinement Okay, so talking about the updates, I did some code refinement . I mean, I just cleaned up some code in the old game. Nothing major, but I thought it would be better to clean things up before moving forward. Clicker Game And yeah, I have started working on the Clicker game . Though it looks too empty right now, I have only worked on the HTML and JavaScript part for now. I guess the main thing I worked on this time was working on the precision. Precision Problem I was trying different ways to count the clicks, and I was facing an issue with maintaining the precision . I was not able to get anything more precise than two digits. For example, something like: 3.7 After the 7 , I could not really attain any significant number. But I did search online and looked at other similar games and found out about the performance.now() in JavaScript, which I didn’t know about before. So yeah, that was a lesson for me as well . ( ̄▽ ̄)ゞ Now I can use it to get much more precise timing for calculating the clicks per second. 10 Seconds Challenge For now, I have selected only 10 seconds of time in this game During those 10 seconds, the user can click the button as many times as they can, and the game will count their CPS (Clicks Per Second) . Though this is just the beginning, I’m planning to add lots of things in the future . Current Progress I’ll still add a screenshot of the current progress. Though, honestly, it will be quite empty and blank right now. =D But yeah, this is just the beginning of the Clicker game. That’s It! Yeah, that’s all for this devlog! If you think I did not explain something properly, or you want to know anything about the game, then please do tell me in the comments. I’ll try my best to explain it there. Thank you so much for reading! Have a nice day! (≧▽≦)
Asobi Devlog #17 Hello everyone, welcome to Devlog #17 of Asobi! (ノ◕ヮ◕)ノ*:・゚ Clicker Game Update Okay, umm.. I’m writing this devlog to update you about the The Clicker game of Asobi . So, I have added a basic CSS design to the game. I also tried a couple of other designs as well. . But decided to go with this design . I will add a screenshot below. Currently, I have this one, but I’m still not sure what I’m going to use . I’m still experimenting with the design, so if I change anything, I’ll let you all know in the next devlog. ( ̄▽ ̄)ゞ That’s It! And yeah, That’s all for this devlog. If you want me to explain something, then please do tell me in the comments. I’ll try my best to explain it as well. (≧▽≦) Thank you so much for reading, and have a very nice day! (ノ´ヮ`)ノ*:・゚✧
Ships:
Asobi is a site I am planning to make a mini-game collection. It will be containing tones of games in the future and I am integrating full frontend and backend on it especially for the Leaderbaord and login . Along with to prevent cheating on some game like Guess The Number [sorry , i suck at naming (ᵕ—ᴗ—)]. Currently I have added only one game , but It took me more time as I had to make the inital pages like landing , gamelist, leaderboard, signup and more like that. Please consider reading ReadMe on github for detail explaination , I really hope you will enjoy playing the game . Thank you so much for reading , Have a nice day =)...
|
1792878477.024499
|
1793742477.024499
|
|
18514
|
Pokedex by @Ansh904 | Stardance
|
Ansh904
|
1
|
81.0
|
1342
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T15:48:59Z", "hours": 81.0, "multiplier": 19.17, "payout": 1342, "blessing": "neutral", "text": "Cosmidex!!!! A real life multi-platform Pokedex app that can identify a pokemon from a captured photo or uploaded image. The app started with making a scraper using selenium, that I used to scrape around 75,000 images of all 151 pokemon from Google images. The scraper was hard because I didnt knew selenium, but I learned it and made it. After scraping, I trained a yolov8-cls model on google colab using the scraped dataset. Then I converted the model to tflite and made the first android version of the app. Getting the app to work was really painful because it required me to manipulate the image and it’s raw pixel data to transform into the input tensor. After this everything went smoothly and I added a lot of new things like a list of all Pokemon and the fallback page when the model is not confident. I also made a web version of the app using the .web.js extensions, the web version used a tfjs model. After that i have another whole lot of things like a “Guess the Pokemon” game, shinies, a catch feature such that everytime you correctly predict a pokemon, it gets added to your caught pokemon list that is stored in local storage. The app also has shinies and you can toggle to hear pokemon cries. I am really proud of how the ui turned out, the space + pokemon theme really really looks very good, I used images from the nasa image library as backgrounds. On the Pokemon page, which displays the info for a specific pokemon including types, sprite, pokedex text (flavor text), base stats, evolutions and spawn info, the background changes dynamcally based on the type, I spent a lot of time finding those backgrounds, they perfectly match the pokemon typings. All other pages have specific backgrounds too. In the end I really like how the app started from a small side project to taking nearly 2 months to finish. I really want to add more features, but I lack the time cuz I have to study too for entrances, but I surely will add them in the future.", "repo": "https://github.com/Ansh9045/Cosmidex", "demo": "https://pokedex-murex-five-84.vercel.app/"}]...
|
[{"post_id": 44013, "ts": "202 [{"post_id": 44013, "ts": "2026-08-09T14:44:14Z", "hours": 5.5272, "text": "Cosmidex App is now finished !!!!! Finally, after 2 months, the app is finished and I am ready to ship!!! Here’s what I have added : Added Guess the Pokemon, It is addictive as hell, I used the imageTint property of the React native’s Image tag to make the whole silhouette of the pokemon black. After the user guesses it, it displays the orignal pokemon. Added cries, everytime you open the pokemon page for a pokemon, it’s latest or legacy cry plays once, you can toggle to not play it using the button on top right corner of the pokemon image. Added shiny, you can now toggle to show shiny or default sprites of the pokemon. That’s it, the project is finished :( I always want to add more, but I have to study for entrances."}, {"post_id": 42108, "ts": "2026-08-06T17:51:42Z", "hours": 10.1417, "text": "You can now get a Medal!!! Cosmidex Devlog #8 You will now get a medal everytime you catch all 151 pokemon in Generation 1!!! I have added the catch mechanishm Everytime you successfully predict a pokemon using your camera, gallery or from the Not Confident page, that pokemon would be added to your caught list. The caught list is stored in Local storage. Beside the catch mechanism here are other changes: Fixed the camera not closing issue on web by starting the Camera only when the Camera page is focused, otherwise closing it. Removed most of the unnecessay console.log() On android, the Tab was covering pokemon info on the Pokemon Page, to fix that, I made the tab shake toggled on that page, the user now needs to shake their Changed the Home page of android to match that of the web. Added a spawn tab that shows spawn locations along with methods to catch in the generation 1 games, ie- Pokemon Red, Blue and Yellow. Added the README file. Deployed the project on vercel properly, The project is now live on this link What’s next? I now want to add a daily Who’s that pokemon? Game, that would be so fun i guess. I also will add pokemon cries and show shiny versions of pokemons."}, {"post_id": 37136, "ts": "2026-07-29T16:53:18Z", "hours": 10.0683, "text": "Cosmidex Web app is complete !!! Devlog #7 The web version of the Cosmidex app is also finished, FINALLYYY!!! Here is what I have added: Converted the tflite model to TFJS, took a lot of time, many libraries were deprecated, so I had to manually remove imports for those. Created seperate web components using .web.js to upload/capture images -> preprocess -> predict, my codebase for both the android and the web version of the app is still the same. Created seperate page components for the web and changed the design for the Pokemon Page and the Home page. What’s left? The app is mostly ready for it’s first ship, I have hit the 10 hr mark thats why I am uploading a devlog early, but there’s not much left to do, I know I have been saying this for the last 2 devlogs. Here’s what is left: Remove all the console logs that still linger in components for debug. The camera doesn’t close in the web version after capturing and predicting so I have to fix that. Probably change the home page for the android version to match the web. Add some cool animations to it. At last I want to push this project one bit further and add a capturing feature, like you capture a photo of a pokemon and it gets added to your caught pokemon in the pokedex and after capturing all 151 pokemon, you get a medal."}, {"post_id": 31129, "ts": "2026-07-19T09:02:14Z", "hours": 10.1986, "text": "Pokedex Mobile app is finally finished Pokedex Devlog #6 The Pokedex mobile app is now finished and I am working on finishing the web version of the app too. Here is what I have added: A NotConfident page that is displayed when the model can’t give a solid prediction about the image. A ’AllPokemon` page that displays all 151 pokemons from generation 1 in a flatList. I was using a a very messy state based navigation so I updated it to a Stack navigation. I also add a tab at the bottom of the Pokemon, Not confident and All Pokemon pages, though it sometimes overlaps the page content like that of the mewtwo picture. Create a seperate AppContext for the web version to load the model in the web. What’s left in the project before the ship? The Mobile app is finished, I just have to make the Camera and Upload components for the web version of the app and then the project would officially be completed. I was having my exams so I wasn’t able to code for a while :("}, {"post_id": 18221, "ts": "2026-06-29T09:08:48Z", "hours": 15.4481, "text": "Pokedex App is finally complete (mostly) Devlog #5 The app is now mostly complete, this phase of the project went very smoothly. Here is what I have added: After predicting the pokemon, The app sends a request to PokeAPI at the https://pokeapi.co/api/v2/{pokemon_name} endpoint and gets the detailed information of the pokemon. The information is displayed on a pokemon page which includes basic stats, the type of the pokemon, height , wight et. I have also worked a lot of ui, majority of the time was spent in designing the ui. However the home page still looks empty, it is just a div with ImageBackground and a logo with two buttons and 1 scanner icon that I designed in canva. I have also added typed backgrounds, so that every pokemon type has a seperate space themed background, they are mostly nebula images that i found in the NASA Gallery but boyyyy do i like the themes, they look soooo gooood!!!. I am so proud of myself…. What’s left? While the app is mostly ready, there a few things that I still need/want to add: A page displaying all the 151 pokemons in generation 1 A page that is displayed when there is no confident prediction A web version of the app, which would be pretty easy, I just need to change the uploading and capturing logic for it to work on web So hopefully this is my second last devlog for this project, stay tuned !!!!"}, {"post_id": 14918, "ts": "2026-06-24T06:57:10Z", "hours": 14.8033, "text": "Pokedex Devlog #4 Heyyyyy Everyone!!! The training of the model is finally completed and I have made the first version of the Pokedex app , It captures an image using react-native-vision-camera , crops only the middle portion, resizes the image to match my model’s image size of 224*224 px , then gets the raw pixelbuffer, converts into rgb and normalises the values from 0-255 to 0-1.0 . This normalised pixel data is then fed to the model which predicts the class of the image. There were a lot of problems in making the app and there are still lot more to come , but here is everything I did: 1. An Ironical Training After collecting 75,000 images from my custom scraper, I zipped all of those images, and uploaded them directly to my colab notebook, uploading them took half an hour though😫 . I ran the training script at 50 epochs and training the model took another 8 hours . It was really ironical to see the model train in google colab on the same images that google was trying to hide from my little scraper. 2. A Successful Model After the training was completed, I had to test the model to see how it performed and whether I need to retrain it. The results shocked me, I gave the model 12 images from pintrest that it had never seen before and it predicted all of them correctly. The accuracy was way better than what I expect from a model trained on raw data. However, if needed I will clean the dataset and train again. 3. React native Camera Hell Everything was going very smoothly at this point, but I was never prepared for the next phase. I built a blank react native project, installed react-native-vision-camera and added a camera to the app.js, the camera was working, great, so I built a function to capture the photo and display it on the screen, that too worked. But the next step was to process the raw image pixel data into the format that my model required. I searched online, how to resize an image in react-native-vision-camera , the ai results told me to use the resizer package that comes with it. I spent three, three whole days!!! figuring why the resizer was not able to resize the image only to realise that it took a frame output not an image, so I rewrote the whole camera code again to use a live stream instead of capturing a photo. The resizer was working, I then normalized the pixel values while converting it into rgb format and fed the data to my model which outputed complete gibberish, all that work for nothing!!! 😭 I tried logging in the shape of input and output of the model, and the pixelformat of the bufffer and the raw pixel data. But all those were giving either undefined or 0. Nothing seemed to be working at this about, there was something seriously wrong with how I was processing the images. But then going through the docs of react-native-vision-camera , I saw that the image object that my previous capturing images code, that i had dumped, was outputting was a react-native-nitro-image object and it had an inbuilt resizeAsync function. I got frustrated again and rewrote the entire code again, this time with the previous capture photo logic. After cropping, resizing and getting the rgb data in to the required format, I tested the app with a photo of Gloom displayed on my laptop screen and it predicted it correctly. I was sooooo happyyy that it worked and is still working tho the accuracy is low due to pixel noises. What’s next? The hardest parts of the project are completed now, I just need to an api call, after the model predicts the pokemon to, get the details of the pokemon, like it’s type, pokedex entry and other things. The UI also sucks so I will work on that, I think I want to make it space theme, I don’t know how it would look but I will try. Till then… stay tuned!!!"}, {"post_id": 11166, "ts": "2026-06-18T08:01:40Z", "hours": 2.4978, "text": "ME Vs GOOGLE And I WON!!! Pokedex Devlog #3 Hey everyone I have been working on making a real life pokedex, one in which you just take the photo and get the stats of that pokemon on your screen. To achieve this I decided to train a yolov8n-cls model on images of pokemon. But getting those images were a nightmare due to GOOGLE!!! Fighting Google’s anti bot systems I built a custom scraper to scrape pokemon images from google images. But since the very start of the project, Google has been blocking me, it took a lot time for me, who had never touched selenium at that time, to bypass google’s anti bot systems. Since my laptop is very low end, I was using selenium in headless mode which triggered even more red flags for my bot. I switched from regular selenium to undetected_chromedriver , but still google’s system was flagging me with a big captcha that my little bot couldn’t solve. The main issue was that in headless mode, selenium runs a very small window size and it leaves clear machine tracks, I fixed that by using a larger window size and adding a user agent string that I chosen from a list of 10 different ua strings. Getting those Images Not being flagged by google was easy in comparison to this. Targetting the Images inside the search results was an absolute nightmare because instead of fixed static classes or ids google uses dynamic strings that change frequently, I wanted to write code that anyone can use anywhere and that is why couldn’t target those ever changing class names. I tried a lot things from targeting images inside nested divs to images inside divs with specific roles (eg: listitems ) or targeting images that have /imgres in their href attribute. But it took me an entire, with 6+ hours of coding and trying and a lot more researching and inspecting the elements of google images results but I found out that by targetting the images div with role of main with the images having a src or data-deffered attribute using the XPATH: //div[@role='main']//img[@data-deferred or @src] , I get the images which are inside the search results and I can then just use infinite scrolling to load them. The Results Knowing how to target those images, I absolutely destroyed google in the fight by making the scraper and using it to scrape a total of 74,718 images in one night without getting blocked a single time. My goal was was 500 images for each pokemon in generation 1, that is 75,500 total images, The scraper worked better than expected and I was just a 700 hundred images behind the goal. But even for those 700 images, the culprit was google not my little scraper, google didn’t have that many images for a few unpopular pokemon to fulfill my goals. What’s next? After winning the battle against google, I will use the images to train my model today, I already split those. Since my laptop is slow I will utilize google collab for training, using their own tool to train the model using the images they were trying so hard to hide XD….. and I really hope that scraping that many images is not illegal."}, {"post_id": 10545, "ts": "2026-06-17T09:57:17Z", "hours": 10.4703, "text": "Heyy Everyone Pokedex Devlog 2 !!! The selenium scraper is finally complete and it is working perfectly, except it hits a captcha some times, though it is rare. I started building this scraper without any knowledge of selenium. I started with a very basic bot that went to google and typed pokedex, I slowly added more features like using headless mode and WebDriverWait instead of hardcoded time delays. I once crashed my computer while printing the encrypted source code of the google result, XD. But I was also encountering captchas a lot so I switched to undetected_chromedriver and gave it a user agent string so that it won’t be flagged. My first bot was able to scrape the headers of the google search result. I then moved to an image scraping bot, The first version was very simple, It simply went to google images and downloaded every img tag that it could find. However, regardless of the target it scrapped only 21 images, the first being the google logo. This was because of lazy loading. To fix this I implemented an infinite scrolling loop that scrolled until it reached the end of the page or hit the target. But it still wasn’t near the target, after running the script without headless mode, I found out that the user agent string I gave it was of chrome 91, that was released in 2021, after switching to a newer version, chrome 135, it was able to complete it’s target but it was also downloading junk images like logos, icons or spacers that were present inside the search result. I spent 2 days fixing this problem, trying to point towards the image tags of the thubmnail images we see in google images. I wanted to write a code that would work everytime, that is why i couldn’t just point towards the ever changing classname of the img tag. I tried targeting imgs inside specific divs like img inside the div with role of listitems or img tags whose href attribute started with “/imgres” but it didnt worked. After a lot of tries I was able to get it right by targetting the img inside the div with role of main and whose dimensions are more that 100*100px. It worked like a charm. I then quickly made it in the form of a function and gave it 10 pokemons with target of 100 imgs each and boom I got 1000 images in total. I have also decided that labelling 15,100 images would take ridiculously long and the accuracy of the model would also be not accurate. So instead I am building a classification model and labelling it would be easy I am downloading the pokemon images inside the folder with their name. So now that I don’t have to worry about spending hours downloading or labelling them, I would use 500 images per pokemon and create a much accurate model. Currently I am running the script over all pokemons in gen 1, 151 in total, It has reached till Rattata, pokedex number - 19, that means images of 18 out of 151 pokemon are downloaded. I will keep the script running until all are complete and start training the classification model tomorrow."}, {"post_id": 8882, "ts": "2026-06-14T19:56:11Z", "hours": 1.9681, "text": "Heyy everyone I am currently building an android based pokedex app. The goal is simple point your phone’s camera towards a pokemon and it would use real time object detection to identify it and use pokeapi to fetch detailed stats about the pokemon. When I first thought of this project, I wanted to make a pokedex for all pokemon. However, some simple calculations gave me a reality check. To get a deceny accuracy, I aimed to train the object detection model at 100 images per pokemon, but there are 1,025 pokemon in total, that would mean more than 100k images to collect and label, it would take months if not years for me to do it alone, that’s why I narrowed down quickly to only generation 1 pokemons, around 151 pokemons and 15,100 images which still is a lot to collect and label manually. Instead of collecting images manually, I wanted to automate the process using the icrawler python framework. I initially tried using the built in google image crawler but it failed again and again, it returned no images, it wasnt able to detect the image tags, after some research I found out what was happening, google frequently changes their css class names to prevent bots from scraping and icrawler relied on hard coded class names. So I switched to the in built Bing image crawler and ran a test batch of 5 pokemons, it worked, I was happy to see images of pokemons being stored in my computer. But there was another roadblock, I had aimed at a total of 500 images (100 per pokemon) but it only managed to scrape around 30 images per pokemon. That’s only 30% of my target. To get past this I planning to build a better scraper using selenium and implement a dynamic scrolling loop to trigger lazy loaded images. I have attached today’s results, I got 156 images in total today and I hope for 500 tomorrow. Stay tuned for the next update"}]...
|
Title: Pokedex by @Ansh904 | Stardance
Devlogs:
H Title: Pokedex by @Ansh904 | Stardance
Devlogs:
Heyy everyone I am currently building an android based pokedex app. The goal is simple point your phone’s camera towards a pokemon and it would use real time object detection to identify it and use pokeapi to fetch detailed stats about the pokemon. When I first thought of this project, I wanted to make a pokedex for all pokemon. However, some simple calculations gave me a reality check. To get a deceny accuracy, I aimed to train the object detection model at 100 images per pokemon, but there are 1,025 pokemon in total, that would mean more than 100k images to collect and label, it would take months if not years for me to do it alone, that’s why I narrowed down quickly to only generation 1 pokemons, around 151 pokemons and 15,100 images which still is a lot to collect and label manually. Instead of collecting images manually, I wanted to automate the process using the icrawler python framework. I initially tried using the built in google image crawler but it failed again and again, it returned no images, it wasnt able to detect the image tags, after some research I found out what was happening, google frequently changes their css class names to prevent bots from scraping and icrawler relied on hard coded class names. So I switched to the in built Bing image crawler and ran a test batch of 5 pokemons, it worked, I was happy to see images of pokemons being stored in my computer. But there was another roadblock, I had aimed at a total of 500 images (100 per pokemon) but it only managed to scrape around 30 images per pokemon. That’s only 30% of my target. To get past this I planning to build a better scraper using selenium and implement a dynamic scrolling loop to trigger lazy loaded images. I have attached today’s results, I got 156 images in total today and I hope for 500 tomorrow. Stay tuned for the next update
Heyy Everyone Pokedex Devlog 2 !!! The selenium scraper is finally complete and it is working perfectly, except it hits a captcha some times, though it is rare. I started building this scraper without any knowledge of selenium. I started with a very basic bot that went to google and typed pokedex, I slowly added more features like using headless mode and WebDriverWait instead of hardcoded time delays. I once crashed my computer while printing the encrypted source code of the google result, XD. But I was also encountering captchas a lot so I switched to undetected_chromedriver and gave it a user agent string so that it won’t be flagged. My first bot was able to scrape the headers of the google search result. I then moved to an image scraping bot, The first version was very simple, It simply went to google images and downloaded every img tag that it could find. However, regardless of the target it scrapped only 21 images, the first being the google logo. This was because of lazy loading. To fix this I implemented an infinite scrolling loop that scrolled until it reached the end of the page or hit the target. But it still wasn’t near the target, after running the script without headless mode, I found out that the user agent string I gave it was of chrome 91, that was released in 2021, after switching to a newer version, chrome 135, it was able to complete it’s target but it was also downloading junk images like logos, icons or spacers that were present inside the search result. I spent 2 days fixing this problem, trying to point towards the image tags of the thubmnail images we see in google images. I wanted to write a code that would work everytime, that is why i couldn’t just point towards the ever changing classname of the img tag. I tried targeting imgs inside specific divs like img inside the div with role of listitems or img tags whose href attribute started with “/imgres” but it didnt worked. After a lot of tries I was able to get it right by targetting the img inside the div with role of main and whose dimensions are more that 100*100px. It worked like a charm. I then quickly made it in the form of a function and gave it 10 pokemons with target of 100 imgs each and boom I got 1000 images in total. I have also decided that labelling 15,100 images would take ridiculously long and the accuracy of the model would also be not accurate. So instead I am building a classification model and labelling it would be easy I am downloading the pokemon images inside the folder with their name. So now that I don’t have to worry about spending hours downloading or labelling them, I would use 500 images per pokemon and create a much accurate model. Currently I am running the script over all pokemons in gen 1, 151 in total, It has reached till Rattata, pokedex number - 19, that means images of 18 out of 151 pokemon are downloaded. I will keep the script running until all are complete and start training the classification model tomorrow.
ME Vs GOOGLE And I WON!!! Pokedex Devlog #3 Hey everyone I have been working on making a real life pokedex, one in which you just take the photo and get the stats of that pokemon on your screen. To achieve this I decided to train a yolov8n-cls model on images of pokemon. But getting those images were a nightmare due to GOOGLE!!! Fighting Google’s anti bot systems I built a custom scraper to scrape pokemon images from google images. But since the very start of the project, Google has been blocking me, it took a lot time for me, who had never touched selenium at that time, to bypass google’s anti bot systems. Since my laptop is very low end, I was using selenium in headless mode which triggered even more red flags for my bot. I switched from regular selenium to undetected_chromedriver , but still google’s system was flagging me with a big captcha that my little bot couldn’t solve. The main issue was that in headless mode, selenium runs a very small window size and it leaves clear machine tracks, I fixed that by using a larger window size and adding a user agent string that I chosen from a list of 10 different ua strings. Getting those Images Not being flagged by google was easy in comparison to this. Targetting the Images inside the search results was an absolute nightmare because instead of fixed static classes or ids google uses dynamic strings that change frequently, I wanted to write code that anyone can use anywhere and that is why couldn’t target those ever changing class names. I tried a lot things from targeting images inside nested divs to images inside divs with specific roles (eg: listitems ) or targeting images that have /imgres in their href attribute. But it took me an entire, with 6+ hours of coding and trying and a lot more researching and inspecting the elements of google images results but I found out that by targetting the images div with role of main with the images having a src or data-deffered attribute using the XPATH: //div[@role='main']//img[@data-deferred or @src] , I get the images which are inside the search results and I can then just use infinite scrolling to load them. The Results Knowing how to target those images, I absolutely destroyed google in the fight by making the scraper and using it to scrape a total of 74,718 images in one night without getting blocked a single time. My goal was was 500 images for each pokemon in generation 1, that is 75,500 total images, The scraper worked better than expected and I was just a 700 hundred images behind the goal. But even for those 700 images, the culprit was google not my little scraper, google didn’t have that many images for a few unpopular pokemon to fulfill my goals. What’s next? After winning the battle against google, I will use the images to train my model today, I already split those. Since my laptop is slow I will utilize google collab for training, using their own tool to train the model using the images they were trying so hard to hide XD….. and I really hope that scraping that many images is not illegal.
Pokedex Devlog #4 Heyyyyy Everyone!!! The training of the model is finally completed and I have made the first version of the Pokedex app , It captures an image using react-native-vision-camera , crops only the middle portion, resizes the image to match my model’s image size of 224*224 px , then gets the raw pixelbuffer, converts into rgb and normalises the values from 0-255 to 0-1.0 . This normalised pixel data is then fed to the model which predicts the class of the image. There were a lot of problems in making the app and there are still lot more to come , but here is everything I did: 1. An Ironical Training After collecting 75,000 images from my custom scraper, I zipped all of those images, and uploaded them directly to my colab notebook, uploading them took half an hour though😫 . I ran the training script at 50 epochs and training the model took another 8 hours . It was really ironical to see the model train in google colab on the same images that google was trying to hide from my little scraper. 2. A Successful Model After the training was completed, I had to test the model to see how it performed and whether I need to retrain it. The results shocked me, I gave the model 12 images from pintrest that it had never seen before and it predicted all of them correctly. The accuracy was way better than what I expect from a model trained on raw data. However, if needed I will clean the dataset and train again. 3. React native Camera Hell Everything was going very smoothly at this point, but I was never prepared for the next phase. I built a blank react native project, installed react-native-vision-camera and added a camera to the app.js, the camera was working, great, so I built a function to capture the photo and display it on the screen, that too worked. But the next step was to process the raw image pixel data into the format that my model required. I searched online, how to resize an image in react-native-vision-camera , the ai results told me to use the resizer package that comes with it. I spent three, three whole days!!! figuring why the resizer was not able to resize the image only to realise that it took a frame output not an image, so I rewrote the whole camera code again to use a live stream instead of capturing a photo. The resizer was working, I then normalized the pixel values while converting it into rgb format and fed the data to my model which outputed complete gibberish, all that work for nothing!!! 😭 I tried logging in the shape of input and output of the model, and the pixelformat of the bufffer and the raw pixel data. But all those were giving either undefined or 0. Nothing seemed to be working at this about, there was something seriously wrong with how I was processing the images. But then going through the docs of react-native-vision-camera , I saw that the image object that my previous capturing images code, that i had dumped, was outputting was a react-native-nitro-image object and it had an inbuilt resizeAsync function. I got frustrated again and rewrote the entire code again, this time with the previous capture photo logic. After cropping, resizing and getting the rgb data in to the required format, I tested the app with a photo of Gloom displayed on my laptop screen and it predicted it correctly. I was sooooo happyyy that it worked and is still working tho the accuracy is low due to pixel noises. What’s next? The hardest parts of the project are completed now, I just need to an api call, after the model predicts the pokemon to, get the details of the pokemon, like it’s type, pokedex entry and other things. The UI also sucks so I will work on that, I think I want to make it space theme, I don’t know how it would look but I will try. Till then… stay tuned!!!
Pokedex App is finally complete (mostly) Devlog #5 The app is now mostly complete, this phase of the project went very smoothly. Here is what I have added: After predicting the pokemon, The app sends a request to PokeAPI at the https://pokeapi.co/api/v2/{pokemon_name} endpoint and gets the detailed information of the pokemon. The information is displayed on a pokemon page which includes basic stats, the type of the pokemon, height , wight et. I have also worked a lot of ui, majority of the time was spent in designing the ui. However the home page still looks empty, it is just a div with ImageBackground and a logo with two buttons and 1 scanner icon that I designed in canva. I have also added typed backgrounds, so that every pokemon type has a seperate space themed background, they are mostly nebula images that i found in the NASA Gallery but boyyyy do i like the themes, they look soooo gooood!!!. I am so proud of myself…. What’s left? While the app is mostly ready, there a few things that I still need/want to add: A page displaying all the 151 pokemons in generation 1 A page that is displayed when there is no confident prediction A web version of the app, which would be pretty easy, I just need to change the uploading and capturing logic for it to work on web So hopefully this is my second last devlog for this project, stay tuned !!!!
Pokedex Mobile app is finally finished Pokedex Devlog #6 The Pokedex mobile app is now finished and I am working on finishing the web version of the app too. Here is what I have added: A NotConfident page that is displayed when the model can’t give a solid prediction about the image. A ’AllPokemon` page that displays all 151 pokemons from generation 1 in a flatList. I was using a a very messy state based navigation so I updated it to a Stack navigation. I also add a tab at the bottom of the Pokemon, Not confident and All Pokemon pages, though it sometimes overlaps the page content like that of the mewtwo picture. Create a seperate AppContext for the web version to load the model in the web. What’s left in the project before the ship? The Mobile app is finished, I just have to make the Camera and Upload components for the web version of the app and then the project would officially be completed. I was having my exams so I wasn’t able to code for a while :(
Cosmidex Web app is complete !!! Devlog #7 The web version of the Cosmidex app is also finished, FINALLYYY!!! Here is what I have added: Converted the tflite model to TFJS, took a lot of time, many libraries were deprecated, so I had to manually remove imports for those. Created seperate web components using .web.js to upload/capture images -> preprocess -> predict, my codebase for both the android and the web version of the app is still the same. Created seperate page components for the web and changed the design for the Pokemon Page and the Home page. What’s left? The app is mostly ready for it’s first ship, I have hit the 10 hr mark thats why I am uploading a devlog early, but there’s not much left to do, I know I have been saying this for the last 2 devlogs. Here’s what is left: Remove all the console logs that still linger in components for debug. The camera doesn’t close in the web version after capturing and predicting so I have to fix that. Probably change the home page for the android version to match the web. Add some cool animations to it. At last I want to push this project one bit further and add a capturing feature, like you capture a photo of a pokemon and it gets added to your caught pokemon in the pokedex and after capturing all 151 pokemon, you get a medal.
You can now get a Medal!!! Cosmidex Devlog #8 You will now get a medal everytime you catch all 151 pokemon in Generation 1!!! I have added the catch mechanishm Everytime you successfully predict a pokemon using your camera, gallery or from the Not Confident page, that pokemon would be added to your caught list. The caught list is stored in Local storage. Beside the catch mechanism here are other changes: Fixed the camera not closing issue on web by starting the Camera only when the Camera page is focused, otherwise closing it. Removed most of the unnecessay console.log() On android, the Tab was covering pokemon info on the Pokemon Page, to fix that, I made the tab shake toggled on that page, the user now needs to shake their Changed the Home page of android to match that of the web. Added a spawn tab that shows spawn locations along with methods to catch in the generation 1 games, ie- Pokemon Red, Blue and Yellow. Added the README file. Deployed the project on vercel properly, The project is now live on this link What’s next? I now want to add a daily Who’s that pokemon? Game, that would be so fun i guess. I also will add pokemon cries and show shiny versions of pokemons.
Cosmidex App is now finished !!!!! Finally, after 2 months, the app is finished and I am ready to ship!!! Here’s what I have added : Added Guess the Pokemon, It is addictive as hell, I used the imageTint property of the React native’s Image tag to make the whole silhouette of the pokemon black. After the user guesses it, it displays the orignal pokemon. Added cries, everytime you open the pokemon page for a pokemon, it’s latest or legacy cry plays once, you can toggle to not play it using the button on top right corner of the pokemon image. Added shiny, you can now toggle to show shiny or default sprites of the pokemon. That’s it, the project is finished :( I always want to add more, but I have to study for entrances.
Ships:
Cosmidex!!!! A real life multi-platform Pokedex app that can identify a pokemon from a captured photo or uploaded image. The app started with making a scraper using selenium, that I used to scrape around 75,000 images of all 151 pokemon from Google images. The scraper was hard because I didnt knew selenium, but I learned it and made it. After scraping, I trained a yolov8-cls model on google colab using the scraped dataset. Then I converted the model to tflite and made the first android version of the app. Getting the app to work was really painful because it required me to manipulate the image and it’s raw pixel data to transform into the input tensor. After this everything went smoothly and I added a lot of new things like a list of all Pokemon and the fallback page when the model is not confident. I also made a web version of the app using the .web.js extensions, the web version used a tfjs model. After that i have another whole lot of things like a “Guess the Pokemon” game, shinies, a catch feature such that everytime you correctly predict a pokemon, it gets added to your caught pokemon list that is stored in local storage. The app also has shinies and you can toggle to hear pokemon cries. I am really proud of how the ui turned out, the space + pokemon theme really really looks very good, I used images from the nasa image library as backgrounds. On the Pokemon page, which displays the info for a specific pokemon including types, sprite, pokedex text (flavor text), base stats, evolutions and spawn info, the background changes dynamcally based on the type, I spent a lot of time finding those backgrounds, they perfectly match the pokemon typings. All other pages have specific backgrounds too. In the end I really like how the app started from a small side project to taking nearly 2 months to finish. I really want to add more features, but I lack the time cuz I have to study too for entrances, but I surely will add them in the future....
|
1792972349.414641
|
1793058749.414641
|
|
39412
|
Cultivation Incremental by @RanDK | Stardance
|
RanDK
|
2
|
93.0
|
1329
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-08T14:06:11Z", "hours": 20.0, "multiplier": 17.26, "payout": 338, "blessing": "neutral", "text": "VERSION 0.1 Only 16+ can play the Game currently as any other new roblox game. I am glad to add more of the essentials mechanic of the Game! Now here is the List of Features i have added to the game since the last release: Added Onboarding/Tutorial! I see a lot of player gets confused when they first joined the game, so now i added a tutorial on the basic of the game. That is: Cultivate, Shop, and Quest. Added New Enemy : Goblin. Added More quests . Added Cultivating Animation! Added Gamepass! Now you can buy a gamepass to get a benefit and support me! + Gamepass badge on the bottom left of the screen when bought. And more! you can read all the devlogs to see the small changes. I still have some features not yet implemented, that is fighting enemy animation, weapons, and PVP . But i don’t really have the courage since the Stardance deadline is within 3 weeks (and its already extended), but i do have plan to continue the project later in December for my own personal project (close sourced, even though right now its already semi close source since the models, maps i used is not in the code but in the roblox studio file.). Thanks for everyone who have followed the game journey, albeit short i thank you guys for supporting me!! (Especially those who bought my gamepass!!) . I CANT BELIEVE I GOT MY FIRST ROBUX FROM MAKING A GAME HERE IN STARDANCE :DD THANK YOU SO MUCH!!! This Game is Made with the best of my Game Dev abilities .", "repo": "https://github.com/RKPYI/cultivation", "demo": "https://www.roblox.com/games/128506264671282/Cultivation-Incremental"}, {"ship_num": 2, "ts": "2026-08-17T03:44:11Z", "hours": 73.0, "multiplier": 13.89, "payout": 991, "blessing": "neutral", "text": "VERSION 0.0.1 Only 16+ can play the Game currently as any other new roblox game. I am glad to finish the essentials mechanic of the Game! Now here is the List of Features the game have: Cultivate, just stand on the existing zone (and make sure you have the required Realm) and you’ll gain Qi automatically Breakthrough, the moment the top bar is full, you can breakthrough to higher realm which increases your qi gain and boost movement speed and jump a little bit. Quest, you can talk to an NPC with a (!) to get the quest. After finishing a quest, you can talk to the NPC again to claim the quest rewards. Battle, you can walk to enemy and you’ll automatically deal damage to them! Shop, you can buy items in shopkeeper NPC with Spiritual Stones which you can get from defeating an enemy or finishing a quest. The feature is implemented, but its very simple and “unprofessional”. Lame excuse but its really because this is my first time making game and im still learning the basics. I’ll be adding more stuff and refine the core features in the future updates!! This game is made for the love of the game and genre :)", "repo": "https://github.com/RKPYI/cultivation", "demo": "https://www.roblox.com/games/128506264671282/Cultivation-Incremental"}]...
|
[{"post_id": 74457, "ts": "202 [{"post_id": 74457, "ts": "2026-09-27T12:35:39Z", "hours": 6.9819, "text": "[Devlog #29] The Last Devlog The Game New Contents Gamepass! Now you can buy a gamepass to get a benefit and support me! + Gamepass badge on the bottom left of the screen when bought. Add beam/arrow to the quest npc when you’re done with their given quest. Add equip best button in the inventory menu. Add dmg mult information in the inventory meny (item detail menu). Updates Fix some bugs, for example player able to move while cultivating. Optimize and remove unused leaderboards. ready to publish it! Thank you for the opportunity Hackclub for me to grow as a beginner roblox developer I appreciate the support from everyone although my game is far from “professional”, atleast its a fully working game! and Im happy with it."}, {"post_id": 68131, "ts": "2026-09-14T15:48:31Z", "hours": 1.1519, "text": "[Devlog #28] New Content Added “Aura” like particle effect when cultivating, its more like you “suck” the surrounding qi into the body. Update Update the collision system to be more robust, before theres a problem with the collision when i try adding the Aura Part inside the Player. Now it will independently calculate the spatial rather than touching. Nothing crazy, just some cool small detail."}, {"post_id": 66709, "ts": "2026-09-12T16:27:10Z", "hours": 2.3578, "text": "[Devlog #27] New Contents New Mobile Button to Cultivate New Shortcut UI to press “C” to Cultivate when entering a Zone they can cultivate in. New Tutorial Section to tell the player to press “C” to start cultivating and gathering qi. Update Player now can’t walk/jump when cultivating May need to revise the button for mobile since its very basic right now"}, {"post_id": 66071, "ts": "2026-09-11T17:16:34Z", "hours": 1.8178, "text": "[Devlog #26] New Content Added Cultivating Animation! Update Now you have to press “C” to cultivate rather than just automatically gain Qi just by entering the Qi Zone. Next one is to add button for mobile user, and also add UX feedback for when they’re able to press C to cultivate and when they can’t (outside zone & higher realm zone). Oh! also adding particle/aura when player is cultivating for more satisfying feel."}, {"post_id": 61661, "ts": "2026-09-04T18:08:47Z", "hours": 0.5442, "text": "[Devlog #25] Updates Added more quests Optimize NPCServiceUtils.Data JSON for NPC that gives Chained Quests. Mostly just optimizing the json by creating a helper so that making a quest is easier and less error prone."}, {"post_id": 60953, "ts": "2026-09-03T17:11:44Z", "hours": 3.1036, "text": "[Devlog #24] New Content Added Onboarding/Tutorial ! I see a lot of player gets confused when they first joined the game, so now i added a tutorial on the basic of the game. That is: Cultivate, Shop, and Quest . Im really happy with the result, i didn’t expect making the trail line to be so easy (using beam instance from roblox themself). And maybe i’ll add onboarding for fighting enemy and equipping items, but its not really neccessary (i think)."}, {"post_id": 60245, "ts": "2026-09-02T14:23:32Z", "hours": 2.5775, "text": "[Devlog #23] New Content Added refresh countdown on leaderboard UI. Updates Moved enemy overhead gui from server to client (not yet tested for the behaviour in multiplayer) for more personalization (point 2 is possible because of this change). Dynamic enemy name color, higher realm will be colored red and cannot be attacked no matter how high your dmg is until you reach their cultivation rank. Polishing the game :))"}, {"post_id": 59659, "ts": "2026-09-01T16:01:39Z", "hours": 1.0572, "text": "[Devlog #22] New Contents Added 1 more enemy, goblin. Update Remove the realm requirement in NPC Shop for buying an item (Cannot buy the item until realm req is fulfilled). The requirement now only active when trying to equip the item. Fixed quest id being duplicated. im back!! hopefully i can make some more stuff although i may not have as much free time as before. I’ll try to make some progress everyday though! Try it Now Game may not be up to date from the devlog Cultivation Incremental (16+)"}, {"post_id": 46405, "ts": "2026-08-13T16:13:06Z", "hours": 0.8792, "text": "[Devlog #21] Updates Added a proper README. Fixed some minor bugs. The next devlog will be for a published Game . Its not a professional Roblox game, but its my learning process from 0 to this. So i appreciate any type of critics and feedback for me to develop this game furthur, because i really love these type of games. So im literally making my dream game here! But its still lacking to my vision because of my lack of time and skills."}, {"post_id": 45814, "ts": "2026-08-12T15:17:53Z", "hours": 0.6147, "text": "[Devlog #20] Update Added 1 more quest New Assets Added Game Icon and Thumbnail Spent most of my time on figma designing the Icon and Thumbnail of the game, but the time is not getting tracked because i use the app instead from web . Not yet released, but i’ll be testing it first with a few friends first and maybe add some feature because ngl it feels bland right now, but maybe its just my opinion. So to get some feedback, ill be testing it with my friends tommorow and maybe catch some multiplayer bugs that i couldn’t find when playing alone. I really don’t want to publish a boring game, but the time is ticking and im getting more and more busy this month."}, {"post_id": 45161, "ts": "2026-08-11T14:03:07Z", "hours": 0.3044, "text": "[Devlog #19] Update New UI for Leaderboard! I’ll be polishing the game (for real) and release the first version tommorow (hopefully)… Im getting really busy"}, {"post_id": 44685, "ts": "2026-08-10T16:42:21Z", "hours": 3.5644, "text": "[Devlog #18] New Content Added Qi Mult Counter when entered a Zone. The fire has animation Added Leaderboard . (UI is In Progress) . Spent most of my time making UI Animation using sprite sheet and integrate DataStoreService for leaderboard"}, {"post_id": 44139, "ts": "2026-08-09T18:19:01Z", "hours": 0.3978, "text": "[Devlog #17] Update Make the Breakthrough bar slimmer and more compact. Im kinda busy today and havent done anything yet, so im just improving the ui a little bit. Also i wanna add a Current Qi Multiplier Counter at the Top Right Corner of the screen using the fire gif."}, {"post_id": 43367, "ts": "2026-08-08T15:57:22Z", "hours": 4.3803, "text": "[Devlog #16] New Content Added 5 new Items you can buy. Updates Implemented the Functionality of the NPC Shop. You can now buy items here. Updated the Shop UI, now it looks better compared to previous version. Spent most of my times debugging the UI since i reuse the modal component that the main menu uses. So yea, i integrate the npc shop inside it and that creates a lot of bugs and conflict . Well i fixed all the bug i found so thats good. Now that the main features is done the next step is to polish the map and adding the game content (More NPC, Quest & Items)"}, {"post_id": 42792, "ts": "2026-08-07T18:02:10Z", "hours": 1.4983, "text": "[Devlog #15] Update Added UI for NPC Shop Spent all of my time designing the UI… i still dont like the yellow box, but it’ll do for now. Next i’ll be making it dynamic and functionable."}, {"post_id": 41964, "ts": "2026-08-06T14:25:20Z", "hours": 2.245, "text": "[Devlog #14] New Content Added Shop NPC (no functionality yet) Updates Enemy now drops Spiritual Stones Bugfixes & Refactor Fix Quest bug, it needs some nil value check protection. Fix Zone bug when player quit/disconnect, have to stop a task gracefully when the player disconnect. Refactor Inventory UI Component to use useMemo and make the Item Display Panel its own component. Zone Detection now only detect the user HumanoidRootPart for reliability and no jittery detection. No major progress today, just bugfixing and refactoring. I think im getting close to finishing the main loop of the gameplay. Cultivate -> Breakthrough -> Fight stronger enemy -> Buy better item in shop -> Cultivate -> Repeat."}, {"post_id": 41418, "ts": "2026-08-05T16:45:14Z", "hours": 4.5714, "text": "[Devlog #13] New Contents Added Marks for NPC with Quest Combat and Enemy! (Its partially done) The combat is still barebone, you get close to the enemy, the enemy got damaged by 1, when its hp is 0, it’ll add to the player totalEnemyKilled +1. Thats the current implementation. I will polish the combat feature and integrate it with the quest feature so that it tracks the amount of “enemy” killed."}, {"post_id": 40786, "ts": "2026-08-04T15:21:08Z", "hours": 2.5389, "text": "[Devlog #12] New Content Added Spiritual Stone . a new currency with no functionality yet. I’ll be adding shop that uses Spiritual Stone as the currency. Updates Now, completing a quest gives reward . Currently, you can get spiritual stones or items from quests. Added Notification Badge in the inventory button UI for when player get a new item. Remodeled the Old Man to Mysterious Being . Next i’ll polish the npc interaction more by adding a “❓” for npc with quest, and “❗” for a finished quest. And maybe start building the next feature, that is herb collection/fighting enemy."}, {"post_id": 40130, "ts": "2026-08-03T15:06:52Z", "hours": 5.1494, "text": "[Devlog #11] New Contents Added Quest List UI on the right side of the screen. 2 New Sfx for Taking a quest and Completing a quest. Updates Improves NPC Dialog UI , look at Devlog #10 for comparison. Options in the dialog now have a keyboard shortcut with the corresponding number. For example: clicking 1 in keyboard will click the first option. Refactors Create a Close Button component for ease of use. Refactor Dialogue View UI by creating DialogueOptions component. I am very satisfied with the Quest List UI, its looking really clean and good. I also make another design for the dialogue rectangle, its subtle but there’s a pattern and gradient on the dialogue UI. Next work is adding more npc, quest, and actually adding the Quest Rewards . Im planning on adding Spiritual stones and shops for item that improves qi gain. And maybe adding weapon and enemy in the future."}, {"post_id": 39516, "ts": "2026-08-02T14:54:08Z", "hours": 3.6114, "text": "[Devlog #10] New Contents Added NPC Dialogs Added Quests Features Broo, this two thing is messing my brain especially with all the thing to consider… Atleast the ui is presentable and its functionality is basically done. Its quest progress is actually saved to the Player Data, but there is no progress update yet, and also i can repeatedly take this quest again and again… Ok the serverside makes the player to not be able to take same quest twice, so its safe. But the UI, there is not yet state/system to detect that the user already take the quest… My next work is probably: Updating UI so that it knows the player already took the Mission. Adding taken quest UI Update the quest progress, etc. OK everything i said sounds very confusing even to me . In conclusion, my next work is just finishing the quests features and polishing the UI."}, {"post_id": 38931, "ts": "2026-08-01T15:15:53Z", "hours": 5.4314, "text": "[Devlog #9] New Contents BIGGER MAP (Added more houses, trees, mountains, clouds, and floating island). Added 4 more Zones . Added Realm List Board beside Spawn, it has the Full list of All Realms level. Updates Qi Particle inside zone now have different color as qi multiplier gets higher. Color hierarchy: White –> Blue –> Purple –> Gold Increasing qi requirement for Realm 100+ (Immortals) [Kinda irrelevant right now, since its statistically impossible to get there]. Added better placeholder image for Item. Changed Item Background according to Whether player can equip it or not (Realm requirement met). Red for can’t equip, Blue for can equip, Green for equipped item. Refactors (Technical) Move Qi Breakthrough sfx from RealmService to the SoundService. Move Zone Detection to Serverside for security reason. I still haven’t refactored the Inventory UI yet and all the models is not made by me. The only model i made was the Realm Board List. But every UI is made by me! (except for the fire icon)."}, {"post_id": 38278, "ts": "2026-07-31T16:19:33Z", "hours": 4.4764, "text": "[Devlog #8] New Content Item !! You can get more Qi Multiplier from item. And theres also Realm Requirement for each item. Inventory UI is now working (except for Delete Button). Info For the UI, the Layout Order is prioritizing equipped item. If Player realm lower than requirement, the requirement text will be red. Implementing Inventory system was very complicated, especially the ui. So many state, maybe its because i put basically everything in one file. I’ll refactor that first before im adding new content, otherwise i’ll lose my mind editing that spaggeti code later down the line… Anyway, as you can see in the screenshot. I don’t have the asset for items yet. Maybe i’ll work on that later, though not the highest priority. My priority right now is to refactor the ui and implement the delete button and adding Equip Best button."}, {"post_id": 37660, "ts": "2026-07-30T15:33:17Z", "hours": 4.3217, "text": "[Devlog #7] New Content Added Background Music ! Added Music and Sfx toggle in Settings Added Walkspeed & Jump Boost from Realm level Added Sprint ! Press Left Shift to Sprint. Bug Fixes Fix Overhead Gui , Everyone now have the Overhead Gui, and the Realm Level is synced to the actual player Realm. P.S. Shop and Inventory is still empty… Its hard designing and actually implementing the UI… Also i have too much idea and at the end only think about it and dont know how to implement it"}, {"post_id": 37040, "ts": "2026-07-29T14:43:03Z", "hours": 3.4936, "text": "[Devlog #6] Update Force player to use R6 Model for simplicity. New Content Added a Forest around the map. Added Menu Button (Settings, Shop, Inventory) Added Modal UI Component (still empty) Added SFX for Button when clicked and hovered. P.S. Most of my time is spent on making the design for the Settings, Shop, and Inventory Icon. And also on the functionality of the button (open/closing modal). Next, i’ll probably work on adding more sfx and backsound for the game. And also make the gui of the shop and settings."}, {"post_id": 36378, "ts": "2026-07-28T13:36:41Z", "hours": 4.3125, "text": "[Devlog #5] Update Implemented zone Realm Requirement and Qi Multiplier . Updated the Map, Not Final! just want to make it look like a grass. New Content Added more Realm , i use the webnovel Top Tier Providence for reference of realm names. Added 3 New Zone ’s. Added Qi Popups where it shows how much qi you just gained with accumulation. Optimization Refactoring how the system detect player entering a zone . From Looping a function every frame to saving it to a State where if player enters a zone, it update the state to True and start giving qi every second. VERY EFFICIENT!! P.S. All the models (Houses & Waterfall) is NOT made by me, i got it from roblox creator store free assets"}, {"post_id": 35806, "ts": "2026-07-27T14:04:34Z", "hours": 0.8486, "text": "[Devlog #4] Update Balancing Qi realm requirement and Qi bonus from realm . New Content Added UI for Cultivating Area . The UI Contain the Realm Requirement to Cultivate there (If requirement is not met, you don’t get any qi), and Qi Multiplier for that Area (Multiply with the Qi bonus from realm ) P.S. The Cultivating Area UI is not yet dynamic, and the functionality of realm requirement and qi multiplier from area is not yet implemented. My next goal is to implement the Area functionality and add atleast 3 more area to cultivate."}, {"post_id": 35190, "ts": "2026-07-26T13:39:43Z", "hours": 5.6908, "text": "[Devlog #3] Update Implemented the functionality of the previous static UI. Now the progress bar UI and the overhead UI is dynamic following User Data. You now can Breakthrough to go to Higher Realm. Added SFX for breaking through. Info Realm increases player qi gains. The higher the realm, the higher the qi gains. P.S. The Overhead UI currently added above the current user (local), other player won’t have the Overhead UI for now. I’ll work for new feature first before fixing that."}, {"post_id": 34693, "ts": "2026-07-25T16:50:59Z", "hours": 2.9936, "text": "[Devlog #2] New Content Added New Progression Layer: Realm Added Progress Bar UI for Realm (Not yet dynamic) Added Overhead UI for Player Current Realm and Username (Not yet dynamic) Bugfixes Fix user detection enter an area (the big transparent box); The Box is an Area that gives qi per second when entered."}, {"post_id": 34378, "ts": "2026-07-25T01:26:07Z", "hours": 12.1419, "text": "[Devlog #1] I learned the basics of Roblox Studio, Plugins, making UI in Figma in this first 12 recorded hour. Theres not much yet because im just trying to set up the project and familiarize myself with the language. I use wally for depedency manager and github for versioning. I just wanna learn new stuff here, so don’t expect a fully polished game at the end. I Can only hope that i have the work ethics to finish this project (Having a proper game loop)."}]...
|
Title: Cultivation Incremental by @RanDK | Stardan Title: Cultivation Incremental by @RanDK | Stardance
Devlogs:
[Devlog #1] I learned the basics of Roblox Studio, Plugins, making UI in Figma in this first 12 recorded hour. Theres not much yet because im just trying to set up the project and familiarize myself with the language. I use wally for depedency manager and github for versioning. I just wanna learn new stuff here, so don’t expect a fully polished game at the end. I Can only hope that i have the work ethics to finish this project (Having a proper game loop).
[Devlog #2] New Content Added New Progression Layer: Realm Added Progress Bar UI for Realm (Not yet dynamic) Added Overhead UI for Player Current Realm and Username (Not yet dynamic) Bugfixes Fix user detection enter an area (the big transparent box); The Box is an Area that gives qi per second when entered.
[Devlog #3] Update Implemented the functionality of the previous static UI. Now the progress bar UI and the overhead UI is dynamic following User Data. You now can Breakthrough to go to Higher Realm. Added SFX for breaking through. Info Realm increases player qi gains. The higher the realm, the higher the qi gains. P.S. The Overhead UI currently added above the current user (local), other player won’t have the Overhead UI for now. I’ll work for new feature first before fixing that.
[Devlog #4] Update Balancing Qi realm requirement and Qi bonus from realm . New Content Added UI for Cultivating Area . The UI Contain the Realm Requirement to Cultivate there (If requirement is not met, you don’t get any qi), and Qi Multiplier for that Area (Multiply with the Qi bonus from realm ) P.S. The Cultivating Area UI is not yet dynamic, and the functionality of realm requirement and qi multiplier from area is not yet implemented. My next goal is to implement the Area functionality and add atleast 3 more area to cultivate.
[Devlog #5] Update Implemented zone Realm Requirement and Qi Multiplier . Updated the Map, Not Final! just want to make it look like a grass. New Content Added more Realm , i use the webnovel Top Tier Providence for reference of realm names. Added 3 New Zone ’s. Added Qi Popups where it shows how much qi you just gained with accumulation. Optimization Refactoring how the system detect player entering a zone . From Looping a function every frame to saving it to a State where if player enters a zone, it update the state to True and start giving qi every second. VERY EFFICIENT!! P.S. All the models (Houses & Waterfall) is NOT made by me, i got it from roblox creator store free assets
[Devlog #6] Update Force player to use R6 Model for simplicity. New Content Added a Forest around the map. Added Menu Button (Settings, Shop, Inventory) Added Modal UI Component (still empty) Added SFX for Button when clicked and hovered. P.S. Most of my time is spent on making the design for the Settings, Shop, and Inventory Icon. And also on the functionality of the button (open/closing modal). Next, i’ll probably work on adding more sfx and backsound for the game. And also make the gui of the shop and settings.
[Devlog #7] New Content Added Background Music ! Added Music and Sfx toggle in Settings Added Walkspeed & Jump Boost from Realm level Added Sprint ! Press Left Shift to Sprint. Bug Fixes Fix Overhead Gui , Everyone now have the Overhead Gui, and the Realm Level is synced to the actual player Realm. P.S. Shop and Inventory is still empty… Its hard designing and actually implementing the UI… Also i have too much idea and at the end only think about it and dont know how to implement it
[Devlog #8] New Content Item !! You can get more Qi Multiplier from item. And theres also Realm Requirement for each item. Inventory UI is now working (except for Delete Button). Info For the UI, the Layout Order is prioritizing equipped item. If Player realm lower than requirement, the requirement text will be red. Implementing Inventory system was very complicated, especially the ui. So many state, maybe its because i put basically everything in one file. I’ll refactor that first before im adding new content, otherwise i’ll lose my mind editing that spaggeti code later down the line… Anyway, as you can see in the screenshot. I don’t have the asset for items yet. Maybe i’ll work on that later, though not the highest priority. My priority right now is to refactor the ui and implement the delete button and adding Equip Best button.
[Devlog #9] New Contents BIGGER MAP (Added more houses, trees, mountains, clouds, and floating island). Added 4 more Zones . Added Realm List Board beside Spawn, it has the Full list of All Realms level. Updates Qi Particle inside zone now have different color as qi multiplier gets higher. Color hierarchy: White –> Blue –> Purple –> Gold Increasing qi requirement for Realm 100+ (Immortals) [Kinda irrelevant right now, since its statistically impossible to get there]. Added better placeholder image for Item. Changed Item Background according to Whether player can equip it or not (Realm requirement met). Red for can’t equip, Blue for can equip, Green for equipped item. Refactors (Technical) Move Qi Breakthrough sfx from RealmService to the SoundService. Move Zone Detection to Serverside for security reason. I still haven’t refactored the Inventory UI yet and all the models is not made by me. The only model i made was the Realm Board List. But every UI is made by me! (except for the fire icon).
[Devlog #10] New Contents Added NPC Dialogs Added Quests Features Broo, this two thing is messing my brain especially with all the thing to consider… Atleast the ui is presentable and its functionality is basically done. Its quest progress is actually saved to the Player Data, but there is no progress update yet, and also i can repeatedly take this quest again and again… Ok the serverside makes the player to not be able to take same quest twice, so its safe. But the UI, there is not yet state/system to detect that the user already take the quest… My next work is probably: Updating UI so that it knows the player already took the Mission. Adding taken quest UI Update the quest progress, etc. OK everything i said sounds very confusing even to me . In conclusion, my next work is just finishing the quests features and polishing the UI.
[Devlog #11] New Contents Added Quest List UI on the right side of the screen. 2 New Sfx for Taking a quest and Completing a quest. Updates Improves NPC Dialog UI , look at Devlog #10 for comparison. Options in the dialog now have a keyboard shortcut with the corresponding number. For example: clicking 1 in keyboard will click the first option. Refactors Create a Close Button component for ease of use. Refactor Dialogue View UI by creating DialogueOptions component. I am very satisfied with the Quest List UI, its looking really clean and good. I also make another design for the dialogue rectangle, its subtle but there’s a pattern and gradient on the dialogue UI. Next work is adding more npc, quest, and actually adding the Quest Rewards . Im planning on adding Spiritual stones and shops for item that improves qi gain. And maybe adding weapon and enemy in the future.
[Devlog #12] New Content Added Spiritual Stone . a new currency with no functionality yet. I’ll be adding shop that uses Spiritual Stone as the currency. Updates Now, completing a quest gives reward . Currently, you can get spiritual stones or items from quests. Added Notification Badge in the inventory button UI for when player get a new item. Remodeled the Old Man to Mysterious Being . Next i’ll polish the npc interaction more by adding a “❓” for npc with quest, and “❗” for a finished quest. And maybe start building the next feature, that is herb collection/fighting enemy.
[Devlog #13] New Contents Added Marks for NPC with Quest Combat and Enemy! (Its partially done) The combat is still barebone, you get close to the enemy, the enemy got damaged by 1, when its hp is 0, it’ll add to the player totalEnemyKilled +1. Thats the current implementation. I will polish the combat feature and integrate it with the quest feature so that it tracks the amount of “enemy” killed.
[Devlog #14] New Content Added Shop NPC (no functionality yet) Updates Enemy now drops Spiritual Stones Bugfixes & Refactor Fix Quest bug, it needs some nil value check protection. Fix Zone bug when player quit/disconnect, have to stop a task gracefully when the player disconnect. Refactor Inventory UI Component to use useMemo and make the Item Display Panel its own component. Zone Detection now only detect the user HumanoidRootPart for reliability and no jittery detection. No major progress today, just bugfixing and refactoring. I think im getting close to finishing the main loop of the gameplay. Cultivate -> Breakthrough -> Fight stronger enemy -> Buy better item in shop -> Cultivate -> Repeat.
[Devlog #15] Update Added UI for NPC Shop Spent all of my time designing the UI… i still dont like the yellow box, but it’ll do for now. Next i’ll be making it dynamic and functionable.
[Devlog #16] New Content Added 5 new Items you can buy. Updates Implemented the Functionality of the NPC Shop. You can now buy items here. Updated the Shop UI, now it looks better compared to previous version. Spent most of my times debugging the UI since i reuse the modal component that the main menu uses. So yea, i integrate the npc shop inside it and that creates a lot of bugs and conflict . Well i fixed all the bug i found so thats good. Now that the main features is done the next step is to polish the map and adding the game content (More NPC, Quest & Items)
[Devlog #17] Update Make the Breakthrough bar slimmer and more compact. Im kinda busy today and havent done anything yet, so im just improving the ui a little bit. Also i wanna add a Current Qi Multiplier Counter at the Top Right Corner of the screen using the fire gif.
[Devlog #18] New Content Added Qi Mult Counter when entered a Zone. The fire has animation Added Leaderboard . (UI is In Progress) . Spent most of my time making UI Animation using sprite sheet and integrate DataStoreService for leaderboard
[Devlog #19] Update New UI for Leaderboard! I’ll be polishing the game (for real) and release the first version tommorow (hopefully)… Im getting really busy
[Devlog #20] Update Added 1 more quest New Assets Added Game Icon and Thumbnail Spent most of my time on figma designing the Icon and Thumbnail of the game, but the time is not getting tracked because i use the app instead from web . Not yet released, but i’ll be testing it first with a few friends first and maybe add some feature because ngl it feels bland right now, but maybe its just my opinion. So to get some feedback, ill be testing it with my friends tommorow and maybe catch some multiplayer bugs that i couldn’t find when playing alone. I really don’t want to publish a boring game, but the time is ticking and im getting more and more busy this month.
[Devlog #21] Updates Added a proper README. Fixed some minor bugs. The next devlog will be for a published Game . Its not a professional Roblox game, but its my learning process from 0 to this. So i appreciate any type of critics and feedback for me to develop this game furthur, because i really love these type of games. So im literally making my dream game here! But its still lacking to my vision because of my lack of time and skills.
[Devlog #22] New Contents Added 1 more enemy, goblin. Update Remove the realm requirement in NPC Shop for buying an item (Cannot buy the item until realm req is fulfilled). The requirement now only active when trying to equip the item. Fixed quest id being duplicated. im back!! hopefully i can make some more stuff although i may not have as much free time as before. I’ll try to make some progress everyday though! Try it Now Game may not be up to date from the devlog Cultivation Incremental (16+)
[Devlog #23] New Content Added refresh countdown on leaderboard UI. Updates Moved enemy overhead gui from server to client (not yet tested for the behaviour in multiplayer) for more personalization (point 2 is possible because of this change). Dynamic enemy name color, higher realm will be colored red and cannot be attacked no matter how high your dmg is until you reach their cultivation rank. Polishing the game :))
[Devlog #24] New Content Added Onboarding/Tutorial ! I see a lot of player gets confused when they first joined the game, so now i added a tutorial on the basic of the game. That is: Cultivate, Shop, and Quest . Im really happy with the result, i didn’t expect making the trail line to be so easy (using beam instance from roblox themself). And maybe i’ll add onboarding for fighting enemy and equipping items, but its not really neccessary (i think).
[Devlog #25] Updates Added more quests Optimize NPCServiceUtils.Data JSON for NPC that gives Chained Quests. Mostly just optimizing the json by creating a helper so that making a quest is easier and less error prone.
[Devlog #26] New Content Added Cultivating Animation! Update Now you have to press “C” to cultivate rather than just automatically gain Qi just by entering the Qi Zone. Next one is to add button for mobile user, and also add UX feedback for when they’re able to press C to cultivate and when they can’t (outside zone & higher realm zone). Oh! also adding particle/aura when player is cultivating for more satisfying feel.
[Devlog #27] New Contents New Mobile Button to Cultivate New Shortcut UI to press “C” to Cultivate when entering a Zone they can cultivate in. New Tutorial Section to tell the player to press “C” to start cultivating and gathering qi. Update Player now can’t walk/jump when cultivating May need to revise the button for mobile since its very basic right now
[Devlog #28] New Content Added “Aura” like particle effect when cultivating, its more like you “suck” the surrounding qi into the body. Update Update the collision system to be more robust, before theres a problem with the collision when i try adding the Aura Part inside the Player. Now it will independently calculate the spatial rather than touching. Nothing crazy, just some cool small detail.
[Devlog #29] The Last Devlog The Game New Contents Gamepass! Now you can buy a gamepass to get a benefit and support me! + Gamepass badge on the bottom left of the screen when bought. Add beam/arrow to the quest npc when you’re done with their given quest. Add equip best button in the inventory menu. Add dmg mult information in the inventory meny (item detail menu). Updates Fix some bugs, for example player able to move while cultivating. Optimize and remove unused leaderboards. ready to publish it! Thank you for the opportunity Hackclub for me to grow as a beginner roblox developer I appreciate the support from everyone although my game is far from “professional”, atleast its a fully working game! and Im happy with it.
Ships:
VERSION 0.0.1 Only 16+ can play the Game currently as any other new roblox game. I am glad to finish the essentials mechanic of the Game! Now here is the List of Features the game have: Cultivate, just stand on the existing zone (and make sure you have the required Realm) and you’ll gain Qi automatically Breakthrough, the moment the top bar is full, you can breakthrough to higher realm which increases your qi gain and boost movement speed and jump a little bit. Quest, you can talk to an NPC with a (!) to get the quest. After finishing a quest, you can talk to the NPC again to claim the quest rewards. Battle, you can walk to enemy and you’ll automatically deal damage to them! Shop, you can buy items in shopkeeper NPC with Spiritual Stones which you can get from defeating an enemy or finishing a quest. The feature is implemented, but its very simple and “unprofessional”. Lame excuse but its really because this is my first time making game and im still learning the basics. I’ll be adding more stuff and refine the core features in the future updates!! This game is made for the love of the game and genre :)
VERSION 0.1 Only 16+ can play the Game currently as any other new roblox game. I am glad to add more of the essentials mechanic of the Game! Now here is the List of Features i have added to the game since the last release: Added Onboarding/Tutorial! I see a lot of player gets confused when they first joined the game, so now i added a tutorial on the basic of the game. That is: Cultivate, Shop, and Quest. Added New Enemy : Goblin. Added More quests . Added Cultivating Animation! Added Gamepass! Now you can buy a gamepass to get a benefit and support me! + Gamepass badge on the bottom left of the screen when bought. And more! you can read all the devlogs to see the small changes. I still have some features not yet implemented, that is fighting enemy animation, weapons, and PVP . But i don’t really have the courage since the Stardance deadline is within 3 weeks (and its already extended), but i do have plan to continue the project later in December for my own personal project (close sourced, even though right now its already semi close source since the models, maps i used is not in the code but in the roblox studio file.). Thanks for everyone who have followed the game journey, albeit short i thank you guys for supporting me!! (Especially those who bought my gamepass!!) . I CANT BELIEVE I GOT MY FIRST ROBUX FROM MAKING A GAME HERE IN STARDANCE :DD THANK YOU SO MUCH!!! This Game is Made with the best of my Game Dev abilities ....
|
1792990280.2875316
|
1793076680.2875316
|
|
28027
|
LARPARDY! by @purpld | Stardance
|
purpld
|
1
|
73.0
|
1320
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-27T16:36:45Z", "hours": 73.0, "multiplier": 18.16, "payout": 1320, "blessing": "neutral", "text": "I made a Discord activity trivia game inspired by the Jeopardy game show called LARPARDY! that you can easily play with your friends without leaving Discord! I am very proud of how far this project has come because it was very challenging for me. The frontend is based on Vue.js, which before this, I had never used before. I wanted to try something non-React and I’ve come to REALLY love Vue. I had to write multiplayer netcode entirely by myself! I used Socket.IO to handle the networking itself, but I had to write ALL of the state management and syncing code. There were certainly some difficulties in doing so! I also have not worked with Redis before, which was my database of choice for state management. It is… quite different from other databases, so writing code to interact with it was a learning experience.", "repo": "https://github.com/hpenney2/larpardy", "demo": "https://discord.com/discovery/applications/1521015095738499083"}]...
|
[{"post_id": 55618, "ts": "202 [{"post_id": 55618, "ts": "2026-08-27T16:13:45Z", "hours": 0.9681, "text": "Last devlog before ship (proper this time!) Discovery I set up a Discord server for the game, so LARPARDY! is now on Discord’s discovery (App Directory)! This is now used for the demo link for the game. README (please) Just spent some time redoing the (ancient) README and making it look pretty and detailed. I took some screenshots and added them here. They also show up on Discord! :D"}, {"post_id": 55384, "ts": "2026-08-27T05:50:58Z", "hours": 1.6658, "text": "SHIP IT! LARPARDY! is now verified on Discord! I spent a short while writing a basic Terms of Service and Privacy Policy (as required by Discord) and verifying all the details. Live deployment I’ve also deployed a production version of the game server to my home lab! It’s exposed through a Cloudflare Tunnel, because I’m behind CGNAT (i.e., I don’t have my own public IP). Spending all that time setting up Docker for this project all that time ago made this VERY easy, which was the entire point. I’m glad nothing broke in the process… lol Discovery The last thing I want to do is set up Discovery on Discord, so reviewers (and anybody, for that matter!) can just search up LARPARDY! in Discord, and it should come up. I pretty much just need to make a support server and write the details, and then… LET’S SHIP IT! I dunno if anybody reads these things, but if you do, thank you. :D"}, {"post_id": 55338, "ts": "2026-08-27T02:45:01Z", "hours": 10.4778, "text": "IT’S READY! I am very happy to say that I’m done with the main game! I wanted to split this into a couple of devlogs, but Stardance was having some issues syncing time earlier so I kept working. (I think it’s actually been up for a little bit… oops) Buzzing -> Judging Judging now is fully functional! Either someone gets the clue right, everyone gets it wrong, or not everybody buzzes in and we move on. I’ve also introduced something called Hostless Mode , which allows the game host to play (where normally they could not). This plays more like most online versions of the gameshow, where you can buzz in, reveal the answer, and then that’s that (instead of everyone getting a chance to buzz in if the first person is wrong). This also gives a way to play singleplayer, which should make it more accessible. All of this took a lot of careful logic work to make sure that everything works as expected (hence the VERY long log time, plus several other things), no matter how you’re playing! End of Line The game, also, can finally end, now that clues get marked off. I made a simple leaderboard that shows when the game is over, and then you can return to the lobby! See the photo below. GAMEPLAY! You can watch a short gameplay example with a host (right) + 2 players (left) below! You’re expected to play with voice (or a text channel, if you wish), so this demo just showcases the flow of the game. I logged a lot of time on this one because there was also a lot of testing and fixing small bugs, especially when making the judging system. A lot can get weird when managing so much state!"}, {"post_id": 54560, "ts": "2026-08-25T16:07:03Z", "hours": 7.4739, "text": "Questions, and MORE boring serverside stuffs Oof, sorry, it’s been a while since I’ve been able to work on this project, and the clock is ticking! Clues! Clues can now actually be selected and that will be reflected to the server and all players. You can also see a bit of the buzzer work I started, which is actually much more of a pain than it would seem. Why? Well that’s because we now have to talk about: SYNCING TIME OVER THE NETWORK The server running the game has a system time. Your computer, phone, or whatever, also has its own system time which could vary entirely from the server’s. If the server wants to schedule an event (say, when you should be allowed to buzz in), how does it tell the client when that is without an offset? Using Unix timestamps is common, but without knowing how offset the client is from the server, we don’t actually really know when that timestamp is in reality (since EITHER could be offset from reality, if not both), and we don’t want mismatched times to cause weird problems. The solution that I went with is that the client will periodically (every 1 second for now) send a “ping” message to the server with its current timestamp. The server will reply with that time as well as it’s own timestamp. Upon receiving that reply, it can then do three things: Calculate the round trip time (i.e., ping!) from the original time we sent and the time it is now. Estimate the server time as we’re processing this by adding the server time + half of the ping Calculate our time offset from the server by subtracting our time from that estimate I admit that I did NOT figure this out on my own. Google is nice. But this does actually kind of serve as the basis for how things like the Network Time Protocol (NTP) work. Reminder that all of that is just so we can show when the buzzer is allowed to be pressed accurately. Spectating Also, I added a fix so late players aren’t actually awkwardly added in the middle of a game and are instead in a kind of “spectator” state; since they’re still connected, they receive all the game state events and so on. If all actual players leave, the game will reset (which also means I now have a function to reset the state, and for showing alerts!)."}, {"post_id": 32606, "ts": "2026-07-21T21:45:43Z", "hours": 6.9744, "text": "A REAL BOARD! A trickier task than it sounds like, but I needed some clues finally! The default testing board was uh… not exactly “production ready” in my opinion (lol). This was tricky particularly because, well, where am I going to get clues from? You kinda need a LOT of clues for a good Jeopardy game, and while UGC is something I want to make, I would like a default mode, too, and there is certainly no way that I was going to try to make a bunch of clues by myself. (respectfully, I don’t think I am also smart enough to do that lol) Jepp I found a little project called jepp which exposes a LOT of existing Jeopardy clues through an API. I didn’t want to bother that API too much though, and there is an SQLite DB dump publicly available, so LARPARDY now uses that instead. With a little bit of SQL later (and, uh, remembering how to use SQL lol)… we have many, many clues! The only thing is that the database does not store the value of clues, so it’ll be a bit random. A $1000 clue might end up being super easy lol, but I think that’s some jank I’m okay with. Player list Ooh also, I made a proper player list now! I did want literal podiums, which I may still do at some point, but I’m happy with this for the time being. This can now also react to changes in the game like points or who’s turn it is!"}, {"post_id": 30376, "ts": "2026-07-17T21:09:53Z", "hours": 9.8342, "text": "BEEEG DEVLOG Wowwee! I’ve gotta remember to make devlogs more often. Seriously. Here’s a list of changes that I’ve made since my last devlog! The basics of the board are implemented! You can’t interact with it yet, but the template to do so is there, and it now exists on the server-side too and the client reads from that state. The board is also animated now. When someone selects a clue, it will highlight the category and the clue, you can hover clues, and, my favorite bit, the categories get revealed one by one when the game starts! That last part actually kind of sucked to implement lol. I prepared for this when making the lobby’s ready up system and made the state that it uses to work a bit dynamic because I knew that I would need it! The state stores readyForNextState , which for some states (like when we’re in the lobby) allow unreadying, but for others, simply act as a marker of whether a specific client is ready to move on. This is probably actually really important because if we just ran a timer on the server, a NUMBER of things could go wrong, most importantly being that a laggy client could get desynced VERY quickly and have a bad time. Alongside this, there is an intro now! I spent a good bit of time in Aseprite and messing with FL Studio to make some art and an intro track, both for the logo and so I finally have some artwork to add in the Discord Developer Portal, so there aren’t anymore blank assets. It’s not perfect (i am NOT an artist lol) See pictures below! psst , I also made a “think” music track for if the final round is enabled! It’s not in the game yet, though. I made a number of styling fixes. The board in particular looks much better on different screen sizes now, even on my phone. Reminder to use relative sizes when able, not px ! The server now registers the activity entry point command as having an APP_HANDLER handler, which means that the server must respond to interactions now, rather than Discord autolaunching the activity. The benefit of this is that we have control over whether a message gets sent to the channel it was started in (and when), or if we even launch the activity at all (disallow banned users? anything is possible…)! The rich presence actually has meaningful details now lol, rather than placeholder text. NOWWW what? I am going to, FINALLY, FOR REAL THIS TIME, (lol) actually start making the game logic. (It’s about time!) More updates sooooon!"}, {"post_id": 29136, "ts": "2026-07-15T20:22:28Z", "hours": 2.0267, "text": "I prototyped the game board last night! This took a while to get the styling right as I want this to work well on all screen sizes, hopefully including mobile devices. It’s still a little rough on very small sizes (e.g., my phone), but one step at a time! I still want to add little “podiums” at the bottom for our players. After that, I’m going to be working on getting the board working on the serverside, so that actually becomes part of the game state."}, {"post_id": 28080, "ts": "2026-07-14T03:29:38Z", "hours": 8.6656, "text": "socket.io is cool, BUT So. 8 hour devlog, my bad, but I’m going to start by talking about the thing that I’ve been mostly fighting with today. The networking backend that I’m using for LARPARDY is Socket.IO , which works similarly to (and usually on top of) WebSockets, but with a lot more quality of life features and ease of use for specifically these kinds of situations. I have been fighting for a few hours today trying to figure out why I could not, for the life of me, get socket.emit to work on the client. It was, in fact, one setting, retries , in the client config, stopping it from working, for SOME reason. Oops. Anyways… PROGRESS! (GAME!) Progress has been steady! Most of the changes that I’ve been making have been making the client more workable as I make new components, and actually more planning out the infrastructure. I’ve designed some new UI elements, moved where some state is stored, and so on. I have a bad habit of overplanning, or rather, being too worried about planning big projects like these, because I like to avoid having to do cleanup work later (like the cleanup that I’m doing on the client right now). It’s not strictly a bad habit, but sometimes it’s better to just write the code rather than spend hours deliberating about micro-optimizations with yourself. I believe I am now ACTUALLY at the point where I can begin properly building the UI for the game board and the frontend & backend aspects around that. This was more hidden work (and… fighting with the socket.io client, apparently) so I don’t have too much to show this time either, sadly. BUT, I did finally design and prototype the lobby! So you do get something fun to look at while I work on everything lol"}, {"post_id": 23977, "ts": "2026-07-07T07:00:57Z", "hours": 8.9547, "text": "it’s REDISin’ time! wait is that… not the line from the movie? (also SORRY this should have been at least a couple devlogs lol, please forgive me) I’ve finally been working on the state management for LARPARDY! This turns out to be a MUCH harder task than I originally thought it would be, particularly because I’m trying to make sure that this will be safe and work well in a real environment. Redis First of all, instead of keeping state in the server’s memory, I have added a Redis DB to the project. This is part of why I wanted Docker set up, as this is now just in the docker-compose.yml ! I have NEVER personally used Redis before, so some time of the time from this devlog was admittedly stumbling my way through figuring out how to use Redis correctly. CORRECTLY is the key word, to be clear. I’m building basically a wrapper class around the Redis database, StateManager , which abstracts away the nasty database stuff so the main code doesn’t have to worry about actually interacting with Redis. It was, kind of a pain to write actually (lol?), because I was worried about race conditions basically the entire time, since this code needs to run async (i.e., something else might do something to a thing while we’re also trying to do something with that thing). I HOPE that the state management code is bug free for now, but we’ll see. (please…) Client The client has now also been updated to listen for new game states. I also finally figured out how to set up Rich Presence, so it will show that you’re playing LARPARDY on your profile! In addition, I made it so in-game avatars will highlight green when someone is speaking (like Discord), and I added waiting UI for when a player has joined but hasn’t fully connected yet, AND for when you are still connectin#. so NOWW can we start to make the actual game? yyyyyYES! I think so. I hope, anyway (lol). I believe my next step will be making a basic lobby/waiting UI that lets you start the game, and then finally start to implement the actual game. I AM EXCITEEEEDD (there’s not a ton to look at since this was mostly backend work. sorry! i’ll have more next time :3)"}, {"post_id": 21340, "ts": "2026-07-03T07:04:15Z", "hours": 1.2911, "text": "oops… I wasted some time on accident, woops. I thought Discord’s proxy verification meant that the discordsays.com proxy would send these headers to verify that an actual Discord client had connected with them, but uh, I checked the flowchart again and I got that wrong. Hm. Thankfully, I didn’t get too far into implementing that. Regardless, trying to implement that still encouraged me to do a small bit of cleanup, which was properly declaring the environment variable. A certified moment. (YES I am going to abuse the fact that I figured out that you can use custom emotes here. i am so sorry) smol devlog"}, {"post_id": 21309, "ts": "2026-07-03T05:10:37Z", "hours": 7.3028, "text": "I HATE DOCKER i love Docker!! So, I didn’t even write a devlog yesterday because I spent the entirety of the time that I did have setting up a Dockerfile and docker-compose.yml for LARPARDY. …why did it take that long Because I’ve never used Docker before! Well, I have, to run services on my PC and my homelab server, but I’ve never used it for my own projects before. Specifically, I want to go ahead and set up Docker because I know that I’m going to need a database (or possibly two! SQL + Redis), and running everything together in a container will make both development AND deployment much easier for me. I’ve never used it before, so this is, uh, a learning experience, to say the least. oh also, pnpm Oh. Also. pnpm has a bug. Apparently. I’m using pnpm as the package manager for both the server and the client (since they’re both TypeScript projects). Both projects are stored in a monorepo (literally meaning just a repo with multiple projects, basically), which makes it easy to manage for me and keeps my commits together. Nicely, pnpm recommends a Dockerfile for this exact scenario ! I reconfigured the project to use pnpm ‘s workspaces feature (which… is seperate from package.json ’s workspaces, for some reason ) so that this would work. pnpm deploy is supposed to copy the project with it’s own node_modules since workspaces use a shared one. The problem is that, when it rewrites workspace dependencies (because I have a shared package for both the server & client), it links it to the wrong source, which no longer exists after it’s copied! I tried to debug and get this working for ACTUAL AGES before I gave up and just wrote commands that manually copy the files instead. I figured that there HAS to be a way to get this working, considering the documentation itself recommends this build file. But noooope. It doesn’t seem so (cite: this GitHub issue which has been open since… 2023??? ). so what did you actually do The Docker config works now, and that’s the important thing! I currently have the client build into an nginx image, but I’m either going to drop this entirely or have the server serve the client files itself. This will allow me to implement Discord proxy header verification too, if I decide to."}, {"post_id": 19750, "ts": "2026-07-01T04:19:16Z", "hours": 1.7331, "text": "Socket.IO! As for perhaps one of the most important bits… this is Socket.IO ! I had to figure out how to get this working with Fastify first ( thank you random GitHub commenter ) since that’s my web framework of choice for the backend (for anything not going through Socket.IO), but here’s a basic implementation of it working! what it do? Socket.IO works similarly to (and if it’s available, on top of) WebSockets, where there’s a persistent connection with bi-directional communication between the client and the server. Socket.IO adds some extra fancy things on top of that, such as fallbacks when WebSockets aren’t available and rooms, and in general will make my life easier (lol). This part is, of course, very important for getting a game handled by the backend to work! This will also allow us to do multiplayer. Discord gives you an instance ID for each activity that players are playing together, so I’ll use this to make the rooms, that way players in the same voice channel will end up in the same game!"}, {"post_id": 19673, "ts": "2026-07-01T01:46:04Z", "hours": 5.8181, "text": "ho boy… I’ve wanted to make a Discord Activity basically since the feature began being teased… so, no better time than the present, right? I saw some guys playing Jeopardy the other night and I realized that I feel like the online ways of playing Jeopardy are kinda… uh, bad? I thought I should fix that. I’ve been getting a lot more comfortable with frontend development recently (I’m normally more comfy with backend stuff!), so now this is really going to test my ability to handle FULL STACK development. With that said, I’ve been playing around since last night and I have a working setup with (stable) communication with the Discord client via the SDK. (hooray!) Currently, it just shows the name and avatar of connected players. don’t you love React? Me too! Unfortunately, I am lying. I’m trying Vue.js for the first time for this project. There is a LOT that I’m planning that is very new to me for this project. I expect to need Redis, Socket.IO, and (of course) the Discord activities SDK, none of which I’ve ever used. So, here we go? the name. dude. what. why I didn’t originally have a name for this (the README still remains “Untitled Jeopardy Clone” for now), so I was using the name “Leopardy” as a placeholder. Someone recommened me to switch to LARPARDY. I couldn’t say no. I wish I did. …anyways, next up is actually making some sort of game state work. I’m going to start working on the backend!"}]...
|
Title: LARPARDY! by @purpld | Stardance
Devlogs:
Title: LARPARDY! by @purpld | Stardance
Devlogs:
ho boy… I’ve wanted to make a Discord Activity basically since the feature began being teased… so, no better time than the present, right? I saw some guys playing Jeopardy the other night and I realized that I feel like the online ways of playing Jeopardy are kinda… uh, bad? I thought I should fix that. I’ve been getting a lot more comfortable with frontend development recently (I’m normally more comfy with backend stuff!), so now this is really going to test my ability to handle FULL STACK development. With that said, I’ve been playing around since last night and I have a working setup with (stable) communication with the Discord client via the SDK. (hooray!) Currently, it just shows the name and avatar of connected players. don’t you love React? Me too! Unfortunately, I am lying. I’m trying Vue.js for the first time for this project. There is a LOT that I’m planning that is very new to me for this project. I expect to need Redis, Socket.IO, and (of course) the Discord activities SDK, none of which I’ve ever used. So, here we go? the name. dude. what. why I didn’t originally have a name for this (the README still remains “Untitled Jeopardy Clone” for now), so I was using the name “Leopardy” as a placeholder. Someone recommened me to switch to LARPARDY. I couldn’t say no. I wish I did. …anyways, next up is actually making some sort of game state work. I’m going to start working on the backend!
Socket.IO! As for perhaps one of the most important bits… this is Socket.IO ! I had to figure out how to get this working with Fastify first ( thank you random GitHub commenter ) since that’s my web framework of choice for the backend (for anything not going through Socket.IO), but here’s a basic implementation of it working! what it do? Socket.IO works similarly to (and if it’s available, on top of) WebSockets, where there’s a persistent connection with bi-directional communication between the client and the server. Socket.IO adds some extra fancy things on top of that, such as fallbacks when WebSockets aren’t available and rooms, and in general will make my life easier (lol). This part is, of course, very important for getting a game handled by the backend to work! This will also allow us to do multiplayer. Discord gives you an instance ID for each activity that players are playing together, so I’ll use this to make the rooms, that way players in the same voice channel will end up in the same game!
I HATE DOCKER i love Docker!! So, I didn’t even write a devlog yesterday because I spent the entirety of the time that I did have setting up a Dockerfile and docker-compose.yml for LARPARDY. …why did it take that long Because I’ve never used Docker before! Well, I have, to run services on my PC and my homelab server, but I’ve never used it for my own projects before. Specifically, I want to go ahead and set up Docker because I know that I’m going to need a database (or possibly two! SQL + Redis), and running everything together in a container will make both development AND deployment much easier for me. I’ve never used it before, so this is, uh, a learning experience, to say the least. oh also, pnpm Oh. Also. pnpm has a bug. Apparently. I’m using pnpm as the package manager for both the server and the client (since they’re both TypeScript projects). Both projects are stored in a monorepo (literally meaning just a repo with multiple projects, basically), which makes it easy to manage for me and keeps my commits together. Nicely, pnpm recommends a Dockerfile for this exact scenario ! I reconfigured the project to use pnpm ‘s workspaces feature (which… is seperate from package.json ’s workspaces, for some reason ) so that this would work. pnpm deploy is supposed to copy the project with it’s own node_modules since workspaces use a shared one. The problem is that, when it rewrites workspace dependencies (because I have a shared package for both the server & client), it links it to the wrong source, which no longer exists after it’s copied! I tried to debug and get this working for ACTUAL AGES before I gave up and just wrote commands that manually copy the files instead. I figured that there HAS to be a way to get this working, considering the documentation itself recommends this build file. But noooope. It doesn’t seem so (cite: this GitHub issue which has been open since… 2023??? ). so what did you actually do The Docker config works now, and that’s the important thing! I currently have the client build into an nginx image, but I’m either going to drop this entirely or have the server serve the client files itself. This will allow me to implement Discord proxy header verification too, if I decide to.
oops… I wasted some time on accident, woops. I thought Discord’s proxy verification meant that the discordsays.com proxy would send these headers to verify that an actual Discord client had connected with them, but uh, I checked the flowchart again and I got that wrong. Hm. Thankfully, I didn’t get too far into implementing that. Regardless, trying to implement that still encouraged me to do a small bit of cleanup, which was properly declaring the environment variable. A certified moment. (YES I am going to abuse the fact that I figured out that you can use custom emotes here. i am so sorry) smol devlog
it’s REDISin’ time! wait is that… not the line from the movie? (also SORRY this should have been at least a couple devlogs lol, please forgive me) I’ve finally been working on the state management for LARPARDY! This turns out to be a MUCH harder task than I originally thought it would be, particularly because I’m trying to make sure that this will be safe and work well in a real environment. Redis First of all, instead of keeping state in the server’s memory, I have added a Redis DB to the project. This is part of why I wanted Docker set up, as this is now just in the docker-compose.yml ! I have NEVER personally used Redis before, so some time of the time from this devlog was admittedly stumbling my way through figuring out how to use Redis correctly. CORRECTLY is the key word, to be clear. I’m building basically a wrapper class around the Redis database, StateManager , which abstracts away the nasty database stuff so the main code doesn’t have to worry about actually interacting with Redis. It was, kind of a pain to write actually (lol?), because I was worried about race conditions basically the entire time, since this code needs to run async (i.e., something else might do something to a thing while we’re also trying to do something with that thing). I HOPE that the state management code is bug free for now, but we’ll see. (please…) Client The client has now also been updated to listen for new game states. I also finally figured out how to set up Rich Presence, so it will show that you’re playing LARPARDY on your profile! In addition, I made it so in-game avatars will highlight green when someone is speaking (like Discord), and I added waiting UI for when a player has joined but hasn’t fully connected yet, AND for when you are still connectin#. so NOWW can we start to make the actual game? yyyyyYES! I think so. I hope, anyway (lol). I believe my next step will be making a basic lobby/waiting UI that lets you start the game, and then finally start to implement the actual game. I AM EXCITEEEEDD (there’s not a ton to look at since this was mostly backend work. sorry! i’ll have more next time :3)
socket.io is cool, BUT So. 8 hour devlog, my bad, but I’m going to start by talking about the thing that I’ve been mostly fighting with today. The networking backend that I’m using for LARPARDY is Socket.IO , which works similarly to (and usually on top of) WebSockets, but with a lot more quality of life features and ease of use for specifically these kinds of situations. I have been fighting for a few hours today trying to figure out why I could not, for the life of me, get socket.emit to work on the client. It was, in fact, one setting, retries , in the client config, stopping it from working, for SOME reason. Oops. Anyways… PROGRESS! (GAME!) Progress has been steady! Most of the changes that I’ve been making have been making the client more workable as I make new components, and actually more planning out the infrastructure. I’ve designed some new UI elements, moved where some state is stored, and so on. I have a bad habit of overplanning, or rather, being too worried about planning big projects like these, because I like to avoid having to do cleanup work later (like the cleanup that I’m doing on the client right now). It’s not strictly a bad habit, but sometimes it’s better to just write the code rather than spend hours deliberating about micro-optimizations with yourself. I believe I am now ACTUALLY at the point where I can begin properly building the UI for the game board and the frontend & backend aspects around that. This was more hidden work (and… fighting with the socket.io client, apparently) so I don’t have too much to show this time either, sadly. BUT, I did finally design and prototype the lobby! So you do get something fun to look at while I work on everything lol
I prototyped the game board last night! This took a while to get the styling right as I want this to work well on all screen sizes, hopefully including mobile devices. It’s still a little rough on very small sizes (e.g., my phone), but one step at a time! I still want to add little “podiums” at the bottom for our players. After that, I’m going to be working on getting the board working on the serverside, so that actually becomes part of the game state.
BEEEG DEVLOG Wowwee! I’ve gotta remember to make devlogs more often. Seriously. Here’s a list of changes that I’ve made since my last devlog! The basics of the board are implemented! You can’t interact with it yet, but the template to do so is there, and it now exists on the server-side too and the client reads from that state. The board is also animated now. When someone selects a clue, it will highlight the category and the clue, you can hover clues, and, my favorite bit, the categories get revealed one by one when the game starts! That last part actually kind of sucked to implement lol. I prepared for this when making the lobby’s ready up system and made the state that it uses to work a bit dynamic because I knew that I would need it! The state stores readyForNextState , which for some states (like when we’re in the lobby) allow unreadying, but for others, simply act as a marker of whether a specific client is ready to move on. This is probably actually really important because if we just ran a timer on the server, a NUMBER of things could go wrong, most importantly being that a laggy client could get desynced VERY quickly and have a bad time. Alongside this, there is an intro now! I spent a good bit of time in Aseprite and messing with FL Studio to make some art and an intro track, both for the logo and so I finally have some artwork to add in the Discord Developer Portal, so there aren’t anymore blank assets. It’s not perfect (i am NOT an artist lol) See pictures below! psst , I also made a “think” music track for if the final round is enabled! It’s not in the game yet, though. I made a number of styling fixes. The board in particular looks much better on different screen sizes now, even on my phone. Reminder to use relative sizes when able, not px ! The server now registers the activity entry point command as having an APP_HANDLER handler, which means that the server must respond to interactions now, rather than Discord autolaunching the activity. The benefit of this is that we have control over whether a message gets sent to the channel it was started in (and when), or if we even launch the activity at all (disallow banned users? anything is possible…)! The rich presence actually has meaningful details now lol, rather than placeholder text. NOWWW what? I am going to, FINALLY, FOR REAL THIS TIME, (lol) actually start making the game logic. (It’s about time!) More updates sooooon!
A REAL BOARD! A trickier task than it sounds like, but I needed some clues finally! The default testing board was uh… not exactly “production ready” in my opinion (lol). This was tricky particularly because, well, where am I going to get clues from? You kinda need a LOT of clues for a good Jeopardy game, and while UGC is something I want to make, I would like a default mode, too, and there is certainly no way that I was going to try to make a bunch of clues by myself. (respectfully, I don’t think I am also smart enough to do that lol) Jepp I found a little project called jepp which exposes a LOT of existing Jeopardy clues through an API. I didn’t want to bother that API too much though, and there is an SQLite DB dump publicly available, so LARPARDY now uses that instead. With a little bit of SQL later (and, uh, remembering how to use SQL lol)… we have many, many clues! The only thing is that the database does not store the value of clues, so it’ll be a bit random. A $1000 clue might end up being super easy lol, but I think that’s some jank I’m okay with. Player list Ooh also, I made a proper player list now! I did want literal podiums, which I may still do at some point, but I’m happy with this for the time being. This can now also react to changes in the game like points or who’s turn it is!
Questions, and MORE boring serverside stuffs Oof, sorry, it’s been a while since I’ve been able to work on this project, and the clock is ticking! Clues! Clues can now actually be selected and that will be reflected to the server and all players. You can also see a bit of the buzzer work I started, which is actually much more of a pain than it would seem. Why? Well that’s because we now have to talk about: SYNCING TIME OVER THE NETWORK The server running the game has a system time. Your computer, phone, or whatever, also has its own system time which could vary entirely from the server’s. If the server wants to schedule an event (say, when you should be allowed to buzz in), how does it tell the client when that is without an offset? Using Unix timestamps is common, but without knowing how offset the client is from the server, we don’t actually really know when that timestamp is in reality (since EITHER could be offset from reality, if not both), and we don’t want mismatched times to cause weird problems. The solution that I went with is that the client will periodically (every 1 second for now) send a “ping” message to the server with its current timestamp. The server will reply with that time as well as it’s own timestamp. Upon receiving that reply, it can then do three things: Calculate the round trip time (i.e., ping!) from the original time we sent and the time it is now. Estimate the server time as we’re processing this by adding the server time + half of the ping Calculate our time offset from the server by subtracting our time from that estimate I admit that I did NOT figure this out on my own. Google is nice. But this does actually kind of serve as the basis for how things like the Network Time Protocol (NTP) work. Reminder that all of that is just so we can show when the buzzer is allowed to be pressed accurately. Spectating Also, I added a fix so late players aren’t actually awkwardly added in the middle of a game and are instead in a kind of “spectator” state; since they’re still connected, they receive all the game state events and so on. If all actual players leave, the game will reset (which also means I now have a function to reset the state, and for showing alerts!).
IT’S READY! I am very happy to say that I’m done with the main game! I wanted to split this into a couple of devlogs, but Stardance was having some issues syncing time earlier so I kept working. (I think it’s actually been up for a little bit… oops) Buzzing -> Judging Judging now is fully functional! Either someone gets the clue right, everyone gets it wrong, or not everybody buzzes in and we move on. I’ve also introduced something called Hostless Mode , which allows the game host to play (where normally they could not). This plays more like most online versions of the gameshow, where you can buzz in, reveal the answer, and then that’s that (instead of everyone getting a chance to buzz in if the first person is wrong). This also gives a way to play singleplayer, which should make it more accessible. All of this took a lot of careful logic work to make sure that everything works as expected (hence the VERY long log time, plus several other things), no matter how you’re playing! End of Line The game, also, can finally end, now that clues get marked off. I made a simple leaderboard that shows when the game is over, and then you can return to the lobby! See the photo below. GAMEPLAY! You can watch a short gameplay example with a host (right) + 2 players (left) below! You’re expected to play with voice (or a text channel, if you wish), so this demo just showcases the flow of the game. I logged a lot of time on this one because there was also a lot of testing and fixing small bugs, especially when making the judging system. A lot can get weird when managing so much state!
SHIP IT! LARPARDY! is now verified on Discord! I spent a short while writing a basic Terms of Service and Privacy Policy (as required by Discord) and verifying all the details. Live deployment I’ve also deployed a production version of the game server to my home lab! It’s exposed through a Cloudflare Tunnel, because I’m behind CGNAT (i.e., I don’t have my own public IP). Spending all that time setting up Docker for this project all that time ago made this VERY easy, which was the entire point. I’m glad nothing broke in the process… lol Discovery The last thing I want to do is set up Discovery on Discord, so reviewers (and anybody, for that matter!) can just search up LARPARDY! in Discord, and it should come up. I pretty much just need to make a support server and write the details, and then… LET’S SHIP IT! I dunno if anybody reads these things, but if you do, thank you. :D
Last devlog before ship (proper this time!) Discovery I set up a Discord server for the game, so LARPARDY! is now on Discord’s discovery (App Directory)! This is now used for the demo link for the game. README (please) Just spent some time redoing the (ancient) README and making it look pretty and detailed. I took some screenshots and added them here. They also show up on Discord! :D
Ships:
I made a Discord activity trivia game inspired by the Jeopardy game show called LARPARDY! that you can easily play with your friends without leaving Discord! I am very proud of how far this project has come because it was very challenging for me. The frontend is based on Vue.js, which before this, I had never used before. I wanted to try something non-React and I’ve come to REALLY love Vue. I had to write multiplayer netcode entirely by myself! I used Socket.IO to handle the networking itself, but I had to write ALL of the state management and syncing code. There were certainly some difficulties in doing so! I also have not worked with Redis before, which was my database of choice for state management. It is… quite different from other databases, so writing code to interact with it was a learning experience....
|
1792968872.2345521
|
1793055272.2345521
|
|
21869
|
Create: Stealth & Security (MC Mod) by @xFN10x Create: Stealth & Security (MC Mod) by @xFN10x | Stardance...
|
xFN10x
|
1
|
89.0
|
1317
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-30T21:23:49Z", "hours": 89.0, "multiplier": 18.49, "payout": 1317, "blessing": "neutral", "text": "Create: Stealth & Security is a Minecraft mod for 1.21.1 Neoforge that I decided to make because I like being able to spy on people… This is the first neoforge mod I’ve developed & published. I would reccomend playing this with the modrinth app if you already have it, with JEI and Jade .", "repo": "https://github.com/xFN10x/Create-Security", "demo": "https://modrinth.com/mod/create-security"}]...
|
[{"post_id": 37800, "ts": "202 [{"post_id": 37800, "ts": "2026-07-30T18:53:36Z", "hours": 3.5239, "text": "devlog 20, normal time now vid link: https://youtu.be/H_7fsU2BupI alright, im probably gonna ship soon. so i focaused on some touch up features. recipes everything has recipes now, even adding the finiranium sensor recipe that i forgot last update. summaries everything also has shift summaries, so now people can actually learn how to use the mod I also added Nether Glass, right now it’s only used for the chunk detector recipe, but it will be able to block end sickness later on. I’ll be mainly prioritizing my other project https://stardance.hackclub.com/projects/336 after this ship, but ill probably work on this a bit more."}, {"post_id": 37241, "ts": "2026-07-29T19:56:10Z", "hours": 7.4528, "text": "devlog 19… these features are quite difficult to fine tune video cause stardance doesn’t work alright so 8 hours again… this time i only did one feature, (and maybe some bug fixes…) The chunk detector is finally done! Now you can drop a log in, and try to catch that person stealing your diamonds every night! formatting and other things aswell I also fixed some formatting for things like tooltips, so they are much nicer to look at now. I also made the log screen bigger. devlog 18… these features are quite difficult to fine tune alright so 8 hours again… this time i only did one feature, (and maybe some bug fixes…) The chunk detector is finally done! Now you can drop a log in, and try to catch that person stealing your diamonds every night! formatting and other things aswell I also fixed some formatting for things like tooltips, so they are much nicer to look at now. I also made the log screen bigger. oh yea stress The two kinetic blocks; the Laser Diode, and Chunk detector also actually consume stress units now, actually the laser diode doesn’t yet… but it will… and ill increase the speed req of it. oh yea stress The two kinetic blocks; the Laser Diode, and Chunk detector also actually consume stress units now, actually the laser diode doesn’t yet… but it will… and ill increase the speed req of it. now ill add a feature to obfuscate a players skin if they are invis."}, {"post_id": 34939, "ts": "2026-07-26T01:48:46Z", "hours": 8.9261, "text": "devlog 18… 9 hours 😅 ok so i normally would have devlogged after i got the ui done… but this ended up taking more time than i thought… I finished the ui of the log, it took most of the time, and i also kinda did everything… ui is done, i added some helpful utilities for loggable blocks, you can log things, omg this took so long, but there is really nothing else to say 😔..yet there are still a bunch of random things i need to fix"}, {"post_id": 33841, "ts": "2026-07-24T02:38:37Z", "hours": 2.9106, "text": "devlog 17 or 16, im tired alright, i put the chunk detector aside, and ive done a bunch of work on logs. Mostly just me trying to figure out how the hell Create’s menus work because they have no dev wiki 😔… anyways, the log now has a texture ive done twice trying to figure out how to make it look like a piece of paper, and i also make a screen; (ignore how its using the old texture.) The log is gonna be usable between different blocks as i said, and each entry is gonna have a target player or entity, message, and timestamp. And i might also add the source block. I also forgot that i forgot to add a recipe to the finiranium detector…"}, {"post_id": 33047, "ts": "2026-07-22T16:51:27Z", "hours": 1.8803, "text": "starting to work on the Chunk Detector. I’ve started adding the new block, the Chunk Detector, which will log entries and exits of each entity in a chunk. It will log these in a new item, the Log. You will be able to use it to see different timed events of different blocks, like the Advanced Sight Sensor when i add it."}, {"post_id": 27906, "ts": "2026-07-13T20:38:41Z", "hours": 0.8375, "text": "Finished the finiranium sensor, and added some config values about username obfuscation when invisible. (Got the idea from seeing it in a lifesteal video) Ill release version 0.1.1 now."}, {"post_id": 27770, "ts": "2026-07-13T16:49:07Z", "hours": 4.0006, "text": "i swear ive made this devlog 3 times already… The mod is now on modrinth , and curseforge . I would reccomend trying it out, as i want to make sure its balenced enough for its beta. Now that its on modrinth, I’ve been working on some updates. Currently im adding the Finiranium Sensor, whichs shows you when Finiranium is nearby; (ignore the debug outline in the screenshot.) Im also planning on adding the next blocks & items before the beta: Chunk Detector : Detects when Players/Entities enter a chunk Advanced Sight Sensor/Laser Diode Keycard stuff Smarter Observer (wip name) : Logs players’ interactions with a block"}, {"post_id": 21712, "ts": "2026-07-03T20:07:05Z", "hours": 0.5264, "text": "I’ve finished setting up my modrinth page, (and curseforge page,) and now im waiting for review. Ill pause development while i wait for it to be put up on at least modrinth. https://modrinth.com/mod/create-security https://www.curseforge.com/minecraft/mc-mods/create-stealth-security/preview"}, {"post_id": 20920, "ts": "2026-07-02T17:15:26Z", "hours": 1.5025, "text": "con-figured i should make some more configs before first version I’ve made a bunch of configurable options, there are definity more i could add, but this is good enough for the first alpha version. Now i just need to finish the modrinth page, and add a readme."}, {"post_id": 20492, "ts": "2026-07-02T03:00:10Z", "hours": 3.5531, "text": "recipes, recipes, come get your recipes here now everything has a recipe! ive also added some more items to make these recipes more intuitive. Ill try to show some recipes in the attachments. Next im gonna make a server config for stuff like end sickness, and then im gonna raise the default for end sickness to make it a bit easier to avoid. ill release an alpha version for testing soon, its not gonna be my ship though. (also, the missing texture thing are the empty finiranium goggles, idk why they dont work)"}, {"post_id": 19629, "ts": "2026-07-01T00:26:20Z", "hours": 2.8147, "text": "I’ve added some QoL stuff, I added a feature where you can adjust the eye offset of the finiranium goggles, its a bit glitchly right now, but its fine. I’ve also added a config, for now only for the client. So far there is only one setting for the flicker of a laser. (you can see it at its default in the gif)"}, {"post_id": 19376, "ts": "2026-06-30T17:44:36Z", "hours": 5.0992, "text": "now the laser works on contraptions. The laser diode now visually work on contraptions… but due to create limitations, they don’t actually function… anyways, im gonna make a ponder now, then ill probably make a config. Ive also fixed a bunch of issues with the rendering of the lasers. And i also fixed an issue with me not knowing that the block entity renderers where shared across all of them, therefore the lasers would change length weridly from other lasers…"}, {"post_id": 18747, "ts": "2026-06-29T22:47:43Z", "hours": 3.5692, "text": "the laser renders properly. Now the laser sensor can actually shoot a proper laser. Also I learned how to actually spell laser. Now, I just need to do i bit more fine tuning, and then i need to make the thing actually function. And then i need to add the contraption behaviour… which hopefully wont be to hard… yay the video upload wont work again! heres a link to it instead https://file.garden/ZPu7YidXf2vX5nJR/Screen%20Recording%202026-06-29%20192129.mp4 (i was trying hackclub cdn, but i think thats the issue)"}, {"post_id": 18022, "ts": "2026-06-29T00:10:21Z", "hours": 5.8306, "text": "im starting to add lazer diodes, they will let you detect when something is blocking a lazer. Kinda like a sight sensor, but no sight. Ive been trying to figure out how to make the lazer, and ive got a good start as you can see. In the second image you can see the lazer, (left,) and the receiver you get from wrenching it, (right.) With the advanced versions you will only need one lazer."}, {"post_id": 15055, "ts": "2026-06-24T13:34:42Z", "hours": 2.795, "text": "Ive added a new liquid: Liquid Finiranium. Its going to be used to refil electric camo. Also, since liquid finiranium is so extremely deadly, im gonna raise the threshold for getting end sickness, and im also gonna add ways to prevent end sickness"}, {"post_id": 13437, "ts": "2026-06-22T00:39:18Z", "hours": 4.0725, "text": "End sickness is now implemented, you get it from being near finiranium, or having it in your inventory. In the attached video, (recorded before i added the inventory sickening,) You can see how it works, you can actually barely survive it if you have low hunger, but if you heal to a certain point, depending on the level, it hurts you, also depending on the level. Next features coming up: Electric Camo & Entity Sensors Also, this video is a bit old, so some of the other things i added will be in future devlogs. OK I SWEAR THIS VIDEO WILL NOT WORK, YOU DONT GET IT, SORRY"}, {"post_id": 12070, "ts": "2026-06-19T18:06:28Z", "hours": 0.3258, "text": "now you can see invis entities! im imagining a really cool stealth mission being done with this mod… especially since you can see people wearing them in darkness"}, {"post_id": 11975, "ts": "2026-06-19T15:32:56Z", "hours": 0.6133, "text": "i updated the goggles model, and made them glow in the dark. I also finished the post processing effects that happen when you put them on. I still need to make invisible entities visible with them on."}, {"post_id": 11945, "ts": "2026-06-19T14:12:31Z", "hours": 1.0397, "text": "I’ve actually added the finigoggles item, and i made a custom model for them too. right now im working on making a custom renderer to recreate kinda what the metal gear solid 1 goggles look like."}, {"post_id": 11596, "ts": "2026-06-18T21:41:56Z", "hours": 27.3147, "text": "alright, i was not planning to put this on stardance, but ive decided to. (ughh..) time to start writing about the past 3 days day 1: I started working on setup, i have never actually make a create addon, or a neoforge addon (well, ive kinda experimented with neoforge) so it took me a bit I created the model for the first block; (1st attach,) The Sight Sensor. It outputs a redstone signal depending on the distance an entity is at when looking at it. (2nd attach is the ponder, that i made later) day 2: I actually implemented the sight sensor, and finished it up. I added a keycard item aswell (planned for something,) and i made the creative tab (attach 3) day 3: i added the functionality for sight sensors on contraptions, and i added functionality to make them activate when looking at each other, so you can basically make wireless redstone. I also added Finiranium & Finiranium Ore. Finiranium is a new material im adding to the mod, it can give you end sickness if you are around it to much, and you will be able to use it to make devices like entity detection goggles. (lets you see invis entities.) day 4: I did more work on finiranium, and i gave it a cool name. It can also generate in the end now. (attach 4 & 5) I also added End Sickness, which changes your hunger bar, and heart icons. It will split your hunger, and health bars by a certain amount depending on the level. day 5 & 6 (today) I’ve been doing a lot of work looking at minecraft’s rendering, trying to make some sort of effects for the goggles. I did a lot of work with post processing, and other rendering. However, i think i figured something out. Since it appears that I’ve hit my attachment cap, ill post images of me working on this soon."}]...
|
Title: Create: Stealth & Security (MC Mod) by Title: Create: Stealth & Security (MC Mod) by @xFN10x | Stardance
Devlogs:
alright, i was not planning to put this on stardance, but ive decided to. (ughh..) time to start writing about the past 3 days day 1: I started working on setup, i have never actually make a create addon, or a neoforge addon (well, ive kinda experimented with neoforge) so it took me a bit I created the model for the first block; (1st attach,) The Sight Sensor. It outputs a redstone signal depending on the distance an entity is at when looking at it. (2nd attach is the ponder, that i made later) day 2: I actually implemented the sight sensor, and finished it up. I added a keycard item aswell (planned for something,) and i made the creative tab (attach 3) day 3: i added the functionality for sight sensors on contraptions, and i added functionality to make them activate when looking at each other, so you can basically make wireless redstone. I also added Finiranium & Finiranium Ore. Finiranium is a new material im adding to the mod, it can give you end sickness if you are around it to much, and you will be able to use it to make devices like entity detection goggles. (lets you see invis entities.) day 4: I did more work on finiranium, and i gave it a cool name. It can also generate in the end now. (attach 4 & 5) I also added End Sickness, which changes your hunger bar, and heart icons. It will split your hunger, and health bars by a certain amount depending on the level. day 5 & 6 (today) I’ve been doing a lot of work looking at minecraft’s rendering, trying to make some sort of effects for the goggles. I did a lot of work with post processing, and other rendering. However, i think i figured something out. Since it appears that I’ve hit my attachment cap, ill post images of me working on this soon.
I’ve actually added the finigoggles item, and i made a custom model for them too. right now im working on making a custom renderer to recreate kinda what the metal gear solid 1 goggles look like.
i updated the goggles model, and made them glow in the dark. I also finished the post processing effects that happen when you put them on. I still need to make invisible entities visible with them on.
now you can see invis entities! im imagining a really cool stealth mission being done with this mod… especially since you can see people wearing them in darkness
End sickness is now implemented, you get it from being near finiranium, or having it in your inventory. In the attached video, (recorded before i added the inventory sickening,) You can see how it works, you can actually barely survive it if you have low hunger, but if you heal to a certain point, depending on the level, it hurts you, also depending on the level. Next features coming up: Electric Camo & Entity Sensors Also, this video is a bit old, so some of the other things i added will be in future devlogs. OK I SWEAR THIS VIDEO WILL NOT WORK, YOU DONT GET IT, SORRY
Ive added a new liquid: Liquid Finiranium. Its going to be used to refil electric camo. Also, since liquid finiranium is so extremely deadly, im gonna raise the threshold for getting end sickness, and im also gonna add ways to prevent end sickness
im starting to add lazer diodes, they will let you detect when something is blocking a lazer. Kinda like a sight sensor, but no sight. Ive been trying to figure out how to make the lazer, and ive got a good start as you can see. In the second image you can see the lazer, (left,) and the receiver you get from wrenching it, (right.) With the advanced versions you will only need one lazer.
the laser renders properly. Now the laser sensor can actually shoot a proper laser. Also I learned how to actually spell laser. Now, I just need to do i bit more fine tuning, and then i need to make the thing actually function. And then i need to add the contraption behaviour… which hopefully wont be to hard… yay the video upload wont work again! heres a link to it instead https://file.garden/ZPu7YidXf2vX5nJR/Screen%20Recording%202026-06-29%20192129.mp4 (i was trying hackclub cdn, but i think thats the issue)
now the laser works on contraptions. The laser diode now visually work on contraptions… but due to create limitations, they don’t actually function… anyways, im gonna make a ponder now, then ill probably make a config. Ive also fixed a bunch of issues with the rendering of the lasers. And i also fixed an issue with me not knowing that the block entity renderers where shared across all of them, therefore the lasers would change length weridly from other lasers…
I’ve added some QoL stuff, I added a feature where you can adjust the eye offset of the finiranium goggles, its a bit glitchly right now, but its fine. I’ve also added a config, for now only for the client. So far there is only one setting for the flicker of a laser. (you can see it at its default in the gif)
recipes, recipes, come get your recipes here now everything has a recipe! ive also added some more items to make these recipes more intuitive. Ill try to show some recipes in the attachments. Next im gonna make a server config for stuff like end sickness, and then im gonna raise the default for end sickness to make it a bit easier to avoid. ill release an alpha version for testing soon, its not gonna be my ship though. (also, the missing texture thing are the empty finiranium goggles, idk why they dont work)
con-figured i should make some more configs before first version I’ve made a bunch of configurable options, there are definity more i could add, but this is good enough for the first alpha version. Now i just need to finish the modrinth page, and add a readme.
I’ve finished setting up my modrinth page, (and curseforge page,) and now im waiting for review. Ill pause development while i wait for it to be put up on at least modrinth. https://modrinth.com/mod/create-security https://www.curseforge.com/minecraft/mc-mods/create-stealth-security/preview
i swear ive made this devlog 3 times already… The mod is now on modrinth , and curseforge . I would reccomend trying it out, as i want to make sure its balenced enough for its beta. Now that its on modrinth, I’ve been working on some updates. Currently im adding the Finiranium Sensor, whichs shows you when Finiranium is nearby; (ignore the debug outline in the screenshot.) Im also planning on adding the next blocks & items before the beta: Chunk Detector : Detects when Players/Entities enter a chunk Advanced Sight Sensor/Laser Diode Keycard stuff Smarter Observer (wip name) : Logs players’ interactions with a block
Finished the finiranium sensor, and added some config values about username obfuscation when invisible. (Got the idea from seeing it in a lifesteal video) Ill release version 0.1.1 now.
starting to work on the Chunk Detector. I’ve started adding the new block, the Chunk Detector, which will log entries and exits of each entity in a chunk. It will log these in a new item, the Log. You will be able to use it to see different timed events of different blocks, like the Advanced Sight Sensor when i add it.
devlog 17 or 16, im tired alright, i put the chunk detector aside, and ive done a bunch of work on logs. Mostly just me trying to figure out how the hell Create’s menus work because they have no dev wiki 😔… anyways, the log now has a texture ive done twice trying to figure out how to make it look like a piece of paper, and i also make a screen; (ignore how its using the old texture.) The log is gonna be usable between different blocks as i said, and each entry is gonna have a target player or entity, message, and timestamp. And i might also add the source block. I also forgot that i forgot to add a recipe to the finiranium detector…
devlog 18… 9 hours 😅 ok so i normally would have devlogged after i got the ui done… but this ended up taking more time than i thought… I finished the ui of the log, it took most of the time, and i also kinda did everything… ui is done, i added some helpful utilities for loggable blocks, you can log things, omg this took so long, but there is really nothing else to say 😔..yet there are still a bunch of random things i need to fix
devlog 19… these features are quite difficult to fine tune video cause stardance doesn’t work alright so 8 hours again… this time i only did one feature, (and maybe some bug fixes…) The chunk detector is finally done! Now you can drop a log in, and try to catch that person stealing your diamonds every night! formatting and other things aswell I also fixed some formatting for things like tooltips, so they are much nicer to look at now. I also made the log screen bigger. devlog 18… these features are quite difficult to fine tune alright so 8 hours again… this time i only did one feature, (and maybe some bug fixes…) The chunk detector is finally done! Now you can drop a log in, and try to catch that person stealing your diamonds every night! formatting and other things aswell I also fixed some formatting for things like tooltips, so they are much nicer to look at now. I also made the log screen bigger. oh yea stress The two kinetic blocks; the Laser Diode, and Chunk detector also actually consume stress units now, actually the laser diode doesn’t yet… but it will… and ill increase the speed req of it. oh yea stress The two kinetic blocks; the Laser Diode, and Chunk detector also actually consume stress units now, actually the laser diode doesn’t yet… but it will… and ill increase the speed req of it. now ill add a feature to obfuscate a players skin if they are invis.
devlog 20, normal time now vid link: https://youtu.be/H_7fsU2BupI alright, im probably gonna ship soon. so i focaused on some touch up features. recipes everything has recipes now, even adding the finiranium sensor recipe that i forgot last update. summaries everything also has shift summaries, so now people can actually learn how to use the mod I also added Nether Glass, right now it’s only used for the chunk detector recipe, but it will be able to block end sickness later on. I’ll be mainly prioritizing my other project https://stardance.hackclub.com/projects/336 after this ship, but ill probably work on this a bit more.
Ships:
Create: Stealth & Security is a Minecraft mod for 1.21.1 Neoforge that I decided to make because I like being able to spy on people… This is the first neoforge mod I’ve developed & published. I would reccomend playing this with the modrinth app if you already have it, with JEI and Jade ....
|
1792997800.9221249
|
1793084200.9221249
|
|
3794
|
RTX Minecraft Shader by @DubbsPi | Stardance
|
DubbsPi
|
1
|
77.0
|
1308
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-08T16:35:23Z", "hours": 77.0, "multiplier": 16.95, "payout": 1308, "blessing": "neutral", "text": "This is a custom minecraft shader I made. I first started with the Iris tutorial, but this project quickly expanded with a bunch of high end features, such as raytraced reflections! I’ve always kinda been annoyed with screen space reflections, so I thought, how hard could it be to just make them world space? Turns out it was way harder than I expected and took way longer as well. Overall, the result of my shader turned out pretty good, but it is not gameplay focused/to be used outside of demos in the overworld. I hope others may even build off of my progress to start integrating advanced reflection features like I have. This project greatly helped me improve my shader skills/taught me how to use the vertex and compute shaders (my only prior shader experience is on shadertoy) to produce nice results. The hardest part for me was probably setting up the BVH for RT acceleration and actually starting the project. Apparently minecraft has a lot of little overlapping transparent textures setup to perfectly rasterize, but to trace them causes a lot of precision related bugs, hence the reason I was forced to cheap out a little on grass blocks/tall grass. Also, the BVH resolution is limited due to performance constraints, causing overlapping triangles to clip infront of each other constantly, but that issue is mostly nonexistent for non transparent triangles, like buildings and such. In the end, I’m happy with the result and couldn’t have asked for a better long-term coding project!", "repo": "https://github.com/DubbsPi/My-Minecraft-Shaderpack", "demo": "https://www.curseforge.com/minecraft/shaders/basic-rtx-shader"}]...
|
[{"post_id": 43388, "ts": "202 [{"post_id": 43388, "ts": "2026-08-08T16:27:45Z", "hours": 7.6336, "text": "Finished fixing up a bunch of small bugs/issues. Also added waves to the water. I deleted my .git files by accident so that took a while to fix. Added a bunch of options to the settings to help reduce the render scale of reflections, which allows this to actually run halfway decently. Couldn’t figure out how to get the reflections to work properly on water, so there will be none there."}, {"post_id": 31865, "ts": "2026-07-20T16:26:32Z", "hours": 3.2281, "text": "We now have some of the most complex handheld lighting in minecraft! I setup a quick light tracing function and inputted the light values for it for each hand, so as you can see there are two shadows being cast. I will add an option in the future to upscale the RTX features since this was taken at 27 fps. I also added bloom and a bunch of settings for it and fixed up the sky ground issues. Now it truly scatters the ground until you hit y ≈ 200 million, then the lowest part breaks ¯ ( ツ)/¯"}, {"post_id": 31520, "ts": "2026-07-20T00:14:26Z", "hours": 3.8397, "text": "you know what, its 98% working. I call that good enough for tonight! I will continue fixing up the various tracing bugs and add entities, but so far this is pretty good! I plan on also raytracing shadows and lights if possible, although I will keep the standard shadow pass for nearby to get cheaper shadow filtering than with multiple rays. A lot of little issues plagued the final BVH build, mostly with me not clearing buffers :)"}, {"post_id": 30981, "ts": "2026-07-19T00:18:09Z", "hours": 6.6114, "text": "Finally!!! I got the radix sort working! The screen shot doesn’t look like much, but if you notice the bar on the bottom, the colors are generally grouped together and are perfectly stable. I had really struggled with getting this to work correctly as I’m not exactly the most experienced with compute shaders (or I should say was, now I know more about them than I need to). I had reached out to the shader labs discord even (thanks to them btw, they helped with a workgroup dispatching bug I had) and ran about every test possible to eliminate any possible race conditions/out of bounds errors. Then comes gemini to save the day. Apparently, I really should have done some more research into atomics in the past since even though they are meant to be stable, they are not perfect in the slightest, so I was basically attempting to do a radix sort without stable ranking (which is what it needs to achieve its insane parallelism and speed) and yeah it works now. BVH time (which should not take long to setup, the radix is normally the hard part), then true RTX features (not just voxelizations) like raytraced reflections and idk I might add a path tracing option since I’ve made a PT on shadertoy before and it was super enjoyable to do."}, {"post_id": 27699, "ts": "2026-07-13T14:19:43Z", "hours": 5.9664, "text": "All I can say I got done in this long session is I optimized the rendering slightly. Not the tracing, just the regular lighting by catching the light colors (since they are from the scattered sky) in a tiny 2x2 texture, but it did give me 80+ fps back when I look at the ground at least. I will also have to redo all the BVH setup and actually learn how to do it all since I was leaning a bit heavy on AI use and something broke somewhere and I couldn’t figure out where. Time to actually code it all QwQ (not really sad, probably a good idea to actually learn it fully)"}, {"post_id": 26101, "ts": "2026-07-10T18:06:01Z", "hours": 0.9642, "text": "Haha I feel evil for being mean to my gpu. I got the full world space reflections working (along with a second bar to show how full my triangle buffer is), although I still have to tweak the entities combining with the terrain, but I mean it runs horribly (better than not at all!). You can’t see it in the screen shot really, but I installed a resolution changer mod that puts me at 1/4 resolution, so 1/16 of the pixels and perf is worse than full res with the entities. Definitely will need to get that BVH/acceleration running soon because or else my GPU is going to blow a fuse :D"}, {"post_id": 25300, "ts": "2026-07-09T14:40:44Z", "hours": 1.5022, "text": "Fixed up performance and small bugs!! I removed the combining of vertices into tris and just did that during the trace. Thanks to less memory pressure I got back around 20 idle fps and fixed the jitter bug (hehe)"}, {"post_id": 24178, "ts": "2026-07-07T16:06:28Z", "hours": 3.9919, "text": "(mostly) Finished a major performance win. I figured out a way to use the vertex shader instead of the geometry shader for everything. The geometry shader is notoriously slow (5-10x) compared to everything else, so by not using, my idle performance has went up several times due to no longer having to slowly process so many triangles. I still have some room for improvement (iron golems are black and some weird new backface visual bugs, nothing severe though) but this is much better than before!"}, {"post_id": 22943, "ts": "2026-07-05T16:32:52Z", "hours": 3.3131, "text": "Got FXAA working! Haven’t finished the acceleration for the RT yet, but thought some minor AA wouldn’t be too hard and look nice! Thanks to Simon Rodriguez for his wonderful tutorial on how to add in FXAA!"}, {"post_id": 21433, "ts": "2026-07-03T11:48:09Z", "hours": 5.2997, "text": "The wonderful world space reflections!! Right now they are only setup for entities and are still unaccelerated (that is why its running 25fps). This one was a real challenge to pull off since I learned the hard way entities don’t have texture atlases. That means for each entity on the screen, I had to manually bake their texture to a custom atlas. I will say, I found a pretty smart way to do it that only runs the bake once and caches the texture. If I ever notice overwriting issues, I can change it up, but it should be good. Also, I made it index based off the texture’s color, so modded entities should be supported :)"}, {"post_id": 20766, "ts": "2026-07-02T13:44:05Z", "hours": 2.1428, "text": "We are starting to get fancy!! I finally got just an entity triangle buffer setup. The reason my framerate is so bad so far is I haven’t setup acceleration yet, but that is going to be next. Its surprising how its actually cheaper (so far) to store triangles than storing the block faces I had earlier since info can be omitted pretty easily. The hardest part about doing this was the fact I forgot to put a vertex output in the gbuffers_entities.gsh so it was erring a ton because I forgot two lines 😁"}, {"post_id": 20450, "ts": "2026-07-02T01:31:07Z", "hours": 1.3664, "text": "After optimizing the voxel buffer some more and the DDA march, I have decided to make my life harder. I plan on moving from voxel marches to actual raytracing with acceleration structures due to the fact as of now, block only marches is limited visually, doesn’t have entities, and breaks very quickly when a block uses a 3d model instead of a standard block. My hope will be to use compute shaders for the BVH building so that should be fast. I plan on doing entities first, terrain later just because then I’m not deleting stuff and for once entities are simpler. Plus once this works its basically infinite quality and actually might be faster."}, {"post_id": 19507, "ts": "2026-06-30T20:37:39Z", "hours": 1.7464, "text": "Got all the shadows in the reflections wired up as well! I also added screen space shadows to stop floating shadows on the foliage, but I set it to not run on blocks since those shadows are normally not floating and this way the most noticeable shadows are soft and without artifacts. I merged a lot of code this time so then WSR and SSR can be used at the same time for more detail (for now, hopefully the WSR will be full detail on its own in the near future). I’m going to ignore the 1.6gb of vram in the one buffer alone issue for now and address extra compression later :D"}, {"post_id": 19290, "ts": "2026-06-30T15:41:18Z", "hours": 3.3058, "text": "Moved world space reflections to a SSBO!! Now they have all the details of the world, but the only issue (which I suppose I couldn’t notice with the lower quality ones before), is 3D models for blocks, since they cannot be voxelized. By moving the reflections to a SSBO in gbuffers_terrain, I was able to get normal shadow mapping back as well! Also I made VRAM storage more efficient - nvm just did the math and using 8 4k textures in RGBA16F was actually more efficient at 1.06gb while the current SSBO requires 1.6gb, but also the 8 4k textures could only store one block face, while the SSBO stores all 6, so if anything, the new SSBO method if I only gave it the same rigor as my setup before, is around 0.27gb of VRAM, way more compressed."}, {"post_id": 18749, "ts": "2026-06-29T22:48:27Z", "hours": 6.0992, "text": "Got these colored world space reflections working. The only thing I’m running into the issues of voxelizing with the shadow pass, so I am going to do a big refactor and move everything into the regular geometry pass, just that may either require the entire scene be rendered or cleaver caching."}, {"post_id": 17365, "ts": "2026-06-28T03:42:47Z", "hours": 0.8519, "text": "Got the DDA reflector going! Its actually running faster than screen space reflections were, and obviously has the world within the radius (which is 128 blocks, pretty good actually since 126/16 is 8 chunks). Just need to add texturing and lighting to the blocks. Actually I need lighting everywhere in the shader lol"}, {"post_id": 17105, "ts": "2026-06-27T19:32:56Z", "hours": 3.4997, "text": "Finally got the voxel buffer setup!! I did it at the cost of shadows, so I might try to add shadows back, or just use the voxel buffer for them. My hope is to be able to use the buffer for world space reflections since not many shaders have that."}, {"post_id": 16356, "ts": "2026-06-26T16:40:20Z", "hours": 3.5428, "text": "Improved SSR and the sky a little bit. Also got LabPBR’s specular mapping working but couldn’t get the normal map yet. Wasted like two hours trying to use AI to help me seutp a voxel buffer for world space reflections. Ended up deleting all the AI’s stuff due to the fact it didn’t really work right and halved my framerate."}, {"post_id": 15941, "ts": "2026-06-25T22:01:37Z", "hours": 2.5308, "text": "Added atmospheric scattering. Honestly it looks pretty good and runs really well so far. Had to have AI help explain a couple of the functions, but other than that I hand wrote it all. Took a while to figure out how to replace the fog, but once I did it turned out really nice!"}, {"post_id": 15811, "ts": "2026-06-25T18:08:53Z", "hours": 3.2617, "text": "Got much better looking reflections setup with screen space reflections. Trying to use DDA before wasn’t really a bad move, it basically gives a ton of free perf, until you put it with something that isn’t a cube or have to march through 300 blocks. I will try to add world space reflections in the future, but for now the SSR is pretty performant and looks nice!"}, {"post_id": 15343, "ts": "2026-06-24T22:51:45Z", "hours": 1.3783, "text": "Got these really nice looking dda reflections going that are basically free, just walking too far away or looking at them wrong or doing literally anything that isn’t his photo looks kinda bad. Also non solid blocks are very warped, but in this ideal situation they looks really nice!"}, {"post_id": 15154, "ts": "2026-06-24T16:55:26Z", "hours": 1.6878, "text": "Got a lot of stuff done - kidding. Just imported a sky function from a old shader I made. Sadly, I could not get waving vertices working yet. No clue how to do those and everything I try either breaks when you move or when you rotate so yea."}, {"post_id": 15097, "ts": "2026-06-24T15:08:22Z", "hours": 1.4875, "text": "Finally finished the tutorial. Honestly its looking pretty good so far for just a tutorial. I think it a few hours I will have quite a bit down to make this look fantastic and run well!"}, {"post_id": 15050, "ts": "2026-06-24T13:24:37Z", "hours": 1.9417, "text": "Getting near the end of the iris shader tutorial. I had zero clue how to actually format minecraft shaders to start, but the tutorial was super helpful. Hopefully using my experience on shadertoy I will be able to apply optimization and beauty to a game of blocks (either that or I’ll be at 2fps and spinning fish quality)"}]...
|
Title: RTX Minecraft Shader by @DubbsPi | Stardanc Title: RTX Minecraft Shader by @DubbsPi | Stardance
Devlogs:
Getting near the end of the iris shader tutorial. I had zero clue how to actually format minecraft shaders to start, but the tutorial was super helpful. Hopefully using my experience on shadertoy I will be able to apply optimization and beauty to a game of blocks (either that or I’ll be at 2fps and spinning fish quality)
Finally finished the tutorial. Honestly its looking pretty good so far for just a tutorial. I think it a few hours I will have quite a bit down to make this look fantastic and run well!
Got a lot of stuff done - kidding. Just imported a sky function from a old shader I made. Sadly, I could not get waving vertices working yet. No clue how to do those and everything I try either breaks when you move or when you rotate so yea.
Got these really nice looking dda reflections going that are basically free, just walking too far away or looking at them wrong or doing literally anything that isn’t his photo looks kinda bad. Also non solid blocks are very warped, but in this ideal situation they looks really nice!
Got much better looking reflections setup with screen space reflections. Trying to use DDA before wasn’t really a bad move, it basically gives a ton of free perf, until you put it with something that isn’t a cube or have to march through 300 blocks. I will try to add world space reflections in the future, but for now the SSR is pretty performant and looks nice!
Added atmospheric scattering. Honestly it looks pretty good and runs really well so far. Had to have AI help explain a couple of the functions, but other than that I hand wrote it all. Took a while to figure out how to replace the fog, but once I did it turned out really nice!
Improved SSR and the sky a little bit. Also got LabPBR’s specular mapping working but couldn’t get the normal map yet. Wasted like two hours trying to use AI to help me seutp a voxel buffer for world space reflections. Ended up deleting all the AI’s stuff due to the fact it didn’t really work right and halved my framerate.
Finally got the voxel buffer setup!! I did it at the cost of shadows, so I might try to add shadows back, or just use the voxel buffer for them. My hope is to be able to use the buffer for world space reflections since not many shaders have that.
Got the DDA reflector going! Its actually running faster than screen space reflections were, and obviously has the world within the radius (which is 128 blocks, pretty good actually since 126/16 is 8 chunks). Just need to add texturing and lighting to the blocks. Actually I need lighting everywhere in the shader lol
Got these colored world space reflections working. The only thing I’m running into the issues of voxelizing with the shadow pass, so I am going to do a big refactor and move everything into the regular geometry pass, just that may either require the entire scene be rendered or cleaver caching.
Moved world space reflections to a SSBO!! Now they have all the details of the world, but the only issue (which I suppose I couldn’t notice with the lower quality ones before), is 3D models for blocks, since they cannot be voxelized. By moving the reflections to a SSBO in gbuffers_terrain, I was able to get normal shadow mapping back as well! Also I made VRAM storage more efficient - nvm just did the math and using 8 4k textures in RGBA16F was actually more efficient at 1.06gb while the current SSBO requires 1.6gb, but also the 8 4k textures could only store one block face, while the SSBO stores all 6, so if anything, the new SSBO method if I only gave it the same rigor as my setup before, is around 0.27gb of VRAM, way more compressed.
Got all the shadows in the reflections wired up as well! I also added screen space shadows to stop floating shadows on the foliage, but I set it to not run on blocks since those shadows are normally not floating and this way the most noticeable shadows are soft and without artifacts. I merged a lot of code this time so then WSR and SSR can be used at the same time for more detail (for now, hopefully the WSR will be full detail on its own in the near future). I’m going to ignore the 1.6gb of vram in the one buffer alone issue for now and address extra compression later :D
After optimizing the voxel buffer some more and the DDA march, I have decided to make my life harder. I plan on moving from voxel marches to actual raytracing with acceleration structures due to the fact as of now, block only marches is limited visually, doesn’t have entities, and breaks very quickly when a block uses a 3d model instead of a standard block. My hope will be to use compute shaders for the BVH building so that should be fast. I plan on doing entities first, terrain later just because then I’m not deleting stuff and for once entities are simpler. Plus once this works its basically infinite quality and actually might be faster.
We are starting to get fancy!! I finally got just an entity triangle buffer setup. The reason my framerate is so bad so far is I haven’t setup acceleration yet, but that is going to be next. Its surprising how its actually cheaper (so far) to store triangles than storing the block faces I had earlier since info can be omitted pretty easily. The hardest part about doing this was the fact I forgot to put a vertex output in the gbuffers_entities.gsh so it was erring a ton because I forgot two lines 😁
The wonderful world space reflections!! Right now they are only setup for entities and are still unaccelerated (that is why its running 25fps). This one was a real challenge to pull off since I learned the hard way entities don’t have texture atlases. That means for each entity on the screen, I had to manually bake their texture to a custom atlas. I will say, I found a pretty smart way to do it that only runs the bake once and caches the texture. If I ever notice overwriting issues, I can change it up, but it should be good. Also, I made it index based off the texture’s color, so modded entities should be supported :)
Got FXAA working! Haven’t finished the acceleration for the RT yet, but thought some minor AA wouldn’t be too hard and look nice! Thanks to Simon Rodriguez for his wonderful tutorial on how to add in FXAA!
(mostly) Finished a major performance win. I figured out a way to use the vertex shader instead of the geometry shader for everything. The geometry shader is notoriously slow (5-10x) compared to everything else, so by not using, my idle performance has went up several times due to no longer having to slowly process so many triangles. I still have some room for improvement (iron golems are black and some weird new backface visual bugs, nothing severe though) but this is much better than before!
Fixed up performance and small bugs!! I removed the combining of vertices into tris and just did that during the trace. Thanks to less memory pressure I got back around 20 idle fps and fixed the jitter bug (hehe)
Haha I feel evil for being mean to my gpu. I got the full world space reflections working (along with a second bar to show how full my triangle buffer is), although I still have to tweak the entities combining with the terrain, but I mean it runs horribly (better than not at all!). You can’t see it in the screen shot really, but I installed a resolution changer mod that puts me at 1/4 resolution, so 1/16 of the pixels and perf is worse than full res with the entities. Definitely will need to get that BVH/acceleration running soon because or else my GPU is going to blow a fuse :D
All I can say I got done in this long session is I optimized the rendering slightly. Not the tracing, just the regular lighting by catching the light colors (since they are from the scattered sky) in a tiny 2x2 texture, but it did give me 80+ fps back when I look at the ground at least. I will also have to redo all the BVH setup and actually learn how to do it all since I was leaning a bit heavy on AI use and something broke somewhere and I couldn’t figure out where. Time to actually code it all QwQ (not really sad, probably a good idea to actually learn it fully)
Finally!!! I got the radix sort working! The screen shot doesn’t look like much, but if you notice the bar on the bottom, the colors are generally grouped together and are perfectly stable. I had really struggled with getting this to work correctly as I’m not exactly the most experienced with compute shaders (or I should say was, now I know more about them than I need to). I had reached out to the shader labs discord even (thanks to them btw, they helped with a workgroup dispatching bug I had) and ran about every test possible to eliminate any possible race conditions/out of bounds errors. Then comes gemini to save the day. Apparently, I really should have done some more research into atomics in the past since even though they are meant to be stable, they are not perfect in the slightest, so I was basically attempting to do a radix sort without stable ranking (which is what it needs to achieve its insane parallelism and speed) and yeah it works now. BVH time (which should not take long to setup, the radix is normally the hard part), then true RTX features (not just voxelizations) like raytraced reflections and idk I might add a path tracing option since I’ve made a PT on shadertoy before and it was super enjoyable to do.
you know what, its 98% working. I call that good enough for tonight! I will continue fixing up the various tracing bugs and add entities, but so far this is pretty good! I plan on also raytracing shadows and lights if possible, although I will keep the standard shadow pass for nearby to get cheaper shadow filtering than with multiple rays. A lot of little issues plagued the final BVH build, mostly with me not clearing buffers :)
We now have some of the most complex handheld lighting in minecraft! I setup a quick light tracing function and inputted the light values for it for each hand, so as you can see there are two shadows being cast. I will add an option in the future to upscale the RTX features since this was taken at 27 fps. I also added bloom and a bunch of settings for it and fixed up the sky ground issues. Now it truly scatters the ground until you hit y ≈ 200 million, then the lowest part breaks ¯ ( ツ)/¯
Finished fixing up a bunch of small bugs/issues. Also added waves to the water. I deleted my .git files by accident so that took a while to fix. Added a bunch of options to the settings to help reduce the render scale of reflections, which allows this to actually run halfway decently. Couldn’t figure out how to get the reflections to work properly on water, so there will be none there.
Ships:
This is a custom minecraft shader I made. I first started with the Iris tutorial, but this project quickly expanded with a bunch of high end features, such as raytraced reflections! I’ve always kinda been annoyed with screen space reflections, so I thought, how hard could it be to just make them world space? Turns out it was way harder than I expected and took way longer as well. Overall, the result of my shader turned out pretty good, but it is not gameplay focused/to be used outside of demos in the overworld. I hope others may even build off of my progress to start integrating advanced reflection features like I have. This project greatly helped me improve my shader skills/taught me how to use the vertex and compute shaders (my only prior shader experience is on shadertoy) to produce nice results. The hardest part for me was probably setting up the BVH for RT acceleration and actually starting the project. Apparently minecraft has a lot of little overlapping transparent textures setup to perfectly rasterize, but to trace them causes a lot of precision related bugs, hence the reason I was forced to cheap out a little on grass blocks/tall grass. Also, the BVH resolution is limited due to performance constraints, causing overlapping triangles to clip infront of each other constantly, but that issue is mostly nonexistent for non transparent triangles, like buildings and such. In the end, I’m happy with the result and couldn’t have asked for a better long-term coding project!...
|
1792972176.1449275
|
1793058576.1449275
|
|
14492
|
Tides simulation by @kuba_ch101 | Stardance
|
kuba_ch101
|
1
|
69.32
|
1308
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-09T18:13:23Z", "hours": 67.0, "multiplier": 19.43, "payout": 1308, "blessing": "neutral", "text": "I made a simualation of tides generated on a planet by a satelite. I made it in C and OpenGL which I compiled(using emscriptem) to WebAssembly and WebGL. Then I added controls to make it interractive. I am verry proud that I menaged to compute the shape of the water almost entirely on a GPU shader. I also made a custom camera system which enables rotating along vectors other than the 3 main axes. The simulation isnt super accurate but it can serve for eg. educational purposes.", "repo": "https://github.com/kubach101/tides-symulation", "demo": "https://kubach101.github.io/tides-symulation/"}]...
|
[{"post_id": 71044, "ts": "202 [{"post_id": 71044, "ts": "2026-09-20T07:39:59Z", "hours": 1.6219, "text": "I added the tutorial, I wrote it by myself so there might be some uncought mistakes left, since English is not my native language. I think I explained it well and now the what some simulation parameters doshould be clear. Drawing is also made by me."}, {"post_id": 66249, "ts": "2026-09-11T23:31:02Z", "hours": 0.7003, "text": "Hello everyone It is my first devlog after the ship. People who rated my project had a great suggestion to make a tutorial, so I got to work. It will be in a form of a toggled window with instructions and explanations."}, {"post_id": 64810, "ts": "2026-09-09T14:19:19Z", "hours": 3.5808, "text": "I added different screen size support and a mobile layout. I also chaneged the UI SO now the whole canvas is likę a trackpad and you can zoom with scroll/fingers"}, {"post_id": 40430, "ts": "2026-08-03T22:52:15Z", "hours": 1.4511, "text": "I wrote the readme and I am almost ready to ship! Photos of progress:"}, {"post_id": 39663, "ts": "2026-08-02T19:50:11Z", "hours": 2.835, "text": "I improved the camera movement by making the rotation not based on the 3 main axes and instead based on the new ones created by the movement on the touchpad. It was quite hard to integrate everything but now the camera moves verry smooth. I also fixed a bug in the fragment shader which was breaking the alpha value of the oceanand now it looks much better."}, {"post_id": 38164, "ts": "2026-07-31T12:42:44Z", "hours": 9.9228, "text": "I added a UI to the web page! It features: -camera controls: rotating, zooming and home position -simulation parameters which you can change with sliders. Everything is conected to the simulation via “cwrap”, which makes you able to use some of your functions, from the c program, in java script. I went through multiple layout and I am still not shure if I will keep this one. This was my first time building something like this so I took some help from the AI while making the trackpad and the sliders."}, {"post_id": 30380, "ts": "2026-07-17T21:15:25Z", "hours": 3.7669, "text": "I added a trail behind the satelite to make this more interesting and a direction indicator(which you can turn off) so you know where the satelite is when you zoom in. I also started working on the shell file which basically grabs the render and ads html features. All the info and other thing will be in this grey area(for now, maybe I will change them later)."}, {"post_id": 29838, "ts": "2026-07-16T23:55:00Z", "hours": 2.7969, "text": "BIG NEWS! I was finally able to convert my C code to WASM using emscripten. I run it on local hosted server but I still cant make it work on github pages. I also moved part of physics calculations to a specified shader which should significantly boost the performace."}, {"post_id": 29122, "ts": "2026-07-15T19:47:38Z", "hours": 6.1136, "text": "I optimized my simulation and added a camera orientation indicator(top-right corner). It was much harder than I expected but It looks cool."}, {"post_id": 16529, "ts": "2026-06-26T21:50:43Z", "hours": 2.1425, "text": "I am now working on rewriting may program so I can later convert it to WASM using emscriptem. I also made the satelite distance modifiable."}, {"post_id": 15170, "ts": "2026-06-24T17:22:23Z", "hours": 1.9231, "text": "Added an option for user input. Now I will focus on adding friction to the moving ocean."}, {"post_id": 14889, "ts": "2026-06-24T05:27:16Z", "hours": 3.1589, "text": "I fixed some scaling bugs, but there still some left and i cant figure how to fix them. I also need to add friction soon. View after fixing radious bug:"}, {"post_id": 13728, "ts": "2026-06-22T14:36:56Z", "hours": 1.1089, "text": "I replaced some floats with doubles for better precision and improved the information tab."}, {"post_id": 13324, "ts": "2026-06-21T20:22:08Z", "hours": 6.9411, "text": "Made a huge rework today: -Reworked the entire pipeline and data structures to make code cleaner and more efficient. -Fixed some physics mistakes with scales I made before. -Fixed rendering bug which appeared when I chaned rendering order to a propper one."}, {"post_id": 12781, "ts": "2026-06-20T21:58:28Z", "hours": 1.9731, "text": "Made a custom Information tab, It shows simulation data. This took me some time, but I am happy with the results."}, {"post_id": 12635, "ts": "2026-06-20T17:10:22Z", "hours": 2.8864, "text": "I added camera movement, for now the camera is centered on the planet but I might change it in the future. I neede to add and rework few functions to make this work. There was also a major problem, which I learnt is called “gimbal lock”. Before I fixed It the camera was getting flipped when It rotated 90 degrees. There is also a zoom option(2’nd picture)."}, {"post_id": 12466, "ts": "2026-06-20T11:04:40Z", "hours": 3.9556, "text": "I scaled everything to real proportions of earth and moon. Improved pipeline by adding rendering functions and reducing the number of shaders. Made the moon orbit, to see it move I added a second time scale(not based on SI) to make the orbits fast without affecting other scales. I still need to correct the water based on updated moon position."}, {"post_id": 11516, "ts": "2026-06-18T20:13:46Z", "hours": 3.4372, "text": "Finaly the geometry is calculated by the satelite’s gravity. In a normal scenario the wouldn’t be visible in that scale so I needed to bring the moon verry close to the planet(It is now invisible) and increese its mass. I am planning to make a zoom options so the deformations will be vissible even with the real data"}, {"post_id": 7363, "ts": "2026-06-12T08:29:15Z", "hours": 0.3783, "text": "I tested the fluid deformation in real time(made a small menu to debug it). It wasnt calculated based on physics, i was just incrementing position(this is position of the right peak, the rest is calculated based on that). Of course i needed to scale it a bit, so you can see the water deformation. It looks realy cool when the water is “streched” too much:"}, {"post_id": 7128, "ts": "2026-06-11T22:11:05Z", "hours": 2.5839, "text": "Fixed a huge geometry bug, made a shader for the water layer. The hardest part was configuring the pipeline so that the water layer and core don’t interfere whith themselfs and break. Current view:"}, {"post_id": 6862, "ts": "2026-06-11T14:49:20Z", "hours": 1.865, "text": "I improved my shader for solid bodies: -shading responds to motion(previously it looked like the light sorce was moving with the object) -now the shading is done per pixel(not per vertex) -a bit of color is added to the opposite side Here you can see before and after:"}, {"post_id": 6373, "ts": "2026-06-10T18:47:00Z", "hours": 2.5058, "text": "Today i focused on the physics part of the fluid shape. I used quadrupolar tidal bulge approximation via P₂ Legendre polynomial. In terms of physics it sounds complicated, but was easier than i exepected. However I spend a lot of time trying to get the geometry right, becaose my sphere generating algorithm is pretty weird."}, {"post_id": 5897, "ts": "2026-06-09T21:18:17Z", "hours": 1.9833, "text": "Made basic pipeline for my symulation, improved shader use by creating helpful functions. This will be the core of the planet(it wont change geometry) so that was the easier part."}]...
|
Title: Tides simulation by @kuba_ch101 | Stardance Title: Tides simulation by @kuba_ch101 | Stardance
Devlogs:
Made basic pipeline for my symulation, improved shader use by creating helpful functions. This will be the core of the planet(it wont change geometry) so that was the easier part.
Today i focused on the physics part of the fluid shape. I used quadrupolar tidal bulge approximation via P₂ Legendre polynomial. In terms of physics it sounds complicated, but was easier than i exepected. However I spend a lot of time trying to get the geometry right, becaose my sphere generating algorithm is pretty weird.
I improved my shader for solid bodies: -shading responds to motion(previously it looked like the light sorce was moving with the object) -now the shading is done per pixel(not per vertex) -a bit of color is added to the opposite side Here you can see before and after:
Fixed a huge geometry bug, made a shader for the water layer. The hardest part was configuring the pipeline so that the water layer and core don’t interfere whith themselfs and break. Current view:
I tested the fluid deformation in real time(made a small menu to debug it). It wasnt calculated based on physics, i was just incrementing position(this is position of the right peak, the rest is calculated based on that). Of course i needed to scale it a bit, so you can see the water deformation. It looks realy cool when the water is “streched” too much:
Finaly the geometry is calculated by the satelite’s gravity. In a normal scenario the wouldn’t be visible in that scale so I needed to bring the moon verry close to the planet(It is now invisible) and increese its mass. I am planning to make a zoom options so the deformations will be vissible even with the real data
I scaled everything to real proportions of earth and moon. Improved pipeline by adding rendering functions and reducing the number of shaders. Made the moon orbit, to see it move I added a second time scale(not based on SI) to make the orbits fast without affecting other scales. I still need to correct the water based on updated moon position.
I added camera movement, for now the camera is centered on the planet but I might change it in the future. I neede to add and rework few functions to make this work. There was also a major problem, which I learnt is called “gimbal lock”. Before I fixed It the camera was getting flipped when It rotated 90 degrees. There is also a zoom option(2’nd picture).
Made a custom Information tab, It shows simulation data. This took me some time, but I am happy with the results.
Made a huge rework today: -Reworked the entire pipeline and data structures to make code cleaner and more efficient. -Fixed some physics mistakes with scales I made before. -Fixed rendering bug which appeared when I chaned rendering order to a propper one.
I replaced some floats with doubles for better precision and improved the information tab.
I fixed some scaling bugs, but there still some left and i cant figure how to fix them. I also need to add friction soon. View after fixing radious bug:
Added an option for user input. Now I will focus on adding friction to the moving ocean.
I am now working on rewriting may program so I can later convert it to WASM using emscriptem. I also made the satelite distance modifiable.
I optimized my simulation and added a camera orientation indicator(top-right corner). It was much harder than I expected but It looks cool.
BIG NEWS! I was finally able to convert my C code to WASM using emscripten. I run it on local hosted server but I still cant make it work on github pages. I also moved part of physics calculations to a specified shader which should significantly boost the performace.
I added a trail behind the satelite to make this more interesting and a direction indicator(which you can turn off) so you know where the satelite is when you zoom in. I also started working on the shell file which basically grabs the render and ads html features. All the info and other thing will be in this grey area(for now, maybe I will change them later).
I added a UI to the web page! It features: -camera controls: rotating, zooming and home position -simulation parameters which you can change with sliders. Everything is conected to the simulation via “cwrap”, which makes you able to use some of your functions, from the c program, in java script. I went through multiple layout and I am still not shure if I will keep this one. This was my first time building something like this so I took some help from the AI while making the trackpad and the sliders.
I improved the camera movement by making the rotation not based on the 3 main axes and instead based on the new ones created by the movement on the touchpad. It was quite hard to integrate everything but now the camera moves verry smooth. I also fixed a bug in the fragment shader which was breaking the alpha value of the oceanand now it looks much better.
I wrote the readme and I am almost ready to ship! Photos of progress:
I added different screen size support and a mobile layout. I also chaneged the UI SO now the whole canvas is likę a trackpad and you can zoom with scroll/fingers
Hello everyone It is my first devlog after the ship. People who rated my project had a great suggestion to make a tutorial, so I got to work. It will be in a form of a toggled window with instructions and explanations.
I added the tutorial, I wrote it by myself so there might be some uncought mistakes left, since English is not my native language. I think I explained it well and now the what some simulation parameters doshould be clear. Drawing is also made by me.
Ships:
I made a simualation of tides generated on a planet by a satelite. I made it in C and OpenGL which I compiled(using emscriptem) to WebAssembly and WebGL. Then I added controls to make it interractive. I am verry proud that I menaged to compute the shape of the water almost entirely on a GPU shader. I also made a custom camera system which enables rotating along vectors other than the 3 main axes. The simulation isnt super accurate but it can serve for eg. educational purposes....
|
1792853748.4064953
|
1792940148.4064953
|
|
31437
|
Neverland OS by @253_Mathilde_IYKYK | Stardance
|
253_Mathilde_IYKYK
|
2
|
87.0
|
1295
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-17T15:36:45Z", "hours": 68.0, "multiplier": 18.97, "payout": 1295, "blessing": "neutral", "text": "Neverland OS is a web-based OS with a Peter Pan/Tinkerbell theme. Unlike other operating systems, Neverland OS doesn’t prioritize either design or performance. It tries to be good at both. It has a Notes app, a Music app, a Gallery app, a Game, a Video app, a NASA app, a Wikipedia app, a Hubble app, and a User Manual app. It also has mini apps like a search bar, a timer, weather, and more. My goal was to create something that looks unique. Because when we program, we often have other operating systems in our head. So we automatically put things where we are used to seeing them. But who said that window controls need to be on the right side of a window? And who said that all apps need to look like the ones we use every day? Don’t get me wrong. Those operating systems work great. But they already exist. So why not try something new? Neverland has a lot of hidden features (aka Easter eggs) and was built to have everything you need. Sometimes you don’t need a lot of apps. Just a music app to keep your focus up, a timer to motivate you, and something to write in. Of course, my OS can do way more than that. But when you are honest with yourself: you don’t really need much more than that. But who said that just because we don’t need that much, we have to work with ugly minimalistic stuff? Exactly. No one! So I gave my best to make it look cute. I hope you like it. And if you don’t, let me know! I often struggled with JS because I basically started from 0 knowledge. The Music app was especially difficult because it is so unique (yk so finding help online was impossible). I deleted stuff, made mistakes, broke things, and redid the graphics many times. There are way more hours in this project than you can see ( because I builded this thing on my old laptop in my holidays and that laptop breaks down everytime you use lapse). I took this project everywhere and spent almost every bit of free time I had on it.I worked on Neverland for 42 days. During that time I made over 500 deployments on GitHub, over 600 commits on GitHub, uploaded things millions of times because of GitHub issues, and wrote around 3,500 lines of code. I also tried my best to be transparent about the whole process. I wrote a Devlog about roughly every 2 hours. All instructions are in the OS or in the README. I gave my best with everything: the code, the graphics, the storytelling , the Easter eggs, and all the little details. I hope you like Neverland OS and have fun trying everything out. Sorry for my grammar or language mistakes. English isn’t my first language.", "repo": "https://github.com/253-Mathilde/My-first-OS", "demo": "https://253-mathilde.github.io/My-first-OS/"}, {"ship_num": 2, "ts": "2026-07-15T14:49:28Z", "hours": 19.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Peter Pan and Tinkerbell-themed OS. At the beginning, the JavaScript was really hard because I had only worked with blocks of code, not actual code (maybe you know code.org — that’s what I mean). The graphics took me quite some time, as did all the brainstorming and planning, because I did my best to create a good structure. I explained the whole idea and the thought behind the theme in my README. On my site, you have two draggable windows (the Welcome window and the Journal app window), and you can write stuff in your little journals and create islands. (I also explained that in my README, but if you don’t want to read it: an island is a note, and I called it that because of the site’s theme.) My site also has a little slideshow in the Journal app that explains how to use everything. My Stardance profile is linked too, so you can check out my other project. The site also includes a timer at the top. I hope you like it, and I’m already collecting ideas for Mission Two. This text was corrected with AI.", "repo": "https://github.com/253-Mathilde/My-first-OS", "demo": "https://253-mathilde.github.io/My-first-OS/"}]...
|
[{"post_id": 48968, "ts": "202 [{"post_id": 48968, "ts": "2026-08-17T15:31:53Z", "hours": 0.9764, "text": "Okay so I think I ship now ,just made some small changes (so my code is better to understand by others) and somehow they turned out to be an hour so yeah time to ship.Thanks for all your support and figers crossed that the first ship works!"}, {"post_id": 48896, "ts": "2026-08-17T13:41:36Z", "hours": 3.7464, "text": "Last Devlog (hopefully). Okay so before you judge me because I promised that I would ship yesterday: This README is massive and I gave my best to make it short but still well explained and yeah this was just so much work.Hope you like it. The TV should also work now.Finally, so maybe try it! https://253-mathilde.github.io/My-first-OS/ . I think that I’ll ship today. I really hope that everything works so pleaseeeeee I need some feedback. This project is just crazy and so many already like it.Can’t wait to see what you say to my next projetc idea. Thanks for your support and can’t wait to hear all the feedback. SO many hours of work.Hope they pay of.Thanks for reading <3."}, {"post_id": 47635, "ts": "2026-08-15T17:38:45Z", "hours": 3.1572, "text": "Okay so I never want to see a link in a HTML project again for at least the next 2 weeks because I now added the image sources to the manual, and that was just some crazy work. I myself always keep every source throughout the whole project but that meant that I had 15 pages full of links and I only needed the ones for the images And some were even unnecessary because those images were deleted from the site through the whole project. I know this site is probably the ugliest one in this whole project but also one of the most important ones. I also worked on the grammar. There might be some little mistakes but I wrote it. English is not my mother tongue, and I typed far more than just a prompt into an AI. I also checked the mistake with the YT video but couldn’t find one. It would really help if others also checked if the vd in the TV does not work. Tomorrow is README day. We are really there. I still can’t believe it. And someone wrote me on slack that you can review your own project with any AI, and the AI really liked mine so fingers crossed that the first ship will get approved And my work paid off. Thanks for all your support, and I would really appreciate your help with the TV app. Thanks for reading <3 Here is the link: https://253-mathilde.github.io/My-first-OS/"}, {"post_id": 47128, "ts": "2026-08-14T19:52:28Z", "hours": 1.8492, "text": "Check it out https://253-mathilde.github.io/My-first-OS/ Okay so today I added the last song to the music app.I also changed the font in the welcome window and wrote more text/changed some stuff. I also added better img to the galerie so now everything looks clean and everything is so close to being finished. I know I say that every day but you get a different point of view when you have over a month of work in your head VS just 3 or 4 more days. I am soooo happy with the font in the welcome window because the other one was more tech and this is more fairy-like. If you have a different opinion or absolutly hate it : say something! As you can see in the last DEVLOG I changed a lot based on feedback so yeah. I also changed the songs that are mine (not the ones from my base code) to github so now the img may load a little bit slow, but the sound should work great.I also made all the img links in the galerie app to github links( I downloaded everything from catbox and uploaded it to github and then change dthe file name and then re-run every job). I love how the music app turned out and looks when other windows are opened. Hope you like it tomorrow is going to be grammar and manual day because these things are just as importent as the coding.And when I work in my schedule, the day after that is README day and correcting graphic days.That would mean we ship in 2 days. I’ll give my best to find enough time for that.Thanks for reading <3"}, {"post_id": 46417, "ts": "2026-08-13T16:40:50Z", "hours": 2.2708, "text": "Concept Devlog Okay so I know it looks like I haven’t worked on this project for the last two days but Actually, I have worked non-stop for the last two days. I got some feedback for my site, and I am still open for some feedback. I really struggled with GitHub and ended up renaming every file in my project, and yes, I needed to do that individually and wait every time for about 10 minutes. Now more and more images are getting changed from Catbox to GitHub because someone said that I should reduce the loading time. I myself don’t like using GitHub for images and stuff because it is sooo much work with the folders and stuff, but you wanted it so, so I changed it. I also changed the manual because I also got some feedback for that. I also will upload the Pixabay songs to GitHub but not the ones from the tutorial I used because I don’t know where this music is from… That should reduce the loading time from the music app. I also found a lot of details that are not perfect so I also will change these but these are mostly little things in the user interface. I really gave my best the last days even though I can’t use Lapse for time tracking because it does not work with my laptop. Oh, and I almost forgot: the OS is made for smaller screens with a browser window width from 1400 px (I don’t mean the width of your screen), so I would Be really happy to know how bad it looks on other screens. I am really sorry for that but can’t change that because my CSS is 1600 lines of code and I often used position: absolute;. I am a beginner and will work with the percentage the next time! I promise. Thanks for reading and your patience with me. Check out the site at the moment, but please respect that the manual is not quite finished and the text can look a little bit misplaced sometimes. https://253-mathilde.github.io/My-first-OS/ Thanks for reading <3"}, {"post_id": 44832, "ts": "2026-08-10T21:08:40Z", "hours": 1.5083, "text": "That is just the first page.I’m waiting for two hours.I can’t even cancel them.Why always meeeeeee.I just made a folder to make it organized localy and when I uploaded it from the app ( yk the push and pull ) this happend.Yeah that takes sooooo long and btw I added more songs and made some things a little bit cleaner.As you may can see I can’t show you anything right now.Thanks’s for reading <3"}, {"post_id": 44075, "ts": "2026-08-09T16:26:52Z", "hours": 2.9811, "text": "Ahhh, I’m freaking out. The music app is finished!! Finally. It took me so long. Yes, I still need to add more songs (we only have the 3 from the base I used), but the whole layout is finished. Everything that comes now is only details and grammar and such stuff, but that was actually the last line of code for this project (yk, I now only need to repeat or fix things, not write something from scratch). In the app we have a slideshow at the beginning, a moving CD (spins), a menu that comes up front if your mouse touches it, a back button for the previous song, a next button for the next song, and a play and pause button that changes (yk, if the music plays it is ‘stop’ and if not it is ‘play’), changing song names and, of course, changing artists names. That app was the most challenging of all. Hope you like the design and everything! It would really help if you tried the site https://253-mathilde.github.io/My-first-OS/ and looked if everything works, but please respect that I am working on the grammar. Now we are finally getting to the last part!!! Thanks for reading <3."}, {"post_id": 43826, "ts": "2026-08-09T08:08:51Z", "hours": 1.7783, "text": "I think the manual is now finished. I know the CD site is not finished, but neither is the app. When I am finished with that, I’ll update the manual. I also added that star effect that shows when you click on the star thing on the last page. I also made some Easter eggs, like hidden sounds (for example, the first audio that was taken on Mars plays if you click on the green heart in the map window, which is also hidden), and I made the tab name of the OS a little game (I don’t know how to call it; it basically just moves and looks pretty). Hope you like the app; I’m always happy to hear some feedback, and now I finally start working on the music app. Thanks for reading <3."}, {"post_id": 42751, "ts": "2026-08-07T17:00:35Z", "hours": 4.0733, "text": "Okay, I worked on the manual app more, and you now can slowly see where we are going. That took me super long because I also did all the graphics and the effect where the image turns and gets bigger the second your cursor touches the image. Hope you like the graphics and the little tinkerbell on the cover. I know it is not perfect because the book is already open when you open the app, but I think it looks okay, and I can’t change it because of the symbols (they would look pretty bad on the next pages then). I also need to change the back site, text and next buttons. Btw, I now have over 300 commits on GitHub and 69 hours on Hackatime, and the project has been active for 32 days (started on 7/7/26). Literally, over a month and one devlog got over 2000 views 🥹. Thanks for reading and always helping me out <3"}, {"post_id": 42274, "ts": "2026-08-06T22:06:50Z", "hours": 1.2061, "text": "Okay, so GitHub is still broken, so text will have to do it. I added the Wikipedia and manual apps. And I also wrote the whole manual. That was quite some work, and I also fixed parts of the JS that were not really stable. I am so happy that it works now because I almost deleted everything today. In the end the problem, why everything did not work, was a missing close div thing. I spent the whole afternoon till now searching for that. It is midnight. I started in the afternoon. I feel really dead right now. Tomorrow I really need to do the music app. Thanks for reading <3"}, {"post_id": 41927, "ts": "2026-08-06T13:30:02Z", "hours": 2.9661, "text": "Okay, so like, I started on an app, and I can’t try it at the moment because GitHub is testing my patience, but yeah, the app is the manual app, and it looks like a book, and you can actually flip pages. It is just annoying that I can’t work correctly because of GitHub, but I don’t have another chance; I just need to try again and again and again: And because I do not know if my code even works, I can’t even continue with another app like the music app. Thanks for reading <3"}, {"post_id": 41535, "ts": "2026-08-05T20:07:14Z", "hours": 3.6178, "text": "Here we finally are: It works. With sound. And autoplay. And the alert. And I am soooooo happy. It took me the whole day, and I needed to do stuff that I had never even heard of, but thanks to the internet and my ability to read, I finally got it. So you can understand that better: I started at 8 am in the morning and finished at 4 pm in the afternoon. As you may understand, my patience for the music app was not enough, so I built 2 new apps instead. That sounds a little bit crazy, but because these are based on a webpage, it only took about 3 hours each. I still added a little window that explains everything, and I hope you like the result. I got so much kind feedback for the pre-loader and in general; I am getting so many nice comments. Thank you for that, and I hope you like the result and see where we are going! Thanks for reading. <3 The vd is pretty bad because I had to compromise it, so maybe check it out in real life or wait for a DEVLOG with a better VD."}, {"post_id": 40956, "ts": "2026-08-04T20:19:33Z", "hours": 1.0911, "text": "I worked on the preloader for the last 7 hours, but because of the browser update in 2025, an alert does not count for autoplay with the audio, and I still need a solution for that. Here is the MP4 of the preloader with the audio. I hope I will get that with the audio tomorrow. At least the video is working with the alert. Hope you like the graphics (they took soooo long, and yes, everything is self-made, so no Google copy and paste). Thanks for reading <3"}, {"post_id": 40737, "ts": "2026-08-04T13:45:55Z", "hours": 1.7208, "text": "I NEED YOUR HELP!!!! Okay so I started working on the menu. It works already but needs some better styling. So you can see the vision: The red circles are going to be little CDs like the one already existing. But I need your help because I do not know how to make the control buttons (the styling), so here are like 3 versions of it. Hope you can see the vision and may help me choose (and of course the buttons will be buttons, not words, but yk it is just so you can see what my vision is). Thanks for reading <3"}, {"post_id": 40328, "ts": "2026-08-03T19:25:43Z", "hours": 2.0278, "text": "Okay so here is what we have now: I added the final things for the apps, and I also changed the layout so that the backgrounds only repeat horizontally and not vertically. I also worked on the screens for the app and, of course, on the music app. I need to pull myself together so I do not start with any other app before I finish the music app. I also worked on the graphics as always, and we now finally have better vd, and everything is just better. Yayyyy.Thanks for reading <3"}, {"post_id": 39650, "ts": "2026-08-02T19:31:46Z", "hours": 0.7467, "text": "#Concept Devlog ( infos about the planning and the vision I will mark them now so you can choose yourself if your interests are only in the progress or also in everything behind the finished page )Okay so today was a planning day. Again.But you need to trust me because if you don’t have a plan than you won’t have a good project because I have multiple apps and I want everyone to be perfect. So over the time more and more little mistakes or things that just feel false appear.And I mean I already used so much effort so why should I throw that away and make it unperfect? A lot of new problems also appeared because I now saw the site on a bigger screen (yk laptop VS PC) and it just looked terrible! And the music app is not finished and because that DEVLOG is already really long: there will be 3 more apps.Yayyy.They won’t be too complicated because they will base on already existing sites so it should be done in about 10 hours but before that everything needs to be done and as you can see that is a long list and every task will take about an hour at least.We have round about 28 tasks btw.It will be a long journey and I think that we are not even close to half of that so if you really read all of that: A really big thank you because you have true interests! Thanks for reading<3"}, {"post_id": 38844, "ts": "2026-08-01T12:26:28Z", "hours": 1.2656, "text": "Okay so we now have a working thing ( the play and stop button needs some work because right now it only works if you do not use the back and forward buttons) and as you can see I changed the graphics and what you cannot see is that it rotates like a real CD! I started planning the menu cause it will have the shape of a half circle so I do not have quite an idea how I will do that but we will see.Thanks for reading and right now I only have the example music from the code I used so if you have music wishes:leave a comment.Thanks for reading <3"}, {"post_id": 38250, "ts": "2026-07-31T15:32:45Z", "hours": 1.2331, "text": "#concept Devlog AND SR FOR LIKE THE LOOKS AND THE GRAMMAR OKAY WE HAVE 37 DEGREES AND THIS IS JUST A VISION IT IS NOT SUPPOSED TO LOOK PERFECT!! Okay so I now started working on the music app and yeah it looks sooo funny right now(yk to see the switch from all the clean and perfect things to THAT)but I mean everything works for now so we just need the styling and the menu.That is such an easy thing to say because actually:The graphics take me sooo long.There are about 20 hours that you do not see and thanks to the universe catbox is not working right now and that means I have to use postimages and it works but like the pictures load sooo long.Hope it works soon and if you have like song wishes for the app:leave a comment!Thanks for reading and here is my vision:"}, {"post_id": 38102, "ts": "2026-07-31T09:57:54Z", "hours": 1.4106, "text": "Okay so the game is kinda finished! I now have a game over screen and a finished screen and a like maual or pre-loader.Everything is explained and I myself think that it is like the right level of easy but still a little bit tricky.You would help me a lot with trying it out and giving me a short feedback. ( https://253-mathilde.github.io/My-first-OS/ )Thanks for reading and here are the picture of the game app:"}, {"post_id": 37862, "ts": "2026-07-30T20:44:36Z", "hours": 0.4675, "text": "I added something like a pre-loader-thing that shows the info for the game everytime you open the game window for 30 sec.I now that it is kinda annoying that I only log such short times but I just squeze in every tiny bit of time I have and the graphics also take pretty long.Thanks for reading <3"}, {"post_id": 37765, "ts": "2026-07-30T17:59:45Z", "hours": 0.8992, "text": "So I did some JS and spent way too much time on the graphics.It now shows a message and hides everything when you reach a score from 100.I still need to do something for the like game over part.Hope you like the design because that will stay the same I think.Thanks for reading <3"}, {"post_id": 37038, "ts": "2026-07-29T14:41:02Z", "hours": 1.1483, "text": "Okay so I started doing some CSS and made some graphics.Right now the background is too full (yk the focus point from the game should not be the background) but like the keyframes work and I added that frame.I will chnage the elements from the game but I will not change like the frame because I think that the frame looks pretty cool.We still need to do the JS and to change some stuff but I think that I will get that done in about 6-8 hours.Unfortunatly I do not have 6-8 hours the next days.I will give my best to squeze in some time but yeah: Sr for the bad vd but like I do not even use that other tracking tool because my laptop is just soooo slow with it and like recording and all the animations and windows that are open-it almost collapsed so srrrr Thanks for reading and if you have styling ideas for the game:leave a comment or write me on Slack <3"}, {"post_id": 36942, "ts": "2026-07-29T10:55:56Z", "hours": 1.1881, "text": "Okay so here we are: We have a WORKING mini game that looks like trash! And I am sooo happy.As you can see there is an object that you can control with the arrow up key (hope that is the right english word for that).And we also have like blocks that are generated and have a random height.Yayyy.So we only need to do the styling and add some JS that ends the game when you have a score from xxx (I already have a score in my JS so that should not be so complicated).I am so happy right now and I think it was the right decision to start over.Thanks for reading and sr for all these bad vd’s,they will get better soon.<3"}, {"post_id": 35909, "ts": "2026-07-27T17:23:26Z", "hours": 0.3122, "text": "Okay so I hope that I do not dissapoint s.o now.I deleted the whole thing that I had so basically a whole day of work because there is always way more time behind everything that you think.I did that because I could not find the mistake and I did not really get the code.I never really did JS before this project and I am learning JS while doing this project.And I mean really learning because I kinda eat the whole W3 school site but yeah.I want to give my best in this project and if I cannot find the mistake in my own coding:I would need AI.And do not get me wrong but help from AI okayyyy but a whole app made with AI.No.No.And no.That is MY opinion so yeah if you do not think so or use AI a lot then do so (it is okay but not for me).I give my best to be transparent and always say when I used AI.The plan is now to build like a flappy bird game but without the top part and to make it look cool.I hope you can understand me and stay with me on this project because we are now getting to the hardest part.This will take some time but I will not quit.Thank you for reading(I do not think that s.o will read all of this but yeah)."}, {"post_id": 35832, "ts": "2026-07-27T14:55:32Z", "hours": 2.8108, "text": "Okay so I just started with the game.Actually just started is a huge lie because I am struggeling since 10:00 and we now have 17:00.I used a tutorial and tried to just start basic with making a little jumping game but the objects …They do not exist because the whole generating thing does not work .I first need to get everything working before upgrading the graphics and stuff.I really would like some help! CSS: #background { position: absolute; background-image: url('https://files.catbox.moe/xqsbzm.png'); height: 200px; width: 100%; animation: slideright 600s infinite linear; bottom: 0;}.wendy { background-image: url('https://files.catbox.moe/u52u37.png'); height: 60px; width: 60px; position: absolute; bottom: 0;}.obstacle { background-image: url('https://files.catbox.moe/n5f03w.png'); width: 60px; height: 60px; position: absolute; bottom: 0;}@keyframes slideright { from { background-position: 0 0; } to { background-position: -10000px 0; }} HTML: <div id=\"gameWindow\"> <div class=\"base5\"> <div class=\"symbolegame\"> <p id=\"galerieWindowheader\"> <img src=\"https://i.imgur.com/Y4OL1On.gif\"></p> <p style=\"cursor: pointer\" id=\"gameclose\"><img src=\"https://i.imgur.com/q5TmYNg.gif\"></p> <p style=\"cursor: pointer\" id=\"gameopen\"><img src=\"https://i.imgur.com/3nBda2J.gif\"></p> </div> <div id=\"background\"> <h6 id=\"alert\"></h6> <div class=\"wendy\"></div> <div class=\"grid\"></div> </div> </div> </div> </div> JS: document.addEventListener('DOMContentLoaded', () => { const wendy = document.querySelector('.wendy') const grid = document.querySelector('.grid') const alert = document.getElementById('alert') let gravity = 0.9 let isJumping = false let isGameOver = false function control(e) { if (e.code === \"Space\") { if (!isJumping) { jump() } } } document.addEventListener('keydown', control) let position = 0 function jump() { isJumping = true let count = 0 let timerId = setInterval(function () { //move down if (count === 15) { clearInterval(timerId) let downTimerId = setInterval(function () { if (count === 0) { clearInterval(downTimerId) isJumping = false } position -= 5 count-- position = position * gravity wendy.style.bottom = position + 'px' }, 20) } //move up position += 20 count++ position = position * gravity wendy.style.bottom = position + 'px' }, 20) } function generateObstacles() { if (!isGameOver) { let randomTime = Math.random() * 4000 let obstaclePosition = 1000 const obstacle = document.createElement('div') obstacle.classList.add('obstacle') grid.appendChild(obstacle) obstacle.style.left = obstaclePosition + 'px' let timerId = setInterval(function () { if (obstaclePosition > 0 && obstaclePosition < 60 && position < 60) { clearInterval(timerId) alert.innerHTML = 'Game Over' isGameOver = true //remove all children while (grid.firstChild) { grid.removeChild(grid.lastChild) } } obstaclePosition -= 10 obstacle.style.left = obstaclePosition + 'px' }, 20) setTimeout(generateObstacles, randomTime) } } generateObstacles()}) Thanks for reading<3"}, {"post_id": 35185, "ts": "2026-07-26T13:27:10Z", "hours": 1.725, "text": "So here is the camera app! As you may can see there are two little buttons that look like real camera buttons. I added little arrows but I think they still look real.Right now we have like 22 photos on our digi cam.And well if you scroll through these screens you may see the TV app because I also finished that.I think it also looks pretty cool ,tell me what you think about it in the comments!! It only has one vd right now(yk matching to the theme if you are interested check out the real site).I may add more in the future but not until this project is finished.So these 2 apps are now ready and the next thing on my list is the music app.Happy to hear or see some feedback (If you all really hate it I am going to change it tho but I really gave my best).Thanks for reading <3 🔗 253-mathilde.github.io/My-first-OS/"}, {"post_id": 34192, "ts": "2026-07-24T18:28:48Z", "hours": 1.5156, "text": "#concept Devlog All I can say:The galerie app is finished ! You can check it out or wait until I post a DEVLOG which shows more details.It was squite some work and now it is time for the next point on my todo-list:the TV.I am so happy and grateful for all these people watching my DEVLOGS and for all these kind souls who are staying with this project since minute one.Thank you you all and I really hope you like it!!Thanks for reading <3"}, {"post_id": 33433, "ts": "2026-07-23T11:36:14Z", "hours": 0.8769, "text": "So I added the base for the galerie.I just need to add a slideshow thing which is going to be a little hard because I already have 2 and I need to add the 2 buttons to switch between the images.I am giving my best to squeze in coding time but the graphics themselves take a lot of time.Thanks for reading!!!"}, {"post_id": 33405, "ts": "2026-07-23T10:08:02Z", "hours": 0.9244, "text": "So I pulled myself together and changed the welcome window.I will work on the camera app now but what do we think about the desing from the welcome window ? Should I leave it as it is or should I change it ? Yk it is the first impression you get when you go on my site.Thanks for reading and your interests in this project."}, {"post_id": 32570, "ts": "2026-07-21T20:40:51Z", "hours": 1.7686, "text": "So I changed the welcome window.It is not perfect and not finished do not worry but it is enough for the moment.It was quite hard-yk with the grid and everything because I had never done that.I need a little break from the grid thing so that goes on the list for the things to do in the end.Hope you like the styling idea.Thanks for reading!!!"}, {"post_id": 32381, "ts": "2026-07-21T14:58:33Z", "hours": 1.4383, "text": "Well, that looks like an OS! I got the little weather application for the top. Yayyyy. And I also added the icons for the apps and also connected them to their own windows, so now only the app content is missing. I am so happy right now that everything works! The complicated part is not even close (yk the game and the music app), but I am going to change the design from the welcome window (check the drawing for the vision). The apps are in a div container where you can scroll, and I really hope you like it! Maybe check it out in real life when you are interested. Thanks for reading!!!"}, {"post_id": 32272, "ts": "2026-07-21T10:39:47Z", "hours": 1.2842, "text": "So I added the little star map thing (same here,if you do not know what I mean or what the plan for this project are : check the DEVLOG with the drawing) and fixed some little mistakes.I think I am going to start working on the hardest part in the info-top-bar-thing :The little weather widget.The problem is that it is supposed to get you location and to show the weather in the right number thing ( yk F and C ).Let’s see how long this will take! Wish me luck and thanks for reading this DEVLOG!!! Sr again for the vd my situation has not changed :( and I also showed all the other features in this vd"}, {"post_id": 31781, "ts": "2026-07-20T13:27:42Z", "hours": 2.3606, "text": "I added a little timer. It’s a simple one — it only counts minutes, not seconds or hours — but it’s enough if you want to have a short learning session or keep track of a small task. It’s not an app; I wanted to keep it simple. I also added the divs for the other tools in the top bar, and I included a small GIF for the map feature (check my DEVLOG with the brainstorming if you don’t know what I mean). Maybe I’ll start building that today, maybe not. Thanks for reading this DEVLOG ❤❤"}, {"post_id": 31297, "ts": "2026-07-19T16:17:14Z", "hours": 1.5781, "text": "So I started working on the top bar.It now has quotes that change every 10 sec and that move so the text is animated.My plan is it to finish the top bar and all these details and then start working on the apps.I am pretty sure I will change the graphics when I am done with the app but that is really easy to do and I first need the code for these elements."}, {"post_id": 31164, "ts": "2026-07-19T10:35:50Z", "hours": 1.0581, "text": "So I added a Pre-Loader.I know right now it does not match the vibe from the site but I am going to change that at the end.Changing it is pretty easy ,making it was a little bit harder.I am going to work on the music app today but right now I need a little break.When you have ideas how I should style the Pre-Loader: Leave a comment!! Thanks for reading <3"}, {"post_id": 30673, "ts": "2026-07-18T13:24:10Z", "hours": 2.0797, "text": "So I started changing the window for the music app and I also started making all the graphics.That took about 6 hours so these 2 hours of code time are such a tiny bit of my actual work.Hope you like the style and see the vision for the app. Sr for the bad vd my Internet is still veeeeeery slow and it is just sucks :)"}, {"post_id": 30353, "ts": "2026-07-17T20:38:07Z", "hours": 1.4083, "text": "#concept Devlog So as promised here is the brainstorming for the whole site. I also have the brainstorming for the apps but you need a little bit of patience because I am only going to share these when making the actual app.I also started on the music app and it looks really cool.Everything is coming together slowly and even when I am not even at half of the time I am going to spend I am soo happy.Hope you like the brainstorming-and yesss it is BRAINSTORMING you guys so please it is not supposed to look like the Mona Lisa.Thanks for reading all of this !!!"}, {"post_id": 30175, "ts": "2026-07-17T15:19:52Z", "hours": 2.0125, "text": "So I now improved the search bar and the dragging thing because now you cannot drag a window into the top bar. I also changed the icons and added a new app with a matching app window.The window is a mix from the Journal app and the welcome window but I am going to change that soon.I also changed the color of the clock and added a background to the apps.I finally made my CSS a own file so now the HTML is a little bit shorter and more organized.I am going to work on the window from the CD’s app later today and I am also going to share my brainstorming for the site.Thanks for reading!!!"}, {"post_id": 30067, "ts": "2026-07-17T10:59:39Z", "hours": 1.5111, "text": "So I now changed the CSS for the icons and started adding a search bar connected to ecosia. Ecosia is like google but it plants trees every time you use it.Because I do not know if I can change the index also in my GITHUB (yk I am still waiting for the mission thing) you can only see the changes on a screen. It works right now but I still need some changes to make it look better.I made the whole brainstorming for the site yesterday so I think I am going to share that today too.Thanks for reading this DEVLOG."}, {"post_id": 29710, "ts": "2026-07-16T20:00:25Z", "hours": 0.2914, "text": "Hey so I do not know if it only works on my laptop but you should be able to drag the window when you click and hold the yellow heart.Could someone please try it???"}, {"post_id": 28895, "ts": "2026-07-15T14:25:36Z", "hours": 2.6283, "text": "#concept devlog Hey. So I just finished my README and my site. The time you see here only reflects the hours I spent coding. The README took way longer than the code, but to me, the README is just as important as the code itself. I’m going to ship everything in the next few minutes. Hope you like my work! If you want to know how I did everything, check out my README — it’ll make all the effort worth it. Thanks for reading this DEVLOG, and keep in mind: this is just Mission One. This project will get better and bigger in Mission Two. If you want to know my plans or first ideas for Mission Two, read my README. This DEVLOG was corrected and improved with AI"}, {"post_id": 28322, "ts": "2026-07-14T14:34:58Z", "hours": 3.2475, "text": "Hey, so I now upgraded graphics and stuff from the Journal app. I still need to change some details like the heading of a note you wrote (currently it is blue and really tech-like) or the text in the starting window. I also changed the font from the app name under the app icon. I also upgraded my JS, so now you can write a note and refresh the site, and it will still be there. You can also edit or delete that existing note with only one click. When you refresh the page and there is already a note, you will not see the introduction to the app again. I am going to do the graphics for the README now (the graphics for the Journal app were about 3-4 hours, so I really locked in today), and I will also add some more links to it. I am also going to try to change some details today. But the final steps and the final written README are coming tomorrow. So if everything works: Tomorrow is shipping day!!! Thanks for reading all of that and having interests in my OS. And again: Really sorry for the bad video…"}, {"post_id": 27740, "ts": "2026-07-13T15:49:59Z", "hours": 4.4794, "text": "So today I could finally finish my journal app (in the tutorial it is a notes app). Unfortunately, I did not understand the tutorial so well with the app, so I decided to find a tutorial myself and use that. It took me longer than expected, but here I am now. I already started working on the graphics (Yesss, they are all made by ME). That took me about 3 hours. These hours unfortunately do not count, but I want to give my best and really make that project cute.The plot twist is that the apps do not look like the apps that everybody knows. They are supposed to look like the real thing, and I want to combine that with the whole Peter Pan/Tinkerbell theme. So yeah, I am going to do the README now, and tomorrow I am going to read the last guide even. I do not know if I am going to use that guide or what even is in that guide. I am also going to change the graphics in the notes app. I really hope that that journal app of mine has the same functions as the app from the guide and that it is okay that I did my own one. Does somebody know that?? Thanks for reading this entire thing. Sorry for the start and the quality of the video.My Internet Connection is at the moment really bad"}, {"post_id": 27251, "ts": "2026-07-12T17:16:06Z", "hours": 0.3075, "text": "Thanks to the help from @nokira , it now finally works. Unfortunately, I cannot code any further today, but we are hopefully going to finish the app tomorrow."}, {"post_id": 27108, "ts": "2026-07-12T11:33:27Z", "hours": 1.4481, "text": "So, here is finally a DEVLOG that logs over an hour of work. I did my best today, but unfortunately I’m typing only with my left hand as a right‑handed person because of a small accident. Yaayyyy (the universe is really not on my side).I can now finally drag the two windows separately (that didn’t work yesterday), and I can close them. I’m not sure if it’s supposed to do nothing when I click the “Open” button.For better understanding: Yellow is for dragging, red for closing, and green for opening.I think I have another bug, because when I click on the app icon, nothing happens. If you have any idea what might be wrong, please help me in the comments or on Slack.I also wanted to work on the README today, but I’m not sure how long I can keep typing with my left hand. We’ll see. I’m trying my best here — thanks for reading all of this."}, {"post_id": 26780, "ts": "2026-07-11T19:33:38Z", "hours": 1.1739, "text": "So, I added the three little symbols at the top, and I started working on my app. Right now it looks the same as the welcome screen, but I’m going to change that tomorrow.My plan for tomorrow is to finish my first app and maybe even start working on the final README (you know — the banner and everything)."}, {"post_id": 26478, "ts": "2026-07-11T09:19:42Z", "hours": 0.6758, "text": "So, I did the JS and the HTML for the close and open feature. I also changed the graphic of the handle. I’m really sorry that I only log such short sessions, but I currently don’t have much time for coding and can only squeeze in short amounts of time."}, {"post_id": 25937, "ts": "2026-07-10T13:14:16Z", "hours": 0.5867, "text": "Guys, I finally got it! A big thank you to @nokira . I needed a bit more time to fix everything, but yeah — there were some more mistakes that I finally started to correct. I still need to fix a few things, like the graphics and the z-index, but I’m sooo happy that it finally works!!!!"}, {"post_id": 25259, "ts": "2026-07-09T12:40:32Z", "hours": 0.6822, "text": "So I started the third tutorial.I am at the part where you should be able to drag your window.The code is from the tutorial ,so it should work but I think that I have done something wrong because as you can see nothing happens.I am on the go right now and maybe I can squeze some time for programming in later.I have my code updated in my github thing ( it is linked in the project I think) .Could someone help me please.I am really new with JS and I do not have enough time right now to start from the starting point.Because I am in a rush I do not have time to correct this text .I am really sorry for my grammar and all this stuff."}, {"post_id": 24804, "ts": "2026-07-08T16:38:54Z", "hours": 0.2833, "text": "Okay, so I just coded a bit more and made a temporary README. I’m going to create a new picture for my project and improve my profile a little, but that’s it for today.✨ BYE ✨"}, {"post_id": 24789, "ts": "2026-07-08T16:13:44Z", "hours": 1.1456, "text": "So, what have I changed? First, I changed the heading because the “S” looked like an “f,” which would completely change the purpose of the website — I just noticed that, hahaha! Imagine if I had shipped it like that in the final version. Anyway, I also added that cute cursor (it’s a tiny Tinkerbell). I loved this idea the most because it lets me make my website both modern and whimsical.If you don’t know who Tinkerbell is: she’s a cartoon character from a kids’ series who lives with other fairies and struggles to find her powers. I thought it would be fun to combine her with Peter Pan — also a children’s story about a dream world where Peter Pan secretly visits kids at night and they all fly through the sky to a magical place . I didn’t watch the Peter Pan series as a child, but I read the books, so I chose Tinkerbell because I could picture her better in my head. Maybe we just pretend they got married.Why am I talking so much about these characters? Because my whole OS is meant to match that vibe — so you can understand why there’s a random fairy on a modern site. I’ll make it easier to get what this OS is about as I go further with the project (you know, adding features like a calculator, etc.).I also added my favorite feature again: a new highlight color! That ugly blue is finally gone from this beautiful site. I linked my profile at the top too, so you can click on my name now. I mean, if you’re going to include info on a site, you might as well do it right and add a bit more about yourself than just your name.So yeah, that’s my desktop for now. I’m going to work on the README today too. I wanted to get further today, but I think it’s okay — you know how much time I spent on this.Thank you for reading all of that and for your interest in my project!"}, {"post_id": 24685, "ts": "2026-07-08T13:10:59Z", "hours": 1.6353, "text": "Hi! So I already had the code in my last update here, but I finally changed the graphics and the design. I’m not finished with the desktop yet (don’t worry, I know how it looks!), but I just wanted to give you a quick update."}, {"post_id": 24622, "ts": "2026-07-08T10:33:51Z", "hours": 0.4072, "text": "Okay, soo. I just read the second tutorial and literally made it the same as in the tutorial. I knew I wasn’t supposed to do that. Yes, I’m changing it in a second. I’m just brainstorming a bit and sorting out my ideas for the design because my last project had that Y2K vibe (iykyk), but now I want something cleaner — not like those old, ugly operating systems back in the day. Still, it should keep some of those nostalgic vibes, you know? I can’t really explain it better.So yeah, I think I’ll need about an hour or two — let’s see if the universe is on my side and I find the graphics I want quickly! And guys, I’m suffering — I miss my Windows 11 from home, but I think I just need a little more time to get used to Windows 10 on this laptop. I don’t really have a choice since it’s just me and my laptop for the next month.Also, I registered for this chat thing (I forgot the name) and got nothing. Like, how many chats exist on this planet? But I think I’ll get through it tonight. :)"}, {"post_id": 24293, "ts": "2026-07-07T19:22:28Z", "hours": 0.2756, "text": "Guys, this has been so hard. And I don’t mean the project — I mean the file. I know that no one is going to read this, but I want to share my struggle so that my hard work has a reason.I just finished my first project, which I did with the VS app. But now I needed to open a new project — after half an hour, I somehow managed it (still don’t know how). Could somebody explain that to me?Then the Hackatime tool stopped working, and Stardance couldn’t find my file. So I decided to switch to my laptop because I hadn’t installed the app there yet, and I already knew what to do from my first project. I needed everything on my laptop anyway because of the holidays, etc.My laptop only runs Windows 10, so everything took ten times longer. After that, I had to delete some apps because of storage issues. As you can see, it just kept getting more complicated.I finally did it — after six hours, without appreciation (you know, from Stardust…) and actually crying twice because I already had code, but it was gone.I don’t want to annoy you with my problems. That’s my site for now. Please don’t judge — I’m following the tutorial, and I’m going to add beauty to it at the end when the code is finished. I already have so many ideas.I’m giving my best and forcing myself to keep going. In my country, there’s a saying: „Wo ein Wille ist, ist auch ein Weg“, which basically means if you truly want something, there’s a way to get it.I’m so exhausted because I find all this installing, updating, and setup stuff just so boring.A devlog with my to-dos is coming tomorrow or on Friday because I’m getting my school report card tomorrow — wish me luck!And here’s a screenshot of my really ugly site at the moment. If you read this whole thing: thanks for listening to all my yapping .💗💗💗💗"}]...
|
Title: Neverland OS by @253_Mathilde_IYKYK | Stard Title: Neverland OS by @253_Mathilde_IYKYK | Stardance
Devlogs:
Guys, this has been so hard. And I don’t mean the project — I mean the file. I know that no one is going to read this, but I want to share my struggle so that my hard work has a reason.I just finished my first project, which I did with the VS app. But now I needed to open a new project — after half an hour, I somehow managed it (still don’t know how). Could somebody explain that to me?Then the Hackatime tool stopped working, and Stardance couldn’t find my file. So I decided to switch to my laptop because I hadn’t installed the app there yet, and I already knew what to do from my first project. I needed everything on my laptop anyway because of the holidays, etc.My laptop only runs Windows 10, so everything took ten times longer. After that, I had to delete some apps because of storage issues. As you can see, it just kept getting more complicated.I finally did it — after six hours, without appreciation (you know, from Stardust…) and actually crying twice because I already had code, but it was gone.I don’t want to annoy you with my problems. That’s my site for now. Please don’t judge — I’m following the tutorial, and I’m going to add beauty to it at the end when the code is finished. I already have so many ideas.I’m giving my best and forcing myself to keep going. In my country, there’s a saying: „Wo ein Wille ist, ist auch ein Weg“, which basically means if you truly want something, there’s a way to get it.I’m so exhausted because I find all this installing, updating, and setup stuff just so boring.A devlog with my to-dos is coming tomorrow or on Friday because I’m getting my school report card tomorrow — wish me luck!And here’s a screenshot of my really ugly site at the moment. If you read this whole thing: thanks for listening to all my yapping .💗💗💗💗
Okay, soo. I just read the second tutorial and literally made it the same as in the tutorial. I knew I wasn’t supposed to do that. Yes, I’m changing it in a second. I’m just brainstorming a bit and sorting out my ideas for the design because my last project had that Y2K vibe (iykyk), but now I want something cleaner — not like those old, ugly operating systems back in the day. Still, it should keep some of those nostalgic vibes, you know? I can’t really explain it better.So yeah, I think I’ll need about an hour or two — let’s see if the universe is on my side and I find the graphics I want quickly! And guys, I’m suffering — I miss my Windows 11 from home, but I think I just need a little more time to get used to Windows 10 on this laptop. I don’t really have a choice since it’s just me and my laptop for the next month.Also, I registered for this chat thing (I forgot the name) and got nothing. Like, how many chats exist on this planet? But I think I’ll get through it tonight. :)
Hi! So I already had the code in my last update here, but I finally changed the graphics and the design. I’m not finished with the desktop yet (don’t worry, I know how it looks!), but I just wanted to give you a quick update.
So, what have I changed? First, I changed the heading because the “S” looked like an “f,” which would completely change the purpose of the website — I just noticed that, hahaha! Imagine if I had shipped it like that in the final version. Anyway, I also added that cute cursor (it’s a tiny Tinkerbell). I loved this idea the most because it lets me make my website both modern and whimsical.If you don’t know who Tinkerbell is: she’s a cartoon character from a kids’ series who lives with other fairies and struggles to find her powers. I thought it would be fun to combine her with Peter Pan — also a children’s story about a dream world where Peter Pan secretly visits kids at night and they all fly through the sky to a magical place . I didn’t watch the Peter Pan series as a child, but I read the books, so I chose Tinkerbell because I could picture her better in my head. Maybe we just pretend they got married.Why am I talking so much about these characters? Because my whole OS is meant to match that vibe — so you can understand why there’s a random fairy on a modern site. I’ll make it easier to get what this OS is about as I go further with the project (you know, adding features like a calculator, etc.).I also added my favorite feature again: a new highlight color! That ugly blue is finally gone from this beautiful site. I linked my profile at the top too, so you can click on my name now. I mean, if you’re going to include info on a site, you might as well do it right and add a bit more about yourself than just your name.So yeah, that’s my desktop for now. I’m going to work on the README today too. I wanted to get further today, but I think it’s okay — you know how much time I spent on this.Thank you for reading all of that and for your interest in my project!
Okay, so I just coded a bit more and made a temporary README. I’m going to create a new picture for my project and improve my profile a little, but that’s it for today.✨ BYE ✨
So I started the third tutorial.I am at the part where you should be able to drag your window.The code is from the tutorial ,so it should work but I think that I have done something wrong because as you can see nothing happens.I am on the go right now and maybe I can squeze some time for programming in later.I have my code updated in my github thing ( it is linked in the project I think) .Could someone help me please.I am really new with JS and I do not have enough time right now to start from the starting point.Because I am in a rush I do not have time to correct this text .I am really sorry for my grammar and all this stuff.
Guys, I finally got it! A big thank you to @nokira . I needed a bit more time to fix everything, but yeah — there were some more mistakes that I finally started to correct. I still need to fix a few things, like the graphics and the z-index, but I’m sooo happy that it finally works!!!!
So, I did the JS and the HTML for the close and open feature. I also changed the graphic of the handle. I’m really sorry that I only log such short sessions, but I currently don’t have much time for coding and can only squeeze in short amounts of time.
So, I added the three little symbols at the top, and I started working on my app. Right now it looks the same as the welcome screen, but I’m going to change that tomorrow.My plan for tomorrow is to finish my first app and maybe even start working on the final README (you know — the banner and everything).
So, here is finally a DEVLOG that logs over an hour of work. I did my best today, but unfortunately I’m typing only with my left hand as a right‑handed person because of a small accident. Yaayyyy (the universe is really not on my side).I can now finally drag the two windows separately (that didn’t work yesterday), and I can close them. I’m not sure if it’s supposed to do nothing when I click the “Open” button.For better understanding: Yellow is for dragging, red for closing, and green for opening.I think I have another bug, because when I click on the app icon, nothing happens. If you have any idea what might be wrong, please help me in the comments or on Slack.I also wanted to work on the README today, but I’m not sure how long I can keep typing with my left hand. We’ll see. I’m trying my best here — thanks for reading all of this.
Thanks to the help from @nokira , it now finally works. Unfortunately, I cannot code any further today, but we are hopefully going to finish the app tomorrow.
So today I could finally finish my journal app (in the tutorial it is a notes app). Unfortunately, I did not understand the tutorial so well with the app, so I decided to find a tutorial myself and use that. It took me longer than expected, but here I am now. I already started working on the graphics (Yesss, they are all made by ME). That took me about 3 hours. These hours unfortunately do not count, but I want to give my best and really make that project cute.The plot twist is that the apps do not look like the apps that everybody knows. They are supposed to look like the real thing, and I want to combine that with the whole Peter Pan/Tinkerbell theme. So yeah, I am going to do the README now, and tomorrow I am going to read the last guide even. I do not know if I am going to use that guide or what even is in that guide. I am also going to change the graphics in the notes app. I really hope that that journal app of mine has the same functions as the app from the guide and that it is okay that I did my own one. Does somebody know that?? Thanks for reading this entire thing. Sorry for the start and the quality of the video.My Internet Connection is at the moment really bad
Hey, so I now upgraded graphics and stuff from the Journal app. I still need to change some details like the heading of a note you wrote (currently it is blue and really tech-like) or the text in the starting window. I also changed the font from the app name under the app icon. I also upgraded my JS, so now you can write a note and refresh the site, and it will still be there. You can also edit or delete that existing note with only one click. When you refresh the page and there is already a note, you will not see the introduction to the app again. I am going to do the graphics for the README now (the graphics for the Journal app were about 3-4 hours, so I really locked in today), and I will also add some more links to it. I am also going to try to change some details today. But the final steps and the final written README are coming tomorrow. So if everything works: Tomorrow is shipping day!!! Thanks for reading all of that and having interests in my OS. And again: Really sorry for the bad video…
#concept devlog Hey. So I just finished my README and my site. The time you see here only reflects the hours I spent coding. The README took way longer than the code, but to me, the README is just as important as the code itself. I’m going to ship everything in the next few minutes. Hope you like my work! If you want to know how I did everything, check out my README — it’ll make all the effort worth it. Thanks for reading this DEVLOG, and keep in mind: this is just Mission One. This project will get better and bigger in Mission Two. If you want to know my plans or first ideas for Mission Two, read my README. This DEVLOG was corrected and improved with AI
Hey so I do not know if it only works on my laptop but you should be able to drag the window when you click and hold the yellow heart.Could someone please try it???
So I now changed the CSS for the icons and started adding a search bar connected to ecosia. Ecosia is like google but it plants trees every time you use it.Because I do not know if I can change the index also in my GITHUB (yk I am still waiting for the mission thing) you can only see the changes on a screen. It works right now but I still need some changes to make it look better.I made the whole brainstorming for the site yesterday so I think I am going to share that today too.Thanks for reading this DEVLOG.
So I now improved the search bar and the dragging thing because now you cannot drag a window into the top bar. I also changed the icons and added a new app with a matching app window.The window is a mix from the Journal app and the welcome window but I am going to change that soon.I also changed the color of the clock and added a background to the apps.I finally made my CSS a own file so now the HTML is a little bit shorter and more organized.I am going to work on the window from the CD’s app later today and I am also going to share my brainstorming for the site.Thanks for reading!!!
#concept Devlog So as promised here is the brainstorming for the whole site. I also have the brainstorming for the apps but you need a little bit of patience because I am only going to share these when making the actual app.I also started on the music app and it looks really cool.Everything is coming together slowly and even when I am not even at half of the time I am going to spend I am soo happy.Hope you like the brainstorming-and yesss it is BRAINSTORMING you guys so please it is not supposed to look like the Mona Lisa.Thanks for reading all of this !!!
So I started changing the window for the music app and I also started making all the graphics.That took about 6 hours so these 2 hours of code time are such a tiny bit of my actual work.Hope you like the style and see the vision for the app. Sr for the bad vd my Internet is still veeeeeery slow and it is just sucks :)
So I added a Pre-Loader.I know right now it does not match the vibe from the site but I am going to change that at the end.Changing it is pretty easy ,making it was a little bit harder.I am going to work on the music app today but right now I need a little break.When you have ideas how I should style the Pre-Loader: Leave a comment!! Thanks for reading <3
So I started working on the top bar.It now has quotes that change every 10 sec and that move so the text is animated.My plan is it to finish the top bar and all these details and then start working on the apps.I am pretty sure I will change the graphics when I am done with the app but that is really easy to do and I first need the code for these elements.
I added a little timer. It’s a simple one — it only counts minutes, not seconds or hours — but it’s enough if you want to have a short learning session or keep track of a small task. It’s not an app; I wanted to keep it simple. I also added the divs for the other tools in the top bar, and I included a small GIF for the map feature (check my DEVLOG with the brainstorming if you don’t know what I mean). Maybe I’ll start building that today, maybe not. Thanks for reading this DEVLOG ❤❤
So I added the little star map thing (same here,if you do not know what I mean or what the plan for this project are : check the DEVLOG with the drawing) and fixed some little mistakes.I think I am going to start working on the hardest part in the info-top-bar-thing :The little weather widget.The problem is that it is supposed to get you location and to show the weather in the right number thing ( yk F and C ).Let’s see how long this will take! Wish me luck and thanks for reading this DEVLOG!!! Sr again for the vd my situation has not changed :( and I also showed all the other features in this vd
Well, that looks like an OS! I got the little weather application for the top. Yayyyy. And I also added the icons for the apps and also connected them to their own windows, so now only the app content is missing. I am so happy right now that everything works! The complicated part is not even close (yk the game and the music app), but I am going to change the design from the welcome window (check the drawing for the vision). The apps are in a div container where you can scroll, and I really hope you like it! Maybe check it out in real life when you are interested. Thanks for reading!!!
So I changed the welcome window.It is not perfect and not finished do not worry but it is enough for the moment.It was quite hard-yk with the grid and everything because I had never done that.I need a little break from the grid thing so that goes on the list for the things to do in the end.Hope you like the styling idea.Thanks for reading!!!
So I pulled myself together and changed the welcome window.I will work on the camera app now but what do we think about the desing from the welcome window ? Should I leave it as it is or should I change it ? Yk it is the first impression you get when you go on my site.Thanks for reading and your interests in this project.
So I added the base for the galerie.I just need to add a slideshow thing which is going to be a little hard because I already have 2 and I need to add the 2 buttons to switch between the images.I am giving my best to squeze in coding time but the graphics themselves take a lot of time.Thanks for reading!!!
#concept Devlog All I can say:The galerie app is finished ! You can check it out or wait until I post a DEVLOG which shows more details.It was squite some work and now it is time for the next point on my todo-list:the TV.I am so happy and grateful for all these people watching my DEVLOGS and for all these kind souls who are staying with this project since minute one.Thank you you all and I really hope you like it!!Thanks for reading <3
So here is the camera app! As you may can see there are two little buttons that look like real camera buttons. I added little arrows but I think they still look real.Right now we have like 22 photos on our digi cam.And well if you scroll through these screens you may see the TV app because I also finished that.I think it also looks pretty cool ,tell me what you think about it in the comments!! It only has one vd right now(yk matching to the theme if you are interested check out the real site).I may add more in the future but not until this project is finished.So these 2 apps are now ready and the next thing on my list is the music app.Happy to hear or see some feedback (If you all really hate it I am going to change it tho but I really gave my best).Thanks for reading <3 🔗 253-mathilde.github.io/My-first-OS/
Okay so I just started with the game.Actually just started is a huge lie because I am struggeling since 10:00 and we now have 17:00.I used a tutorial and tried to just start basic with making a little jumping game but the objects …They do not exist because the whole generating thing does not work .I first need to get everything working before upgrading the graphics and stuff.I really would like some help! CSS: #background { position: absolute; background-image: url('https://files.catbox.moe/xqsbzm.png'); height: 200px; width: 100%; animation: slideright 600s infinite linear; bottom: 0;}.wendy { background-image: url('https://files.catbox.moe/u52u37.png'); height: 60px; width: 60px; position: absolute; bottom: 0;}.obstacle { background-image: url('https://files.catbox.moe/n5f03w.png'); width: 60px; height: 60px; position: absolute; bottom: 0;}@keyframes slideright { from { background-position: 0 0; } to { background-position: -10000px 0; }} HTML: <div id="gameWindow"> <div class="base5"> <div class="symbolegame"> <p id="galerieWindowheader"> <img src="https://i.imgur.com/Y4OL1On.gif"></p> <p style="cursor: pointer" id="gameclose"><img src="https://i.imgur.com/q5TmYNg.gif"></p> <p style="cursor: pointer" id="gameopen"><img src="https://i.imgur.com/3nBda2J.gif"></p> </div> <div id="background"> <h6 id="alert"></h6> <div class="wendy"></div> <div class="grid"></div> </div> </div> </div> </div> JS: document.addEventListener('DOMContentLoaded', () => { const wendy = document.querySelector('.wendy') const grid = document.querySelector('.grid') const alert = document.getElementById('alert') let gravity = 0.9 let isJumping = false let isGameOver = false function control(e) { if (e.code === "Space") { if (!isJumping) { jump() } } } document.addEventListener('keydown', control) let position = 0 function jump() { isJumping = true let count = 0 let timerId = setInterval(function () { //move down if (count === 15) { clearInterval(timerId) let downTimerId = setInterval(function () { if (count === 0) { clearInterval(downTimerId) isJumping = false } position -= 5 count-- position = position * gravity wendy.style.bottom = position + 'px' }, 20) } //move up position += 20 count++ position = position * gravity wendy.style.bottom = position + 'px' }, 20) } function generateObstacles() { if (!isGameOver) { let randomTime = Math.random() * 4000 let obstaclePosition = 1000 const obstacle = document.createElement('div') obstacle.classList.add('obstacle') grid.appendChild(obstacle) obstacle.style.left = obstaclePosition + 'px' let timerId = setInterval(function () { if (obstaclePosition > 0 && obstaclePosition < 60 && position < 60) { clearInterval(timerId) alert.innerHTML = 'Game Over' isGameOver = true //remove all children while (grid.firstChild) { grid.removeChild(grid.lastChild) } } obstaclePosition -= 10 obstacle.style.left = obstaclePosition + 'px' }, 20) setTimeout(generateObstacles, randomTime) } } generateObstacles()}) Thanks for reading<3
Okay so I hope that I do not dissapoint s.o now.I deleted the whole thing that I had so basically a whole day of work because there is always way more time behind everything that you think.I did that because I could not find the mistake and I did not really get the code.I never really did JS before this project and I am learning JS while doing this project.And I mean really learning because I kinda eat the whole W3 school site but yeah.I want to give my best in this project and if I cannot find the mistake in my own coding:I would need AI.And do not get me wrong but help from AI okayyyy but a whole app made with AI.No.No.And no.That is MY opinion so yeah if you do not think so or use AI a lot then do so (it is okay but not for me).I give my best to be transparent and always say when I used AI.The plan is now to build like a flappy bird game but without the top part and to make it look cool.I hope you can understand me and stay with me on this project because we are now getting to the hardest part.This will take some time but I will not quit.Thank you for reading(I do not think that s.o will read all of this but yeah).
Okay so here we are: We have a WORKING mini game that looks like trash! And I am sooo happy.As you can see there is an object that you can control with the arrow up key (hope that is the right english word for that).And we also have like blocks that are generated and have a random height.Yayyy.So we only need to do the styling and add some JS that ends the game when you have a score from xxx (I already have a score in my JS so that should not be so complicated).I am so happy right now and I think it was the right decision to start over.Thanks for reading and sr for all these bad vd’s,they will get better soon.<3
Okay so I started doing some CSS and made some graphics.Right now the background is too full (yk the focus point from the game should not be the background) but like the keyframes work and I added that frame.I will chnage the elements from the game but I will not change like the frame because I think that the frame looks pretty cool.We still need to do the JS and to change some stuff but I think that I will get that done in about 6-8 hours.Unfortunatly I do not have 6-8 hours the next days.I will give my best to squeze in some time but yeah: Sr for the bad vd but like I do not even use that other tracking tool because my laptop is just soooo slow with it and like recording and all the animations and windows that are open-it almost collapsed so srrrr Thanks for reading and if you have styling ideas for the game:leave a comment or write me on Slack <3
So I did some JS and spent way too much time on the graphics.It now shows a message and hides everything when you reach a score from 100.I still need to do something for the like game over part.Hope you like the design because that will stay the same I think.Thanks for reading <3
I added something like a pre-loader-thing that shows the info for the game everytime you open the game window for 30 sec.I now that it is kinda annoying that I only log such short times but I just squeze in every tiny bit of time I have and the graphics also take pretty long.Thanks for reading <3
Okay so the game is kinda finished! I now have a game over screen and a finished screen and a like maual or pre-loader.Everything is explained and I myself think that it is like the right level of easy but still a little bit tricky.You would help me a lot with trying it out and giving me a short feedback. ( https://253-mathilde.github.io/My-first-OS/ )Thanks for reading and here are the picture of the game app:
#concept Devlog AND SR FOR LIKE THE LOOKS AND THE GRAMMAR OKAY WE HAVE 37 DEGREES AND THIS IS JUST A VISION IT IS NOT SUPPOSED TO LOOK PERFECT!! Okay so I now started working on the music app and yeah it looks sooo funny right now(yk to see the switch from all the clean and perfect things to THAT)but I mean everything works for now so we just need the styling and the menu.That is such an easy thing to say because actually:The graphics take me sooo long.There are about 20 hours that you do not see and thanks to the universe catbox is not working right now and that means I have to use postimages and it works but like the pictures load sooo long.Hope it works soon and if you have like song wishes for the app:leave a comment!Thanks for reading and here is my vision:
Okay so we now have a working thing ( the play and stop button needs some work because right now it only works if you do not use the back and forward buttons) and as you can see I changed the graphics and what you cannot see is that it rotates like a real CD! I started planning the menu cause it will have the shape of a half circle so I do not have quite an idea how I will do that but we will see.Thanks for reading and right now I only have the example music from the code I used so if you have music wishes:leave a comment.Thanks for reading <3
#Concept Devlog ( infos about the planning and the vision I will mark them now so you can choose yourself if your interests are only in the progress or also in everything behind the finished page )Okay so today was a planning day. Again.But you need to trust me because if you don’t have a plan than you won’t have a good project because I have multiple apps and I want everyone to be perfect. So over the time more and more little mistakes or things that just feel false appear.And I mean I already used so much effort so why should I throw that away and make it unperfect? A lot of new problems also appeared because I now saw the site on a bigger screen (yk laptop VS PC) and it just looked terrible! And the music app is not finished and because that DEVLOG is already really long: there will be 3 more apps.Yayyy.They won’t be too complicated because they will base on already existing sites so it should be done in about 10 hours but before that everything needs to be done and as you can see that is a long list and every task will take about an hour at least.We have round about 28 tasks btw.It will be a long journey and I think that we are not even close to half of that so if you really read all of that: A really big thank you because you have true interests! Thanks for reading<3
Okay so here is what we have now: I added the final things for the apps, and I also changed the layout so that the backgrounds only repeat horizontally and not vertically. I also worked on the screens for the app and, of course, on the music app. I need to pull myself together so I do not start with any other app before I finish the music app. I also worked on the graphics as always, and we now finally have better vd, and everything is just better. Yayyyy.Thanks for reading <3
I NEED YOUR HELP!!!! Okay so I started working on the menu. It works already but needs some better styling. So you can see the vision: The red circles are going to be little CDs like the one already existing. But I need your help because I do not know how to make the control buttons (the styling), so here are like 3 versions of it. Hope you can see the vision and may help me choose (and of course the buttons will be buttons, not words, but yk it is just so you can see what my vision is). Thanks for reading <3
I worked on the preloader for the last 7 hours, but because of the browser update in 2025, an alert does not count for autoplay with the audio, and I still need a solution for that. Here is the MP4 of the preloader with the audio. I hope I will get that with the audio tomorrow. At least the video is working with the alert. Hope you like the graphics (they took soooo long, and yes, everything is self-made, so no Google copy and paste). Thanks for reading <3
Here we finally are: It works. With sound. And autoplay. And the alert. And I am soooooo happy. It took me the whole day, and I needed to do stuff that I had never even heard of, but thanks to the internet and my ability to read, I finally got it. So you can understand that better: I started at 8 am in the morning and finished at 4 pm in the afternoon. As you may understand, my patience for the music app was not enough, so I built 2 new apps instead. That sounds a little bit crazy, but because these are based on a webpage, it only took about 3 hours each. I still added a little window that explains everything, and I hope you like the result. I got so much kind feedback for the pre-loader and in general; I am getting so many nice comments. Thank you for that, and I hope you like the result and see where we are going! Thanks for reading. <3 The vd is pretty bad because I had to compromise it, so maybe check it out in real life or wait for a DEVLOG with a better VD.
Okay, so like, I started on an app, and I can’t try it at the moment because GitHub is testing my patience, but yeah, the app is the manual app, and it looks like a book, and you can actually flip pages. It is just annoying that I can’t work correctly because of GitHub, but I don’t have another chance; I just need to try again and again and again: And because I do not know if my code even works, I can’t even continue with another app like the music app. Thanks for reading <3
Okay, so GitHub is still broken, so text will have to do it. I added the Wikipedia and manual apps. And I also wrote the whole manual. That was quite some work, and I also fixed parts of the JS that were not really stable. I am so happy that it works now because I almost deleted everything today. In the end the problem, why everything did not work, was a missing close div thing. I spent the whole afternoon till now searching for that. It is midnight. I started in the afternoon. I feel really dead right now. Tomorrow I really need to do the music app. Thanks for reading <3
Okay, I worked on the manual app more, and you now can slowly see where we are going. That took me super long because I also did all the graphics and the effect where the image turns and gets bigger the second your cursor touches the image. Hope you like the graphics and the little tinkerbell on the cover. I know it is not perfect because the book is already open when you open the app, but I think it looks okay, and I can’t change it because of the symbols (they would look pretty bad on the next pages then). I also need to change the back site, text and next buttons. Btw, I now have over 300 commits on GitHub and 69 hours on Hackatime, and the project has been active for 32 days (started on 7/7/26). Literally, over a month and one devlog got over 2000 views 🥹. Thanks for reading and always helping me out <3
I think the manual is now finished. I know the CD site is not finished, but neither is the app. When I am finished with that, I’ll update the manual. I also added that star effect that shows when you click on the star thing on the last page. I also made some Easter eggs, like hidden sounds (for example, the first audio that was taken on Mars plays if you click on the green heart in the map window, which is also hidden), and I made the tab name of the OS a little game (I don’t know how to call it; it basically just moves and looks pretty). Hope you like the app; I’m always happy to hear some feedback, and now I finally start working on the music app. Thanks for reading <3.
Ahhh, I’m freaking out. The music app is finished!! Finally. It took me so long. Yes, I still need to add more songs (we only have the 3 from the base I used), but the whole layout is finished. Everything that comes now is only details and grammar and such stuff, but that was actually the last line of code for this project (yk, I now only need to repeat or fix things, not write something from scratch). In the app we have a slideshow at the beginning, a moving CD (spins), a menu that comes up front if your mouse touches it, a back button for the previous song, a next button for the next song, and a play and pause button that changes (yk, if the music plays it is ‘stop’ and if not it is ‘play’), changing song names and, of course, changing artists names. That app was the most challenging of all. Hope you like the design and everything! It would really help if you tried the site https://253-mathilde.github.io/My-first-OS/ and looked if everything works, but please respect that I am working on the grammar. Now we are finally getting to the last part!!! Thanks for reading <3.
That is just the first page.I’m waiting for two hours.I can’t even cancel them.Why always meeeeeee.I just made a folder to make it organized localy and when I uploaded it from the app ( yk the push and pull ) this happend.Yeah that takes sooooo long and btw I added more songs and made some things a little bit cleaner.As you may can see I can’t show you anything right now.Thanks’s for reading <3
Concept Devlog Okay so I know it looks like I haven’t worked on this project for the last two days but Actually, I have worked non-stop for the last two days. I got some feedback for my site, and I am still open for some feedback. I really struggled with GitHub and ended up renaming every file in my project, and yes, I needed to do that individually and wait every time for about 10 minutes. Now more and more images are getting changed from Catbox to GitHub because someone said that I should reduce the loading time. I myself don’t like using GitHub for images and stuff because it is sooo much work with the folders and stuff, but you wanted it so, so I changed it. I also changed the manual because I also got some feedback for that. I also will upload the Pixabay songs to GitHub but not the ones from the tutorial I used because I don’t know where this music is from… That should reduce the loading time from the music app. I also found a lot of details that are not perfect so I also will change these but these are mostly little things in the user interface. I really gave my best the last days even though I can’t use Lapse for time tracking because it does not work with my laptop. Oh, and I almost forgot: the OS is made for smaller screens with a browser window width from 1400 px (I don’t mean the width of your screen), so I would Be really happy to know how bad it looks on other screens. I am really sorry for that but can’t change that because my CSS is 1600 lines of code and I often used position: absolute;. I am a beginner and will work with the percentage the next time! I promise. Thanks for reading and your patience with me. Check out the site at the moment, but please respect that the manual is not quite finished and the text can look a little bit misplaced sometimes. https://253-mathilde.github.io/My-first-OS/ Thanks for reading <3
Check it out https://253-mathilde.github.io/My-first-OS/ Okay so today I added the last song to the music app.I also changed the font in the welcome window and wrote more text/changed some stuff. I also added better img to the galerie so now everything looks clean and everything is so close to being finished. I know I say that every day but you get a different point of view when you have over a month of work in your head VS just 3 or 4 more days. I am soooo happy with the font in the welcome window because the other one was more tech and this is more fairy-like. If you have a different opinion or absolutly hate it : say something! As you can see in the last DEVLOG I changed a lot based on feedback so yeah. I also changed the songs that are mine (not the ones from my base code) to github so now the img may load a little bit slow, but the sound should work great.I also made all the img links in the galerie app to github links( I downloaded everything from catbox and uploaded it to github and then change dthe file name and then re-run every job). I love how the music app turned out and looks when other windows are opened. Hope you like it tomorrow is going to be grammar and manual day because these things are just as importent as the coding.And when I work in my schedule, the day after that is README day and correcting graphic days.That would mean we ship in 2 days. I’ll give my best to find enough time for that.Thanks for reading <3
Okay so I never want to see a link in a HTML project again for at least the next 2 weeks because I now added the image sources to the manual, and that was just some crazy work. I myself always keep every source throughout the whole project but that meant that I had 15 pages full of links and I only needed the ones for the images And some were even unnecessary because those images were deleted from the site through the whole project. I know this site is probably the ugliest one in this whole project but also one of the most important ones. I also worked on the grammar. There might be some little mistakes but I wrote it. English is not my mother tongue, and I typed far more than just a prompt into an AI. I also checked the mistake with the YT video but couldn’t find one. It would really help if others also checked if the vd in the TV does not work. Tomorrow is README day. We are really there. I still can’t believe it. And someone wrote me on slack that you can review your own project with any AI, and the AI really liked mine so fingers crossed that the first ship will get approved And my work paid off. Thanks for all your support, and I would really appreciate your help with the TV app. Thanks for reading <3 Here is the link: https://253-mathilde.github.io/My-first-OS/
Last Devlog (hopefully). Okay so before you judge me because I promised that I would ship yesterday: This README is massive and I gave my best to make it short but still well explained and yeah this was just so much work.Hope you like it. The TV should also work now.Finally, so maybe try it! https://253-mathilde.github.io/My-first-OS/ . I think that I’ll ship today. I really hope that everything works so pleaseeeeee I need some feedback. This project is just crazy and so many already like it.Can’t wait to see what you say to my next projetc idea. Thanks for your support and can’t wait to hear all the feedback. SO many hours of work.Hope they pay of.Thanks for reading <3.
Okay so I think I ship now ,just made some small changes (so my code is better to understand by others) and somehow they turned out to be an hour so yeah time to ship.Thanks for all your support and figers crossed that the first ship works!
Ships:
I made a Peter Pan and Tinkerbell-themed OS. At the beginning, the JavaScript was really hard because I had only worked with blocks of code, not actual code (maybe you know code.org — that’s what I mean). The graphics took me quite some time, as did all the brainstorming and planning, because I did my best to create a good structure. I explained the whole idea and the thought behind the theme in my README. On my site, you have two draggable windows (the Welcome window and the Journal app window), and you can write stuff in your little journals and create islands. (I also explained that in my README, but if you don’t want to read it: an island is a note, and I called it that because of the site’s theme.) My site also has a little slideshow in the Journal app that explains how to use everything. My Stardance profile is linked too, so you can check out my other project. The site also includes a timer at the top. I hope you like it, and I’m already collecting ideas for Mission Two. This text was corrected with AI.
Neverland OS is a web-based OS with a Peter Pan/Tinkerbell theme. Unlike other operating systems, Neverland OS doesn’t prioritize either design or performance. It tries to be good at both. It has a Notes app, a Music app, a Gallery app, a Game, a Video app, a NASA app, a Wikipedia app, a Hubble app, and a User Manual app. It also has mini apps like a search bar, a timer, weather, and more. My goal was to create something that looks unique. Because when we program, we often have other operating systems in our head. So we automatically put things where we are used to seeing them. But who said that window controls need to be on the right side of a window? And who said that all apps need to look like the ones we use every day? Don’t get me wrong. Those operating systems work great. But they already exist. So why not try something new? Neverland has a lot of hidden features (aka Easter eggs) and was built to have everything you need. Sometimes you don’t need a lot of apps. Just a music app to keep your focus up, a timer to motivate you, and something to write in. Of course, my OS can do way more than that. But when you are honest with yourself: you don’t really need much more than that. But who said that just because we don’t need that much, we have to work with ugly minimalistic stuff? Exactly. No one! So I gave my best to make it look cute. I hope you like it. And if you don’t, let me know! I often struggled with JS because I basically started from 0 knowledge. The Music app was especially difficult because it is so unique (yk so finding help online was impossible). I deleted stuff, made mistakes, broke things, and redid the graphics many times. There are way more hours in this project than you can see ( because I builded this thing on my old laptop in my holidays and that laptop breaks down everytime you use lapse). I took this project everywhere and spent almost every bit of free time I had on it.I worked on Neverland for 42 days. During that time I made over 500 deployments on GitHub, over 600 commits on GitHub, uploaded things millions of times because of GitHub issues, and wrote around 3,500 lines of code. I also tried my best to be transparent about the whole process. I wrote a Devlog about roughly every 2 hours. All instructions are in the OS or in the README. I gave my best with everything: the code, the graphics, the storytelling , the Easter eggs, and all the little details. I hope you like Neverland OS and have fun trying everything out. Sorry for my grammar or language mistakes. English isn’t my first language....
|
1792972425.3672495
|
1793058825.3672495
|