|
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...
|
1793065675.9670563
|
1793152075.9670563
|
|
19805
|
Tick Tock by @ryderklh | Stardance
|
ryderklh
|
5
|
85.0
|
988
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T12:39:47Z", "hours": 30.0, "multiplier": 12.69, "payout": 386, "blessing": "neutral", "text": "WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a Timer and a Stopwatch. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title automatically save in localStorage & url# Digital Clock 12-hour / 24-hour format 3 Font styles (Sans, Serif, Mono) Fullscreen mode (Header/Footer kept!) Smooth breathing colon animation automatically save in localStorage & url# ⭐Timer ⭐Mutiple timers at one page ⭐Keep going after refreshing website ⭐Circular progress bar ⭐Sortable timers ⭐Alarm and flash on completion ⭐Stopwatch ⭐Mutiple stopwatches at one page ⭐Keep going after refreshing website ⭐Sortable timers ⭐Able to lap and split ⭐Able to copy total time and laps info Time Progress Bar Export as image Switchable hide/show Pomodoro Timer Customable number of cycles Pause at any time Notification Sound Lightweight Light mode/Dark mode Quick link to other tools WHAT I LEARNT? A lot of new things about git How to write devlogs JS, Astro… TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif) ⭐Timer ⭐Stopwatch Time Progress Pomodoro Timer ⭐means new features of the previous ship", "repo": "https://github.com/klhrd/TickTock", "demo": "https://klhrd.github.io/TickTock"}, {"ship_num": 2, "ts": "2026-08-02T07:51:47Z", "hours": 22.0, "multiplier": 15.66, "payout": 346, "blessing": "neutral", "text": "WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a Pomodoro Timer and a Time Progress Displayer. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title automatically save in localStorage & url# Digital Clock 12-hour / 24-hour format 3 Font styles (Sans, Serif, Mono) Fullscreen mode (Header/Footer kept!) Smooth breathing colon animation automatically save in localStorage & url# ⭐Time Progress Bar ⭐Export as image ⭐Switchable hide/show ⭐Pomodoro Timer ⭐Customable number of cycles ⭐Pause at any time ⭐Notification Sound Lightweight ⭐Light mode/Dark mode ⭐Quick link to other tools ⭐means new features of the previous ship WHAT I LEARNT? A lot of new things about git JS, Astro… TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif) Time Progress Pomodoro Timer", "repo": "https://github.com/klhrd/TickTock", "demo": "https://klhrd.github.io/TickTock"}, {"ship_num": 3, "ts": "2026-07-15T07:24:47Z", "hours": 18.0, "multiplier": 7.76, "payout": 136, "blessing": "neutral", "text": "WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a beautiful, highly customizable Digital Clock. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features ⭐Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title ⭐Digital Clock ⭐12-hour / 24-hour format ⭐3 Font styles (Sans, Serif, Mono) ⭐Fullscreen mode (Header/Footer kept!) ⭐Smooth breathing colon animation automatically save in localStorage & url# Lightweight ⭐means new features of the previous ship WHAT I LEARNT? A lot of new things about Astro and NodeJS How to structure routes for multiple tools (Refactoring files) Advanced CSS (using global variables to adjust layout gaps dynamicly) REPLIES Thank you so much for the 115 stardust and the amazing feedback! I read every single review from Ship #2, and they helped me make this update so much better. 1. ABOUT MORE FEATURES Many suggested adding more tools or events. I turned the website into a Hub and built the Digital Clock as our second official tool! 2. ABOUT THE SCREENSHOT IN README Two reviewers mentioned adding screenshots. I’ve updated the README with fresh screenshots so people skimming through can see the UI instantly. TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif)", "repo": "https://github.com/klhrd/TickTock", "demo": "https://klhrd.github.io/TickTock"}, {"ship_num": 4, "ts": "2026-07-01T04:33:49Z", "hours": 13.0, "multiplier": 9.33, "payout": 115, "blessing": "neutral", "text": "WHAT I MADE/THINK? I made a long-term countdown timer for events. It’s really hard for me to build things in a way that is completely new to me. I’ve been stuck not only with programming languages but also with English. However, through this project (STARDANCE), though I didn’t create something really impressive, I think I learnt A LOT. Features Live Countdown Full mode ⭐Days mode Customizable ⭐Change Target Date ⭐Edit Event Title ⭐automatically save in localStorage & url# ⭐share btn Dark Mode UI ⭐means new features of the previous ship WHAT I LEARNT? basic GIT code basic HTML/CSS3/JS How to write DevLogs REPLIES I’ve read all the replies of the ship#1. And lots of them mentioned the same thing. Thanks to everyone who give me feedback. Hope there’s the better version of previous ships. 1. ABOUT CHANGEABLE TARGET Now you can pick any target date and even edit the event title right from the sidebar. 2. ABOUT LANGUAGE I’ve fully migrated the app to English now. 3. ABOUT DEVLOG I’ve leveled up my devlog game for this update—documented all the engineering details and bugs I fixed this time. TRY IT! 2027 New Year NC Finals Weekend US Open", "repo": "https://github.com/klhrd/TickTock", "demo": "https://klhrd.github.io/TickTock"}, {"ship_num": 5, "ts": "2026-06-16T15:10:14Z", "hours": 2.0, "multiplier": 2.98, "payout": 5, "blessing": "neutral", "text": "What I Made I made a Countdown Web App called “Tick Tock.” It shows the exact years, months, days, hours, minutes, and seconds left until January 1, 2027. What Was Challenging Calculating months and years was hard. Months have different days (28, 30, or 31), so I had to write smart JavaScript code to borrow days and keep the timer 100% accurate. What I Am Proud Of It Works!: Actually this is my first time using html to build a website. Clean Design: I fixed the layout bugs and made a dark-mode interface. How to Test It https://klhrd.github.io/TickTock/", "repo": "https://github.com/klhrd/TickTock", "demo": "https://klhrd.github.io/TickTock"}]...
|
[{"post_id": 64186, "ts": "202 [{"post_id": 64186, "ts": "2026-09-08T12:37:49Z", "hours": 0.7658, "text": "Devlog 52: GitHub Pages Audio Path Resolution Fixes Absolute Repository Subpath Hardcoding Replaced environment variable dynamic paths ( import.meta.env.BASE_URL ) with direct base-path URLs ( '/TickTock/sounds/alarm.wav' ) in playAlarm() . i have no idea why that happened"}, {"post_id": 62827, "ts": "2026-09-06T11:02:52Z", "hours": 0.4825, "text": "Devlog 51: Asset Migration Asset Directory Migration Moved audio assets ( alarm.wav and notif.wav ) from the static /public/sounds/ directory into the source-managed asset pipeline at src/assets/sounds/ . Module Import & Bundler Integration Replaced hardcoded absolute URL paths ( \"/public/sounds/...\" ) with explicit ES module imports ( import alarmSoundUrl from '../assets/sounds/alarm.wav' and import notifSoundUrl from '../assets/sounds/notif.wav' ) across timer.js and pomodoro.js ."}, {"post_id": 62807, "ts": "2026-09-06T10:16:06Z", "hours": 1.0094, "text": "Devlog 50 Layout Refactoring Scroll Restructuring Shifted .stopwatch-container layout from vertical wrapping ( flex-wrap: wrap ) to a single-row horizontal scroll track ( flex-wrap: nowrap with overflow-x: auto )."}, {"post_id": 62744, "ts": "2026-09-06T08:02:07Z", "hours": 2.8789, "text": "Devlog 49: Lap Data Export Plaintext Lap Data Serialization formatLapsOutput : a dedicated text formatter that converts active stopwatch data into structured tab-separated values (TSV) suitable for copying. Async Clipboard Copy Logic Implemented an async wrapper using navigator.clipboard.writeText() with built-in error handling ( try/catch ) and user alerts for unsupported environments or clipboard permission rejections. Interactive Copy Feedback UI Wired copyBtn click events to trigger text copying and dynamically update the button icon ( check or error ) and theme accent color."}, {"post_id": 60192, "ts": "2026-09-02T12:48:53Z", "hours": 1.0839, "text": "Devlog 48: DOM Selector Bugfixes & Homepage Quick Access DOM Query Selector & Reference Repairs Updated querySelector in updateListedStopwatch from target class .listed-stopwatch-demo to parent wrapper .listed-stopwatch[data-id=\"...\"] , resolving element lookup failures during live updates. Homepage Integrated direct links and dedicated preview cards for the Stopwatch application into index.astro and BaseLayout.astro ."}, {"post_id": 59556, "ts": "2026-09-01T13:21:58Z", "hours": 0.6392, "text": "Devlog 47: Pause Compensation Pause Duration Offset Implemented pauseDuration calculation Date.now() - pauseStartTime during resume actions status === \"paused\" . Shifted all existing lap timestamps lap.endTime += pauseDuration forward to subtract paused time intervals. State-Aware Timestamp Resolution Standardized timestamp evaluation across renderers handleLap , renderListedStopwatch , updateListedStopwatch , and updateCardUI using ternary state checks: const now = stopwatch . status === \" running \" ? Date . now () : stopwatch . pauseStartTime ;"}, {"post_id": 58906, "ts": "2026-08-31T13:58:04Z", "hours": 1.9278, "text": "Devlog 46: UI Fine-tuning & Timing Logic Optimization Lap Calculations -Replaced laps.forEach with for (let j = 0; j <= i; j++) to ensure cumulative total times ( totalMS ) strictly correspond to the current lap index. Layout Enhanced formatTime() rendering logic by applying inline styles width , transform: scaleX(0.8) , text-align: center to dynamic span elements, preventing font-width shifting during rapid ticker updates. Dynamic Rendering Integrated updateListedStopwatch() into the global interval loop, enabling sidebar preview labels to tick synchronously with active main cards. Optimized state updates to target individual time elements instead of triggering full list re-renders on every ticker frame. Added optional chaining laps?.[0]?.startTime across rendering pipelines to prevent runtime exceptions when initializing empty stopwatches."}, {"post_id": 57947, "ts": "2026-08-30T08:58:55Z", "hours": 3.6403, "text": "Devlog 45: Initial Stopwatch Logic & Dynamic State Scaffolding Core State & Lap Data Architecture Designed a stopwatch schema tracking dynamic state ( idle | running | paused ) and an array of individual lap records ( laps ). Streamlined time calculation to compute elapsed milliseconds dynamically directly using timestamps ( Date.now() - lap.startTime ), eliminating redundant accumulator fields like startTime or elapsedTime . Interactive Handlers & Lifecycle Operations Implemented core lifecycle handlers: handleStart , handlePause , handleReset , handleLap , and handleDelete . Integrated updateCardUI and updateCardBtns to reflect running, paused, and idle UI visual feedback dynamically. Built active DOM updates for lap histories inside updateCardLapGrid using index-based duration summation for lap and total times. Enabled global runtime updates via startGlobalTick() timer intervals and list reordering via handleMoveStopwatch() ."}, {"post_id": 57110, "ts": "2026-08-29T06:40:01Z", "hours": 1.7286, "text": "Devlog 44: Stopwatch Layout Template & Layout Migration Ported side-menu and main container structures from Timer to Stopwatch layout ( index.astro ). Structured sidebar elements: .stopwatch-adding-action-btn and .stopwatch-list-container for dynamic item injection. Added template placeholders ( #listed-stopwatch-template and #stopwatch-card-template ). Stopwatch Card & Lap Data Display Integrated core display components: .stopwatch-text and .stopwatch-text-sub . Created interactive control group ( .stopwatch-card-action-btn ) supporting Start, Pause, Replay, and Lap actions. Designed a 3-column CSS Grid table ( .stopwatch-lap-container ) to organize lap metrics ( i , lap , total )."}, {"post_id": 55411, "ts": "2026-08-27T06:58:34Z", "hours": 0.3914, "text": "Devlog 43: Timer Integration & Navigation Update Navigation & Home Page Integration Added Timer card entry to the main landing page ( tool-card layout with hourglass Material symbol). Added direct Timer link to the global navigation bar in BaseLayout.astro . Feature Branch Merge Merged feature/timer-main into main , bringing in the new /timer page route, timer.js logic, sound assets ( alarm.wav ), and updated layout components. YEAYYY"}, {"post_id": 55007, "ts": "2026-08-26T13:10:35Z", "hours": 1.7997, "text": "Devlog 42: Timer Reordering & List Re-Sorting Reordering UI Controls Added .sort-action control group with .sort-up and .sort-down arrow buttons to the template layout. Dynamic Array Mutation & Re-rendering Implemented handleMoveTimer(id, direction) to handle array element swapping with upper and lower boundary bounds checks. Bound click handlers in renderListedTimer() to execute reordering operations, trigger LocalStorage updates, and instantly re-render the UI layout via renderAll() ."}, {"post_id": 54924, "ts": "2026-08-26T04:43:44Z", "hours": 0.4733, "text": "Devlog 41: Dual-Text Display & Running Animation Sub-Text Total Duration Display Added .timer-text-sub element inside the ring container to preserve and display the initial totalSeconds value. Styled sub-text using lighter font weights and var(--text-muted) . Dynamic Running Visual Effects Added .is-running state toggle based on timer.status === \"running\" . Implemented @keyframes timer-text-flash pulsing animation to provide continuous visual feedback while countdown is active."}, {"post_id": 54897, "ts": "2026-08-26T03:33:47Z", "hours": 1.2658, "text": "Devlog 40: Alarm Audio & LocalStorage Independent Alarm Audio Handling new Audio() allowing each finished timer to play independent looping sound effects concurrently. Bound alarm termination directly to handleReset() and handleDelete() . LocalStorage Serialization Fixes Sanitized timer state object before serialization in saveTimers() by stripping transient DOM/Audio references ( alarmAudio ) to prevent JSON stringification crashes. Added type validation ( typeof alarmAudio.pause === \"function\" ) inside stopAlarm() to prevent runtime TypeError issues during state rehydration. Post-Reload Alarm & Visual Sync Updated renderAll() to resume alarm sound playback and background pulse animation for ended timers across page reloads. Cleared endTime correctly during timer reset to normalize state lifecycle. alarm.wav Using LMMS to create alarm.wav for the alarming when timer.status===\"ended\" ."}, {"post_id": 54221, "ts": "2026-08-25T03:40:02Z", "hours": 0.5936, "text": "Devlog 39: Smooth Action Button Transitions Button Collapse & Spacing Animate Added max-width , margin: 0 , and padding: 0 constraints to .is-hidden to smoothly collapse hidden buttons without leaving blank layout gaps. Expanded base state with explicit max-width boundary to allow width-based CSS transitions. much smoother ♪(´▽`)"}, {"post_id": 53651, "ts": "2026-08-24T09:46:13Z", "hours": 4.4989, "text": "Devlog 38: Multi-Timer Logic & Bug Fixes JS Managed multi-timer state using plain object arrays. Implemented saveTimers() and loadTimers() for LocalStorage persistence. Linked input fields with setupArrowBtns() to handle unit value increment and decrement bounds. Cloned <template> elements to dynamically generate sidebar list items and main cards via renderAll() . Added item deletion logic via handleDelete() to update state and UI. Established a startGlobalTick() loop running every 200ms using endTime offsets to prevent background tab drift. Calculated SVG circle strokeDashoffset dynamically based on remaining time ratios. Debugging & UI Patching Placing <template> tags inside slot=\"template-content\" . Adding missing id=\"timer-container\" . .textContent.textContent to .textContent Data.now() to Date.now() . timers.status to timer.status . finally got multi-timer state and progress rings syncing properly… bugs fixed and back to smooth sailing…"}, {"post_id": 52458, "ts": "2026-08-22T16:09:04Z", "hours": 7.2022, "text": "Devlog 37: Multi-Timer UI Layout & Input Controls Form Inputs & Adjustments Built HH/MM/SS number input boxes with range limits and zero-padding logic on blur. Implemented stepper adjustment buttons for quick time value tweaking. Sidebar Timer List Layout Added sidebar timer list container to preview user-created countdown items. Integrated quick action delete buttons for item removal. Main Dashboard Circular Timer Constructed countdown card layout featuring SVG dynamic progress ring. Centered time readout using tabular-nums formatting to eliminate number jitter. Action Control Group Laid out card control buttons including play, pause, and replay. the ui was so tiring… i DID remember to open a new branch (feature/timer-main) …"}, {"post_id": 39335, "ts": "2026-08-02T07:50:09Z", "hours": 0.4922, "text": "Devlog 36: Update Docs & Merge Update Docs Readme: Add the links of the new tools Ship#4: Write Ship#4.md Merge!!!!! Merge feature/pomodoro into main Fortunately no error poping out!"}, {"post_id": 39323, "ts": "2026-08-02T07:15:21Z", "hours": 0.8742, "text": "Devlog 35: Pomodoro State Transition & Auto-Loop Refactoring Core Logic & State Fixes Auto-Phase Transition Fix : Resolved state lock ( status: 'running' ) preventing automatic transition from Focus to Break. Added explicit status resetting in handlePhaseEnd before invoking startTimer . Timer Precision : Replaced Math.round with Math.ceil in countdown logic to eliminate early sound triggers caused by rounding errors. Timestamp Recalibration : Implemented dynamic endTime re-calculation when switching modes ( work ↔ break ) to maintain state consistency."}, {"post_id": 39287, "ts": "2026-08-02T05:00:19Z", "hours": 2.2125, "text": "Devlog 34: Pomodoro Core Timer & Segmented Timeline Integration Features Implemented static audio notification system via HTML5 Audio API targeting public/sounds/notification.mp3 . Architecture & State Management Implemented timestamp delta verification ( endTime - Date.now() ) to maintain countdown accuracy during background tab throttling or page reloads. Decoupled primary control actions across main page and sidebar controls ( #menu-start-btn , #cycles-input ). Bug Fixes & Refactoring Fixed ReferenceError during event initialization by enforcing state argument scoping within bindEvents . Refactored loadStateFromLocalStorage parsing logic to filter \"undefined\" string literals and clear corrupted cache gracefully."}, {"post_id": 37493, "ts": "2026-07-30T08:56:03Z", "hours": 4.0386, "text": "Devlog 33: Pomodoro Segmented Timeline & Layout Integration Segmented Timeline Layout Integrated BaseLayout slots for the new Pomodoro page, separating sidebar settings from the main dashboard. Built a visual segmented timeline ( .timeline-track ) with flex-proportional work/break segments and a dynamic progress pin ( .timeline-pin ). Core Logic & State Setup Refactored state object fields ( workDuration , breakDuration , timeRemaining ) to ensure clean state initialization. Added timestamp delta checking on startup to preserve accurate remaining time across page reloads or background tabs."}, {"post_id": 36218, "ts": "2026-07-28T04:48:53Z", "hours": 0.3056, "text": "Devlog 32: Dynamic Canvas Aspect Ratio Calculation Features & Refactoring Implemented dynamic aspect ratio calculation for PNG exports ( Height = 140 * Count + 180 ). Applied responsive auto-scaling for .export-canvas to ensure optimal vertical spacing regardless of selected cards count. Merged feature/export-image branch into main after verifying clean template rendering and correct node referencing."}, {"post_id": 36205, "ts": "2026-07-28T04:19:06Z", "hours": 2.29, "text": "Devlog 31: Template Canvas Architecture & Reference Refactoring Independent Canvas Architecture Replaced direct DOM manipulation of live dashboard elements with a dedicated, off-screen template canvas ( .export-canvas ). Cloned active .progress-card elements into an isolated container ( .export-cards-holder ), ensuring the on-screen UI remains completely untouched and non-flickering during image generation. Moved aspect ratio, high-resolution dimensions (600x600), padding, and font-scaling rules directly into CSS for clean separation of concerns. Error Fixes & Cleanup Fixed ReferenceError caused by leftover references to targetContainer and stampEl inside initExportImageFeature . Updated html2canvas target from main dashboard container to the temporary canvasEl . Streamlined fallback DOM cleanup logic inside the try...catch block to guarantee off-screen elements are properly garbage collected."}, {"post_id": 35003, "ts": "2026-07-26T04:47:24Z", "hours": 1.3903, "text": "Devlog 30: Image Export Feature & Template Refactoring Image Export Feature Integrated html2canvas library to enable one-click PNG image export of the active progress dashboard. Added an “Export as Image” button inside the custom sidebar menu with dedicated styling. Handled theme-aware background rendering by dynamically querying computed global CSS variables ( --bg-app ). DOM Template & Dynamic Watermark Refactored dynamic watermark creation using the HTML <template> element ( #export-watermark-template ), cleanly separating DOM structure from JavaScript execution logic. Configured dynamic timestamps using now.toLocaleString() to inject real-time snapshot dates and times into exported images. Added ignoreElements filtering in html2canvas to prevent unchecked/hidden .progress-card elements from creating top/bottom visual gaps in exported images. Bug Fixes & Refactor Fixed a TypeError on insertBefore / appendChild by referencing clone.firstElementChild to extract the correct Element Node from DocumentFragment . Resolved HTML/JS ID typos ( export-watermark-template ) and method call mismatches to ensure reliable script execution."}, {"post_id": 33941, "ts": "2026-07-24T08:29:42Z", "hours": 0.9675, "text": "Devlog 29: URL Hash Sync, LocalStorage Persistence & Universal Share Event URL & State Persistence Integrated URL Hash ( #year,month,... ) and localStorage synchronization into time-progress.js to preserve users’ toggle preferences across reloads and shares. Added a hashchange event listener to ensure UI check states dynamically update when users use browser navigation (Back/Forward). Centralized Layout Share Event Refactored the #share-menu-btn event listener into BaseLayout.astro , eliminating duplicate share logic across individual tool pages. Leveraged document.title dynamically to provide clean, contextual titles for native Web Share API and clipboard copy fallbacks."}, {"post_id": 33891, "ts": "2026-07-24T05:26:11Z", "hours": 1.0658, "text": "Devlog 28: Layout Overflow Fixes and UI Polish Layout & Scrollbar Stability Added scrollbar-gutter: stable to html in global.css to reserve vertical scrollbar space, preventing horizontal overflow caused by layout reflow. Applied overflow-x: hidden to main containers and .progress-card to prevent percentage tags and thumbs from clipping past container edges at 100%. CSS Rule Corrections Fixed CSS property error by setting .track width to 100% instead of unitless value. Fine-tuned progress bar wrapper styles to ensure smooth visual layout under both dark and light themes."}, {"post_id": 33283, "ts": "2026-07-23T02:15:39Z", "hours": 4.0661, "text": "Devlog 27: Time Progress Bar Feature Porting and JS Modular Refactoring Astro Slot Architecture & CSS Variable Integration Ported the standalone Time Progress Bar tool into the Astro layout system using designated slots ( #head , #header-content , #custom-menu , and #main-content ). Converted hardcoded hex colors into semantic global theme CSS variables ( --accent-color , --component-bg-standard , --text-heading ), ensuring native support for Dark and Light mode toggling. Replaced the dropdown filter with sidebar multi-select checkboxes for custom control over visible time progress units. JavaScript Modular Refactoring & Bug Fixes Decoupled single-script logic into dedicated, single-responsibility functions ( initSidebarToggles , calculateTimeProgress , updateTicksUI , updateProgressCardUI , and updateSingleCardUI ). Resolved JavaScript syntax errors, including missing function keywords, JS Automatic Semicolon Insertion (ASI) line-break issues on return statements, and uncalled Date method parentheses. Streamlined animation frame rendering by passing structured data from math calculations directly into UI updater functions."}, {"post_id": 32236, "ts": "2026-07-21T08:41:47Z", "hours": 0.8689, "text": "Devlog 26: Typo Correction and Expandable Directory Menu Typo Correction Fixed property naming error from –accent-contract-text to –accent-contrast-text in global CSS. Expandable Tools Directory Converted static directory links into a native component with smooth arrow rotation styling. Enabled server-side open status via open={isHomePage} in BaseLayout, defaulting to expanded on the home hub and collapsed on sub-tool pages."}, {"post_id": 31792, "ts": "2026-07-20T13:53:15Z", "hours": 1.3728, "text": "Devlog 25: Theme Toggle Implementation with Dark and Light Modes Light Theme Tokens Override Added :root[data-theme=“light”] in global.css to swap semantic theme variables for light background, borders, and high-contrast amber accents. Preserved existing component styles while smoothly transitioning body colors on theme switch. Sidebar Toggle Component and Logic Integrated a theme toggle button (#theme-toggle-btn) inside the BaseLayout header actions. Built persistent theme state logic using localStorage and system prefers-color-scheme detection. Used textContent on icon elements to dynamically switch between dark_mode and light_mode icons without type errors."}, {"post_id": 31215, "ts": "2026-07-19T13:11:06Z", "hours": 2.2447, "text": "Devlog 24: Color Architecture Refactoring with Design Tokens Two-Tier CSS Variables Global Tokens: Extracted hardcoded hex colors into primitive color names inside global.css. Theme Tokens: Created a semantic layer mapping elements like –bg-app and –accent-color directly to global tokens. Clean Codebase Update Component Styles: Replaced absolute colors across the layout, dashboard hub, countdown, and clock templates with var() variables. Script Alignment: Updated dynamic checkmark colors in JavaScript to read –accent-color instead of raw hex values. Future Scope: The design is now fully abstracted, meaning light mode implementation will only require token swapping without editing individual component code."}, {"post_id": 28755, "ts": "2026-07-15T06:57:18Z", "hours": 0.2736, "text": "Devlog 23: Global Branding Relocation and Logo Navigation Moving Title Label to BaseLayout Unifying the brand and improving UX Header Linkification : Refactored the main title-label (“TickTock”) out of individual page templates and integrated it directly into the global BaseLayout.astro . Back-to-Home UX : Wrapped the brand title in an <a> tag. Now, clicking the brand logo on any sub-tool instantly routes the user back to the home dashboard Hub, offering an intuitive, web-app-like navigation experience."}, {"post_id": 28732, "ts": "2026-07-15T05:22:01Z", "hours": 0.4186, "text": "Devlog 22: F11-Equivalent Fullscreen via Root Element Standardizing Fullscreen to document.documentElement Fixing disappearing layout elements The Pitfall : Previously, calling requestFullscreen() on the individual #clock-screen container caused the browser to isolate it from the DOM layout. This triggered default browser styling which rendered a pitch-black backdrop, and completely hid crucial layout parts like the header, footer, and side menu buttons. The Solution : We shifted the fullscreen API target from the sub-container directly to document.documentElement (the global <html> node). This aligns the button’s behavior perfectly with standard keyboard F11 fullscreen events. The Result : All global UI elements (header, footer, navigation) now scale smoothly and remain perfectly visible and interactive without any layout shifts or z-index clashing."}, {"post_id": 28188, "ts": "2026-07-14T09:57:23Z", "hours": 1.1836, "text": "Devlog 21: Architecture Normalization and Layout Fine-Tuning Directory Restructuring & Future-Proofing Preparing for scalability Digital Clock Renaming : To prevent future routing conflicts as the project scales, we successfully renamed clock.js to digital-clock.js and adjusted the main page path to /src/pages/digital-clock/ . This cleanly isolates this feature from upcoming modules like World Clock or Pomodoro Timer. Dependency Clean-up : Updated all asset paths and module script injections across the hub, fully standardizing the multi-tool routing structure under the /TickTock/ basePath. Layout Fixes with Global CSS Variables Resolving invalid CSS properties via JS injection Replacing Non-Standard Styles : Fixed a crucial layout issue where arbitrary if(...) conditions inside CSS were breaking colon component constraints. Dynamic Width Injection : Migrated the layout parameters directly into digital-clock.js using the standard document.documentElement.style.setProperty API. The .colon element now seamlessly reads the responsive --clock-colon-width CSS variable, adapting perfectly across Sans, Serif, and Mono configurations without any jumping side effects."}, {"post_id": 28133, "ts": "2026-07-14T07:16:36Z", "hours": 2.5658, "text": "Devlog 20: Settings Memory and Dynamic Sharing Adding Setting Memory and URL Sync Keeping your clock layout saved Persistent settings : The clock now remembers your favorite layout. Your choice of time format (12/24h) and font style is instantly saved directly to your browser’s local storage. URL sync : We linked these settings directly to the URL hash (like #12hr&mono ). When you refresh or load the page, your exact preferred theme loads up right away. Smart Sharing and Hub Integration Spreading the time and completing the hub Dynamic sharing : Added a share button that grabs your exact custom clock URL. It uses the Web Share API when available, and easily falls back to copying the link to your clipboard with a smooth checkmark animation on success. Connecting the dashboard : Linked the completed clock page to our homepage hub grid and updated the site layout, officially making TickTock a multi-tool station."}, {"post_id": 27501, "ts": "2026-07-13T03:45:40Z", "hours": 3.5772, "text": "Devlog 19: Building the Adaptable Digital Clock Implementing Native Date Formatting Problem : The clock header needed to show the full current date (e.g., “Sunday, July 12, 2026”) dynamically without taxing browser performance or importing heavy external date libraries. Solution : Added a #date-label placeholder to the template and used the native JavaScript toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }) inside the main runtime loop to render lightweight, perfectly formatted timestamps on every update. Creating Fluid Visual Oscillations via Math.sin() Problem : Traditional blinking colons look rigid and distracting, failing to deliver a premium, organic feel for an active time-management tool. Solution : Avoided simple CSS toggles and leveraged a true trigonometric formula inside a requestAnimationFrame loop. By mapping high-precision timestamps through Math.sin() , the opacity gracefully curves between 0.2 and 1.0 , producing a perfectly smooth, wave-like breathing animation. Binding Custom Display and Layout Controls Problem : The interface required instant controls for 12/24-hour formats, font adjustments, and a standalone full-screen view while managing layout side effects. Solution : Wired up event listeners to modify global runtime states and inline CSS font families on the fly. Integrated the HTML5 Fullscreen API onto the #clock-screen element, backed by a global fullscreenchange listener to seamlessly catch manual ESC escapes and keep the toggle button states perfectly in sync."}, {"post_id": 26388, "ts": "2026-07-11T04:39:33Z", "hours": 0.4408, "text": "Devlog 18: Adding Hub Sharing Functionality Integrating Client-Side Script Safely Implementing the Homepage Share Button Problem : The dashboard needed a simple button to share the current hub URL, but running browser APIs directly could break Astro’s static site generation (SSG) compiler. Solution : Added an inline <script is:inline> block to the index page. This bypasses the server-side build process and safely binds the sharing and clipboard logic only when the page loads in the user’s browser."}, {"post_id": 25792, "ts": "2026-07-10T07:52:27Z", "hours": 1.6289, "text": "Devlog 17: Project Hub and README Expansion Moving from a Single Page to a Tool Hub Goal : Transformed TickTock from a single countdown page into a comprehensive time-management utility hub powered by Astro. Implementation : Created a main dashboard page ( src/pages/index.astro ) to serve as the gateway for current and future time tools, using a shared layout for a consistent user experience. Adding Future Roadmap and Project Documentation Goal : Wrote a complete README.md to document the new project architecture, local testing steps, and automated GitHub Pages deployment. Future Vision : Updated the repository roadmap to announce upcoming tools built for the Hack Club Stardance event, including a Pomodoro Timer, World Clock Board, Minimalist Timer, and Time Progress Bars."}, {"post_id": 24763, "ts": "2026-07-08T15:29:37Z", "hours": 1.7703, "text": "Devlog 16: Dashboard Layout Fixes Fixing Layout and Compression Issues Compressed Card Icons Problem : The card icons shrank and deformed when the screen size changed. Solution : Added flex-shrink: 0; to the icon class to force them to keep their correct size. Cards Stacking Vertically Problem : The tool cards unexpectedly stacked into a narrow, single column right in the middle of the screen. Even though there was plenty of empty space on both sides of the desktop browser, the grid refused to expand horizontally and display the cards side-by-side. Troubleshooting : The grid’s layout formula was correctly set to repeat(auto-fit, minmax(250px, 1fr)) , which should have allowed multiple columns. However, the parent container ( .home-container ) was set to display: flex with align-items: center . In a vertical Flexbox layout, this alignment forces child elements like the grid to shrink to their absolute minimum width based on content, instead of filling the screen. To make matters worse, a strict max-width: 300px; was hardcoded onto the .tool-grid . Since two cards plus their gaps required at least 525px to sit side-by-side, the 300px restriction made it mathematically impossible for the browser to create a second column. Solution : Removed the restrictive max-width: 300px; from the grid and replaced it with a generous max-width: 1200px; to allow proper breathing room on large screens. Added width: 100%; to the grid class, forcing the grid container to break out of the Flexbox compression and stretch completely across the parent container. This allowed the responsive auto-fit engine to finally see the available width and cleanly arrange the cards into multiple columns. Fixing Grid Spacing and Syntax Errors Layout Breaking Off-Screen Problem : The grid expanded past the screen edges and cut off the card content. Solution : Added box-sizing: border-box; to the main container so that padding is counted inside the total width. Broken Units and Side Scrollbars Problem : An annoying horizontal scrollbar appeared at the bottom of the page. Solution : Fixed a typo where width: 100sww; was written instead of 100svw , and added body { margin: 0; } to clear default browser spaces."}, {"post_id": 24045, "ts": "2026-07-07T10:37:16Z", "hours": 5.7283, "text": "Devlog 15 Phase 1: Creating the Skeleton and Splitting Components Overextending the Style Files The project started as a single page where all HTML, CSS, and JS lived together. When I created the unified BaseLayout.astro , I kept the old global.css . However, that file had specific styles just for the countdown page, which broke the layout of the new homepage. Cleaning Up Style Pollution To fix this, I moved the countdown-specific CSS directly into the <style> tag of the countdown page ( index.astro ). Astro automatically confines these styles to their own page, ensuring they no longer mess up the homepage layout. Phase 2: Fixing Astro’s Route Misinterpretation Keeping Scripts in the Wrong Folder I originally placed the logic script ( script.js ) inside the src/pages/countdown/ folder to keep it close to the page. During local testing, Astro threw an error saying there was no API route handler for that JavaScript file. Moving Scripts to a Dedicated Folder I learned that Astro treats every file inside src/pages/ as a public URL or an API route. To fix this, I moved the file to a new src/scripts/ folder and renamed it countdown.js , keeping the pages folder strictly for actual web pages. Phase 3: Resolving Build Crashes from File Names Using Special Characters in Names Inside my documentation folder, I named a development note file ship#2.md . When I ran npm run build , the entire build process crashed immediately with a path error. Removing the Broken Characters The build tool (Vite) treats the # symbol as a URL anchor link, which breaks file path reading. I renamed the file to ship2.md , and the system was able to parse the path and build successfully. Phase 4: Overcoming the Environment Conflict (Server vs. Client) Running Browser Code on the Server This was the biggest challenge. When I imported countdown.js into the page, the build failed multiple times, throwing errors like window is not defined and document is not defined . Protecting the Code with Environment Guards Astro runs pages on the server to generate static HTML during the build step. Because Node.js does not have browser features like window or document , the script crashed. I fixed this with two steps: I imported the script using the ?url suffix in Astro so the server only records its path instead of running it. I wrapped all the browser-specific logic inside a typeof window !== \"undefined\" check. This ensures the script stays quiet during the server build and only runs once it reaches the user’s browser."}, {"post_id": 19753, "ts": "2026-07-01T04:23:10Z", "hours": 0.8367, "text": "Devlog 14: Localization Migration and Pre-Ship Consolidation UI Text Internationalization Migrated all hardcoded multi-byte interface character arrays across template structures ( index.html ) and operational state modules ( script.js ) into standardized Western European typography strings. Refactored semantic definitions within input control placeholders and baseline reference containers to achieve uniform structural layout scaling under single-byte font rendering constraints. Documentation and Release Management Compiled a foundational system architectural reference ( README.md ) specifying setup logic, reactive routing hooks, and custom persistence implementations. Executed full client-side behavior validations on state-tracking components ahead of the definitive production deployment pipeline for Ship #2."}, {"post_id": 19164, "ts": "2026-06-30T12:38:15Z", "hours": 2.1061, "text": "Devlog 13: Native Sharing Integration and Address Synchronization Control Native Sharing and Fallback Mechanics Integrated a social propagation module ( #share-menu-btn ) inside the header actions block, utilizing the Web Share API to access native mobile distribution panels. Engineered an automated asynchronous clip fallback sequence that overrides processing blocks on unsupported desktop environments, programmatically duplicating host URL hashes via the navigator clipboard asset pool. Applied stateful visual interaction hints onto the interactive sharing interface, dynamically toggling system icons to verify action fulfillment before returning properties to base states. Hash Serialization and Router Interdependency Fixes Resolved an critical structural validation bug inside the initial state loader ( loadInitialState ) where an premature execution return statement truncated processing flows, preventing state restorations. Re-architected data assignment flows inside initialization cycles ( initTimer ), deploying window.history.replaceState() to inject fully compiled variable string parameters back into empty browser URI paths. Secured total address compliance across baseline entries, guaranteeing structural data layers are available to secondary network nodes even when sharing operations occur prior to custom value updates."}, {"post_id": 18227, "ts": "2026-06-29T09:35:11Z", "hours": 0.5422, "text": "Devlog 12: Fluid Typography and Viewport-Adaptive Interface Spacing Viewport-Proportional Layout Calibration Implemented fluid layout scaling mechanics across the primary text blocks utilizing the CSS clamp() function, anchoring layout metrics dynamically between absolute pixel boundaries and relative viewport height units ( vh ). Re-architected spacing margins below the core header display ( #event-label ) to smoothly scale inside an adaptive range ( clamp(5px, 2vh, 30px) ), optimizing structural vertical padding on shifting device orientations. Calibrated upper layout boundaries for the structural footer element ( #target-label ) using fluid scaling boundaries ( clamp(15px, 3vh, 40px) ), ensuring consistent geometric clear space relative to adjacent countdown blocks. Text Alignment and Flow Refactoring Transformed the target calendar description layer ( #target-label ) from inline formatting definitions into explicit block layout models ( display: block ), stabilizing custom spacing calculations and forcing uniform horizontal element boundaries. Enforced complete cross-axis block isolation by assigning absolute width restrictions ( width: 100% ) onto trailing description elements, smoothly pushing metadata strings down beneath the dynamic flexible tracking container."}, {"post_id": 18207, "ts": "2026-06-29T08:34:16Z", "hours": 1.9631, "text": "Devlog 11: Modular Display Mode Architecture and Layout Jitter Resolution Feature Implementation & State Persistence Introduced a feature toggle layout inside the sidebar control node, offering real-time transitions between comprehensive chronological breakdowns and solitary metric configurations. Wired state persistence modules utilizing the local browser data subsystem ( localStorage ) to preserve client display configurations across session cycles and application reboots. Updated the data ingestion routing logic ( loadInitialState ) to safely aggregate user layout states without stepping over parameter strings delivered via URL fragment references. Precision Calculation & Dynamic Interface Masking Integrated an isolated decimal extraction calculation routine within the interval processing tree ( updateTimer ) dedicated to managing strict single-unit tracking parameters. Configured programmatic style visibility switches across atomic timer components, enforcing clean element masking on non-applicable duration counters when single-unit modes trigger. Typographic Stabilization & Layout Shifting Mitigation Corrected a severe layout jitter anomaly inside flexible grid clusters caused by variable font character dimensions shifting container boundaries during fast string state invalidations. Implemented font-variant-numeric: tabular-nums to enforce strict monospaced numeral allocation, keeping external box dimensions static regardless of structural text mutations. Introduced a dynamic responsive structural modifier block ( .mode-single ) to adjust component paddings, implement generous baseline tracking, and elevate text sizing bounds when processing simplified metrics."}, {"post_id": 17619, "ts": "2026-06-28T14:25:59Z", "hours": 1.4517, "text": "Devlog 10: Structural File Extraction and Modular Synchronization Stability Code Base Decomposition and Externalization Refactored the unified codebase by isolating inline design frameworks and layout scripts into dedicated style.css and script.js internal resources. Streamlined index.html structure down to essential structural markup definitions, using external linkages to boost source reading efficiency and code maintainability. Character Processing and Stability Verification Verified text encoding boundaries across external routing changes to preserve multibyte text inputs (“目標日”, “目標”) without producing character distortion issues. Maintained responsive flex alignments and layout fluid bounds on smaller screens while decoupling runtime system layers."}, {"post_id": 16999, "ts": "2026-06-27T16:08:49Z", "hours": 1.4744, "text": "Devlog 09: Synchronization Bug Fixes and URL Component Decoding Argument Reference and Logic Rectification Corrected a ReferenceError inside the titleInput listener by swapping an un-sanitized token ( newDate ) with the valid, persistent variable targetString . Fixed an assignment error where a single operator ( if(newTitle=\"\") ) muted intended comparison logic, replacing it with a strict equality check ( newTitle === \"\" ). URL Normalization and Component Decoding Integrated decodeURIComponent() into loadInitialState() and the hashchange observer to prevent percent-encoded character corruption. Resolved text distortion for multibyte layouts (e.g., Chinese characters), ensuring continuous string fidelity across shared links. Established a default text fallback (“目標”) to secure interface rendering stability during empty input states."}, {"post_id": 14154, "ts": "2026-06-23T04:14:30Z", "hours": 0.9578, "text": "Devlog 08: Viewport Configuration and Responsive Layout Calibration Viewport Meta Integration and RWD Layering Integrated the standard responsive configuration tag <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"> into the document structure header. Resolved a layout compression behavior where mobile rendering engines applied fallback desktop scaling parameters (typically a virtual width of 980px), forcing severe global downscaling on compact displays. Enabled native device pixel scale translations, forcing media container thresholds to evaluate against true hardware dimensions rather than high-density viewport projections. Fluid Grid and Token-Based Scaling Fixed an interface clipping issue where structural boundaries failed to dynamically contract on viewport widths below 600px. Activated the custom @media (max-width: 600px) breakpoint directives, downscaling internal flex container gaps from 15px to 10px and adjusting modular countdown component nodes for enhanced display symmetry. Re-calibrated proportional font metrics across mobile layouts, mapping secondary tracking units down to a structured 1.6rem baseline and bringing the primary title signature to an optimized 2rem boundary. Cross-Platform Interface Layout Fixes Restructured flex-wrap component mechanics within the core visualization container to smoothly adapt from unified desktop rows into multi-line mobile block grids. Eliminated persistent scrollbar overheads on handheld viewports by normalizing absolute coordinate assets and applying elastic percentage constraints across core elements."}, {"post_id": 13621, "ts": "2026-06-22T10:22:17Z", "hours": 0.3853, "text": "Devlog 07: URL Hash Routing Priority and Timer Encapsulation Debugging Feature and Priority Cascading Extended the state management architecture to support deep-linking properties using URL fragments (window.location.hash). Established a strict target resolution cascading hierarchy where URL fragment inputs take precedence over local user configuration memory, which in turn overrides the default fallback value (URL Hash > LocalStorage > “2027-01-01”). Implemented a regex filter pattern ( /^\\d{4}-\\d{2}-\\d{2}$/ ) to sanitize incoming window location string tokens prior to committing them to the execution state. Refactoring and State Synchronization Modularized individual timer logic fragments into a single initialization routine initTimer() . This routine synchronously updates text container parameters, binds default input values, clears residual interval clocks, and re-allocates tracking loops. Modified input element state transformation bindings to mirror newly elected target values into the URL fragment row (window.location.hash) concurrently with local system memory blocks. Resolution of Block Scope Diagnostics Scope Overlap Fix: Corrected a critical runtime ReferenceError located inside the initTimer() wrapper where repeating the let primitive on the timerId reference allocated a local block-scope variable that collided with pre-initialization clear routines. Removing the redundant declarative keyword reinstated proper execution. -Missing Invocation Fix: Appended an initial entry point declaration initTimer(targetString) to successfully boot up active countdown cycles on fresh page load sequences."}, {"post_id": 13112, "ts": "2026-06-21T13:27:59Z", "hours": 0.9197, "text": "Devlog 06: Sidebar Menu and Persistent LocalStorage Integration Requirements and Architecture Adopted the HTML5 semantic element to create a dedicated, off-screen sidebar panel for user controls, separating configuration options from the main countdown content. Integrated Google Material Icons stylesheet to render interactive trigger (“menu”) and dismissal (“close”) action elements. Implemented a native calendar interface using to capture target date modifications directly from the client view. Styling and Motion Mechanics Utilized fixed positioning (position: fixed) to pin the sidebar along the right viewport boundary, utilizing full height (100vh) to serve as a slide-out drawer. Applied transform: translateX(100%) to fully obscure the panel behind the right viewport edge by default, attaching a smooth CSS transition property (0.3s ease). Created a structural “.open” modifier class applied to the sidebar element (sidebar.open) that neutralizes the horizontal translation (translateX(0)) to bring the drawer into view upon click events. State Persistence via LocalStorage Refactored the global variable initialization to prioritize data retrieval from browser memory using localStorage.getItem(“targetDate”), ensuring fallback capability to the hardcoded default date string (“2027-01-01”) if empty. Bound a “change” event listener to the date input element. When a user updates the field, the new value is mirrored into localStorage under the unified key “targetDate”. Configured runtime updates where changing the input dynamically forces a complete recalculation of the timestamp integer and immediately restarts the global interval timer thread to prevent rendering stale countdown frames. Critical Bugs and Diagnostics Code Review Syntax Error Fix: Corrected an unescaped double-quote attribute typo inside the HTML element declaration where id=”“sidebar was breaking JavaScript’s DOM node selection lookup query. Selector Misalignment Fix: Resolved an animation breakdown where the “.open” conditional style rule was incorrectly targeted at the menu button instead of the sidebar wrapper element, preventing the slide-out sequence. Namespace Sync Fix: Addressed a string mismatch bug where initialization logic incorrectly requested the corrupted key string “targerDate” while event dispatchers stored mutations under “targetDate”, which consistently caused storage caching to break on reload."}, {"post_id": 13051, "ts": "2026-06-21T10:39:08Z", "hours": 0.5522, "text": "Devlog 05: Integrating Google Fonts Icons 1. Goal Implement a hamburger menu button by integrating Google Material Icons into the project. 2. Step 1 Implementation Added the Google Material Icons stylesheet link to the . Created a <button> containing a <span> with the material-icons class and the text “menu” to render the hamburger icon. Styled the button using CSS ( background: none , border: none ) to remove default browser styling and positioned it at the top-left corner using position: absolute ."}, {"post_id": 11692, "ts": "2026-06-19T01:41:54Z", "hours": 0.4172, "text": "Devlog 04: Dynamic Time Box VisibilityRequirement Hide time boxes that have a value of 0 to keep the UI clean, but prevent a box from hiding if a larger time unit still holds a value (e.g., if years > 0, months must not be hidden even if months == 0). Solution Implemented a cascading flag logic ( let hasValue = false ) executed from the largest unit (years) down to the smallest (minutes). Once any larger unit turns the flag true, all subsequent boxes remain visible regardless of their own value. Box elements are hidden dynamically using parentElement.style.display = \"none\" ."}, {"post_id": 10619, "ts": "2026-06-17T13:47:01Z", "hours": 0.6303, "text": "Devlog #2: Precision Countdown Algorithm Fixes Problem The previous countdown relied on dividing total seconds, which failed to calculate years and months accurately because real-world months have a variable number of days (28, 30, 31). Solution Shifted from pure division to a calendar-based object subtraction method. The system now calculates the differences for Y, M, D, H, M, S individually and applies a borrowing logic from the smallest unit up to the largest. It uses new Date(Y, M, 0).getDate() to dynamically fetch the exact number of days in the previous month when borrowing days. Logic Debunk: mo < 0 vs mo <= 0 The correct condition is mo < 0. The variable represents the difference between months. If mo equals 0, the target month and current month are the same, meaning no year needs to be borrowed. Using <= 0 would trigger a false borrow when months are identical, causing the month value to incorrectly jump by +12 and the year to decrease by 1. Bug Fixes Corrected the day borrowing condition from if (mo < 0) to if (d < 0). Fixed a typo where let m (minutes) was mistakenly subtracting now.getMonth() instead of now.getMinutes()."}, {"post_id": 10379, "ts": "2026-06-17T01:59:17Z", "hours": 0.3014, "text": "add some todos and changelog"}, {"post_id": 9955, "ts": "2026-06-16T14:11:15Z", "hours": 1.8083, "text": "the first project using html this year making a countdown timer"}]...
|
Title: Tick Tock by @ryderklh | Stardance
Devlogs Title: Tick Tock by @ryderklh | Stardance
Devlogs:
the first project using html this year making a countdown timer
add some todos and changelog
Devlog #2: Precision Countdown Algorithm Fixes Problem The previous countdown relied on dividing total seconds, which failed to calculate years and months accurately because real-world months have a variable number of days (28, 30, 31). Solution Shifted from pure division to a calendar-based object subtraction method. The system now calculates the differences for Y, M, D, H, M, S individually and applies a borrowing logic from the smallest unit up to the largest. It uses new Date(Y, M, 0).getDate() to dynamically fetch the exact number of days in the previous month when borrowing days. Logic Debunk: mo < 0 vs mo <= 0 The correct condition is mo < 0. The variable represents the difference between months. If mo equals 0, the target month and current month are the same, meaning no year needs to be borrowed. Using <= 0 would trigger a false borrow when months are identical, causing the month value to incorrectly jump by +12 and the year to decrease by 1. Bug Fixes Corrected the day borrowing condition from if (mo < 0) to if (d < 0). Fixed a typo where let m (minutes) was mistakenly subtracting now.getMonth() instead of now.getMinutes().
Devlog 04: Dynamic Time Box VisibilityRequirement Hide time boxes that have a value of 0 to keep the UI clean, but prevent a box from hiding if a larger time unit still holds a value (e.g., if years > 0, months must not be hidden even if months == 0). Solution Implemented a cascading flag logic ( let hasValue = false ) executed from the largest unit (years) down to the smallest (minutes). Once any larger unit turns the flag true, all subsequent boxes remain visible regardless of their own value. Box elements are hidden dynamically using parentElement.style.display = "none" .
Devlog 05: Integrating Google Fonts Icons 1. Goal Implement a hamburger menu button by integrating Google Material Icons into the project. 2. Step 1 Implementation Added the Google Material Icons stylesheet link to the . Created a <button> containing a <span> with the material-icons class and the text “menu” to render the hamburger icon. Styled the button using CSS ( background: none , border: none ) to remove default browser styling and positioned it at the top-left corner using position: absolute .
Devlog 06: Sidebar Menu and Persistent LocalStorage Integration Requirements and Architecture Adopted the HTML5 semantic element to create a dedicated, off-screen sidebar panel for user controls, separating configuration options from the main countdown content. Integrated Google Material Icons stylesheet to render interactive trigger (“menu”) and dismissal (“close”) action elements. Implemented a native calendar interface using to capture target date modifications directly from the client view. Styling and Motion Mechanics Utilized fixed positioning (position: fixed) to pin the sidebar along the right viewport boundary, utilizing full height (100vh) to serve as a slide-out drawer. Applied transform: translateX(100%) to fully obscure the panel behind the right viewport edge by default, attaching a smooth CSS transition property (0.3s ease). Created a structural “.open” modifier class applied to the sidebar element (sidebar.open) that neutralizes the horizontal translation (translateX(0)) to bring the drawer into view upon click events. State Persistence via LocalStorage Refactored the global variable initialization to prioritize data retrieval from browser memory using localStorage.getItem(“targetDate”), ensuring fallback capability to the hardcoded default date string (“2027-01-01”) if empty. Bound a “change” event listener to the date input element. When a user updates the field, the new value is mirrored into localStorage under the unified key “targetDate”. Configured runtime updates where changing the input dynamically forces a complete recalculation of the timestamp integer and immediately restarts the global interval timer thread to prevent rendering stale countdown frames. Critical Bugs and Diagnostics Code Review Syntax Error Fix: Corrected an unescaped double-quote attribute typo inside the HTML element declaration where id=”“sidebar was breaking JavaScript’s DOM node selection lookup query. Selector Misalignment Fix: Resolved an animation breakdown where the “.open” conditional style rule was incorrectly targeted at the menu button instead of the sidebar wrapper element, preventing the slide-out sequence. Namespace Sync Fix: Addressed a string mismatch bug where initialization logic incorrectly requested the corrupted key string “targerDate” while event dispatchers stored mutations under “targetDate”, which consistently caused storage caching to break on reload.
Devlog 07: URL Hash Routing Priority and Timer Encapsulation Debugging Feature and Priority Cascading Extended the state management architecture to support deep-linking properties using URL fragments (window.location.hash). Established a strict target resolution cascading hierarchy where URL fragment inputs take precedence over local user configuration memory, which in turn overrides the default fallback value (URL Hash > LocalStorage > “2027-01-01”). Implemented a regex filter pattern ( /^\d{4}-\d{2}-\d{2}$/ ) to sanitize incoming window location string tokens prior to committing them to the execution state. Refactoring and State Synchronization Modularized individual timer logic fragments into a single initialization routine initTimer() . This routine synchronously updates text container parameters, binds default input values, clears residual interval clocks, and re-allocates tracking loops. Modified input element state transformation bindings to mirror newly elected target values into the URL fragment row (window.location.hash) concurrently with local system memory blocks. Resolution of Block Scope Diagnostics Scope Overlap Fix: Corrected a critical runtime ReferenceError located inside the initTimer() wrapper where repeating the let primitive on the timerId reference allocated a local block-scope variable that collided with pre-initialization clear routines. Removing the redundant declarative keyword reinstated proper execution. -Missing Invocation Fix: Appended an initial entry point declaration initTimer(targetString) to successfully boot up active countdown cycles on fresh page load sequences.
Devlog 08: Viewport Configuration and Responsive Layout Calibration Viewport Meta Integration and RWD Layering Integrated the standard responsive configuration tag <meta name="viewport" content="width=device-width, initial-scale=1.0"> into the document structure header. Resolved a layout compression behavior where mobile rendering engines applied fallback desktop scaling parameters (typically a virtual width of 980px), forcing severe global downscaling on compact displays. Enabled native device pixel scale translations, forcing media container thresholds to evaluate against true hardware dimensions rather than high-density viewport projections. Fluid Grid and Token-Based Scaling Fixed an interface clipping issue where structural boundaries failed to dynamically contract on viewport widths below 600px. Activated the custom @media (max-width: 600px) breakpoint directives, downscaling internal flex container gaps from 15px to 10px and adjusting modular countdown component nodes for enhanced display symmetry. Re-calibrated proportional font metrics across mobile layouts, mapping secondary tracking units down to a structured 1.6rem baseline and bringing the primary title signature to an optimized 2rem boundary. Cross-Platform Interface Layout Fixes Restructured flex-wrap component mechanics within the core visualization container to smoothly adapt from unified desktop rows into multi-line mobile block grids. Eliminated persistent scrollbar overheads on handheld viewports by normalizing absolute coordinate assets and applying elastic percentage constraints across core elements.
Devlog 09: Synchronization Bug Fixes and URL Component Decoding Argument Reference and Logic Rectification Corrected a ReferenceError inside the titleInput listener by swapping an un-sanitized token ( newDate ) with the valid, persistent variable targetString . Fixed an assignment error where a single operator ( if(newTitle="") ) muted intended comparison logic, replacing it with a strict equality check ( newTitle === "" ). URL Normalization and Component Decoding Integrated decodeURIComponent() into loadInitialState() and the hashchange observer to prevent percent-encoded character corruption. Resolved text distortion for multibyte layouts (e.g., Chinese characters), ensuring continuous string fidelity across shared links. Established a default text fallback (“目標”) to secure interface rendering stability during empty input states.
Devlog 10: Structural File Extraction and Modular Synchronization Stability Code Base Decomposition and Externalization Refactored the unified codebase by isolating inline design frameworks and layout scripts into dedicated style.css and script.js internal resources. Streamlined index.html structure down to essential structural markup definitions, using external linkages to boost source reading efficiency and code maintainability. Character Processing and Stability Verification Verified text encoding boundaries across external routing changes to preserve multibyte text inputs (“目標日”, “目標”) without producing character distortion issues. Maintained responsive flex alignments and layout fluid bounds on smaller screens while decoupling runtime system layers.
Devlog 11: Modular Display Mode Architecture and Layout Jitter Resolution Feature Implementation & State Persistence Introduced a feature toggle layout inside the sidebar control node, offering real-time transitions between comprehensive chronological breakdowns and solitary metric configurations. Wired state persistence modules utilizing the local browser data subsystem ( localStorage ) to preserve client display configurations across session cycles and application reboots. Updated the data ingestion routing logic ( loadInitialState ) to safely aggregate user layout states without stepping over parameter strings delivered via URL fragment references. Precision Calculation & Dynamic Interface Masking Integrated an isolated decimal extraction calculation routine within the interval processing tree ( updateTimer ) dedicated to managing strict single-unit tracking parameters. Configured programmatic style visibility switches across atomic timer components, enforcing clean element masking on non-applicable duration counters when single-unit modes trigger. Typographic Stabilization & Layout Shifting Mitigation Corrected a severe layout jitter anomaly inside flexible grid clusters caused by variable font character dimensions shifting container boundaries during fast string state invalidations. Implemented font-variant-numeric: tabular-nums to enforce strict monospaced numeral allocation, keeping external box dimensions static regardless of structural text mutations. Introduced a dynamic responsive structural modifier block ( .mode-single ) to adjust component paddings, implement generous baseline tracking, and elevate text sizing bounds when processing simplified metrics.
Devlog 12: Fluid Typography and Viewport-Adaptive Interface Spacing Viewport-Proportional Layout Calibration Implemented fluid layout scaling mechanics across the primary text blocks utilizing the CSS clamp() function, anchoring layout metrics dynamically between absolute pixel boundaries and relative viewport height units ( vh ). Re-architected spacing margins below the core header display ( #event-label ) to smoothly scale inside an adaptive range ( clamp(5px, 2vh, 30px) ), optimizing structural vertical padding on shifting device orientations. Calibrated upper layout boundaries for the structural footer element ( #target-label ) using fluid scaling boundaries ( clamp(15px, 3vh, 40px) ), ensuring consistent geometric clear space relative to adjacent countdown blocks. Text Alignment and Flow Refactoring Transformed the target calendar description layer ( #target-label ) from inline formatting definitions into explicit block layout models ( display: block ), stabilizing custom spacing calculations and forcing uniform horizontal element boundaries. Enforced complete cross-axis block isolation by assigning absolute width restrictions ( width: 100% ) onto trailing description elements, smoothly pushing metadata strings down beneath the dynamic flexible tracking container.
Devlog 13: Native Sharing Integration and Address Synchronization Control Native Sharing and Fallback Mechanics Integrated a social propagation module ( #share-menu-btn ) inside the header actions block, utilizing the Web Share API to access native mobile distribution panels. Engineered an automated asynchronous clip fallback sequence that overrides processing blocks on unsupported desktop environments, programmatically duplicating host URL hashes via the navigator clipboard asset pool. Applied stateful visual interaction hints onto the interactive sharing interface, dynamically toggling system icons to verify action fulfillment before returning properties to base states. Hash Serialization and Router Interdependency Fixes Resolved an critical structural validation bug inside the initial state loader ( loadInitialState ) where an premature execution return statement truncated processing flows, preventing state restorations. Re-architected data assignment flows inside initialization cycles ( initTimer ), deploying window.history.replaceState() to inject fully compiled variable string parameters back into empty browser URI paths. Secured total address compliance across baseline entries, guaranteeing structural data layers are available to secondary network nodes even when sharing operations occur prior to custom value updates.
Devlog 14: Localization Migration and Pre-Ship Consolidation UI Text Internationalization Migrated all hardcoded multi-byte interface character arrays across template structures ( index.html ) and operational state modules ( script.js ) into standardized Western European typography strings. Refactored semantic definitions within input control placeholders and baseline reference containers to achieve uniform structural layout scaling under single-byte font rendering constraints. Documentation and Release Management Compiled a foundational system architectural reference ( README.md ) specifying setup logic, reactive routing hooks, and custom persistence implementations. Executed full client-side behavior validations on state-tracking components ahead of the definitive production deployment pipeline for Ship #2.
Devlog 15 Phase 1: Creating the Skeleton and Splitting Components Overextending the Style Files The project started as a single page where all HTML, CSS, and JS lived together. When I created the unified BaseLayout.astro , I kept the old global.css . However, that file had specific styles just for the countdown page, which broke the layout of the new homepage. Cleaning Up Style Pollution To fix this, I moved the countdown-specific CSS directly into the <style> tag of the countdown page ( index.astro ). Astro automatically confines these styles to their own page, ensuring they no longer mess up the homepage layout. Phase 2: Fixing Astro’s Route Misinterpretation Keeping Scripts in the Wrong Folder I originally placed the logic script ( script.js ) inside the src/pages/countdown/ folder to keep it close to the page. During local testing, Astro threw an error saying there was no API route handler for that JavaScript file. Moving Scripts to a Dedicated Folder I learned that Astro treats every file inside src/pages/ as a public URL or an API route. To fix this, I moved the file to a new src/scripts/ folder and renamed it countdown.js , keeping the pages folder strictly for actual web pages. Phase 3: Resolving Build Crashes from File Names Using Special Characters in Names Inside my documentation folder, I named a development note file ship#2.md . When I ran npm run build , the entire build process crashed immediately with a path error. Removing the Broken Characters The build tool (Vite) treats the # symbol as a URL anchor link, which breaks file path reading. I renamed the file to ship2.md , and the system was able to parse the path and build successfully. Phase 4: Overcoming the Environment Conflict (Server vs. Client) Running Browser Code on the Server This was the biggest challenge. When I imported countdown.js into the page, the build failed multiple times, throwing errors like window is not defined and document is not defined . Protecting the Code with Environment Guards Astro runs pages on the server to generate static HTML during the build step. Because Node.js does not have browser features like window or document , the script crashed. I fixed this with two steps: I imported the script using the ?url suffix in Astro so the server only records its path instead of running it. I wrapped all the browser-specific logic inside a typeof window !== "undefined" check. This ensures the script stays quiet during the server build and only runs once it reaches the user’s browser.
Devlog 16: Dashboard Layout Fixes Fixing Layout and Compression Issues Compressed Card Icons Problem : The card icons shrank and deformed when the screen size changed. Solution : Added flex-shrink: 0; to the icon class to force them to keep their correct size. Cards Stacking Vertically Problem : The tool cards unexpectedly stacked into a narrow, single column right in the middle of the screen. Even though there was plenty of empty space on both sides of the desktop browser, the grid refused to expand horizontally and display the cards side-by-side. Troubleshooting : The grid’s layout formula was correctly set to repeat(auto-fit, minmax(250px, 1fr)) , which should have allowed multiple columns. However, the parent container ( .home-container ) was set to display: flex with align-items: center . In a vertical Flexbox layout, this alignment forces child elements like the grid to shrink to their absolute minimum width based on content, instead of filling the screen. To make matters worse, a strict max-width: 300px; was hardcoded onto the .tool-grid . Since two cards plus their gaps required at least 525px to sit side-by-side, the 300px restriction made it mathematically impossible for the browser to create a second column. Solution : Removed the restrictive max-width: 300px; from the grid and replaced it with a generous max-width: 1200px; to allow proper breathing room on large screens. Added width: 100%; to the grid class, forcing the grid container to break out of the Flexbox compression and stretch completely across the parent container. This allowed the responsive auto-fit engine to finally see the available width and cleanly arrange the cards into multiple columns. Fixing Grid Spacing and Syntax Errors Layout Breaking Off-Screen Problem : The grid expanded past the screen edges and cut off the card content. Solution : Added box-sizing: border-box; to the main container so that padding is counted inside the total width. Broken Units and Side Scrollbars Problem : An annoying horizontal scrollbar appeared at the bottom of the page. Solution : Fixed a typo where width: 100sww; was written instead of 100svw , and added body { margin: 0; } to clear default browser spaces.
Devlog 17: Project Hub and README Expansion Moving from a Single Page to a Tool Hub Goal : Transformed TickTock from a single countdown page into a comprehensive time-management utility hub powered by Astro. Implementation : Created a main dashboard page ( src/pages/index.astro ) to serve as the gateway for current and future time tools, using a shared layout for a consistent user experience. Adding Future Roadmap and Project Documentation Goal : Wrote a complete README.md to document the new project architecture, local testing steps, and automated GitHub Pages deployment. Future Vision : Updated the repository roadmap to announce upcoming tools built for the Hack Club Stardance event, including a Pomodoro Timer, World Clock Board, Minimalist Timer, and Time Progress Bars.
Devlog 18: Adding Hub Sharing Functionality Integrating Client-Side Script Safely Implementing the Homepage Share Button Problem : The dashboard needed a simple button to share the current hub URL, but running browser APIs directly could break Astro’s static site generation (SSG) compiler. Solution : Added an inline <script is:inline> block to the index page. This bypasses the server-side build process and safely binds the sharing and clipboard logic only when the page loads in the user’s browser.
Devlog 19: Building the Adaptable Digital Clock Implementing Native Date Formatting Problem : The clock header needed to show the full current date (e.g., “Sunday, July 12, 2026”) dynamically without taxing browser performance or importing heavy external date libraries. Solution : Added a #date-label placeholder to the template and used the native JavaScript toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }) inside the main runtime loop to render lightweight, perfectly formatted timestamps on every update. Creating Fluid Visual Oscillations via Math.sin() Problem : Traditional blinking colons look rigid and distracting, failing to deliver a premium, organic feel for an active time-management tool. Solution : Avoided simple CSS toggles and leveraged a true trigonometric formula inside a requestAnimationFrame loop. By mapping high-precision timestamps through Math.sin() , the opacity gracefully curves between 0.2 and 1.0 , producing a perfectly smooth, wave-like breathing animation. Binding Custom Display and Layout Controls Problem : The interface required instant controls for 12/24-hour formats, font adjustments, and a standalone full-screen view while managing layout side effects. Solution : Wired up event listeners to modify global runtime states and inline CSS font families on the fly. Integrated the HTML5 Fullscreen API onto the #clock-screen element, backed by a global fullscreenchange listener to seamlessly catch manual ESC escapes and keep the toggle button states perfectly in sync.
Devlog 20: Settings Memory and Dynamic Sharing Adding Setting Memory and URL Sync Keeping your clock layout saved Persistent settings : The clock now remembers your favorite layout. Your choice of time format (12/24h) and font style is instantly saved directly to your browser’s local storage. URL sync : We linked these settings directly to the URL hash (like #12hr&mono ). When you refresh or load the page, your exact preferred theme loads up right away. Smart Sharing and Hub Integration Spreading the time and completing the hub Dynamic sharing : Added a share button that grabs your exact custom clock URL. It uses the Web Share API when available, and easily falls back to copying the link to your clipboard with a smooth checkmark animation on success. Connecting the dashboard : Linked the completed clock page to our homepage hub grid and updated the site layout, officially making TickTock a multi-tool station.
Devlog 21: Architecture Normalization and Layout Fine-Tuning Directory Restructuring & Future-Proofing Preparing for scalability Digital Clock Renaming : To prevent future routing conflicts as the project scales, we successfully renamed clock.js to digital-clock.js and adjusted the main page path to /src/pages/digital-clock/ . This cleanly isolates this feature from upcoming modules like World Clock or Pomodoro Timer. Dependency Clean-up : Updated all asset paths and module script injections across the hub, fully standardizing the multi-tool routing structure under the /TickTock/ basePath. Layout Fixes with Global CSS Variables Resolving invalid CSS properties via JS injection Replacing Non-Standard Styles : Fixed a crucial layout issue where arbitrary if(...) conditions inside CSS were breaking colon component constraints. Dynamic Width Injection : Migrated the layout parameters directly into digital-clock.js using the standard document.documentElement.style.setProperty API. The .colon element now seamlessly reads the responsive --clock-colon-width CSS variable, adapting perfectly across Sans, Serif, and Mono configurations without any jumping side effects.
Devlog 22: F11-Equivalent Fullscreen via Root Element Standardizing Fullscreen to document.documentElement Fixing disappearing layout elements The Pitfall : Previously, calling requestFullscreen() on the individual #clock-screen container caused the browser to isolate it from the DOM layout. This triggered default browser styling which rendered a pitch-black backdrop, and completely hid crucial layout parts like the header, footer, and side menu buttons. The Solution : We shifted the fullscreen API target from the sub-container directly to document.documentElement (the global <html> node). This aligns the button’s behavior perfectly with standard keyboard F11 fullscreen events. The Result : All global UI elements (header, footer, navigation) now scale smoothly and remain perfectly visible and interactive without any layout shifts or z-index clashing.
Devlog 23: Global Branding Relocation and Logo Navigation Moving Title Label to BaseLayout Unifying the brand and improving UX Header Linkification : Refactored the main title-label (“TickTock”) out of individual page templates and integrated it directly into the global BaseLayout.astro . Back-to-Home UX : Wrapped the brand title in an <a> tag. Now, clicking the brand logo on any sub-tool instantly routes the user back to the home dashboard Hub, offering an intuitive, web-app-like navigation experience.
Devlog 24: Color Architecture Refactoring with Design Tokens Two-Tier CSS Variables Global Tokens: Extracted hardcoded hex colors into primitive color names inside global.css. Theme Tokens: Created a semantic layer mapping elements like –bg-app and –accent-color directly to global tokens. Clean Codebase Update Component Styles: Replaced absolute colors across the layout, dashboard hub, countdown, and clock templates with var() variables. Script Alignment: Updated dynamic checkmark colors in JavaScript to read –accent-color instead of raw hex values. Future Scope: The design is now fully abstracted, meaning light mode implementation will only require token swapping without editing individual component code.
Devlog 25: Theme Toggle Implementation with Dark and Light Modes Light Theme Tokens Override Added :root[data-theme=“light”] in global.css to swap semantic theme variables for light background, borders, and high-contrast amber accents. Preserved existing component styles while smoothly transitioning body colors on theme switch. Sidebar Toggle Component and Logic Integrated a theme toggle button (#theme-toggle-btn) inside the BaseLayout header actions. Built persistent theme state logic using localStorage and system prefers-color-scheme detection. Used textContent on icon elements to dynamically switch between dark_mode and light_mode icons without type errors.
Devlog 26: Typo Correction and Expandable Directory Menu Typo Correction Fixed property naming error from –accent-contract-text to –accent-contrast-text in global CSS. Expandable Tools Directory Converted static directory links into a native component with smooth arrow rotation styling. Enabled server-side open status via open={isHomePage} in BaseLayout, defaulting to expanded on the home hub and collapsed on sub-tool pages.
Devlog 27: Time Progress Bar Feature Porting and JS Modular Refactoring Astro Slot Architecture & CSS Variable Integration Ported the standalone Time Progress Bar tool into the Astro layout system using designated slots ( #head , #header-content , #custom-menu , and #main-content ). Converted hardcoded hex colors into semantic global theme CSS variables ( --accent-color , --component-bg-standard , --text-heading ), ensuring native support for Dark and Light mode toggling. Replaced the dropdown filter with sidebar multi-select checkboxes for custom control over visible time progress units. JavaScript Modular Refactoring & Bug Fixes Decoupled single-script logic into dedicated, single-responsibility functions ( initSidebarToggles , calculateTimeProgress , updateTicksUI , updateProgressCardUI , and updateSingleCardUI ). Resolved JavaScript syntax errors, including missing function keywords, JS Automatic Semicolon Insertion (ASI) line-break issues on return statements, and uncalled Date method parentheses. Streamlined animation frame rendering by passing structured data from math calculations directly into UI updater functions.
Devlog 28: Layout Overflow Fixes and UI Polish Layout & Scrollbar Stability Added scrollbar-gutter: stable to html in global.css to reserve vertical scrollbar space, preventing horizontal overflow caused by layout reflow. Applied overflow-x: hidden to main containers and .progress-card to prevent percentage tags and thumbs from clipping past container edges at 100%. CSS Rule Corrections Fixed CSS property error by setting .track width to 100% instead of unitless value. Fine-tuned progress bar wrapper styles to ensure smooth visual layout under both dark and light themes.
Devlog 29: URL Hash Sync, LocalStorage Persistence & Universal Share Event URL & State Persistence Integrated URL Hash ( #year,month,... ) and localStorage synchronization into time-progress.js to preserve users’ toggle preferences across reloads and shares. Added a hashchange event listener to ensure UI check states dynamically update when users use browser navigation (Back/Forward). Centralized Layout Share Event Refactored the #share-menu-btn event listener into BaseLayout.astro , eliminating duplicate share logic across individual tool pages. Leveraged document.title dynamically to provide clean, contextual titles for native Web Share API and clipboard copy fallbacks.
Devlog 30: Image Export Feature & Template Refactoring Image Export Feature Integrated html2canvas library to enable one-click PNG image export of the active progress dashboard. Added an “Export as Image” button inside the custom sidebar menu with dedicated styling. Handled theme-aware background rendering by dynamically querying computed global CSS variables ( --bg-app ). DOM Template & Dynamic Watermark Refactored dynamic watermark creation using the HTML <template> element ( #export-watermark-template ), cleanly separating DOM structure from JavaScript execution logic. Configured dynamic timestamps using now.toLocaleString() to inject real-time snapshot dates and times into exported images. Added ignoreElements filtering in html2canvas to prevent unchecked/hidden .progress-card elements from creating top/bottom visual gaps in exported images. Bug Fixes & Refactor Fixed a TypeError on insertBefore / appendChild by referencing clone.firstElementChild to extract the correct Element Node from DocumentFragment . Resolved HTML/JS ID typos ( export-watermark-template ) and method call mismatches to ensure reliable script execution.
Devlog 31: Template Canvas Architecture & Reference Refactoring Independent Canvas Architecture Replaced direct DOM manipulation of live dashboard elements with a dedicated, off-screen template canvas ( .export-canvas ). Cloned active .progress-card elements into an isolated container ( .export-cards-holder ), ensuring the on-screen UI remains completely untouched and non-flickering during image generation. Moved aspect ratio, high-resolution dimensions (600x600), padding, and font-scaling rules directly into CSS for clean separation of concerns. Error Fixes & Cleanup Fixed ReferenceError caused by leftover references to targetContainer and stampEl inside initExportImageFeature . Updated html2canvas target from main dashboard container to the temporary canvasEl . Streamlined fallback DOM cleanup logic inside the try...catch block to guarantee off-screen elements are properly garbage collected.
Devlog 32: Dynamic Canvas Aspect Ratio Calculation Features & Refactoring Implemented dynamic aspect ratio calculation for PNG exports ( Height = 140 * Count + 180 ). Applied responsive auto-scaling for .export-canvas to ensure optimal vertical spacing regardless of selected cards count. Merged feature/export-image branch into main after verifying clean template rendering and correct node referencing.
Devlog 33: Pomodoro Segmented Timeline & Layout Integration Segmented Timeline Layout Integrated BaseLayout slots for the new Pomodoro page, separating sidebar settings from the main dashboard. Built a visual segmented timeline ( .timeline-track ) with flex-proportional work/break segments and a dynamic progress pin ( .timeline-pin ). Core Logic & State Setup Refactored state object fields ( workDuration , breakDuration , timeRemaining ) to ensure clean state initialization. Added timestamp delta checking on startup to preserve accurate remaining time across page reloads or background tabs.
Devlog 34: Pomodoro Core Timer & Segmented Timeline Integration Features Implemented static audio notification system via HTML5 Audio API targeting public/sounds/notification.mp3 . Architecture & State Management Implemented timestamp delta verification ( endTime - Date.now() ) to maintain countdown accuracy during background tab throttling or page reloads. Decoupled primary control actions across main page and sidebar controls ( #menu-start-btn , #cycles-input ). Bug Fixes & Refactoring Fixed ReferenceError during event initialization by enforcing state argument scoping within bindEvents . Refactored loadStateFromLocalStorage parsing logic to filter "undefined" string literals and clear corrupted cache gracefully.
Devlog 35: Pomodoro State Transition & Auto-Loop Refactoring Core Logic & State Fixes Auto-Phase Transition Fix : Resolved state lock ( status: 'running' ) preventing automatic transition from Focus to Break. Added explicit status resetting in handlePhaseEnd before invoking startTimer . Timer Precision : Replaced Math.round with Math.ceil in countdown logic to eliminate early sound triggers caused by rounding errors. Timestamp Recalibration : Implemented dynamic endTime re-calculation when switching modes ( work ↔ break ) to maintain state consistency.
Devlog 36: Update Docs & Merge Update Docs Readme: Add the links of the new tools Ship#4: Write Ship#4.md Merge!!!!! Merge feature/pomodoro into main Fortunately no error poping out!
Devlog 37: Multi-Timer UI Layout & Input Controls Form Inputs & Adjustments Built HH/MM/SS number input boxes with range limits and zero-padding logic on blur. Implemented stepper adjustment buttons for quick time value tweaking. Sidebar Timer List Layout Added sidebar timer list container to preview user-created countdown items. Integrated quick action delete buttons for item removal. Main Dashboard Circular Timer Constructed countdown card layout featuring SVG dynamic progress ring. Centered time readout using tabular-nums formatting to eliminate number jitter. Action Control Group Laid out card control buttons including play, pause, and replay. the ui was so tiring… i DID remember to open a new branch (feature/timer-main) …
Devlog 38: Multi-Timer Logic & Bug Fixes JS Managed multi-timer state using plain object arrays. Implemented saveTimers() and loadTimers() for LocalStorage persistence. Linked input fields with setupArrowBtns() to handle unit value increment and decrement bounds. Cloned <template> elements to dynamically generate sidebar list items and main cards via renderAll() . Added item deletion logic via handleDelete() to update state and UI. Established a startGlobalTick() loop running every 200ms using endTime offsets to prevent background tab drift. Calculated SVG circle strokeDashoffset dynamically based on remaining time ratios. Debugging & UI Patching Placing <template> tags inside slot="template-content" . Adding missing id="timer-container" . .textContent.textContent to .textContent Data.now() to Date.now() . timers.status to timer.status . finally got multi-timer state and progress rings syncing properly… bugs fixed and back to smooth sailing…
Devlog 39: Smooth Action Button Transitions Button Collapse & Spacing Animate Added max-width , margin: 0 , and padding: 0 constraints to .is-hidden to smoothly collapse hidden buttons without leaving blank layout gaps. Expanded base state with explicit max-width boundary to allow width-based CSS transitions. much smoother ♪(´▽`)
Devlog 40: Alarm Audio & LocalStorage Independent Alarm Audio Handling new Audio() allowing each finished timer to play independent looping sound effects concurrently. Bound alarm termination directly to handleReset() and handleDelete() . LocalStorage Serialization Fixes Sanitized timer state object before serialization in saveTimers() by stripping transient DOM/Audio references ( alarmAudio ) to prevent JSON stringification crashes. Added type validation ( typeof alarmAudio.pause === "function" ) inside stopAlarm() to prevent runtime TypeError issues during state rehydration. Post-Reload Alarm & Visual Sync Updated renderAll() to resume alarm sound playback and background pulse animation for ended timers across page reloads. Cleared endTime correctly during timer reset to normalize state lifecycle. alarm.wav Using LMMS to create alarm.wav for the alarming when timer.status==="ended" .
Devlog 41: Dual-Text Display & Running Animation Sub-Text Total Duration Display Added .timer-text-sub element inside the ring container to preserve and display the initial totalSeconds value. Styled sub-text using lighter font weights and var(--text-muted) . Dynamic Running Visual Effects Added .is-running state toggle based on timer.status === "running" . Implemented @keyframes timer-text-flash pulsing animation to provide continuous visual feedback while countdown is active.
Devlog 42: Timer Reordering & List Re-Sorting Reordering UI Controls Added .sort-action control group with .sort-up and .sort-down arrow buttons to the template layout. Dynamic Array Mutation & Re-rendering Implemented handleMoveTimer(id, direction) to handle array element swapping with upper and lower boundary bounds checks. Bound click handlers in renderListedTimer() to execute reordering operations, trigger LocalStorage updates, and instantly re-render the UI layout via renderAll() .
Devlog 43: Timer Integration & Navigation Update Navigation & Home Page Integration Added Timer card entry to the main landing page ( tool-card layout with hourglass Material symbol). Added direct Timer link to the global navigation bar in BaseLayout.astro . Feature Branch Merge Merged feature/timer-main into main , bringing in the new /timer page route, timer.js logic, sound assets ( alarm.wav ), and updated layout components. YEAYYY
Devlog 44: Stopwatch Layout Template & Layout Migration Ported side-menu and main container structures from Timer to Stopwatch layout ( index.astro ). Structured sidebar elements: .stopwatch-adding-action-btn and .stopwatch-list-container for dynamic item injection. Added template placeholders ( #listed-stopwatch-template and #stopwatch-card-template ). Stopwatch Card & Lap Data Display Integrated core display components: .stopwatch-text and .stopwatch-text-sub . Created interactive control group ( .stopwatch-card-action-btn ) supporting Start, Pause, Replay, and Lap actions. Designed a 3-column CSS Grid table ( .stopwatch-lap-container ) to organize lap metrics ( i , lap , total ).
Devlog 45: Initial Stopwatch Logic & Dynamic State Scaffolding Core State & Lap Data Architecture Designed a stopwatch schema tracking dynamic state ( idle | running | paused ) and an array of individual lap records ( laps ). Streamlined time calculation to compute elapsed milliseconds dynamically directly using timestamps ( Date.now() - lap.startTime ), eliminating redundant accumulator fields like startTime or elapsedTime . Interactive Handlers & Lifecycle Operations Implemented core lifecycle handlers: handleStart , handlePause , handleReset , handleLap , and handleDelete . Integrated updateCardUI and updateCardBtns to reflect running, paused, and idle UI visual feedback dynamically. Built active DOM updates for lap histories inside updateCardLapGrid using index-based duration summation for lap and total times. Enabled global runtime updates via startGlobalTick() timer intervals and list reordering via handleMoveStopwatch() .
Devlog 46: UI Fine-tuning & Timing Logic Optimization Lap Calculations -Replaced laps.forEach with for (let j = 0; j <= i; j++) to ensure cumulative total times ( totalMS ) strictly correspond to the current lap index. Layout Enhanced formatTime() rendering logic by applying inline styles width , transform: scaleX(0.8) , text-align: center to dynamic span elements, preventing font-width shifting during rapid ticker updates. Dynamic Rendering Integrated updateListedStopwatch() into the global interval loop, enabling sidebar preview labels to tick synchronously with active main cards. Optimized state updates to target individual time elements instead of triggering full list re-renders on every ticker frame. Added optional chaining laps?.[0]?.startTime across rendering pipelines to prevent runtime exceptions when initializing empty stopwatches.
Devlog 47: Pause Compensation Pause Duration Offset Implemented pauseDuration calculation Date.now() - pauseStartTime during resume actions status === "paused" . Shifted all existing lap timestamps lap.endTime += pauseDuration forward to subtract paused time intervals. State-Aware Timestamp Resolution Standardized timestamp evaluation across renderers handleLap , renderListedStopwatch , updateListedStopwatch , and updateCardUI using ternary state checks: const now = stopwatch . status === " running " ? Date . now () : stopwatch . pauseStartTime ;
Devlog 48: DOM Selector Bugfixes & Homepage Quick Access DOM Query Selector & Reference Repairs Updated querySelector in updateListedStopwatch from target class .listed-stopwatch-demo to parent wrapper .listed-stopwatch[data-id="..."] , resolving element lookup failures during live updates. Homepage Integrated direct links and dedicated preview cards for the Stopwatch application into index.astro and BaseLayout.astro .
Devlog 49: Lap Data Export Plaintext Lap Data Serialization formatLapsOutput : a dedicated text formatter that converts active stopwatch data into structured tab-separated values (TSV) suitable for copying. Async Clipboard Copy Logic Implemented an async wrapper using navigator.clipboard.writeText() with built-in error handling ( try/catch ) and user alerts for unsupported environments or clipboard permission rejections. Interactive Copy Feedback UI Wired copyBtn click events to trigger text copying and dynamically update the button icon ( check or error ) and theme accent color.
Devlog 50 Layout Refactoring Scroll Restructuring Shifted .stopwatch-container layout from vertical wrapping ( flex-wrap: wrap ) to a single-row horizontal scroll track ( flex-wrap: nowrap with overflow-x: auto ).
Devlog 51: Asset Migration Asset Directory Migration Moved audio assets ( alarm.wav and notif.wav ) from the static /public/sounds/ directory into the source-managed asset pipeline at src/assets/sounds/ . Module Import & Bundler Integration Replaced hardcoded absolute URL paths ( "/public/sounds/..." ) with explicit ES module imports ( import alarmSoundUrl from '../assets/sounds/alarm.wav' and import notifSoundUrl from '../assets/sounds/notif.wav' ) across timer.js and pomodoro.js .
Devlog 52: GitHub Pages Audio Path Resolution Fixes Absolute Repository Subpath Hardcoding Replaced environment variable dynamic paths ( import.meta.env.BASE_URL ) with direct base-path URLs ( '/TickTock/sounds/alarm.wav' ) in playAlarm() . i have no idea why that happened
Ships:
What I Made I made a Countdown Web App called “Tick Tock.” It shows the exact years, months, days, hours, minutes, and seconds left until January 1, 2027. What Was Challenging Calculating months and years was hard. Months have different days (28, 30, or 31), so I had to write smart JavaScript code to borrow days and keep the timer 100% accurate. What I Am Proud Of It Works!: Actually this is my first time using html to build a website. Clean Design: I fixed the layout bugs and made a dark-mode interface. How to Test It https://klhrd.github.io/TickTock/
WHAT I MADE/THINK? I made a long-term countdown timer for events. It’s really hard for me to build things in a way that is completely new to me. I’ve been stuck not only with programming languages but also with English. However, through this project (STARDANCE), though I didn’t create something really impressive, I think I learnt A LOT. Features Live Countdown Full mode ⭐Days mode Customizable ⭐Change Target Date ⭐Edit Event Title ⭐automatically save in localStorage & url# ⭐share btn Dark Mode UI ⭐means new features of the previous ship WHAT I LEARNT? basic GIT code basic HTML/CSS3/JS How to write DevLogs REPLIES I’ve read all the replies of the ship#1. And lots of them mentioned the same thing. Thanks to everyone who give me feedback. Hope there’s the better version of previous ships. 1. ABOUT CHANGEABLE TARGET Now you can pick any target date and even edit the event title right from the sidebar. 2. ABOUT LANGUAGE I’ve fully migrated the app to English now. 3. ABOUT DEVLOG I’ve leveled up my devlog game for this update—documented all the engineering details and bugs I fixed this time. TRY IT! 2027 New Year NC Finals Weekend US Open
WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a beautiful, highly customizable Digital Clock. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features ⭐Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title ⭐Digital Clock ⭐12-hour / 24-hour format ⭐3 Font styles (Sans, Serif, Mono) ⭐Fullscreen mode (Header/Footer kept!) ⭐Smooth breathing colon animation automatically save in localStorage & url# Lightweight ⭐means new features of the previous ship WHAT I LEARNT? A lot of new things about Astro and NodeJS How to structure routes for multiple tools (Refactoring files) Advanced CSS (using global variables to adjust layout gaps dynamicly) REPLIES Thank you so much for the 115 stardust and the amazing feedback! I read every single review from Ship #2, and they helped me make this update so much better. 1. ABOUT MORE FEATURES Many suggested adding more tools or events. I turned the website into a Hub and built the Digital Clock as our second official tool! 2. ABOUT THE SCREENSHOT IN README Two reviewers mentioned adding screenshots. I’ve updated the README with fresh screenshots so people skimming through can see the UI instantly. TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif)
WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a Pomodoro Timer and a Time Progress Displayer. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title automatically save in localStorage & url# Digital Clock 12-hour / 24-hour format 3 Font styles (Sans, Serif, Mono) Fullscreen mode (Header/Footer kept!) Smooth breathing colon animation automatically save in localStorage & url# ⭐Time Progress Bar ⭐Export as image ⭐Switchable hide/show ⭐Pomodoro Timer ⭐Customable number of cycles ⭐Pause at any time ⭐Notification Sound Lightweight ⭐Light mode/Dark mode ⭐Quick link to other tools ⭐means new features of the previous ship WHAT I LEARNT? A lot of new things about git JS, Astro… TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif) Time Progress Pomodoro Timer
WHAT I MADE/THINK? I expanded TickTock from a single timer into a multi-tool station (Hub)! This time, I built a Timer and a Stopwatch. It was a huge challenge for me to handle standard browser behaviors, especially turning a single-page SPA into a structured Astro website with a homepage and sub-pages. It took lots of testing, but I feel so proud when everything finally aligned perfectly. Features Homepage Hub Dashboard Live Countdown Customizable Countdown Full mode / Days mode Change Target Date Edit Event Title automatically save in localStorage & url# Digital Clock 12-hour / 24-hour format 3 Font styles (Sans, Serif, Mono) Fullscreen mode (Header/Footer kept!) Smooth breathing colon animation automatically save in localStorage & url# ⭐Timer ⭐Mutiple timers at one page ⭐Keep going after refreshing website ⭐Circular progress bar ⭐Sortable timers ⭐Alarm and flash on completion ⭐Stopwatch ⭐Mutiple stopwatches at one page ⭐Keep going after refreshing website ⭐Sortable timers ⭐Able to lap and split ⭐Able to copy total time and laps info Time Progress Bar Export as image Switchable hide/show Pomodoro Timer Customable number of cycles Pause at any time Notification Sound Lightweight Light mode/Dark mode Quick link to other tools WHAT I LEARNT? A lot of new things about git How to write devlogs JS, Astro… TRY IT! TickTock Home Hub NC Finals Weekend Digital Clock (12H / Classic Serif) ⭐Timer ⭐Stopwatch Time Progress Pomodoro Timer ⭐means new features of the previous ship...
|
1793090988.3792284
|
1793177388.3792284
|
|
24955
|
Fun Learning Game by @lilfox | Stardance
|
lilfox
|
1
|
85.0
|
1895
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-11T21:09:47Z", "hours": 85.0, "multiplier": 18.47, "payout": 1895, "blessing": "neutral", "text": "This is especially made for the Chinese students I tutor! I made a boss fight game that uses shooter and (possibly) rpg elements to help the player practice kindergarten level English spelling. Just formulating the idea and incorporating it was challenging, though. From changing the genre of my game from a platformer to a boss-fight, to painstakingly drawing and animating the pixel art of the game, to learning Godot as a beginner…it’s been a wild ride! I’m proud that I was able to create a coherent and (hopefully) fun game, while learning new things about Godot and Aseprite. Nodes, signals, layers, frames, all bunched up together. While this is my first time making a game, I hope that my time and effort makes this an enjoyable experience for you! The link to my project is over at https://english-spelling-lesson.netlify.app (unfortunately this game requires a keyboard). G’ day. :)", "repo": "https://github.com/Foxlil/Educational-Game", "demo": "https://english-spelling-lesson.netlify.app"}]...
|
[{"post_id": 45410, "ts": "202 [{"post_id": 45410, "ts": "2026-08-11T20:46:52Z", "hours": 2.2011, "text": "I finished the game! :D Added sound effects for: Clicking buttons Player attacks Phoenix attacks Phoenix caw (to signal to the player that a barrage of projectiles is coming if they are too busy with the attack button) Background music! The quiz I finally added real questions! I wanted to focus on spelling for this one, so I used emojis and asked the user how the words representing them were spelled. Text stuff Added text instruction at the beginning Changed fonts of the text nodes featuring emojis (more on that later) Web shenanigans I wanted to make sure that the game would be available on devices that did not support downloading .exe (like chromebooks, for example). But uh…that was harder than I was expecting! I used netlify to create a url after exporting the game for html5. The first issue in business was that the camera was zoomed out when the website was launched, showing the gray blank space of the Godot dimension. This took a bit to figure out, but apparently I had to adjust the stretch mode and aspect in project settings. The second issue was that the emojis were showing up as white-boxed hex codes in the web version (for some reason!! >:( ). Turns out that I needed a different dedicated font for the emojis so that they could be compatable on all devices. Oh well, haha. At least it’s more accessible! :D (PS. I’m sincerely sorry for the terrible audio quality in the video, I can’t screen record and the speakers on this computer are outrageous :’) )"}, {"post_id": 45100, "ts": "2026-08-11T11:27:01Z", "hours": 9.2092, "text": "I’m so close to finishing the game! First of all, I finished the attack system. Basically, you answer a certain number of questions under the “attack” button, filling up the bar next to it. When it fills up, you unlock a new weapon. After it cools down, you can use it; but on the first time of cycling through every weapon, only once! As you complete more cycles, though, that increases to twice, then three times, etc. I also added pixel art to the buttons. I took away the “attack” label of the attack button because the students I tutor don’t know that word yet. Instead, I used an animation in hopes of incentivising them to click it. The other buttons include: The arrow Two arrows Copper sword Diamond sword Which brings me to my next development––when you click those buttons, there’s an actual attack! An arrow animation, a two-arrow animation, a copper sword animation, etc were added to the mix. I hope to add music, SFX, and maybe simple instructions for the future. Finally, I implemented a losing and winning screen using the same node in the system, detecting player and enemy health."}, {"post_id": 44537, "ts": "2026-08-10T11:24:26Z", "hours": 7.1533, "text": "I added functionality to the attack system! Now it can: Show the question and input text box when the attack button is clicked Detect correct answers and wrong answers I also added: An attack bar that stores how many answers you got correct. Once you’ve answered a certain number of questions correctly, I plan for a button on the left to unlock You may already notice the buttons in the bottom left! When I filled the bar once, one of the buttons unlocked, a timer ran out (signified by the white bar), and I could click the button. For the future: The buttons you have to unlock are actually buttons that allow you attack! So I’ll add different attack functionalities to different buttons. The buttons look kinda bland. I’m planning to add some sprites in place of the buttons. I’m thinking of putting some transparent gray space behind the text to make it more readable. I really hope I can finish this game next devlog! Seeya there! :)"}, {"post_id": 43967, "ts": "2026-08-09T13:15:35Z", "hours": 7.4439, "text": "I’ve put some of the pixel art into the game, and it’s looking good! The thing about the prototype is that it didn’t consider scale or size, so I had to change: The placement and zoom of the camera The size and tween animations of the quiz questions The player and enemy sprite + hitbox size However, I also finished: Health bars for the player and boss Tweens that would smoothly adjust the health (which was why the red health and the bar were drawn separately) Areas where the projectiles would be slow or fast. Initially this was controlled by timers, but I found that this was too buggy for my mom’s computer, so I just used area detection instead to make everything more consistent. For the future, I added: An attack button A text input box (line edit node) An area for the text questions (label node) For now, there is no function yet, but this will be used for an attack system. How it will work is that, when you press attack, you are given a question requiring a typed answer. Answering it correctly would send a powerful attack to the enemy, while answering it wrong would decrease your health by a little bit. Looking forward to implementing this system! (Also don’t worry, I’ll def add pixel art for the player and the arrows trust :D )"}, {"post_id": 43265, "ts": "2026-08-08T12:57:16Z", "hours": 4.2119, "text": "Wowee, I finished the background! I mostly worked on the tiles and shadows, which I hope makes the environment more immersive and detailed. I also added in some of the complete assets into Godot! While I still have some pixel art to work on, such as: The player Arrows The projectiles exploding animation I think now is a good time to take a break from Aseprite and work in Godot. Since the pixel art is already way smaller than the original prototype, here’s what I need to work on: Adjusting the game code to the new screen size Slowing down projectiles and adjusting the time when they slow down Changing the question tweens so that the text doesn’t fly off the screen Changing player position Adding in the health bar sprites with functionality Implementing animation phases for the boss (play this animation when attacking, play this animation when idling, etc) VFX and SFX"}, {"post_id": 42775, "ts": "2026-08-07T17:34:46Z", "hours": 6.3053, "text": "Worked on the background environment. Added: Pillars Doorway Brick texture Shading The most difficult thing for me is to make every element fit together. I hope I can finish the background today and probably work on the player and arrows. I also just realized that I should probably work on the projectile dissipating animation, too. Off to work!"}, {"post_id": 41906, "ts": "2026-08-06T12:38:02Z", "hours": 8.2169, "text": "After completing the phoenix (finally), here’s what I finished: The projectiles emitted from the boss. I wondered what it should be—a rock? A magic orb? Before realizing that it was a phoenix we were talking about, and that flames were basically their signature! I also added frame-by-frame animation to add more life to it. The boss health bar! It’s noticeably larger than the player’s, with a similar flame animation as the projectiles. It doesn’t have that gold sheen, but I hope it has its own unique style that gives off phoenix vibes! What I’m working on: The background! I’ve only created two pillars, but I’m planning on an entrance to a temple. To make the colors blend more together, I actually used the jumble tool! (The enemy is there as a reference to the size proportions) What I plan to do after finishing the background: Besides more pixel art (player, arrows), I want to implement the art into the game! The game’s framework is basically done, though I’ll definitely add more features so that it isn’t so repetitive. I also need to work on the health bars, which is exciting! :)"}, {"post_id": 41293, "ts": "2026-08-05T12:54:54Z", "hours": 7.2842, "text": "I’ve finally finished the phoenix! After finishing shading, I separated the key elements—head, body, wings—into different layers so that I could animate easier. Then I used the select tool to move and rotate the parts before fixing up the pixels. Unfortunately the wing feathers look wonky, but I’m not too sure how to approach that. After implementing ease in and out, here’s what I’ve completed : An idle animation (first four frames, and then reverse) An attack animation A transition to glowing eyes! A sudden burst of flame What I’ll be working on : The background pixel art The projectiles The boss health bar (The video has a clideo.com watermark because I needed to compress the video :( )"}, {"post_id": 40778, "ts": "2026-08-04T15:05:43Z", "hours": 9.1675, "text": "Today, I worked more on the phoenix’s wings and legs. I haven’t finished yet, but hopefully I’m close! Here’s what I’ve done: Fleshed out the shading and made the wings bigger two times Shaded the foot Added tufts to the phoenix head This has all been to make the bird look more like a phoenix! I’ve gotten criticism that it looks like a chicken, so I tried to make the proportions more accurate, sharpened the feathers, and tried to make the features fancier. I am told that it still looks like a chicken! Unfortunately, I’ve decided not to add flames, or make the bird thinner, or make the wings bigger (again), because this has already taken far too long! I haven’t even started animating yet! XD That’s not to say that these aren’t valid criticisms. These are very good suggestions, but I’d like to move on to other game art, not just the boss. I plan on finishing the art and at least starting animation, so that I can work on projectiles, the player, the boss health bar, etc! :)"}, {"post_id": 39411, "ts": "2026-08-02T11:12:32Z", "hours": 8.7511, "text": "Worked on the beginning boss of the game! I aimed to draw a feng huang — or phoenix — in Aseprite, but whoa, that took a lot more energy from me than expected! I focused on the head and body. Issues: Being a beginner in using Aseprite (I usually use pixilart.com) I didn’t remember to save :( I worked for about an hour on the face, but after my break and returning, I found that my work hadn’t saved!! Lesson learned: save every few seconds :P Design: After pasting the player health bar inside for a size comparison, I first blocked out the shape of the phoenix using a large 3x3 or 4x4 brush, with the main color. I started using a darker color to block out the features of the bird—feathers, eyes, etc… Then I attacked the birdie with bands of shading and lighting for each section of feather or eye to give more depth I decided to split the workflow into two different parts: the head and the body. You can notice how the feathers on the body look very different (and probably more wonky) from the feathers on the head and neck. Later this will help me separate out sections for animation :D What I should work on: Making the wings bigger (I am told that the phoenix looks like a chicken. ) Finishing the details of the feet and wings ANIMATION! Including: Idle Attack Damage I wonder how long that will take…haha…"}, {"post_id": 38607, "ts": "2026-08-01T02:44:58Z", "hours": 2.0886, "text": "I finished the player health bar in Aseprite! Design choices : The main mascot? Character? Of this educational game is a tiger. I wanted to reflect that while also taking inspiration from Chinese traditional lions (like those door knockers!) so here is a weird mashup! Lion? Tiger? Liger? No one shall know >:) I made it gold because yellow would definitely pop on the screen, which I hope would make it easy for players to locate on the screen. Also, gold gives a more heroic vibe :D Animation I wanted the animation to be simple, so it wouldn’t distract from the main game, but easy for the viewer to locate when needed. So I created a shiny light that travels across the bar using easing in, easing out, and smear frames! The plan is for this animation to occur from time to time, reminding the player of their health while also not being too distracting. Where is the actual red health? The red health is in another file, separate from the health bar The plan is to be able to crop out the red health as the health decreases, while ignoring the background bar. This allows for stylized health bars but fluid health decreasing/increasing animations!"}, {"post_id": 37769, "ts": "2026-07-30T18:02:46Z", "hours": 2.835, "text": "Now I have implemented a sort of “quiz” system. Added features: Arrays containing questions, choices, and corresponding correct answers Randomly chosen questions featured one at a time Detecting whether the player has shot the projectile featuring the correct answer, in which all the projectiles will destroy themselves Playing these features in a perpetual loop Features needed to be added I definitely need to add health to add some risk into the game! Art will play a big part in making this game fun :) EFFECTS - Such as screen shake or particles!"}, {"post_id": 37632, "ts": "2026-07-30T14:40:45Z", "hours": 7.2144, "text": "After getting the gist of Godot from Brackey’s tutorial, I decided to switch gears to a boss-fight type of game! What I added: The player rotates to face the mouse, allowing for aiming Left-clicking, or just simply tapping on the mouse pad, for shooting An area node for the boss A question appears on screen before triggering projectiles Projectiles from the boss, the number of which can be adjusted, are designed to be distanced by the same angle (ex 180/n, n being declared) A system using timer nodes that slows the game for a certain amount of time—allowing for the player to carefully aim and shoot—before returning to normal Why these features? Here’s the plan: The boss idles for a random amount of allotted time The boss then attacks! A randomly selected question—asking about adjectives, nouns, spelling, etc—appears on the screen. After being given enough time to read the question, projectiles with the answer choices are shot towards the player. If the player shoots the correct answer, the explosion harms the boss! But if the player shoots the wrong answer, the projectiles hurt them. I hope this makes learning English fun, but slightly fast-paced. Clearly I still have a lot to add! :)"}, {"post_id": 17821, "ts": "2026-06-28T19:12:16Z", "hours": 3.4136, "text": "Learned how to use Godot from the classic Brackeys tutorial: adding player movement, idle animation, tile set (testing), one way platforms, and moving platforms. Also created little tiger character as player! Need to add death, walking animation, better physics, and collectibles. Was hard for me to understand scenes and nodes but very rewarding in the end! :) Also planning to add the educational elements soon…"}]...
|
Title: Fun Learning Game by @lilfox | Stardance
D Title: Fun Learning Game by @lilfox | Stardance
Devlogs:
Learned how to use Godot from the classic Brackeys tutorial: adding player movement, idle animation, tile set (testing), one way platforms, and moving platforms. Also created little tiger character as player! Need to add death, walking animation, better physics, and collectibles. Was hard for me to understand scenes and nodes but very rewarding in the end! :) Also planning to add the educational elements soon…
After getting the gist of Godot from Brackey’s tutorial, I decided to switch gears to a boss-fight type of game! What I added: The player rotates to face the mouse, allowing for aiming Left-clicking, or just simply tapping on the mouse pad, for shooting An area node for the boss A question appears on screen before triggering projectiles Projectiles from the boss, the number of which can be adjusted, are designed to be distanced by the same angle (ex 180/n, n being declared) A system using timer nodes that slows the game for a certain amount of time—allowing for the player to carefully aim and shoot—before returning to normal Why these features? Here’s the plan: The boss idles for a random amount of allotted time The boss then attacks! A randomly selected question—asking about adjectives, nouns, spelling, etc—appears on the screen. After being given enough time to read the question, projectiles with the answer choices are shot towards the player. If the player shoots the correct answer, the explosion harms the boss! But if the player shoots the wrong answer, the projectiles hurt them. I hope this makes learning English fun, but slightly fast-paced. Clearly I still have a lot to add! :)
Now I have implemented a sort of “quiz” system. Added features: Arrays containing questions, choices, and corresponding correct answers Randomly chosen questions featured one at a time Detecting whether the player has shot the projectile featuring the correct answer, in which all the projectiles will destroy themselves Playing these features in a perpetual loop Features needed to be added I definitely need to add health to add some risk into the game! Art will play a big part in making this game fun :) EFFECTS - Such as screen shake or particles!
I finished the player health bar in Aseprite! Design choices : The main mascot? Character? Of this educational game is a tiger. I wanted to reflect that while also taking inspiration from Chinese traditional lions (like those door knockers!) so here is a weird mashup! Lion? Tiger? Liger? No one shall know >:) I made it gold because yellow would definitely pop on the screen, which I hope would make it easy for players to locate on the screen. Also, gold gives a more heroic vibe :D Animation I wanted the animation to be simple, so it wouldn’t distract from the main game, but easy for the viewer to locate when needed. So I created a shiny light that travels across the bar using easing in, easing out, and smear frames! The plan is for this animation to occur from time to time, reminding the player of their health while also not being too distracting. Where is the actual red health? The red health is in another file, separate from the health bar The plan is to be able to crop out the red health as the health decreases, while ignoring the background bar. This allows for stylized health bars but fluid health decreasing/increasing animations!
Worked on the beginning boss of the game! I aimed to draw a feng huang — or phoenix — in Aseprite, but whoa, that took a lot more energy from me than expected! I focused on the head and body. Issues: Being a beginner in using Aseprite (I usually use pixilart.com) I didn’t remember to save :( I worked for about an hour on the face, but after my break and returning, I found that my work hadn’t saved!! Lesson learned: save every few seconds :P Design: After pasting the player health bar inside for a size comparison, I first blocked out the shape of the phoenix using a large 3x3 or 4x4 brush, with the main color. I started using a darker color to block out the features of the bird—feathers, eyes, etc… Then I attacked the birdie with bands of shading and lighting for each section of feather or eye to give more depth I decided to split the workflow into two different parts: the head and the body. You can notice how the feathers on the body look very different (and probably more wonky) from the feathers on the head and neck. Later this will help me separate out sections for animation :D What I should work on: Making the wings bigger (I am told that the phoenix looks like a chicken. ) Finishing the details of the feet and wings ANIMATION! Including: Idle Attack Damage I wonder how long that will take…haha…
Today, I worked more on the phoenix’s wings and legs. I haven’t finished yet, but hopefully I’m close! Here’s what I’ve done: Fleshed out the shading and made the wings bigger two times Shaded the foot Added tufts to the phoenix head This has all been to make the bird look more like a phoenix! I’ve gotten criticism that it looks like a chicken, so I tried to make the proportions more accurate, sharpened the feathers, and tried to make the features fancier. I am told that it still looks like a chicken! Unfortunately, I’ve decided not to add flames, or make the bird thinner, or make the wings bigger (again), because this has already taken far too long! I haven’t even started animating yet! XD That’s not to say that these aren’t valid criticisms. These are very good suggestions, but I’d like to move on to other game art, not just the boss. I plan on finishing the art and at least starting animation, so that I can work on projectiles, the player, the boss health bar, etc! :)
I’ve finally finished the phoenix! After finishing shading, I separated the key elements—head, body, wings—into different layers so that I could animate easier. Then I used the select tool to move and rotate the parts before fixing up the pixels. Unfortunately the wing feathers look wonky, but I’m not too sure how to approach that. After implementing ease in and out, here’s what I’ve completed : An idle animation (first four frames, and then reverse) An attack animation A transition to glowing eyes! A sudden burst of flame What I’ll be working on : The background pixel art The projectiles The boss health bar (The video has a clideo.com watermark because I needed to compress the video :( )
After completing the phoenix (finally), here’s what I finished: The projectiles emitted from the boss. I wondered what it should be—a rock? A magic orb? Before realizing that it was a phoenix we were talking about, and that flames were basically their signature! I also added frame-by-frame animation to add more life to it. The boss health bar! It’s noticeably larger than the player’s, with a similar flame animation as the projectiles. It doesn’t have that gold sheen, but I hope it has its own unique style that gives off phoenix vibes! What I’m working on: The background! I’ve only created two pillars, but I’m planning on an entrance to a temple. To make the colors blend more together, I actually used the jumble tool! (The enemy is there as a reference to the size proportions) What I plan to do after finishing the background: Besides more pixel art (player, arrows), I want to implement the art into the game! The game’s framework is basically done, though I’ll definitely add more features so that it isn’t so repetitive. I also need to work on the health bars, which is exciting! :)
Worked on the background environment. Added: Pillars Doorway Brick texture Shading The most difficult thing for me is to make every element fit together. I hope I can finish the background today and probably work on the player and arrows. I also just realized that I should probably work on the projectile dissipating animation, too. Off to work!
Wowee, I finished the background! I mostly worked on the tiles and shadows, which I hope makes the environment more immersive and detailed. I also added in some of the complete assets into Godot! While I still have some pixel art to work on, such as: The player Arrows The projectiles exploding animation I think now is a good time to take a break from Aseprite and work in Godot. Since the pixel art is already way smaller than the original prototype, here’s what I need to work on: Adjusting the game code to the new screen size Slowing down projectiles and adjusting the time when they slow down Changing the question tweens so that the text doesn’t fly off the screen Changing player position Adding in the health bar sprites with functionality Implementing animation phases for the boss (play this animation when attacking, play this animation when idling, etc) VFX and SFX
I’ve put some of the pixel art into the game, and it’s looking good! The thing about the prototype is that it didn’t consider scale or size, so I had to change: The placement and zoom of the camera The size and tween animations of the quiz questions The player and enemy sprite + hitbox size However, I also finished: Health bars for the player and boss Tweens that would smoothly adjust the health (which was why the red health and the bar were drawn separately) Areas where the projectiles would be slow or fast. Initially this was controlled by timers, but I found that this was too buggy for my mom’s computer, so I just used area detection instead to make everything more consistent. For the future, I added: An attack button A text input box (line edit node) An area for the text questions (label node) For now, there is no function yet, but this will be used for an attack system. How it will work is that, when you press attack, you are given a question requiring a typed answer. Answering it correctly would send a powerful attack to the enemy, while answering it wrong would decrease your health by a little bit. Looking forward to implementing this system! (Also don’t worry, I’ll def add pixel art for the player and the arrows trust :D )
I added functionality to the attack system! Now it can: Show the question and input text box when the attack button is clicked Detect correct answers and wrong answers I also added: An attack bar that stores how many answers you got correct. Once you’ve answered a certain number of questions correctly, I plan for a button on the left to unlock You may already notice the buttons in the bottom left! When I filled the bar once, one of the buttons unlocked, a timer ran out (signified by the white bar), and I could click the button. For the future: The buttons you have to unlock are actually buttons that allow you attack! So I’ll add different attack functionalities to different buttons. The buttons look kinda bland. I’m planning to add some sprites in place of the buttons. I’m thinking of putting some transparent gray space behind the text to make it more readable. I really hope I can finish this game next devlog! Seeya there! :)
I’m so close to finishing the game! First of all, I finished the attack system. Basically, you answer a certain number of questions under the “attack” button, filling up the bar next to it. When it fills up, you unlock a new weapon. After it cools down, you can use it; but on the first time of cycling through every weapon, only once! As you complete more cycles, though, that increases to twice, then three times, etc. I also added pixel art to the buttons. I took away the “attack” label of the attack button because the students I tutor don’t know that word yet. Instead, I used an animation in hopes of incentivising them to click it. The other buttons include: The arrow Two arrows Copper sword Diamond sword Which brings me to my next development––when you click those buttons, there’s an actual attack! An arrow animation, a two-arrow animation, a copper sword animation, etc were added to the mix. I hope to add music, SFX, and maybe simple instructions for the future. Finally, I implemented a losing and winning screen using the same node in the system, detecting player and enemy health.
I finished the game! :D Added sound effects for: Clicking buttons Player attacks Phoenix attacks Phoenix caw (to signal to the player that a barrage of projectiles is coming if they are too busy with the attack button) Background music! The quiz I finally added real questions! I wanted to focus on spelling for this one, so I used emojis and asked the user how the words representing them were spelled. Text stuff Added text instruction at the beginning Changed fonts of the text nodes featuring emojis (more on that later) Web shenanigans I wanted to make sure that the game would be available on devices that did not support downloading .exe (like chromebooks, for example). But uh…that was harder than I was expecting! I used netlify to create a url after exporting the game for html5. The first issue in business was that the camera was zoomed out when the website was launched, showing the gray blank space of the Godot dimension. This took a bit to figure out, but apparently I had to adjust the stretch mode and aspect in project settings. The second issue was that the emojis were showing up as white-boxed hex codes in the web version (for some reason!! >:( ). Turns out that I needed a different dedicated font for the emojis so that they could be compatable on all devices. Oh well, haha. At least it’s more accessible! :D (PS. I’m sincerely sorry for the terrible audio quality in the video, I can’t screen record and the speakers on this computer are outrageous :’) )
Ships:
This is especially made for the Chinese students I tutor! I made a boss fight game that uses shooter and (possibly) rpg elements to help the player practice kindergarten level English spelling. Just formulating the idea and incorporating it was challenging, though. From changing the genre of my game from a platformer to a boss-fight, to painstakingly drawing and animating the pixel art of the game, to learning Godot as a beginner…it’s been a wild ride! I’m proud that I was able to create a coherent and (hopefully) fun game, while learning new things about Godot and Aseprite. Nodes, signals, layers, frames, all bunched up together. While this is my first time making a game, I hope that my time and effort makes this an enjoyable experience for you! The link to my project is over at https://english-spelling-lesson.netlify.app (unfortunately this game requires a keyboard). G’ day. :)...
|
1792990294.8608341
|
1793076694.8608341
|
|
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....
|
1793005026.9363291
|
1793091426.9363291
|
|
56694
|
[MOVED] Discord User Apps Bot by @stefdp | Stardan [MOVED] Discord User Apps Bot by @stefdp | Stardance...
|
stefdp
|
1
|
85.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-24T13:33:42Z", "hours": 85.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I rewrote my userApps Discord bot from TypeScript to Kotlin just because I prefer kotlin now that i’ve been using it for about a while, and in the meanwhile i also added new commands to it", "repo": "https://git.stefdp.com/Stef/userApps", "demo": "https://discord.com/oauth2/authorize?client_id=1223221223685886032"}]...
|
[{"post_id": 72794, "ts": "202 [{"post_id": 72794, "ts": "2026-09-23T19:06:22Z", "hours": 0.3492, "text": "Added environment check in the API endpoint like /status enable command Emoji envs are now correctly formatted in the error message Marked /status command as owner only"}, {"post_id": 72707, "ts": "2026-09-23T15:29:45Z", "hours": 3.7897, "text": "Rewrote the web dashboard to look better (by orangc) Added the API endpoints to manage commands on the dash side Added support for docker compose"}, {"post_id": 70873, "ts": "2026-09-19T22:10:42Z", "hours": 5.3797, "text": "Created the /help command: list all the commands of get info about a specific one Temporarily took the old dashboard and adapted it to the new framework (the html side is gonna get remade by a friend, orangc) Removed some unused envs Added TailwindCSS compiling at startup soit can be used in the dashboard"}, {"post_id": 70257, "ts": "2026-09-18T20:20:48Z", "hours": 5.9111, "text": "Created the /uptime command: display how long the bot has been online for Created the /lyrics command: get the lyrics of a song (uses lrclib.net, lrcmux and lyricsOVH as sources) Fixed /define command failing when there were too many definitions (was going over the 40 components limit) Created the main README file Added ownerOnly property to commands, so when they’re first added to the db, it sets the list of owners in the OWNERS env as allowed users Added attachment options to the /embed command (for some reasons they’re added correctly but image and thumbnail don’t display while footer and author do)"}, {"post_id": 69649, "ts": "2026-09-17T14:30:09Z", "hours": 4.295, "text": "Created the /ubdict command: get the definition of a term from the urban dictionary Created the /wikipedia command: get an article from wikipedia Created the /fact command: get a random fact Created the /joke command: get a random joke Added a util function to split strings in group of approximately X character, but instead of cutting the text at exactly X characters, it cuts at the next end of a sentence after X characters, this way a sentence is never cut in half during pagination (currently only place where it’s used, aka /wikipedia command) Added the User-Agent header to all the HTTP requests Updated HttpLoggingInterceptor to use the correct logger class"}, {"post_id": 68211, "ts": "2026-09-14T18:17:54Z", "hours": 2.95, "text": "Created the /define command: get the definition of a word Updated the /steam game command to use components v2, and also a button to show the full game description if the detailed mode is too long to fit Switched some places from if (xxx) { ... } else { null } to xxx?.let { ... }"}, {"post_id": 67479, "ts": "2026-09-13T16:26:49Z", "hours": 7.7817, "text": "Created the Get User Banner command (user): …what the name says Created the /github command (slash): get info about a GH user, repo or issue/PR Created the /weather command (slash): get the current weather of a specific place /steam game now uses buildString {} instead of adding to a array, then joining and merging it with another string"}, {"post_id": 66516, "ts": "2026-09-12T11:06:55Z", "hours": 6.5256, "text": "Created the /steam command (slash): get info about a Steam game (optional detailed mode) or user Created the /translate command (slash): convert any text from a language to another (about 131 languages available) Installed the MS Azure SDK for the /translate (slash) & Translate Message (message) commands Updated file layout for the dashboard so it looks better Updated API services file layout too Updated Kotlin from 2.4.10 to 2.4.20 and other libs"}, {"post_id": 65657, "ts": "2026-09-10T22:56:19Z", "hours": 4.5164, "text": "Running a command now increases its uses value is the anonymous analytics table Added new env variables and improved the system used to throw errors so it always kills all the processes when calling require Created the dashboard ratelimits, sessions, auth middlewares/systems Created the Discord OAuth2 login Moved kord into a Bot object so it can be used in the dashboard too if needed Created a listener for the discord webhook (stuff like bot authorized, bot deauthorized etc.) [UNTESTED] Created a util function to get the bot’s invite url Created API services for the discord OAuth2 token requesting and apprise API There’s not much frontend / UI change so ima show a pic of the dash module code ig"}, {"post_id": 65422, "ts": "2026-09-10T15:31:24Z", "hours": 5.8289, "text": "Created the /export command (slash): send the file path and export it (as well as give the file’s github url (owner only) Created the Save as Tag command (message): save a message as tag, both embeds & content Created the Convert to QR Code command (message): convert a message’s content to a QR code (either as image or text) Created the Download Voice Message command (message): as the name says, download as MP3 a user’s voice message Created the Set as Reminder command (message): set a user’s message (either content or URL) as a reminder Created the Get Message JSON command (message): get the JSON object of the message Created the Get Member Avatar command (user): get the server specific avatar of the user Created the Get User Avatar command (user): get the global avatar of the user Created the Get User Avatar Decoration command (user): get the avatar decoration of the user Created the Get Member JSON command (user): get the JSON object of the member Created the Get User JSON command (user): get the JSON object of the user Environment variables are now loaded at startup via a gradle task Added a LOG_LEVEL env to choose the level of the console output to show Created a util function for plurals Set tag name limit to 255 chars"}, {"post_id": 64121, "ts": "2026-09-08T10:02:03Z", "hours": 7.1333, "text": "Added the /tag command: save preset messages that you can then send later (they can also contain embeds) it has the following subcommands: content : set or remove the content of a tag embed : add or remove an embed from a tag delete : delete a tag export : export all your tags as a JSON file import : import the JSON file obtained from the export subcommand (in case of conflicts, the old and new tag will be previeable in the bot dashboard if enabled) list : Display all your subcommands get : Get the content & embeds of a specific subcommand Fixed/Impoved the /embed command button & modal handlers & added an ID to buttons & modals to avoid 2 diff commands handling the same interaction"}, {"post_id": 62806, "ts": "2026-09-06T10:14:43Z", "hours": 5.5831, "text": "Created the /gary command: get random images of 4 cats: Gary, Goober, Gulliber (Gully) and Garfield Created the /ping command: get the bot’s ping (pic has high ping cuz it’s running on my laptop, in Italy) Created the /botavatar command: change the bot avatar, either from a file, URL, copy from an user or copy from the bot owner Created the /colorpicker command: give an HEX, RGB or HSL color and it displays it as well as showing its HEX, RGB and HSL variants Added the /reminders command: set a reminder and the bot will send you a DM, reminder can either be single-run, multi-run and inifinitely run (the user defines an interval such as 30m , 2d15h etc., then the bot will send a DM with the reminder after this interval and will repeat it how many times the user defined it to, so if an user defines a reminder with 2h interval and 3 repeats, it will send the same reminder in 2h, 4h and 6h) (hope i explained well ) Switched database initialization from SchemaUtils to MigrationUtils this way if i edit a scheme, it’s also applied at startup instead of just creating new tables and never modifying them Made the dashboard disableable"}, {"post_id": 61179, "ts": "2026-09-03T23:53:05Z", "hours": 6.5219, "text": "Created the /minecraft command: allows to fetch Java and Bedrock edition server data (with mcstatus.io API ) Player info (with Starlight API by lunareclipse.studio ) Player skin rendered as a 3D model in different poses (with Starlight API) Created the /embed command: send anything as an embed Created the /qr command: encode some text into a QR Code (output can be an image or an ASCII text) Updated the dashboard to add a static resource /skinModels which is used for the /minecraft skin sub command to fetch custom made models Added a regex for HEX colors (matches #ffffff , #fff , ffffff and fff ) created a Minecraft object to collect all minecraft related functions Created the starlight and mcstatus.io API services & added them in the API client Update main handleRequest function to add an optional error handler"}, {"post_id": 60524, "ts": "2026-09-02T22:26:55Z", "hours": 3.5928, "text": "Added the /8ball command: ask a question and get a random answer Added topic command: get a random topic to start a conversation Added /qalc command: execute calculation using libqalculate Added /console command: run any shell command Added /animal command: get a random animal (cat, dog, fox, duck) Added /ip command: get info about an IPv4 or IPv6 address Installed the retrofit libs required to make HTTP requests Added a regex to check if a IPv4 or IPv6 is valid (took from networkingtoolbox.net ) Created util function to get the country flag & name from its code (took from my Hackatime android app)"}, {"post_id": 60238, "ts": "2026-09-02T14:13:38Z", "hours": 5.9553, "text": "Added /http command: get a HTTP status with the picture of an animal like cat, dog, goat, duck etc. Added /perms command: add/remove/list the users allowed to use a specific command Added /status command: enable/disable specific commands Added /dig : perform a dig query on a domain Added /whois : perform a WHOIS query on a domain/IP/ASN Fixed database upsert function erroring because no column was being passed as keys (primary) Moved command registration to the onReady event Installed a lib for DNS queries and a lib to check other libs updates Added a utility Domain object that contains the function to perform dig and whois queries Added utility functions to convert a ISO string, epoch seconds or Instant to discord time format"}, {"post_id": 59784, "ts": "2026-09-01T18:32:38Z", "hours": 3.5347, "text": "Created the /eval command Added the registration & handling of the commands (also checks if the user can run the command and if the command is enabled, by checking the enabled status and allowedUsers list in the command_permissions table) Installed some libs to run code at runtime (JavaScript, Python and Kotlin (used in /eval )"}, {"post_id": 59212, "ts": "2026-08-31T21:38:20Z", "hours": 4.8561, "text": "Created the base skeleton with the bot (w/ events), web dashboard (rn just shows “WIP” text) and database with the schemes & some helper functions For the Discord bot i’m using the Kord library For the web dashboard i’m using the Ktor library This is the first time i use either of those 2 libs so my usage may not be the best"}]...
|
Title: [MOVED] Discord User Apps Bot by @stefdp | Title: [MOVED] Discord User Apps Bot by @stefdp | Stardance
Devlogs:
Created the base skeleton with the bot (w/ events), web dashboard (rn just shows “WIP” text) and database with the schemes & some helper functions For the Discord bot i’m using the Kord library For the web dashboard i’m using the Ktor library This is the first time i use either of those 2 libs so my usage may not be the best
Created the /eval command Added the registration & handling of the commands (also checks if the user can run the command and if the command is enabled, by checking the enabled status and allowedUsers list in the command_permissions table) Installed some libs to run code at runtime (JavaScript, Python and Kotlin (used in /eval )
Added /http command: get a HTTP status with the picture of an animal like cat, dog, goat, duck etc. Added /perms command: add/remove/list the users allowed to use a specific command Added /status command: enable/disable specific commands Added /dig : perform a dig query on a domain Added /whois : perform a WHOIS query on a domain/IP/ASN Fixed database upsert function erroring because no column was being passed as keys (primary) Moved command registration to the onReady event Installed a lib for DNS queries and a lib to check other libs updates Added a utility Domain object that contains the function to perform dig and whois queries Added utility functions to convert a ISO string, epoch seconds or Instant to discord time format
Added the /8ball command: ask a question and get a random answer Added topic command: get a random topic to start a conversation Added /qalc command: execute calculation using libqalculate Added /console command: run any shell command Added /animal command: get a random animal (cat, dog, fox, duck) Added /ip command: get info about an IPv4 or IPv6 address Installed the retrofit libs required to make HTTP requests Added a regex to check if a IPv4 or IPv6 is valid (took from networkingtoolbox.net ) Created util function to get the country flag & name from its code (took from my Hackatime android app)
Created the /minecraft command: allows to fetch Java and Bedrock edition server data (with mcstatus.io API ) Player info (with Starlight API by lunareclipse.studio ) Player skin rendered as a 3D model in different poses (with Starlight API) Created the /embed command: send anything as an embed Created the /qr command: encode some text into a QR Code (output can be an image or an ASCII text) Updated the dashboard to add a static resource /skinModels which is used for the /minecraft skin sub command to fetch custom made models Added a regex for HEX colors (matches #ffffff , #fff , ffffff and fff ) created a Minecraft object to collect all minecraft related functions Created the starlight and mcstatus.io API services & added them in the API client Update main handleRequest function to add an optional error handler
Created the /gary command: get random images of 4 cats: Gary, Goober, Gulliber (Gully) and Garfield Created the /ping command: get the bot’s ping (pic has high ping cuz it’s running on my laptop, in Italy) Created the /botavatar command: change the bot avatar, either from a file, URL, copy from an user or copy from the bot owner Created the /colorpicker command: give an HEX, RGB or HSL color and it displays it as well as showing its HEX, RGB and HSL variants Added the /reminders command: set a reminder and the bot will send you a DM, reminder can either be single-run, multi-run and inifinitely run (the user defines an interval such as 30m , 2d15h etc., then the bot will send a DM with the reminder after this interval and will repeat it how many times the user defined it to, so if an user defines a reminder with 2h interval and 3 repeats, it will send the same reminder in 2h, 4h and 6h) (hope i explained well ) Switched database initialization from SchemaUtils to MigrationUtils this way if i edit a scheme, it’s also applied at startup instead of just creating new tables and never modifying them Made the dashboard disableable
Added the /tag command: save preset messages that you can then send later (they can also contain embeds) it has the following subcommands: content : set or remove the content of a tag embed : add or remove an embed from a tag delete : delete a tag export : export all your tags as a JSON file import : import the JSON file obtained from the export subcommand (in case of conflicts, the old and new tag will be previeable in the bot dashboard if enabled) list : Display all your subcommands get : Get the content & embeds of a specific subcommand Fixed/Impoved the /embed command button & modal handlers & added an ID to buttons & modals to avoid 2 diff commands handling the same interaction
Created the /export command (slash): send the file path and export it (as well as give the file’s github url (owner only) Created the Save as Tag command (message): save a message as tag, both embeds & content Created the Convert to QR Code command (message): convert a message’s content to a QR code (either as image or text) Created the Download Voice Message command (message): as the name says, download as MP3 a user’s voice message Created the Set as Reminder command (message): set a user’s message (either content or URL) as a reminder Created the Get Message JSON command (message): get the JSON object of the message Created the Get Member Avatar command (user): get the server specific avatar of the user Created the Get User Avatar command (user): get the global avatar of the user Created the Get User Avatar Decoration command (user): get the avatar decoration of the user Created the Get Member JSON command (user): get the JSON object of the member Created the Get User JSON command (user): get the JSON object of the user Environment variables are now loaded at startup via a gradle task Added a LOG_LEVEL env to choose the level of the console output to show Created a util function for plurals Set tag name limit to 255 chars
Running a command now increases its uses value is the anonymous analytics table Added new env variables and improved the system used to throw errors so it always kills all the processes when calling require Created the dashboard ratelimits, sessions, auth middlewares/systems Created the Discord OAuth2 login Moved kord into a Bot object so it can be used in the dashboard too if needed Created a listener for the discord webhook (stuff like bot authorized, bot deauthorized etc.) [UNTESTED] Created a util function to get the bot’s invite url Created API services for the discord OAuth2 token requesting and apprise API There’s not much frontend / UI change so ima show a pic of the dash module code ig
Created the /steam command (slash): get info about a Steam game (optional detailed mode) or user Created the /translate command (slash): convert any text from a language to another (about 131 languages available) Installed the MS Azure SDK for the /translate (slash) & Translate Message (message) commands Updated file layout for the dashboard so it looks better Updated API services file layout too Updated Kotlin from 2.4.10 to 2.4.20 and other libs
Created the Get User Banner command (user): …what the name says Created the /github command (slash): get info about a GH user, repo or issue/PR Created the /weather command (slash): get the current weather of a specific place /steam game now uses buildString {} instead of adding to a array, then joining and merging it with another string
Created the /define command: get the definition of a word Updated the /steam game command to use components v2, and also a button to show the full game description if the detailed mode is too long to fit Switched some places from if (xxx) { ... } else { null } to xxx?.let { ... }
Created the /ubdict command: get the definition of a term from the urban dictionary Created the /wikipedia command: get an article from wikipedia Created the /fact command: get a random fact Created the /joke command: get a random joke Added a util function to split strings in group of approximately X character, but instead of cutting the text at exactly X characters, it cuts at the next end of a sentence after X characters, this way a sentence is never cut in half during pagination (currently only place where it’s used, aka /wikipedia command) Added the User-Agent header to all the HTTP requests Updated HttpLoggingInterceptor to use the correct logger class
Created the /uptime command: display how long the bot has been online for Created the /lyrics command: get the lyrics of a song (uses lrclib.net, lrcmux and lyricsOVH as sources) Fixed /define command failing when there were too many definitions (was going over the 40 components limit) Created the main README file Added ownerOnly property to commands, so when they’re first added to the db, it sets the list of owners in the OWNERS env as allowed users Added attachment options to the /embed command (for some reasons they’re added correctly but image and thumbnail don’t display while footer and author do)
Created the /help command: list all the commands of get info about a specific one Temporarily took the old dashboard and adapted it to the new framework (the html side is gonna get remade by a friend, orangc) Removed some unused envs Added TailwindCSS compiling at startup soit can be used in the dashboard
Rewrote the web dashboard to look better (by orangc) Added the API endpoints to manage commands on the dash side Added support for docker compose
Added environment check in the API endpoint like /status enable command Emoji envs are now correctly formatted in the error message Marked /status command as owner only
Ships:
I rewrote my userApps Discord bot from TypeScript to Kotlin just because I prefer kotlin now that i’ve been using it for about a while, and in the meanwhile i also added new commands to it...
|
1793004890.0812786
|
1793091290.0812786
|
|
60859
|
Melee Unbound by @Floppy | Stardance
|
Floppy
|
1
|
85.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T01:42:18Z", "hours": 85.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I cant believe I’m finally done with this project 🥹", "repo": "https://github.com/HexDump0/melee", "demo": "https://melee.hexdump0.pw/"}]...
|
[{"post_id": 70365, "ts": "202 [{"post_id": 70365, "ts": "2026-09-19T01:39:41Z", "hours": 4.6103, "text": "Ninth devlog I’m finally done with polishing the project up,making a website for it, building it for different platforms,writing the readme and alot of other stuff and after so much work the web port is finally live too https://melee.hexdump0.pw/"}, {"post_id": 70040, "ts": "2026-09-18T10:53:38Z", "hours": 10.0236, "text": "Eighth devlog And yep I’ve just been fixing up more crashes, making the website, creating a custom menu item and a custom intro cutscene"}, {"post_id": 69487, "ts": "2026-09-17T04:40:08Z", "hours": 9.6197, "text": "Seventh devlog And I’m finally happy now, I manged to fix most if all of the crashes (thank you claude ) and I optimized the hell out of the render to make it even more playable And big news! The web port is working too , this took so much time and yep, the port is 90% of the way done just need to add some qol mods, design some graphics and we are done"}, {"post_id": 68989, "ts": "2026-09-16T05:20:39Z", "hours": 10.7094, "text": "Sixth devlog This is literal hell, I chose to read the disc data as little endian and write converters and walkers for the game Turns out doing that is not so easy, there is about ~100 different unique crashes that happen (100 is the number of ones I could actually find ) and each one requires a whole lot of time and effort to fix manually So yea the 10 hours were spent grinding away using my LLMs to get it down to ~20 crashes, there is still alot of work that needs to be done for the 20 crashes and even more for the ones I have found yet Hopefully by the next devlog I would actually be happy"}, {"post_id": 68372, "ts": "2026-09-15T00:59:23Z", "hours": 11.4506, "text": "Fifth devlog So more bug fixes! There was (and still is) alot of bugs and crashs coz of stupid endianess and layout, But I think I managed to fix a good chunk of them and the game is actually quite playable now excluding it panicing every now and them"}, {"post_id": 67817, "ts": "2026-09-14T02:18:29Z", "hours": 11.9217, "text": "Fourth devlog And we have the full game (almost!), It took alot of effort and time to get here, but now the whole game runs natively There is still alot of bugs, crashes and other stuff that has to be fixed before it actually playable tho Hopefully I would have a functional port by this week"}, {"post_id": 67090, "ts": "2026-09-13T04:30:29Z", "hours": 8.2089, "text": "Third devlog Crazy! Crazy! progress so far I have gotten to actual decompiled game logic to run It was not easy I spent a whole day fighting with endianness, finding little gamecube quirks and whole alot of other stuff But alas, we have a match running All thats left is the game ui and polish"}, {"post_id": 66479, "ts": "2026-09-12T10:00:45Z", "hours": 9.1558, "text": "Second devlog So I did a whole bunch of work, this included kinda throwing out my current progress as I realized hand porting 100k lines of code isn’t really viable The new architecture is to compile the actual decomped codebase and write shims/wrapper around it for the non portable stuff (dics,audio,render engine,etc) I rewrote the entire renderer for this new architecture and manged to get stages rendering"}, {"post_id": 65726, "ts": "2026-09-11T02:08:53Z", "hours": 9.3108, "text": "First devlog (p.s I am really bad at devlogging consistently ) Alright so Super Smash Bros Melee for the game cube was fully decompiled last week and its the perfect time to port it to modern computers and to also benchmark LLMs on what they can achieve So far I was able to get a model/animation viewer working! also nitendo please dont vaporizer me thank you"}]...
|
Title: Melee Unbound by @Floppy | Stardance
Devlo Title: Melee Unbound by @Floppy | Stardance
Devlogs:
First devlog (p.s I am really bad at devlogging consistently ) Alright so Super Smash Bros Melee for the game cube was fully decompiled last week and its the perfect time to port it to modern computers and to also benchmark LLMs on what they can achieve So far I was able to get a model/animation viewer working! also nitendo please dont vaporizer me thank you
Second devlog So I did a whole bunch of work, this included kinda throwing out my current progress as I realized hand porting 100k lines of code isn’t really viable The new architecture is to compile the actual decomped codebase and write shims/wrapper around it for the non portable stuff (dics,audio,render engine,etc) I rewrote the entire renderer for this new architecture and manged to get stages rendering
Third devlog Crazy! Crazy! progress so far I have gotten to actual decompiled game logic to run It was not easy I spent a whole day fighting with endianness, finding little gamecube quirks and whole alot of other stuff But alas, we have a match running All thats left is the game ui and polish
Fourth devlog And we have the full game (almost!), It took alot of effort and time to get here, but now the whole game runs natively There is still alot of bugs, crashes and other stuff that has to be fixed before it actually playable tho Hopefully I would have a functional port by this week
Fifth devlog So more bug fixes! There was (and still is) alot of bugs and crashs coz of stupid endianess and layout, But I think I managed to fix a good chunk of them and the game is actually quite playable now excluding it panicing every now and them
Sixth devlog This is literal hell, I chose to read the disc data as little endian and write converters and walkers for the game Turns out doing that is not so easy, there is about ~100 different unique crashes that happen (100 is the number of ones I could actually find ) and each one requires a whole lot of time and effort to fix manually So yea the 10 hours were spent grinding away using my LLMs to get it down to ~20 crashes, there is still alot of work that needs to be done for the 20 crashes and even more for the ones I have found yet Hopefully by the next devlog I would actually be happy
Seventh devlog And I’m finally happy now, I manged to fix most if all of the crashes (thank you claude ) and I optimized the hell out of the render to make it even more playable And big news! The web port is working too , this took so much time and yep, the port is 90% of the way done just need to add some qol mods, design some graphics and we are done
Eighth devlog And yep I’ve just been fixing up more crashes, making the website, creating a custom menu item and a custom intro cutscene
Ninth devlog I’m finally done with polishing the project up,making a website for it, building it for different platforms,writing the readme and alot of other stuff and after so much work the web port is finally live too https://melee.hexdump0.pw/
Ships:
I cant believe I’m finally done with this project 🥹...
|
1793055251.6077743
|
1793141651.6077743
|
|
53079
|
Polymod by @maxicode | Stardance
|
maxicode
|
0
|
84.93
|
0
|
[]
|
[{"post_id": 60721, "ts": "202 [{"post_id": 60721, "ts": "2026-09-03T08:52:53Z", "hours": 2.5806, "text": "i added pako fingerprint detection"}, {"post_id": 59803, "ts": "2026-09-01T19:05:04Z", "hours": 8.9503, "text": "turns out webpack arbitrarily decided to inline 1 threejs class into polytrack’s custom wrapper module???? i’m pretty sure the only way to account for this is by splicing out three.js at the declaration-level using a cross-module control flow graph so i’m now working on the necessary refactorings for that as seen below, i basically need to fingerprint every single variable/function/class declaration across every module, instead of only checking exports of each"}, {"post_id": 58717, "ts": "2026-08-31T08:07:52Z", "hours": 6.8011, "text": "i re-refactored everything again and did a bunch more testing. turns out some three.js modules were being missed due to terser’s peephole optimizations on template expressions and string concatenation :("}, {"post_id": 58377, "ts": "2026-08-30T19:48:21Z", "hours": 9.9361, "text": "the three.js detector can now fingerprint and detect the majority of three.js modules! still, many of the fingerprints don’t have enough entropy or got mangled by webpack/terser, so it doesn’t completely work."}, {"post_id": 57708, "ts": "2026-08-29T23:12:20Z", "hours": 9.9378, "text": "as it turns out, the bundle still had a lot of undiscovered media files that needed new scanning infrastructure to detect. however, after that was written, i was able to get asset linking and js-sha version extraction working. unfortunately fingerprinting Three.js’s hundreds of modules down to a precise version is very hard so that is still not done."}, {"post_id": 55555, "ts": "2026-08-27T14:14:46Z", "hours": 10.5422, "text": "full bundle->cjs->esm works now! some modules are dynamically loaded from other chunk files because Polytrack’s author enabled source splitting, so i restructured the driver code to support multi-bundle recursive module/chunk loading. also, i originally had the converter unwrap umd wrappers, but i realized that’s completely pointless because the entire module will get spliced out by npm detection, so it just marks such modules as “complex.” unbundling wise, the only thing left to write is npm package detection."}, {"post_id": 54925, "ts": "2026-08-26T04:44:47Z", "hours": 11.9989, "text": "loader detection works now! i had to rewrite the entire unpacking library with custom semantic AST traversal to keep everything zero-copy without unsafe blocks"}, {"post_id": 53976, "ts": "2026-08-24T18:03:32Z", "hours": 10.1744, "text": "module splicing works now, so the webpack unbundler is able split the bundle into multiple commonjs chunks in <0.1s! next is to add webpack helper inlining, webpack loader detection (for non-js assets), and cjs->esm conversion."}, {"post_id": 52694, "ts": "2026-08-22T23:43:54Z", "hours": 14.0058, "text": "static JS analysis is hard to do so all you get is a screenshot of code :( i took a dump of Polytrack’s code and found that it is distributed in webpack bundles. so, i’m currently working on a rust script that uses oxc to parse an AST, simplify the bundle, and then split it into separate linked files."}]...
|
Title: Polymod by @maxicode | Stardance
Devlogs:
Title: Polymod by @maxicode | Stardance
Devlogs:
static JS analysis is hard to do so all you get is a screenshot of code :( i took a dump of Polytrack’s code and found that it is distributed in webpack bundles. so, i’m currently working on a rust script that uses oxc to parse an AST, simplify the bundle, and then split it into separate linked files.
module splicing works now, so the webpack unbundler is able split the bundle into multiple commonjs chunks in <0.1s! next is to add webpack helper inlining, webpack loader detection (for non-js assets), and cjs->esm conversion.
loader detection works now! i had to rewrite the entire unpacking library with custom semantic AST traversal to keep everything zero-copy without unsafe blocks
full bundle->cjs->esm works now! some modules are dynamically loaded from other chunk files because Polytrack’s author enabled source splitting, so i restructured the driver code to support multi-bundle recursive module/chunk loading. also, i originally had the converter unwrap umd wrappers, but i realized that’s completely pointless because the entire module will get spliced out by npm detection, so it just marks such modules as “complex.” unbundling wise, the only thing left to write is npm package detection.
as it turns out, the bundle still had a lot of undiscovered media files that needed new scanning infrastructure to detect. however, after that was written, i was able to get asset linking and js-sha version extraction working. unfortunately fingerprinting Three.js’s hundreds of modules down to a precise version is very hard so that is still not done.
the three.js detector can now fingerprint and detect the majority of three.js modules! still, many of the fingerprints don’t have enough entropy or got mangled by webpack/terser, so it doesn’t completely work.
i re-refactored everything again and did a bunch more testing. turns out some three.js modules were being missed due to terser’s peephole optimizations on template expressions and string concatenation :(
turns out webpack arbitrarily decided to inline 1 threejs class into polytrack’s custom wrapper module???? i’m pretty sure the only way to account for this is by splicing out three.js at the declaration-level using a cross-module control flow graph so i’m now working on the necessary refactorings for that as seen below, i basically need to fingerprint every single variable/function/class declaration across every module, instead of only checking exports of each
i added pako fingerprint detection...
|
1792734782.4840138
|
1793339582.4840138
|
|
49988
|
Practice 2D Platformer by @RedstoneStar | Stardanc Practice 2D Platformer by @RedstoneStar | Stardance...
|
RedstoneStar
|
1
|
84.71
|
144
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-23T17:45:37Z", "hours": 42.0, "multiplier": 3.64, "payout": 144, "blessing": "neutral", "text": "This is my simple 2d platformer. Before making this project I knew very little about coding in Python so I wanted to work on this project to fix that. In the past I’ve used a bunch of YouTube tutorials to teach me how to code so this time I wanted to try something different. I created a custom Gemini gem that walked me step by step through creating the base game, then helped me add on improvements such as enemies and moving platforms. Key Features: Smooth platforming: Precise movement tracking keeps the character steady on moving platforms without slipping. Varied movement: Double jumps, wall slides, wall jumps, and a dash move to smash weak blocks. Animations: Squish-and-stretch effects when jumping and landing give the character extra feel. Smart enemies: Jumping enemies detect edges and turn around instead of walking off ledges. 10-levels: Includes built-in tutorial prompts to teach new moves as the player progresses. I know the game is really simple, and that is mostly on purpose; this was meant to be just a fun way to practice my Python skills. Hope you enjoy!", "repo": "https://github.com/RedstoneStar/Practice2DPlatformer", "demo": "https://redstonestar.github.io/Practice2DPlatformer/"}]...
|
[{"post_id": 63961, "ts": "202 [{"post_id": 63961, "ts": "2026-09-08T01:41:23Z", "hours": 27.6347, "text": "Devlog #6 After far more hours of debugging than I care to admit, I finally figured out why the springs didn’t launch the player when they walked through the spring. I eventually figured out it was an issue caused by how I was applying the upward momentum. Main changes in this update: Updated graphics. Slightly improved the performance by condensing some logic code Added a new flying enemy. Added 5 new levels. Improved the previous 10 levels to make them more interesting. Problems still needing to be fixed: The flying enemy is having graphical glitches with its charging animation."}, {"post_id": 61832, "ts": "2026-09-04T22:48:48Z", "hours": 15.0753, "text": "Devlog #5 for my simple 2D platformer Since I started this project I feel like I have gotten so much better at Python and because of that, I’ve spent the last couple of days rewriting pretty much all of the core mechanics of the platformer. Pretty much all of the code that Gemini helped me develop and then improve over time I have now recoded and as a result, the program runs so much smoother. Other changes: I fixed one bug where the player wouldn’t move with moving platforms, so now the player should (hopefully) move with the platform as well as be much less glitchy when mounting or dismounting it. I also added a few particles for when the player dashes and lands on objects. I’m still trying to figure out why the player doesn’t get launched when they walk over the springs, hopefully I’ll have that figured out by my next devlog."}, {"post_id": 53210, "ts": "2026-08-23T17:29:52Z", "hours": 11.5417, "text": "Final devlog of the simple 2D platformer! I improved the pixel art and revamped the levels. The first 3 levels are dedicated to teaching the player the controls. I also added support to deploy it online."}, {"post_id": 52514, "ts": "2026-08-22T17:36:28Z", "hours": 11.165, "text": "4th devlog for my simple platformer. I added a couple more levels, currently they are way to hard, I will have to revisit them in the future. On top of that I added a sprint feature to the player. I also spent some more time on the graphics."}, {"post_id": 50708, "ts": "2026-08-20T01:14:37Z", "hours": 7.9364, "text": "3rd devlog of this practice project! Added super simple enemies, a simple level creation option in the setting script, spikes, and better camera follow movement."}, {"post_id": 49974, "ts": "2026-08-19T00:00:03Z", "hours": 9.2581, "text": "Added a few improvements to the platformer game. The camera now scrolls along with the player; I added collectable coins and a coin counter, and made it so that the player respawns when they fall off the platform."}, {"post_id": 48554, "ts": "2026-08-17T00:16:03Z", "hours": 2.3539, "text": "Just finished my first practice platformer. It is super simple, which was intended. I didn’t want it to be anything complicated, just some simple python practice."}]...
|
Title: Practice 2D Platformer by @RedstoneStar | S Title: Practice 2D Platformer by @RedstoneStar | Stardance
Devlogs:
Just finished my first practice platformer. It is super simple, which was intended. I didn’t want it to be anything complicated, just some simple python practice.
Added a few improvements to the platformer game. The camera now scrolls along with the player; I added collectable coins and a coin counter, and made it so that the player respawns when they fall off the platform.
3rd devlog of this practice project! Added super simple enemies, a simple level creation option in the setting script, spikes, and better camera follow movement.
4th devlog for my simple platformer. I added a couple more levels, currently they are way to hard, I will have to revisit them in the future. On top of that I added a sprint feature to the player. I also spent some more time on the graphics.
Final devlog of the simple 2D platformer! I improved the pixel art and revamped the levels. The first 3 levels are dedicated to teaching the player the controls. I also added support to deploy it online.
Devlog #5 for my simple 2D platformer Since I started this project I feel like I have gotten so much better at Python and because of that, I’ve spent the last couple of days rewriting pretty much all of the core mechanics of the platformer. Pretty much all of the code that Gemini helped me develop and then improve over time I have now recoded and as a result, the program runs so much smoother. Other changes: I fixed one bug where the player wouldn’t move with moving platforms, so now the player should (hopefully) move with the platform as well as be much less glitchy when mounting or dismounting it. I also added a few particles for when the player dashes and lands on objects. I’m still trying to figure out why the player doesn’t get launched when they walk over the springs, hopefully I’ll have that figured out by my next devlog.
Devlog #6 After far more hours of debugging than I care to admit, I finally figured out why the springs didn’t launch the player when they walked through the spring. I eventually figured out it was an issue caused by how I was applying the upward momentum. Main changes in this update: Updated graphics. Slightly improved the performance by condensing some logic code Added a new flying enemy. Added 5 new levels. Improved the previous 10 levels to make them more interesting. Problems still needing to be fixed: The flying enemy is having graphical glitches with its charging animation.
Ships:
This is my simple 2d platformer. Before making this project I knew very little about coding in Python so I wanted to work on this project to fix that. In the past I’ve used a bunch of YouTube tutorials to teach me how to code so this time I wanted to try something different. I created a custom Gemini gem that walked me step by step through creating the base game, then helped me add on improvements such as enemies and moving platforms. Key Features: Smooth platforming: Precise movement tracking keeps the character steady on moving platforms without slipping. Varied movement: Double jumps, wall slides, wall jumps, and a dash move to smash weak blocks. Animations: Squish-and-stretch effects when jumping and landing give the character extra feel. Smart enemies: Jumping enemies detect edges and turn around instead of walking off ledges. 10-levels: Includes built-in tutorial prompts to teach new moves as the player progresses. I know the game is really simple, and that is mostly on purpose; this was meant to be just a fun way to practice my Python skills. Hope you enjoy!...
|
1792878437.9511604
|
1793742437.9511604
|
|
53598
|
Vision Based RL by @arushg | Stardance
|
arushg
|
0
|
84.36
|
0
|
[]
|
[{"post_id": 69857, "ts": "202 [{"post_id": 69857, "ts": "2026-09-17T22:43:43Z", "hours": 11.3953, "text": "I was mostly working on tuning the model and fixing hardware since the previous circuit did not give the servo enough power. Hence, I added an external power supply (which took hours to debug… turns out I had to ground the ESP32 to the external GND)"}, {"post_id": 64503, "ts": "2026-09-08T23:10:53Z", "hours": 13.4825, "text": "I noticed the size of the ball and beam in simulation was not the same as the actual one, so I updated sim to be closer. I also added the past action rolling list to the model, which allowed it to see what it tried to do previously. It now survives 1000 steps in simulation (~50 seconds)"}, {"post_id": 59961, "ts": "2026-09-02T01:13:57Z", "hours": 4.8553, "text": "QT-Opt worked much better, but now the problem is with the hardware. The ball just falls forward since the beam is not thick enough. I will print and try again with a thicker beam"}, {"post_id": 59059, "ts": "2026-08-31T17:28:41Z", "hours": 8.2167, "text": "I also tried PID as a benchmark (only in simulation of course). It did pretty well as shown below, so I might try either imitation learning or a different model that just identifies ball and beam position to then apply PID on top. In parallel, I also tested QT-Opt on hardware and it failed… I’m trying more training with visual distortions in the simulation environment so it becomes more robust"}, {"post_id": 58327, "ts": "2026-08-30T18:22:37Z", "hours": 7.2428, "text": "I tried QT-Opt and at least in simulation, it did a lot better (it also trained much faster due to the other architectural change I made; see next). I also switched the backbone to Dinov2 Small, which is newer and smaller than the previous Dino Base backbone."}, {"post_id": 57636, "ts": "2026-08-29T20:51:44Z", "hours": 7.5353, "text": "Added the physical hardware bridge and it turns out the model does not do very well. I am going to try three approaches: More training in sim with variation like camera distortion and stuff Fine-tuning on physical hardware QT-Opt"}, {"post_id": 54824, "ts": "2026-08-25T23:48:28Z", "hours": 3.3669, "text": "Improved the training loop to reflect actual control rate (20 Hz vs 500 Hz in simulation previously). Used AMD GPU for faster training and this is what it looks like (able to balance for ~6 seconds in simulation)"}, {"post_id": 54164, "ts": "2026-08-25T00:48:42Z", "hours": 5.9803, "text": "I refined the reward function and ran training for longer. This is how it looks like in simulation after 1000 steps (very little it’ll get better trust)"}, {"post_id": 53543, "ts": "2026-08-24T04:16:21Z", "hours": 22.2889, "text": "I am training an Agent using Soft Actor Critic, and this is the performance after 12k steps of training (yes it’s a little violent rn but I will either train for longer, increase frequency or implement imitation learning)"}]...
|
Title: Vision Based RL by @arushg | Stardance
Dev Title: Vision Based RL by @arushg | Stardance
Devlogs:
I am training an Agent using Soft Actor Critic, and this is the performance after 12k steps of training (yes it’s a little violent rn but I will either train for longer, increase frequency or implement imitation learning)
I refined the reward function and ran training for longer. This is how it looks like in simulation after 1000 steps (very little it’ll get better trust)
Improved the training loop to reflect actual control rate (20 Hz vs 500 Hz in simulation previously). Used AMD GPU for faster training and this is what it looks like (able to balance for ~6 seconds in simulation)
Added the physical hardware bridge and it turns out the model does not do very well. I am going to try three approaches: More training in sim with variation like camera distortion and stuff Fine-tuning on physical hardware QT-Opt
I tried QT-Opt and at least in simulation, it did a lot better (it also trained much faster due to the other architectural change I made; see next). I also switched the backbone to Dinov2 Small, which is newer and smaller than the previous Dino Base backbone.
I also tried PID as a benchmark (only in simulation of course). It did pretty well as shown below, so I might try either imitation learning or a different model that just identifies ball and beam position to then apply PID on top. In parallel, I also tested QT-Opt on hardware and it failed… I’m trying more training with visual distortions in the simulation environment so it becomes more robust
QT-Opt worked much better, but now the problem is with the hardware. The ball just falls forward since the beam is not thick enough. I will print and try again with a thicker beam
I noticed the size of the ball and beam in simulation was not the same as the actual one, so I updated sim to be closer. I also added the past action rolling list to the model, which allowed it to see what it tried to do previously. It now survives 1000 steps in simulation (~50 seconds)
I was mostly working on tuning the model and fixing hardware since the previous circuit did not give the servo enough power. Hence, I added an external power supply (which took hours to debug… turns out I had to ground the ESP32 to the external GND)...
|
1792752738.598552
|
1793357538.598552
|
|
36065
|
SpacecraftOS by @madzia | Stardance
|
madzia
|
3
|
84.18
|
1072
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-04T21:32:08Z", "hours": 49.0, "multiplier": 18.53, "payout": 914, "blessing": "neutral", "text": "I made a web Operating System with spacecraft theme! Creating this site was so fun and fulfilling, esp. when a lot of things turned out exactly as I wanted!! I started coding over a month ago, and I’m so happy that I managed to create something like this. I really enjoyed it, especially the css part. SpacecraftOS This OS provides basic app like timer, calendar, maps, gallery, but everything have implemented some spacecraft additions. For example, the map app won’t show you the route to the nearest grocery store, but it will show you where your fav spacecraft is right now. The calendar app will show you astronauts birthdays and the gallery app provides photos humans sent to space on voyager. All these apps you will find on the left and on the bottom there are apps, where you’ll learn about various spacecrafts, and in some of these apps, you can also rate some photos the spacecrafts took! Notes Please start from choosing the most suitable for you theme in the settings (top right corner) Try on laptop/computer for better experience Snake game is only playable with keyboard Remember to double click on apps to open and please leave a toughtful review. Hope you’ll enjoy it!!", "repo": "https://github.com/Maaadzia/SpacecraftOS", "demo": "https://maaadzia.github.io/SpacecraftOS/"}, {"ship_num": 2, "ts": "2026-08-08T18:29:17Z", "hours": 16.0, "multiplier": 9.79, "payout": 158, "blessing": "neutral", "text": "I made an Operating System with spacecraft theme! New features Artemis App Artemis II playlist (app) Settings and darkmode Design - few images on the windows borders Start animation with spacecraftOS baner Challenges Compared to my previous ship, this time all functions and styling went smoothly, but the things that took the most time were adjusting photos and writing, researching about Artemis Mission! I tought that making the darkmode switch would be really hard, but when I focused it was really easy and rewarding process! Proud of I really like the starting animation and the images on the borders. I started coding one month ago so doing something cool with the css all by yourself is so fulfilling! I don’t understand js that much yet, so I had also watched few tutorials. The webOS 1 tutorial was really hard for me, so now I’m really happy when the things I wanted to add to my website turns out well! So I’m also really proud of the images slider in the Artemis App, the spotify playlist embedded and the dark/light mode switcher in the settings! Even tho they were made with tutorials I still needed to adjust it so it fits my site, and I’m so happy that I understand it to the point that I could do this all just by myself Notes Don’t forget to check the README, remember to double click to open apps and just enjoy the vojage!!", "repo": "https://github.com/Maaadzia/SpacecraftOS", "demo": "https://maaadzia.github.io/SpacecraftOS/"}, {"ship_num": 3, "ts": "2026-07-31T11:31:13Z", "hours": 16.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made an operating system based around spacecrafts! My website provides few apps: two about telescopes where you can learn about them and rate few photos they took from 1 to 5 stars, and one with notes, where you can store your ideas if some spacecrafts inspire you! Besides apps, on the top bar you will find two guides on how to catch the ISS and starlink satellites. In the ISS window you can find short youtube video - it’s about Polish astronaut, Sławosz Uznański, eating pierogi (delicious polish dish) on the ISS! I really recommend watching this The apps were the biggest challange for me. That’s why I had spent so many hours on this project. Firts, I couldn’t even open the first app. It was hard to even make the selected function work. Then, I managed to make this one app working! But, it wasn’t the right solution. When I added new apps, they were opening the 1st app window, and not theirs. I spent a lot hours trying to fix it, I tried a lot of possible solutions and finally, I had asked ai for help. That’s the only ai usage in this project. Eventually, everything works! I’m so happy because I’ve almost gave up. I really like the outcome, and I look forward for the future changes! I came up with a lot of ideas and I realised them the exact way I wanted! My favourite parts are def the Sławosz eating pierogi video and the photo ranking which I find so fun to watch and rate. Hope you’ll enjoy this as much as I do!", "repo": "https://github.com/Maaadzia/SpacecraftOS", "demo": "https://maaadzia.github.io/SpacecraftOS/"}]...
|
[{"post_id": 83045, "ts": "202 [{"post_id": 83045, "ts": "2026-10-26T17:32:12Z", "hours": 3.1822, "text": "New spacecraft App! Devlog 25 - SpaceShuttleApp Hi everyone!! I’m back with a whole new app and smoother system 1. Smoother system So I’ve got a lot feedback that spacecraftOS is working slow and someone has recommended to me adding se vite - that’s what i’ve done and now it works much better! 2. Space Shuttle App I’ve decided to add another spacecraft app, they’re always fun to make and it’s kinda easyyy process tbh so everything was smooth. On this app I described a little every space shuttle NASA has ever created. Hope you’ll enjoy it!! Thanks for reading and have a nice day!"}, {"post_id": 61784, "ts": "2026-09-04T21:11:45Z", "hours": 0.2711, "text": "Scrollbar is working!! Devlog 24 - scrollbar bug Guys I think that this bug was (is) my personal fault, bc the scroll bar is visible in every single browser different than my current one lol I probably have some sort of extension that adds none !important or sth to my code’s head and it ruins everything, but it shall work on every other device, on every other browser. Tbh I also used ai to fix it but it didn’t really helped bc it was my internal problem. So happy that it’s working, just wanted to clarify and log these 16min!! If any problems with scrollbar occur, please use keyboard arrows to scroll through windows Again, thanks for reading and have a nice day!"}, {"post_id": 61753, "ts": "2026-09-04T20:12:54Z", "hours": 3.7797, "text": "happy and frustrated Devlog 23 - Dock animation, scrollbar and NGRSTApp Dock Animation I really like this animation!! It’s so smooth and cool and I’m so happy bc I learned new thing with the tutorial!! It came out exactly as I wanted NGRSTApp It’s finally finished!! I managed to add some things regardless it’s such a fresh mission. Hope yall like it! Scrollbar Yeah so here’s the frustrating part. I coded really pretty, unique and practical scrollbar in the css but I used webkit and it worked on microsoft but on chrome - not anymore! You can’t even see the scrollbar! I don’t have time anymore - I’m leaving in few hours, I commented it out and I hope I’ll fix it one day Additional changes Rewrited README Added some events to the calendar What’s next? I’m gonna ship now!! Wish me luck and thank you all for your support throughout the whole voyage!!"}, {"post_id": 61421, "ts": "2026-09-04T10:10:39Z", "hours": 1.5053, "text": "Which one should I choose? Devlog #22 - Timer So I just made a timer with tutorial, but I need your help!! Should I keep miliseconds (slide 2) or keep it simple just with hours/minutes/seconds?? I kinda think that h/m/s looks better but it also seems so boring and less “advanced” than h/m/s/ms!! Also this was such an easy tutorial, fortunately everything went smoothly!! Yall probably know bro code but if someone wants here’s the link What’s next? Dock animation NGRSTApp Thanks for reading and I’m waiting for your comments!"}, {"post_id": 61029, "ts": "2026-09-03T18:44:03Z", "hours": 1.9033, "text": "I’m back!! Devlog #21 - new colors Hi everyone! I’m finally back but from hospital… right after my trip I was diagnosed with severe anemia and had to stay in the hospital for four days. I’m feeling good but I’m a little worried bc I lost so much time and I’m leaving on next trip again in few days!! There’s not many things left in SpacecraftOS tho, so let’s summarise it What’s new? In the video below you can see that I adjusted the calendar colors for every theme. It was such a fun process! I like how it looks now. I also managed to fix the days align and now it works perfectly, always in 7 columns. Hope yall like it! What’s next? I’m going to work on dock animation!! I also need to finish NGRSTApp but I think I’m going to keep it simple bc I don’t have so much time and I want to ship by the time I leave Thanks for reading, take care and have a nice day!!"}, {"post_id": 53999, "ts": "2026-08-24T18:45:12Z", "hours": 5.9797, "text": "Reallyyyyyyy time consuming Calendar Devlog #20 - Calendar So I spent this whole day coding this calendar with youtube tutorial. This tutorial was only 17min but it took me 5h Then I needed to fix some typos bc I ofc made a lot and then many many styling!! It’s not the final result! I’m going on a trip tomorow, so I need to take a break from coding. To adjust the width and height, make it all fit to my site, it takes so long, and then I need to change the colors, bc I was just testing with the pinks. Change colors to all of my themes 😭 But it’s okay I got this Disappointing surprise You can see in the video on the second slide that there are 6 columns in the next month instead of 7! I’ve been so happy bc it was working in august, and then I changed months and it was a little disappointing surprise. I’m gonna fix it later! What’s next? When I’ll be back I’m going to work on this app! I didn’t expected it to be that hard Thanks for reading and see you in the next one!"}, {"post_id": 53260, "ts": "2026-08-23T18:20:43Z", "hours": 1.9378, "text": "More Animatiooons! Devlog #19 Animations on scroll Animations So recently I’ve been working on animations on scroll! Now my Apps about spacecrafts are more interactive and less boring. In the video below you can see all of the scroll animations I’d added till this moment. I feel so confident with css animations, they give me so much fun!! Icon The video is cropped so you can’t see the snake game icon but it finally is here! I added it in the second slide so you guys can see it! Let me know what yall think. I wanted to keep the one real-life, space themed addition (like moon in the music app) so the snake has galaxy eyes. Nancy Grace Roman Space Telescope PROBLEM As you can see I also added an icon for NGRST App but it’s an upcoming mission and I don’t really know what to do with it!! Someone requested it in the feedback, so I really want to implement it but idk, maybe I shall add a countdown? But it will be outdated soon. Many things can be outdated! Thanks for reading and have a nice day!"}, {"post_id": 52482, "ts": "2026-08-22T16:55:00Z", "hours": 0.6842, "text": "The most spacecraft app on spacecraft os? Devlog #18 - MapApp!!! ALL SPACECRAFTS IN ONE PLACE WHAT AN AMAZING FEATURE!! What’s new? MAAAP AAAPP While doing research on Voyager 1 and 2 I found this “Eyes On The Solar System” from NASA, and noticed that you can embeed it, and that’s what I’ve done! First and foremost, you can check here the position of any spacecraft you want! That’s why I called it Map App. Moreover, that’s a place with a lot of information, and whole spacecraft history! As you can notice, it didn’t take me so long (bc it’s just embeeding), so what I’ve also completed? Fixed some bugs Finished icon for snake game What’s next? NGRST app! (Can someone guess, what does this short stand for? Hint: HST and JWST are already in spacecraftOS!)"}, {"post_id": 52183, "ts": "2026-08-22T08:40:35Z", "hours": 3.7939, "text": "Perfecting Devlog #17 - snake game and organisation What’s new? Snake game As you can see, I’ve styled the snake game a little! I also added start/tutorial/guide window, I added it by creating new window and setting start button as the window close button hihi work smarter not harder. Ai usage I couldn’t figure it out how can I set imgs as the background, food and even for snake, so I asked ai. It’s just creating const with img and adding drawImage instead of fillStyle , and I’m so happy bc now I understand it and know how to implement imgs to js! WHERE’S THE ROCKET? It was too hard!! I really tried, but when I managed to set the rocket as the snake’s head: The rocket was too small It wasn’t rotating It looked so bad and if I wanted to continue with this idea I would need to use ai, so more ai than I would like, so I eventually there’s snake in the snake game. More organisation I created folders in the img folder for each app, bc the img folder was still a little messy. It was such a tedious process, but it’s much clearer now! What’s next? New REALLY COOL APP and snake app icon, which I’m going to edit today while watching F1 sprint"}, {"post_id": 51083, "ts": "2026-08-20T15:53:26Z", "hours": 2.6117, "text": "Random decision (but it was worth it) Devlog #16 - Radio buttons and styles What’s new? Radio buttons In my feedback someone suggested to add radio buttons instead of checkboxes bc then you can just choose one - and today I did it! I also styled it and added cool animation!! Each theme have different stars colors as well - you can check it in the video below. Highscore Somehow, I also added highscore to my snake game! I took a bit of information from tutorial 1 a bit from tutorial 2 and it’s working! Maybe not perfectly, but when you restart, new highscore will be visible, and it’s also in local storage so you can come back after a month and your highscore still will be there!! So, why random? It was a little unexpected bc I was working on the snake game (yeah it’s still not finished) and suddenly I gained a lot of motivation for the radio buttons. I knew I wanted to style them somehow, but I came up with the star design today, and I think it’s perfect!! What yall think about it?? What’s next? Hopefully, I’m going to finish the snake app!"}, {"post_id": 50531, "ts": "2026-08-19T18:36:40Z", "hours": 6.595, "text": "Such a challange! Devlog 15 - snake game Snake game? Yeah I’m surprised too. But I really wanted to see how it works and just code sth like this (with tutorial ofc). I wanted to make it a little later but I had time today and decided - why not? Okay but, 6 hours?!??!?!?!?!? Yeah 😭 in short, I started with tutorial 1, but it didn’t worked, so I deleted everything and switched to another tutorial, where I realised that I just haven’t connected my snake.js to html lolll but anyways, I even liked tutorial 2 more, I feel like it gave me more styling options, but I needed to quit it because to restart you needed to refresh the site. I tried to just implement some functions, change some things but I’m not that skilled to do this yet. I deleted everything again and came back to tutorial 1 which I eventually completed! That’s not the final results I really want to make the snake head a rocket thats collecting fuel, but there are some problems!! Obviously lol, so I have something like this const snakeColor = \"pink\"; and I tried to change pink to class, to var but it didn’t worked, and I really don’t know how can I style this snake further, so I can add the rocket and fuels and many other things. That’s why I liked tutorial 2 more! What’s next? I will try to style the snake and this whole window basically!! The video below is in 2x speed!"}, {"post_id": 49450, "ts": "2026-08-18T09:25:00Z", "hours": 1.2464, "text": "I code my function!! Devlog 14 - animation and design Function I’m sooooooooo happy because yesterday I’ve managed to create my own function!!! someone suggested to make other tab switching. I was looking for some tutorial, but couldn’t find anything so I asked ai what can I search in youtube to find it. For better or worse, the AI gave me a little guidance on how it works (so I’d understand it in the tutorial, NO code ), I didn’t even fully read this because when I noticed “animation” and “adding classes” I noticed, what I can do! Few days ago I mentioned the theme switch tutorial, that helped me with understanding js!! With this knowledge and the pattern I already had from webOS tutorial, I managed to create opening app window animation!! Additional apps I also added left bar for the additional apps (/apps that are not about spacecrafts). For now just the background, but when I will finish every app I will also add some better animations and just style it better Problem At the very end of the video, you can notice such a huge problem with opening windows and theirs z-index. They open randomly, once under particular app once above, trying to catch this video when it’s smooth and they all go on top was really hard!! Please let me know if you know how to fix it And I had also tried to make my windows resizeable but it unfortunally didn’t worked. I will get back to this later What’s next? To perfect it all and fix bugs! And then maybe some games? Thanks for reading and have a nice day!!!"}, {"post_id": 48987, "ts": "2026-08-17T16:00:19Z", "hours": 3.1114, "text": "Feedback and roverS Devlog 13 - Spirit and Opportunity App Feedback So, my project went through ratings: unfortunately, I only got 9.79 multiplier, but I also got an amazing and really valuable feedback!! People pointed out my messy repository, and indeed, it needed to be changed. I created new folders, and now it’s clear and organised! RoverS app? While researching, I noticed that Spirit also deserves to be mentioned! Because it’s the same mission, I decided to add Spirit to Opportunity app, and therefore it’s Rovers/Spirit&Opportunity app now! What’s next? I’m going to focus on improving my app and implementing the advices I received in feedback. I also have a lot of new ideas, so stay tuned!"}, {"post_id": 48045, "ts": "2026-08-16T10:23:51Z", "hours": 4.5292, "text": "Time-consuming animation and problemss Devlog 12 - Opportunity App and animation Problems!!! I messed up positions! 😭😭 I was adjusting this rover so it’s driving perfectly around the Mars for hourss and then I decided to check it with the scroll bar, and bc the rover had position: absolute it went down with the scroll bar idk how to describe it, like, he flew out of mars lol Solutions!!! I’ve watched quick guide on youtube about positions and finally understood everything, because before I was just kindaaa guessing lolll now, having the knowledge, I wrapped my animation into <div style=\"position: relative; border: pink [...]\"> , added position: absolute to my images and adjusted everything completely from scratch!! It took me so long but I think it was worth it bc it looks nice and is something different from the usual. One more change I added border photo to Voyager App. Adjusting also took me a while but the window is way more interesting now! What’s next? Finishing Opportunity App!! Thanks for reading and have a nice day!!"}, {"post_id": 46779, "ts": "2026-08-14T08:51:39Z", "hours": 2.9839, "text": "More colors!!! Devlog #11 - 3 new themes!! I made new themes!!!!!!! I’m so happy to introduce you to my 3 colorful themes: Moon Theme - “Earth set” photo from Artemis II mission, blue-colored Aurora Theme - Earth’s Aurora seen from the ISS, green-colored Sunset Theme - “Cotton Candy Skies”, Falcon 9 rocket, pink-colored No gatekeeping, I’ve been searching for tutorial like this for so long so here’s the link for the tutorial . Hope it will be helpful! I need a feedback!! I’m not sure about the colors tho, please let me know know if everything is readable and if you perhaps would change anything Thanks for reading, hope you like it!"}, {"post_id": 46261, "ts": "2026-08-13T11:38:08Z", "hours": 4.6536, "text": "new app and new ideas! Devlog 10 - Full Voyager App Full Voyager App I finished coding new app!! It’s about Voyager mission, so basically Voyager 1 and Voyager 2. Research took me so long again!! But I’m happy with the results New idea So since I started this project I’ve been thinking about how do I arrange the blank space next to the rating images. Today, I added a brief text that’s describing the photo. Just a little, but now you’ll know what the images shows! You can see it on the 1st screenshoot below. Both screenshots are from the new app What’s next? I would love to make new function in the settings so you can change the background photo!! Wish me luck Thanks for reading and have a nice day!!"}, {"post_id": 45144, "ts": "2026-08-11T13:25:16Z", "hours": 3.765, "text": "New app!! Devlog #9 Voyager Photos App Guys I finished rating other projects and I have to admit that my devlogs are way too long So today let’s keep it brief: Voyager Photos App!!! I’m gonna create another app just about voyager, but this is some sort of gallery of (only) 11 photos from these spacecrafts. I made cool infinite images slider with tutorial - it went really smoothly, and then I’ve been trying to make an information window appear when you place your cursor on the “?”. I don’t feel so comfortable in js yet but I wanted to do it all by myself so I went with css, and I really like the final results! You can see it in the video below What’s next? Full Voyager App, I hope! See you in the next one, thanks for reading!!"}, {"post_id": 43432, "ts": "2026-08-08T17:48:20Z", "hours": 0.2547, "text": "15 min can’t be lost! Devlog 8 - fixed all typos and changed the start text So, what I changed in these 15 min? I changed all the typos in artemis app FORTUNATELY I checked the start window, and changed the description because it was really outdated! And therefore, I needed to change the image in my readme. I also adjusted it to width: 100%; height: auto because when I opened readme on my phone it was really stretched! Below I leave a screenshoot of the app I’ve been adjusting, with the artemis II crew because they’ve been my motivation through this whole process! I can’t wait to work more on SpacecraftOS!! Wish me luck on shipping ^^"}, {"post_id": 43381, "ts": "2026-08-08T16:06:31Z", "hours": 1.5467, "text": "One more devlog! Devlog 7 - title and start animation I wanted to ship already but lo and behold, I’ve added some changes! So, what’s new? I finally designed the header of my site! now it says SpacecraftOS and displays a rocket icon! Updated Artemis App - I’ve added some information about Artemis IV and V WELCOMING ANIMATIONNN!!!!!! - I’m very happy because I’ve managed to add a start animation, like welcoming screen or sth like this, idk how is it called, but now, when you enter my page, you can see an animation with my baner! It’s in the video below What’s next? I’ve also finished writing the README so now I will just read everything top to bottom again and SHIP!!!"}, {"post_id": 42821, "ts": "2026-08-07T18:52:04Z", "hours": 4.8486, "text": "Darkmode!! Devlog 6 - dark mode and more photos on the borders What’s new? Darkmode and settings I’m so happpyyyy I’ve managed today to create new very cool app - settings - where you can switch between lightmode and darkmode! At the beginning I tought that it would be a nightmaree but turns out, when I really focused, it was a smooth process and I really enjoyed it! But one thing is not working.. not so important but when I’m adding this app to the rising on top function everything crashes and I can’t open any app. I’ll try to fix it later. There ofcourse will be more functions soon in this app so stay tuned! More images on borders I added more photos on the borders! ISS NASA astronaut working on Hubble The Golden Record spinning on the Artemis II playlist app (I think it’s a really cool idea) Adjusting the astronaut was really hard, and the background did not removed well but I’ve managed to add some blur and eventually it looks okayy I’ve also changed the position of Artemis astronaut - I wanted to put it on the left but unfortunatelly, it cannot be here because then it covers the scroll bar. Adjusting the rotation helped a little and it looks way better! What’s next? I think I’m gonna ship soon! I’ve already writed the README and I just need to check everything. But don’t worry, it’s not the end of SpacecraftOS! I already have a lot of ideas"}, {"post_id": 42063, "ts": "2026-08-06T16:54:14Z", "hours": 1.3569, "text": "My website is all around Artemis now! Devlog #5 - two new apps fully finished! I finished the image slider I’ve been writing about in the previous devlog and added new app! I tought it will take me so much longer, but here I am! But let’s start from the outset: Finished Artemis Mission App I’ve finally finished it! In my previous devlog I said that I found another tutorial on how to make image slider, and it was a bullseye!! After I adjusted it a little so it fits my images it’s working perfectly!! And looking so so good! I’m so happy!! New app - Artemis II Playlist So, I really wanted to implement some music into my website. But because it’s a SPACECRAFT operating system I knew it cannot be just basic music app. While working on the Artemis App I came up with this amazing idea - I’m pretty sure that you heard about the wake up songs from Artemis II Mission. I decided to do an app with that playlist! Since it’s just embeeding the code from spotify it wasn’t such a big problem. I think that the hardest thing here was to make the app icon, which is the moon listening to music on headphones!! I really like this idea, let me know what you think about it What’s next? I want to add some images on the borders like in the Artemis App. And then another app!! Thanks for reading and have a nice day!"}, {"post_id": 41862, "ts": "2026-08-06T10:36:58Z", "hours": 8.1608, "text": "Such a messs!! Devlog #4 - Artemis App! Your opinion Before we begin, I’d like to know your opinion about the images layout. The 3 first screenshoots below shows different layouts. Screenshoot 1 : This is the first version I coded. But it covers the close button and most importantly - the scroll bar which is so unpractical Screenshoot 2 : this is how I had imagined it when this idea came to my mind. It also covers the close button and the scroll Screenshoot 3 : last version I’ve coded. I did not planned this layout but I think it looks great and is the most practical! Unfortunately the 3rd option covers the move button but by adding some z-index everything works well, and looks better than when adding z-index to the scroll bar bc the rocket/astronaut is either covered by the scroll or too far away. Please let me know what you think! Challange 1 Adjusting these images was such a challange. But I wrote it all down from memory! I added the position: fixed so it can exceed the window and adjusted the position several times! The biggest problem, as I said, was that they were covering the scroll bar and close button and then the move button as well. But I found the solution! I added the appropriate z-index to each of the elements and it worked!! (I’m really surprised tbh it was so easy and didn’t took me that long to figure out! I’m getting good at coding ) So finally, what’s new? I added the Artemis Mission App !! It’s not an app just about the artemis II. It’s an app where you can learn about the whole mission, the SLS rocket, the Orion capsule and get to know some fun-facts! Doing the research on all of these thing took me sooo much time! And then writing it down, deciding what is worth the attention and so on… it was kinda exhausting! But I’m so happy with the (not yet) final results! Yeah, not yet meaning… Challange 2 On the last screenshoot you can see the biggest mess on this app! Few photos totally without rhyme or reason! I was coding with image slider tutorial. Everything was going smoothly, till the creator of the tutorial said that now we shall see our photo aaaand yup I did not see anything. I was checking several times if I writed down everything the right way, I was looking for solution and eventually I created new repository and copied the whole code which he pasted in the comments (just to clarify - in this project I do NOT copied any code, I writed everything by myself). In this repository everything worked. When I saw the final results in the repository I had also noticed that it’s not really what I wanted to have in the Artemis App. Bc the code did not worked (probably because it already was in several divs and not like raw or sth) and bc it didn’t align with my vision I decided to just delete this whole code. I’ve already found another tutorial, with better design so I will keep you updated on how it’ll turn out! What’s next? Fixing the mess and finishing the app New app (it’s going to be music app linked to the Artemis II mission!) Thanks for reading and stay tuned!!"}, {"post_id": 37768, "ts": "2026-07-30T18:02:44Z", "hours": 7.5406, "text": "AYYYY FINAL DEVLOG! Devlog #3 - more apps and final changes Guys I can’t believe I did this!! (It’s such an achievement for me okay ) Let’s break all the changes I’ve made to some points: ( if you don’t want to read it all please skip to the last point because it’s about Poland in space and I love Poland and Space ) APPS! AND MANY MORE PROBLEMS. Let’s start from the problems… If you tought that in the second devlog I’ve finally managed to make working apps - you are so wrong. Barely 2 hours later I realised, that the (window) part was not a problem. Turned out, that when I changed this to the id of my app window, next apps opened the 1st app window, and not theirs window. I’ve been searching for solutions for HOURSS! Eventually I had asked ai for help. I had described my problem really pricesely. It found the problem! In this function function handleIconTap(element) I was supposed to write (element, window) … Fortunately, now it fully works!! I’m so happy because this was sooo frustrating. New apps! So, I’ve made two new apps! One similar to James Webb Space Telescope App, and one for notes and ideas. Let me introduce you toooo: Hubble Space Telescope App! - As I said, this one is similar to JWSTApp but it’s around Hubble! You can rate photos, learn some facts about it and just admire another amazing spaceship. NASCApp also known as Spacecraft Ideas. So from where is the abbreviation “NASCApp”??? Well, previously it was named “Notes About Spacecrafts”, but I decided that it’s so boring. Spacecraft Ideas is not really mind blowing name but it’s way better. I also had few problems with this app but after longer reflections, I decided to keep it simple. You can see these apps on screenshoots below. Starlink Catch Guide and Minor Changes I finished writing about starlink satellites in the Starlink Catch Guide window and added some minor changes to every window on my webOS after reading them all again. It was such a long process, but I like how it all looks together now. POLAND IN SPAAAAAACE AND PIEROGI! I added youtube video to the ISS Catch Guide window about Polish astronaut - Sławosz Uznański, eating delicious polish pierogi, on the ISS! I think that this is the most important part of my webOS. POLSKA GUROM!! (You can watch Sławosz eating pierogi on the ISS here ) What’s next? I’m going to read it all again, write README, complete project info and finally, SHIP!! Don’t worry it’s not the end of the journey because I started to like coding so much and I want to continue with webOS 2! Thank’s for being with me and have a nice day!"}, {"post_id": 35710, "ts": "2026-07-27T09:53:57Z", "hours": 2.9081, "text": "I did itttt!! Devlog #2 - Apps Hi!!! I’m so glad to announce that my apps are finally working! There’re still few problems though. But let’s start from the outset: James Webb Space Telescope App This app provides few basic information and interesting facts about JWST. I had also added some photos which you can rate from 1 to 5 stars! You can see the app in the screenshots below. Problems As you can see, there’s so much space on the right from the images you can rate. I’m considering a lot of options, one of them is to just make two/three photos in one row, what do you think? Would this look better? Double click app opening - the if and else statements made my app open at the second click, and not at the first when it’s selected. It selects with the first click and then, with second click, deselects and opens. Idk if it’s supposed to work this way. I think that now I’m going to leave it because at this point I’m just celebrating it works and I want to focus on other things. Problems fixed 🥳🥳🥳 Yall don’t even know how happy I am because of these apps working!! It indeed was much easier than I tought, guess what stupid mistake I had made this time… in the function I did not changed (window) to my actual window. Lol. It was not the only problem on the way but it was definitely the main mistake. I’m so happy because now I can get creative and continue working on the apps design!! Upcoming changes Next I’m going to add few more apps. Can’t wait! Thanks for reading this devlog. Hope you’ll have and amazing day!!"}, {"post_id": 33605, "ts": "2026-07-23T17:38:32Z", "hours": 5.8403, "text": "I dont know what I’m doing but I hope it will be worth it!! devlog #1 - SpacecraftOS Hi everyone! I detached the WebOS mission from ISS HUNT and created this project - Spacecraft OS. I noticed that it’s not really the way I want ISS hunt to look like, to be like. To be honest - this tutorial is SOOOOO hard to me! The apps get me everytime! And besides it I made a lot of minor mistakes. For example, once I could move the start window alone but the guide window was moving only with the start one. And the blur wasn’t working, I was so frustrated and reallyyy confident that there are NOT any stupid mistakes like wrong id. Until I realised that the top bar only blurs the start window… I haven’t closed the div. Yeah. That is a stupid mistake. Even tho it’s hard to me I’m not giving up! Others have done it so can I! For now, I created the top bar and completed the start window and the ISS catch guide. Currently I’m working on starlink catch guide and then I’m gonna work more on these wretched apps 😭 Wish me luck!"}]...
|
Title: SpacecraftOS by @madzia | Stardance
Devlog Title: SpacecraftOS by @madzia | Stardance
Devlogs:
I dont know what I’m doing but I hope it will be worth it!! devlog #1 - SpacecraftOS Hi everyone! I detached the WebOS mission from ISS HUNT and created this project - Spacecraft OS. I noticed that it’s not really the way I want ISS hunt to look like, to be like. To be honest - this tutorial is SOOOOO hard to me! The apps get me everytime! And besides it I made a lot of minor mistakes. For example, once I could move the start window alone but the guide window was moving only with the start one. And the blur wasn’t working, I was so frustrated and reallyyy confident that there are NOT any stupid mistakes like wrong id. Until I realised that the top bar only blurs the start window… I haven’t closed the div. Yeah. That is a stupid mistake. Even tho it’s hard to me I’m not giving up! Others have done it so can I! For now, I created the top bar and completed the start window and the ISS catch guide. Currently I’m working on starlink catch guide and then I’m gonna work more on these wretched apps 😭 Wish me luck!
I did itttt!! Devlog #2 - Apps Hi!!! I’m so glad to announce that my apps are finally working! There’re still few problems though. But let’s start from the outset: James Webb Space Telescope App This app provides few basic information and interesting facts about JWST. I had also added some photos which you can rate from 1 to 5 stars! You can see the app in the screenshots below. Problems As you can see, there’s so much space on the right from the images you can rate. I’m considering a lot of options, one of them is to just make two/three photos in one row, what do you think? Would this look better? Double click app opening - the if and else statements made my app open at the second click, and not at the first when it’s selected. It selects with the first click and then, with second click, deselects and opens. Idk if it’s supposed to work this way. I think that now I’m going to leave it because at this point I’m just celebrating it works and I want to focus on other things. Problems fixed 🥳🥳🥳 Yall don’t even know how happy I am because of these apps working!! It indeed was much easier than I tought, guess what stupid mistake I had made this time… in the function I did not changed (window) to my actual window. Lol. It was not the only problem on the way but it was definitely the main mistake. I’m so happy because now I can get creative and continue working on the apps design!! Upcoming changes Next I’m going to add few more apps. Can’t wait! Thanks for reading this devlog. Hope you’ll have and amazing day!!
AYYYY FINAL DEVLOG! Devlog #3 - more apps and final changes Guys I can’t believe I did this!! (It’s such an achievement for me okay ) Let’s break all the changes I’ve made to some points: ( if you don’t want to read it all please skip to the last point because it’s about Poland in space and I love Poland and Space ) APPS! AND MANY MORE PROBLEMS. Let’s start from the problems… If you tought that in the second devlog I’ve finally managed to make working apps - you are so wrong. Barely 2 hours later I realised, that the (window) part was not a problem. Turned out, that when I changed this to the id of my app window, next apps opened the 1st app window, and not theirs window. I’ve been searching for solutions for HOURSS! Eventually I had asked ai for help. I had described my problem really pricesely. It found the problem! In this function function handleIconTap(element) I was supposed to write (element, window) … Fortunately, now it fully works!! I’m so happy because this was sooo frustrating. New apps! So, I’ve made two new apps! One similar to James Webb Space Telescope App, and one for notes and ideas. Let me introduce you toooo: Hubble Space Telescope App! - As I said, this one is similar to JWSTApp but it’s around Hubble! You can rate photos, learn some facts about it and just admire another amazing spaceship. NASCApp also known as Spacecraft Ideas. So from where is the abbreviation “NASCApp”??? Well, previously it was named “Notes About Spacecrafts”, but I decided that it’s so boring. Spacecraft Ideas is not really mind blowing name but it’s way better. I also had few problems with this app but after longer reflections, I decided to keep it simple. You can see these apps on screenshoots below. Starlink Catch Guide and Minor Changes I finished writing about starlink satellites in the Starlink Catch Guide window and added some minor changes to every window on my webOS after reading them all again. It was such a long process, but I like how it all looks together now. POLAND IN SPAAAAAACE AND PIEROGI! I added youtube video to the ISS Catch Guide window about Polish astronaut - Sławosz Uznański, eating delicious polish pierogi, on the ISS! I think that this is the most important part of my webOS. POLSKA GUROM!! (You can watch Sławosz eating pierogi on the ISS here ) What’s next? I’m going to read it all again, write README, complete project info and finally, SHIP!! Don’t worry it’s not the end of the journey because I started to like coding so much and I want to continue with webOS 2! Thank’s for being with me and have a nice day!
Such a messs!! Devlog #4 - Artemis App! Your opinion Before we begin, I’d like to know your opinion about the images layout. The 3 first screenshoots below shows different layouts. Screenshoot 1 : This is the first version I coded. But it covers the close button and most importantly - the scroll bar which is so unpractical Screenshoot 2 : this is how I had imagined it when this idea came to my mind. It also covers the close button and the scroll Screenshoot 3 : last version I’ve coded. I did not planned this layout but I think it looks great and is the most practical! Unfortunately the 3rd option covers the move button but by adding some z-index everything works well, and looks better than when adding z-index to the scroll bar bc the rocket/astronaut is either covered by the scroll or too far away. Please let me know what you think! Challange 1 Adjusting these images was such a challange. But I wrote it all down from memory! I added the position: fixed so it can exceed the window and adjusted the position several times! The biggest problem, as I said, was that they were covering the scroll bar and close button and then the move button as well. But I found the solution! I added the appropriate z-index to each of the elements and it worked!! (I’m really surprised tbh it was so easy and didn’t took me that long to figure out! I’m getting good at coding ) So finally, what’s new? I added the Artemis Mission App !! It’s not an app just about the artemis II. It’s an app where you can learn about the whole mission, the SLS rocket, the Orion capsule and get to know some fun-facts! Doing the research on all of these thing took me sooo much time! And then writing it down, deciding what is worth the attention and so on… it was kinda exhausting! But I’m so happy with the (not yet) final results! Yeah, not yet meaning… Challange 2 On the last screenshoot you can see the biggest mess on this app! Few photos totally without rhyme or reason! I was coding with image slider tutorial. Everything was going smoothly, till the creator of the tutorial said that now we shall see our photo aaaand yup I did not see anything. I was checking several times if I writed down everything the right way, I was looking for solution and eventually I created new repository and copied the whole code which he pasted in the comments (just to clarify - in this project I do NOT copied any code, I writed everything by myself). In this repository everything worked. When I saw the final results in the repository I had also noticed that it’s not really what I wanted to have in the Artemis App. Bc the code did not worked (probably because it already was in several divs and not like raw or sth) and bc it didn’t align with my vision I decided to just delete this whole code. I’ve already found another tutorial, with better design so I will keep you updated on how it’ll turn out! What’s next? Fixing the mess and finishing the app New app (it’s going to be music app linked to the Artemis II mission!) Thanks for reading and stay tuned!!
My website is all around Artemis now! Devlog #5 - two new apps fully finished! I finished the image slider I’ve been writing about in the previous devlog and added new app! I tought it will take me so much longer, but here I am! But let’s start from the outset: Finished Artemis Mission App I’ve finally finished it! In my previous devlog I said that I found another tutorial on how to make image slider, and it was a bullseye!! After I adjusted it a little so it fits my images it’s working perfectly!! And looking so so good! I’m so happy!! New app - Artemis II Playlist So, I really wanted to implement some music into my website. But because it’s a SPACECRAFT operating system I knew it cannot be just basic music app. While working on the Artemis App I came up with this amazing idea - I’m pretty sure that you heard about the wake up songs from Artemis II Mission. I decided to do an app with that playlist! Since it’s just embeeding the code from spotify it wasn’t such a big problem. I think that the hardest thing here was to make the app icon, which is the moon listening to music on headphones!! I really like this idea, let me know what you think about it What’s next? I want to add some images on the borders like in the Artemis App. And then another app!! Thanks for reading and have a nice day!
Darkmode!! Devlog 6 - dark mode and more photos on the borders What’s new? Darkmode and settings I’m so happpyyyy I’ve managed today to create new very cool app - settings - where you can switch between lightmode and darkmode! At the beginning I tought that it would be a nightmaree but turns out, when I really focused, it was a smooth process and I really enjoyed it! But one thing is not working.. not so important but when I’m adding this app to the rising on top function everything crashes and I can’t open any app. I’ll try to fix it later. There ofcourse will be more functions soon in this app so stay tuned! More images on borders I added more photos on the borders! ISS NASA astronaut working on Hubble The Golden Record spinning on the Artemis II playlist app (I think it’s a really cool idea) Adjusting the astronaut was really hard, and the background did not removed well but I’ve managed to add some blur and eventually it looks okayy I’ve also changed the position of Artemis astronaut - I wanted to put it on the left but unfortunatelly, it cannot be here because then it covers the scroll bar. Adjusting the rotation helped a little and it looks way better! What’s next? I think I’m gonna ship soon! I’ve already writed the README and I just need to check everything. But don’t worry, it’s not the end of SpacecraftOS! I already have a lot of ideas
One more devlog! Devlog 7 - title and start animation I wanted to ship already but lo and behold, I’ve added some changes! So, what’s new? I finally designed the header of my site! now it says SpacecraftOS and displays a rocket icon! Updated Artemis App - I’ve added some information about Artemis IV and V WELCOMING ANIMATIONNN!!!!!! - I’m very happy because I’ve managed to add a start animation, like welcoming screen or sth like this, idk how is it called, but now, when you enter my page, you can see an animation with my baner! It’s in the video below What’s next? I’ve also finished writing the README so now I will just read everything top to bottom again and SHIP!!!
15 min can’t be lost! Devlog 8 - fixed all typos and changed the start text So, what I changed in these 15 min? I changed all the typos in artemis app FORTUNATELY I checked the start window, and changed the description because it was really outdated! And therefore, I needed to change the image in my readme. I also adjusted it to width: 100%; height: auto because when I opened readme on my phone it was really stretched! Below I leave a screenshoot of the app I’ve been adjusting, with the artemis II crew because they’ve been my motivation through this whole process! I can’t wait to work more on SpacecraftOS!! Wish me luck on shipping ^^
New app!! Devlog #9 Voyager Photos App Guys I finished rating other projects and I have to admit that my devlogs are way too long So today let’s keep it brief: Voyager Photos App!!! I’m gonna create another app just about voyager, but this is some sort of gallery of (only) 11 photos from these spacecrafts. I made cool infinite images slider with tutorial - it went really smoothly, and then I’ve been trying to make an information window appear when you place your cursor on the “?”. I don’t feel so comfortable in js yet but I wanted to do it all by myself so I went with css, and I really like the final results! You can see it in the video below What’s next? Full Voyager App, I hope! See you in the next one, thanks for reading!!
new app and new ideas! Devlog 10 - Full Voyager App Full Voyager App I finished coding new app!! It’s about Voyager mission, so basically Voyager 1 and Voyager 2. Research took me so long again!! But I’m happy with the results New idea So since I started this project I’ve been thinking about how do I arrange the blank space next to the rating images. Today, I added a brief text that’s describing the photo. Just a little, but now you’ll know what the images shows! You can see it on the 1st screenshoot below. Both screenshots are from the new app What’s next? I would love to make new function in the settings so you can change the background photo!! Wish me luck Thanks for reading and have a nice day!!
More colors!!! Devlog #11 - 3 new themes!! I made new themes!!!!!!! I’m so happy to introduce you to my 3 colorful themes: Moon Theme - “Earth set” photo from Artemis II mission, blue-colored Aurora Theme - Earth’s Aurora seen from the ISS, green-colored Sunset Theme - “Cotton Candy Skies”, Falcon 9 rocket, pink-colored No gatekeeping, I’ve been searching for tutorial like this for so long so here’s the link for the tutorial . Hope it will be helpful! I need a feedback!! I’m not sure about the colors tho, please let me know know if everything is readable and if you perhaps would change anything Thanks for reading, hope you like it!
Time-consuming animation and problemss Devlog 12 - Opportunity App and animation Problems!!! I messed up positions! 😭😭 I was adjusting this rover so it’s driving perfectly around the Mars for hourss and then I decided to check it with the scroll bar, and bc the rover had position: absolute it went down with the scroll bar idk how to describe it, like, he flew out of mars lol Solutions!!! I’ve watched quick guide on youtube about positions and finally understood everything, because before I was just kindaaa guessing lolll now, having the knowledge, I wrapped my animation into <div style="position: relative; border: pink [...]"> , added position: absolute to my images and adjusted everything completely from scratch!! It took me so long but I think it was worth it bc it looks nice and is something different from the usual. One more change I added border photo to Voyager App. Adjusting also took me a while but the window is way more interesting now! What’s next? Finishing Opportunity App!! Thanks for reading and have a nice day!!
Feedback and roverS Devlog 13 - Spirit and Opportunity App Feedback So, my project went through ratings: unfortunately, I only got 9.79 multiplier, but I also got an amazing and really valuable feedback!! People pointed out my messy repository, and indeed, it needed to be changed. I created new folders, and now it’s clear and organised! RoverS app? While researching, I noticed that Spirit also deserves to be mentioned! Because it’s the same mission, I decided to add Spirit to Opportunity app, and therefore it’s Rovers/Spirit&Opportunity app now! What’s next? I’m going to focus on improving my app and implementing the advices I received in feedback. I also have a lot of new ideas, so stay tuned!
I code my function!! Devlog 14 - animation and design Function I’m sooooooooo happy because yesterday I’ve managed to create my own function!!! someone suggested to make other tab switching. I was looking for some tutorial, but couldn’t find anything so I asked ai what can I search in youtube to find it. For better or worse, the AI gave me a little guidance on how it works (so I’d understand it in the tutorial, NO code ), I didn’t even fully read this because when I noticed “animation” and “adding classes” I noticed, what I can do! Few days ago I mentioned the theme switch tutorial, that helped me with understanding js!! With this knowledge and the pattern I already had from webOS tutorial, I managed to create opening app window animation!! Additional apps I also added left bar for the additional apps (/apps that are not about spacecrafts). For now just the background, but when I will finish every app I will also add some better animations and just style it better Problem At the very end of the video, you can notice such a huge problem with opening windows and theirs z-index. They open randomly, once under particular app once above, trying to catch this video when it’s smooth and they all go on top was really hard!! Please let me know if you know how to fix it And I had also tried to make my windows resizeable but it unfortunally didn’t worked. I will get back to this later What’s next? To perfect it all and fix bugs! And then maybe some games? Thanks for reading and have a nice day!!!
Such a challange! Devlog 15 - snake game Snake game? Yeah I’m surprised too. But I really wanted to see how it works and just code sth like this (with tutorial ofc). I wanted to make it a little later but I had time today and decided - why not? Okay but, 6 hours?!??!?!?!?!? Yeah 😭 in short, I started with tutorial 1, but it didn’t worked, so I deleted everything and switched to another tutorial, where I realised that I just haven’t connected my snake.js to html lolll but anyways, I even liked tutorial 2 more, I feel like it gave me more styling options, but I needed to quit it because to restart you needed to refresh the site. I tried to just implement some functions, change some things but I’m not that skilled to do this yet. I deleted everything again and came back to tutorial 1 which I eventually completed! That’s not the final results I really want to make the snake head a rocket thats collecting fuel, but there are some problems!! Obviously lol, so I have something like this const snakeColor = "pink"; and I tried to change pink to class, to var but it didn’t worked, and I really don’t know how can I style this snake further, so I can add the rocket and fuels and many other things. That’s why I liked tutorial 2 more! What’s next? I will try to style the snake and this whole window basically!! The video below is in 2x speed!
Random decision (but it was worth it) Devlog #16 - Radio buttons and styles What’s new? Radio buttons In my feedback someone suggested to add radio buttons instead of checkboxes bc then you can just choose one - and today I did it! I also styled it and added cool animation!! Each theme have different stars colors as well - you can check it in the video below. Highscore Somehow, I also added highscore to my snake game! I took a bit of information from tutorial 1 a bit from tutorial 2 and it’s working! Maybe not perfectly, but when you restart, new highscore will be visible, and it’s also in local storage so you can come back after a month and your highscore still will be there!! So, why random? It was a little unexpected bc I was working on the snake game (yeah it’s still not finished) and suddenly I gained a lot of motivation for the radio buttons. I knew I wanted to style them somehow, but I came up with the star design today, and I think it’s perfect!! What yall think about it?? What’s next? Hopefully, I’m going to finish the snake app!
Perfecting Devlog #17 - snake game and organisation What’s new? Snake game As you can see, I’ve styled the snake game a little! I also added start/tutorial/guide window, I added it by creating new window and setting start button as the window close button hihi work smarter not harder. Ai usage I couldn’t figure it out how can I set imgs as the background, food and even for snake, so I asked ai. It’s just creating const with img and adding drawImage instead of fillStyle , and I’m so happy bc now I understand it and know how to implement imgs to js! WHERE’S THE ROCKET? It was too hard!! I really tried, but when I managed to set the rocket as the snake’s head: The rocket was too small It wasn’t rotating It looked so bad and if I wanted to continue with this idea I would need to use ai, so more ai than I would like, so I eventually there’s snake in the snake game. More organisation I created folders in the img folder for each app, bc the img folder was still a little messy. It was such a tedious process, but it’s much clearer now! What’s next? New REALLY COOL APP and snake app icon, which I’m going to edit today while watching F1 sprint
The most spacecraft app on spacecraft os? Devlog #18 - MapApp!!! ALL SPACECRAFTS IN ONE PLACE WHAT AN AMAZING FEATURE!! What’s new? MAAAP AAAPP While doing research on Voyager 1 and 2 I found this “Eyes On The Solar System” from NASA, and noticed that you can embeed it, and that’s what I’ve done! First and foremost, you can check here the position of any spacecraft you want! That’s why I called it Map App. Moreover, that’s a place with a lot of information, and whole spacecraft history! As you can notice, it didn’t take me so long (bc it’s just embeeding), so what I’ve also completed? Fixed some bugs Finished icon for snake game What’s next? NGRST app! (Can someone guess, what does this short stand for? Hint: HST and JWST are already in spacecraftOS!)
More Animatiooons! Devlog #19 Animations on scroll Animations So recently I’ve been working on animations on scroll! Now my Apps about spacecrafts are more interactive and less boring. In the video below you can see all of the scroll animations I’d added till this moment. I feel so confident with css animations, they give me so much fun!! Icon The video is cropped so you can’t see the snake game icon but it finally is here! I added it in the second slide so you guys can see it! Let me know what yall think. I wanted to keep the one real-life, space themed addition (like moon in the music app) so the snake has galaxy eyes. Nancy Grace Roman Space Telescope PROBLEM As you can see I also added an icon for NGRST App but it’s an upcoming mission and I don’t really know what to do with it!! Someone requested it in the feedback, so I really want to implement it but idk, maybe I shall add a countdown? But it will be outdated soon. Many things can be outdated! Thanks for reading and have a nice day!
Reallyyyyyyy time consuming Calendar Devlog #20 - Calendar So I spent this whole day coding this calendar with youtube tutorial. This tutorial was only 17min but it took me 5h Then I needed to fix some typos bc I ofc made a lot and then many many styling!! It’s not the final result! I’m going on a trip tomorow, so I need to take a break from coding. To adjust the width and height, make it all fit to my site, it takes so long, and then I need to change the colors, bc I was just testing with the pinks. Change colors to all of my themes 😭 But it’s okay I got this Disappointing surprise You can see in the video on the second slide that there are 6 columns in the next month instead of 7! I’ve been so happy bc it was working in august, and then I changed months and it was a little disappointing surprise. I’m gonna fix it later! What’s next? When I’ll be back I’m going to work on this app! I didn’t expected it to be that hard Thanks for reading and see you in the next one!
I’m back!! Devlog #21 - new colors Hi everyone! I’m finally back but from hospital… right after my trip I was diagnosed with severe anemia and had to stay in the hospital for four days. I’m feeling good but I’m a little worried bc I lost so much time and I’m leaving on next trip again in few days!! There’s not many things left in SpacecraftOS tho, so let’s summarise it What’s new? In the video below you can see that I adjusted the calendar colors for every theme. It was such a fun process! I like how it looks now. I also managed to fix the days align and now it works perfectly, always in 7 columns. Hope yall like it! What’s next? I’m going to work on dock animation!! I also need to finish NGRSTApp but I think I’m going to keep it simple bc I don’t have so much time and I want to ship by the time I leave Thanks for reading, take care and have a nice day!!
Which one should I choose? Devlog #22 - Timer So I just made a timer with tutorial, but I need your help!! Should I keep miliseconds (slide 2) or keep it simple just with hours/minutes/seconds?? I kinda think that h/m/s looks better but it also seems so boring and less “advanced” than h/m/s/ms!! Also this was such an easy tutorial, fortunately everything went smoothly!! Yall probably know bro code but if someone wants here’s the link What’s next? Dock animation NGRSTApp Thanks for reading and I’m waiting for your comments!
happy and frustrated Devlog 23 - Dock animation, scrollbar and NGRSTApp Dock Animation I really like this animation!! It’s so smooth and cool and I’m so happy bc I learned new thing with the tutorial!! It came out exactly as I wanted NGRSTApp It’s finally finished!! I managed to add some things regardless it’s such a fresh mission. Hope yall like it! Scrollbar Yeah so here’s the frustrating part. I coded really pretty, unique and practical scrollbar in the css but I used webkit and it worked on microsoft but on chrome - not anymore! You can’t even see the scrollbar! I don’t have time anymore - I’m leaving in few hours, I commented it out and I hope I’ll fix it one day Additional changes Rewrited README Added some events to the calendar What’s next? I’m gonna ship now!! Wish me luck and thank you all for your support throughout the whole voyage!!
Scrollbar is working!! Devlog 24 - scrollbar bug Guys I think that this bug was (is) my personal fault, bc the scroll bar is visible in every single browser different than my current one lol I probably have some sort of extension that adds none !important or sth to my code’s head and it ruins everything, but it shall work on every other device, on every other browser. Tbh I also used ai to fix it but it didn’t really helped bc it was my internal problem. So happy that it’s working, just wanted to clarify and log these 16min!! If any problems with scrollbar occur, please use keyboard arrows to scroll through windows Again, thanks for reading and have a nice day!
New spacecraft App! Devlog 25 - SpaceShuttleApp Hi everyone!! I’m back with a whole new app and smoother system 1. Smoother system So I’ve got a lot feedback that spacecraftOS is working slow and someone has recommended to me adding se vite - that’s what i’ve done and now it works much better! 2. Space Shuttle App I’ve decided to add another spacecraft app, they’re always fun to make and it’s kinda easyyy process tbh so everything was smooth. On this app I described a little every space shuttle NASA has ever created. Hope you’ll enjoy it!! Thanks for reading and have a nice day!
Ships:
I made an operating system based around spacecrafts! My website provides few apps: two about telescopes where you can learn about them and rate few photos they took from 1 to 5 stars, and one with notes, where you can store your ideas if some spacecrafts inspire you! Besides apps, on the top bar you will find two guides on how to catch the ISS and starlink satellites. In the ISS window you can find short youtube video - it’s about Polish astronaut, Sławosz Uznański, eating pierogi (delicious polish dish) on the ISS! I really recommend watching this The apps were the biggest challange for me. That’s why I had spent so many hours on this project. Firts, I couldn’t even open the first app. It was hard to even make the selected function work. Then, I managed to make this one app working! But, it wasn’t the right solution. When I added new apps, they were opening the 1st app window, and not theirs. I spent a lot hours trying to fix it, I tried a lot of possible solutions and finally, I had asked ai for help. That’s the only ai usage in this project. Eventually, everything works! I’m so happy because I’ve almost gave up. I really like the outcome, and I look forward for the future changes! I came up with a lot of ideas and I realised them the exact way I wanted! My favourite parts are def the Sławosz eating pierogi video and the photo ranking which I find so fun to watch and rate. Hope you’ll enjoy this as much as I do!
I made an Operating System with spacecraft theme! New features Artemis App Artemis II playlist (app) Settings and darkmode Design - few images on the windows borders Start animation with spacecraftOS baner Challenges Compared to my previous ship, this time all functions and styling went smoothly, but the things that took the most time were adjusting photos and writing, researching about Artemis Mission! I tought that making the darkmode switch would be really hard, but when I focused it was really easy and rewarding process! Proud of I really like the starting animation and the images on the borders. I started coding one month ago so doing something cool with the css all by yourself is so fulfilling! I don’t understand js that much yet, so I had also watched few tutorials. The webOS 1 tutorial was really hard for me, so now I’m really happy when the things I wanted to add to my website turns out well! So I’m also really proud of the images slider in the Artemis App, the spotify playlist embedded and the dark/light mode switcher in the settings! Even tho they were made with tutorials I still needed to adjust it so it fits my site, and I’m so happy that I understand it to the point that I could do this all just by myself Notes Don’t forget to check the README, remember to double click to open apps and just enjoy the vojage!!
I made a web Operating System with spacecraft theme! Creating this site was so fun and fulfilling, esp. when a lot of things turned out exactly as I wanted!! I started coding over a month ago, and I’m so happy that I managed to create something like this. I really enjoyed it, especially the css part. SpacecraftOS This OS provides basic app like timer, calendar, maps, gallery, but everything have implemented some spacecraft additions. For example, the map app won’t show you the route to the nearest grocery store, but it will show you where your fav spacecraft is right now. The calendar app will show you astronauts birthdays and the gallery app provides photos humans sent to space on voyager. All these apps you will find on the left and on the bottom there are apps, where you’ll learn about various spacecrafts, and in some of these apps, you can also rate some photos the spacecrafts took! Notes Please start from choosing the most suitable for you theme in the settings (top right corner) Try on laptop/computer for better experience Snake game is only playable with keyboard Remember to double click on apps to open and please leave a toughtful review. Hope you’ll enjoy it!!...
|
1793083935.4828467
|
1793170335.4828467
|
|
12569
|
NeneUI (@neneys/ui) by @pksmkwe26 | Stardance
|
pksmkwe26
|
2
|
84.16
|
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": 83013, "ts": "202 [{"post_id": 83013, "ts": "2026-10-26T15:39:21Z", "hours": 0.7169, "text": "Devlog (No. 30) 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 Changes Update some parts of Daikon Debugger and removed some unnessary codes. Extended Debugger Width Desktop Runtime with unused RPC (will work on it) Explanation Diagram Drawn an Explanation Diagram on Figma that shows how Interface and Callbacks works, hope it’s good and does give some idea about @neneys /ui Thanks for reading this minidevlog.!! Love you all <3"}, {"post_id": 82939, "ts": "2026-10-26T10:19:02Z", "hours": 0.4383, "text": "Devlog (No. 29) 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 About the Memory Leak Issue being Fixed Many People in Review told me how did the Memory Leak get fixed and what was the cause of it? Blog Link May not open now, Since it hasn’t been built yet Docs Changes So, Here’s the docs with it being documented in the blog will be available once Github Actions Finishes Updated Debugger I’m working on a updated @neneys /ui Debugger to be more ease-to-use. Will be finished in a less time, The Debugger will allow the ease of accessing and modifying an Widget Data for the Session and manipulate Shared Preferences. Thanks for reading!! Love you all >3 ❤️"}, {"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
Devlog (No. 29) 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 About the Memory Leak Issue being Fixed Many People in Review told me how did the Memory Leak get fixed and what was the cause of it? Blog Link May not open now, Since it hasn’t been built yet Docs Changes So, Here’s the docs with it being documented in the blog will be available once Github Actions Finishes Updated Debugger I’m working on a updated @neneys /ui Debugger to be more ease-to-use. Will be finished in a less time, The Debugger will allow the ease of accessing and modifying an Widget Data for the Session and manipulate Shared Preferences. Thanks for reading!! Love you all >3 ❤️
Devlog (No. 30) 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 Changes Update some parts of Daikon Debugger and removed some unnessary codes. Extended Debugger Width Desktop Runtime with unused RPC (will work on it) Explanation Diagram Drawn an Explanation Diagram on Figma that shows how Interface and Callbacks works, hope it’s good and does give some idea about @neneys /ui Thanks for reading this minidevlog.!! Love you all <3
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)....
|
1793054986.9895082
|
1793141386.9895082
|
|
26881
|
My very own WebOS by @Matesz | Stardance
|
Matesz
|
1
|
84.16
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-31T14:46:39Z", "hours": 81.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built my own web-based OS simulation called VoidOS a complete desktop environment that runs entirely in the browser from a single HTML file, no build tools, no npm, no backend. It’s got draggable, resizable windows, a taskbar, boot/login sequences, and a full suite of over 30 apps: Terminal, Files, Text Editor, Calculator, Music Player, Notes, Gallery, Mail, Calendar, Kanban, Weather, Settings, a few games (Tetris, Pong, Breakout, even a Doom-like FPS), and more. It leans hard into a retro CRT aesthetic scanlines, screen curvature, phosphor glow, chromatic aberration all done with pure CSS so it stays performant. The whole thing is vanilla JavaScript around 3,500 lines, ~85KB, zero dependencies organized into clean logical modules (an event bus, an IndexedDB wrapper, a virtual filesystem, a window manager, etc.) that mimic how a real OS is architected. I’m especially proud of the boot sequence and sound design I used the Web Audio API to synthesize authentic old-chip system sounds instead of using sample files. Being dysgraphic made this project harder than it might look writing and organizing all the code, comments, and documentation takes me a lot more effort and time than it does for most people, so just pushing through devlog after devlog was its own challenge. On the technical side, getting the CRT effects to look authentic without tanking performance was tricky too I ended up building a “Retro Inspector” devtool so I could toggle individual effects and watch the frame-cost impact in real time. Persistence was another hard one: making windows, files, notes, and settings survive a page reload without a backend meant building my own filesystem layer on top of IndexedDB. I also had to track down some nasty bugs along the way, like a memory leak in the music player’s beat interval and a mousemove listener firing on every frame until I throttled it. You can try it live in the browser, no install needed everything (files, notes, settings) is saved locally via IndexedDB, so it’ll persist between visits on the same browser. Try dragging windows around, snapping them to screen edges, opening a few apps from the dock/desktop, and poking around Settings to switch themes and wallpapers. The full source and devlog history are on GitHub if you want to see how it’s built.", "repo": "https://github.com/mateszko090214/WebOS", "demo": "https://web-void-os.netlify.app"}]...
|
[{"post_id": 74630, "ts": "202 [{"post_id": 74630, "ts": "2026-09-27T20:24:35Z", "hours": 3.1597, "text": "updated the z-index in css"}, {"post_id": 58195, "ts": "2026-08-30T15:29:40Z", "hours": 7.3572, "text": "VoidOS Retro - Changelog [v2.7.0] - Hyprland, Gadgets & Sound Added: Hyprland blur + rainbow border, system sounds, power-on gate, redesigned boot & login screens, 8-direction window resize, draggable gadgets (Clock/System/Signal/Sticky Note), touch & pen support, full keyboard accessibility, music shuffle/repeat, drag-and-drop music import, dock magnification, genie window animation, backup export/import, PWA offline support, favicon/meta tags, richer neofetch. Changed: Pointer Events for all drag/resize, consistent hover states app-wide, better Weather/Calendar UI, fixed version number display. Fixed: “Forget Saved Data” did nothing (undefined API), Gallery ignored requested image, unreachable achievement, broken default wallpaper, music/wallpaper detection failing under file:// , silent music playback under file:// , README merge-conflict markers, missing fallback manifest files. [v2.6.0] - Wallpaper & Music Update Added: Photo wallpapers with parallax drift, custom wallpaper upload, labeled thumbnails, bundled music/ folder with auto-detection (GitHub Pages API, directory listing, tracks.txt fallback). Changed: Split single-file app into index.html / style.css / script.js ; default wallpaper now a photo. Fixed: Live wallpaper canvas was hiding photo wallpapers underneath. [v2.5.0] - Phosphor Edition Added: Procedural + video live wallpapers, detailed boot sequence, CRT effects (curvature, scanlines, chromatic aberration, bloom), Degauss command, Retro Inspector devtool, 6 phosphor themes, 4 vintage wallpapers, CGA/EGA/VGA color support, synthesized chip sounds, realistic shutdown sequence, accessibility tweaks. Enhanced: Video live wallpapers, boot realism, theme persistence, terminal commands, window management (snap/ghost), virtual filesystem, full app suite (Terminal, Files, Editor, Calculator, Music, Notes, Gallery, Store, Weather, Timer, Kanban, Spotlight, Switcher), Easter eggs (Konami, Matrix rain, Rainbow mode), performance, Settings app. Fixed: Purple theme color bleed, wallpaper/settings z-index conflict, harsh terminal bell, cursor blink accessibility, theme-change icon snap, persistence reliability, CRT flicker."}, {"post_id": 55604, "ts": "2026-08-27T15:43:13Z", "hours": 9.8389, "text": "VoidOS Retro - Changelog [v2.5.0] - Phosphor Edition Added Type Description Advanced Live Wallpaper System Procedural generation (starfield, matrix rain, plasma waves) with YouTube video backgrounds and intelligent fallback Comprehensive Boot Sequence Detailed systemd-like boot logs showing service initialization, persistence layer status detection Enhanced Visual Effects Authentic CRT curvature simulation, dynamic scanline intensity, chromatic aberration, bloom/glow, phosphor persistence Degauss Command Terminal command that temporarily warps display with recovery animation Retro Inspector DevTool Real-time toggling of individual CRT effects with performance impact overlay 6 Built-in Phosphor Themes Green (classic terminal), Blue, Pink, Purple, White, and custom colors Vintage Wallpaper Collection 4 authentic wallpapers: IBM green terminal, Apple II monitor, VT100 amber, RGB composite artifact ThemeEngine Improvements Accepts spectral power distributions for accurate phosphor emulation True Terminal Color Support CGA/EGA/VGA palettes with customizable intensity System Sound Regeneration Web Audio API emulation of SN76489 and AY-3-8910 chips Enhanced Boot Animation POST beeps + memory count + BIOS splash simulation Realistic Shutdown Sequence Power-down surge with fading glow animation Accessibility Improvements Cursor blink rate respecting system settings, terminal bell filtered through CRT speaker Enhanced Type Description Live Wallpaper System Now supports video modes alongside procedural ones with automatic fallback Boot Process Realism Simulated system initialization with detailed service logging Theme Switching Dynamic theme persistence via IndexedDB Terminal Utilities Additional commands and improved history Desktop Styling Border radius, deep box shadow, enhanced titlebar with pulsing indicators Window Management Persistence option for ghost images when dragging, snap-to-edges functionality Filesystem Virtual FileSystem with persistence via browser storage (falls back to session-only) Application Suite Pre-loaded apps including Terminal, Files, Text Editor, Calculator, Music Player, Notes, Gallery, Store, Weather, Timer, Kanban, Spotlight, Window Switcher Easter Eggs System Konami code (confetti burst), Matrix rain terminal command, Rainbow mode (brand click) Performance Optimizations Rendering loop improvements, pure CSS solutions for effects under 2ms frame cost Settings App Comprehensive customization with live wallpaper selector, theme picker, and system controls Fixed Type Description Theme Color Bleed Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) UI Layering Wallpaper slideshow paused when opening settings menu (z-index conflict resolved) Terminal Audio Terminal bell sound was too sharp—now filtered through CRT speaker simulation Accessibility Cursor blink rate now respects system accessibility settings Theme Transition Race Fixed condition where desktop icons would momentarily snap to grid on theme change Persistence Reliability Improved persistence layer reliability for cross-session data retention CRT Flicker Fixed occasional flicker in CRT effects during rapid theme changes [v0.96] - Text Editor Enhancement Update Added Type Description Find and Replace Functionality Ctrl+F for find, Ctrl+H for replace with options for single/all occurrences and case-sensitive search Go To Line Navigation Ctrl+G to jump to specific line numbers with input validation Enhanced Syntax Highlighting Added support for JSON and Python languages, improved existing language definitions Current Line Highlighting Visual indicator of cursor line with subtle highlighting Improved Keyboard Shortcuts Integrated find/replace/go-to-line with standard text editor shortcuts Enhanced Type Description Text Editor Application Overall usability and functionality approaching modern code editor standards Developer Experience Enhanced built-in tools for webOS system development and customization"}, {"post_id": 53154, "ts": "2026-08-23T16:18:22Z", "hours": 9.2947, "text": "VoidOS Retro - Changelog [v0.95] Type Description Updated README.md and DEVLOG.md to have a more professional presentation with tables and structured information Enhanced documentation clarity and readability [v0.94] - Video Backgrounds & Boot Enhancements Added Type Description Video background live wallpaper options (YouTube embeds) with fallback to procedural starfield Enhanced boot sequence with detailed systemd-like boot logs (Journal Service, udev, etc.) Persistence layer status detection shown in boot logs Enhanced Type Description Live wallpaper system to support video modes alongside procedural ones Boot process realism with simulated system initialization Background video fallback to starfield if embed fails to load [v0.93] - Live Wallpaper & Polish Update Added Type Description Custom hand-drawn cursor sprite for authentic retro feel Enhanced desktop styling with border radius and deep box shadow Procedural live wallpaper system (starfield, matrix rain, plasma waves) Enhanced titlebar with pulsing indicators and uppercase text Improved scrollbar styling throughout all applications Retro beveled button styling for windows and menus Live wallpaper toggle in Settings > Display Added Achievements app to the Store (tracks unlocked easter eggs) Enhanced Type Description Terminal utilities with additional commands and better history Files app drag-and-drop functionality between folders Settings app with live wallpaper selector Achievement system integration with toast notifications Performance optimizations to rendering loops Fixed Type Description Minor alignment issues in titlebar elements Improved persistence layer reliability Fixed occasional flicker in CRT effects during rapid theme changes [v0.92] - Major Retro-Theming Update Added Type Description Authentic CRT curvature simulation (using CSS transforms + filters, not canvas) Scanline intensity that dynamically responds to brightness (like real phosphor decay) 4 vintage wallpapers IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact Terminal support for true CGA/EGA/VGA color palettes with customizable intensity Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash Shutdown animation with realistic power-down surge and fading glow System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips “Degauss” command to Terminal that temporarily warps the display (with recovery animation) Favorite Feature: Retro Inspector DevTool Type Description Toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time Performance impact overlay showing frame cost Pure CSS solution keeps effects under 2ms frame cost even on integrated graphics Architecture Tweaks Type Description ThemeEngine now accepts spectral power distributions for accurate phosphor emulation Audio.js added noise generators for tape hiss and RF interference WindowManager gained “persistence” option that leaves ghost images when dragging (like long-persistence phosphor) FS.js now stores theme preferences per-user in IndexedDB with encrypted backup Fixed Type Description Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) Wallpaper slideshow paused when opening settings menu (z-index conflict) Terminal bell sound was too sharp—now filtered through CRT speaker simulation Cursor blink rate wasn’t respecting system accessibility settings Fixed a race condition where desktop icons would momentarily snap to grid on theme change Notes You can try VoidOS Retro live at: https://web-void-os.netlify.app"}, {"post_id": 46944, "ts": "2026-08-14T14:47:10Z", "hours": 12.2797, "text": "VoidOS Retro - Changelog [v0.94] - Video Backgrounds & Boot Enhancements Added Video background live wallpaper options (YouTube embeds) with fallback to procedural starfield Enhanced boot sequence with detailed systemd-like boot logs (Journal Service, udev, etc.) Persistence layer status detection shown in boot logs Enhanced Live wallpaper system to support video modes alongside procedural ones Boot process realism with simulated system initialization Background video fallback to starfield if embed fails to load [v0.93] - Live Wallpaper & Polish Update Added Custom hand-drawn cursor sprite for authentic retro feel Enhanced desktop styling with border radius and deep box shadow Procedural live wallpaper system (starfield, matrix rain, plasma waves) Enhanced titlebar with pulsing indicators and uppercase text Improved scrollbar styling throughout all applications Retro beveled button styling for windows and menus Live wallpaper toggle in Settings > Display Added Achievements app to the Store (tracks unlocked easter eggs) Enhanced Terminal utilities with additional commands and better history Files app drag-and-drop functionality between folders Settings app with live wallpaper selector Achievement system integration with toast notifications Performance optimizations to rendering loops Fixed Minor alignment issues in titlebar elements Improved persistence layer reliability Fixed occasional flicker in CRT effects during rapid theme changes [v0.92] - Major Retro-Theming Update Added Authentic CRT curvature simulation (using CSS transforms + filters, not canvas) Scanline intensity that dynamically responds to brightness (like real phosphor decay) 4 vintage wallpapers: IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact Terminal support for true CGA/EGA/VGA color palettes with customizable intensity Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash Shutdown animation with realistic power-down surge and fading glow System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips “Degauss” command to Terminal that temporarily warps the display (with recovery animation) Favorite Feature: Retro Inspector DevTool Toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time Performance impact overlay showing frame cost Pure CSS solution keeps effects under 2ms frame cost even on integrated graphics Architecture Tweaks ThemeEngine now accepts spectral power distributions for accurate phosphor emulation Audio.js added noise generators for tape hiss and RF interference WindowManager gained “persistence” option that leaves ghost images when dragging (like long-persistence phosphor) FS.js now stores theme preferences per-user in IndexedDB with encrypted backup Fixed Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) Wallpaper slideshow paused when opening settings menu (z-index conflict) Terminal bell sound was too sharp—now filtered through CRT speaker simulation Cursor blink rate wasn’t respecting system accessibility settings Fixed a race condition where desktop icons would momentarily snap to grid on theme change Notes You can try VoidOS Retro live at: https://web-void-os.netlify.app"}, {"post_id": 45288, "ts": "2026-08-11T17:31:34Z", "hours": 12.7103, "text": "VoidOS Retro - Changelog [v0.93] - Live Wallpaper & Polish Update Added Custom hand-drawn cursor sprite for authentic retro feel Enhanced desktop styling with border radius and deep box shadow Procedural live wallpaper system (starfield, matrix rain, plasma waves) Enhanced titlebar with pulsing indicators and uppercase text Improved scrollbar styling throughout all applications Retro beveled button styling for windows and menus Live wallpaper toggle in Settings > Display Added Achievements app to the Store (tracks unlocked easter eggs) Enhanced Terminal utilities with additional commands and better history Files app drag-and-drop functionality between folders Settings app with live wallpaper selector Achievement system integration with toast notifications Performance optimizations to rendering loops Fixed Minor alignment issues in titlebar elements Improved persistence layer reliability Fixed occasional flicker in CRT effects during rapid theme changes [v0.92] - Major Retro-Theming Update Added Authentic CRT curvature simulation (using CSS transforms + filters, not canvas) Scanline intensity that dynamically responds to brightness (like real phosphor decay) 4 vintage wallpapers: IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact Terminal support for true CGA/EGA/VGA color palettes with customizable intensity Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash Shutdown animation with realistic power-down surge and fading glow System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips “Degauss” command to Terminal that temporarily warps the display (with recovery animation) Favorite Feature: Retro Inspector DevTool Toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time Performance impact overlay showing frame cost Pure CSS solution keeps effects under 2ms frame cost even on integrated graphics Architecture Tweaks ThemeEngine now accepts spectral power distributions for accurate phosphor emulation Audio.js added noise generators for tape hiss and RF interference WindowManager gained “persistence” option that leaves ghost images when dragging (like long-persistence phosphor) FS.js now stores theme preferences per-user in IndexedDB with encrypted backup Fixed Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) Wallpaper slideshow paused when opening settings menu (z-index conflict) Terminal bell sound was too sharp—now filtered through CRT speaker simulation Cursor blink rate wasn’t respecting system accessibility settings Fixed a race condition where desktop icons would momentarily snap to grid on theme change Notes This is a side project of the Retro OS. Download the Retro OS from: https://github.com/mateszko090214/WebOS.git You can try VoidOS Retro live at: https://web-void-os.netlify.app"}, {"post_id": 39211, "ts": "2026-08-02T01:01:18Z", "hours": 8.0097, "text": "VoidOS Retro - Changelog [v0.92] - Major Retro-Theming Update Added Authentic CRT curvature simulation (using CSS transforms + filters, not canvas) Scanline intensity that dynamically responds to brightness (like real phosphor decay) 4 vintage wallpapers: IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact Terminal support for true CGA/EGA/VGA color palettes with customizable intensity Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash Shutdown animation with realistic power-down surge and fading glow System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips “Degauss” command to Terminal that temporarily warps the display (with recovery animation) Favorite Feature: Retro Inspector DevTool Toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time Performance impact overlay showing frame cost Pure CSS solution keeps effects under 2ms frame cost even on integrated graphics Architecture Tweaks ThemeEngine now accepts spectral power distributions for accurate phosphor emulation Audio.js added noise generators for tape hiss and RF interference WindowManager gained “persistence” option that leaves ghost images when dragging (like long-persistence phosphor) FS.js now stores theme preferences per-user in IndexedDB with encrypted backup Fixed Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) Wallpaper slideshow paused when opening settings menu (z-index conflict) Terminal bell sound was too sharp—now filtered through CRT speaker simulation Cursor blink rate wasn’t respecting system accessibility settings Fixed a race condition where desktop icons would momentarily snap to grid on theme change Notes This is a side project of the Retro OS. Download the Retro OS from: https://github.com/mateszko090214/WebOS.git You can try VoidOS Retro live at: https://web-void-os.netlify.app"}, {"post_id": 37275, "ts": "2026-07-29T21:16:31Z", "hours": 4.0828, "text": "Persistence (Puter) — files, notes, kanban, mail, calendar, distro log, dotfiles, settings, installed Store apps, and achievements now survive a reload. No backend involved. Window edge-snapping + real drag-and-drop file moves — these were literally sitting in the fake todo.txt inside VoidOS’s own filesystem, so I built them and marked them done in-universe. CRT scanline mode, matrix-rain terminal effect (RetroOS) — toggle in Settings, or type matrix in the terminal. A CPU-reactive pet, idle-based Store additions, Konami code, rainbow logo, cursor trail (MewoOS). 8 new apps, all in the Store: Color Lab, Sudoku, Distro Tracker, Dotfiles Sync, Mail, Task Manager, Calendar, Achievements. 27 apps total now."}, {"post_id": 35440, "ts": "2026-07-26T21:05:00Z", "hours": 4.2733, "text": "This is a side project of the Retro OS. Download the Retro OS from my GitHub : https://github.com/mateszko090214/WebOS.gitRetroWebOSJust pushed a major retro-theming update that dials the nostalgia to 11. This isn’t just a skin change—it’s a full immersion retrofit.What’s new in the Retro Edition:• Authentic CRT curvature simulation (using CSS transforms + filters, not canvas)• Scanline intensity now dynamically responds to brightness (like real phosphor decay)• Added 4 vintage wallpapers: IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact• Terminal now supports true CGA/EGA/VGA color palettes with customizable intensity• Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash• Shutdown animation includes realistic power-down surge and fading glow• System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips• Added “degauss” command to Terminal that temporarily warps the display (with recovery animation)Favorite feature: The new “Retro Inspector” DevToolIt lets you toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time while seeing the performance impact overlay. Pure CSS solutions mean these effects stay under 2ms frame cost even on integrated graphics.The architecture tweaks:• ThemeEngine now accepts spectral power distributions for accurate phosphor emulation• Audio.js added noise generators for tape hiss and RF interference• WindowManager gained “persistence” option that leaves ghost images when dragging (like long-persistence phosphor)• FS.js now stores theme preferences per-user in IndexedDB with encrypted backupWhat I fixed:• Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta)• Wallpaper slideshow paused when opening settings menu (z-index conflict)• Terminal bell sound was too sharp—now filtered through CRT speaker simulation• Cursor blink rate wasn’t respecting system accessibility settings• Fixed a race condition where desktop icons would momentarily snap to grid on theme changev0.91 roadmap (Retro polish):• Add “TV mode” with overscan, color bleed, and RF noise and i want you to especialy point out this is a side project of it. download the retro os you find on my github. And you can try my side project void os here https://web-void-os.netlify.app"}, {"post_id": 29773, "ts": "2026-07-16T21:27:45Z", "hours": 10.4378, "text": "RetroWebOS Just pushed a major retro-theming update that dials the nostalgia to 11. This isn't just a skin change—it's a full immersion retrofit. What's new in the Retro Edition: • Authentic CRT curvature simulation (using CSS transforms + filters, not canvas) • Scanline intensity now dynamically responds to brightness (like real phosphor decay) • Added 4 vintage wallpapers: IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact • Terminal now supports true CGA/EGA/VGA color palettes with customizable intensity • Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash • Shutdown animation includes realistic power-down surge and fading glow • System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips • Added \"degauss\" command to Terminal that temporarily warps the display (with recovery animation) Favorite feature: The new \"Retro Inspector\" DevTool It lets you toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time while seeing the performance impact overlay. Pure CSS solutions mean these effects stay under 2ms frame cost even on integrated graphics. The architecture tweaks: • ThemeEngine now accepts spectral power distributions for accurate phosphor emulation • Audio.js added noise generators for tape hiss and RF interference • WindowManager gained \"persistence\" option that leaves ghost images when dragging (like long-persistence phosphor) • FS.js now stores theme preferences per-user in IndexedDB with encrypted backup What I fixed: • Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) • Wallpaper slideshow paused when opening settings menu (z-index conflict) • Terminal bell sound was too sharp—now filtered through CRT speaker simulation • Cursor blink rate wasn't respecting system accessibility settings • Fixed a race condition where desktop icons would momentarily snap to grid on theme change v0.9 roadmap (Retro polish): • Add \"TV mode\" with overscan, color bleed, and RF noise"}, {"post_id": 24336, "ts": "2026-07-07T20:56:38Z", "hours": 1.4333, "text": "My very own WebOS A week ago I released v2.0. Now here’s v3.0 “Synthwave Edition.” A complete desktop OS simulation that runs in a single HTML file, built with vanilla JavaScript. No build step, no npm, no Webpack — just open it in your browser and it works. What’s changed since v2.0? The numbers speak for themselves: 13 apps → 30+ apps (Calendar, Weather, Music Player, Mail, Chat, Notes, System Monitor, Password Vault, Tetris, Pong, Breakout, + Doom-Like FPS) 3 themes → 6 phosphor themes (Pink, Purple, White, and more) 4 wallpapers → 10 animated wallpapers (Rain, Snow, Fire, VHS, Galaxy, 3D Grid…) Added AES-GCM encryption (Web Crypto API) for the Password Vault IndexedDB instead of localStorage’s 5MB limit (50MB+) PWA — installable as a standalone app, works offline Voice commands — “open terminal,” “shutdown,” “lock”… Window snap zones (Windows-style drag to edge) Favorite feature: Game Launcher I also built in an Unreal Engine integration system. If you have a WebGL build of your game, drop in the .wasm + .js + .data files, and the launcher automatically handles highscores, system requirements, and the gallery. The architecture 14 logical modules, all in one file: Bus — Pub/sub event system IDB — IndexedDB wrapper Crypto — Web Crypto API Kernel — Luna Service Bus IPC emulation FS — Virtual filesystem (recycle bin, drag & drop) OS — Orchestrator (boot, login, windows) …and 8 more ~3,500 lines of code. ~85KB. 0 dependencies. What I fixed Six significant bugs found during the v2.0 review: Settings Green option was always “selected” (typo in the code) Browser app’s inline onclick=“navigator()” — this was calling the navigator Web API, not a function (classic mistake) Music Player beat interval cleanup memory leak Tetris piece null reference on game over Voice listener leak through the Bus 60fps mousemove → throttled to 50ms (60% less CPU usage) v3.1 roadmap Multiplayer over WebRTC (Snake, Pong, Doom) Real audio file playback in the Music Player Drag-from-desktop to taskbar (pin apps) Undo/redo in the text editor Gamepad API support for all games Plugin system for community apps Try it out mateszko090214.github.io/WebOS Full code, docs, and roadmap are up on GitHub. If you like it, drop a star! “Bringing the 80s back to your browser, one pixel at a time.”"}, {"post_id": 18490, "ts": "2026-06-29T17:32:22Z", "hours": 1.4903, "text": "i am working on a Retro theme WebOS"}]...
|
Title: My very own WebOS by @Matesz | Stardance
D Title: My very own WebOS by @Matesz | Stardance
Devlogs:
i am working on a Retro theme WebOS
My very own WebOS A week ago I released v2.0. Now here’s v3.0 “Synthwave Edition.” A complete desktop OS simulation that runs in a single HTML file, built with vanilla JavaScript. No build step, no npm, no Webpack — just open it in your browser and it works. What’s changed since v2.0? The numbers speak for themselves: 13 apps → 30+ apps (Calendar, Weather, Music Player, Mail, Chat, Notes, System Monitor, Password Vault, Tetris, Pong, Breakout, + Doom-Like FPS) 3 themes → 6 phosphor themes (Pink, Purple, White, and more) 4 wallpapers → 10 animated wallpapers (Rain, Snow, Fire, VHS, Galaxy, 3D Grid…) Added AES-GCM encryption (Web Crypto API) for the Password Vault IndexedDB instead of localStorage’s 5MB limit (50MB+) PWA — installable as a standalone app, works offline Voice commands — “open terminal,” “shutdown,” “lock”… Window snap zones (Windows-style drag to edge) Favorite feature: Game Launcher I also built in an Unreal Engine integration system. If you have a WebGL build of your game, drop in the .wasm + .js + .data files, and the launcher automatically handles highscores, system requirements, and the gallery. The architecture 14 logical modules, all in one file: Bus — Pub/sub event system IDB — IndexedDB wrapper Crypto — Web Crypto API Kernel — Luna Service Bus IPC emulation FS — Virtual filesystem (recycle bin, drag & drop) OS — Orchestrator (boot, login, windows) …and 8 more ~3,500 lines of code. ~85KB. 0 dependencies. What I fixed Six significant bugs found during the v2.0 review: Settings Green option was always “selected” (typo in the code) Browser app’s inline onclick=“navigator()” — this was calling the navigator Web API, not a function (classic mistake) Music Player beat interval cleanup memory leak Tetris piece null reference on game over Voice listener leak through the Bus 60fps mousemove → throttled to 50ms (60% less CPU usage) v3.1 roadmap Multiplayer over WebRTC (Snake, Pong, Doom) Real audio file playback in the Music Player Drag-from-desktop to taskbar (pin apps) Undo/redo in the text editor Gamepad API support for all games Plugin system for community apps Try it out mateszko090214.github.io/WebOS Full code, docs, and roadmap are up on GitHub. If you like it, drop a star! “Bringing the 80s back to your browser, one pixel at a time.”
RetroWebOS Just pushed a major retro-theming update that dials the nostalgia to 11. This isn't just a skin change—it's a full immersion retrofit. What's new in the Retro Edition: • Authentic CRT curvature simulation (using CSS transforms + filters, not canvas) • Scanline intensity now dynamically responds to brightness (like real phosphor decay) • Added 4 vintage wallpapers: IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact • Terminal now supports true CGA/EGA/VGA color palettes with customizable intensity • Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash • Shutdown animation includes realistic power-down surge and fading glow • System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips • Added "degauss" command to Terminal that temporarily warps the display (with recovery animation) Favorite feature: The new "Retro Inspector" DevTool It lets you toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time while seeing the performance impact overlay. Pure CSS solutions mean these effects stay under 2ms frame cost even on integrated graphics. The architecture tweaks: • ThemeEngine now accepts spectral power distributions for accurate phosphor emulation • Audio.js added noise generators for tape hiss and RF interference • WindowManager gained "persistence" option that leaves ghost images when dragging (like long-persistence phosphor) • FS.js now stores theme preferences per-user in IndexedDB with encrypted backup What I fixed: • Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) • Wallpaper slideshow paused when opening settings menu (z-index conflict) • Terminal bell sound was too sharp—now filtered through CRT speaker simulation • Cursor blink rate wasn't respecting system accessibility settings • Fixed a race condition where desktop icons would momentarily snap to grid on theme change v0.9 roadmap (Retro polish): • Add "TV mode" with overscan, color bleed, and RF noise
This is a side project of the Retro OS. Download the Retro OS from my GitHub : https://github.com/mateszko090214/WebOS.gitRetroWebOSJust pushed a major retro-theming update that dials the nostalgia to 11. This isn’t just a skin change—it’s a full immersion retrofit.What’s new in the Retro Edition:• Authentic CRT curvature simulation (using CSS transforms + filters, not canvas)• Scanline intensity now dynamically responds to brightness (like real phosphor decay)• Added 4 vintage wallpapers: IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact• Terminal now supports true CGA/EGA/VGA color palettes with customizable intensity• Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash• Shutdown animation includes realistic power-down surge and fading glow• System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips• Added “degauss” command to Terminal that temporarily warps the display (with recovery animation)Favorite feature: The new “Retro Inspector” DevToolIt lets you toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time while seeing the performance impact overlay. Pure CSS solutions mean these effects stay under 2ms frame cost even on integrated graphics.The architecture tweaks:• ThemeEngine now accepts spectral power distributions for accurate phosphor emulation• Audio.js added noise generators for tape hiss and RF interference• WindowManager gained “persistence” option that leaves ghost images when dragging (like long-persistence phosphor)• FS.js now stores theme preferences per-user in IndexedDB with encrypted backupWhat I fixed:• Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta)• Wallpaper slideshow paused when opening settings menu (z-index conflict)• Terminal bell sound was too sharp—now filtered through CRT speaker simulation• Cursor blink rate wasn’t respecting system accessibility settings• Fixed a race condition where desktop icons would momentarily snap to grid on theme changev0.91 roadmap (Retro polish):• Add “TV mode” with overscan, color bleed, and RF noise and i want you to especialy point out this is a side project of it. download the retro os you find on my github. And you can try my side project void os here https://web-void-os.netlify.app
Persistence (Puter) — files, notes, kanban, mail, calendar, distro log, dotfiles, settings, installed Store apps, and achievements now survive a reload. No backend involved. Window edge-snapping + real drag-and-drop file moves — these were literally sitting in the fake todo.txt inside VoidOS’s own filesystem, so I built them and marked them done in-universe. CRT scanline mode, matrix-rain terminal effect (RetroOS) — toggle in Settings, or type matrix in the terminal. A CPU-reactive pet, idle-based Store additions, Konami code, rainbow logo, cursor trail (MewoOS). 8 new apps, all in the Store: Color Lab, Sudoku, Distro Tracker, Dotfiles Sync, Mail, Task Manager, Calendar, Achievements. 27 apps total now.
VoidOS Retro - Changelog [v0.92] - Major Retro-Theming Update Added Authentic CRT curvature simulation (using CSS transforms + filters, not canvas) Scanline intensity that dynamically responds to brightness (like real phosphor decay) 4 vintage wallpapers: IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact Terminal support for true CGA/EGA/VGA color palettes with customizable intensity Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash Shutdown animation with realistic power-down surge and fading glow System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips “Degauss” command to Terminal that temporarily warps the display (with recovery animation) Favorite Feature: Retro Inspector DevTool Toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time Performance impact overlay showing frame cost Pure CSS solution keeps effects under 2ms frame cost even on integrated graphics Architecture Tweaks ThemeEngine now accepts spectral power distributions for accurate phosphor emulation Audio.js added noise generators for tape hiss and RF interference WindowManager gained “persistence” option that leaves ghost images when dragging (like long-persistence phosphor) FS.js now stores theme preferences per-user in IndexedDB with encrypted backup Fixed Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) Wallpaper slideshow paused when opening settings menu (z-index conflict) Terminal bell sound was too sharp—now filtered through CRT speaker simulation Cursor blink rate wasn’t respecting system accessibility settings Fixed a race condition where desktop icons would momentarily snap to grid on theme change Notes This is a side project of the Retro OS. Download the Retro OS from: https://github.com/mateszko090214/WebOS.git You can try VoidOS Retro live at: https://web-void-os.netlify.app
VoidOS Retro - Changelog [v0.93] - Live Wallpaper & Polish Update Added Custom hand-drawn cursor sprite for authentic retro feel Enhanced desktop styling with border radius and deep box shadow Procedural live wallpaper system (starfield, matrix rain, plasma waves) Enhanced titlebar with pulsing indicators and uppercase text Improved scrollbar styling throughout all applications Retro beveled button styling for windows and menus Live wallpaper toggle in Settings > Display Added Achievements app to the Store (tracks unlocked easter eggs) Enhanced Terminal utilities with additional commands and better history Files app drag-and-drop functionality between folders Settings app with live wallpaper selector Achievement system integration with toast notifications Performance optimizations to rendering loops Fixed Minor alignment issues in titlebar elements Improved persistence layer reliability Fixed occasional flicker in CRT effects during rapid theme changes [v0.92] - Major Retro-Theming Update Added Authentic CRT curvature simulation (using CSS transforms + filters, not canvas) Scanline intensity that dynamically responds to brightness (like real phosphor decay) 4 vintage wallpapers: IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact Terminal support for true CGA/EGA/VGA color palettes with customizable intensity Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash Shutdown animation with realistic power-down surge and fading glow System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips “Degauss” command to Terminal that temporarily warps the display (with recovery animation) Favorite Feature: Retro Inspector DevTool Toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time Performance impact overlay showing frame cost Pure CSS solution keeps effects under 2ms frame cost even on integrated graphics Architecture Tweaks ThemeEngine now accepts spectral power distributions for accurate phosphor emulation Audio.js added noise generators for tape hiss and RF interference WindowManager gained “persistence” option that leaves ghost images when dragging (like long-persistence phosphor) FS.js now stores theme preferences per-user in IndexedDB with encrypted backup Fixed Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) Wallpaper slideshow paused when opening settings menu (z-index conflict) Terminal bell sound was too sharp—now filtered through CRT speaker simulation Cursor blink rate wasn’t respecting system accessibility settings Fixed a race condition where desktop icons would momentarily snap to grid on theme change Notes This is a side project of the Retro OS. Download the Retro OS from: https://github.com/mateszko090214/WebOS.git You can try VoidOS Retro live at: https://web-void-os.netlify.app
VoidOS Retro - Changelog [v0.94] - Video Backgrounds & Boot Enhancements Added Video background live wallpaper options (YouTube embeds) with fallback to procedural starfield Enhanced boot sequence with detailed systemd-like boot logs (Journal Service, udev, etc.) Persistence layer status detection shown in boot logs Enhanced Live wallpaper system to support video modes alongside procedural ones Boot process realism with simulated system initialization Background video fallback to starfield if embed fails to load [v0.93] - Live Wallpaper & Polish Update Added Custom hand-drawn cursor sprite for authentic retro feel Enhanced desktop styling with border radius and deep box shadow Procedural live wallpaper system (starfield, matrix rain, plasma waves) Enhanced titlebar with pulsing indicators and uppercase text Improved scrollbar styling throughout all applications Retro beveled button styling for windows and menus Live wallpaper toggle in Settings > Display Added Achievements app to the Store (tracks unlocked easter eggs) Enhanced Terminal utilities with additional commands and better history Files app drag-and-drop functionality between folders Settings app with live wallpaper selector Achievement system integration with toast notifications Performance optimizations to rendering loops Fixed Minor alignment issues in titlebar elements Improved persistence layer reliability Fixed occasional flicker in CRT effects during rapid theme changes [v0.92] - Major Retro-Theming Update Added Authentic CRT curvature simulation (using CSS transforms + filters, not canvas) Scanline intensity that dynamically responds to brightness (like real phosphor decay) 4 vintage wallpapers: IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact Terminal support for true CGA/EGA/VGA color palettes with customizable intensity Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash Shutdown animation with realistic power-down surge and fading glow System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips “Degauss” command to Terminal that temporarily warps the display (with recovery animation) Favorite Feature: Retro Inspector DevTool Toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time Performance impact overlay showing frame cost Pure CSS solution keeps effects under 2ms frame cost even on integrated graphics Architecture Tweaks ThemeEngine now accepts spectral power distributions for accurate phosphor emulation Audio.js added noise generators for tape hiss and RF interference WindowManager gained “persistence” option that leaves ghost images when dragging (like long-persistence phosphor) FS.js now stores theme preferences per-user in IndexedDB with encrypted backup Fixed Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) Wallpaper slideshow paused when opening settings menu (z-index conflict) Terminal bell sound was too sharp—now filtered through CRT speaker simulation Cursor blink rate wasn’t respecting system accessibility settings Fixed a race condition where desktop icons would momentarily snap to grid on theme change Notes You can try VoidOS Retro live at: https://web-void-os.netlify.app
VoidOS Retro - Changelog [v0.95] Type Description Updated README.md and DEVLOG.md to have a more professional presentation with tables and structured information Enhanced documentation clarity and readability [v0.94] - Video Backgrounds & Boot Enhancements Added Type Description Video background live wallpaper options (YouTube embeds) with fallback to procedural starfield Enhanced boot sequence with detailed systemd-like boot logs (Journal Service, udev, etc.) Persistence layer status detection shown in boot logs Enhanced Type Description Live wallpaper system to support video modes alongside procedural ones Boot process realism with simulated system initialization Background video fallback to starfield if embed fails to load [v0.93] - Live Wallpaper & Polish Update Added Type Description Custom hand-drawn cursor sprite for authentic retro feel Enhanced desktop styling with border radius and deep box shadow Procedural live wallpaper system (starfield, matrix rain, plasma waves) Enhanced titlebar with pulsing indicators and uppercase text Improved scrollbar styling throughout all applications Retro beveled button styling for windows and menus Live wallpaper toggle in Settings > Display Added Achievements app to the Store (tracks unlocked easter eggs) Enhanced Type Description Terminal utilities with additional commands and better history Files app drag-and-drop functionality between folders Settings app with live wallpaper selector Achievement system integration with toast notifications Performance optimizations to rendering loops Fixed Type Description Minor alignment issues in titlebar elements Improved persistence layer reliability Fixed occasional flicker in CRT effects during rapid theme changes [v0.92] - Major Retro-Theming Update Added Type Description Authentic CRT curvature simulation (using CSS transforms + filters, not canvas) Scanline intensity that dynamically responds to brightness (like real phosphor decay) 4 vintage wallpapers IBM green terminal, Apple II monitor, VT100 amber, and RGB composite artifact Terminal support for true CGA/EGA/VGA color palettes with customizable intensity Boot sequence rewritten to mimic POST beeps + memory count + BIOS splash Shutdown animation with realistic power-down surge and fading glow System sounds regenerated using Web Audio API to emulate SN76489 and AY-3-8910 chips “Degauss” command to Terminal that temporarily warps the display (with recovery animation) Favorite Feature: Retro Inspector DevTool Type Description Toggle individual CRT effects (scanlines, curvature, bloom, phosphor bloom, chromatic shift) in real-time Performance impact overlay showing frame cost Pure CSS solution keeps effects under 2ms frame cost even on integrated graphics Architecture Tweaks Type Description ThemeEngine now accepts spectral power distributions for accurate phosphor emulation Audio.js added noise generators for tape hiss and RF interference WindowManager gained “persistence” option that leaves ghost images when dragging (like long-persistence phosphor) FS.js now stores theme preferences per-user in IndexedDB with encrypted backup Fixed Type Description Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) Wallpaper slideshow paused when opening settings menu (z-index conflict) Terminal bell sound was too sharp—now filtered through CRT speaker simulation Cursor blink rate wasn’t respecting system accessibility settings Fixed a race condition where desktop icons would momentarily snap to grid on theme change Notes You can try VoidOS Retro live at: https://web-void-os.netlify.app
VoidOS Retro - Changelog [v2.5.0] - Phosphor Edition Added Type Description Advanced Live Wallpaper System Procedural generation (starfield, matrix rain, plasma waves) with YouTube video backgrounds and intelligent fallback Comprehensive Boot Sequence Detailed systemd-like boot logs showing service initialization, persistence layer status detection Enhanced Visual Effects Authentic CRT curvature simulation, dynamic scanline intensity, chromatic aberration, bloom/glow, phosphor persistence Degauss Command Terminal command that temporarily warps display with recovery animation Retro Inspector DevTool Real-time toggling of individual CRT effects with performance impact overlay 6 Built-in Phosphor Themes Green (classic terminal), Blue, Pink, Purple, White, and custom colors Vintage Wallpaper Collection 4 authentic wallpapers: IBM green terminal, Apple II monitor, VT100 amber, RGB composite artifact ThemeEngine Improvements Accepts spectral power distributions for accurate phosphor emulation True Terminal Color Support CGA/EGA/VGA palettes with customizable intensity System Sound Regeneration Web Audio API emulation of SN76489 and AY-3-8910 chips Enhanced Boot Animation POST beeps + memory count + BIOS splash simulation Realistic Shutdown Sequence Power-down surge with fading glow animation Accessibility Improvements Cursor blink rate respecting system settings, terminal bell filtered through CRT speaker Enhanced Type Description Live Wallpaper System Now supports video modes alongside procedural ones with automatic fallback Boot Process Realism Simulated system initialization with detailed service logging Theme Switching Dynamic theme persistence via IndexedDB Terminal Utilities Additional commands and improved history Desktop Styling Border radius, deep box shadow, enhanced titlebar with pulsing indicators Window Management Persistence option for ghost images when dragging, snap-to-edges functionality Filesystem Virtual FileSystem with persistence via browser storage (falls back to session-only) Application Suite Pre-loaded apps including Terminal, Files, Text Editor, Calculator, Music Player, Notes, Gallery, Store, Weather, Timer, Kanban, Spotlight, Window Switcher Easter Eggs System Konami code (confetti burst), Matrix rain terminal command, Rainbow mode (brand click) Performance Optimizations Rendering loop improvements, pure CSS solutions for effects under 2ms frame cost Settings App Comprehensive customization with live wallpaper selector, theme picker, and system controls Fixed Type Description Theme Color Bleed Purple theme had incorrect green channel bleed (was mixing blue+red instead of proper magenta) UI Layering Wallpaper slideshow paused when opening settings menu (z-index conflict resolved) Terminal Audio Terminal bell sound was too sharp—now filtered through CRT speaker simulation Accessibility Cursor blink rate now respects system accessibility settings Theme Transition Race Fixed condition where desktop icons would momentarily snap to grid on theme change Persistence Reliability Improved persistence layer reliability for cross-session data retention CRT Flicker Fixed occasional flicker in CRT effects during rapid theme changes [v0.96] - Text Editor Enhancement Update Added Type Description Find and Replace Functionality Ctrl+F for find, Ctrl+H for replace with options for single/all occurrences and case-sensitive search Go To Line Navigation Ctrl+G to jump to specific line numbers with input validation Enhanced Syntax Highlighting Added support for JSON and Python languages, improved existing language definitions Current Line Highlighting Visual indicator of cursor line with subtle highlighting Improved Keyboard Shortcuts Integrated find/replace/go-to-line with standard text editor shortcuts Enhanced Type Description Text Editor Application Overall usability and functionality approaching modern code editor standards Developer Experience Enhanced built-in tools for webOS system development and customization
VoidOS Retro - Changelog [v2.7.0] - Hyprland, Gadgets & Sound Added: Hyprland blur + rainbow border, system sounds, power-on gate, redesigned boot & login screens, 8-direction window resize, draggable gadgets (Clock/System/Signal/Sticky Note), touch & pen support, full keyboard accessibility, music shuffle/repeat, drag-and-drop music import, dock magnification, genie window animation, backup export/import, PWA offline support, favicon/meta tags, richer neofetch. Changed: Pointer Events for all drag/resize, consistent hover states app-wide, better Weather/Calendar UI, fixed version number display. Fixed: “Forget Saved Data” did nothing (undefined API), Gallery ignored requested image, unreachable achievement, broken default wallpaper, music/wallpaper detection failing under file:// , silent music playback under file:// , README merge-conflict markers, missing fallback manifest files. [v2.6.0] - Wallpaper & Music Update Added: Photo wallpapers with parallax drift, custom wallpaper upload, labeled thumbnails, bundled music/ folder with auto-detection (GitHub Pages API, directory listing, tracks.txt fallback). Changed: Split single-file app into index.html / style.css / script.js ; default wallpaper now a photo. Fixed: Live wallpaper canvas was hiding photo wallpapers underneath. [v2.5.0] - Phosphor Edition Added: Procedural + video live wallpapers, detailed boot sequence, CRT effects (curvature, scanlines, chromatic aberration, bloom), Degauss command, Retro Inspector devtool, 6 phosphor themes, 4 vintage wallpapers, CGA/EGA/VGA color support, synthesized chip sounds, realistic shutdown sequence, accessibility tweaks. Enhanced: Video live wallpapers, boot realism, theme persistence, terminal commands, window management (snap/ghost), virtual filesystem, full app suite (Terminal, Files, Editor, Calculator, Music, Notes, Gallery, Store, Weather, Timer, Kanban, Spotlight, Switcher), Easter eggs (Konami, Matrix rain, Rainbow mode), performance, Settings app. Fixed: Purple theme color bleed, wallpaper/settings z-index conflict, harsh terminal bell, cursor blink accessibility, theme-change icon snap, persistence reliability, CRT flicker.
updated the z-index in css
Ships:
I built my own web-based OS simulation called VoidOS a complete desktop environment that runs entirely in the browser from a single HTML file, no build tools, no npm, no backend. It’s got draggable, resizable windows, a taskbar, boot/login sequences, and a full suite of over 30 apps: Terminal, Files, Text Editor, Calculator, Music Player, Notes, Gallery, Mail, Calendar, Kanban, Weather, Settings, a few games (Tetris, Pong, Breakout, even a Doom-like FPS), and more. It leans hard into a retro CRT aesthetic scanlines, screen curvature, phosphor glow, chromatic aberration all done with pure CSS so it stays performant. The whole thing is vanilla JavaScript around 3,500 lines, ~85KB, zero dependencies organized into clean logical modules (an event bus, an IndexedDB wrapper, a virtual filesystem, a window manager, etc.) that mimic how a real OS is architected. I’m especially proud of the boot sequence and sound design I used the Web Audio API to synthesize authentic old-chip system sounds instead of using sample files. Being dysgraphic made this project harder than it might look writing and organizing all the code, comments, and documentation takes me a lot more effort and time than it does for most people, so just pushing through devlog after devlog was its own challenge. On the technical side, getting the CRT effects to look authentic without tanking performance was tricky too I ended up building a “Retro Inspector” devtool so I could toggle individual effects and watch the frame-cost impact in real time. Persistence was another hard one: making windows, files, notes, and settings survive a page reload without a backend meant building my own filesystem layer on top of IndexedDB. I also had to track down some nasty bugs along the way, like a memory leak in the music player’s beat interval and a mousemove listener firing on every frame until I throttled it. You can try it live in the browser, no install needed everything (files, notes, settings) is saved locally via IndexedDB, so it’ll persist between visits on the same browser. Try dragging windows around, snapping them to screen edges, opening a few apps from the dock/desktop, and poking around Settings to switch themes and wallpapers. The full source and devlog history are on GitHub if you want to see how it’s built....
|
1792982861.7825305
|
1793069261.7825305
|
|
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....
|
1793094582.882069
|
1793180982.882069
|
|
10074
|
SCP: Containment Protocol by @Serra00 | Stardance
|
Serra00
|
1
|
83.9
|
335
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-18T20:22:35Z", "hours": 82.0, "multiplier": 4.21, "payout": 335, "blessing": "neutral", "text": "Only works by creating a server, at the online mode part and doesnt really work the offline part. Github has a lot of code dumps because I have been creating devlogs in here GAME DOESNT WORK WELL IN LINUX, BUT ITS A PROBLEM WITH THE BUILD FROM UNITY GAME ENGINE, PROBABLY SHADERS TOO, IT WORKS BUT LAGGY, PLEASE TRY ON WINDOWS. This game has reached its mvp playable state, at least on my levels. Network was fixed and everything syncs perfectly now, electricity works well, and building works, not well but works. B", "repo": "https://github.com/Serra110/reactor-breach", "demo": "https://serra110.itch.io/reactor-breach"}]...
|
[{"post_id": 73961, "ts": "202 [{"post_id": 73961, "ts": "2026-09-26T12:24:20Z", "hours": 1.8986, "text": "fixed webgl bugs and unity build bugs"}, {"post_id": 70254, "ts": "2026-09-18T20:14:01Z", "hours": 10.6819, "text": "Only works by creating a server, at the online mode part and doesnt really work the offline part. Github has a lot of code dumps because I have been creating devlogs in hereGAME DOESNT WORK WELL IN LINUX, BUT ITS A PROBLEM WITH THE BUILD FROM UNITY GAME ENGINE, PROBABLY SHADERS TOO, IT WORKS BUT LAGGY, PLEASE TRY ON WINDOWS. This game has reached its mvp playable state, at least on my levels. Network was fixed and everything syncs perfectly now, electricity works well, and building works, not well but works."}, {"post_id": 52368, "ts": "2026-08-22T14:12:28Z", "hours": 9.6375, "text": "Project: Core — Devlog 7 nuclear reactor (peak) REACTOR PHYSICS: built a proper six-factor formula model (K_eff = ε·L_f·ρ·L_th·f·η), i have no idea what this means but i saw it in a doc from the USA department of nuclear power or smth. each factor maps to something the player actually controls: rods affect thermal utilization, coolant affects resonance escape + void coefficient, temperature gives Doppler feedback. K_eff > 1 = supercritical, K_eff < 1 = subcritical. this took like 6 iterations to calibrate and a lot of help from AI cause i dont know nuclear physics. DELAYED NEUTRONS: power doesn’t change instantly when you move the rods. THERMAL CHAIN: power heat core temp steam production steam pressure turbine electrical output. nothing happens instantly. SCRAM & SAFETY: auto-SCRAM at temp ≥ 92%, pressure ≥ 95%, coolant ≤ 5%. meltdown at 98% with an 8s grace period. warning states at 75% temp, 70% pressure, 20% coolant. SCRAM drives rods to full insert at 0.3/s (~3s total). the void coefficient is BWR-positive (whatever this means), lose coolant and reactivity spikes before the SCRAM catches it. CONTROLS: SignalLever and SignalButton (more to come) now use the channel system. bidirectional sync, if the reactor changes a channel (SCRAM pushes rods), the lever position updates to match, or it will just break everything. BUGS:lever was so sensitive you could SCRAM by breathing on it. everyhing works but not that well"}, {"post_id": 46360, "ts": "2026-08-13T15:11:12Z", "hours": 10.3275, "text": "Project: Core — Devlog #6 so heres whats happened since devlog 5: the game has people in it now. kind of. MULTIPLAYER (oh god): threw Mirror in and made everything server authoritative. NETWORK PLAYER: movement runs on the server now. the client just sends “m holding W and shift and looking this way 30 times a second and the server does the actual math. sprint works, gravity works. INTERACTION: pressing E shoots the ray on the server now, with a distance check so you cant magnet-fist ores from across the map. HEALTH: health is a SyncVar with a hook so the bar updates everywhere, theres a kill plane and a respawn that resets the controller and velocity instead of leaving you glitching through the floor. Bug fixes: everyone can see the same world now, which is a big one. same bugs as before, just now they happen in two windows at once . current issues: machines still arent really networked yet, NetworkMachine is just the base drill battery, smelter insides and conveyor stuff are still convinced the game is singleplayer. power grid is basically how much power we say we have instead of a real grid, remote players dont have a visible body, building mode is not networked. whats next: machines actually syncing their insides (battery, smelter in/out), remote players getting real bodies and nametags, networking build mode, and probably the nuclear reactor. this game is starting to feel like a game you could play with a friend, which is either great or terrifying."}, {"post_id": 44029, "ts": "2026-08-09T15:13:14Z", "hours": 9.5672, "text": "#Project: Core — Devlog #5 so heres whats happened since devlog 4: INVENTORY (the MARRIAGE): the old and new inventory system finally live together happily SMELTER: turns out the smelter not working was just the inventory hiding things from it. Fixed tho. BUILD MODE (it did literally nothing): found out buildItems was an empty list, so pressing the build key did absolutely nothing except make me feel stupid, istg it had stuff before also the placement key was set to 1 which was fighting with the hotbar, so its back to B. SAVE SYSTEM: inventory was never being saved because the Inventory manager that was supposed to save disappeared. also fixed machineType on the mini drill so machines dont all respawn as the same drill on load. MINI DRILL (quality of life, battery edition): ~5 minutes of drilling. now it works until the battery dies. the UI also shows name + battery. Bug fixes: Everything works better now, still has the same bugs since the last time tho, less severe but still there. current issues: -machine internal state (battery, smelter input/output) –isnt saved yet — position yes, battery no. -building snap is still mid -cables still dont have a real material whats next: conveyors actually moving items visually, nuclear reactors (3.6 Roentgen), proper build UI instead of scroll wheel, and like the game itself. this game is starting to seem like an indie solo game and not an ugly prefabs spam."}, {"post_id": 41499, "ts": "2026-08-05T19:01:38Z", "hours": 9.8056, "text": "Project: Core — Devlog -4 soo things since devlog 3: POWER SYSTEM (ELECTRIC MAYHEM): we finally got electricity theres now a whole eletric system folder with ports, wires, a diesel engine and a battery. the diesel gen vibrates when its running (hu hum it is 48k triangles tho), ports light up when you look at them and you place actual cables by clicking port to port like a real electrician (no cap) also you hold right click on a port to remove a cable (still scared to add a nuclear reactor with these physics but SOMEDAY). Wires: the wire tool had like 30 compile errors because i was using the XOR operator (^) on gameobjects which apparently is not a thing in C# heheheh. then once it compiled the wires just didnt carry power at all. turns out the generator emits its value ONCE on startup before the wire even exists, and then never emits again because “nothing changed”. fixed it by pushing the value when the connection is made instead of waiting for a change. power flows now (i think). Smelter: the smelter works! put stuff in, timer, different stuff comes out. integrates with conveyors so production chains exist now (theoreticaly) drag and drop between inventory and smelter is still a gamble though. Performance patch: game was lagging near the diesel gen and battery. turns out vibrating a mesh with 19.2k vertices every single frame is expensive. cached materials instead of making new ones every frame and stopped writing transform values that never change. also found a real memory leak: wires were subscribing to ports and never unsubscribing, so every destroyed cable was eating the game forever.Bug fixes (the usual): wire tool now auto-creates its temp wire so you dont have to wire up the wire tool to use the wire tool, null checks on everything because apparently i hate myself. current issues:inventory drag is still 50/50 (better odds than a lot of stuff) still two inventory systems coexisting (im scared that if i delete the old one everything will break so ill just make them get married) building snap is still mid. wires look janky and cables dont have a real material yet. whats next:conveyors actually moving items visually, nuclear reactors (the power system is real now so the threat of chernobyl is real), proper build UI instead of scroll wheel making the drag and drop stop being a crying baby every time i fix one thing two more break, but now the electricity works AND the smelter works so my factory is basically a machine of machines. still eating me alive but its loopable."}, {"post_id": 35388, "ts": "2026-07-26T19:09:42Z", "hours": 10.3497, "text": "Project: Core — Devlog #3 (the “nothing works but also everything works” update) so heres whats happened since devlog 2: -Smelter :finally got a smelter working. You put resources in, it processes them, you get a different resource out. its on a timer and integrates with conveyors so you can actually start automating production chains now, the product doesnt really exist yet tho so… took way longer than it shouldve to make something that just… melts stuff too . -Ore Deposits & Regeneration minerals are no longer infinite free real estate. ore deposits now have a set amount and the drill actually depletes them. BUT they regenerate over time so the factory doesnt just die. also made an ore spawner that respawns ores when they get collected so the map doesnt end up empty ( dont have a map yet tho 😭 ) -Inventory Rework (pain) this was the big one. went through like 3 different versions of the inventory system. right now it has: items (ItemSO), Slot UI with drag and dropHotbar (keys 1-9), Toggle with TAB key . honestly the drag and drop is still a bit buggy but it works. the old inventory manager is still there in the background because the save system depends on it and im not touching that yet (maybe never i might just hide the ugly UI and update the old inventory items with the old one) Bug Fixes (the usual): drills spawning in the air instead of on the ground (TRIED fixing but didnt work), storage containers being clickable from across the map (added distance check), ghost buildings having memory leaks from duplicate materials (cached them). its actually starting to feel like a factory game tho :D current issues: inventory drag is 50/50 on whether it decides to cooperate (Gamble 🤑) still two inventory systems coexisting which is terrifying ( inventoryfobia) building snap is still mid ( to be generous) whats next: -conveyors actually moving items visually. -power system (nuclear reactors incoming someday) -proper build UI instead of scroll wheel -getting the inventory to stop being a crying baby. this project is eating me alive daily. every time i fix one thing two more break. but the gameplay loop is actually loopable now so thats something :D"}, {"post_id": 25570, "ts": "2026-07-09T22:05:25Z", "hours": 10.7139, "text": "Project: Core — Devlog #2 (The game finally remembers things.) Since the last devlog, I’ve been focusing less on adding random features and more on building the systems that will actually make the game playable in the long run. What’s New: -Saving & Loading One of the biggest additions is a proper save system. The game now saves: Player position Player rotation Inventory/resources Machines Closing the game no longer means starting from scratch, which is a huge step towards making the game feel like an actual factory game. Main Menu & Game Flow Added: Splah Screen (unity provides it) Main Menu New Game Continue (loads your save) Quit button The inventory system has been reworked and is now integrated with the save system. Resources are properly stored and restored when loading a save, making progression persistent. Mining Drill Improvements The drill animation has been completely redone, and the models aswell: Lowers into the ground. Starts spinning after reaching the surface. Continues drilling while slowly pushing deeper into the ground. (there is also another drill that is limited and another one ilimited) It’s a small detail, but it makes the machine feel much more believable. #General Improvements: Lots of bug fixes. ( now there is only like 14 of them) Cleaner project structure. Better organization of scripts and gameobjects. More preparation for future automation systems. #Current Progress Current gameplay looks something like this: Collect resources, Build machines,Save your progress,Continue expanding your factory The gameplay loop is slowly starting to feel complete, although there’s still a lot to add. What’s Next? turning this from a collection of systems into an actual game. Planned features include: -Resource deposits -Power generation ( YES NUCLEAR REACTORS TOO 🔥) -Factory progression -Better UI ( at least try) -Objectives, quotas and tutorial. -More machines ai workers (bots maybe not ai since i dont want it to be cpu consuming) -Multiplayer (later in development) Current Challenges The biggest challenge isn’t adding features anymore. It’s making all the different systems work together without breaking everything else. Every new feature somehow manages to create two new bugs, which is basically what i am programmed to do atp Overall, I’m really happy with the progress."}, {"post_id": 20350, "ts": "2026-07-01T22:35:06Z", "hours": 9.7589, "text": "Nuclear Factory ChaosDevlog #1 (The first devlog that actually counts) I chose to make this game on unity. What I’ve Done So Far: Player Systems: FPS Movement Frst Person Camera Sprinting Footstep Sounds (running only because of bug) Pause Menu (ESC) Head Bob System (this was a huge pain) Crosshair Interaction: Interaction System (E) Center Raycast System (or whatever the name of this might be) Resources: Collectable Ores Ore Spawner Inventory Manager Inventory UI (simple and ugly for now) Building System: Build Mode (B) Building Rotation (R) Scroll Wheel Building Selection ( only until i make a UI for it) Ghost Buildings Grid Placement System Build Costs Automation: First Mining Drill Automatic Resource Production The player now has a fully functional FPS controller, which is a bit buggy rn but works. Building is the most interactive and important part of the project so far, i made building simple while still feeling satisfying to do it. Resources are now required to construct buildings, creating the first real gameplay loop and there is also a mining drill so we can start automating the process. Current Issues & Bugs Like every Unity project, there are a few problems that still need to be solved. This is way harder than i thought and making a game even if its simple is very time consuming and hard, needing to fix bugs every minute. Overall, I think the project is progressing well, and the core gameplay loop is finally starting to come together. (yes thats a house dont mind the quality, currently it doesnt snap well to other parts)"}, {"post_id": 3678, "ts": "2026-06-06T18:45:15Z", "hours": 0.8994, "text": "Made a scene to set up building and character movement, I used a package for the Person Controller since it works very well, made some adjustements to it tho since it had a few bugs and unnecesary stuff."}]...
|
Title: SCP: Containment Protocol by @Serra00 | Sta Title: SCP: Containment Protocol by @Serra00 | Stardance
Devlogs:
Made a scene to set up building and character movement, I used a package for the Person Controller since it works very well, made some adjustements to it tho since it had a few bugs and unnecesary stuff.
Nuclear Factory ChaosDevlog #1 (The first devlog that actually counts) I chose to make this game on unity. What I’ve Done So Far: Player Systems: FPS Movement Frst Person Camera Sprinting Footstep Sounds (running only because of bug) Pause Menu (ESC) Head Bob System (this was a huge pain) Crosshair Interaction: Interaction System (E) Center Raycast System (or whatever the name of this might be) Resources: Collectable Ores Ore Spawner Inventory Manager Inventory UI (simple and ugly for now) Building System: Build Mode (B) Building Rotation (R) Scroll Wheel Building Selection ( only until i make a UI for it) Ghost Buildings Grid Placement System Build Costs Automation: First Mining Drill Automatic Resource Production The player now has a fully functional FPS controller, which is a bit buggy rn but works. Building is the most interactive and important part of the project so far, i made building simple while still feeling satisfying to do it. Resources are now required to construct buildings, creating the first real gameplay loop and there is also a mining drill so we can start automating the process. Current Issues & Bugs Like every Unity project, there are a few problems that still need to be solved. This is way harder than i thought and making a game even if its simple is very time consuming and hard, needing to fix bugs every minute. Overall, I think the project is progressing well, and the core gameplay loop is finally starting to come together. (yes thats a house dont mind the quality, currently it doesnt snap well to other parts)
Project: Core — Devlog #2 (The game finally remembers things.) Since the last devlog, I’ve been focusing less on adding random features and more on building the systems that will actually make the game playable in the long run. What’s New: -Saving & Loading One of the biggest additions is a proper save system. The game now saves: Player position Player rotation Inventory/resources Machines Closing the game no longer means starting from scratch, which is a huge step towards making the game feel like an actual factory game. Main Menu & Game Flow Added: Splah Screen (unity provides it) Main Menu New Game Continue (loads your save) Quit button The inventory system has been reworked and is now integrated with the save system. Resources are properly stored and restored when loading a save, making progression persistent. Mining Drill Improvements The drill animation has been completely redone, and the models aswell: Lowers into the ground. Starts spinning after reaching the surface. Continues drilling while slowly pushing deeper into the ground. (there is also another drill that is limited and another one ilimited) It’s a small detail, but it makes the machine feel much more believable. #General Improvements: Lots of bug fixes. ( now there is only like 14 of them) Cleaner project structure. Better organization of scripts and gameobjects. More preparation for future automation systems. #Current Progress Current gameplay looks something like this: Collect resources, Build machines,Save your progress,Continue expanding your factory The gameplay loop is slowly starting to feel complete, although there’s still a lot to add. What’s Next? turning this from a collection of systems into an actual game. Planned features include: -Resource deposits -Power generation ( YES NUCLEAR REACTORS TOO 🔥) -Factory progression -Better UI ( at least try) -Objectives, quotas and tutorial. -More machines ai workers (bots maybe not ai since i dont want it to be cpu consuming) -Multiplayer (later in development) Current Challenges The biggest challenge isn’t adding features anymore. It’s making all the different systems work together without breaking everything else. Every new feature somehow manages to create two new bugs, which is basically what i am programmed to do atp Overall, I’m really happy with the progress.
Project: Core — Devlog #3 (the “nothing works but also everything works” update) so heres whats happened since devlog 2: -Smelter :finally got a smelter working. You put resources in, it processes them, you get a different resource out. its on a timer and integrates with conveyors so you can actually start automating production chains now, the product doesnt really exist yet tho so… took way longer than it shouldve to make something that just… melts stuff too . -Ore Deposits & Regeneration minerals are no longer infinite free real estate. ore deposits now have a set amount and the drill actually depletes them. BUT they regenerate over time so the factory doesnt just die. also made an ore spawner that respawns ores when they get collected so the map doesnt end up empty ( dont have a map yet tho 😭 ) -Inventory Rework (pain) this was the big one. went through like 3 different versions of the inventory system. right now it has: items (ItemSO), Slot UI with drag and dropHotbar (keys 1-9), Toggle with TAB key . honestly the drag and drop is still a bit buggy but it works. the old inventory manager is still there in the background because the save system depends on it and im not touching that yet (maybe never i might just hide the ugly UI and update the old inventory items with the old one) Bug Fixes (the usual): drills spawning in the air instead of on the ground (TRIED fixing but didnt work), storage containers being clickable from across the map (added distance check), ghost buildings having memory leaks from duplicate materials (cached them). its actually starting to feel like a factory game tho :D current issues: inventory drag is 50/50 on whether it decides to cooperate (Gamble 🤑) still two inventory systems coexisting which is terrifying ( inventoryfobia) building snap is still mid ( to be generous) whats next: -conveyors actually moving items visually. -power system (nuclear reactors incoming someday) -proper build UI instead of scroll wheel -getting the inventory to stop being a crying baby. this project is eating me alive daily. every time i fix one thing two more break. but the gameplay loop is actually loopable now so thats something :D
Project: Core — Devlog -4 soo things since devlog 3: POWER SYSTEM (ELECTRIC MAYHEM): we finally got electricity theres now a whole eletric system folder with ports, wires, a diesel engine and a battery. the diesel gen vibrates when its running (hu hum it is 48k triangles tho), ports light up when you look at them and you place actual cables by clicking port to port like a real electrician (no cap) also you hold right click on a port to remove a cable (still scared to add a nuclear reactor with these physics but SOMEDAY). Wires: the wire tool had like 30 compile errors because i was using the XOR operator (^) on gameobjects which apparently is not a thing in C# heheheh. then once it compiled the wires just didnt carry power at all. turns out the generator emits its value ONCE on startup before the wire even exists, and then never emits again because “nothing changed”. fixed it by pushing the value when the connection is made instead of waiting for a change. power flows now (i think). Smelter: the smelter works! put stuff in, timer, different stuff comes out. integrates with conveyors so production chains exist now (theoreticaly) drag and drop between inventory and smelter is still a gamble though. Performance patch: game was lagging near the diesel gen and battery. turns out vibrating a mesh with 19.2k vertices every single frame is expensive. cached materials instead of making new ones every frame and stopped writing transform values that never change. also found a real memory leak: wires were subscribing to ports and never unsubscribing, so every destroyed cable was eating the game forever.Bug fixes (the usual): wire tool now auto-creates its temp wire so you dont have to wire up the wire tool to use the wire tool, null checks on everything because apparently i hate myself. current issues:inventory drag is still 50/50 (better odds than a lot of stuff) still two inventory systems coexisting (im scared that if i delete the old one everything will break so ill just make them get married) building snap is still mid. wires look janky and cables dont have a real material yet. whats next:conveyors actually moving items visually, nuclear reactors (the power system is real now so the threat of chernobyl is real), proper build UI instead of scroll wheel making the drag and drop stop being a crying baby every time i fix one thing two more break, but now the electricity works AND the smelter works so my factory is basically a machine of machines. still eating me alive but its loopable.
#Project: Core — Devlog #5 so heres whats happened since devlog 4: INVENTORY (the MARRIAGE): the old and new inventory system finally live together happily SMELTER: turns out the smelter not working was just the inventory hiding things from it. Fixed tho. BUILD MODE (it did literally nothing): found out buildItems was an empty list, so pressing the build key did absolutely nothing except make me feel stupid, istg it had stuff before also the placement key was set to 1 which was fighting with the hotbar, so its back to B. SAVE SYSTEM: inventory was never being saved because the Inventory manager that was supposed to save disappeared. also fixed machineType on the mini drill so machines dont all respawn as the same drill on load. MINI DRILL (quality of life, battery edition): ~5 minutes of drilling. now it works until the battery dies. the UI also shows name + battery. Bug fixes: Everything works better now, still has the same bugs since the last time tho, less severe but still there. current issues: -machine internal state (battery, smelter input/output) –isnt saved yet — position yes, battery no. -building snap is still mid -cables still dont have a real material whats next: conveyors actually moving items visually, nuclear reactors (3.6 Roentgen), proper build UI instead of scroll wheel, and like the game itself. this game is starting to seem like an indie solo game and not an ugly prefabs spam.
Project: Core — Devlog #6 so heres whats happened since devlog 5: the game has people in it now. kind of. MULTIPLAYER (oh god): threw Mirror in and made everything server authoritative. NETWORK PLAYER: movement runs on the server now. the client just sends “m holding W and shift and looking this way 30 times a second and the server does the actual math. sprint works, gravity works. INTERACTION: pressing E shoots the ray on the server now, with a distance check so you cant magnet-fist ores from across the map. HEALTH: health is a SyncVar with a hook so the bar updates everywhere, theres a kill plane and a respawn that resets the controller and velocity instead of leaving you glitching through the floor. Bug fixes: everyone can see the same world now, which is a big one. same bugs as before, just now they happen in two windows at once . current issues: machines still arent really networked yet, NetworkMachine is just the base drill battery, smelter insides and conveyor stuff are still convinced the game is singleplayer. power grid is basically how much power we say we have instead of a real grid, remote players dont have a visible body, building mode is not networked. whats next: machines actually syncing their insides (battery, smelter in/out), remote players getting real bodies and nametags, networking build mode, and probably the nuclear reactor. this game is starting to feel like a game you could play with a friend, which is either great or terrifying.
Project: Core — Devlog 7 nuclear reactor (peak) REACTOR PHYSICS: built a proper six-factor formula model (K_eff = ε·L_f·ρ·L_th·f·η), i have no idea what this means but i saw it in a doc from the USA department of nuclear power or smth. each factor maps to something the player actually controls: rods affect thermal utilization, coolant affects resonance escape + void coefficient, temperature gives Doppler feedback. K_eff > 1 = supercritical, K_eff < 1 = subcritical. this took like 6 iterations to calibrate and a lot of help from AI cause i dont know nuclear physics. DELAYED NEUTRONS: power doesn’t change instantly when you move the rods. THERMAL CHAIN: power heat core temp steam production steam pressure turbine electrical output. nothing happens instantly. SCRAM & SAFETY: auto-SCRAM at temp ≥ 92%, pressure ≥ 95%, coolant ≤ 5%. meltdown at 98% with an 8s grace period. warning states at 75% temp, 70% pressure, 20% coolant. SCRAM drives rods to full insert at 0.3/s (~3s total). the void coefficient is BWR-positive (whatever this means), lose coolant and reactivity spikes before the SCRAM catches it. CONTROLS: SignalLever and SignalButton (more to come) now use the channel system. bidirectional sync, if the reactor changes a channel (SCRAM pushes rods), the lever position updates to match, or it will just break everything. BUGS:lever was so sensitive you could SCRAM by breathing on it. everyhing works but not that well
Only works by creating a server, at the online mode part and doesnt really work the offline part. Github has a lot of code dumps because I have been creating devlogs in hereGAME DOESNT WORK WELL IN LINUX, BUT ITS A PROBLEM WITH THE BUILD FROM UNITY GAME ENGINE, PROBABLY SHADERS TOO, IT WORKS BUT LAGGY, PLEASE TRY ON WINDOWS. This game has reached its mvp playable state, at least on my levels. Network was fixed and everything syncs perfectly now, electricity works well, and building works, not well but works.
fixed webgl bugs and unity build bugs
Ships:
Only works by creating a server, at the online mode part and doesnt really work the offline part. Github has a lot of code dumps because I have been creating devlogs in here GAME DOESNT WORK WELL IN LINUX, BUT ITS A PROBLEM WITH THE BUILD FROM UNITY GAME ENGINE, PROBABLY SHADERS TOO, IT WORKS BUT LAGGY, PLEASE TRY ON WINDOWS. This game has reached its mvp playable state, at least on my levels. Network was fixed and everything syncs perfectly now, electricity works well, and building works, not well but works. B...
|
1793004718.5396101
|
1793091118.5396101
|
|
2523
|
druid game by @vin | Stardance
|
vin
|
0
|
83.51
|
0
|
[]
|
[{"post_id": 80520, "ts": "202 [{"post_id": 80520, "ts": "2026-10-18T00:41:45Z", "hours": 12.1581, "text": "DevLog 6 Sound effects have finally been added, with a few new boss moves. Sound effects: Sound effects for moves and basic attacks has been added! From the Nature Spirit’s moveset to the Bears it all now has sound so you can have other indicators besides visual to know you hit your target. New moves: The deer and wind spirit both have new moves! The deer has ‘Radiance’ where a light shines from it’s horns before turning into arrows and attacking the player, and ‘Prance’ where it powerfully prances in a direction. The wind spirit has one new move called ‘Wind Shockwave’ that knocks back entities while anchoring the player in place. I know that there is not as much content in this devlog as the others due to me having to debug old code, but I will assure you all that the next devlog will have more good stuff in it. Thank you for reading my devlog 👍"}, {"post_id": 75989, "ts": "2026-10-01T21:28:55Z", "hours": 11.7067, "text": "DevLog 5 I made may big additions to the game, Including a new background, more Qol GUI, a new enemy, and finally the two spirit boss fights. New background: I believed the previous background to be a little(lot) less than perfect. To make the background look better I added more trees and bushes so it looks like an actual forest and not a plain with a few trees. Qol GUI: Beforehand, there was nowhere to know if your cool-downs for your moves were on or not, to fix that I added a GUI to display if they were off or on. I also made a decaying animation for the health but it is a bit small of a tweak to call an update. New enemy: A new enemy, the wolf cavalry has been created, it attacks while rushing towards the player swiping upwards, and not stopping even if it gets hit. Since the wolf cavalry is so fast that it is practically impossible to get it into a combo, they only appear in later waves (The first video where it was in wave 1 was a test, it will not be there in the future) Boss fights: Both the Deer and the Bear have their own boss fights now! One of the bosses are randomly selected at wave 5 and, after they are killed, gives you their abilities. The Bear is tanky, but slow, and the Deer is fast, but weak. I will likely add a new attack for both the Deer and the Wolf cavalry, as the both only have one attack for now. I also am going to work on adding the leveling system and combo tracker, so the player doesn’t unlock all of the abilities from the spirits right away. After all of that, I will likely make a final boss for this stage which will be on wave 10. Thank you for reading my devlog"}, {"post_id": 61209, "ts": "2026-09-04T01:08:28Z", "hours": 12.6017, "text": "DevLog 4 There are a few new additions and tweaks that I have made to the game, I added a new enemy as well as revamped a old attack I am finally putting the game loop together, it is going to be a wave game, each wave new enemies are spawned and they get more difficult. And am planning to add a leveling system so when the player gets a good combo streak, that much experience is rewarded. Each time the player levels up a new move for their spirits are unlocked. The new enemy: Goblin archer The goblin archer is a ranged unit that attacks under the protection of the thief goblins. (I am still working on the shooting spritesheet so it has the same animation as the thief’s ‘slash’ in the video) While having less health and speed than the thief goblin, it is able to catch you off guard if you are not paying attention to it. Attack glowup The wind blade attack from the Nature spirit looked lackluster so I made it bigger and more wind-like I guess. That is basically all besides a few tweaks here and there, as a mentioned I will be working towards a leveling system towards the next update and possibly adding new attacks. Thank you for reading my devlog! :)))))"}, {"post_id": 38477, "ts": "2026-07-31T21:35:29Z", "hours": 10.9681, "text": "DevLog 3 There are a lot more changes small and big I made for this devlog including a new enemy as well as revamps for both the player’s sprite sheets and the Bear spirit’s swipe ability. New enemy - Goblin Thief This new enemy, while having a smaller hit-box than the player, the Goblin is also faster but doesn’t have much health. The Goblin only has one attack for now, which is it’s slash. New Spirit A new spirit called the ‘Nature spirit’ has been added, with two abilities for now which are a gust to pull the enemy in and a Wind blade to attack. The gust, while doing only a small bit of damage is very useful for extending a combo, and the Wind blade is for the player to keep distance between the enemy and the player. Small note about the bear spirit’s swipe The swipe is now remade and actually looks like a swipe and not a blob.👍 New player look and dash ability The player was remade and given a new haircut (because the past one was terrible) and a smoother walking animation. The player was also given the ability to dash, having a few moments of invincibility. The player is given two dashes that recover over time. Stunning a entity enemies (and the player) can now be stunned. After taking a hit, the entity who received it will be stunned for half a second, after it takes more than 3 hits, it will be stunned until it touches the ground and waits two seconds That is all the stuff I added so far, next update I will likely add more Gui to display cooldowns on moves as well as dashes. I will also likely add a new enemy that keeps its distance while attacking the player. Thank you for reading my Devlog! (ps I fixed the gifs from the last devlog because they didn’t work for some reason)"}, {"post_id": 29024, "ts": "2026-07-15T17:51:58Z", "hours": 12.1228, "text": "Devlog 2 There have been a few changes Ive made in the past week One major change is that there is another attack for the bear. The attack is a slam that takes a lot of time to ready but has a large hit-box and high knockback. I have also added attacking to the dummy, as well as projectiles. I apologize if this devlog was a bit too little, I was going crazy trying to figure out how to implement the enemy attacking without trying to use guides on Youtube. For the next devlog, I plan on remaking the existing bear swipe and adding another spirit along with an new enemy and better player animations. Thank you for reading my devlog!"}, {"post_id": 21049, "ts": "2026-07-02T20:32:59Z", "hours": 23.9558, "text": "Devlog 1"}]...
|
Title: druid game by @vin | Stardance
Devlogs:
De Title: druid game by @vin | Stardance
Devlogs:
Devlog 1
Devlog 2 There have been a few changes Ive made in the past week One major change is that there is another attack for the bear. The attack is a slam that takes a lot of time to ready but has a large hit-box and high knockback. I have also added attacking to the dummy, as well as projectiles. I apologize if this devlog was a bit too little, I was going crazy trying to figure out how to implement the enemy attacking without trying to use guides on Youtube. For the next devlog, I plan on remaking the existing bear swipe and adding another spirit along with an new enemy and better player animations. Thank you for reading my devlog!
DevLog 3 There are a lot more changes small and big I made for this devlog including a new enemy as well as revamps for both the player’s sprite sheets and the Bear spirit’s swipe ability. New enemy - Goblin Thief This new enemy, while having a smaller hit-box than the player, the Goblin is also faster but doesn’t have much health. The Goblin only has one attack for now, which is it’s slash. New Spirit A new spirit called the ‘Nature spirit’ has been added, with two abilities for now which are a gust to pull the enemy in and a Wind blade to attack. The gust, while doing only a small bit of damage is very useful for extending a combo, and the Wind blade is for the player to keep distance between the enemy and the player. Small note about the bear spirit’s swipe The swipe is now remade and actually looks like a swipe and not a blob.👍 New player look and dash ability The player was remade and given a new haircut (because the past one was terrible) and a smoother walking animation. The player was also given the ability to dash, having a few moments of invincibility. The player is given two dashes that recover over time. Stunning a entity enemies (and the player) can now be stunned. After taking a hit, the entity who received it will be stunned for half a second, after it takes more than 3 hits, it will be stunned until it touches the ground and waits two seconds That is all the stuff I added so far, next update I will likely add more Gui to display cooldowns on moves as well as dashes. I will also likely add a new enemy that keeps its distance while attacking the player. Thank you for reading my Devlog! (ps I fixed the gifs from the last devlog because they didn’t work for some reason)
DevLog 4 There are a few new additions and tweaks that I have made to the game, I added a new enemy as well as revamped a old attack I am finally putting the game loop together, it is going to be a wave game, each wave new enemies are spawned and they get more difficult. And am planning to add a leveling system so when the player gets a good combo streak, that much experience is rewarded. Each time the player levels up a new move for their spirits are unlocked. The new enemy: Goblin archer The goblin archer is a ranged unit that attacks under the protection of the thief goblins. (I am still working on the shooting spritesheet so it has the same animation as the thief’s ‘slash’ in the video) While having less health and speed than the thief goblin, it is able to catch you off guard if you are not paying attention to it. Attack glowup The wind blade attack from the Nature spirit looked lackluster so I made it bigger and more wind-like I guess. That is basically all besides a few tweaks here and there, as a mentioned I will be working towards a leveling system towards the next update and possibly adding new attacks. Thank you for reading my devlog! :)))))
DevLog 5 I made may big additions to the game, Including a new background, more Qol GUI, a new enemy, and finally the two spirit boss fights. New background: I believed the previous background to be a little(lot) less than perfect. To make the background look better I added more trees and bushes so it looks like an actual forest and not a plain with a few trees. Qol GUI: Beforehand, there was nowhere to know if your cool-downs for your moves were on or not, to fix that I added a GUI to display if they were off or on. I also made a decaying animation for the health but it is a bit small of a tweak to call an update. New enemy: A new enemy, the wolf cavalry has been created, it attacks while rushing towards the player swiping upwards, and not stopping even if it gets hit. Since the wolf cavalry is so fast that it is practically impossible to get it into a combo, they only appear in later waves (The first video where it was in wave 1 was a test, it will not be there in the future) Boss fights: Both the Deer and the Bear have their own boss fights now! One of the bosses are randomly selected at wave 5 and, after they are killed, gives you their abilities. The Bear is tanky, but slow, and the Deer is fast, but weak. I will likely add a new attack for both the Deer and the Wolf cavalry, as the both only have one attack for now. I also am going to work on adding the leveling system and combo tracker, so the player doesn’t unlock all of the abilities from the spirits right away. After all of that, I will likely make a final boss for this stage which will be on wave 10. Thank you for reading my devlog
DevLog 6 Sound effects have finally been added, with a few new boss moves. Sound effects: Sound effects for moves and basic attacks has been added! From the Nature Spirit’s moveset to the Bears it all now has sound so you can have other indicators besides visual to know you hit your target. New moves: The deer and wind spirit both have new moves! The deer has ‘Radiance’ where a light shines from it’s horns before turning into arrows and attacking the player, and ‘Prance’ where it powerfully prances in a direction. The wind spirit has one new move called ‘Wind Shockwave’ that knocks back entities while anchoring the player in place. I know that there is not as much content in this devlog as the others due to me having to debug old code, but I will assure you all that the next devlog will have more good stuff in it. Thank you for reading my devlog 👍...
|
1792568901.8198957
|
1793173701.8198957
|
|
29376
|
Flipper Echo by @GreatJoel | Stardance
|
GreatJoel
|
0
|
83.46
|
0
|
[]
|
[{"post_id": 80153, "ts": "202 [{"post_id": 80153, "ts": "2026-10-16T13:01:46Z", "hours": 5.4058, "text": "i worked on the ui and setuped the wifi AP and STA. also added a password feature so it can connect easily and its own. other side i annded the scan so it can scan live all the wifi around it."}, {"post_id": 76143, "ts": "2026-10-02T14:17:37Z", "hours": 19.2397, "text": "right now i ahve worked for like the ui stuff. and from here i had added few more updates to the device hardware.. like vibrations when button click an indication led also added a tansisitor for the led display so its led bakclight can be controlled using the gpio in the supermini. here i also added a update over the wifi.. since it doesnt have any keyboard. i added a qr scanner which can scan to any wifi network and connect its own.. it can save the network and use when ever it avalable."}, {"post_id": 71595, "ts": "2026-09-21T03:51:21Z", "hours": 58.8139, "text": "now i have added teo esp board one for the streaming and one for displaying it in the display beacuse the esp32 cam wont able to get sdcard and tft streaming at same time it doesnt gpios the one i am useing here is esp32 devboard and esp32cam,, ESP32 cam captures the live video frame fromthe OV3660 camera sensor at 160x128 (tft resolution) with JPEG auality 18 fragments, each frame is 244byte with espnow packerts and transmit them to esp32 dev bored. the esp32 borad reassembles the packets to compelete JEPG frame it decodes using TJpgDec into 160x128, rigthn now i have only working in the firmware i have made my own firmware it works but have some issue since it suing wifi to transmit th packet to i tried ot make the use softAP to connect esp each so less packets will lose, when the fps drops or packers fails to reach i will ahve to adjuest the STREAM_QUAITY also the cmaera supports the Mirror effect making it much more alive. i have made a prototype"}]...
|
Title: Flipper Echo by @GreatJoel | Stardance
Dev Title: Flipper Echo by @GreatJoel | Stardance
Devlogs:
now i have added teo esp board one for the streaming and one for displaying it in the display beacuse the esp32 cam wont able to get sdcard and tft streaming at same time it doesnt gpios the one i am useing here is esp32 devboard and esp32cam,, ESP32 cam captures the live video frame fromthe OV3660 camera sensor at 160x128 (tft resolution) with JPEG auality 18 fragments, each frame is 244byte with espnow packerts and transmit them to esp32 dev bored. the esp32 borad reassembles the packets to compelete JEPG frame it decodes using TJpgDec into 160x128, rigthn now i have only working in the firmware i have made my own firmware it works but have some issue since it suing wifi to transmit th packet to i tried ot make the use softAP to connect esp each so less packets will lose, when the fps drops or packers fails to reach i will ahve to adjuest the STREAM_QUAITY also the cmaera supports the Mirror effect making it much more alive. i have made a prototype
right now i ahve worked for like the ui stuff. and from here i had added few more updates to the device hardware.. like vibrations when button click an indication led also added a tansisitor for the led display so its led bakclight can be controlled using the gpio in the supermini. here i also added a update over the wifi.. since it doesnt have any keyboard. i added a qr scanner which can scan to any wifi network and connect its own.. it can save the network and use when ever it avalable.
i worked on the ui and setuped the wifi AP and STA. also added a password feature so it can connect easily and its own. other side i annded the scan so it can scan live all the wifi around it....
|
1792684067.1951468
|
1793288867.1951468
|
|
16473
|
Chill Record Player by @miles_s_aguilar | Stardanc Chill Record Player by @miles_s_aguilar | Stardance...
|
|
2
|
83.25
|
623
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-08T18:29:14Z", "hours": 30.0, "multiplier": 19.74, "payout": 466, "blessing": "neutral", "text": "I made a website for playing vinyls! I think an important aspect of enjoying music is being able to experience it physically, through interacting personally with the forms it comes in. Now obviously, this record player is online, so I did my best to bring that physical experience into a virtual website. Hopefully everything is self-explanatory on the site, and I incorperated a lot of feedback from the first round!! In the future, I plan to make this a standalone app, giving people the ability to upload their own music. Also, I’ll try to fix performance issues as I understand this website can be a bit resource-itensive.", "repo": "https://github.com/stackofdoggos/Chill-Music-Player", "demo": "https://milesaguilar.com/music/"}, {"ship_num": 2, "ts": "2026-06-21T07:05:21Z", "hours": 10.0, "multiplier": 16.59, "payout": 157, "blessing": "neutral", "text": "Hey everyone, I made a 3D vinyl player online to play classical music. Please try it!!! It’s fully hosted on my personal website at https://milesaguilar.com/music One of the most challenging aspects of this project was making everything feel as tactile as possible. To do this, I needed to balance realism with how annoying things would be to use. To this end, I spent a lot of time thinking about which controls were most intuitive. In the future, I plan to let people upload their own vinyls and have more furniture in the room. This is mostly just a proof of concept to see if people find this interesting", "repo": "https://github.com/stackofdoggos/Chill-Music-Player", "demo": "https://milesaguilar.com/music/"}]...
|
[{"post_id": 39588, "ts": "202 [{"post_id": 39588, "ts": "2026-08-02T17:44:39Z", "hours": 8.6531, "text": "Devlog #12: Chill Record Player I think the video I attatched was too large so I’m now rewriting this devlog ;-; Anyways, I’ve spent the last week implementing the Yandhi intro as I mentioned last devlog/product idea. I spent a ton of time modelling/keyframing it in Blender, then integrating it with the website to infinitely loop, then dissasemble the vinyl when a user enters the website. What took the longest was definitely the smooth yet neat transition where the inside of the record turns into the room, so please check it out!! PS caustics take foreverrrr to render…"}, {"post_id": 35320, "ts": "2026-07-26T17:17:22Z", "hours": 0.3014, "text": "CONCEPT: Loading Screen Hey all! This isn’t gonna be a normal devlog, but rather a quick update on something I’ll be hoping to add to the app. I’ve been tossing around a couple loading screen ideas but I think I have a really cool one. I want to mimic the Yandhi opening where an exploded view of a CD comes together and begins to spin. I think I can recreate that with my record player (or maybe just one vinyl, although that would be boring-ish?) Since this animation is a little long, I’ll probably only have it play when the user hasn’t logged on in awhile or something."}, {"post_id": 35076, "ts": "2026-07-26T08:21:15Z", "hours": 8.665, "text": "Devlog #11: Chill Record Player Spent all day adding a new table, and then using TypeScript to change the texture on it. I’m a bit worried about how I’m dividing the texturing between Blender and ts, as I have no rhyme or reason right now between which textures I delegate to which platform. Usually, the procedurally-generated textures are loaded in ts though. I also smoothed the grain on the bookshelf. The rug looks bad so I’ll work on that next, and then prepare the website for a MacOS app and implement more of the features I talked about in Devlog #9!!"}, {"post_id": 33809, "ts": "2026-07-24T01:31:18Z", "hours": 7.1611, "text": "Devlog #10: Chill Record Player Made a much more simplified loading screen and recorded some sound effects. Truthfully, I haven’t had that much time to work on the website. AND, I wasn’t able to export my original idea for a loading screen without a watermark. I’m gonna try and make something better than this…"}, {"post_id": 27539, "ts": "2026-07-13T06:03:22Z", "hours": 1.7986, "text": "Devlog #9: Chill Record Player A little hard to tell, but I updated the model of the bookshelf to be more visually interesting (extended the rails and added a metal base) and I also re-UV-unwrapped the bookshelf so the wood texture looks less stretched. I think I’m going to try and code something that blurs the texture a little though as the black parts are a little too dark for my taste. I was also thinking of adding this really cool animation I saw (see below) on Twitter to my loading screen, so keep an eye out for that!"}, {"post_id": 26712, "ts": "2026-07-11T17:41:40Z", "hours": 10.0772, "text": "Devlog #8: Chill Record Player I implemented more major performance enhancements, specifically aimed at increasing performance on retinal displays. Since retinal displays have so many pixels, computers bundle individual pixels together into logical pixels. The ratio at which this happens is called DPR. A higher DPR means sharper images but lower performance. I capped the DPR at 2x on “High”. Other changes were: Capped FPS at 60 -> 45 Added performance benchmarking to determine optimal settings for device Brought back temporal blur post-fx scan with extra leeway gained by reducing FPS Made “reflections on” default behavior Pushed more work to the loading screen Further performance changes planned before standalone app release Seeing if there’s a way to smush the 8x post-fx render stack into fewer passes Decimating more geometry Further ideas planned before app release: MAJOR: Letting user add more music MAJOR: Letting user add own props MAJOR: Tutorial/more tooltips MAJOR: Fixing flip animations upon un-focusing MAJOR: Adding zoom view to baskets MAJOR: Fixing audio bug between tracks (hard to pin down and test fixes, I’ll work on that tomorrow probably) MINOR: Generating normal maps for textures and replacing procedurally-generated floor MINOR: Modelling a better-looking table with legs that aren’t just metal poles lol MINOR: Fixing weird blur bug on the vinyl cover MINOR: Adding above-vinyl view that shows users where the start and end of every track is in different colors, allowing greater control over what songs can be played and when (see image below)"}, {"post_id": 26221, "ts": "2026-07-10T21:41:53Z", "hours": 6.5947, "text": "HOTFIX: Performance Enhancement So I was messing around with the website today and realized it was maxing out my GPU, which I thought was ridiculous. It turns out I had been vastly underestimating the performance impacts of some of the effects I had on the website, as well as the meshes I was using. I decimated a model I had on top of the bookshelf but it was simply too many tris, so I removed it and implemented other code that made the default graphical settings less taxing."}, {"post_id": 24858, "ts": "2026-07-08T18:26:22Z", "hours": 0.8017, "text": "Devlog #7: Chill Record Player Last one before ship #2! Got everything in order, including uploading things to my site and adding some more props. Also fixed some pathing issues. I also kinda got rid of the blur… After adding HDRIs, it looked kinda like Garry’s mod lol"}, {"post_id": 24323, "ts": "2026-07-07T20:36:35Z", "hours": 12.4606, "text": "Devlog #6: Chill Music Player Added a bonsai tree and started modelling other objects I want in the room. Pulled an all-nighter for this. While I was doing this, I realized that the file format I was using to render the room (glb) doesnt support specific node setups and textures. This essentially limited the realism of the textures I was trying to create. To alleviate this, I’ll have to rely heavily on realistic lighting and things like glossiness. So, I decided that the lighting should be handled by an HDR and reflections be rendered in real time (I wonder how bad the performance hit will be on this). However, I also want to keep the day-night slider. This poses an issue, as HDRs are static images. This means I’ll need to write code to interpolate (probably just a linear ramp) between a couple HDRs throughout the day. Now, I don’t know if this will give me the same very warm lighting I have now. I also intend to add reflections to the glass cover of the record player after I implement HDRs, but we’ll see… Other changes: Removed emitted dots Performance changes Worked on modeling a new table behind the scenes (I modeled my dining room table a year ago but p sure I deleted it unforch)"}, {"post_id": 23214, "ts": "2026-07-06T01:09:10Z", "hours": 14.3861, "text": "Devlog #5: Chill Record Player After a monumental amount of work, I’ve ported the geometry of the room (which I had originally written in typescript) into Blender. Hopefully, this gives me more control over adding more complex geometry into the scene like plants on the ground and trinkets on the desk before I export it as a GLB file. I really can’t emphasize enough how long this took; this literally doubled the amount of time I’ve spent on this project. Anyways, some of you may have noticed that the scene in Blender looks pretty plain, though, and that’s intentional! I’m gonna handle the lighting and some of the texturing in typescript. Some of the other features I’ve added/fixes I’ve done are a nicer settings panel, warm lighting, and reducing the crackle from the record player, which I heard was a little annoying. I’ve also added post-processing to the camera, including chromatic abberation, some bloom, and a grain filter which becomes more noticeable during sunset.. My next goal will be to add as much detail to the scene as I can in Blender to really make the scene come alive. That definitely means replacing the cactus-ish plant on top of the bookshelf lol."}, {"post_id": 22020, "ts": "2026-07-04T08:14:47Z", "hours": 2.7978, "text": "Devlog #4: Chill Record Player Since my ship, I’ve been working on more features such as a day-night slider (which I hope I can sync to the user’s time at some point), a remodeled bookshelf (this took awhile), and a better lighting system. I also added bins below the bookshelf for bulk storage of records after I friend recommended I do that. Some features people have been asking for and my thoughts: Hosting your own music: until I set up a dedicated DB for this, this is not going to be possible. Once I make this a standalone app I’ll definitely implement that. Also note that I can’t add non-classical music here because 99.99% of non-classical music that is popular right now is not in the public domain. Tutorial: Yes! I’ll work on accessability Favoriting records: Yes, with the new bookshelf I can implement that For now, I’m going to try and make the room feel warmer/more cozy by using volumetric shaders and introducing subsurface scattering on my models if I can do that without hurting performance. Follow to stay updated!!!!"}, {"post_id": 12970, "ts": "2026-06-21T07:01:31Z", "hours": 0.865, "text": "Devlog 3: Before first ship! added a custom shader which allows the user to switch between what time of day it is. will get rid of the slider in a future ship but its the best i could do for now…"}, {"post_id": 11517, "ts": "2026-06-18T20:15:15Z", "hours": 3.5244, "text": "Devlog 2: A super chill music website Over the past few days, I’ve been slowly chipping away at some QOL features. Users can now see which keystrokes can be used at any given moment and users can now inspect vinyls. Other features that were improved were the ability to move the arm of the record player with higher precision, and a top-down view which enhances that experience. Unfortunately, I had to change the records to be public domain in preparation for my first ship. MBDTF will not be avaliable, but maybe I’ll let users locally host their own vinyls! Ideas ideas ideas… Maybe this could also become a standalone app. Planned features (either before or after first ship) Custom shaders -> Moody lighting or time of day slider with lamp u can turn on and off Ability to locally host music or add your own Way more records Ability to change record order More views for inspecting your records Improve the top-down angle to show when tracks begin and end on a record Ability to customize painting"}, {"post_id": 7310, "ts": "2026-06-12T05:42:23Z", "hours": 5.2231, "text": "A super chill music website Recently, I’ve been kind of inspired by this Brian Eno quote: “Whatever you now find weird, ugly, uncomfortable and nasty about a new medium will surely become its signature. CD distortion, the jitteriness of digital video, the crap sound of 8-bit — all of these will be cherished and emulated as soon as they can be avoided. It’s the sound of failure: so much modern art is the sound of things going out of control, of a medium pushing to its limits and breaking apart. The distorted guitar sound is the sound of something too loud for the medium supposed to carry it. The blues singer with the cracked voice is the sound of an emotional cry too powerful for the throat that releases it. The excitement of grainy film, of bleached-out black and white, is the excitement of witnessing events too momentous for the medium assigned to record them.” For this reason, I’ve decided to build a chill music website for listening to vinyl records. Imo, the feel of interacting with music is just as important as listening to the music itself, and in an age of ultra-high-fidelity lossless downloads on Spotify, I think there’s something special about vinyl (and this is coming from someone who listens to a ton of Spotify). It’s taken a while to get this 3D view set up, and there are still a lot of bugs and sound effects I want to fix or implement to bring everything to life, but the challenge has been making the experience feel as tactile as possible. I look forward to seeing where this’ll go :)"}]...
|
Title: Chill Record Player by @miles_s_aguilar | S Title: Chill Record Player by @miles_s_aguilar | Stardance
Devlogs:
A super chill music website Recently, I’ve been kind of inspired by this Brian Eno quote: “Whatever you now find weird, ugly, uncomfortable and nasty about a new medium will surely become its signature. CD distortion, the jitteriness of digital video, the crap sound of 8-bit — all of these will be cherished and emulated as soon as they can be avoided. It’s the sound of failure: so much modern art is the sound of things going out of control, of a medium pushing to its limits and breaking apart. The distorted guitar sound is the sound of something too loud for the medium supposed to carry it. The blues singer with the cracked voice is the sound of an emotional cry too powerful for the throat that releases it. The excitement of grainy film, of bleached-out black and white, is the excitement of witnessing events too momentous for the medium assigned to record them.” For this reason, I’ve decided to build a chill music website for listening to vinyl records. Imo, the feel of interacting with music is just as important as listening to the music itself, and in an age of ultra-high-fidelity lossless downloads on Spotify, I think there’s something special about vinyl (and this is coming from someone who listens to a ton of Spotify). It’s taken a while to get this 3D view set up, and there are still a lot of bugs and sound effects I want to fix or implement to bring everything to life, but the challenge has been making the experience feel as tactile as possible. I look forward to seeing where this’ll go :)
Devlog 2: A super chill music website Over the past few days, I’ve been slowly chipping away at some QOL features. Users can now see which keystrokes can be used at any given moment and users can now inspect vinyls. Other features that were improved were the ability to move the arm of the record player with higher precision, and a top-down view which enhances that experience. Unfortunately, I had to change the records to be public domain in preparation for my first ship. MBDTF will not be avaliable, but maybe I’ll let users locally host their own vinyls! Ideas ideas ideas… Maybe this could also become a standalone app. Planned features (either before or after first ship) Custom shaders -> Moody lighting or time of day slider with lamp u can turn on and off Ability to locally host music or add your own Way more records Ability to change record order More views for inspecting your records Improve the top-down angle to show when tracks begin and end on a record Ability to customize painting
Devlog 3: Before first ship! added a custom shader which allows the user to switch between what time of day it is. will get rid of the slider in a future ship but its the best i could do for now…
Devlog #4: Chill Record Player Since my ship, I’ve been working on more features such as a day-night slider (which I hope I can sync to the user’s time at some point), a remodeled bookshelf (this took awhile), and a better lighting system. I also added bins below the bookshelf for bulk storage of records after I friend recommended I do that. Some features people have been asking for and my thoughts: Hosting your own music: until I set up a dedicated DB for this, this is not going to be possible. Once I make this a standalone app I’ll definitely implement that. Also note that I can’t add non-classical music here because 99.99% of non-classical music that is popular right now is not in the public domain. Tutorial: Yes! I’ll work on accessability Favoriting records: Yes, with the new bookshelf I can implement that For now, I’m going to try and make the room feel warmer/more cozy by using volumetric shaders and introducing subsurface scattering on my models if I can do that without hurting performance. Follow to stay updated!!!!
Devlog #5: Chill Record Player After a monumental amount of work, I’ve ported the geometry of the room (which I had originally written in typescript) into Blender. Hopefully, this gives me more control over adding more complex geometry into the scene like plants on the ground and trinkets on the desk before I export it as a GLB file. I really can’t emphasize enough how long this took; this literally doubled the amount of time I’ve spent on this project. Anyways, some of you may have noticed that the scene in Blender looks pretty plain, though, and that’s intentional! I’m gonna handle the lighting and some of the texturing in typescript. Some of the other features I’ve added/fixes I’ve done are a nicer settings panel, warm lighting, and reducing the crackle from the record player, which I heard was a little annoying. I’ve also added post-processing to the camera, including chromatic abberation, some bloom, and a grain filter which becomes more noticeable during sunset.. My next goal will be to add as much detail to the scene as I can in Blender to really make the scene come alive. That definitely means replacing the cactus-ish plant on top of the bookshelf lol.
Devlog #6: Chill Music Player Added a bonsai tree and started modelling other objects I want in the room. Pulled an all-nighter for this. While I was doing this, I realized that the file format I was using to render the room (glb) doesnt support specific node setups and textures. This essentially limited the realism of the textures I was trying to create. To alleviate this, I’ll have to rely heavily on realistic lighting and things like glossiness. So, I decided that the lighting should be handled by an HDR and reflections be rendered in real time (I wonder how bad the performance hit will be on this). However, I also want to keep the day-night slider. This poses an issue, as HDRs are static images. This means I’ll need to write code to interpolate (probably just a linear ramp) between a couple HDRs throughout the day. Now, I don’t know if this will give me the same very warm lighting I have now. I also intend to add reflections to the glass cover of the record player after I implement HDRs, but we’ll see… Other changes: Removed emitted dots Performance changes Worked on modeling a new table behind the scenes (I modeled my dining room table a year ago but p sure I deleted it unforch)
Devlog #7: Chill Record Player Last one before ship #2! Got everything in order, including uploading things to my site and adding some more props. Also fixed some pathing issues. I also kinda got rid of the blur… After adding HDRIs, it looked kinda like Garry’s mod lol
HOTFIX: Performance Enhancement So I was messing around with the website today and realized it was maxing out my GPU, which I thought was ridiculous. It turns out I had been vastly underestimating the performance impacts of some of the effects I had on the website, as well as the meshes I was using. I decimated a model I had on top of the bookshelf but it was simply too many tris, so I removed it and implemented other code that made the default graphical settings less taxing.
Devlog #8: Chill Record Player I implemented more major performance enhancements, specifically aimed at increasing performance on retinal displays. Since retinal displays have so many pixels, computers bundle individual pixels together into logical pixels. The ratio at which this happens is called DPR. A higher DPR means sharper images but lower performance. I capped the DPR at 2x on “High”. Other changes were: Capped FPS at 60 -> 45 Added performance benchmarking to determine optimal settings for device Brought back temporal blur post-fx scan with extra leeway gained by reducing FPS Made “reflections on” default behavior Pushed more work to the loading screen Further performance changes planned before standalone app release Seeing if there’s a way to smush the 8x post-fx render stack into fewer passes Decimating more geometry Further ideas planned before app release: MAJOR: Letting user add more music MAJOR: Letting user add own props MAJOR: Tutorial/more tooltips MAJOR: Fixing flip animations upon un-focusing MAJOR: Adding zoom view to baskets MAJOR: Fixing audio bug between tracks (hard to pin down and test fixes, I’ll work on that tomorrow probably) MINOR: Generating normal maps for textures and replacing procedurally-generated floor MINOR: Modelling a better-looking table with legs that aren’t just metal poles lol MINOR: Fixing weird blur bug on the vinyl cover MINOR: Adding above-vinyl view that shows users where the start and end of every track is in different colors, allowing greater control over what songs can be played and when (see image below)
Devlog #9: Chill Record Player A little hard to tell, but I updated the model of the bookshelf to be more visually interesting (extended the rails and added a metal base) and I also re-UV-unwrapped the bookshelf so the wood texture looks less stretched. I think I’m going to try and code something that blurs the texture a little though as the black parts are a little too dark for my taste. I was also thinking of adding this really cool animation I saw (see below) on Twitter to my loading screen, so keep an eye out for that!
Devlog #10: Chill Record Player Made a much more simplified loading screen and recorded some sound effects. Truthfully, I haven’t had that much time to work on the website. AND, I wasn’t able to export my original idea for a loading screen without a watermark. I’m gonna try and make something better than this…
Devlog #11: Chill Record Player Spent all day adding a new table, and then using TypeScript to change the texture on it. I’m a bit worried about how I’m dividing the texturing between Blender and ts, as I have no rhyme or reason right now between which textures I delegate to which platform. Usually, the procedurally-generated textures are loaded in ts though. I also smoothed the grain on the bookshelf. The rug looks bad so I’ll work on that next, and then prepare the website for a MacOS app and implement more of the features I talked about in Devlog #9!!
CONCEPT: Loading Screen Hey all! This isn’t gonna be a normal devlog, but rather a quick update on something I’ll be hoping to add to the app. I’ve been tossing around a couple loading screen ideas but I think I have a really cool one. I want to mimic the Yandhi opening where an exploded view of a CD comes together and begins to spin. I think I can recreate that with my record player (or maybe just one vinyl, although that would be boring-ish?) Since this animation is a little long, I’ll probably only have it play when the user hasn’t logged on in awhile or something.
Devlog #12: Chill Record Player I think the video I attatched was too large so I’m now rewriting this devlog ;-; Anyways, I’ve spent the last week implementing the Yandhi intro as I mentioned last devlog/product idea. I spent a ton of time modelling/keyframing it in Blender, then integrating it with the website to infinitely loop, then dissasemble the vinyl when a user enters the website. What took the longest was definitely the smooth yet neat transition where the inside of the record turns into the room, so please check it out!! PS caustics take foreverrrr to render…
Ships:
Hey everyone, I made a 3D vinyl player online to play classical music. Please try it!!! It’s fully hosted on my personal website at https://milesaguilar.com/music One of the most challenging aspects of this project was making everything feel as tactile as possible. To do this, I needed to balance realism with how annoying things would be to use. To this end, I spent a lot of time thinking about which controls were most intuitive. In the future, I plan to let people upload their own vinyls and have more furniture in the room. This is mostly just a proof of concept to see if people find this interesting
I made a website for playing vinyls! I think an important aspect of enjoying music is being able to experience it physically, through interacting personally with the forms it comes in. Now obviously, this record player is online, so I did my best to bring that physical experience into a virtual website. Hopefully everything is self-explanatory on the site, and I incorperated a lot of feedback from the first round!! In the future, I plan to make this a standalone app, giving people the ability to upload their own music. Also, I’ll try to fix performance issues as I understand this website can be a bit resource-itensive....
|
1793065652.6572995
|
1793152052.6572995
|
|
9931
|
ChatPatches by @obro1984 | Stardance
|
obro1984
|
1
|
83.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-06T05:39:03Z", "hours": 83.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is Chat Patches! I’m gonna cut to the chase and explain the process of developing recently because everything about the mod is on the GitHub readme, in the changelog, and in these devlogs. Recently I’ve found time management difficult and as a result I’ve had to be more efficient and creative about how I’m spending my time developing. There’s been an influx in community contributions via PR which has been quite helpful, but most is still left up to me. However, one benefit of not having as much time to work on things is that issues I can’t seem to solve have more time for me to simmer and ponder to come up with solutions. however, this has postponed some big features i’ve already been putting off even more… hopefully i can get around to those and find some breakthrough point to pull myself through. anyways, in terms of changes, most of it has been bugfixes, but there have been a handful of additions recently, especially related to new configuration options (compact-safe messages, human-readable time format, cleaner context menu, etc.) - of course with plans to add many more. i’m proud of all these features and how far the mod has come, and frankly i’m surprised im even still developing it. i hope i can get the bigger stuff done soon so i can move on to bigger things, though. to test the mod, just set up fabricmc as explained on their website or via literally any modded minecraft tutorial - i recommend using a third-party launcher such as PrismLauncher as it keeps track of everything for you and wraps it in a nice interface. once your installation is ready simply add chat patches and its dependencies (again, using a launcher will help as it will add the deps for you!) and run the game! i hope your experience is bettered and you make the chat feel as personalized as you like :D", "repo": "https://github.com/mrbuilder1961/ChatPatches", "demo": "https://modrinth.com/mod/chatpatches/gallery"}]...
|
[{"post_id": 77225, "ts": "202 [{"post_id": 77225, "ts": "2026-10-06T05:21:48Z", "hours": 7.6692, "text": "8.0.0 released! yes, it’s been done! chat patches has been in alpha for a year and the better part of another? all because i finally impl’d the omnivers-stonecutter buildscript and additionally wanted more large-scale changes (test suite, neoforge support, DFU migration codec) ((of which are still planned… eventually!!)) … but then i just never took it off. well, you can’t wait around forever. also, this update is perfect for releasing as a whopping TEN issue reports were closed upon release, with countless others fixed soundlessly! credit where it’s due, there was a fair amount of community support via PRs for this release, but that doesn’t take away from the benefit we as a community experience from it being added! while we’re out here celebrating these crushed bugs, new features, and the return to release-channel versions, i think it’s safe to say chat patches is worthy of shipping too! i hope you’ve enjoyed using chat patches and it’s bettered your minecraft experience - and if you haven’t used it, i hope you’ll give it a try and let me know what you think. thanks again to everyone who contributed and cheers to even more fixes and features in the future! 🎉🥳💃🎈"}, {"post_id": 72734, "ts": "2026-09-23T16:44:23Z", "hours": 12.9153, "text": "i’ve been very busy with university starting, but recently there has been an influx in PRs fixing bugs, which is awesome! so i’ve been monitoring those and slowly merging them into the main branch. additionally, i’ve been chipping away at fixes and suggestion implementations here and there; specifically: excluding specific messages from being compacted updating to 26.3 actually uploading signature files (now that Modrinth officially supports them) fixing chat auto scrolling while duplicate messages are being received adding fallbacks for the chat log’s codec provider in case the current one fails/doesn’t exist ..and more!! i hope to add more stuff soon and publish a release, but i have about 4 free minutes per week and unfortunately, i end up not wanting to spend it on largely unpaid labor. nevertheless, my aspirations remain and my hopes are high!"}, {"post_id": 46725, "ts": "2026-08-14T05:34:29Z", "hours": 5.3536, "text": "i’ve been SUPER busy as of late, and will probably continue to be for at least another week or two if not longer, but i’m starting to begin to wrap up unit testing. i finally pushed the existing tests and framework to github on a separate branch, but bc i’m so bad at Git, IntelliJ is fucking up my other changes i’m currently working on (updating the main omnivers branch to 26.3-snapshot-8 )… so hopefully i can fix that soon. unfortunately i don’t know when the unit testing will be finished, as it takes a longggg time to figure out the little edge cases, and i prefer to avoid AI everywhere possible (although there’s only so much ethical struggling i can endure before i need to ask for help)."}, {"post_id": 29224, "ts": "2026-07-16T00:17:47Z", "hours": 10.7325, "text": "Unit Testing! yup, that’s what’s been taking so long. i actually got past the gradle setup part pretty quick, i just wasn’t expecting current code to be so… dysfunctional. i’ve done a lot of rewriting and test formatting and sometimes it just gets really brain numbing so i put on a youtube video in the background and then its been 45 minutes and i havent changed anything… but i just achieved my first all-passing test milestone! so i’ll be pushing it soon and then i’ll the changes that make everything pass will follow soon after. currently I’m targeting TextUtil , where the most edge-cases take place, in the form of String <-> Component transformations. ultimiately i’d like to also do E2E testing in the form of Fabric’s ClientGameTest , but those can only be done on the most recent version due to FAPI not backporting changes (it’s probably for the best anyway) - so i’ll be doing that last. that’s it for now! i can’t wait for everyone (especially me), to benefit from this when future releases are checked before releasing! yayyyy!!!"}, {"post_id": 21584, "ts": "2026-07-03T16:47:26Z", "hours": 22.8564, "text": "hey chat! i’ve finished up some of that stuff from before. most notably: publishMods now works again! turns out Modrinth just recently (i.e. this week) allowed attaching signatures to builds so it’s not currently supported with MPP also, turns out the whole checksum thing was kinda useless because Modrinth has provided file hashes via their API this whole time - so… i think i’m gonna table that idea for now and use that later i published a new version ( alpha.11 ) that fixes the teensy-eensy little problem that incomplete mixins were accidentally included in the jar uploaded to CF and MR as alpha.10 . whoops! version parsing is now much more robust and typically requires only one gradle property to be specified! for newer releases you can override the FMJ version (ex. w/ ~26.2 for the 26.2 subproject) and the rest is handled automatically. i’m also waiting on MPP#116 to see if this can be consolidated entirely, with no need for an extra override! the classtweaker is now stone-cut so it’s a bit easier to see what is applied to where cleaned up the buildscript more (it is perpetually dirty :/) fixed a handful of bugs and impl’d a couple suggestions! and now, i get to move on to one of the most daunting but hopefully most rewarding things: drumroll please…. ztzttstz.z.t..z….. unit testing!!! you’re probably thinking, chat patches hasn’t had any unit tests this WHOLE time!??! and you’d be right! idk how there aren’t more bugs. but now i’m putting everything else (chat patches wise, at least) on hold to get this done. bc if i don’t do it now, it will never get done. ik this isn’t very pretty but you gotta do what you gotta do."}, {"post_id": 15214, "ts": "2026-06-24T18:36:47Z", "hours": 23.2442, "text": "i’ve been doing what feels like a lot but isn’t overall much. i’ve been refactoring the Kotlin Gradle buildscript, which i’m notoriously bad at so it’s taking a really long time. some of my (attempted) changes include: generating signatures and checksums with published builds (2/3 done) simplified stonecutter replacements and swaps assessed what will need to change to transition to the new modstitch-toolkit minorly updated mod-publish-plugin and started planning for new version range parsing and functionality in other things, i’ve: fixed the context menu deletion option resetting the scroll pos removed the entirely unused option table in the README better utilized classtweakers in the context menu implemented annotation-based constraints for config options replaced the dual-impl option validation system with a unified one via codecs (now used in the YACL config, with one annoying side effect) future-proofed the module-based fabric api importing so that it only loads what’s necessary (and it should work with neoforge when i eventually impl that!) updated mod functionality to 26.2 (despite being unable to publish everything at once 😑)"}]...
|
Title: ChatPatches by @obro1984 | Stardance
Devlo Title: ChatPatches by @obro1984 | Stardance
Devlogs:
i’ve been doing what feels like a lot but isn’t overall much. i’ve been refactoring the Kotlin Gradle buildscript, which i’m notoriously bad at so it’s taking a really long time. some of my (attempted) changes include: generating signatures and checksums with published builds (2/3 done) simplified stonecutter replacements and swaps assessed what will need to change to transition to the new modstitch-toolkit minorly updated mod-publish-plugin and started planning for new version range parsing and functionality in other things, i’ve: fixed the context menu deletion option resetting the scroll pos removed the entirely unused option table in the README better utilized classtweakers in the context menu implemented annotation-based constraints for config options replaced the dual-impl option validation system with a unified one via codecs (now used in the YACL config, with one annoying side effect) future-proofed the module-based fabric api importing so that it only loads what’s necessary (and it should work with neoforge when i eventually impl that!) updated mod functionality to 26.2 (despite being unable to publish everything at once 😑)
hey chat! i’ve finished up some of that stuff from before. most notably: publishMods now works again! turns out Modrinth just recently (i.e. this week) allowed attaching signatures to builds so it’s not currently supported with MPP also, turns out the whole checksum thing was kinda useless because Modrinth has provided file hashes via their API this whole time - so… i think i’m gonna table that idea for now and use that later i published a new version ( alpha.11 ) that fixes the teensy-eensy little problem that incomplete mixins were accidentally included in the jar uploaded to CF and MR as alpha.10 . whoops! version parsing is now much more robust and typically requires only one gradle property to be specified! for newer releases you can override the FMJ version (ex. w/ ~26.2 for the 26.2 subproject) and the rest is handled automatically. i’m also waiting on MPP#116 to see if this can be consolidated entirely, with no need for an extra override! the classtweaker is now stone-cut so it’s a bit easier to see what is applied to where cleaned up the buildscript more (it is perpetually dirty :/) fixed a handful of bugs and impl’d a couple suggestions! and now, i get to move on to one of the most daunting but hopefully most rewarding things: drumroll please…. ztzttstz.z.t..z….. unit testing!!! you’re probably thinking, chat patches hasn’t had any unit tests this WHOLE time!??! and you’d be right! idk how there aren’t more bugs. but now i’m putting everything else (chat patches wise, at least) on hold to get this done. bc if i don’t do it now, it will never get done. ik this isn’t very pretty but you gotta do what you gotta do.
Unit Testing! yup, that’s what’s been taking so long. i actually got past the gradle setup part pretty quick, i just wasn’t expecting current code to be so… dysfunctional. i’ve done a lot of rewriting and test formatting and sometimes it just gets really brain numbing so i put on a youtube video in the background and then its been 45 minutes and i havent changed anything… but i just achieved my first all-passing test milestone! so i’ll be pushing it soon and then i’ll the changes that make everything pass will follow soon after. currently I’m targeting TextUtil , where the most edge-cases take place, in the form of String <-> Component transformations. ultimiately i’d like to also do E2E testing in the form of Fabric’s ClientGameTest , but those can only be done on the most recent version due to FAPI not backporting changes (it’s probably for the best anyway) - so i’ll be doing that last. that’s it for now! i can’t wait for everyone (especially me), to benefit from this when future releases are checked before releasing! yayyyy!!!
i’ve been SUPER busy as of late, and will probably continue to be for at least another week or two if not longer, but i’m starting to begin to wrap up unit testing. i finally pushed the existing tests and framework to github on a separate branch, but bc i’m so bad at Git, IntelliJ is fucking up my other changes i’m currently working on (updating the main omnivers branch to 26.3-snapshot-8 )… so hopefully i can fix that soon. unfortunately i don’t know when the unit testing will be finished, as it takes a longggg time to figure out the little edge cases, and i prefer to avoid AI everywhere possible (although there’s only so much ethical struggling i can endure before i need to ask for help).
i’ve been very busy with university starting, but recently there has been an influx in PRs fixing bugs, which is awesome! so i’ve been monitoring those and slowly merging them into the main branch. additionally, i’ve been chipping away at fixes and suggestion implementations here and there; specifically: excluding specific messages from being compacted updating to 26.3 actually uploading signature files (now that Modrinth officially supports them) fixing chat auto scrolling while duplicate messages are being received adding fallbacks for the chat log’s codec provider in case the current one fails/doesn’t exist ..and more!! i hope to add more stuff soon and publish a release, but i have about 4 free minutes per week and unfortunately, i end up not wanting to spend it on largely unpaid labor. nevertheless, my aspirations remain and my hopes are high!
8.0.0 released! yes, it’s been done! chat patches has been in alpha for a year and the better part of another? all because i finally impl’d the omnivers-stonecutter buildscript and additionally wanted more large-scale changes (test suite, neoforge support, DFU migration codec) ((of which are still planned… eventually!!)) … but then i just never took it off. well, you can’t wait around forever. also, this update is perfect for releasing as a whopping TEN issue reports were closed upon release, with countless others fixed soundlessly! credit where it’s due, there was a fair amount of community support via PRs for this release, but that doesn’t take away from the benefit we as a community experience from it being added! while we’re out here celebrating these crushed bugs, new features, and the return to release-channel versions, i think it’s safe to say chat patches is worthy of shipping too! i hope you’ve enjoyed using chat patches and it’s bettered your minecraft experience - and if you haven’t used it, i hope you’ll give it a try and let me know what you think. thanks again to everyone who contributed and cheers to even more fixes and features in the future! 🎉🥳💃🎈
Ships:
This is Chat Patches! I’m gonna cut to the chase and explain the process of developing recently because everything about the mod is on the GitHub readme, in the changelog, and in these devlogs. Recently I’ve found time management difficult and as a result I’ve had to be more efficient and creative about how I’m spending my time developing. There’s been an influx in community contributions via PR which has been quite helpful, but most is still left up to me. However, one benefit of not having as much time to work on things is that issues I can’t seem to solve have more time for me to simmer and ponder to come up with solutions. however, this has postponed some big features i’ve already been putting off even more… hopefully i can get around to those and find some breakthrough point to pull myself through. anyways, in terms of changes, most of it has been bugfixes, but there have been a handful of additions recently, especially related to new configuration options (compact-safe messages, human-readable time format, cleaner context menu, etc.) - of course with plans to add many more. i’m proud of all these features and how far the mod has come, and frankly i’m surprised im even still developing it. i hope i can get the bigger stuff done soon so i can move on to bigger things, though. to test the mod, just set up fabricmc as explained on their website or via literally any modded minecraft tutorial - i recommend using a third-party launcher such as PrismLauncher as it keeps track of everything for you and wraps it in a nice interface. once your installation is ready simply add chat patches and its dependencies (again, using a launcher will help as it will add the deps for you!) and run the game! i hope your experience is bettered and you make the chat feel as personalized as you like :D...
|
1793004953.9332492
|
1793091353.9332492
|
|
38164
|
Determinist by @Mate1166 | Stardance
|
Mate1166
|
3
|
83.0
|
503
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T23:53:05Z", "hours": 38.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Determinist Determinist is a deterministic password generator that lets you recover forgotten passwords easily, given that you remember a master password, and a few things about your lost password. Features CLI and Web interface, featuring a PWA that also works offline Three algorithm versions to choose from A preset system Generated passwords are identical on both the website and the CLI Fully local generation Presets The presets use the TOML format, which is very user-friendly and easy to edit. The presets have multiple categories inside them like ‘general’ (for the algorithm version and password length), ‘preset’ (the preset name, description and whether it is set as defaul), and version specific ones like ‘v3’, which has the settings for the v3 algorithm. If you’re unsure how to edit preset files, you can also just export your settings from the website, and use it across all versions of Determinist! To Reviewers Please, test both the CLI and the website (if possible), and provide feedback on User Experience if you encountered any issues, include that in the review. You can even suggest features, and I may implement them :) Thank you!", "repo": "https://github.com/szentpeterimate/Determinist", "demo": "https://szentpeterimate.github.io/determinist/"}, {"ship_num": 2, "ts": "2026-08-13T14:20:06Z", "hours": 29.0, "multiplier": 14.15, "payout": 412, "blessing": "neutral", "text": "Well, it’s official: Determinist now has a website! Features: Easy to use interface Straightforward settings 1:1 compatibility with the CLI Fully client-side The only thing that hasn’t made it into the website (yet) is the preset system, just like with the CLI, I’m adding that later as the web UI is already really easy to use. And now the less technical bit… It’s been an incredible journey, Determinist has been my dream project for a few years now, and it’s really amazing how I can share it with the world now that it’s done. Just to mention a few things I learned from this project: Testing Proper git usage Cryptography JavaScript These are things I wouldn’t really have learned without Determinist. Sure, I could have done so, but not this fast and effectively. I must thank those who supported the project, who liked the devlogs, and of course the reviewers who gave their opinion on the CLI. Because of your feedback, I made Determinist even easier to use now, and I will continue doing so. Version 3 of the algorithm is on its way, as well as the preset system for the web. Thank you everyone!", "repo": "https://github.com/szentpeterimate/Determinist", "demo": "https://szentpeterimate.github.io/determinist/"}, {"ship_num": 3, "ts": "2026-08-01T18:32:59Z", "hours": 16.0, "multiplier": 6.15, "payout": 91, "blessing": "neutral", "text": "Determinist is a password generator made for people who often forget or leave passwords behind, just like me. A few years ago I was on vacation when I wanted to log into a website. However, the password for it was left at home on my PC, which I didn’t bring with myself. Of course, I could’ve just reset the password, but that would’ve been worse since I’d still have mismatched passwords. Determinist solves that. It uses a deterministic algorithm to take your inputs, and generate you a password you can recover anytime, anywhere. The only thing you need to remember is your master passphrase, which site you want to log in, and a few additional settings. (presets coming soon!) I had a lot of fun with this project, and it taught me quite a bit about encryption, randomness, and most importantly how a real-world project functions. (I do have to mention my initial struggle with Typer though, I would not want to wish that on my worst enemy.) With that being said, I hope you’ll have your password problems solved, and that you’ll enjoy using Determinist! Have fun!", "repo": "https://github.com/szentpeterimate/Determinist", "demo": "https://szentpeterimate.github.io/determinist/"}]...
|
[{"post_id": 80257, "ts": "202 [{"post_id": 80257, "ts": "2026-10-16T23:42:22Z", "hours": 1.6311, "text": "Determinist // Devlog 16 // 2026.09.17. Version 1.0.0 is out, and this is my final devlog. Well, it finally arrived. Version 1.0.0. This is where active development stops. Of course, I will still fix issues and implement features suggested by you guys, but I probably won’t be adding any by myself. Stardance has been a great inspiration for me, not only to make this project, but to keep going and coming back to doing what I love: coding, and making things for others. I am very happy with how Determinist turned out, despite the difficulties and me being busy with school. But enough of this, what was changed since my last devlog? Changes Updated the documentation to show that a PWA is available to install Fixed various bugs and style inconsistencies Added a description of the generation process to the website Added a Copy to Clipboard toggle Added an Export as Preset button Removed Google Fonts connections What’s next? Nothing. I’d like to thank everyone who had a chance to try and use Determinist. Everyone who reviewed it and even you, the one reading this devlog :) Y’all have showed me that things I make can and are useful for others. See you in the next Hack Club program!"}, {"post_id": 79995, "ts": "2026-10-15T20:30:50Z", "hours": 5.9489, "text": "Determinist // Devlog 15 // 2026.09.15. A few design changes, and a brand new section on the website! Design I have fixed several design issues I noticed and did not like. Just to mention a few, there was unnecessary overflow on mobile devices, the spacing was off on several elements, and the width of the file input field was also too big. The Wall of Text™ It isn’t that big to be fair, it just explains how Determinist works, split into the 3 versions of the generation algorithm. I didn’t want to copy the page I had linked in the README, so I just wrote it down again and tried wording it better. Additionally, I tried to preserve the original one page, no scroll design by placing the About section below the actual app, so you have to scroll to see it. Other changes I refactored parts of the web code as the Generator element was getting really long, above 500 lines. I moved the algorithms out to a separate importable module, and I placed it along with the python-random module into a self-explanatory modules directory. I’ve also moved generror.jsx and presethandler.jsx into their own handlers/ directory, and the two specialized input fields into an inputs/ directory. Overall, this change makes the code way easier to read. The preset generator works now as well, just click the “Export as Preset” button below “Generate”, name the preset and the preset will be downloaded for you! You can also toggle on a “Copy to Clipboard” feature which allows you to automatically copy your generated password to your clipboard. Pretty neat! What’s next? Bug fixes Auto clear password popup"}, {"post_id": 77686, "ts": "2026-10-07T21:23:27Z", "hours": 2.1339, "text": "Determinist // Devlog 14 // 2026.09.06. Finally, I figured out how to make the site work offline… The process After working on the PWA for way longer than I expected, it finally works as intended! After I’ve figured out how to use next-pwa , I encountered an issue: the site was being cached and loaded correctly in the browser but not when installed as a PWA. I rewrote multiple parts of the code for it to work, yet it did not. In the end, it was the unsecured connections that were at fault. Discovering that, I have learned to use something new again: Localtunnel, which allows me to use a valid (not self-signed) HTTPS connection while testing. This uncovered even more issues with my code, the most obvious being the fact that fonts were not cached at all. This was because I was getting my fonts by connecting to fonts.google.com . This was a really easy thing to fix though, as Next.js already has a next/fonts/google library that had the fonts I used, and now everything works well. What’s next? Bug fixes Descriptions Preset Generator Auto Copy to Clipboard toggle"}, {"post_id": 73593, "ts": "2026-09-25T13:12:35Z", "hours": 4.1403, "text": "Determinist // Devlog 13 // 2026.09.25. Quite a few issues, but apparently it works… Progressive Web App Well, making Determinist a PWA certainly took way longer than expected. I thought it would be an hour at most, I mean Next.js literally has a guide that tells me what to do step-by-step. It was in fact NOT easy. I encountered a ton of problems. First off, I had to write a manifest which had the app name, icons etc., the obvious things. What was not obvious however was that I had multiple ways of doing that. I could write a JSON file, or write a JavaScript file that exports an object. I chose the latter as it was the version that the Next.js guide was using. Then came the icons. Oh, the icons. I made my icons and put it in the public/ directory with the correct names so that they match the manifest. Cool, works when I share it but there is no icon when I add it to my home screen on my iPhone. It said I’m missing a file called apple-touch-icon and apple-touch-icon-precomposed . Cool, I duplicated the icons and I renamed them. No 404s, but it still did not work. I look for a solution. For hours. I look at Next.js docs, YouTube, StackOverflow, Reddit, GitHub issues and there is nothing that would fix it. Finally, I found out I need to link the icon in the head of the website. Great, but still doesn’t work. Turns out, the problem was that I was following the Next.js guide which told me to use HTTPS to test the PWA, but iOS does not trust self-signed keys so it did not download the icon. After that, the generation broke when I was connecting to the site with the IP and not through localhost . I noticed that submitting (pressing the generate button) redirected me which should not have happened due to the line e.preventDefault() . Then I saw Next.js attempting to connect a websocket, and a bunch of 403 errors that weren’t there before. I spent quite a bit of time debugging that, and it was due to not adding my IP to allowedDevOrigins in the next.config.mjs file despite it working perfectly fine before. The Icon As you can see, the image I decided to include in my devlog is the icon for Determinist. I actually did not think of putting the D and the E together at first, but when I did, it reminded me of a lock (hope you can see it!) and I chose to keep it as it kind of fits. And I didn’t want a solid color background, so I decided I’ll just add the name repeating. It was fun making it, and it was also a very good way to practice using Illustrator. What’s next? Making the PWA work offline Bug fixes Descriptions Preset Generator Auto Copy to Clipboard toggle"}, {"post_id": 69184, "ts": "2026-09-16T15:26:59Z", "hours": 5.1517, "text": "Determinist // Devlog 12 // 2026.09.16. Well, it took me more than a week, but the v3 algorithm is on the website! CLI Update I have published version 0.5.2 of the Python CLI, which fixed a few issues I found (you can see them on the GitHub page!), and added actual functionality to the default presets. You can also report issues on the GitHub page, and it is highly appreciated. What changed? I added the v3 algorithm, after a bit of tinkering with the error handling. My problem was that the error handling wasn’t really dynamic. It couldn’t handle the invalid input errprs from v3, so I made a separate component. I also had to learn how to use HKDF on the client side, which was actually easier to do than I expected, although the actual usage of HKDF was a bit more complicated than it is in Python. What’s next? Bug fixes Descriptions Preset Generator PWA Implementation Auto Copy to Clipboard toggle"}, {"post_id": 63122, "ts": "2026-09-06T19:06:33Z", "hours": 8.5219, "text": "Determinist // Devlog 11 // 2026.09.06. After the first week of school, I have finished work on the CLI, and Determinist 0.5.1 is released! Changes Added presets create command Changed preset option to allow selection in one line Changed the presets list to show invalid files in the configuration directory Added password generation errors Fixed bugs: The password being allowed to have less characters than the sum of the minimum required characters is fixed The g prefix from the commit hash is now removed Various preset error handling issues have been fixed Presets are now not required to have all the versions inside them What’s taking so long? Is Determinist done? Firstly, I just started school, so I got very busy lately and that is why I haven’t been doing much work. As a compensation, v3 of the algorithm is now available on GitHub !! This is version 0.5.1, which is a pretty big jump if you look at the versions before. However, there is a reason for that: active development of Determinist is going to stop once version 1.0.0 comes out, with all the new features and fixes being ported to the website. This will come out in the next week or so. Determinist will still be updated here and there if I miss some features or people have suggestions and issues, but I will be mainly focusing on other projects. Latest development stuff The preset creation was actually pretty easy. I figured I’ll reuse the options from the generate command so I don’t have to write them manually again, and it worked amazing! I had to add to the PresetHandler to make it work, and that was really simple as well. I first thought of adding strings together, but then I realized I could just create dictionaries that my TOML library can convert to TOML and write them to the preset, so I didn’t have to do all the writing myself. The bug fixes weren’t interesting at all, honestly. I messed around with Determinist, found bugs and issues and I fixed them. My favorite one was debugging errors with the preset commands however. I found a bunch of things worth fixing, and in the end I made another helper function, as well as changing how check_file_type works. To do Port everything over to the website Add more text to the website explaining Determinist and how it works"}, {"post_id": 55761, "ts": "2026-08-27T19:06:48Z", "hours": 4.7333, "text": "Determinist // Devlog 10 // 2026.08.27 Updates here and there, and the v3 algorithm is finally complete! All of this and the content of the rest of the devlogs will only be released with the final 1.0.0 release of Determinist. Changes Added v3 algorithm for the Python CLI It features dynamic byte generation so that no matter what, you’ll never run out of characters! (Unless you’re VERY unlucky) You can now enter a third value called a “differentiator” that can be used to change the output further. This is especially useful if you have multiple accounts on the same site. This option can be left empty Your generated password is now guaranteed to have the correct amount of characters You can now set a minimum amount of characters of each type! Simply enter 0 to exclude the character type, and 1 or above to choose how many characters your password have minimum of that type. Made generate prompt only prompt users if the prompts are applicable. This means you will no longer be prompted for the settings of v1 when you use one of the other two algorithms. Fixed an issue where if the site_name option is omitted, the prompt will display Master pass instead of the correct prompt. The difficulties Well, of course the development of v3 came with some challenges. Firstly, I had to figure out how to actually generate enough bytes to pass rejection sampling (making sure no bytes are out of range when mapped onto the character set), as the previous implementation was that I multiplied the password length by 32. This worked, but wasn’t pretty and in very rare and unlucky cases, there weren’t enough bytes. I fixed this by using something called HKDF, which stands for HMAC-based Extract-and-Expand Key Derivation Function. I’d really prefer to use HKDF. Anyway, this function was really good for this task, as it can take the Argon2 output and create a long, pseudo-random key that can go through rejection sampling, and finally end up in the password. In case this generated key is not enough, HKDF will generate more of it, essentially giving us infinite bytes to then map to our characters. This was especially good because in the same loop I could implement… Minimum requirements This should have been easy, but it took me a day to think about how to do it. The challenge: take a dictionary ( {\"lowercase\": 2, \"uppercase\": 3, \"special\": 1, \"digits\": 0} ), and include at least as many characters of each type as their value in that dictionary says, and if it’s 0 then don’t include it at all. Fine, I said, but I didn’t actually know how to implement this. After a day of thinking, it finally clicked: I implement this in the rejection sampling loop, as that is where my characters get added. Introducing the _construct_pass function: it looks for the already added characters, determines the type of the current character, counts how many are missing, and if a character type is missing some characters or there aren’t any left, the character is added, and otherwise it is discarded. To do Add a preset generator command Fix a g prefix appearing in the version command output before the git commit hash Add the ability to choose a preset in one line instead of being prompted for it Fix the password being allowed to be shorter than the sum of minimum required characters (I found that one while writing this) Port everything over to the website Update the docs Add more text to the website explaining Determinist and how it works"}, {"post_id": 52485, "ts": "2026-08-22T16:59:34Z", "hours": 6.1439, "text": "Determinist // Devlog 9 // 2026.08.22 Long time no see y’all, sorry for the wait! I’m on vacation so I had less time to work on the project, but I did bring some amazing improvements. Announcement The website is officially up and works identically to the CLI, now with presets! Just load your TOML presets into the website, and they will be saved for you to reuse! Important note: they are saved locally, therefore you will not see them on different devices unless you import them there too. Changes Added the preset system to the website! You can now import and use presets, and you can easily remove them if needed. Adjusted the UI so that it fits most (if not all) screens. The smallest screen I tested was an iPhone SE. The Challenges There actually weren’t a lot of challenges for once. The biggest one was that I forgot to work on the project while on vacation, but that’s not horrible. And then came React, JavaScript and everything else… firstly, the preset loading was actually really easy, I did however fight with React about passing values from a child component to the parent. And then it turned out I forgot to make it actually pleasant to use, as I had to select the preset file every time I wanted to load it. Now you can save, select and load your presets on the website. However, React had other plans. I finally learned how React’s useEffect hook works, and using it is pretty easy now that I get what I’m doing. Along with this, I also properly learned about using functions inside useState for lazy initialization which I needed for localStorage . Oh, localStorage was a pleasure to learn and use… Well, the operations with it are actually fairly easy, it’s like an object, and my first thought of initializing a state with it was to use useState({ ...localStorage }) , which did work, but it introduced something else: a build error after I merged the changes into main . Turns out, localStorage is undefined when GitHub Actions wants to build my website, therefore it gave me an error saying so. What I had to do is check if the window object is equal to 'undefined' , and if not, then spread localStorage and initialize the state. Finally, the website managed to build properly, but when I tried to use it on my phone, the output of the generator was outside my screen… so I had to go back and change how the UI looks after I’ve already merged everything into main . Amazing. Well, the good new is that it works, and next up is the v3 algorithm, as well as QoL changes, bug fixes, and more in both the CLI and web versions."}, {"post_id": 46026, "ts": "2026-08-12T22:45:54Z", "hours": 6.4178, "text": "Determinist // Devlog 8 // 2026.08.13 The UI is mostly complete, and I will be releasing the website tomorrow! Changes Significantly improved the entire user interface Version and special character mode (V1) now use <select> instead of the regular <input> , so you don’t have to type them out The difficulties There really wasn’t anything too hard about making the UI. You might ask, “why did you spend over 6 hours on it then?”. I have an answer for you. I tried using Figma for designing the UI but it was just too boring for me, so I decided to start coding it and figure it out as I go. I’m pretty satisfied with the result, but with everything, it can always be improved. The second problem was that while I was coding, I was also listening to music and I spent a bunch of time skipping songs because I didn’t feel like listening to them. This took my attention along with singing a bit too much, so my progress was slowed… The last thing to slow me down was my general inexperience with React and JS, although I got over that quick because the frontend is way easier to work on. Planned Adding the preset system Building the site & uploading to GitHub Pages"}, {"post_id": 45454, "ts": "2026-08-11T22:28:05Z", "hours": 4.7858, "text": "Determinist // Devlog 7 // 2026.08.12 Well, it’s official. I had to use AI for the first time :( Why? JavaScript does not have the same random implementation as Python does. Python uses MT19937 while JS uses Xorshift128+. This means we can’t use JavaScript’s random number generator, not to mention that we can’t even use it to shuffle arrays, as it lacks the method. And since I am relatively new to JS, I had two options: get a 15 year old module work that does exactly what I need it to, or make it with AI. I tried getting that package to work. I really did. Unfortunately, the algorithm it uses seems to be outdated, as the results differed in tests. That is why I used AI. I really didn’t want to, but I had to. Well, let’s look at the positives, at least! Changes The V2 algorithm is implemented and works 1:1 with the Python version! I managed to make another input component that uses checkboxes so you can select what kind of characters you’d like. It was challenging but it works! Next Up Tomorrow I’ll work on the UI design Adding the preset system Building the site Uploading to GitHub Pages"}, {"post_id": 44862, "ts": "2026-08-10T21:58:48Z", "hours": 2.4364, "text": "Determinist // Devlog 6 // 2026.08.10 Pretty big milestone: V1 is finally working on the website! Additions Added the V1 generation algorithm Added the customization options to the interface The Generator V1 is complete and works perfectly! I had to figure out a way to enter objects, and it was quite difficult. See, JavaScript doesn’t really have a dictionary type like Python does, so I had to use an object, which is similar enough and I can look for keys with in , just like in Python. The tricky part was creating such an object from the user’s input. I chose the most user friendly way I could think of, and made separate inputs for the key and value, and you can dynamically add more with an “Add Character Pair” button. I really wish there was an easier way and maybe there is a template out there, but I didn’t consider it until writing this very sentence. Anyways, tomorrow I’ll spend more time refining V1, the inputs and I’ll start working on V2. To Do Refining the generator and inputs Creating V2 Desgining the UI Adding the preset system Generating the static site"}, {"post_id": 44238, "ts": "2026-08-09T21:17:27Z", "hours": 2.4381, "text": "Determinist // Devlog 5 // 2026.08.09 I’ve started working on the website finally! The plan I’ll use GitHub Pages to host Determinist until I can get my own domain and personal site up, after which I’ll transfer it there. The plan is to make the generator client sided by using WebAssembly to access Argon2 in the browser without requiring a backend. I wanna do this so that no information leaves the user’s computer, which is a key part of keeping Determinist privacy focused. I chose to use Next.js because I used it before, and it has Static Site Generation which is essential if I want to put the site on GitHub Pages. What I achieved in 2 and a half hours I made Argon2 work Yes, that’s about it. I spent most of my time debugging errors and learning basics as I’ve only used JavaScript for making components, not to make more complex algorithms like Determinist’s is. I am a fast learner though, so I expect to be able to recreate Determinist V1 relatively quickly. Starting with WASM on my first serious web project where I’m still learning JS maybe wasn’t the most amazing idea, but hey, I like challenges and learning by doing. What’s next? Continuing work on V1 Porting V2 to JavaScript Desgining the UI Adding the preset system Generating the static site and fixing errors after it’s done And to the reviewers and people who liked the Determinist CLI… Thank you! Developing Determinist has been lots of fun and I’ve learned a lot of valuable things. Your support and feedback is greatly appreciated, it motivates me to work every single day. It’s a project I’m really passionate about, as I wanted to create this for years. Thank you all for your support, and I hope you’ll enjoy using Determinist whether it’s in your terminal or the web. See you in the next devlog!"}, {"post_id": 42594, "ts": "2026-08-07T12:38:38Z", "hours": 3.0314, "text": "Determinist // Devlog 4 // 2026.08.07 Developer experience and cleanups What changed My code now has comments! Although it is quite straightforward to understand, I did include a few here and there. A brand new version command shows what version Determinist is on, what commit it was built from, and the Python version it uses. I added more custom error handling to commands Something funny happened… I was testing the generation of the default preset, and I forgot to press tab when deleting the Determinist config directory. I only realized that when Hyprland started screaming at me about missing configurations. I thought “that’s weird”, so I checked the command I ran. rm -rf ~/.config/ . I deleted my entire configuration directory… Luckily, I had backups, but at least I’ve learned that I should double check my commands. Another Typer issue To absolutely no one’s surprise, Typer didn’t work as intended, once again. It kept reporting the wrong error when running presets subcommands. Turns out it was the callback I wrote to list the presets. It actually ran the check every time a presets command was run, giving the wrong error when a non TOML file was detected in the presets directory. It was a quick fix, but now I’m quite comfortable with Typer."}, {"post_id": 41993, "ts": "2026-08-06T15:11:38Z", "hours": 10.2806, "text": "Determinist // Devlog 3 // 2026.08.06. Determinist v0.2.2 is here and available to install, but I certainly did not thing this would take another 10 hours… What changed I have made a preset system that can load settings so you don’t have to type them out manually. You can only use this with the regular generate command. The presets command lists out all installed presets Running presets save with a path added at the end will save the selected preset to your config folder Adding delete after presets with the name of a preset will delete that permanently Using presets default and adding the preset name will set that preset as default Running --help is actually helpful now! Another change is I made prompt a subcommand of generate . I ran into an issue while implementing this… The issue You see, Typer cannot tell the difference between a positional argument and a subcommand, meaning that it took prompt as the master_pass argument for generate . This is obviously not at all what I intended, so I needed a way to figure out how to solve this. I didn’t want to make prompt an option, since that would’ve complicated things a lot more than they needed to be. Therefore, I changed master_pass and site_name to required options, which means they need to be typed out manually. Fear not however, because if you forget to do that, Determinist now prompts you for it! Another problem was with types, again. Typer apparently doesn’t like Union types, which I would’ve used for the preset option. What I wanted to do is make the user be able to type out the name of the preset, select one if none is entered in the command, or do everything manually. Problem: that’s 3 types: None , str and UNSET , which is basically a different spelling of None , it jut signals that the presets option was passed without an argument, as a flag. But Typer decided to ruin my day and only let me use two types, so I removed it all and made --preset a boolean, therefore a flag. That’s about it for now, if you like the idea of having an easy way of remembering your passwords, check out Determinist!"}, {"post_id": 39036, "ts": "2026-08-01T18:20:18Z", "hours": 11.0289, "text": "Determinist // Devlog 2 // 2026.08.01 Welcome back to the second devlog of Determinist! It’s been a while, so let’s recap what happened… Release!! The first official release of Determinist is here! You can check out the GitHub page to learn more. Algorithm V2 Quite a few changes here. I changed the algorithm so that it uses the bytes that Argon2 returns The bytes are now mapped to characters in a shuffled charset Insert/Replace modes have been removed because special characters are already in the charset You can now construct your own charset Typer I made my CLI with Typer, which was a challenge to say the least. This is my first time using it, and looking back, it wasn’t THAT bad. All I had to do is refactor generator.py completely, and make my types compatible (which I worked REALLY HARD on for V1). Typer doesn’t allow me to use things like lists and dictionaries, both of which are essential, but I managed to change everything in a way that’s mostly straightforward. I can split strings into a list and use JSON for dictionaries. Refactoring Challenges This is pretty funny. I wrote a series of tests for version 2 of the algorithm before I started implementing Typer. After than however, all tests passed except one. I was supposed to use assertUnequal() , but used the opposite instead, and that was I caught an error in my code that would’ve went unnoticed. The tests saved me another time, when I noticed that changing the order in which the charset character types are written changes the output, which is not what I need because it’s essentially the same input, and it should be more like a toggle. The fix was making the charset canonical. The algorithm goes through the list, writes the correct characters into a string, and uses that in the salt instead of the list of the charset. Other The Generator class was removed, as it served no purpose."}, {"post_id": 33987, "ts": "2026-07-24T11:33:26Z", "hours": 4.8617, "text": "Determinist // Devlog 1 // 2026.07.24. Hey everyone! This is the first devlog of Determinist, a deterministic password generator. After a few hours of messing around, I’ve managed to write the first working version of the generator algorithm. (Flowchart attached) You can specify the parameters such as password length, special character frequency, etc. as well as the master passphrase and the salt (site name in this case), and the script will generate a pseudorandom password for you. I’ve hit quite a few roadblock along the way, such as the salt being too small. This is a feature of Argon2, so for now you can only use custom salts that are bigger than 8 bytes. I’ve also included a few unit tests as proof of concept. The generator algorithm will be improved in later versions, and a CLI tool will be available."}]...
|
Title: Determinist by @Mate1166 | Stardance
Devlo Title: Determinist by @Mate1166 | Stardance
Devlogs:
Determinist // Devlog 1 // 2026.07.24. Hey everyone! This is the first devlog of Determinist, a deterministic password generator. After a few hours of messing around, I’ve managed to write the first working version of the generator algorithm. (Flowchart attached) You can specify the parameters such as password length, special character frequency, etc. as well as the master passphrase and the salt (site name in this case), and the script will generate a pseudorandom password for you. I’ve hit quite a few roadblock along the way, such as the salt being too small. This is a feature of Argon2, so for now you can only use custom salts that are bigger than 8 bytes. I’ve also included a few unit tests as proof of concept. The generator algorithm will be improved in later versions, and a CLI tool will be available.
Determinist // Devlog 2 // 2026.08.01 Welcome back to the second devlog of Determinist! It’s been a while, so let’s recap what happened… Release!! The first official release of Determinist is here! You can check out the GitHub page to learn more. Algorithm V2 Quite a few changes here. I changed the algorithm so that it uses the bytes that Argon2 returns The bytes are now mapped to characters in a shuffled charset Insert/Replace modes have been removed because special characters are already in the charset You can now construct your own charset Typer I made my CLI with Typer, which was a challenge to say the least. This is my first time using it, and looking back, it wasn’t THAT bad. All I had to do is refactor generator.py completely, and make my types compatible (which I worked REALLY HARD on for V1). Typer doesn’t allow me to use things like lists and dictionaries, both of which are essential, but I managed to change everything in a way that’s mostly straightforward. I can split strings into a list and use JSON for dictionaries. Refactoring Challenges This is pretty funny. I wrote a series of tests for version 2 of the algorithm before I started implementing Typer. After than however, all tests passed except one. I was supposed to use assertUnequal() , but used the opposite instead, and that was I caught an error in my code that would’ve went unnoticed. The tests saved me another time, when I noticed that changing the order in which the charset character types are written changes the output, which is not what I need because it’s essentially the same input, and it should be more like a toggle. The fix was making the charset canonical. The algorithm goes through the list, writes the correct characters into a string, and uses that in the salt instead of the list of the charset. Other The Generator class was removed, as it served no purpose.
Determinist // Devlog 3 // 2026.08.06. Determinist v0.2.2 is here and available to install, but I certainly did not thing this would take another 10 hours… What changed I have made a preset system that can load settings so you don’t have to type them out manually. You can only use this with the regular generate command. The presets command lists out all installed presets Running presets save with a path added at the end will save the selected preset to your config folder Adding delete after presets with the name of a preset will delete that permanently Using presets default and adding the preset name will set that preset as default Running --help is actually helpful now! Another change is I made prompt a subcommand of generate . I ran into an issue while implementing this… The issue You see, Typer cannot tell the difference between a positional argument and a subcommand, meaning that it took prompt as the master_pass argument for generate . This is obviously not at all what I intended, so I needed a way to figure out how to solve this. I didn’t want to make prompt an option, since that would’ve complicated things a lot more than they needed to be. Therefore, I changed master_pass and site_name to required options, which means they need to be typed out manually. Fear not however, because if you forget to do that, Determinist now prompts you for it! Another problem was with types, again. Typer apparently doesn’t like Union types, which I would’ve used for the preset option. What I wanted to do is make the user be able to type out the name of the preset, select one if none is entered in the command, or do everything manually. Problem: that’s 3 types: None , str and UNSET , which is basically a different spelling of None , it jut signals that the presets option was passed without an argument, as a flag. But Typer decided to ruin my day and only let me use two types, so I removed it all and made --preset a boolean, therefore a flag. That’s about it for now, if you like the idea of having an easy way of remembering your passwords, check out Determinist!
Determinist // Devlog 4 // 2026.08.07 Developer experience and cleanups What changed My code now has comments! Although it is quite straightforward to understand, I did include a few here and there. A brand new version command shows what version Determinist is on, what commit it was built from, and the Python version it uses. I added more custom error handling to commands Something funny happened… I was testing the generation of the default preset, and I forgot to press tab when deleting the Determinist config directory. I only realized that when Hyprland started screaming at me about missing configurations. I thought “that’s weird”, so I checked the command I ran. rm -rf ~/.config/ . I deleted my entire configuration directory… Luckily, I had backups, but at least I’ve learned that I should double check my commands. Another Typer issue To absolutely no one’s surprise, Typer didn’t work as intended, once again. It kept reporting the wrong error when running presets subcommands. Turns out it was the callback I wrote to list the presets. It actually ran the check every time a presets command was run, giving the wrong error when a non TOML file was detected in the presets directory. It was a quick fix, but now I’m quite comfortable with Typer.
Determinist // Devlog 5 // 2026.08.09 I’ve started working on the website finally! The plan I’ll use GitHub Pages to host Determinist until I can get my own domain and personal site up, after which I’ll transfer it there. The plan is to make the generator client sided by using WebAssembly to access Argon2 in the browser without requiring a backend. I wanna do this so that no information leaves the user’s computer, which is a key part of keeping Determinist privacy focused. I chose to use Next.js because I used it before, and it has Static Site Generation which is essential if I want to put the site on GitHub Pages. What I achieved in 2 and a half hours I made Argon2 work Yes, that’s about it. I spent most of my time debugging errors and learning basics as I’ve only used JavaScript for making components, not to make more complex algorithms like Determinist’s is. I am a fast learner though, so I expect to be able to recreate Determinist V1 relatively quickly. Starting with WASM on my first serious web project where I’m still learning JS maybe wasn’t the most amazing idea, but hey, I like challenges and learning by doing. What’s next? Continuing work on V1 Porting V2 to JavaScript Desgining the UI Adding the preset system Generating the static site and fixing errors after it’s done And to the reviewers and people who liked the Determinist CLI… Thank you! Developing Determinist has been lots of fun and I’ve learned a lot of valuable things. Your support and feedback is greatly appreciated, it motivates me to work every single day. It’s a project I’m really passionate about, as I wanted to create this for years. Thank you all for your support, and I hope you’ll enjoy using Determinist whether it’s in your terminal or the web. See you in the next devlog!
Determinist // Devlog 6 // 2026.08.10 Pretty big milestone: V1 is finally working on the website! Additions Added the V1 generation algorithm Added the customization options to the interface The Generator V1 is complete and works perfectly! I had to figure out a way to enter objects, and it was quite difficult. See, JavaScript doesn’t really have a dictionary type like Python does, so I had to use an object, which is similar enough and I can look for keys with in , just like in Python. The tricky part was creating such an object from the user’s input. I chose the most user friendly way I could think of, and made separate inputs for the key and value, and you can dynamically add more with an “Add Character Pair” button. I really wish there was an easier way and maybe there is a template out there, but I didn’t consider it until writing this very sentence. Anyways, tomorrow I’ll spend more time refining V1, the inputs and I’ll start working on V2. To Do Refining the generator and inputs Creating V2 Desgining the UI Adding the preset system Generating the static site
Determinist // Devlog 7 // 2026.08.12 Well, it’s official. I had to use AI for the first time :( Why? JavaScript does not have the same random implementation as Python does. Python uses MT19937 while JS uses Xorshift128+. This means we can’t use JavaScript’s random number generator, not to mention that we can’t even use it to shuffle arrays, as it lacks the method. And since I am relatively new to JS, I had two options: get a 15 year old module work that does exactly what I need it to, or make it with AI. I tried getting that package to work. I really did. Unfortunately, the algorithm it uses seems to be outdated, as the results differed in tests. That is why I used AI. I really didn’t want to, but I had to. Well, let’s look at the positives, at least! Changes The V2 algorithm is implemented and works 1:1 with the Python version! I managed to make another input component that uses checkboxes so you can select what kind of characters you’d like. It was challenging but it works! Next Up Tomorrow I’ll work on the UI design Adding the preset system Building the site Uploading to GitHub Pages
Determinist // Devlog 8 // 2026.08.13 The UI is mostly complete, and I will be releasing the website tomorrow! Changes Significantly improved the entire user interface Version and special character mode (V1) now use <select> instead of the regular <input> , so you don’t have to type them out The difficulties There really wasn’t anything too hard about making the UI. You might ask, “why did you spend over 6 hours on it then?”. I have an answer for you. I tried using Figma for designing the UI but it was just too boring for me, so I decided to start coding it and figure it out as I go. I’m pretty satisfied with the result, but with everything, it can always be improved. The second problem was that while I was coding, I was also listening to music and I spent a bunch of time skipping songs because I didn’t feel like listening to them. This took my attention along with singing a bit too much, so my progress was slowed… The last thing to slow me down was my general inexperience with React and JS, although I got over that quick because the frontend is way easier to work on. Planned Adding the preset system Building the site & uploading to GitHub Pages
Determinist // Devlog 9 // 2026.08.22 Long time no see y’all, sorry for the wait! I’m on vacation so I had less time to work on the project, but I did bring some amazing improvements. Announcement The website is officially up and works identically to the CLI, now with presets! Just load your TOML presets into the website, and they will be saved for you to reuse! Important note: they are saved locally, therefore you will not see them on different devices unless you import them there too. Changes Added the preset system to the website! You can now import and use presets, and you can easily remove them if needed. Adjusted the UI so that it fits most (if not all) screens. The smallest screen I tested was an iPhone SE. The Challenges There actually weren’t a lot of challenges for once. The biggest one was that I forgot to work on the project while on vacation, but that’s not horrible. And then came React, JavaScript and everything else… firstly, the preset loading was actually really easy, I did however fight with React about passing values from a child component to the parent. And then it turned out I forgot to make it actually pleasant to use, as I had to select the preset file every time I wanted to load it. Now you can save, select and load your presets on the website. However, React had other plans. I finally learned how React’s useEffect hook works, and using it is pretty easy now that I get what I’m doing. Along with this, I also properly learned about using functions inside useState for lazy initialization which I needed for localStorage . Oh, localStorage was a pleasure to learn and use… Well, the operations with it are actually fairly easy, it’s like an object, and my first thought of initializing a state with it was to use useState({ ...localStorage }) , which did work, but it introduced something else: a build error after I merged the changes into main . Turns out, localStorage is undefined when GitHub Actions wants to build my website, therefore it gave me an error saying so. What I had to do is check if the window object is equal to 'undefined' , and if not, then spread localStorage and initialize the state. Finally, the website managed to build properly, but when I tried to use it on my phone, the output of the generator was outside my screen… so I had to go back and change how the UI looks after I’ve already merged everything into main . Amazing. Well, the good new is that it works, and next up is the v3 algorithm, as well as QoL changes, bug fixes, and more in both the CLI and web versions.
Determinist // Devlog 10 // 2026.08.27 Updates here and there, and the v3 algorithm is finally complete! All of this and the content of the rest of the devlogs will only be released with the final 1.0.0 release of Determinist. Changes Added v3 algorithm for the Python CLI It features dynamic byte generation so that no matter what, you’ll never run out of characters! (Unless you’re VERY unlucky) You can now enter a third value called a “differentiator” that can be used to change the output further. This is especially useful if you have multiple accounts on the same site. This option can be left empty Your generated password is now guaranteed to have the correct amount of characters You can now set a minimum amount of characters of each type! Simply enter 0 to exclude the character type, and 1 or above to choose how many characters your password have minimum of that type. Made generate prompt only prompt users if the prompts are applicable. This means you will no longer be prompted for the settings of v1 when you use one of the other two algorithms. Fixed an issue where if the site_name option is omitted, the prompt will display Master pass instead of the correct prompt. The difficulties Well, of course the development of v3 came with some challenges. Firstly, I had to figure out how to actually generate enough bytes to pass rejection sampling (making sure no bytes are out of range when mapped onto the character set), as the previous implementation was that I multiplied the password length by 32. This worked, but wasn’t pretty and in very rare and unlucky cases, there weren’t enough bytes. I fixed this by using something called HKDF, which stands for HMAC-based Extract-and-Expand Key Derivation Function. I’d really prefer to use HKDF. Anyway, this function was really good for this task, as it can take the Argon2 output and create a long, pseudo-random key that can go through rejection sampling, and finally end up in the password. In case this generated key is not enough, HKDF will generate more of it, essentially giving us infinite bytes to then map to our characters. This was especially good because in the same loop I could implement… Minimum requirements This should have been easy, but it took me a day to think about how to do it. The challenge: take a dictionary ( {"lowercase": 2, "uppercase": 3, "special": 1, "digits": 0} ), and include at least as many characters of each type as their value in that dictionary says, and if it’s 0 then don’t include it at all. Fine, I said, but I didn’t actually know how to implement this. After a day of thinking, it finally clicked: I implement this in the rejection sampling loop, as that is where my characters get added. Introducing the _construct_pass function: it looks for the already added characters, determines the type of the current character, counts how many are missing, and if a character type is missing some characters or there aren’t any left, the character is added, and otherwise it is discarded. To do Add a preset generator command Fix a g prefix appearing in the version command output before the git commit hash Add the ability to choose a preset in one line instead of being prompted for it Fix the password being allowed to be shorter than the sum of minimum required characters (I found that one while writing this) Port everything over to the website Update the docs Add more text to the website explaining Determinist and how it works
Determinist // Devlog 11 // 2026.09.06. After the first week of school, I have finished work on the CLI, and Determinist 0.5.1 is released! Changes Added presets create command Changed preset option to allow selection in one line Changed the presets list to show invalid files in the configuration directory Added password generation errors Fixed bugs: The password being allowed to have less characters than the sum of the minimum required characters is fixed The g prefix from the commit hash is now removed Various preset error handling issues have been fixed Presets are now not required to have all the versions inside them What’s taking so long? Is Determinist done? Firstly, I just started school, so I got very busy lately and that is why I haven’t been doing much work. As a compensation, v3 of the algorithm is now available on GitHub !! This is version 0.5.1, which is a pretty big jump if you look at the versions before. However, there is a reason for that: active development of Determinist is going to stop once version 1.0.0 comes out, with all the new features and fixes being ported to the website. This will come out in the next week or so. Determinist will still be updated here and there if I miss some features or people have suggestions and issues, but I will be mainly focusing on other projects. Latest development stuff The preset creation was actually pretty easy. I figured I’ll reuse the options from the generate command so I don’t have to write them manually again, and it worked amazing! I had to add to the PresetHandler to make it work, and that was really simple as well. I first thought of adding strings together, but then I realized I could just create dictionaries that my TOML library can convert to TOML and write them to the preset, so I didn’t have to do all the writing myself. The bug fixes weren’t interesting at all, honestly. I messed around with Determinist, found bugs and issues and I fixed them. My favorite one was debugging errors with the preset commands however. I found a bunch of things worth fixing, and in the end I made another helper function, as well as changing how check_file_type works. To do Port everything over to the website Add more text to the website explaining Determinist and how it works
Determinist // Devlog 12 // 2026.09.16. Well, it took me more than a week, but the v3 algorithm is on the website! CLI Update I have published version 0.5.2 of the Python CLI, which fixed a few issues I found (you can see them on the GitHub page!), and added actual functionality to the default presets. You can also report issues on the GitHub page, and it is highly appreciated. What changed? I added the v3 algorithm, after a bit of tinkering with the error handling. My problem was that the error handling wasn’t really dynamic. It couldn’t handle the invalid input errprs from v3, so I made a separate component. I also had to learn how to use HKDF on the client side, which was actually easier to do than I expected, although the actual usage of HKDF was a bit more complicated than it is in Python. What’s next? Bug fixes Descriptions Preset Generator PWA Implementation Auto Copy to Clipboard toggle
Determinist // Devlog 13 // 2026.09.25. Quite a few issues, but apparently it works… Progressive Web App Well, making Determinist a PWA certainly took way longer than expected. I thought it would be an hour at most, I mean Next.js literally has a guide that tells me what to do step-by-step. It was in fact NOT easy. I encountered a ton of problems. First off, I had to write a manifest which had the app name, icons etc., the obvious things. What was not obvious however was that I had multiple ways of doing that. I could write a JSON file, or write a JavaScript file that exports an object. I chose the latter as it was the version that the Next.js guide was using. Then came the icons. Oh, the icons. I made my icons and put it in the public/ directory with the correct names so that they match the manifest. Cool, works when I share it but there is no icon when I add it to my home screen on my iPhone. It said I’m missing a file called apple-touch-icon and apple-touch-icon-precomposed . Cool, I duplicated the icons and I renamed them. No 404s, but it still did not work. I look for a solution. For hours. I look at Next.js docs, YouTube, StackOverflow, Reddit, GitHub issues and there is nothing that would fix it. Finally, I found out I need to link the icon in the head of the website. Great, but still doesn’t work. Turns out, the problem was that I was following the Next.js guide which told me to use HTTPS to test the PWA, but iOS does not trust self-signed keys so it did not download the icon. After that, the generation broke when I was connecting to the site with the IP and not through localhost . I noticed that submitting (pressing the generate button) redirected me which should not have happened due to the line e.preventDefault() . Then I saw Next.js attempting to connect a websocket, and a bunch of 403 errors that weren’t there before. I spent quite a bit of time debugging that, and it was due to not adding my IP to allowedDevOrigins in the next.config.mjs file despite it working perfectly fine before. The Icon As you can see, the image I decided to include in my devlog is the icon for Determinist. I actually did not think of putting the D and the E together at first, but when I did, it reminded me of a lock (hope you can see it!) and I chose to keep it as it kind of fits. And I didn’t want a solid color background, so I decided I’ll just add the name repeating. It was fun making it, and it was also a very good way to practice using Illustrator. What’s next? Making the PWA work offline Bug fixes Descriptions Preset Generator Auto Copy to Clipboard toggle
Determinist // Devlog 14 // 2026.09.06. Finally, I figured out how to make the site work offline… The process After working on the PWA for way longer than I expected, it finally works as intended! After I’ve figured out how to use next-pwa , I encountered an issue: the site was being cached and loaded correctly in the browser but not when installed as a PWA. I rewrote multiple parts of the code for it to work, yet it did not. In the end, it was the unsecured connections that were at fault. Discovering that, I have learned to use something new again: Localtunnel, which allows me to use a valid (not self-signed) HTTPS connection while testing. This uncovered even more issues with my code, the most obvious being the fact that fonts were not cached at all. This was because I was getting my fonts by connecting to fonts.google.com . This was a really easy thing to fix though, as Next.js already has a next/fonts/google library that had the fonts I used, and now everything works well. What’s next? Bug fixes Descriptions Preset Generator Auto Copy to Clipboard toggle
Determinist // Devlog 15 // 2026.09.15. A few design changes, and a brand new section on the website! Design I have fixed several design issues I noticed and did not like. Just to mention a few, there was unnecessary overflow on mobile devices, the spacing was off on several elements, and the width of the file input field was also too big. The Wall of Text™ It isn’t that big to be fair, it just explains how Determinist works, split into the 3 versions of the generation algorithm. I didn’t want to copy the page I had linked in the README, so I just wrote it down again and tried wording it better. Additionally, I tried to preserve the original one page, no scroll design by placing the About section below the actual app, so you have to scroll to see it. Other changes I refactored parts of the web code as the Generator element was getting really long, above 500 lines. I moved the algorithms out to a separate importable module, and I placed it along with the python-random module into a self-explanatory modules directory. I’ve also moved generror.jsx and presethandler.jsx into their own handlers/ directory, and the two specialized input fields into an inputs/ directory. Overall, this change makes the code way easier to read. The preset generator works now as well, just click the “Export as Preset” button below “Generate”, name the preset and the preset will be downloaded for you! You can also toggle on a “Copy to Clipboard” feature which allows you to automatically copy your generated password to your clipboard. Pretty neat! What’s next? Bug fixes Auto clear password popup
Determinist // Devlog 16 // 2026.09.17. Version 1.0.0 is out, and this is my final devlog. Well, it finally arrived. Version 1.0.0. This is where active development stops. Of course, I will still fix issues and implement features suggested by you guys, but I probably won’t be adding any by myself. Stardance has been a great inspiration for me, not only to make this project, but to keep going and coming back to doing what I love: coding, and making things for others. I am very happy with how Determinist turned out, despite the difficulties and me being busy with school. But enough of this, what was changed since my last devlog? Changes Updated the documentation to show that a PWA is available to install Fixed various bugs and style inconsistencies Added a description of the generation process to the website Added a Copy to Clipboard toggle Added an Export as Preset button Removed Google Fonts connections What’s next? Nothing. I’d like to thank everyone who had a chance to try and use Determinist. Everyone who reviewed it and even you, the one reading this devlog :) Y’all have showed me that things I make can and are useful for others. See you in the next Hack Club program!
Ships:
Determinist is a password generator made for people who often forget or leave passwords behind, just like me. A few years ago I was on vacation when I wanted to log into a website. However, the password for it was left at home on my PC, which I didn’t bring with myself. Of course, I could’ve just reset the password, but that would’ve been worse since I’d still have mismatched passwords. Determinist solves that. It uses a deterministic algorithm to take your inputs, and generate you a password you can recover anytime, anywhere. The only thing you need to remember is your master passphrase, which site you want to log in, and a few additional settings. (presets coming soon!) I had a lot of fun with this project, and it taught me quite a bit about encryption, randomness, and most importantly how a real-world project functions. (I do have to mention my initial struggle with Typer though, I would not want to wish that on my worst enemy.) With that being said, I hope you’ll have your password problems solved, and that you’ll enjoy using Determinist! Have fun!
Well, it’s official: Determinist now has a website! Features: Easy to use interface Straightforward settings 1:1 compatibility with the CLI Fully client-side The only thing that hasn’t made it into the website (yet) is the preset system, just like with the CLI, I’m adding that later as the web UI is already really easy to use. And now the less technical bit… It’s been an incredible journey, Determinist has been my dream project for a few years now, and it’s really amazing how I can share it with the world now that it’s done. Just to mention a few things I learned from this project: Testing Proper git usage Cryptography JavaScript These are things I wouldn’t really have learned without Determinist. Sure, I could have done so, but not this fast and effectively. I must thank those who supported the project, who liked the devlogs, and of course the reviewers who gave their opinion on the CLI. Because of your feedback, I made Determinist even easier to use now, and I will continue doing so. Version 3 of the algorithm is on its way, as well as the preset system for the web. Thank you everyone!
Determinist Determinist is a deterministic password generator that lets you recover forgotten passwords easily, given that you remember a master password, and a few things about your lost password. Features CLI and Web interface, featuring a PWA that also works offline Three algorithm versions to choose from A preset system Generated passwords are identical on both the website and the CLI Fully local generation Presets The presets use the TOML format, which is very user-friendly and easy to edit. The presets have multiple categories inside them like ‘general’ (for the algorithm version and password length), ‘preset’ (the preset name, description and whether it is set as defaul), and version specific ones like ‘v3’, which has the settings for the v3 algorithm. If you’re unsure how to edit preset files, you can also just export your settings from the website, and use it across all versions of Determinist! To Reviewers Please, test both the CLI and the website (if possible), and provide feedback on User Experience if you encountered any issues, include that in the review. You can even suggest features, and I may implement them :) Thank you!...
|
1792304412.9257355
|
1793168412.9257355
|
|
38792
|
No-inference by @TheShovel | Stardance
|
TheShovel
|
2
|
83.0
|
758
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T21:19:17Z", "hours": 12.0, "multiplier": 18.1, "payout": 224, "blessing": "neutral", "text": "Since the last ship, i have added some very basic coding capabilities. Its not great, but its something. I thought id be more motivated to work on this but i guess i was wrong… found something else im more interested in working on instead! So here i am banking my points with a half baked devlog at midnight. Check my profile for my new cool awesome project :D", "repo": "https://github.com/TheShovel/no-inference", "demo": "https://theshovel.rocks/no-inference/"}, {"ship_num": 2, "ts": "2026-08-02T22:15:54Z", "hours": 71.0, "multiplier": 17.78, "payout": 534, "blessing": "neutral", "text": "This is a research project that i did out of curiosity. My question was “do we even need LLMs for agentic chatbots?”. So i tried to build one that doesnt use LLMs and is instead hand written systems. This started fun, but slowly turned into iterative hell, and i came to a conclusion. Is it possible? Yes, definitely. Is anyone gonna do it? HELL NO. Theres a reason the companies who do this decided to go the destroy the environment and use up money and resources route. ITS EASIER. If that doesnt explain it, than idk what does. Test it out, see what you think, its not great and doesnt have a lot of data in it, but i sure did try!", "repo": "https://github.com/TheShovel/no-inference", "demo": "https://theshovel.rocks/no-inference/"}]...
|
[{"post_id": 48493, "ts": "202 [{"post_id": 48493, "ts": "2026-08-16T21:17:03Z", "hours": 2.385, "text": "ok yeah im done for real now. This it. Last one. I just worked on improving its coding capabilities… a little. its still not great, but its still something. Pretty much making this devlog just to bank it the last few hours on this project."}, {"post_id": 42425, "ts": "2026-08-07T03:43:01Z", "hours": 10.0039, "text": "i think i am some kind of masochist cuz for some reason i keep coming back to this project. for some reason i still think this could be something bigger, even though i doubt ill reach that point. well, anyway, i started working on its coding capabilities! still pretty basic and rough, but it does work and it does seem to scale decently! you can ask it to make edits, add logging and explain the code and so on. pretty cooool ok back to data engineering hell i go"}, {"post_id": 39745, "ts": "2026-08-02T22:11:45Z", "hours": 14.5353, "text": "ok, im gonna be so deadass, im so done with this project. This is it, this is the state im leaving it in. It was fun at the start but now its just very frustrating and boring to look at walls of data go on my screen and me going “yep that looks good enough”. I want to work on cooler things that interest me more, so this project, is done. Since last time i implemented: text editing coding capabilities typo detection and fixing more templates and so on. Thats it. It was a interesting research project, but i think i came to a conclusion: The reason why no one did this, is because it is stupidly tedious. Training a classic LLM is so much easier even if it destroys the environment and costs a lot of money. Its a lot less human work, which i guess is more valuable than anything. If we should learn a lesson from this, is that humans cant be replaced, and our efforts are worth more than we think. Also i made a website"}, {"post_id": 36947, "ts": "2026-07-29T11:08:57Z", "hours": 33.0328, "text": "First of all, i again didnt do devlogs every day because i wasnt sure where this project was going. I couldnt tell if it as going to work or not or if it was even viable. But, now i think i can start making some actual consistent devlogs, because i think its working! This is a no-inference chatbot, its meant to function like chatgpt and all the other slop generators out there, BUT, without an LLM AT ALL! Thats right. Its all just hand made agorithms, web search and data association. This project has been a pain in the butt to work on due to how tedious it is, but its finally starting to shape up. As you can see, it can respond to basic greetings, write essays, iterate on them and so on. It fails quite often due to its lack of information but thats nothing that cant be fixed with more templates and data. Ill be going back to the grind and try to improve this further, because of how much time and effort building this takes idk how much further i can get it, but ill try my best. When i reach a point where i go “ok yeah this is all i feel like doing”, im going to build an api server people can host and document it and call it done. This really is more of an experiment and research project rather than a thing i know i can give people to use in a “production” environment if you know what i mean. Ok yeah anyway see yah mwah"}, {"post_id": 34566, "ts": "2026-07-25T12:04:49Z", "hours": 23.0139, "text": "Hi! so, i am making this devlog with 15 hours on record because i was honestly not sure if this would work. In my last stardance project, i tried making an agentic chatbot utilizing LLMs, but trying to make it as light and as compatible as possible so it can run even on my poopy 7gb of ram laptop. That whole thing got me thinking. Do we even need LLMs? Do we even need generative AI for this? So this project started. This is an attempt at making agentic AI without LLMs, or weights or anything similar. The entire idea is that this can be fast and easily modified without having to use an entire datacenter to retrain the model, because there is no model. Right now, i have worked on a conversational “engine”, that basically puts words together algorithmically by detecting certain properties from the users prompt. Its not very impressive right now, but i think im onto something that could be quite a big deal if i get right. I dont even know if this project will be shippable but ill still document its development because i think its interesting. Alright smooches! See you later! <3"}]...
|
Title: No-inference by @TheShovel | Stardance
Dev Title: No-inference by @TheShovel | Stardance
Devlogs:
Hi! so, i am making this devlog with 15 hours on record because i was honestly not sure if this would work. In my last stardance project, i tried making an agentic chatbot utilizing LLMs, but trying to make it as light and as compatible as possible so it can run even on my poopy 7gb of ram laptop. That whole thing got me thinking. Do we even need LLMs? Do we even need generative AI for this? So this project started. This is an attempt at making agentic AI without LLMs, or weights or anything similar. The entire idea is that this can be fast and easily modified without having to use an entire datacenter to retrain the model, because there is no model. Right now, i have worked on a conversational “engine”, that basically puts words together algorithmically by detecting certain properties from the users prompt. Its not very impressive right now, but i think im onto something that could be quite a big deal if i get right. I dont even know if this project will be shippable but ill still document its development because i think its interesting. Alright smooches! See you later! <3
First of all, i again didnt do devlogs every day because i wasnt sure where this project was going. I couldnt tell if it as going to work or not or if it was even viable. But, now i think i can start making some actual consistent devlogs, because i think its working! This is a no-inference chatbot, its meant to function like chatgpt and all the other slop generators out there, BUT, without an LLM AT ALL! Thats right. Its all just hand made agorithms, web search and data association. This project has been a pain in the butt to work on due to how tedious it is, but its finally starting to shape up. As you can see, it can respond to basic greetings, write essays, iterate on them and so on. It fails quite often due to its lack of information but thats nothing that cant be fixed with more templates and data. Ill be going back to the grind and try to improve this further, because of how much time and effort building this takes idk how much further i can get it, but ill try my best. When i reach a point where i go “ok yeah this is all i feel like doing”, im going to build an api server people can host and document it and call it done. This really is more of an experiment and research project rather than a thing i know i can give people to use in a “production” environment if you know what i mean. Ok yeah anyway see yah mwah
ok, im gonna be so deadass, im so done with this project. This is it, this is the state im leaving it in. It was fun at the start but now its just very frustrating and boring to look at walls of data go on my screen and me going “yep that looks good enough”. I want to work on cooler things that interest me more, so this project, is done. Since last time i implemented: text editing coding capabilities typo detection and fixing more templates and so on. Thats it. It was a interesting research project, but i think i came to a conclusion: The reason why no one did this, is because it is stupidly tedious. Training a classic LLM is so much easier even if it destroys the environment and costs a lot of money. Its a lot less human work, which i guess is more valuable than anything. If we should learn a lesson from this, is that humans cant be replaced, and our efforts are worth more than we think. Also i made a website
i think i am some kind of masochist cuz for some reason i keep coming back to this project. for some reason i still think this could be something bigger, even though i doubt ill reach that point. well, anyway, i started working on its coding capabilities! still pretty basic and rough, but it does work and it does seem to scale decently! you can ask it to make edits, add logging and explain the code and so on. pretty cooool ok back to data engineering hell i go
ok yeah im done for real now. This it. Last one. I just worked on improving its coding capabilities… a little. its still not great, but its still something. Pretty much making this devlog just to bank it the last few hours on this project.
Ships:
This is a research project that i did out of curiosity. My question was “do we even need LLMs for agentic chatbots?”. So i tried to build one that doesnt use LLMs and is instead hand written systems. This started fun, but slowly turned into iterative hell, and i came to a conclusion. Is it possible? Yes, definitely. Is anyone gonna do it? HELL NO. Theres a reason the companies who do this decided to go the destroy the environment and use up money and resources route. ITS EASIER. If that doesnt explain it, than idk what does. Test it out, see what you think, its not great and doesnt have a lot of data in it, but i sure did try!
Since the last ship, i have added some very basic coding capabilities. Its not great, but its something. I thought id be more motivated to work on this but i guess i was wrong… found something else im more interested in working on instead! So here i am banking my points with a half baked devlog at midnight. Check my profile for my new cool awesome project :D...
|
1793001061.0507634
|
1793087461.0507634
|
|
41476
|
Contango by @igowu | Stardance
|
igowu
|
2
|
83.0
|
1107
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-15T20:46:02Z", "hours": 58.0, "multiplier": 19.01, "payout": 1046, "blessing": "neutral", "text": "Contango I built a Python framework for quantitative research of trading strategies, whether it be backtesting them, tuning parameter combinations, or turning the results into graphs that can easily reveal profitability/risk in strategies. It started as solely a backtesting framework, but it has grown into an entire suite for optimization and analysis. The latest release, v0.1.1, is now on PyPI. What it is It is an event-driven trading framework with two ways to build strategies. Strategy gives you complete control over the framework, while RuleBasedStrategy provides a higher-level interface for expressing trading rules with less boilerplate. On top of that is the research tooling. Contango can run Cartesian parameter sweeps, evaluating every combination of selected parameters rather than forcing you to manually run a strategy over and over. That makes it possible to take a strategy idea and view a whole parameter space in one run. Market data is handled through a local repository that caches OHLCV data, so repeated experiments don’t need to keep downloading the same data. This permits for offline usage once data has previously been downloaded. Yfinance (a data provider) works without setup or an API key, while the data provider system is designed so additional providers can be added without touching codebase’s internals. Possibly the most important part is the graphs. Equity curves, drawdowns, trade-quality metrics, parameter distributions, risk/return views, and more can be generated from the results of a research run. However, the goal isn’t just to analyze the amount of profit the strategy returns. Instead, it’s to make the behavior of the strategy visible by exposing a variety of different risk/trading/drawdown metrics, revealed clearly in the generated graphs. What was hard I spent a lot of time separating components, defining cleaner interfaces (modularity), and deciding where abstraction was beneficial rather than just adding redundancy and boilerplate. The parameter optimization system was another massive difficulty to create. A Cartesian sweep sounds simple on paper; however, the question arises: how do you distinguish all of the strategies from each other? My initial solution was to display all of the parameters for each strategy, but this ended up with strategy names that were way too large to render. Lastly, documentation ended up being much more work than I expected. I wanted someone to be able to use Contango without having to understand how its internals work first, while still having enough documentation available for someone who actually wants to extend the framework. What I’m proud of The part I’m happiest with is that Contango now feels genuinely easy to use after a small learning curve. You can write a strategy, point it at market data, sweep its parameters, and get a collection of research results and visualizations without having to manually glue all of those pieces together. The other thing I’m proud of is the amount of attention that I put into making the project understandable. The public API is documented, the internal API is documented, components have been modularized, and there are now unit tests for essentially everything that needs them. It’s not finished in the sense that no software ever is, but it finally feels complete. How to test it Install it from PyPI: pip install contango Then run the included research demo: python -m contango.research.demo_strategies.cartesian_bollinger_strategy.runner The demo runs a Bollinger Band strategy across a Cartesian grid of parameters and generates performance and parameter-analysis graphs (HTML) that can be reviewed. I want to thank Stardance for this experience - the opportunity to build software while earning rewards and be in such a welcoming community is amazing to me. I’m looking forward to future work with Hackclub!", "repo": "https://github.com/igowuu/Contango", "demo": "https://pypi.org/project/contango/"}, {"ship_num": 2, "ts": "2026-07-30T16:02:17Z", "hours": 25.0, "multiplier": 6.1, "payout": 61, "blessing": "neutral", "text": "Contango Have you ever wanted to create strategies programmatically for the stock market, cryptocurrencies, or anything else related to trading?! Maybe not… But I have! So, what is Contango? Contango is a full trading engine that allows you to make strategies in Python without worrying about any potential biases in your workflow. Instead of focusing on simulation, metrics, results, and graphs, you can avert your focus solely to the quality of the strategies you create. Strategies - what do they look like? Strategies are a part of an event-driven engine. This means that they receive and react to events that are released from a “mode”. A “mode” is anything that handles the logic of the event bus and/or engine - backtesting, live trading, etc. An example of a strategy: class MyStrategy ( Strategy ): \"\"\" A very simple strategy outline - not all logic is included. \"\"\" def on_market_event ( self , event : MarketDataEvent ) -> None : # Strategy market logic here def on_end ( self ) -> None : ... Results Contango processes the raw events emitted from your strategy and converts them to metrics. These metrics are then used to produce seven unique graphs. Each of these graphs tell you something unique about the strategy, whether it be profitability, risk, drawdown, consistency, win rate, etc. For most modern workflows, this is enough; however, all modules are cleanly decoupled from each other, so raw events or raw metrics can be processed & analyzed however you would like. Challenges Challenges: A massive learning curve. I’ve spent probably 50 hours or more just researching and absorbing the information used in this project. Packaging was difficult to get right, whether it be “missing type stub” warnings or incorrect rendering of my README.md. Documentation was terrible to write. Spending large amounts of time writing English words instead of code that accomplishes something was extremely tedious, yet completely necessary for a shipped project like this. I’m proud of this project Genuinely, this is one of the first big project I’ve ever made. I have never released anything to PyPI, nor shipped something of this scale before. Hackatime only shows 22 hours since I set it up partway through, but Contango’s been my main project since June, and it’s the second largest thing I’ve built. Usage The GitHub has detailed instructions, demos, videos, and more; however, since it’s so short, here is how to install the project & run the built-in demo from any python IDE: pip install contango python -m contango.research.research_strategies.bollinger_band_mean_reversion.runner Final Notes I’ve had a lot of fun with this project, and I hope anyone who sees this enjoys it just as much as me. Happy coding!", "repo": "https://github.com/igowuu/Contango", "demo": "https://pypi.org/project/contango/"}]...
|
[{"post_id": 68711, "ts": "202 [{"post_id": 68711, "ts": "2026-09-15T16:17:49Z", "hours": 6.9347, "text": "Contango - Devlog #8 (final devlog?) The latest version of Contango (v. 0.1.1) been is released on PyPI. What Changed? Rule-based strategies and Cartesian Sweeps Strategies can be created using a rule-based system that allows them to be swept over all combinations in a Cartesian Search. This is especially useful for finding a broad spectrum of tuned parameters after creating & coding a strategy concept. Documentation The documentation has been expanded to give direct tutorials on how to set up strategies and make additions to the framework without touching any of its internals. Further, the documentation now has in-depth explanations on the public AND private API. Other The graphs now have a GraphType subclass - essentially, graphs can now be added to or removed by the user if this is desired. This eliminates the hardcoding and confusing behavior that the graphs had prior to this change. Unit tests created for just about everything that needs it. General maturing of the framework, whether that be creating modular components, exposing or hiding certain details from the user, or creating docstrings for the public and private API. That’s all. This will likely be my last devlog before shipping for the final time. I’m praying to the Gods of Stardance that I can get a 3d printer! We’ll see."}, {"post_id": 62560, "ts": "2026-09-06T00:29:54Z", "hours": 6.6617, "text": "Contango - Devlog #7 Research Research has been rough. I haven’t found any real edge with a calmar ratio above 1.0, nor a sharpe ratio that is statistically meaningful to suggest a somewhat profitable strategy. Cartesian Parameterized Grid Search This system was absolutely effective in what it did; however, I’ve concluded that using brute-force to generate strategies does not yield any genuine edge. The system was powerful, but honestly hard to use; hence, I came to the decision of deleting it as it did not have much use other than brute-forcing trading strategies. Rule-based Strategies Rule-based strategies, again, allow for strategies to be created with minimal and highly declarative code. The API has improved significantly with less unnecessary generics and more docstrings. It will be the intended system for backtesting strategies rather than using static strategies. They will both coexist, however; the static strategies will be intended to be used for live trading if implemented in the future. Graphs The graph system was relatively ad-hoc, hard to use, and hardcoded; therefore, I have restructured it to take a more composable approach to allow for the user to create & add graphs. The default graphs have not disappeared; however, they can be overridden. New graphs can be subclassed and the user can register & create custom graphs if desirable. Future Finish the graphing system. Fix all of the demo strategies for the new structure. Create new unit tests for the codebase. Publish to PyPI and commit to github. I’m beginning to wrap up the project to get it to a publishable state."}, {"post_id": 55673, "ts": "2026-08-27T17:10:44Z", "hours": 6.5972, "text": "I was wrong . …But that’s okay. Hyper-parameterized Cartesian grid search I built a system capable of searching an enormous strategy space, and the system worked. My original goal was to have computers literally generate trading strategies and hypothesize by themselves through testing all possible indicator combinations. However, simple strategies based on widely known indicators aren’t producing the profitability I was initially looking for. However , this isn’t necessarily bad news - it just means that the system should be used to help hypothesizing rather than automating it entirely. The same system can be used heavily for optimization of a concept. For example, it can completely automate the process of testing if ATR scaling or an RSI confirmation yields better results. Further, I can still find optimal parameters through the grid search for a given strategy. On Overfitting A grid search inherently will find “amazing” results - however, that doesn’t necessarily mean that it would actually perform well in the market. The parallel coordinate graphs, heatmap graphs, and manual walk-forward tests have made it genuinely easy to pick out overfit results, so this accepts part of my hypothesis in the earlier devlogs. Future I finished most of the work I wanted to do. I stress tested the suite, created unit tests, and created the hyper-parameterization system in its entirety. Now is finally the fun part - research. I’m genuinely curious if I’m able to find some profitable strategies with my system, so my future devlogs will likely be related to the research I’m going to conduct. That’s all. Have a great day!"}, {"post_id": 53484, "ts": "2026-08-24T01:40:11Z", "hours": 13.0403, "text": "Devlog #5 - Contango Hyperparameter Cartesian grid search Apparently this isn’t easy to design! Who could have thought? Not me! Jokes aside, this has been a miserable experience. I’ve created two different designs so far. The first one failed outright - far in, I realized that having mutable objects in a nested grid search breaks all of the results, and it wasn’t easy to integrate Callable types with what I had already created, so I scrapped it. Another massive hurdle was trying to find out how to parameterize the rules that indicators must follow (i.e. close crosses above middle bollinger band crosses). The idea here is to have a set of rules, and have each and every one of them parameterized amongst each other to find the best rules in the subset. My current design uses callables to generate fresh instances of both the parameters and indicators used in the hyperparameter grid search. However, another issue has become known to me - how do you derive unique, dynamically created names for each individual parameterized result? My thought is to derive the name of the indicators from the caller (which I have been doing), but on top of that, force all rule-based modules in my codebase to implement an ABC & override repr . This has not been formally implemented yet. Future Finish & finalize the hyperparameter Cartesian grid search strategy. Create unit tests for it. Genuinely take some time to look over the codebase, see what may be confusing for any users, & implement fixes for them (whether it be documentation, simplifying concepts, or creating abstractions for modules). Add quite a lot of documentation. Ship."}, {"post_id": 48243, "ts": "2026-08-16T15:24:07Z", "hours": 6.8711, "text": "Devlog #4 - Contango Rule-based Strategies I found a lot of issues and limitations with them. However, after working for hours coding them, I believe I’ve reached a point where I’m happy with how they’re looking. To summarize, every strategy is composed of rules, where a rule has a condition & action. If the condition is true, the action (intent) is released. In the case of this suite, intents express to buy, sell, create stoploss orders, etc. You can see the syntax in the attached screenshot. Unit testing Unit tests are completely finished! The suite has 290 passing unit tests as of now. Parameterization I’m going to give parameterization another try. Instead of creating another layer on rule-based strategies, I’m going to instead pass indicators (or “streams” as I call them) into a base strategy along with their parameters in an attempt to perform a Cartisan hyperparameter grid search for both the indicators and their parameters. That was a mouthful to say; however, I’ll demonstrate what I mean in the next devlog (hopefully). Future As always, I like to document what I want to accomplish before shipping: Start & finish the Cartisan hyperparameter grid search API, along with testing it. Fix up documentation (there are major gaps at this point in my development from alpha v.0.1.0). Release on PyPI. That’s it. Happy coding!"}, {"post_id": 46293, "ts": "2026-08-13T12:50:56Z", "hours": 7.9789, "text": "Devlog #3 - Contango Rule-based Strategies I completed the rule-based strategy engine, and it seems to be yielding correct results with integration tests. It allows for both Cartesian Parameterization & indicator parameterization, mentioned in the previous devlog. Unit tests I’ve noticed that as I make more changes, my unit tests have been lacking. The majority of the time for this devlog has been spent creating unit tests for my code. This has proved to be very time consuming and tedious (it always is), and has taken more than five hours at this point. However, I’m only halfway done, so this might take a while longer… Future I always like to make a list for what I want to do before shipping. Here’s where I’m at now: Finish unit tests & fix any issues they reveal Manually test everything myself by creating example strategies Document everything (at this point there are massive gaps in documentation from the changes I have made) Release v.0.1.1 on PyPI & then ship That’s all. Have a great rest of your day!"}, {"post_id": 42736, "ts": "2026-08-07T16:30:57Z", "hours": 10.1167, "text": "Devlog #2 - Contango Massive changes have been made relating to strategy creation & the capability of the framework. Creating a strategy An entire Bollinger Band Mean Reversion strategy now looks like this: indicators = { \" bb \" : BollingerBands ( period = period , k = num_std )} rules : Sequence [ Rule [ TradingContext , Intent ]] = [ Rule ( Predicate ( lambda ctx : ctx . event . close < ctx . indicators [ \" bb \" ]. value . lower ), Emit ( EnterLongIntent ( symbol = symbol )) ), Rule ( Predicate ( lambda ctx : ctx . event . close > ctx . indicators [ \" bb \" ]. value . upper ), Emit ( ExitIntent ( symbol = symbol )), ) ] super (). __init__ ( indicators = indicators , rules = rules , position_sizer = AllocationPositionSizer ( size ) ) With this structure, an entire trading strategy can be expressed with a few unequivocal rules. Further, because indicators and their parameters are major components, both can now be parameterized during optimization. That means grid searches can iterate over not only different parameter values, but entirely different indicator combinations. In a favorable environment, this means that with enough computing power, you can automate the creation and development of strategies. However, in practice, real markets make this significantly less straightforward due to overfitting; therefore, human analysis is still essential since larger search spaces dramatically increase the risk of these biases. Nonetheless, this gives a major advantage to manually creating code for each strategy individually. Other things I restructured the file tree to make the codebase easier for new future contributors (including myself) to make changes. I created a rule system for the backtester under the hood that doesn’t hard-code any limitations in preparation for full support of pyramiding, multiple tickers, & short selling. Future There are some things I want to do before shipping. I’ll list them here: Complete the indicator grid search mentioned above. Stress-test everything & create unit tests where necessary. Complete the documentation - especially with strategy creation, which is not definitely extensive enough as of now. Anyway, enough technical talk for this devlog - happy coding!"}, {"post_id": 37644, "ts": "2026-07-30T15:09:38Z", "hours": 24.5403, "text": "Devlog #1 - Contango I have finally released Contango on PyPI! What is Contango? Contango is a full trading engine that helps you build trading strategies. It does all of the heavy lifting - the results, metrics, and the entire trading engine behind the hood. I’ve never created a package on PyPI, so doing this was a massive learning experience - from uploading to TestPyPI to iterating multiple times before I got my pyproject.toml right. I sent one of the graphs generated after testing my project demo out using the package. See the package on PyPI here: https://pypi.org/project/contango/ Have a great rest of your day!"}]...
|
Title: Contango by @igowu | Stardance
Devlogs:
De Title: Contango by @igowu | Stardance
Devlogs:
Devlog #1 - Contango I have finally released Contango on PyPI! What is Contango? Contango is a full trading engine that helps you build trading strategies. It does all of the heavy lifting - the results, metrics, and the entire trading engine behind the hood. I’ve never created a package on PyPI, so doing this was a massive learning experience - from uploading to TestPyPI to iterating multiple times before I got my pyproject.toml right. I sent one of the graphs generated after testing my project demo out using the package. See the package on PyPI here: https://pypi.org/project/contango/ Have a great rest of your day!
Devlog #2 - Contango Massive changes have been made relating to strategy creation & the capability of the framework. Creating a strategy An entire Bollinger Band Mean Reversion strategy now looks like this: indicators = { " bb " : BollingerBands ( period = period , k = num_std )} rules : Sequence [ Rule [ TradingContext , Intent ]] = [ Rule ( Predicate ( lambda ctx : ctx . event . close < ctx . indicators [ " bb " ]. value . lower ), Emit ( EnterLongIntent ( symbol = symbol )) ), Rule ( Predicate ( lambda ctx : ctx . event . close > ctx . indicators [ " bb " ]. value . upper ), Emit ( ExitIntent ( symbol = symbol )), ) ] super (). __init__ ( indicators = indicators , rules = rules , position_sizer = AllocationPositionSizer ( size ) ) With this structure, an entire trading strategy can be expressed with a few unequivocal rules. Further, because indicators and their parameters are major components, both can now be parameterized during optimization. That means grid searches can iterate over not only different parameter values, but entirely different indicator combinations. In a favorable environment, this means that with enough computing power, you can automate the creation and development of strategies. However, in practice, real markets make this significantly less straightforward due to overfitting; therefore, human analysis is still essential since larger search spaces dramatically increase the risk of these biases. Nonetheless, this gives a major advantage to manually creating code for each strategy individually. Other things I restructured the file tree to make the codebase easier for new future contributors (including myself) to make changes. I created a rule system for the backtester under the hood that doesn’t hard-code any limitations in preparation for full support of pyramiding, multiple tickers, & short selling. Future There are some things I want to do before shipping. I’ll list them here: Complete the indicator grid search mentioned above. Stress-test everything & create unit tests where necessary. Complete the documentation - especially with strategy creation, which is not definitely extensive enough as of now. Anyway, enough technical talk for this devlog - happy coding!
Devlog #3 - Contango Rule-based Strategies I completed the rule-based strategy engine, and it seems to be yielding correct results with integration tests. It allows for both Cartesian Parameterization & indicator parameterization, mentioned in the previous devlog. Unit tests I’ve noticed that as I make more changes, my unit tests have been lacking. The majority of the time for this devlog has been spent creating unit tests for my code. This has proved to be very time consuming and tedious (it always is), and has taken more than five hours at this point. However, I’m only halfway done, so this might take a while longer… Future I always like to make a list for what I want to do before shipping. Here’s where I’m at now: Finish unit tests & fix any issues they reveal Manually test everything myself by creating example strategies Document everything (at this point there are massive gaps in documentation from the changes I have made) Release v.0.1.1 on PyPI & then ship That’s all. Have a great rest of your day!
Devlog #4 - Contango Rule-based Strategies I found a lot of issues and limitations with them. However, after working for hours coding them, I believe I’ve reached a point where I’m happy with how they’re looking. To summarize, every strategy is composed of rules, where a rule has a condition & action. If the condition is true, the action (intent) is released. In the case of this suite, intents express to buy, sell, create stoploss orders, etc. You can see the syntax in the attached screenshot. Unit testing Unit tests are completely finished! The suite has 290 passing unit tests as of now. Parameterization I’m going to give parameterization another try. Instead of creating another layer on rule-based strategies, I’m going to instead pass indicators (or “streams” as I call them) into a base strategy along with their parameters in an attempt to perform a Cartisan hyperparameter grid search for both the indicators and their parameters. That was a mouthful to say; however, I’ll demonstrate what I mean in the next devlog (hopefully). Future As always, I like to document what I want to accomplish before shipping: Start & finish the Cartisan hyperparameter grid search API, along with testing it. Fix up documentation (there are major gaps at this point in my development from alpha v.0.1.0). Release on PyPI. That’s it. Happy coding!
Devlog #5 - Contango Hyperparameter Cartesian grid search Apparently this isn’t easy to design! Who could have thought? Not me! Jokes aside, this has been a miserable experience. I’ve created two different designs so far. The first one failed outright - far in, I realized that having mutable objects in a nested grid search breaks all of the results, and it wasn’t easy to integrate Callable types with what I had already created, so I scrapped it. Another massive hurdle was trying to find out how to parameterize the rules that indicators must follow (i.e. close crosses above middle bollinger band crosses). The idea here is to have a set of rules, and have each and every one of them parameterized amongst each other to find the best rules in the subset. My current design uses callables to generate fresh instances of both the parameters and indicators used in the hyperparameter grid search. However, another issue has become known to me - how do you derive unique, dynamically created names for each individual parameterized result? My thought is to derive the name of the indicators from the caller (which I have been doing), but on top of that, force all rule-based modules in my codebase to implement an ABC & override repr . This has not been formally implemented yet. Future Finish & finalize the hyperparameter Cartesian grid search strategy. Create unit tests for it. Genuinely take some time to look over the codebase, see what may be confusing for any users, & implement fixes for them (whether it be documentation, simplifying concepts, or creating abstractions for modules). Add quite a lot of documentation. Ship.
I was wrong . …But that’s okay. Hyper-parameterized Cartesian grid search I built a system capable of searching an enormous strategy space, and the system worked. My original goal was to have computers literally generate trading strategies and hypothesize by themselves through testing all possible indicator combinations. However, simple strategies based on widely known indicators aren’t producing the profitability I was initially looking for. However , this isn’t necessarily bad news - it just means that the system should be used to help hypothesizing rather than automating it entirely. The same system can be used heavily for optimization of a concept. For example, it can completely automate the process of testing if ATR scaling or an RSI confirmation yields better results. Further, I can still find optimal parameters through the grid search for a given strategy. On Overfitting A grid search inherently will find “amazing” results - however, that doesn’t necessarily mean that it would actually perform well in the market. The parallel coordinate graphs, heatmap graphs, and manual walk-forward tests have made it genuinely easy to pick out overfit results, so this accepts part of my hypothesis in the earlier devlogs. Future I finished most of the work I wanted to do. I stress tested the suite, created unit tests, and created the hyper-parameterization system in its entirety. Now is finally the fun part - research. I’m genuinely curious if I’m able to find some profitable strategies with my system, so my future devlogs will likely be related to the research I’m going to conduct. That’s all. Have a great day!
Contango - Devlog #7 Research Research has been rough. I haven’t found any real edge with a calmar ratio above 1.0, nor a sharpe ratio that is statistically meaningful to suggest a somewhat profitable strategy. Cartesian Parameterized Grid Search This system was absolutely effective in what it did; however, I’ve concluded that using brute-force to generate strategies does not yield any genuine edge. The system was powerful, but honestly hard to use; hence, I came to the decision of deleting it as it did not have much use other than brute-forcing trading strategies. Rule-based Strategies Rule-based strategies, again, allow for strategies to be created with minimal and highly declarative code. The API has improved significantly with less unnecessary generics and more docstrings. It will be the intended system for backtesting strategies rather than using static strategies. They will both coexist, however; the static strategies will be intended to be used for live trading if implemented in the future. Graphs The graph system was relatively ad-hoc, hard to use, and hardcoded; therefore, I have restructured it to take a more composable approach to allow for the user to create & add graphs. The default graphs have not disappeared; however, they can be overridden. New graphs can be subclassed and the user can register & create custom graphs if desirable. Future Finish the graphing system. Fix all of the demo strategies for the new structure. Create new unit tests for the codebase. Publish to PyPI and commit to github. I’m beginning to wrap up the project to get it to a publishable state.
Contango - Devlog #8 (final devlog?) The latest version of Contango (v. 0.1.1) been is released on PyPI. What Changed? Rule-based strategies and Cartesian Sweeps Strategies can be created using a rule-based system that allows them to be swept over all combinations in a Cartesian Search. This is especially useful for finding a broad spectrum of tuned parameters after creating & coding a strategy concept. Documentation The documentation has been expanded to give direct tutorials on how to set up strategies and make additions to the framework without touching any of its internals. Further, the documentation now has in-depth explanations on the public AND private API. Other The graphs now have a GraphType subclass - essentially, graphs can now be added to or removed by the user if this is desired. This eliminates the hardcoding and confusing behavior that the graphs had prior to this change. Unit tests created for just about everything that needs it. General maturing of the framework, whether that be creating modular components, exposing or hiding certain details from the user, or creating docstrings for the public and private API. That’s all. This will likely be my last devlog before shipping for the final time. I’m praying to the Gods of Stardance that I can get a 3d printer! We’ll see.
Ships:
Contango Have you ever wanted to create strategies programmatically for the stock market, cryptocurrencies, or anything else related to trading?! Maybe not… But I have! So, what is Contango? Contango is a full trading engine that allows you to make strategies in Python without worrying about any potential biases in your workflow. Instead of focusing on simulation, metrics, results, and graphs, you can avert your focus solely to the quality of the strategies you create. Strategies - what do they look like? Strategies are a part of an event-driven engine. This means that they receive and react to events that are released from a “mode”. A “mode” is anything that handles the logic of the event bus and/or engine - backtesting, live trading, etc. An example of a strategy: class MyStrategy ( Strategy ): """ A very simple strategy outline - not all logic is included. """ def on_market_event ( self , event : MarketDataEvent ) -> None : # Strategy market logic here def on_end ( self ) -> None : ... Results Contango processes the raw events emitted from your strategy and converts them to metrics. These metrics are then used to produce seven unique graphs. Each of these graphs tell you something unique about the strategy, whether it be profitability, risk, drawdown, consistency, win rate, etc. For most modern workflows, this is enough; however, all modules are cleanly decoupled from each other, so raw events or raw metrics can be processed & analyzed however you would like. Challenges Challenges: A massive learning curve. I’ve spent probably 50 hours or more just researching and absorbing the information used in this project. Packaging was difficult to get right, whether it be “missing type stub” warnings or incorrect rendering of my README.md. Documentation was terrible to write. Spending large amounts of time writing English words instead of code that accomplishes something was extremely tedious, yet completely necessary for a shipped project like this. I’m proud of this project Genuinely, this is one of the first big project I’ve ever made. I have never released anything to PyPI, nor shipped something of this scale before. Hackatime only shows 22 hours since I set it up partway through, but Contango’s been my main project since June, and it’s the second largest thing I’ve built. Usage The GitHub has detailed instructions, demos, videos, and more; however, since it’s so short, here is how to install the project & run the built-in demo from any python IDE: pip install contango python -m contango.research.research_strategies.bollinger_band_mean_reversion.runner Final Notes I’ve had a lot of fun with this project, and I hope anyone who sees this enjoys it just as much as me. Happy coding!
Contango I built a Python framework for quantitative research of trading strategies, whether it be backtesting them, tuning parameter combinations, or turning the results into graphs that can easily reveal profitability/risk in strategies. It started as solely a backtesting framework, but it has grown into an entire suite for optimization and analysis. The latest release, v0.1.1, is now on PyPI. What it is It is an event-driven trading framework with two ways to build strategies. Strategy gives you complete control over the framework, while RuleBasedStrategy provides a higher-level interface for expressing trading rules with less boilerplate. On top of that is the research tooling. Contango can run Cartesian parameter sweeps, evaluating every combination of selected parameters rather than forcing you to manually run a strategy over and over. That makes it possible to take a strategy idea and view a whole parameter space in one run. Market data is handled through a local repository that caches OHLCV data, so repeated experiments don’t need to keep downloading the same data. This permits for offline usage once data has previously been downloaded. Yfinance (a data provider) works without setup or an API key, while the data provider system is designed so additional providers can be added without touching codebase’s internals. Possibly the most important part is the graphs. Equity curves, drawdowns, trade-quality metrics, parameter distributions, risk/return views, and more can be generated from the results of a research run. However, the goal isn’t just to analyze the amount of profit the strategy returns. Instead, it’s to make the behavior of the strategy visible by exposing a variety of different risk/trading/drawdown metrics, revealed clearly in the generated graphs. What was hard I spent a lot of time separating components, defining cleaner interfaces (modularity), and deciding where abstraction was beneficial rather than just adding redundancy and boilerplate. The parameter optimization system was another massive difficulty to create. A Cartesian sweep sounds simple on paper; however, the question arises: how do you distinguish all of the strategies from each other? My initial solution was to display all of the parameters for each strategy, but this ended up with strategy names that were way too large to render. Lastly, documentation ended up being much more work than I expected. I wanted someone to be able to use Contango without having to understand how its internals work first, while still having enough documentation available for someone who actually wants to extend the framework. What I’m proud of The part I’m happiest with is that Contango now feels genuinely easy to use after a small learning curve. You can write a strategy, point it at market data, sweep its parameters, and get a collection of research results and visualizations without having to manually glue all of those pieces together. The other thing I’m proud of is the amount of attention that I put into making the project understandable. The public API is documented, the internal API is documented, components have been modularized, and there are now unit tests for essentially everything that needs them. It’s not finished in the sense that no software ever is, but it finally feels complete. How to test it Install it from PyPI: pip install contango Then run the included research demo: python -m contango.research.demo_strategies.cartesian_bollinger_strategy.runner The demo runs a Bollinger Band strategy across a Cartesian grid of parameters and generates performance and parameter-analysis graphs (HTML) that can be reviewed. I want to thank Stardance for this experience - the opportunity to build software while earning rewards and be in such a welcoming community is amazing to me. I’m looking forward to future work with Hackclub!...
|
1793000834.5784483
|
1793087234.5784483
|
|
46825
|
Comet dryer by @Plomyk | Stardance
|
Plomyk
|
0
|
82.99
|
0
|
[]
|
[{"post_id": 79864, "ts": "202 [{"post_id": 79864, "ts": "2026-10-15T17:27:27Z", "hours": 9.5903, "text": "Devblog 9 I made the modeled and printed all the parts! Designing the filament stand took longer than I originally thought it would, and I ended up having to completly remake it, as there turned out to be a bit of issues with my original design. Mainly that: It was too large, and would not fit in my container I decided (for now) not to rotate the spools while drying It likely break under the load of 2 spools, because of a weak spot Why not rotate the spools? Among other than taking up a lot of space, the motors would either be too pricy, large or had way too high RPM, which would be inefficient to slow down. It was hard to find ones that would be readily available, and even then they would arrive too late for me to finish in time Next changes: I will now move onto assembling everything together! Since my last devblog, I also found out, that there is another issue with my PCB. Somehow, I did not fill the zone connecting the trace to the heater pads. While I was able to fix my board manually, I will have to fix this before shipping"}, {"post_id": 75008, "ts": "2026-09-28T20:49:36Z", "hours": 8.845, "text": "Devblog 8 I finally finished the software! The largest change is the new annealing menu. I also just spent over an hour trying to fix a bug that turned out to just be caused by the function being run before one parameter was set. Changes since last devblog: Added the annealing menu Fixed a ton of bugs I run into while making it Cleaned up the code from debug features Next changes: I need to make an enclosure now, after that it will be just mounting the components together, and prepairing it for SHIPPING"}, {"post_id": 74461, "ts": "2026-09-27T12:52:19Z", "hours": 10.1153, "text": "Devblog 7 I soldered all the components on the PCB! And of course after finishing it, I learned that i should have added gate resistors. I then went to unsolder the mosfets and add the resistors, which somehow took me 3 HOURS. Also added support for a fan and motor to rotate the filament so it dries evenly Changes since last devblog: Soldered the PCB Added support for a fan and motor Made a github repository for the project Fixed a bug where scrolling in the settings menu wouldn’t always work Next changes I will add the annealing menu, and after that the software part of the project should be done. Next i will move on to designing the enclosure"}, {"post_id": 70348, "ts": "2026-09-19T00:35:30Z", "hours": 7.2689, "text": "Devblog 6 I finished the PCB and the Color theme selection menu! I had to make the PCB fit in a 100x100mm square to avoid extra charges, and rewrite the Color theme selection menu. I changed the whole menu because the previous one was really buggy and didn’t really look good. I also finally using git correctly, as I did not really understand how to use it before, and have just been stating changes without making any commits. Changes since last devblog: Finished the PCB Rewrote the color selection menu Started using git correctly Next changes I will add the annealing menu and some QOL features, while I wait for the PCB to arrive next week I made a gif to show the color themes, but for some reason it breaks when i upload it ):"}, {"post_id": 65484, "ts": "2026-09-10T17:27:05Z", "hours": 9.4367, "text": "Devblog 5 Almost finished the PCB! I decided to make the components attach from both sides, so that there is only one pcb needed, otherwise the display and rotary encoder would have to be on a seperate board Changes since last devblog: Made a design for the PCB Did some work on the theme selection menu Why is this not the final version? The design I made turned out to be 10mm to wide, causing the price of the pcb to increase by almost 5x somehow… So I will have to change the design to be more vertical. I wish I knew about this before wiring everything and fixing 137 DRC errors and warnings Theme selection menu The theme selection menu is bugged currently, will probably have to change how I had it planned, because the theme previews are a bit too small currently"}, {"post_id": 60410, "ts": "2026-09-02T18:27:46Z", "hours": 9.0603, "text": "Devblog 4 I added 13 different color themes to the display! (It is not fully finished yet, I still need to add a selection menu). Now you can customize the colors to something else if you prefer it from the default colors! Also made the filament drying menu. And fixed quite a bit of bugs that i found while making the changes Changes since last devblog: Added a safety feature, preventing you from starting if the temperature sensor initialization fails Added a menu that displays the current statistics while drying filament Added 13 color themes Updated the UI code to be a lot more variable controlled, instead of hard coded Bugs fixed: Fixed some of the buttons flickering when selecting or unselecting Fixed the remaining drying time : Made it go down instead of changing randomally Fixed an issue where it would pass by in slow motion instead of pausing And probably some other bugs i forgot about… Future changes / things i plan to add: Add a menu for selecting the color theme Add an option to anneal 3d print (this will probably only slightly help with PLA, since the temperature required for other materials is way higher) Make a PCB (?)! The features of this project are probably mostly in place now, so this seems like a good next step. I may also keep the 3D printable PCB (see Devblog 2) as an alternative in case you cannot get a PCB manufactured (I selected a different theme for each picture)"}, {"post_id": 54510, "ts": "2026-08-25T15:16:11Z", "hours": 18.2872, "text": "Devblog 3 I did not know that time past 10 hours between devblogs doesn’t count…. well there goes the last 2 days when i probably did the most work on this project ): I am still working on the UI, since I tried to make it actually good. I have finished a large part of it already, so only the last 2 (currently planed) pages are left. I will probably try to polish it up a lot more than I originally thought I would (as I just realised that stardance ends in september, not in august, so I don’t need to rush it as much), hopefully that will help recover some of the time I lost. What has changed since the last devblog: I have finished the main menu Finished the screen where you select from filament presets or put put your own custom drying settings Made 15 different presets for things possible to dry Begun working on the screen visible while drying Fixed a lot of bugs I encountered while adding new things to the code For now, I will keep working on expanding and polishing the UI further"}, {"post_id": 52259, "ts": "2026-08-22T11:17:21Z", "hours": 6.2414, "text": "Devblog 2 I have done quite a bit since last devblog, mostly trying to design and make a plastic PCB (Just a board to hold the components, without traces) Why not actually make a PCB? The reasoning mostly comes down to it taking too much time. Having never made a PCB before, I would need to learn the software. Not only that, even if I had the PCB already designed, it would have been extremally expensive to order shipping quick enough, for me to be able to do the rest of this project before Stardance ends. (And this scenario assumes I would get the PCB right first try) What else have i been working on? I was able to make a circuit for controlling the 12v components with a 3.3v signal from the MCU Started working on the enclosure for the electronics and wiring Made a prototype of how I want the menu to look Made the text not flash when being overriden Added a temperature and humidity sensor What next? That is pretty much most of what I’ve done. The next part I plan to do is making the menu run on the controller. Probably also slight upgrades to the PCB and some work on the enclosure"}, {"post_id": 49178, "ts": "2026-08-17T20:22:39Z", "hours": 4.1439, "text": "Devblog 1 I was able got the display and rotary encoder to work! This took quite a long time because the encoder was causing issues. I tried to read it’s position with interruptions, but i couldn’t get that to work. Debugging this and trying to get the button on the encoder not to register multiple times when pressed probably slowed me down the most. The next thing I want to figure out is how to control the rest of the components (which will be 12v) with the 3.3v microcontroller"}]...
|
Title: Comet dryer by @Plomyk | Stardance
Devlogs Title: Comet dryer by @Plomyk | Stardance
Devlogs:
Devblog 1 I was able got the display and rotary encoder to work! This took quite a long time because the encoder was causing issues. I tried to read it’s position with interruptions, but i couldn’t get that to work. Debugging this and trying to get the button on the encoder not to register multiple times when pressed probably slowed me down the most. The next thing I want to figure out is how to control the rest of the components (which will be 12v) with the 3.3v microcontroller
Devblog 2 I have done quite a bit since last devblog, mostly trying to design and make a plastic PCB (Just a board to hold the components, without traces) Why not actually make a PCB? The reasoning mostly comes down to it taking too much time. Having never made a PCB before, I would need to learn the software. Not only that, even if I had the PCB already designed, it would have been extremally expensive to order shipping quick enough, for me to be able to do the rest of this project before Stardance ends. (And this scenario assumes I would get the PCB right first try) What else have i been working on? I was able to make a circuit for controlling the 12v components with a 3.3v signal from the MCU Started working on the enclosure for the electronics and wiring Made a prototype of how I want the menu to look Made the text not flash when being overriden Added a temperature and humidity sensor What next? That is pretty much most of what I’ve done. The next part I plan to do is making the menu run on the controller. Probably also slight upgrades to the PCB and some work on the enclosure
Devblog 3 I did not know that time past 10 hours between devblogs doesn’t count…. well there goes the last 2 days when i probably did the most work on this project ): I am still working on the UI, since I tried to make it actually good. I have finished a large part of it already, so only the last 2 (currently planed) pages are left. I will probably try to polish it up a lot more than I originally thought I would (as I just realised that stardance ends in september, not in august, so I don’t need to rush it as much), hopefully that will help recover some of the time I lost. What has changed since the last devblog: I have finished the main menu Finished the screen where you select from filament presets or put put your own custom drying settings Made 15 different presets for things possible to dry Begun working on the screen visible while drying Fixed a lot of bugs I encountered while adding new things to the code For now, I will keep working on expanding and polishing the UI further
Devblog 4 I added 13 different color themes to the display! (It is not fully finished yet, I still need to add a selection menu). Now you can customize the colors to something else if you prefer it from the default colors! Also made the filament drying menu. And fixed quite a bit of bugs that i found while making the changes Changes since last devblog: Added a safety feature, preventing you from starting if the temperature sensor initialization fails Added a menu that displays the current statistics while drying filament Added 13 color themes Updated the UI code to be a lot more variable controlled, instead of hard coded Bugs fixed: Fixed some of the buttons flickering when selecting or unselecting Fixed the remaining drying time : Made it go down instead of changing randomally Fixed an issue where it would pass by in slow motion instead of pausing And probably some other bugs i forgot about… Future changes / things i plan to add: Add a menu for selecting the color theme Add an option to anneal 3d print (this will probably only slightly help with PLA, since the temperature required for other materials is way higher) Make a PCB (?)! The features of this project are probably mostly in place now, so this seems like a good next step. I may also keep the 3D printable PCB (see Devblog 2) as an alternative in case you cannot get a PCB manufactured (I selected a different theme for each picture)
Devblog 5 Almost finished the PCB! I decided to make the components attach from both sides, so that there is only one pcb needed, otherwise the display and rotary encoder would have to be on a seperate board Changes since last devblog: Made a design for the PCB Did some work on the theme selection menu Why is this not the final version? The design I made turned out to be 10mm to wide, causing the price of the pcb to increase by almost 5x somehow… So I will have to change the design to be more vertical. I wish I knew about this before wiring everything and fixing 137 DRC errors and warnings Theme selection menu The theme selection menu is bugged currently, will probably have to change how I had it planned, because the theme previews are a bit too small currently
Devblog 6 I finished the PCB and the Color theme selection menu! I had to make the PCB fit in a 100x100mm square to avoid extra charges, and rewrite the Color theme selection menu. I changed the whole menu because the previous one was really buggy and didn’t really look good. I also finally using git correctly, as I did not really understand how to use it before, and have just been stating changes without making any commits. Changes since last devblog: Finished the PCB Rewrote the color selection menu Started using git correctly Next changes I will add the annealing menu and some QOL features, while I wait for the PCB to arrive next week I made a gif to show the color themes, but for some reason it breaks when i upload it ):
Devblog 7 I soldered all the components on the PCB! And of course after finishing it, I learned that i should have added gate resistors. I then went to unsolder the mosfets and add the resistors, which somehow took me 3 HOURS. Also added support for a fan and motor to rotate the filament so it dries evenly Changes since last devblog: Soldered the PCB Added support for a fan and motor Made a github repository for the project Fixed a bug where scrolling in the settings menu wouldn’t always work Next changes I will add the annealing menu, and after that the software part of the project should be done. Next i will move on to designing the enclosure
Devblog 8 I finally finished the software! The largest change is the new annealing menu. I also just spent over an hour trying to fix a bug that turned out to just be caused by the function being run before one parameter was set. Changes since last devblog: Added the annealing menu Fixed a ton of bugs I run into while making it Cleaned up the code from debug features Next changes: I need to make an enclosure now, after that it will be just mounting the components together, and prepairing it for SHIPPING
Devblog 9 I made the modeled and printed all the parts! Designing the filament stand took longer than I originally thought it would, and I ended up having to completly remake it, as there turned out to be a bit of issues with my original design. Mainly that: It was too large, and would not fit in my container I decided (for now) not to rotate the spools while drying It likely break under the load of 2 spools, because of a weak spot Why not rotate the spools? Among other than taking up a lot of space, the motors would either be too pricy, large or had way too high RPM, which would be inefficient to slow down. It was hard to find ones that would be readily available, and even then they would arrive too late for me to finish in time Next changes: I will now move onto assembling everything together! Since my last devblog, I also found out, that there is another issue with my PCB. Somehow, I did not fill the zone connecting the trace to the heater pads. While I was able to fix my board manually, I will have to fix this before shipping...
|
1792489854.2670753
|
1793094654.2670753
|
|
35444
|
Pip-Boy OS by @DanieleM | Stardance
|
DanieleM
|
0
|
82.88
|
0
|
[]
|
[{"post_id": 79142, "ts": "202 [{"post_id": 79142, "ts": "2026-10-12T20:00:06Z", "hours": 4.5869, "text": "Add-ons! Add-ons!!! Today is my birthday, yayy! 🥳🥳 I wanted to ship the project today, as a gift for myself, but I have to wait just to be sure that everything is ready. For now enjoy this devlog: As no one commented on my last devlog ( https://stardance.hackclub.com/projects/35444/devlogs/64652 ) I decided to take matters in my own hands and add some useful elements to the Project: Firstly I added Input Repetition , now if you hold a button the input gets repeated, this makes scrolling and variables customization so much easier; 🛠️🛠️ My second add-on was a Rad tab in the Fallout 4 UI , as the game never had a Rad-Bar in the Pip-boy I chose to freestyle it, taking some inspiration from the old analogical geiger counters (also I made the “critical” area of the Rad-Bar dynamic: It changes to the complementary RGB color of the main theme, except for white). ☢️ The final element that I added was a Screensaver , it’s similar to the one from Bethesda’s Pip-boy, however mine has some cool details and it shows the temperature and weather, which is pretty cool!!! 🥶"}, {"post_id": 77309, "ts": "2026-10-06T14:30:36Z", "hours": 9.8914, "text": "🎉PIP-BOY OS IS COMPLETED!!!🎉 Ladies and Gentleman, after 70+ hours of coding, I have finally built the last 2 tabs and with that I completed the Version 1.0 of my project.🥳🥳 Now before I ship the software I want to make some changes to make the code more ‘fun’ and enjoyable. During the making of the last tabs I lost track of time and I let my creativity take over , so I already made the first add-on: a geiger counter emulation in the radiation tab☢️☢️ (however it still needs some polishing). I want to add more things, what should I add next? 🔧 Please let me know in the comments"}, {"post_id": 74798, "ts": "2026-09-28T09:01:22Z", "hours": 3.7883, "text": "✨✨ Upgrade to Customization ✨✨ I know I should work on the remaining ‘visual’ tabs of Fallout 4’s UI, however I found in the original files a tab called Settings , it could let the user change some variables while the code is running. I got really excited that I immediately started to work on it. The original code was good, however I had to completley rework the logic. Now you can personalize the UI while the OS is running! Since some elements of the code are loaded before the main loop (like the UI style and Maps) I made the code reset itself (by closing and re-opening) when these specific elements are modified.🔧"}, {"post_id": 73062, "ts": "2026-09-24T09:24:29Z", "hours": 2.1961, "text": "GUESS WHAT, IRL MAP! 🗺️🗺️ Before adding the last DATA elements I forgot to check a piece of the base code: the Real Life Map. To make it work I had to create a Geoapify API Key. It wasn’t that hard and the code worked; however the map was visually a total eyesore so I made it only in black and white ,then inverted its colors and in the end colored it with the selected color scheme. Now the IRL Map matches the Map Style from the games! ☆ : .。. o(≧▽≦)o .。.: ☆"}, {"post_id": 72801, "ts": "2026-09-23T19:16:58Z", "hours": 2.6019, "text": "Fallout New Vegas UI Completed!!!🎉🎉 Today I worked on the Notes tab as it’s the last tab that is present in both UIs. Now everything from the Fallout: New Vegas UI is done (the Local and Global Map are the same but let’s not focus on that🫠🫠). Now I’ll work on adding the missing Fallout 4 tabs in the DATA Menu (Workshop, Stats and ,maybe, Settings)🔧."}, {"post_id": 72355, "ts": "2026-09-22T18:58:09Z", "hours": 2.2489, "text": "📻 Radio Fallout New Vegas Done! 📻 After finishing the Quest tab I decided to work on something easier, so I made the Fallout New Vegas UI for the Radio tab 📻, I also made some small modifications in the footer and in the radio logic🔧. I also implemented the radios from the game, with all the original voicelines that I could find (I couldn’t find Mr. New Vegas’s voicelines, sorry😣). Also because I don’t want no lawsuit from bethesda I ain’t putting the .mp3 files in the github repo , I replaced them with some songs older than my grandma (so they are in the Public Domain)."}, {"post_id": 71931, "ts": "2026-09-21T20:05:25Z", "hours": 6.5219, "text": "Quest Tab Completed! So after completing the INV/ITEMS Menu I passed my weekend working on the Quest Tab, as the base code didn’t have almost any code for the DATA Menu I had to work more. The UIs aren’t a 100% replica of the ones from the games, but they are enough for now. Also, ✨✨ working clock ✨✨"}, {"post_id": 70202, "ts": "2026-09-18T18:09:22Z", "hours": 8.1931, "text": "THE PIP-BOY OS IS IN THE FINAL PHASE The last devlogs were buried by the algorithm so I’m trying a new style and a Catchier name . For what regards the project INV Menù completed, it took more than expected but who cares we are here. Now I only need to complete the DATA Menù and then I’ll patiently wait some more for the review and the hardware shipping."}, {"post_id": 64785, "ts": "2026-09-09T13:26:59Z", "hours": 9.8953, "text": "💲💲 Survival PC 3000: Software Devlog 5 💲💲 Hello, it’s been a month since my last Devlog, I’ve been really busy and I didn’t really did a lot softwarewise, because the hardware funding got rejected 4 times because I’m a dumbass.😅 However I managed to resend the funding request (hoping that someone will accept it) and work on the code. For now I’ve only completed the STATS menu (by adding the General tab to the Fallout: New Vegas UI, and the Perks tab for Fallout 4’s UI✨) and I’m very near to completing the INV/ITEMS menu , for now I’ve: Added a fallback for non-found images or 2D animations ; 🛠️ Made the tabs Dynamic , so that the 2 UI styles have the correct elements in the correct tabs;🔧🔧 Added some more 2D animations , for which I had to find some 3D models on sketchfab and animate them on blender, which was an extremely long and boring process.🫠 the only thing left to do now is creating the fallout new vegas UI, after that I can work on the DATA menu and complete the software. Also if you want to check out my code I finally put a working version for PC on my github repo . All the necessary info on how to start the code are in the README. See y’all soon; @DanieleM"}, {"post_id": 41253, "ts": "2026-08-05T11:06:28Z", "hours": 10.2122, "text": "☢️☢️Survival PC 3000: Software Devlog 4 ☢️☢️ Hello Stardancers, 10 hours have flown by and I’ve almost completed the STATS Menu. Here’s what’s new: Completed Status Subtabs : The EFF and RAD tabs are now exact copies of the original tabs from the Pip-Boy; the radiation counter’s arrow (underneath the line with the 0-1000 scale) is already dynamic and, once I get the hardware, it will work as a Real-time Geiger Counter, showing the data inputted by the Geiger Counter Module (the MIN and MAX values that the model can perceive will become the 0 and 1000 on the radiation counter); 🩻 Completed Perks, S.P.E.C.I.AL. and Skills : With all the images from the game (I’m already working on finding the in-game text); ✨✨✨ Working Map : Ladies and Gentlemen, the Map is now working! I still need to see if the IRL map works, but for now we have the maps from the Commonwealth and the Mojave with and without the markers; regarding the Radio Customization, by the next devlog it should be fully working; 📻 Submenu System Repaired : I easily repaired the submenu system by reworking the ‘tab_manager’ code with some slight modifications; 🔧 Booting sequence repaired : I repaired and implemented the booting sequence of the original code back in July, before the 3rd Devlog, however I forgot to add it there, my bad!😅 As for how I’ve repaired it I’ve simply recalled the code of the booting , aka boot.py, in the main code (main.py) and completely reworked the run() function of boot.py; For now that’s all, I’ll work on the realistic inputs when I’ll get the funding and the parts. Here’s a video of the current state of the project. See y’all soon @DanieleM"}, {"post_id": 38411, "ts": "2026-07-31T19:22:26Z", "hours": 10.7167, "text": "👍👍 Survival PC 3000: Software Devlog 3 👍👍 Hello Stardancers! These last days I’ve been working on the New Vegas/Fallout 3 UI of my project. For now this UI is still a WIP, here’s a quick rundown of what I have to do these next days: I need to create the Radiation(RAD) and Effects(EFF) tabs; The UI change implied a change in the menus and submenus (from the 5 main menus of the original code [ STATS/INV/DATA/MAP/RADIO ] to 3 [ STATS/ITEMS/DATA ], and the moving of RADIO and MAP in DATA) which partially broke the submenu’s system, so I’m currently trying to fix it;🔧 I still need to add the Map and Radio Customization (I’ve added the customization in Configure.py but I’ve yet to make the Customization work. I’ll work on it when worse problems stop appearing I promise);🥲 I still need to modify the code in order to make it work on the custom hardware of the Survival PC 3000 ; Yes, it’s a lot of things to do, however these last few days I’ve been mainly working on finding the assets from Fallout New Vegas, after rummaging through the Fallout Fandom Wiki I found a good 98% of all the images from the game 🎉. I also completed the Condition(CND) menu, which took a lot of time, especially the creation of the vault-boy,for whom I had to crop different images in order to get all the 7 parts (head/face/torso/arms/legs) and all their variations (5 for the face and 2 for the other 6 parts)🫠🫠. Here’s some funny images of the failed vault-boy setup and an image of the completed CND tab, can you guess which is which?🤭"}, {"post_id": 31771, "ts": "2026-07-20T12:45:53Z", "hours": 9.5517, "text": "💾 Survival PC 3000: Software Devlog 2 💾 Hello Stardancers! Today I have some good news and bad news: Good News: These last few days I poured my all into this project and now I can finally say that I fixed all the errors in the code! And I found a file in the original github folder, it’s a Secret Menu !!!🤯🤯 The original author( kelmes1 ), made a python file in order to easily configure and personalize the UI, it even has the Amber color from Fallout New Vegas🥲; Bad News: The errors that I mentioned before were caused by some modifications made by kelmes1, as I looked more into these errors I discovered that the code I’m modifying is a WIP and therefore lacks a ton of assets from the game;😢😢 For now I’m working on the implementation of the New Vegas style in the code, inserting the selection between the two styles in kelmes1’s Secret Menu. See you soon @DanieleM"}, {"post_id": 29551, "ts": "2026-07-16T15:45:10Z", "hours": 2.4711, "text": "🖥️ Survival PC 3000: Software Devlog 1 🖥️ Hello Stardancers! Now that the 3D model is somewhat finished (I forgor to add the Usb and HDMI holes and some support structures for the hardware that I’ll add when I have the pieces) I finally went to the software part. For now I just managed to compile the open-source code that I found online (after an hour of losing my mind🫠🫠) . However today I’m posting so as to let you know my plans for this project: Dual Style: I want to add the Orange New Vegas Style to this code, the user will be able to change between the Original (Fallout 4) and the NV style through a “Secret Menu”;☢️ Radio and Map Customization: I want to put in the “Secret Menu” a selection between the audio and map from the games and the real ones, so you will never lose your way whether you are in the Commonwealth, the Mojave or New York;🏙️ Authentic Inputs: I will try to make the buttons, knob and selection wheel work like in the games, in case this doesn’t work the screen will also be touch. See you soon, @DanieleM"}]...
|
Title: Pip-Boy OS by @DanieleM | Stardance
Devlog Title: Pip-Boy OS by @DanieleM | Stardance
Devlogs:
🖥️ Survival PC 3000: Software Devlog 1 🖥️ Hello Stardancers! Now that the 3D model is somewhat finished (I forgor to add the Usb and HDMI holes and some support structures for the hardware that I’ll add when I have the pieces) I finally went to the software part. For now I just managed to compile the open-source code that I found online (after an hour of losing my mind🫠🫠) . However today I’m posting so as to let you know my plans for this project: Dual Style: I want to add the Orange New Vegas Style to this code, the user will be able to change between the Original (Fallout 4) and the NV style through a “Secret Menu”;☢️ Radio and Map Customization: I want to put in the “Secret Menu” a selection between the audio and map from the games and the real ones, so you will never lose your way whether you are in the Commonwealth, the Mojave or New York;🏙️ Authentic Inputs: I will try to make the buttons, knob and selection wheel work like in the games, in case this doesn’t work the screen will also be touch. See you soon, @DanieleM
💾 Survival PC 3000: Software Devlog 2 💾 Hello Stardancers! Today I have some good news and bad news: Good News: These last few days I poured my all into this project and now I can finally say that I fixed all the errors in the code! And I found a file in the original github folder, it’s a Secret Menu !!!🤯🤯 The original author( kelmes1 ), made a python file in order to easily configure and personalize the UI, it even has the Amber color from Fallout New Vegas🥲; Bad News: The errors that I mentioned before were caused by some modifications made by kelmes1, as I looked more into these errors I discovered that the code I’m modifying is a WIP and therefore lacks a ton of assets from the game;😢😢 For now I’m working on the implementation of the New Vegas style in the code, inserting the selection between the two styles in kelmes1’s Secret Menu. See you soon @DanieleM
👍👍 Survival PC 3000: Software Devlog 3 👍👍 Hello Stardancers! These last days I’ve been working on the New Vegas/Fallout 3 UI of my project. For now this UI is still a WIP, here’s a quick rundown of what I have to do these next days: I need to create the Radiation(RAD) and Effects(EFF) tabs; The UI change implied a change in the menus and submenus (from the 5 main menus of the original code [ STATS/INV/DATA/MAP/RADIO ] to 3 [ STATS/ITEMS/DATA ], and the moving of RADIO and MAP in DATA) which partially broke the submenu’s system, so I’m currently trying to fix it;🔧 I still need to add the Map and Radio Customization (I’ve added the customization in Configure.py but I’ve yet to make the Customization work. I’ll work on it when worse problems stop appearing I promise);🥲 I still need to modify the code in order to make it work on the custom hardware of the Survival PC 3000 ; Yes, it’s a lot of things to do, however these last few days I’ve been mainly working on finding the assets from Fallout New Vegas, after rummaging through the Fallout Fandom Wiki I found a good 98% of all the images from the game 🎉. I also completed the Condition(CND) menu, which took a lot of time, especially the creation of the vault-boy,for whom I had to crop different images in order to get all the 7 parts (head/face/torso/arms/legs) and all their variations (5 for the face and 2 for the other 6 parts)🫠🫠. Here’s some funny images of the failed vault-boy setup and an image of the completed CND tab, can you guess which is which?🤭
☢️☢️Survival PC 3000: Software Devlog 4 ☢️☢️ Hello Stardancers, 10 hours have flown by and I’ve almost completed the STATS Menu. Here’s what’s new: Completed Status Subtabs : The EFF and RAD tabs are now exact copies of the original tabs from the Pip-Boy; the radiation counter’s arrow (underneath the line with the 0-1000 scale) is already dynamic and, once I get the hardware, it will work as a Real-time Geiger Counter, showing the data inputted by the Geiger Counter Module (the MIN and MAX values that the model can perceive will become the 0 and 1000 on the radiation counter); 🩻 Completed Perks, S.P.E.C.I.AL. and Skills : With all the images from the game (I’m already working on finding the in-game text); ✨✨✨ Working Map : Ladies and Gentlemen, the Map is now working! I still need to see if the IRL map works, but for now we have the maps from the Commonwealth and the Mojave with and without the markers; regarding the Radio Customization, by the next devlog it should be fully working; 📻 Submenu System Repaired : I easily repaired the submenu system by reworking the ‘tab_manager’ code with some slight modifications; 🔧 Booting sequence repaired : I repaired and implemented the booting sequence of the original code back in July, before the 3rd Devlog, however I forgot to add it there, my bad!😅 As for how I’ve repaired it I’ve simply recalled the code of the booting , aka boot.py, in the main code (main.py) and completely reworked the run() function of boot.py; For now that’s all, I’ll work on the realistic inputs when I’ll get the funding and the parts. Here’s a video of the current state of the project. See y’all soon @DanieleM
💲💲 Survival PC 3000: Software Devlog 5 💲💲 Hello, it’s been a month since my last Devlog, I’ve been really busy and I didn’t really did a lot softwarewise, because the hardware funding got rejected 4 times because I’m a dumbass.😅 However I managed to resend the funding request (hoping that someone will accept it) and work on the code. For now I’ve only completed the STATS menu (by adding the General tab to the Fallout: New Vegas UI, and the Perks tab for Fallout 4’s UI✨) and I’m very near to completing the INV/ITEMS menu , for now I’ve: Added a fallback for non-found images or 2D animations ; 🛠️ Made the tabs Dynamic , so that the 2 UI styles have the correct elements in the correct tabs;🔧🔧 Added some more 2D animations , for which I had to find some 3D models on sketchfab and animate them on blender, which was an extremely long and boring process.🫠 the only thing left to do now is creating the fallout new vegas UI, after that I can work on the DATA menu and complete the software. Also if you want to check out my code I finally put a working version for PC on my github repo . All the necessary info on how to start the code are in the README. See y’all soon; @DanieleM
THE PIP-BOY OS IS IN THE FINAL PHASE The last devlogs were buried by the algorithm so I’m trying a new style and a Catchier name . For what regards the project INV Menù completed, it took more than expected but who cares we are here. Now I only need to complete the DATA Menù and then I’ll patiently wait some more for the review and the hardware shipping.
Quest Tab Completed! So after completing the INV/ITEMS Menu I passed my weekend working on the Quest Tab, as the base code didn’t have almost any code for the DATA Menu I had to work more. The UIs aren’t a 100% replica of the ones from the games, but they are enough for now. Also, ✨✨ working clock ✨✨
📻 Radio Fallout New Vegas Done! 📻 After finishing the Quest tab I decided to work on something easier, so I made the Fallout New Vegas UI for the Radio tab 📻, I also made some small modifications in the footer and in the radio logic🔧. I also implemented the radios from the game, with all the original voicelines that I could find (I couldn’t find Mr. New Vegas’s voicelines, sorry😣). Also because I don’t want no lawsuit from bethesda I ain’t putting the .mp3 files in the github repo , I replaced them with some songs older than my grandma (so they are in the Public Domain).
Fallout New Vegas UI Completed!!!🎉🎉 Today I worked on the Notes tab as it’s the last tab that is present in both UIs. Now everything from the Fallout: New Vegas UI is done (the Local and Global Map are the same but let’s not focus on that🫠🫠). Now I’ll work on adding the missing Fallout 4 tabs in the DATA Menu (Workshop, Stats and ,maybe, Settings)🔧.
GUESS WHAT, IRL MAP! 🗺️🗺️ Before adding the last DATA elements I forgot to check a piece of the base code: the Real Life Map. To make it work I had to create a Geoapify API Key. It wasn’t that hard and the code worked; however the map was visually a total eyesore so I made it only in black and white ,then inverted its colors and in the end colored it with the selected color scheme. Now the IRL Map matches the Map Style from the games! ☆ : .。. o(≧▽≦)o .。.: ☆
✨✨ Upgrade to Customization ✨✨ I know I should work on the remaining ‘visual’ tabs of Fallout 4’s UI, however I found in the original files a tab called Settings , it could let the user change some variables while the code is running. I got really excited that I immediately started to work on it. The original code was good, however I had to completley rework the logic. Now you can personalize the UI while the OS is running! Since some elements of the code are loaded before the main loop (like the UI style and Maps) I made the code reset itself (by closing and re-opening) when these specific elements are modified.🔧
🎉PIP-BOY OS IS COMPLETED!!!🎉 Ladies and Gentleman, after 70+ hours of coding, I have finally built the last 2 tabs and with that I completed the Version 1.0 of my project.🥳🥳 Now before I ship the software I want to make some changes to make the code more ‘fun’ and enjoyable. During the making of the last tabs I lost track of time and I let my creativity take over , so I already made the first add-on: a geiger counter emulation in the radiation tab☢️☢️ (however it still needs some polishing). I want to add more things, what should I add next? 🔧 Please let me know in the comments
Add-ons! Add-ons!!! Today is my birthday, yayy! 🥳🥳 I wanted to ship the project today, as a gift for myself, but I have to wait just to be sure that everything is ready. For now enjoy this devlog: As no one commented on my last devlog ( https://stardance.hackclub.com/projects/35444/devlogs/64652 ) I decided to take matters in my own hands and add some useful elements to the Project: Firstly I added Input Repetition , now if you hold a button the input gets repeated, this makes scrolling and variables customization so much easier; 🛠️🛠️ My second add-on was a Rad tab in the Fallout 4 UI , as the game never had a Rad-Bar in the Pip-boy I chose to freestyle it, taking some inspiration from the old analogical geiger counters (also I made the “critical” area of the Rad-Bar dynamic: It changes to the complementary RGB color of the main theme, except for white). ☢️ The final element that I added was a Screensaver , it’s similar to the one from Bethesda’s Pip-boy, however mine has some cool details and it shows the temperature and weather, which is pretty cool!!! 🥶...
|
1792677190.2691307
|
1793281990.2691307
|
|
25173
|
Steno by @Gabs | Stardance
|
Gabs
|
1
|
82.49
|
1033
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-13T16:31:17Z", "hours": 62.0, "multiplier": 19.13, "payout": 1033, "blessing": "neutral", "text": "I decided to ship now even if it’s not the stable release because it’s the first time Steno is actually used by some sites, even a few that aren’t mine!! These are: https://gxbs.dev https://steno.gxbs.dev https://aplos.gxbs.dev https://bromb.in https://apx.vanillaos.org (all of these websites have their source code public) The project is ready to be used!!", "repo": "https://github.com/stenopress/steno", "demo": "https://steno.gxbs.dev"}]...
|
[{"post_id": 78840, "ts": "202 [{"post_id": 78840, "ts": "2026-10-11T18:55:08Z", "hours": 3.4686, "text": "Time for Steno 0.14 – Smarter Rebuilds This is a relatively small release, especially compared to 0.13, as the only major changes being: Builds track page dependencies, and steno dev rebuilds only affected pages. Errors include clearer context and recovery guidance. Added incremental-build tests and benchmarks, and removed redundant tests. The whole point of it is to have somewhat “smarter” rebuilds, as mentioned in the title; refreshing dependences only when necessary. Other then that, I have also refreshed Steno’s update to ensure we show all the plugins available. Anyway, that’s all for this version’s devlog, one step closer to RC!!! See ya!"}, {"post_id": 71851, "ts": "2026-09-21T17:30:19Z", "hours": 17.0211, "text": "I’ve decided to release the first version of Steno in over a month. Meet Steno 0.3! This version focuses on the stability of the foundations of Steno. More importantly, the biggest change is the change of modularity inside Steno. I decided to separate the core and tau into two different packages, so we lay the foundation for a future new project that is similar to Steno. At the same time, I have made many different changes across the base, which can include making themes more composable and adding stronger release checks around the packages people actually install. All these changes and many, many more small fixes ensure the stability and maturation of this project. PS: forgot i had to devlog 7 hours ago 😢"}, {"post_id": 46406, "ts": "2026-08-13T16:14:28Z", "hours": 15.1536, "text": "v0.11.0 & 0.12.0 are here!! Since we got 2 releases in this devlog; im not going to include a list like i usually do, I’ll just talk about the highlights. So first of all both of these releases are focused on stabilization; no shiny new features, but on small improvements that improve the quality, and of course bug fixes. We had tau 0.9 where we brought comments, {#let} bindings, {:else} branches for {#each} , component children, whitespace control, and async function/filter calls, we had hashed CSS/JS, dev server improvements FINALLY ** froze and documented the public api fully**, added plugins/themes scaffolding, abd so so so much more of such stuff all across the codebase. Oh and I also made more plugins eheheh and made a post oh hackernews, scary stuff Anyway i should’ve made this devlog about 5 logged hours ago, but it is what it is"}, {"post_id": 40172, "ts": "2026-08-03T16:03:45Z", "hours": 12.3356, "text": "0.10.0 is here! Steno 0.10 improves the development workflow, hardens build reliability, and prepares the public API for the upcoming release candidate Highlights Atomic, deterministic builds with safer recovery Permalinks and secure output-path resolution New production preview command Accessible CLI output, clearer diagnostics, and NO_COLOR Theme selection during project initialization Generated-project and official plugin compatibility tests Transparent benchmarks with enforced performance budgets Refreshed Marketing Minimal design Site is out!! https://steno.gxbs.dev Its still in it’s early stage but, its somewhat out!"}, {"post_id": 33533, "ts": "2026-07-23T15:55:18Z", "hours": 8.2764, "text": "0.9.0 is here!!!!!!!!! Full theme configuration schemas with validation and defaults Per-page configuration overrides through frontmatter Environment-aware development and production configuration Extended head management for scripts, metadata, and Open Graph tags New Marketing Minimal theme Redesigned Docs Minimal with a consistent theme design language Expanded Tau security, unit tests, and real-site integration coverage Bump marked from 18.0.6 to 18.0.7"}, {"post_id": 30585, "ts": "2026-07-18T09:05:01Z", "hours": 10.4642, "text": "v0.7.0 is here! Image Optimisation Plugin (resize, webp, lazy-load) Sitemap + RSS/Atom Generation Plugin Data files (_data/ dir for JSON, YAML, TOML) Draft pages ( draft: true ) Global Vars in config Update default port number to 5735 Add system to change port in case it’s used Redesign the minimalist themes (attached screenshot) Rewrote docs And also this devlog contains bit of the unreleased v0.8.0: .env file support redirects implement support for {@include} directives in templates add schema validation for collection items in templates introduce ‘doctor’ command for project health checks Anyway! That’s all from this times 10 hour review checkmark, see you next time!"}, {"post_id": 27084, "ts": "2026-07-12T10:11:25Z", "hours": 6.9939, "text": "Beta is here!! v0.6.0 bring these new changes: implement incremental builds with caching for unchanged pages implement plugin security configuration to control plugin loading add support for official plugins in onboarding process enhance build performance with concurrent file reading and caching add benchmark scripts and performance budget checks create minimal theme package with basic layout and configuration implement zero-config project resolution and navigation building one step closer to stable :)"}, {"post_id": 18302, "ts": "2026-06-29T12:34:13Z", "hours": 1.8994, "text": "Just released v0.2.0! These are the changes: Lifecycle hooks AST + HTML transform pipeline Plugin system via config.yml (JSR packages) Theme-level plugins Theme config schema with soft defaults Initialize package! Try with deno -Ar jsr@steno/init"}, {"post_id": 16295, "ts": "2026-06-26T14:41:22Z", "hours": 6.8269, "text": "Steno v0.1.0 - Alpha! Worked on many parts of the project, including but not limited to: introducing themes and scribe! new CLI adding test units adding docs a init command All now live on JSR! https://jsr.io/@steno/steno"}]...
|
Title: Steno by @Gabs | Stardance
Devlogs:
Steno Title: Steno by @Gabs | Stardance
Devlogs:
Steno v0.1.0 - Alpha! Worked on many parts of the project, including but not limited to: introducing themes and scribe! new CLI adding test units adding docs a init command All now live on JSR! https://jsr.io/@steno/steno
Just released v0.2.0! These are the changes: Lifecycle hooks AST + HTML transform pipeline Plugin system via config.yml (JSR packages) Theme-level plugins Theme config schema with soft defaults Initialize package! Try with deno -Ar jsr@steno/init
Beta is here!! v0.6.0 bring these new changes: implement incremental builds with caching for unchanged pages implement plugin security configuration to control plugin loading add support for official plugins in onboarding process enhance build performance with concurrent file reading and caching add benchmark scripts and performance budget checks create minimal theme package with basic layout and configuration implement zero-config project resolution and navigation building one step closer to stable :)
v0.7.0 is here! Image Optimisation Plugin (resize, webp, lazy-load) Sitemap + RSS/Atom Generation Plugin Data files (_data/ dir for JSON, YAML, TOML) Draft pages ( draft: true ) Global Vars in config Update default port number to 5735 Add system to change port in case it’s used Redesign the minimalist themes (attached screenshot) Rewrote docs And also this devlog contains bit of the unreleased v0.8.0: .env file support redirects implement support for {@include} directives in templates add schema validation for collection items in templates introduce ‘doctor’ command for project health checks Anyway! That’s all from this times 10 hour review checkmark, see you next time!
0.9.0 is here!!!!!!!!! Full theme configuration schemas with validation and defaults Per-page configuration overrides through frontmatter Environment-aware development and production configuration Extended head management for scripts, metadata, and Open Graph tags New Marketing Minimal theme Redesigned Docs Minimal with a consistent theme design language Expanded Tau security, unit tests, and real-site integration coverage Bump marked from 18.0.6 to 18.0.7
0.10.0 is here! Steno 0.10 improves the development workflow, hardens build reliability, and prepares the public API for the upcoming release candidate Highlights Atomic, deterministic builds with safer recovery Permalinks and secure output-path resolution New production preview command Accessible CLI output, clearer diagnostics, and NO_COLOR Theme selection during project initialization Generated-project and official plugin compatibility tests Transparent benchmarks with enforced performance budgets Refreshed Marketing Minimal design Site is out!! https://steno.gxbs.dev Its still in it’s early stage but, its somewhat out!
v0.11.0 & 0.12.0 are here!! Since we got 2 releases in this devlog; im not going to include a list like i usually do, I’ll just talk about the highlights. So first of all both of these releases are focused on stabilization; no shiny new features, but on small improvements that improve the quality, and of course bug fixes. We had tau 0.9 where we brought comments, {#let} bindings, {:else} branches for {#each} , component children, whitespace control, and async function/filter calls, we had hashed CSS/JS, dev server improvements FINALLY ** froze and documented the public api fully**, added plugins/themes scaffolding, abd so so so much more of such stuff all across the codebase. Oh and I also made more plugins eheheh and made a post oh hackernews, scary stuff Anyway i should’ve made this devlog about 5 logged hours ago, but it is what it is
I’ve decided to release the first version of Steno in over a month. Meet Steno 0.3! This version focuses on the stability of the foundations of Steno. More importantly, the biggest change is the change of modularity inside Steno. I decided to separate the core and tau into two different packages, so we lay the foundation for a future new project that is similar to Steno. At the same time, I have made many different changes across the base, which can include making themes more composable and adding stronger release checks around the packages people actually install. All these changes and many, many more small fixes ensure the stability and maturation of this project. PS: forgot i had to devlog 7 hours ago 😢
Time for Steno 0.14 – Smarter Rebuilds This is a relatively small release, especially compared to 0.13, as the only major changes being: Builds track page dependencies, and steno dev rebuilds only affected pages. Errors include clearer context and recovery guidance. Added incremental-build tests and benchmarks, and removed redundant tests. The whole point of it is to have somewhat “smarter” rebuilds, as mentioned in the title; refreshing dependences only when necessary. Other then that, I have also refreshed Steno’s update to ensure we show all the plugins available. Anyway, that’s all for this version’s devlog, one step closer to RC!!! See ya!
Ships:
I decided to ship now even if it’s not the stable release because it’s the first time Steno is actually used by some sites, even a few that aren’t mine!! These are: https://gxbs.dev https://steno.gxbs.dev https://aplos.gxbs.dev https://bromb.in https://apx.vanillaos.org (all of these websites have their source code public) The project is ready to be used!!...
|
1793087899.3431299
|
1793174299.3431299
|
|
43103
|
Pulse by @Kvin | Stardance
|
Kvin
|
0
|
82.42
|
0
|
[]
|
[{"post_id": 46922, "ts": "202 [{"post_id": 46922, "ts": "2026-08-14T14:03:43Z", "hours": 8.7486, "text": "Controls and the live feed Yesterday I made the globe clickable with those detail cards and the smooth focus transitions. Today I gave the user a proper way to actually control what they are looking at.I built a controls panel that sits in the corner of the HUD. It is a row of toggle buttons, one for each data layer: earthquakes, aurora, ISS, air quality, and submarine cables. Each button has an accent colour that matches the layer’s visual identity, so you know exactly which toggle does what. Tap one and the layer disappears from the globe. Tap it again and it comes back. No reload, no flicker, just instant feedback. The sound control is in the same panel. It cycles through three states: off, on, and muted. Off means the audio is completely disabled. On means the ambient soundscape plays. Muted sits in between, where the audio is technically running but the volume is set to zero, so you can unmute without restarting anything. The live feed was the other big piece today. It sits at the bottom of the HUD and shows a rolling list of events as they happen. Every new quake, every ISS position update, every fresh AQI reading gets pushed into the feed with a timestamp. The entries are prepended, so the newest event sits at the top, and the list caps at six items so it does not overflow and become a scrolling nightmare. I added a subtle animation to new rows: they slide in from the right and fade into place. It is a tiny detail but it gives the feed a sense of momentum, like the globe is actually reporting to you rather than just sitting there. Each entry also has an optional click handler, so you can tap a feed item and trigger the focus-to-detail interaction from yesterday. That means you see the quake appear in the feed, click it, and the globe flies straight to the event with the detail card already open"}, {"post_id": 46389, "ts": "2026-08-13T15:48:06Z", "hours": 8.6381, "text": "UI and fixing focus Yesterday I got the air quality points breathing and glowing. Today I made them clickable. Because a cloud of pulsing dots is only half the story if you cannot actually ask the question: “what is that city and how bad is the air right now?“I built a proper detail card that slides into the HUD when you select something on the globe. It is a reusable component, so the same card can show earthquake data, ISS telemetry, or AQI readings, just with different labels and values. The styling is an accent stripe on the left that matches the point’s colour, monospace numbers, and a close button that dismisses it. The picking logic is the fiddly part. I am using a raycast from the pointer position against the globe and its visible points. But I do not want to pick a point that is hidden behind the planet, so I filter to only the nearest visible point on the front hemisphere. The selection prioritises the closest point to the camera, which means you can click on a cluster and it picks the one you actually meant. Once selected, the camera does a smooth fly‑to. I added an easing function so the globe rotates and zooms in just enough to frame the point, but not so close that you lose context. During that transition, the controls lock so you do not accidentally spin the globe halfway through the animation. Unlock happens when the camera settles, and the detail card appears with all the live data fields populated. The card itself has dynamic key/value rows. For an earthquake you get magnitude, depth, time and location. For a city you get AQI, PM2.5, NO2, and the timestamp of the reading. I also wired up the select and clear callbacks so you can click away or hit close and the card vanishes, the focus resets, and the controls become responsive again."}, {"post_id": 45826, "ts": "2026-08-12T15:34:21Z", "hours": 8.6192, "text": "Air quality has been added! Today I turned my attention to the layer that sits much closer to the ground: the air quality index, or AQI, for cities around the world. I added a proper GPU-driven point cloud. Instead of rendering each city as a flat marker, I built a custom shader that makes every data point glow with intensity and fade softly at the edges, exactly like the aurora points but in a different colour palette. The ingestion logic is now hooked into the Open‑Meteo API, which gives me live AQI readings for hundreds of cities. I parse the response, extract the pollutant concentrations, and map each value to a colour gradient: green for good, yellow for moderate, orange for unhealthy, red for hazardous, and purple for the really nasty stuff. Each point also gets a weight that controls its size and opacity, so the worst‑off cities stand out immediately. But I didn’t want it static. I added an update loop that pulses the points over time, a gentle breathing effect that makes the data feel alive. The breathing speed and amplitude are tied to the AQI value itself, so a city with dangerous air pulses more anxiously than one with clean air. It is a small touch, but it adds a layer of storytelling to the numbers. The points are also queryable. I exposed a set of hooks so you can hover or click a city and pull up its name, AQI reading, and pollutant breakdown. The data pipeline follows the same pattern as the quakes and the aurora: fetch with a timeout, fall back to a sample dataset if the API stumbles, and refresh on a sensible interval."}, {"post_id": 45101, "ts": "2026-08-11T11:31:36Z", "hours": 8.5383, "text": "Aurora comes alive Today I wanted the sky to earn its keep too. The aurora stub has been sitting there doing nothing for too long. I ripped it out and built the real thing from scratch, using the NOAA Ovation grid data as the source. That is the space weather forecast that tells you where the northern lights are actually likely to show up. The layer is now a cloud of glowing points hovering over the poles. I filter the grid to keep only the brightest cells, and I capped the total count so the frame rate stays smooth on slower machines. Each point maps its probability value to three things: colour, opacity and size. High probability gives you that electric green with a hint of magenta at the edges. Low probability fades out to nothing, which is exactly what you want. I added a shimmer animation that drifts over time, so the whole aurora breathes and shifts like it does in the real sky. The data pipeline is the same pattern as the quakes and the ISS: fetch the live feed, race it against a timeout, and fall back to a sample dataset if the API is having a bad moment. No blank sky on first load."}, {"post_id": 44612, "ts": "2026-08-10T14:29:09Z", "hours": 6.8769, "text": "Animate cables Reworked the submarine cables so they actually looks alive. I used additive blending so they glow faintly against the dark globe. I also turned each cable route into a continuous circle path by stitching multi‑hop arcs together without kinks. I also added a small shader‑based point sprite that travels along each cable, so the cables finally feel like they’re carrying data rather than just being drawn on the map."}, {"post_id": 44091, "ts": "2026-08-09T16:59:31Z", "hours": 5.6931, "text": "Theme and HUD styles Today was all CSS. I replaced the bare‑bones main.css. Custom properties for the colour palette and the monospace font are in, plus resets, so the whole thing starts from a clean base. The HUD got the bulk of the work: wordmark, status dot, UTC clock, telemetry panels, legend rows, live feed, layer controls, detail card, and the boot screen are all styled. Added responsive breakpoints for narrower viewports so the panels reflow instead of breaking. It finally looks like a proper dashboard rather than a wireframe."}, {"post_id": 43321, "ts": "2026-08-08T14:51:53Z", "hours": 7.5672, "text": "Built the HUD! I’ve finally changed the hud into something that actually looks like a dashboard. I added the status dot, and wired up both telemetry panels - seismic readouts on the left, ISS lat/lon/alt/vel on the right, plus a legend row for each layer."}, {"post_id": 42583, "ts": "2026-08-07T12:27:20Z", "hours": 6.7967, "text": "Enhance ISS and quake globe visual effects Today was about making those two layers earn their place on the globe. The ISS is now a proper glowing sprite, with additive blending, so it looks like a bright cyan marker instead of a flat dot. Position updates are smoothed so the marker glides rather than snapping, and the trailing orbit line turns from solid to transparent over its length. If the satellite teleports (data gap or API glitch), the trail resets cleanly instead of drawing a spaghetti mess across the world. The quake layer got a bigger overhaul. I swapped the basic point rendering for a custom shader setup that gives each point a soft glow, a bright core, and a gentle breathing pulse based on elapsed time. New events now trigger pooled expanding ring pings that scale and fade out over a couple of seconds, so the globe feels alive when a fresh quake arrives. On first load, a handful of the most recent events are staggered across the first second to give an immediate sense of activity. The whole thing finally feels like a living dashboard rather than a static map."}, {"post_id": 41320, "ts": "2026-08-05T13:45:10Z", "hours": 5.7078, "text": "Data, geo and palette utilities Spent the day on the utils. Now it races every live endpoint against a timeout, then falls back to the local samples if anything fails, so the quake, ISS, aurora and air layers don’t each have to roll their own rescue logic. The geo module finally sorts out the lat/lng‑to‑Vector3 mess and generates proper great‑circle arcs with a lift that grows with distance, so the cables and the ISS trail read as actual orbital paths. Palette centralises all the colour constants and adds helpers for quake magnitude shading, aurora probability, and AQI bands."}, {"post_id": 40667, "ts": "2026-08-04T11:00:36Z", "hours": 4.9897, "text": "live data wiring Today was about stitching everything together. The empty main.js is now a proper startup sequence: scene setup, globe layers, HUD, picking interactions, intro camera dolly, and the render loop - all hooked up in order. The fetch pipelines for earthquakes, ISS, aurora, and air quality are in, each with its own interval and sample fallback so the globe never loads blank. The intro camera dolly in from a bit further out still needs a tiny easing tweak, but it works"}, {"post_id": 40097, "ts": "2026-08-03T14:17:37Z", "hours": 3.1969, "text": "Sample data and atmospheric glow Most of today went into getting the offline fallbacks sorted. I added sample datasets for air quality, aurora, ISS, quakes, cities, and submarine cables so the globe never loads blank, even if every API is down. The bigger job was replacing the atmosphere with a proper dual‑shell Fresnel shader. I wanted a subtle rim glow and a bit of surface haze, so I wrote two custom shaders: a back‑side halo and a front‑side haze."}, {"post_id": 39544, "ts": "2026-08-02T15:51:02Z", "hours": 7.0467, "text": "Globe rendering and scene foundation Today was mostly about getting the visual core solid. I added the full camera, renderer, post‑processing composer, and resize handling, with a quick quality detection switch so it doesn’t melt phones. The earth now uses a “black marble” model: a dark body, and a separate night‑lights layer on top that blends. A fixed sun rig keeps the day‑night terminator moving as the globe rotates, which makes the whole thing feel alive. The starfield got a rewrite too, but it still needs polish, but the foundation finally feels solid."}]...
|
Title: Pulse by @Kvin | Stardance
Devlogs:
Globe Title: Pulse by @Kvin | Stardance
Devlogs:
Globe rendering and scene foundation Today was mostly about getting the visual core solid. I added the full camera, renderer, post‑processing composer, and resize handling, with a quick quality detection switch so it doesn’t melt phones. The earth now uses a “black marble” model: a dark body, and a separate night‑lights layer on top that blends. A fixed sun rig keeps the day‑night terminator moving as the globe rotates, which makes the whole thing feel alive. The starfield got a rewrite too, but it still needs polish, but the foundation finally feels solid.
Sample data and atmospheric glow Most of today went into getting the offline fallbacks sorted. I added sample datasets for air quality, aurora, ISS, quakes, cities, and submarine cables so the globe never loads blank, even if every API is down. The bigger job was replacing the atmosphere with a proper dual‑shell Fresnel shader. I wanted a subtle rim glow and a bit of surface haze, so I wrote two custom shaders: a back‑side halo and a front‑side haze.
live data wiring Today was about stitching everything together. The empty main.js is now a proper startup sequence: scene setup, globe layers, HUD, picking interactions, intro camera dolly, and the render loop - all hooked up in order. The fetch pipelines for earthquakes, ISS, aurora, and air quality are in, each with its own interval and sample fallback so the globe never loads blank. The intro camera dolly in from a bit further out still needs a tiny easing tweak, but it works
Data, geo and palette utilities Spent the day on the utils. Now it races every live endpoint against a timeout, then falls back to the local samples if anything fails, so the quake, ISS, aurora and air layers don’t each have to roll their own rescue logic. The geo module finally sorts out the lat/lng‑to‑Vector3 mess and generates proper great‑circle arcs with a lift that grows with distance, so the cables and the ISS trail read as actual orbital paths. Palette centralises all the colour constants and adds helpers for quake magnitude shading, aurora probability, and AQI bands.
Enhance ISS and quake globe visual effects Today was about making those two layers earn their place on the globe. The ISS is now a proper glowing sprite, with additive blending, so it looks like a bright cyan marker instead of a flat dot. Position updates are smoothed so the marker glides rather than snapping, and the trailing orbit line turns from solid to transparent over its length. If the satellite teleports (data gap or API glitch), the trail resets cleanly instead of drawing a spaghetti mess across the world. The quake layer got a bigger overhaul. I swapped the basic point rendering for a custom shader setup that gives each point a soft glow, a bright core, and a gentle breathing pulse based on elapsed time. New events now trigger pooled expanding ring pings that scale and fade out over a couple of seconds, so the globe feels alive when a fresh quake arrives. On first load, a handful of the most recent events are staggered across the first second to give an immediate sense of activity. The whole thing finally feels like a living dashboard rather than a static map.
Built the HUD! I’ve finally changed the hud into something that actually looks like a dashboard. I added the status dot, and wired up both telemetry panels - seismic readouts on the left, ISS lat/lon/alt/vel on the right, plus a legend row for each layer.
Theme and HUD styles Today was all CSS. I replaced the bare‑bones main.css. Custom properties for the colour palette and the monospace font are in, plus resets, so the whole thing starts from a clean base. The HUD got the bulk of the work: wordmark, status dot, UTC clock, telemetry panels, legend rows, live feed, layer controls, detail card, and the boot screen are all styled. Added responsive breakpoints for narrower viewports so the panels reflow instead of breaking. It finally looks like a proper dashboard rather than a wireframe.
Animate cables Reworked the submarine cables so they actually looks alive. I used additive blending so they glow faintly against the dark globe. I also turned each cable route into a continuous circle path by stitching multi‑hop arcs together without kinks. I also added a small shader‑based point sprite that travels along each cable, so the cables finally feel like they’re carrying data rather than just being drawn on the map.
Aurora comes alive Today I wanted the sky to earn its keep too. The aurora stub has been sitting there doing nothing for too long. I ripped it out and built the real thing from scratch, using the NOAA Ovation grid data as the source. That is the space weather forecast that tells you where the northern lights are actually likely to show up. The layer is now a cloud of glowing points hovering over the poles. I filter the grid to keep only the brightest cells, and I capped the total count so the frame rate stays smooth on slower machines. Each point maps its probability value to three things: colour, opacity and size. High probability gives you that electric green with a hint of magenta at the edges. Low probability fades out to nothing, which is exactly what you want. I added a shimmer animation that drifts over time, so the whole aurora breathes and shifts like it does in the real sky. The data pipeline is the same pattern as the quakes and the ISS: fetch the live feed, race it against a timeout, and fall back to a sample dataset if the API is having a bad moment. No blank sky on first load.
Air quality has been added! Today I turned my attention to the layer that sits much closer to the ground: the air quality index, or AQI, for cities around the world. I added a proper GPU-driven point cloud. Instead of rendering each city as a flat marker, I built a custom shader that makes every data point glow with intensity and fade softly at the edges, exactly like the aurora points but in a different colour palette. The ingestion logic is now hooked into the Open‑Meteo API, which gives me live AQI readings for hundreds of cities. I parse the response, extract the pollutant concentrations, and map each value to a colour gradient: green for good, yellow for moderate, orange for unhealthy, red for hazardous, and purple for the really nasty stuff. Each point also gets a weight that controls its size and opacity, so the worst‑off cities stand out immediately. But I didn’t want it static. I added an update loop that pulses the points over time, a gentle breathing effect that makes the data feel alive. The breathing speed and amplitude are tied to the AQI value itself, so a city with dangerous air pulses more anxiously than one with clean air. It is a small touch, but it adds a layer of storytelling to the numbers. The points are also queryable. I exposed a set of hooks so you can hover or click a city and pull up its name, AQI reading, and pollutant breakdown. The data pipeline follows the same pattern as the quakes and the aurora: fetch with a timeout, fall back to a sample dataset if the API stumbles, and refresh on a sensible interval.
UI and fixing focus Yesterday I got the air quality points breathing and glowing. Today I made them clickable. Because a cloud of pulsing dots is only half the story if you cannot actually ask the question: “what is that city and how bad is the air right now?“I built a proper detail card that slides into the HUD when you select something on the globe. It is a reusable component, so the same card can show earthquake data, ISS telemetry, or AQI readings, just with different labels and values. The styling is an accent stripe on the left that matches the point’s colour, monospace numbers, and a close button that dismisses it. The picking logic is the fiddly part. I am using a raycast from the pointer position against the globe and its visible points. But I do not want to pick a point that is hidden behind the planet, so I filter to only the nearest visible point on the front hemisphere. The selection prioritises the closest point to the camera, which means you can click on a cluster and it picks the one you actually meant. Once selected, the camera does a smooth fly‑to. I added an easing function so the globe rotates and zooms in just enough to frame the point, but not so close that you lose context. During that transition, the controls lock so you do not accidentally spin the globe halfway through the animation. Unlock happens when the camera settles, and the detail card appears with all the live data fields populated. The card itself has dynamic key/value rows. For an earthquake you get magnitude, depth, time and location. For a city you get AQI, PM2.5, NO2, and the timestamp of the reading. I also wired up the select and clear callbacks so you can click away or hit close and the card vanishes, the focus resets, and the controls become responsive again.
Controls and the live feed Yesterday I made the globe clickable with those detail cards and the smooth focus transitions. Today I gave the user a proper way to actually control what they are looking at.I built a controls panel that sits in the corner of the HUD. It is a row of toggle buttons, one for each data layer: earthquakes, aurora, ISS, air quality, and submarine cables. Each button has an accent colour that matches the layer’s visual identity, so you know exactly which toggle does what. Tap one and the layer disappears from the globe. Tap it again and it comes back. No reload, no flicker, just instant feedback. The sound control is in the same panel. It cycles through three states: off, on, and muted. Off means the audio is completely disabled. On means the ambient soundscape plays. Muted sits in between, where the audio is technically running but the volume is set to zero, so you can unmute without restarting anything. The live feed was the other big piece today. It sits at the bottom of the HUD and shows a rolling list of events as they happen. Every new quake, every ISS position update, every fresh AQI reading gets pushed into the feed with a timestamp. The entries are prepended, so the newest event sits at the top, and the list caps at six items so it does not overflow and become a scrolling nightmare. I added a subtle animation to new rows: they slide in from the right and fade into place. It is a tiny detail but it gives the feed a sense of momentum, like the globe is actually reporting to you rather than just sitting there. Each entry also has an optional click handler, so you can tap a feed item and trigger the focus-to-detail interaction from yesterday. That means you see the quake appear in the feed, click it, and the globe flies straight to the event with the detail card already open...
|
1792900201.779633
|
1793764201.779633
|
|
25495
|
18 DOF Hexapod by @FranklinW | Stardance
|
FranklinW
|
0
|
82.38
|
0
|
[]
|
[{"post_id": 72483, "ts": "202 [{"post_id": 72483, "ts": "2026-09-23T01:56:43Z", "hours": 4.6183, "text": "The hexapod is assembled! While I am sad that my initial goal of having it walking is unfortunately not complete, I am at the stage that all is left is programming. The last month has been hectic, but I have now started university. Over the next few months, I aim to bring the hexapod to a demo-worthy state, finding gaps of time between my engineering workload. Anyone who is interested in this project, please feel free to check out the GitHub! It, like this project, is a work in progress, but work will be made (I need this project done before my first Co-op term, lol). I’ve attached an image of the assembled hexapod. Over the next little bit, CAD files will make their way over to the repo, in case anyone is looking to build it. As this is likely my last devlog, I wanted to extend a sincere thank you to the organizers of Stardance. Being able to spend the summer working on a genuinely exciting project, while being surrounded with many others doing the same thing, is an amazing experience. I feel like having this organization helped me make real progress on my project. Good luck to all makers, and watch the GitHub for any (non-regular) updates I manage to fit in! ( https://github.com/franklin-warren/18DOF-Mobile-Hexapod )"}, {"post_id": 46001, "ts": "2026-08-12T21:03:56Z", "hours": 10.145, "text": "The Hexapod’s CAD is DONE! Or at least V1 is finished. I integrated the PCBs into the main shell, added a battery component, put in a bunch of sensors and LEDs, and generally finished up the CAD. This is a pretty big milestone, as I can now 3D print, assemble, program, and test my creation. Over the next few days, I will be taking this guy from the screen into the real world. It’s been a journey, from initial planning, leg design and prototyping, PCB design, and finally outer shell appearance and sensor integration. The most challenging part of the mechanical CAD was making everything fit! The robot is pretty compact, and the electronics take up a ton of space. I ended up hanging the Pi from the top of the robot to get everything to fit. I think I will have enough space for wiring, but it will be close. That is the main reason why every PCB trace is overspecced, so I should, in theory, have minimal temperature rise."}, {"post_id": 39938, "ts": "2026-08-03T08:20:21Z", "hours": 6.7219, "text": "Finished both PCBs and consolidated into THE STACK. This separates high power servos from my sensors. I have DuPont connectors and screw terminals to connect the two boards. I managed to fit the whole thing into the robot and align it such that the IMU is centered in the robot along both the x and y axis. That should help to simplify my data later. While the board intersects right now with the body I will fix that, so it just drops in and screws down. everything has headers and can easily be popped out if something goes wrong."}, {"post_id": 38941, "ts": "2026-08-01T15:37:43Z", "hours": 9.9839, "text": "Started cooking up the PCB routing of the ‘pod. I’ve just about finished up the top board PCB. I would say this is the most complex PCB I’ve done, and Fusion free limits me to 2 layers. I’ve tried to preserve as much of the bottom layer as possible to use as a giant anti-IIC-noise ground plane. Some bottom layer traces are I believe unavoidable, just due to the size constraints (both from the ‘pod’s shell but also the fact that I don’t want to give JLCPBC like $100) that you can see in blue. Design for the robot is slowly wrapping up, there is a slight possibility initial design is completed by the end of the long weekend! Then it’s assembly and as much programming as I can fit in. If you have any name suggestions for this guy, please comment them!"}, {"post_id": 36808, "ts": "2026-07-29T03:10:12Z", "hours": 10.0672, "text": "Finished the schematic for the top board of the PCB. To make the best use of space, I’m splitting the board into two 80x80mm boards, stacked vertically. The top board houses all the sensor/sensor mounts, and the bottom will be purely for servo and PCAs. In an attempt to make my schematic readable, I’ve subdivided it into subareas. Because I only have time for one shot at the board, I’ve exposed pads for each extra GPIO pin on the ESP, as well as adding solder pads for the address select on the sensors. This will allow me to change the IIC address of each sensor if needed. I’ve also included 10 extra GND, 3V3, and simply “blank” header pins for future expansion. The Lidar will be handled by a chassis-mounted Raspberry Pi Zero W, which will also handle real-time IK, cycloidial calculations, and step planning (using the equations I’ve derived earlier)."}, {"post_id": 33946, "ts": "2026-07-24T08:51:12Z", "hours": 10.2347, "text": "Back to the CAD grind. I started making the robot body, before looking at how much time I had left and switching gears to the PCB so it can be ordered. I still have a bunch of work to do on the body, but I used a chunk of time to make some custom footprints and layouts/schematics in fusion electronics (very very annoying and finicky but i got it working). I got STEP files for the microcontrollers from grabCAD and manufacture pages, then placed my footprints around them. Note that the PCB is not how it will go together, I just put all the components down to show the footprints I’ve finished."}, {"post_id": 26426, "ts": "2026-07-11T06:36:02Z", "hours": 9.5647, "text": "Made some good progress. Firstly, I finally fixed the legs. They now move in straight lines, so that the robot can move forward. Turns out I had to rotate by (or to?) 150 degrees for a -30 and 135 for a -45 (off by 180 degrees, which is interesting). I will include my best guess of what is going on, but to be completely honest, my code should not be doing that and I don’t know why it is. To figure this out, I had the very high tech strategy of taping a whiteboard marker to the leg, and tracing the path it drew in stance phase. Long story short, I have validated (on two configurations) that it works (and on the last tests I got super straight, vertical lines, as if my robot had a ruler), and have to get PCBs manufactured so it’s time to move on. I moved to the main body and housing, and got my spider design cooking up. After Fusion “lol nope”d all my loft plans, I made a very sketchy completely blue sketch and divided the loft profile into 4. It worked so I will clean it up tomorrow, then plan electronics mounts. PCB design next week, fingers crossed. Anyway, enjoy a preview of the robot running at you, and some images of a first draft for what it might look like (hopefully not too much like a cybertruck, lol)"}, {"post_id": 25051, "ts": "2026-07-09T00:27:41Z", "hours": 0.795, "text": "As promised, here’s a video of the two legs working together. Interestingly, the middle leg is off by 30 degrees almost exactly, which would explain the “correct” forward legs at zero offset. I have to scour the program though, because I’m still not sure where it is coming from. As far as I know, the inverse kinematics have been working fine."}, {"post_id": 25017, "ts": "2026-07-08T22:53:17Z", "hours": 10.7186, "text": "Currently trying to test a simple walk for interference. I realized when slicing a leg that my MG996R servos would have way too little torque, so I upgraded them to 40kg servos. I settled on a 375mm long robot, with the front leg on a 30 degree angle. I set up a matrix revolve function so that the robot wouldn’t push itself sideways (see very beautiful sketch). However, that revolve function did absolutely horrendous. My robot’s leg traced a ln(x) function in the x, y, and I have genuinely no idea why. Then I tried a very simple coxa offset, and that didn’t work either. I taped a pen to the robot’s leg so that I could see the path that it was walking, and found that for some reason, a zero degree offset produced a straight y (“straight”, the experiment held error). Again, I have genuinely no idea why, as the code I’ve set up should make that test path the red line in my sketch. If you see something I don’t please let me know. Anyway, I wrapped up the 10h by putting together the second leg. I’ll post another devlog shortly (hopefully) that shows (hopefully) a working step gait."}, {"post_id": 23964, "ts": "2026-07-07T06:17:20Z", "hours": 0.3803, "text": "The servo “broke” :(. I started testing different step configurations to allow my robot to not hit itself while walking (kinda important). During this (and of course while I was demoing it walking), my MG996R decided to shut down. I disassembled the leg and opened up the servo, expecting a blown internal circuit, only to see nothing weird. I then tried the same (previously failed command), and it worked. I did some googling and found the culprit was likely thermal overload, and the driver/motor shut itself down so it wouldnt break. The one piece of good news is I now have an excuse to swap in a slightly refined femur backing, and that a leg swap can be completed in under 15 minutes."}, {"post_id": 23648, "ts": "2026-07-06T18:48:03Z", "hours": 7.0069, "text": "It’s Alive! Did way too much math. I got the inverse kinematics fully working, allowing me to get the leg to any (z, y, z) in reach. Then I used python to generate 870 000 points it could reach and plotted a point cloud in CloudCompare. I then derived and implemented a composite cycloid trajectory to have smooth(ish) steps. By the end, I got my test leg to take its very first steps! One video shows a walk mode (there is some shake due to backlash, although I think it will be reduced with ground pressure) and the second shows “run mode”."}, {"post_id": 20312, "ts": "2026-07-01T21:35:52Z", "hours": 2.1481, "text": "Finally got my robot leg V2 done in cad. going to test tonight or tomorrow when the 3d print finishes up. I wired up a test for one leg (three servos, PCA9685 and ESP32). I then coded the configuration for the robot legs, and wrote a quick servo centring program so I could assemble."}]...
|
Title: 18 DOF Hexapod by @FranklinW | Stardance
D Title: 18 DOF Hexapod by @FranklinW | Stardance
Devlogs:
Finally got my robot leg V2 done in cad. going to test tonight or tomorrow when the 3d print finishes up. I wired up a test for one leg (three servos, PCA9685 and ESP32). I then coded the configuration for the robot legs, and wrote a quick servo centring program so I could assemble.
It’s Alive! Did way too much math. I got the inverse kinematics fully working, allowing me to get the leg to any (z, y, z) in reach. Then I used python to generate 870 000 points it could reach and plotted a point cloud in CloudCompare. I then derived and implemented a composite cycloid trajectory to have smooth(ish) steps. By the end, I got my test leg to take its very first steps! One video shows a walk mode (there is some shake due to backlash, although I think it will be reduced with ground pressure) and the second shows “run mode”.
The servo “broke” :(. I started testing different step configurations to allow my robot to not hit itself while walking (kinda important). During this (and of course while I was demoing it walking), my MG996R decided to shut down. I disassembled the leg and opened up the servo, expecting a blown internal circuit, only to see nothing weird. I then tried the same (previously failed command), and it worked. I did some googling and found the culprit was likely thermal overload, and the driver/motor shut itself down so it wouldnt break. The one piece of good news is I now have an excuse to swap in a slightly refined femur backing, and that a leg swap can be completed in under 15 minutes.
Currently trying to test a simple walk for interference. I realized when slicing a leg that my MG996R servos would have way too little torque, so I upgraded them to 40kg servos. I settled on a 375mm long robot, with the front leg on a 30 degree angle. I set up a matrix revolve function so that the robot wouldn’t push itself sideways (see very beautiful sketch). However, that revolve function did absolutely horrendous. My robot’s leg traced a ln(x) function in the x, y, and I have genuinely no idea why. Then I tried a very simple coxa offset, and that didn’t work either. I taped a pen to the robot’s leg so that I could see the path that it was walking, and found that for some reason, a zero degree offset produced a straight y (“straight”, the experiment held error). Again, I have genuinely no idea why, as the code I’ve set up should make that test path the red line in my sketch. If you see something I don’t please let me know. Anyway, I wrapped up the 10h by putting together the second leg. I’ll post another devlog shortly (hopefully) that shows (hopefully) a working step gait.
As promised, here’s a video of the two legs working together. Interestingly, the middle leg is off by 30 degrees almost exactly, which would explain the “correct” forward legs at zero offset. I have to scour the program though, because I’m still not sure where it is coming from. As far as I know, the inverse kinematics have been working fine.
Made some good progress. Firstly, I finally fixed the legs. They now move in straight lines, so that the robot can move forward. Turns out I had to rotate by (or to?) 150 degrees for a -30 and 135 for a -45 (off by 180 degrees, which is interesting). I will include my best guess of what is going on, but to be completely honest, my code should not be doing that and I don’t know why it is. To figure this out, I had the very high tech strategy of taping a whiteboard marker to the leg, and tracing the path it drew in stance phase. Long story short, I have validated (on two configurations) that it works (and on the last tests I got super straight, vertical lines, as if my robot had a ruler), and have to get PCBs manufactured so it’s time to move on. I moved to the main body and housing, and got my spider design cooking up. After Fusion “lol nope”d all my loft plans, I made a very sketchy completely blue sketch and divided the loft profile into 4. It worked so I will clean it up tomorrow, then plan electronics mounts. PCB design next week, fingers crossed. Anyway, enjoy a preview of the robot running at you, and some images of a first draft for what it might look like (hopefully not too much like a cybertruck, lol)
Back to the CAD grind. I started making the robot body, before looking at how much time I had left and switching gears to the PCB so it can be ordered. I still have a bunch of work to do on the body, but I used a chunk of time to make some custom footprints and layouts/schematics in fusion electronics (very very annoying and finicky but i got it working). I got STEP files for the microcontrollers from grabCAD and manufacture pages, then placed my footprints around them. Note that the PCB is not how it will go together, I just put all the components down to show the footprints I’ve finished.
Finished the schematic for the top board of the PCB. To make the best use of space, I’m splitting the board into two 80x80mm boards, stacked vertically. The top board houses all the sensor/sensor mounts, and the bottom will be purely for servo and PCAs. In an attempt to make my schematic readable, I’ve subdivided it into subareas. Because I only have time for one shot at the board, I’ve exposed pads for each extra GPIO pin on the ESP, as well as adding solder pads for the address select on the sensors. This will allow me to change the IIC address of each sensor if needed. I’ve also included 10 extra GND, 3V3, and simply “blank” header pins for future expansion. The Lidar will be handled by a chassis-mounted Raspberry Pi Zero W, which will also handle real-time IK, cycloidial calculations, and step planning (using the equations I’ve derived earlier).
Started cooking up the PCB routing of the ‘pod. I’ve just about finished up the top board PCB. I would say this is the most complex PCB I’ve done, and Fusion free limits me to 2 layers. I’ve tried to preserve as much of the bottom layer as possible to use as a giant anti-IIC-noise ground plane. Some bottom layer traces are I believe unavoidable, just due to the size constraints (both from the ‘pod’s shell but also the fact that I don’t want to give JLCPBC like $100) that you can see in blue. Design for the robot is slowly wrapping up, there is a slight possibility initial design is completed by the end of the long weekend! Then it’s assembly and as much programming as I can fit in. If you have any name suggestions for this guy, please comment them!
Finished both PCBs and consolidated into THE STACK. This separates high power servos from my sensors. I have DuPont connectors and screw terminals to connect the two boards. I managed to fit the whole thing into the robot and align it such that the IMU is centered in the robot along both the x and y axis. That should help to simplify my data later. While the board intersects right now with the body I will fix that, so it just drops in and screws down. everything has headers and can easily be popped out if something goes wrong.
The Hexapod’s CAD is DONE! Or at least V1 is finished. I integrated the PCBs into the main shell, added a battery component, put in a bunch of sensors and LEDs, and generally finished up the CAD. This is a pretty big milestone, as I can now 3D print, assemble, program, and test my creation. Over the next few days, I will be taking this guy from the screen into the real world. It’s been a journey, from initial planning, leg design and prototyping, PCB design, and finally outer shell appearance and sensor integration. The most challenging part of the mechanical CAD was making everything fit! The robot is pretty compact, and the electronics take up a ton of space. I ended up hanging the Pi from the top of the robot to get everything to fit. I think I will have enough space for wiring, but it will be close. That is the main reason why every PCB trace is overspecced, so I should, in theory, have minimal temperature rise.
The hexapod is assembled! While I am sad that my initial goal of having it walking is unfortunately not complete, I am at the stage that all is left is programming. The last month has been hectic, but I have now started university. Over the next few months, I aim to bring the hexapod to a demo-worthy state, finding gaps of time between my engineering workload. Anyone who is interested in this project, please feel free to check out the GitHub! It, like this project, is a work in progress, but work will be made (I need this project done before my first Co-op term, lol). I’ve attached an image of the assembled hexapod. Over the next little bit, CAD files will make their way over to the repo, in case anyone is looking to build it. As this is likely my last devlog, I wanted to extend a sincere thank you to the organizers of Stardance. Being able to spend the summer working on a genuinely exciting project, while being surrounded with many others doing the same thing, is an amazing experience. I feel like having this organization helped me make real progress on my project. Good luck to all makers, and watch the GitHub for any (non-regular) updates I manage to fit in! ( https://github.com/franklin-warren/18DOF-Mobile-Hexapod )...
|
1792706021.9642422
|
1793310821.9642422
|
|
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
|
|
30797
|
CourtQuest by @royg51 | Stardance
|
royg51
|
0
|
82.0
|
0
|
[]
|
[{"post_id": 72076, "ts": "202 [{"post_id": 72076, "ts": "2026-09-22T03:37:49Z", "hours": 5.8194, "text": "Devlog #8 — QA Sandbox & Production Hardening CourtQuest is getting closer to the point where I can stop worrying about whether the foundation works and focus on actually building the product. This week I worked on making testing safer and more realistic by adding an admin-only QA sandbox. Instead of creating random test tournaments in production, admins can now create clearly labeled [QA] tournaments that use the same tournament, bracket, registration, and Google Sheets code paths as real events. The QA tournaments are private by default, isolated from the normal public tournament listings, and designed to be completely disposable. The teardown process also has multiple safety checks so it refuses to delete anything that isn’t explicitly marked as a QA sandbox tournament. I also added automated tests covering: Admin-only access to the QA sandbox QA tournament creation and deletion Public/private visibility isolation Bracket generation Protection against deleting real tournaments Database cleanup after teardown Google Sheets API error handling The project now has a much stronger CI pipeline as well, with TypeScript checks, linting, unit tests, production builds, and Playwright E2E tests running automatically on pull requests. One important thing I learned during this process is that passing a local test doesn’t necessarily prove a third-party integration works in production. Google Sheets is a good example: the automated tests can verify the application logic, but the actual organizer-owned Google Sheet flow still needs to be tested against the production OAuth/API environment. At this point, CourtQuest isn’t “finished” in the sense that there are no more features to build. But the core platform is becoming something I can confidently build on instead of constantly worrying about breaking the foundation. Next up: finish validating the QA sandbox, run the real production Google Sheets flow, and then get back to shipping actual CourtQuest features."}, {"post_id": 63229, "ts": "2026-09-06T22:29:00Z", "hours": 8.3883, "text": "Devlog #7 Continued pushing CourtQuest from a polished tournament platform toward something that could actually be trusted to run real events. This session focused heavily on production-readiness, reliability, and security, with extensive testing of real tournament workflows across players, organizers, referees, spectators, and admins. Found and fixed several important concurrency and edge-case issues involving duplicate registrations, concurrent bracket generation, match completion, referee attribution, tournament lifecycle transitions, email behavior, and session/role changes. Also improved observability and performance by strengthening error reporting, adding missing-service alerts, optimizing hot tournament routes, improving live-state polling, and removing unused dependencies. Enabled RLS across the Supabase databse. Continued validating the redesigned platform through real rendered production builds instead of relying only on code inspection, fixing additional issues discovered in the process. The interactive tournament archive and history experience was also confirmed as CourtQuest’s main signature feature, using real tournament photography, real results, and an evolving timeline rather than artificial 3D content. CourtQuest is now much closer to a real production tournament operating system, with the remaining work focused primarily on deployment configuration, final production checks, and human-gated launch decisions rather than major feature or redesign work."}, {"post_id": 54219, "ts": "2026-08-25T03:18:33Z", "hours": 9.4033, "text": "Devlog #6 Continued rebuilding CourtQuest into a more complete tournament platform, focusing on improving the experience across the entire tournament lifecycle. Redesigned key organizer, referee, player, and spectator workflows, including live scoring, tournament operations, scheduling, check-in, brackets, and tournament health monitoring. Added new features like tournament duplication, waitlist management, schedule conflict detection, and a tournament attention system to help organizers quickly identify issues. Also introduced new broadcast-style experiences, an interactive tournament history timeline, cinematic tournament moments, and a redesigned homepage experience built around real CourtQuest events and media. Continued improving mobile responsiveness, accessibility, reliability, and overall consistency across the platform while testing everything against real workflows. CourtQuest is becoming a much more complete tournament operating system rather than just a tournament website."}, {"post_id": 48668, "ts": "2026-08-17T05:03:26Z", "hours": 7.5111, "text": "Devlog #5 Continued developing CourtQuest with a focus on strengthening the tournament management experience and making the platform more production-ready. Worked on improving tournament workflows across organizers, referees, and players, while refining how different tournament stages, matches, and results are managed. Continued improving the dashboard experience with clearer data presentation and more useful tournament statistics. Also worked through backend and database improvements to make the platform more reliable as the number of tournaments and participants grows. Spent time testing existing workflows, fixing edge cases, and cleaning up smaller issues across the application. CourtQuest is getting much closer to being something that can actually be used to run real tournaments end-to-end, rather than just a prototype."}, {"post_id": 38440, "ts": "2026-07-31T20:11:43Z", "hours": 5.9547, "text": "Devlog #4 Made another large polish pass across CourtQuest with a focus on making the UI feel more cohesive and production-ready. Expanded the new motion system across much more of the application instead of limiting it to the landing page. Added reusable reveal animations, staggered entrances, and smoother transitions for dashboards, authentication pages, registration flows, and organizer views. Continued refining the homepage and CTA section, iterating on the hero composition to improve readability while preserving the photography. Improved consistency across typography, spacing, and visual hierarchy so different sections feel like they’re built from the same design system. Refined organizer and referee interfaces by modernizing presentation without disrupting the underlying tournament management workflows. Reworked organizer tournament statistics into a cleaner dashboard with stronger visual grouping and improved information density. Cleaned up smaller UI details throughout the site, including reducing the prominence of secondary controls that were drawing unnecessary attention. Fixed Content Security Policy configuration so embedded donation forms can load correctly. Continued improving responsive behavior and reducing layout inconsistencies across pages. Overall this session was focused on moving CourtQuest closer to a polished, cohesive sports platform by improving motion, interaction quality, consistency, and overall UX while maintaining a clean production build."}, {"post_id": 33873, "ts": "2026-07-24T04:30:35Z", "hours": 3.6147, "text": "Devlog #3 Been working on CourtQuest and made a lot of progress. Improved the tournament organizer experience with new tools that make player check-in much faster and easier to manage, reducing the amount of manual work during tournament day. Continued polishing the UI/UX across the website with cleaner layouts, better spacing, smoother navigation, and lots of small quality-of-life improvements that make everything feel more intuitive. Added more motion throughout the site with subtle animations, transitions, and a few 3D effects to make the experience feel much more modern and responsive without getting in the way of usability. Also been testing the mobile experience. Still plenty left to build, but CourtQuest is starting to feel like a polished production platform instead of just another tournament website. Excited to keep pushing it forward!"}, {"post_id": 32207, "ts": "2026-07-21T07:01:44Z", "hours": 22.5992, "text": "Over the past few weeks, I’ve been continuing development on CourtQuest, a student-built nonprofit tournament management platform designed to make running sports tournaments easier for organizers and more engaging for players. This update has mainly focused on improving the foundation, expanding features, and pushing CourtQuest closer to a production-ready platform. I’ve been working on a major redesign and refinement pass across the platform, focusing on: Cleaner and more modern UI/UXImproved tournament discovery, Better organizer workflows. More polished dashboards, Smoother interactions and animations, Better mobile responsiveness. The goal is to make CourtQuest feel less like a traditional tournament tool and more like a modern sports platform. Some of the areas being improved: Tournament creation and management, Registration workflows, Participant management, Standings and rankings, Match tracking, Organizer tools, Tournament analytics. I’m also improving qualification visibility in multi-stage tournaments by adding clearer indicators showing exactly where the advancement cutoff is."}, {"post_id": 22471, "ts": "2026-07-04T22:59:57Z", "hours": 18.7128, "text": "Built the foundational full-stack structure for CourtQuest, a tournament management platform for community and nonprofit sports organizations. Set up core architecture using Next.js, TypeScript, Prisma, and PostgreSQL, and began designing the database models for tournaments, users, roles, and matches. Implemented early tournament logic including bracket structure planning, scheduling flow design, and groundwork for live scoring and match tracking. Started building role-based access for organizers, referees, and players, along with initial dashboard layouts for managing tournaments. Worked on authentication flow, backend API structure, and core data relationships to support registrations, payments, and tournament creation. Continued iterating on UI components and system design to support a scalable, end-to-end tournament platform."}]...
|
Title: CourtQuest by @royg51 | Stardance
Devlogs: Title: CourtQuest by @royg51 | Stardance
Devlogs:
Built the foundational full-stack structure for CourtQuest, a tournament management platform for community and nonprofit sports organizations. Set up core architecture using Next.js, TypeScript, Prisma, and PostgreSQL, and began designing the database models for tournaments, users, roles, and matches. Implemented early tournament logic including bracket structure planning, scheduling flow design, and groundwork for live scoring and match tracking. Started building role-based access for organizers, referees, and players, along with initial dashboard layouts for managing tournaments. Worked on authentication flow, backend API structure, and core data relationships to support registrations, payments, and tournament creation. Continued iterating on UI components and system design to support a scalable, end-to-end tournament platform.
Over the past few weeks, I’ve been continuing development on CourtQuest, a student-built nonprofit tournament management platform designed to make running sports tournaments easier for organizers and more engaging for players. This update has mainly focused on improving the foundation, expanding features, and pushing CourtQuest closer to a production-ready platform. I’ve been working on a major redesign and refinement pass across the platform, focusing on: Cleaner and more modern UI/UXImproved tournament discovery, Better organizer workflows. More polished dashboards, Smoother interactions and animations, Better mobile responsiveness. The goal is to make CourtQuest feel less like a traditional tournament tool and more like a modern sports platform. Some of the areas being improved: Tournament creation and management, Registration workflows, Participant management, Standings and rankings, Match tracking, Organizer tools, Tournament analytics. I’m also improving qualification visibility in multi-stage tournaments by adding clearer indicators showing exactly where the advancement cutoff is.
Devlog #3 Been working on CourtQuest and made a lot of progress. Improved the tournament organizer experience with new tools that make player check-in much faster and easier to manage, reducing the amount of manual work during tournament day. Continued polishing the UI/UX across the website with cleaner layouts, better spacing, smoother navigation, and lots of small quality-of-life improvements that make everything feel more intuitive. Added more motion throughout the site with subtle animations, transitions, and a few 3D effects to make the experience feel much more modern and responsive without getting in the way of usability. Also been testing the mobile experience. Still plenty left to build, but CourtQuest is starting to feel like a polished production platform instead of just another tournament website. Excited to keep pushing it forward!
Devlog #4 Made another large polish pass across CourtQuest with a focus on making the UI feel more cohesive and production-ready. Expanded the new motion system across much more of the application instead of limiting it to the landing page. Added reusable reveal animations, staggered entrances, and smoother transitions for dashboards, authentication pages, registration flows, and organizer views. Continued refining the homepage and CTA section, iterating on the hero composition to improve readability while preserving the photography. Improved consistency across typography, spacing, and visual hierarchy so different sections feel like they’re built from the same design system. Refined organizer and referee interfaces by modernizing presentation without disrupting the underlying tournament management workflows. Reworked organizer tournament statistics into a cleaner dashboard with stronger visual grouping and improved information density. Cleaned up smaller UI details throughout the site, including reducing the prominence of secondary controls that were drawing unnecessary attention. Fixed Content Security Policy configuration so embedded donation forms can load correctly. Continued improving responsive behavior and reducing layout inconsistencies across pages. Overall this session was focused on moving CourtQuest closer to a polished, cohesive sports platform by improving motion, interaction quality, consistency, and overall UX while maintaining a clean production build.
Devlog #5 Continued developing CourtQuest with a focus on strengthening the tournament management experience and making the platform more production-ready. Worked on improving tournament workflows across organizers, referees, and players, while refining how different tournament stages, matches, and results are managed. Continued improving the dashboard experience with clearer data presentation and more useful tournament statistics. Also worked through backend and database improvements to make the platform more reliable as the number of tournaments and participants grows. Spent time testing existing workflows, fixing edge cases, and cleaning up smaller issues across the application. CourtQuest is getting much closer to being something that can actually be used to run real tournaments end-to-end, rather than just a prototype.
Devlog #6 Continued rebuilding CourtQuest into a more complete tournament platform, focusing on improving the experience across the entire tournament lifecycle. Redesigned key organizer, referee, player, and spectator workflows, including live scoring, tournament operations, scheduling, check-in, brackets, and tournament health monitoring. Added new features like tournament duplication, waitlist management, schedule conflict detection, and a tournament attention system to help organizers quickly identify issues. Also introduced new broadcast-style experiences, an interactive tournament history timeline, cinematic tournament moments, and a redesigned homepage experience built around real CourtQuest events and media. Continued improving mobile responsiveness, accessibility, reliability, and overall consistency across the platform while testing everything against real workflows. CourtQuest is becoming a much more complete tournament operating system rather than just a tournament website.
Devlog #7 Continued pushing CourtQuest from a polished tournament platform toward something that could actually be trusted to run real events. This session focused heavily on production-readiness, reliability, and security, with extensive testing of real tournament workflows across players, organizers, referees, spectators, and admins. Found and fixed several important concurrency and edge-case issues involving duplicate registrations, concurrent bracket generation, match completion, referee attribution, tournament lifecycle transitions, email behavior, and session/role changes. Also improved observability and performance by strengthening error reporting, adding missing-service alerts, optimizing hot tournament routes, improving live-state polling, and removing unused dependencies. Enabled RLS across the Supabase databse. Continued validating the redesigned platform through real rendered production builds instead of relying only on code inspection, fixing additional issues discovered in the process. The interactive tournament archive and history experience was also confirmed as CourtQuest’s main signature feature, using real tournament photography, real results, and an evolving timeline rather than artificial 3D content. CourtQuest is now much closer to a real production tournament operating system, with the remaining work focused primarily on deployment configuration, final production checks, and human-gated launch decisions rather than major feature or redesign work.
Devlog #8 — QA Sandbox & Production Hardening CourtQuest is getting closer to the point where I can stop worrying about whether the foundation works and focus on actually building the product. This week I worked on making testing safer and more realistic by adding an admin-only QA sandbox. Instead of creating random test tournaments in production, admins can now create clearly labeled [QA] tournaments that use the same tournament, bracket, registration, and Google Sheets code paths as real events. The QA tournaments are private by default, isolated from the normal public tournament listings, and designed to be completely disposable. The teardown process also has multiple safety checks so it refuses to delete anything that isn’t explicitly marked as a QA sandbox tournament. I also added automated tests covering: Admin-only access to the QA sandbox QA tournament creation and deletion Public/private visibility isolation Bracket generation Protection against deleting real tournaments Database cleanup after teardown Google Sheets API error handling The project now has a much stronger CI pipeline as well, with TypeScript checks, linting, unit tests, production builds, and Playwright E2E tests running automatically on pull requests. One important thing I learned during this process is that passing a local test doesn’t necessarily prove a third-party integration works in production. Google Sheets is a good example: the automated tests can verify the application logic, but the actual organizer-owned Google Sheet flow still needs to be tested against the production OAuth/API environment. At this point, CourtQuest isn’t “finished” in the sense that there are no more features to build. But the core platform is becoming something I can confidently build on instead of constantly worrying about breaking the foundation. Next up: finish validating the QA sandbox, run the real production Google Sheets flow, and then get back to shipping actual CourtQuest features....
|
1792562075.339955
|
1793166875.339955
|
|
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....
|
1793004520.288401
|
1793090920.288401
|
|
36597
|
Perihelion by @superheroyrr | Stardance
|
superheroyrr
|
1
|
81.73
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-16T23:18:16Z", "hours": 76.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did I make? This is a gravity simulator written in C++. Right now, it only simulates the solar system, but I am planning on adding more to it in later ships. For detailed instructions on how to use it, see the README, but as a TLDR: when your mouse disappears, use the WASD , Shift , and Space keys to move around. To show your cursor, press Esc . Click anywhere to hide it again. Click on a planet’s outline to select it. When it’s selected, you can press V to change its velocity, then you can press X , Y , or Z to lock to the axis, and click with your mouse to confirm. You can also edit its properties in a window. To unselect it, press the × button in the top center Challenges I finished IB SL Physics with a level 7 (highest one possible), so I naively thought all the physics calculations would be easy enough that I could solve them completely alone. Tbh, it was at first, with the actual gravity part just being the F = Gmm/r^2 equation over and over again. However, with my other features like the spacetime curvature grid, and especially the “Orbit eachother” button, those features required things from university level physics and were complicated. So for these specific physics features, I ended up defaulting to AI to write them. Additionally, figuring out 3D graphics was a challenge and for this, AI and the internet were very useful in figuring those out. I am also glad I used Raylib to code this, since it makes 3D graphics much easier than it normally is. Roadmap for future ships I will consider adding the following in future ships: Black Holes Make the planets rotate Presets other than the solar system Optimize the gravity simulation, right now it lags at around 40 objects Add a bunch of the planets’ moons Add collision detection, so you can smash an asteroid at a planet and see what happens Simulate atmosphere of a planet? There’s probably a lot more that I could add as well, feel free to suggest some features when you vote for this project!", "repo": "https://github.com/agokule/perihelion", "demo": "https://agokule.github.io/perihelion/"}]...
|
[{"post_id": 82477, "ts": "202 [{"post_id": 82477, "ts": "2026-10-24T22:40:16Z", "hours": 5.7328, "text": "So my first ship got rejected because of 2 reasons: I generated my README with AI, which I didn’t know was not allowed They think I generated over 30% of code with AI I personally don’t think that’s the case, but ig I will have to follow it anyways. So in these 5.75 hours, I rewrote my github readme from scratch by hand. I also rewrote a bunch of my code so that it is by hand as well. ㅤ I’d like to specifically talk about the Spherical struct, since I feel it was most interesting. I previously vibe coded it because the math behind it (3D trigonometry) looked too scary. I tried rewriting it from scratch, and actually turns out it’s not too difficult. So in that case, I’m kind of glad my submission got flagged because now I learned something new! ㅤ While rewriting it, I found some weird choices in sort of architecture which the AI made. So I ended up moving things around to fix it. I also deleted the stupidly long comments that it made, like seriously they’re so long they really make the code worse for the most part. I also fixed two small bugs. So yeah, this will be the last devlog I make for sure."}, {"post_id": 76898, "ts": "2026-10-05T00:04:58Z", "hours": 4.1833, "text": "First ship is incoming very soon! In these 4 hours spread out across a whole month (I was too busy with school), I got it deployed as a website! ㅤ You can try it out at https://agokule.github.io/perihelion/ . I’m too lazy rn to upload a proper video, so if you can’t figure out how to use the app, check out my other devlogs. Lmk what you think about the app in the comments! Would this be good to ship, or are there still some things you are dying to see before that happens? How was it? Not very nice tbh. A part of me regrets choosing Raylib instead of SDL3 for this project, bc in my experience it was super easy to just port over an SDL3 project to a website. ㅤ Here it was not that easy. I ended fully refactoring the main file (like just rearranging things into different functions) just for it to work the way I wanted. ㅤ In particular the way it handles keyboard/mouse inputs on a website is soooo weird!! You have to check for them at a specific point in your code between two certain functions, which is weird!! ㅤ There were also a lot of weird niche bugs that were so annoying to find, and it turns many of them were with the way Raylib deals with the web, and I only found out because Claude ended up closely reading the source code for these fixes! ㅤ These were mostly minor nitpicks which AI helped me solve. Now, that this thing is almost done I am very glad. It’s like a huge weight has been lifted off my shoulders."}, {"post_id": 61580, "ts": "2026-09-04T15:41:00Z", "hours": 2.1069, "text": "What would happen if a second Sun randomly spawned in our solar system? Well clearly chaos according to my simulation. So previously, I made a button that automatically sets a velocity so that one object orbits another object, allowing you to easily make planet-moon systems. ㅤ However, what if you wanted to create gravity systems where objects are similar masses, like binary stars, or something like the Pluto-Charon system where clearly they orbit a point outside of each other? ㅤ This is what I set out to implement in this devlog, other than fixing a bug in the spacetime curvature grid where it would jitter around. ㅤ So I’m gonna be honest here, I did basically get AI to do this part for me, that’s not to say I didn’t try at all because I really did. But it turns out this stuff is way outside of high school physics and goes into orbital mechanics. ㅤ I wrote a simple solution which I thought might work, but it didn’t quite. ㅤ So I tried to watch this video to understand how to do it, but couldn’t understand what kind of vector math he was doing. So I basically gave up and got Claude to do it. ㅤ Looking at Claude’s solution, it seems kind of simple in that it’s not using crazy long equations to do things, but at the same time, I don’t think I would have been able to come up with those on my own, so ig it was a good use of AI to speed things up."}, {"post_id": 59165, "ts": "2026-08-31T19:54:12Z", "hours": 3.4219, "text": "I’m back after 2 weeks!!! First I’ll explain why I took a break and then go over what I did in these 3.5 hours. Why I was gone for 2 weeks Basically, I was previously trying to force out 3.5 hours a day to get the FW13 laptop, along with trying to finish this online course so I can get my driver’s license (spending 2 hours a day on that). On top of that I had tuition classes so I can get ahead for next year’s chemistry and math curriculum (probably ~2 hours a day on that). This makes for 8 hours a day of scheduled work. Oh yeah and I wanted to do all of this while still maintaining my health (like going out for a walk everyday and things). ㅤ Obviously, this is a lot of time to commit, but I went ahead with it, thinking of it as a way for me to learn better time management, so that grade 12 will be easy for me. ㅤ However, it turned out to not go the way I thought it would in my mind. You see, no matter what I tried, I just couldn’t get all three of my priorities met. It’s not like a 9-5 job, where you really just have to stay at the office for that timeframe, but then only like 3-4 hours of that is actual focused work. This plan was demanding a full on 8 hours of high focus everyday, which is probably just not possible, without sacrificing too much in my opinion. ㅤ I also realized this was getting in the way my driver’s license and prepping for grade 12, which were probably more important. ㅤ Don’t get me wrong, Stardance is pretty cool and important, but the other 2 things are more important, I think. ㅤ The breaking point came when I finally did reach two of my priorities for 2 days (Stardance and driver’s course). But, it was a very grueling 2 days, and it wasn’t even including anything from tuition. I quickly realized that this was going need a lot more sacrifices than I bargained for. ㅤ So yeah, I took a break. I finished the online course, now I have to do in-car lessons, but the bottleneck for that is now the driving instructor’s availability, now mine. I also tried catching up to the tuition hw (yeah tbh, that didn’t go too well). And I still didn’t touch any of my projects for a bit after that because I was genuinely burnt out. ㅤ But now I’m back! I’m not fully quitting Stardance at all, but now I will work at a slower pace than before. A pace that feels natural to me, rather than forced. Honestly, it might turn out to be the same amount of time as before, just because a bunch of my time has been freed up by finished that driver’s course. But whatever happens, I will finish all of my projects in a way that isn’t so taxing to me mentally and physically. What I actually did in this devlog So for this devlog, I made it so you can edit the velocity using polar coordinates (basically change it via longitude/latitude), as an alternative to x/y/z. ㅤ I initially tried to do this myself by stitching together some math formulas from Reddit, but it didn’t work because I didn’t understand the physics behind them. ㅤ This stuff goes under a field called spherical trigonometry, which is something they don’t usually teach until university math, so I definitely didn’t learn it in grade 11. ㅤ Eventually I gave up and just used Claude to implement the rougher details. However, I have decided to learn a bit of this stuff myself, since it seems like just high school trig but in 3d. Also, because why not!"}, {"post_id": 48408, "ts": "2026-08-16T18:57:36Z", "hours": 6.3819, "text": "Now you can change the velocity and lock it to a specific axis!! Also I upgraded to C++23 from C++20. ㅤ Yeah that feature was a real nightmare to implement, with loads of bugs. That stupid float vs double thing came back to bite me again!!!! I swear bro these things annoy me a lot. How do I do this? I also initially had like no idea how this feature should be implemented, I was sitting there thinking and trying code out for a long time. I eventually decided to change the way velocities are changed entirely, now instead of just clicking and dragging, you press V on the keyboard and click with the mouse to confirm. ㅤ Even after that I had a dilemma about how exactly this axis locking feature should be implemented. I was initially going to cast a ray from the mouse and figure out where it is closest to the axis, however it turns out that is math that goes outside of high school altogether, so I had to scrap that. ㅤ Then I decided to open up Blender and see how it does it’s axis locking when you drag 3D objects around. From Blender I got inspiration for how it works in my program. ㅤ So now once you are editing the velocity, you can press X , Y , or Z to change the velocity going in those respective axes if you want. I also figured a much simpler way than that first method I thought of because of the testing with Blender. AI disclaimer Obviously there had to be some bugs with my code. After having spent a bunch of time struggling through writing the code only to reach some weird bugs, I gave up and did turn to AI. ㅤ I carefully supervised it while it tried to fix my code (I do NOT believe in vibe-coding) and it was actually able to fix it alright. I made a suggestion to edit the code to be cleaner and it listened. The ultimate plot twist I then asked it to add that sky-blue line thing. Now here’s the ultimate plot twist, so you know that float vs double precision error that keeps coming back to me? Well in every previous devlog where it happened, it was Claude who pointed out the issue. Well guess what? This time it was me who found it! The issue was with that line and how it was drawn on screen. ㅤ So yeah. That took a very long time, but it was worth it."}, {"post_id": 47584, "ts": "2026-08-15T15:47:40Z", "hours": 3.3922, "text": "So now you can add objects and change velocities going up and down in the y-axis using up/down arrow keys!! It also shows the flat grid temporarily for these. ㅤ The only thing is that I will probably change how the velocity y-value thing works, because I don’t like it. It’s ironic because that was the thing that took the most amount of time as well."}, {"post_id": 47084, "ts": "2026-08-14T18:35:57Z", "hours": 2.6942, "text": "Here’s what I’ve done: Made it possible to move the flat grid up and down Implemented custom camera controls so that I can better control the experience. This was very difficult at first… until I realized I could just copy paste the code from the library I’m using and just edit that instead 🤦. With this new camera system, I added a feature where you can hold shift and it will slow down for you. More internal refactoring!!! If you’ve been reading my devlogs, you’ll realize that this is like the 5th time or something that I did internal refactoring. To explain, this is my flagship project, as in I’m trying to reach like ~150 hours on this project so that I can get the Framework 13, so I want to take it slowly, so that I can be sure that I can build the features I want to build in an enjoyable manner. This is why I do these things occasionally."}, {"post_id": 46416, "ts": "2026-08-13T16:39:12Z", "hours": 2.6864, "text": "So I added an easy button to make celestial objects orbit another object. To demonstrate this, I recorded a video of me adding 2 moons to Jupiter! I also added a reverse velocity button which is self-explanatory, I didn’t include it in the video because I forgot. I also made it easier to add objects in a previous devlog, but I forgot to include it there."}, {"post_id": 45809, "ts": "2026-08-12T15:07:04Z", "hours": 3.995, "text": "In these 4 hours, I have made the overall experience of switching between objects better by doing these things: Made the camera turn with constant angular speed. Previously, it would sort turn instantly if it needed to make a 180, and then freeze. The camera position is now smoothed out with an easing function instead of linearly moving it Made the grid in the background not jitter when viewing a single planet Set up debugging to work ㅤ The reason this took this long was because for some reason, I was previously using the frame count and a decimal calculated framerate to time out the animations. ㅤ Obviously, mixing decimal numbers with whole numbers wasn’t going to work well, so I had some really weird bugs that sometimes happened and sometimes didn’t. This was literally the motivation for me to setup the debugger! ㅤ Initially I tried to work with the system as it was, but it became tedious fairly quickly, with a lot of if statements, etc. So, I swapped to just using the system time, and it literally just fixed itself almost instantly! That and the code for it ended up being simpler than before! ㅤ The only thing I don’t really like is the grid, and how it kind of jitters, although that will a future problem to solve."}, {"post_id": 44655, "ts": "2026-08-10T15:53:11Z", "hours": 3.9903, "text": "Here’s what I did yesterday: Added a settings editor Added tooltips everywhere Added an intuitive button to deselect the current object"}, {"post_id": 44048, "ts": "2026-08-09T15:47:51Z", "hours": 8.1869, "text": "You might be thinking: “So there’s 8 hours in this devlog, surely there are some major visual changes, right?” Well unfortunately no. I meant to post a smaller devlog the day before yesterday, but I forgot about it yesterday. Now here I am cleaning up that mess. I basically did just the following 3 things: ㅤ Added Nerd Font icons to the UI. This took waaay too long (like 2 hours) since I was spending so much time figuring out how to scale specifically those icons, and nothing else and when I did figure it out, they were all of a sudden misaligned, towards the top left compared to regular text, so I had to realign them to be proper. After all of that, it seems like I might need to make my own font icons, since Nerd Font is mainly designed to be put in a coding IDE, not a random app like this. There are some space things which I want icons for, but aren’t available in Nerd Fonts. Oh well, that’s a problem for future me. ㅤ Now here’s the real timesink that made this devlog 8 hours: so I went on a long sidequest to basically implement CSS position property in this C++ UI library. This was mainly so that it would be way easier to position new UI elements. The next devlog will most likely be about adding new settings UI. Along with that, I also wrote a bunch of helper functions to make it even easier to write new UI components. So basically, the UI got a full refactor. ㅤ And finally, using that UI refactor from above, I added a playback controller at the bottom and moved the object selector to the top. Yes, it is an embarrassingly small amount of user facing changes coming out of this 8 hour devlog, but at least my UI code is easier to maintain!"}, {"post_id": 42195, "ts": "2026-08-06T20:10:57Z", "hours": 2.0506, "text": "Huzzah! I added a skybox (basically the background image). I will admit that this part was basically AI’d, but it was really hard to do it by myself, since it would have required learning GLSL myself, which I didn’t want to do."}, {"post_id": 41540, "ts": "2026-08-05T20:16:31Z", "hours": 4.0603, "text": "So I decided to spend a lot of time refining the velocity changing with the mouse. Also did a smaller refactor to make the code look cleaner. ㅤ The main issue I had previously was that it was jittery when the object was far from coordinates (0, 0, 0). It turns out it was another stupid float vs double precision problem in C++. Yes, very similar to what I faced earlier in this project. ㅤ I will admit that I did use AI to find these bugs and fix them, but I was supervising it very closely and testing it thoroughly. I am also starting to see the limits of AI. Claude now decided to flag a bug which didn’t exist, and when I asked it to refactor, it made the code look worse ironically. I ended up having to do that part myself. ㅤ However, AI was still more of a help than a hindrance, so I will still use it throughout this project. If you are curious, the git commits have more detail about these and they are here ."}, {"post_id": 40192, "ts": "2026-08-03T16:23:30Z", "hours": 4.4261, "text": "So I made it very easy to change the velocity of objects, you can just drag from the cone anywhere now! ㅤ Surprisingly, the hardest part about this was just getting the arrow to draw and also tuning how big it is so that it looks good, but once it was there, it was actually pretty easy to just hook up a click detection. ㅤ Funnily, this 3D library I’m using (Raylib if you’re curious) doesn’t have a builtin “DrawCone()” function. It turns out that to draw a cone, you are supposed to use the DrawCylinder() function and set one of the radiuses to 0! That was really weird to find out."}, {"post_id": 39627, "ts": "2026-08-02T18:59:38Z", "hours": 1.8067, "text": "HEEELP!!!! I added a panel to edit the properties of objects, so I decided to add a bunch of mass to Mercury for fun, now the Sun is orbiting Mercury! This is so trippy especially how much it warped spacetime."}, {"post_id": 38576, "ts": "2026-08-01T01:50:58Z", "hours": 4.5342, "text": "So I fixed some bugs with the warped spacetime grid, and also added a way to add objects to the scene. I haven’t added collision detection yet, so it kind of looks weird but I’ll do that later. ㅤ The reason this took so long is because adding objects kind required a lot of refactoring. Basically, I had to write code for when my objects get copied around, because adding an element to a list in C++ might mean copying it around. This was difficult because raylib is a bit too high level for how it handles these GPU textures and models. ㅤ Now I will add an edit panel to make the new object changeable."}, {"post_id": 37344, "ts": "2026-07-30T00:14:37Z", "hours": 3.7403, "text": "I have just made the grid in the background warp, representing the curvature of spacetime! ㅤ You will probably notice that the grid is smaller and follows you around if you watch the video. This is because I had to. The grid needs to be about this small, otherwise performance is bad. I could make it bigger by making it more spaced out, only if that’s something people would want though. ㅤ This took waaaaaaay too long since I made a very stupid mistake and C++ decided to harshly punish me for it. Well I did promise not to use AI in the next devlog, but I was dealing with a really weird issue with it for like 1.5 hours and I gave up and asked Claude code about it. So you see that screenshot right (you might need to click the next image button)? That was the solution!!!!! Just add = 0 to that line. ㅤ So basically in C++, if you don’t initialize a variable to a value, as I did there, the value of that variable will then basically be whatever happens to be at that memory address, which will initially be some random number. But as the function runs again and again, it will use that previous value, and later on I was doing y += ... so the y-coordinates of the grid were continuously increasing. ㅤ Visually, it looked like the grid wasn’t being drawn, since the y-value instantly went to a huge number. ㅤ Btw that was the only AI help I got for this part, except for the mathematical formula, which I got from Claude as you can see in the background of the screenshot."}, {"post_id": 36699, "ts": "2026-07-28T22:30:28Z", "hours": 1.6914, "text": "tbh, I haven’t been working on this a lot over the last few days because of other projects, but now I have. ㅤ Here’s what I got done: A major refactor on the codebase which will make it easier to later add a preset selection screen. A better selector for celestial objects at the bottom of the screen. ㅤ I’ll be honest, I did write most of the code for these with AI (yeah bummer ik, but really, who likes refactoring code on their own?). Although, I was closely inspecting everything it wrote. ㅤ Now the next thing I will do is make the grid warp with the gravitational field strength to represent space-time getting bent."}, {"post_id": 34312, "ts": "2026-07-24T22:05:19Z", "hours": 1.655, "text": "For this update, I have done 3 things: Added a small outline circle to distant objects so that they are more visible. made it so you can click inside of these circles or on the planet to zoom into it Added a trail behind each planet."}, {"post_id": 33545, "ts": "2026-07-23T16:10:55Z", "hours": 2.4864, "text": "These past ~2.5 hours have been spent on some quality of life features for the app. Mainly these 3: Made every object 5x bigger than its real life size because it turns out the solar system is such a big place, that you kind of have to. Otherwise everything looks too small. Made it so when you switch between planet it has a quick transition period. Added textures to every planet and the sun. This was actually the hardest part, I had to play around with the settings because it would usually apply the texture sideways, or distort it but I got it working anyways."}, {"post_id": 31887, "ts": "2026-07-20T17:16:08Z", "hours": 3.6044, "text": "So in this devlog I’ve done quite a few things to make the overall experience nicer: ㅤ Added a way to pin one object to the center of the screen. Added the Moon and the rest of the planets in the solar system Switched from using light minutes to light seconds for distance measurements because the light minutes values were WAY too small Another annoying bug I had to fix: So there was this bug where the moon would pretty much always just fly out into the abyss as if there was zero gravity applied to it. It was pretty annoying to find out that it because I was using C++‘s float type instead of double . ㅤ What’s the difference? Well basically float gives about 7 decimal points of precision, while double gives about 15. I initially started with float because it is half the memory size of double and in my experience, float gets the job done like 99% of the time. ㅤ However, it turns out I did need more than 7 decimal points. This is because the gravitational force experienced by the Moon is very small, like around 10^-12 (thats 0.(eleven zeroes…)1). Since float can’t hold that value, it just rounded it to zero, causing the moon to fly out in a straight line forever. I’ll be honest, it wasn’t me who figured that out, it was Gemini who did, but pretty much everything else in this devlog was made by me. ㅤ It’s crazy how such a small difference of like 10^-12 can make on a physics engine like this! I hope I don’t have to then switch to C++‘s long double , which has even more precision, that would be insane if I had to go that extreme. I probably would have had to if I didn’t switch from light minutes to light seconds lol."}, {"post_id": 31203, "ts": "2026-07-19T12:36:42Z", "hours": 3.0122, "text": "I got gravity simulation working! Now the Earth is spinning around the Sun! ㅤ I know you can’t see it in the video I posted, but the Earth is there, it’s just that this simulation is drawn to scale, the Earth would actually barely be visible if you were looking from a spacecraft that far away. ㅤ This took quite a while because of this one really stupid bug: basically I store all the distance values in light minutes rather than kilometers or miles because otherwise those values would be too big. However, the physics equations that I’m using expect the values to be in meters, not light minutes. ㅤ So basically, I forgot to convert from light minutes to meters when calculating the gravity acceleration, so those values were too small to change the velocity of the Earth, causing it to go in a straight line forever. ㅤ But now that that is done, I will start adding the rest of the planets and maybe their moons as well to this simulation, then I can look purely at quality of life improvements to improve the interactivity of it. ㅤ This project is turning out to be easier than I expected! Hopefully another challenge doesn’t pop up…"}, {"post_id": 30702, "ts": "2026-07-18T14:29:09Z", "hours": 0.5217, "text": "So I got this cool C library called adjust.h setup for hot code reloading. This means that I can update the code while it’s running , and the changes show up in real time! I know that I am making this a web app, but because the module doesn’t work on web, I will prototype the app on desktop for now."}, {"post_id": 30452, "ts": "2026-07-18T00:26:26Z", "hours": 1.4753, "text": "So in this devlog, I have set up the project with all of its dependencies, it really can take that long when you’re using C++! Right now I just have a basic testing window, but I will quickly fill it in with a preset of the solar system soon, then I’ll be writing physics code for a while."}]...
|
Title: Perihelion by @superheroyrr | Stardance
De Title: Perihelion by @superheroyrr | Stardance
Devlogs:
So in this devlog, I have set up the project with all of its dependencies, it really can take that long when you’re using C++! Right now I just have a basic testing window, but I will quickly fill it in with a preset of the solar system soon, then I’ll be writing physics code for a while.
So I got this cool C library called adjust.h setup for hot code reloading. This means that I can update the code while it’s running , and the changes show up in real time! I know that I am making this a web app, but because the module doesn’t work on web, I will prototype the app on desktop for now.
I got gravity simulation working! Now the Earth is spinning around the Sun! ㅤ I know you can’t see it in the video I posted, but the Earth is there, it’s just that this simulation is drawn to scale, the Earth would actually barely be visible if you were looking from a spacecraft that far away. ㅤ This took quite a while because of this one really stupid bug: basically I store all the distance values in light minutes rather than kilometers or miles because otherwise those values would be too big. However, the physics equations that I’m using expect the values to be in meters, not light minutes. ㅤ So basically, I forgot to convert from light minutes to meters when calculating the gravity acceleration, so those values were too small to change the velocity of the Earth, causing it to go in a straight line forever. ㅤ But now that that is done, I will start adding the rest of the planets and maybe their moons as well to this simulation, then I can look purely at quality of life improvements to improve the interactivity of it. ㅤ This project is turning out to be easier than I expected! Hopefully another challenge doesn’t pop up…
So in this devlog I’ve done quite a few things to make the overall experience nicer: ㅤ Added a way to pin one object to the center of the screen. Added the Moon and the rest of the planets in the solar system Switched from using light minutes to light seconds for distance measurements because the light minutes values were WAY too small Another annoying bug I had to fix: So there was this bug where the moon would pretty much always just fly out into the abyss as if there was zero gravity applied to it. It was pretty annoying to find out that it because I was using C++‘s float type instead of double . ㅤ What’s the difference? Well basically float gives about 7 decimal points of precision, while double gives about 15. I initially started with float because it is half the memory size of double and in my experience, float gets the job done like 99% of the time. ㅤ However, it turns out I did need more than 7 decimal points. This is because the gravitational force experienced by the Moon is very small, like around 10^-12 (thats 0.(eleven zeroes…)1). Since float can’t hold that value, it just rounded it to zero, causing the moon to fly out in a straight line forever. I’ll be honest, it wasn’t me who figured that out, it was Gemini who did, but pretty much everything else in this devlog was made by me. ㅤ It’s crazy how such a small difference of like 10^-12 can make on a physics engine like this! I hope I don’t have to then switch to C++‘s long double , which has even more precision, that would be insane if I had to go that extreme. I probably would have had to if I didn’t switch from light minutes to light seconds lol.
These past ~2.5 hours have been spent on some quality of life features for the app. Mainly these 3: Made every object 5x bigger than its real life size because it turns out the solar system is such a big place, that you kind of have to. Otherwise everything looks too small. Made it so when you switch between planet it has a quick transition period. Added textures to every planet and the sun. This was actually the hardest part, I had to play around with the settings because it would usually apply the texture sideways, or distort it but I got it working anyways.
For this update, I have done 3 things: Added a small outline circle to distant objects so that they are more visible. made it so you can click inside of these circles or on the planet to zoom into it Added a trail behind each planet.
tbh, I haven’t been working on this a lot over the last few days because of other projects, but now I have. ㅤ Here’s what I got done: A major refactor on the codebase which will make it easier to later add a preset selection screen. A better selector for celestial objects at the bottom of the screen. ㅤ I’ll be honest, I did write most of the code for these with AI (yeah bummer ik, but really, who likes refactoring code on their own?). Although, I was closely inspecting everything it wrote. ㅤ Now the next thing I will do is make the grid warp with the gravitational field strength to represent space-time getting bent.
I have just made the grid in the background warp, representing the curvature of spacetime! ㅤ You will probably notice that the grid is smaller and follows you around if you watch the video. This is because I had to. The grid needs to be about this small, otherwise performance is bad. I could make it bigger by making it more spaced out, only if that’s something people would want though. ㅤ This took waaaaaaay too long since I made a very stupid mistake and C++ decided to harshly punish me for it. Well I did promise not to use AI in the next devlog, but I was dealing with a really weird issue with it for like 1.5 hours and I gave up and asked Claude code about it. So you see that screenshot right (you might need to click the next image button)? That was the solution!!!!! Just add = 0 to that line. ㅤ So basically in C++, if you don’t initialize a variable to a value, as I did there, the value of that variable will then basically be whatever happens to be at that memory address, which will initially be some random number. But as the function runs again and again, it will use that previous value, and later on I was doing y += ... so the y-coordinates of the grid were continuously increasing. ㅤ Visually, it looked like the grid wasn’t being drawn, since the y-value instantly went to a huge number. ㅤ Btw that was the only AI help I got for this part, except for the mathematical formula, which I got from Claude as you can see in the background of the screenshot.
So I fixed some bugs with the warped spacetime grid, and also added a way to add objects to the scene. I haven’t added collision detection yet, so it kind of looks weird but I’ll do that later. ㅤ The reason this took so long is because adding objects kind required a lot of refactoring. Basically, I had to write code for when my objects get copied around, because adding an element to a list in C++ might mean copying it around. This was difficult because raylib is a bit too high level for how it handles these GPU textures and models. ㅤ Now I will add an edit panel to make the new object changeable.
HEEELP!!!! I added a panel to edit the properties of objects, so I decided to add a bunch of mass to Mercury for fun, now the Sun is orbiting Mercury! This is so trippy especially how much it warped spacetime.
So I made it very easy to change the velocity of objects, you can just drag from the cone anywhere now! ㅤ Surprisingly, the hardest part about this was just getting the arrow to draw and also tuning how big it is so that it looks good, but once it was there, it was actually pretty easy to just hook up a click detection. ㅤ Funnily, this 3D library I’m using (Raylib if you’re curious) doesn’t have a builtin “DrawCone()” function. It turns out that to draw a cone, you are supposed to use the DrawCylinder() function and set one of the radiuses to 0! That was really weird to find out.
So I decided to spend a lot of time refining the velocity changing with the mouse. Also did a smaller refactor to make the code look cleaner. ㅤ The main issue I had previously was that it was jittery when the object was far from coordinates (0, 0, 0). It turns out it was another stupid float vs double precision problem in C++. Yes, very similar to what I faced earlier in this project. ㅤ I will admit that I did use AI to find these bugs and fix them, but I was supervising it very closely and testing it thoroughly. I am also starting to see the limits of AI. Claude now decided to flag a bug which didn’t exist, and when I asked it to refactor, it made the code look worse ironically. I ended up having to do that part myself. ㅤ However, AI was still more of a help than a hindrance, so I will still use it throughout this project. If you are curious, the git commits have more detail about these and they are here .
Huzzah! I added a skybox (basically the background image). I will admit that this part was basically AI’d, but it was really hard to do it by myself, since it would have required learning GLSL myself, which I didn’t want to do.
You might be thinking: “So there’s 8 hours in this devlog, surely there are some major visual changes, right?” Well unfortunately no. I meant to post a smaller devlog the day before yesterday, but I forgot about it yesterday. Now here I am cleaning up that mess. I basically did just the following 3 things: ㅤ Added Nerd Font icons to the UI. This took waaay too long (like 2 hours) since I was spending so much time figuring out how to scale specifically those icons, and nothing else and when I did figure it out, they were all of a sudden misaligned, towards the top left compared to regular text, so I had to realign them to be proper. After all of that, it seems like I might need to make my own font icons, since Nerd Font is mainly designed to be put in a coding IDE, not a random app like this. There are some space things which I want icons for, but aren’t available in Nerd Fonts. Oh well, that’s a problem for future me. ㅤ Now here’s the real timesink that made this devlog 8 hours: so I went on a long sidequest to basically implement CSS position property in this C++ UI library. This was mainly so that it would be way easier to position new UI elements. The next devlog will most likely be about adding new settings UI. Along with that, I also wrote a bunch of helper functions to make it even easier to write new UI components. So basically, the UI got a full refactor. ㅤ And finally, using that UI refactor from above, I added a playback controller at the bottom and moved the object selector to the top. Yes, it is an embarrassingly small amount of user facing changes coming out of this 8 hour devlog, but at least my UI code is easier to maintain!
Here’s what I did yesterday: Added a settings editor Added tooltips everywhere Added an intuitive button to deselect the current object
In these 4 hours, I have made the overall experience of switching between objects better by doing these things: Made the camera turn with constant angular speed. Previously, it would sort turn instantly if it needed to make a 180, and then freeze. The camera position is now smoothed out with an easing function instead of linearly moving it Made the grid in the background not jitter when viewing a single planet Set up debugging to work ㅤ The reason this took this long was because for some reason, I was previously using the frame count and a decimal calculated framerate to time out the animations. ㅤ Obviously, mixing decimal numbers with whole numbers wasn’t going to work well, so I had some really weird bugs that sometimes happened and sometimes didn’t. This was literally the motivation for me to setup the debugger! ㅤ Initially I tried to work with the system as it was, but it became tedious fairly quickly, with a lot of if statements, etc. So, I swapped to just using the system time, and it literally just fixed itself almost instantly! That and the code for it ended up being simpler than before! ㅤ The only thing I don’t really like is the grid, and how it kind of jitters, although that will a future problem to solve.
So I added an easy button to make celestial objects orbit another object. To demonstrate this, I recorded a video of me adding 2 moons to Jupiter! I also added a reverse velocity button which is self-explanatory, I didn’t include it in the video because I forgot. I also made it easier to add objects in a previous devlog, but I forgot to include it there.
Here’s what I’ve done: Made it possible to move the flat grid up and down Implemented custom camera controls so that I can better control the experience. This was very difficult at first… until I realized I could just copy paste the code from the library I’m using and just edit that instead 🤦. With this new camera system, I added a feature where you can hold shift and it will slow down for you. More internal refactoring!!! If you’ve been reading my devlogs, you’ll realize that this is like the 5th time or something that I did internal refactoring. To explain, this is my flagship project, as in I’m trying to reach like ~150 hours on this project so that I can get the Framework 13, so I want to take it slowly, so that I can be sure that I can build the features I want to build in an enjoyable manner. This is why I do these things occasionally.
So now you can add objects and change velocities going up and down in the y-axis using up/down arrow keys!! It also shows the flat grid temporarily for these. ㅤ The only thing is that I will probably change how the velocity y-value thing works, because I don’t like it. It’s ironic because that was the thing that took the most amount of time as well.
Now you can change the velocity and lock it to a specific axis!! Also I upgraded to C++23 from C++20. ㅤ Yeah that feature was a real nightmare to implement, with loads of bugs. That stupid float vs double thing came back to bite me again!!!! I swear bro these things annoy me a lot. How do I do this? I also initially had like no idea how this feature should be implemented, I was sitting there thinking and trying code out for a long time. I eventually decided to change the way velocities are changed entirely, now instead of just clicking and dragging, you press V on the keyboard and click with the mouse to confirm. ㅤ Even after that I had a dilemma about how exactly this axis locking feature should be implemented. I was initially going to cast a ray from the mouse and figure out where it is closest to the axis, however it turns out that is math that goes outside of high school altogether, so I had to scrap that. ㅤ Then I decided to open up Blender and see how it does it’s axis locking when you drag 3D objects around. From Blender I got inspiration for how it works in my program. ㅤ So now once you are editing the velocity, you can press X , Y , or Z to change the velocity going in those respective axes if you want. I also figured a much simpler way than that first method I thought of because of the testing with Blender. AI disclaimer Obviously there had to be some bugs with my code. After having spent a bunch of time struggling through writing the code only to reach some weird bugs, I gave up and did turn to AI. ㅤ I carefully supervised it while it tried to fix my code (I do NOT believe in vibe-coding) and it was actually able to fix it alright. I made a suggestion to edit the code to be cleaner and it listened. The ultimate plot twist I then asked it to add that sky-blue line thing. Now here’s the ultimate plot twist, so you know that float vs double precision error that keeps coming back to me? Well in every previous devlog where it happened, it was Claude who pointed out the issue. Well guess what? This time it was me who found it! The issue was with that line and how it was drawn on screen. ㅤ So yeah. That took a very long time, but it was worth it.
I’m back after 2 weeks!!! First I’ll explain why I took a break and then go over what I did in these 3.5 hours. Why I was gone for 2 weeks Basically, I was previously trying to force out 3.5 hours a day to get the FW13 laptop, along with trying to finish this online course so I can get my driver’s license (spending 2 hours a day on that). On top of that I had tuition classes so I can get ahead for next year’s chemistry and math curriculum (probably ~2 hours a day on that). This makes for 8 hours a day of scheduled work. Oh yeah and I wanted to do all of this while still maintaining my health (like going out for a walk everyday and things). ㅤ Obviously, this is a lot of time to commit, but I went ahead with it, thinking of it as a way for me to learn better time management, so that grade 12 will be easy for me. ㅤ However, it turned out to not go the way I thought it would in my mind. You see, no matter what I tried, I just couldn’t get all three of my priorities met. It’s not like a 9-5 job, where you really just have to stay at the office for that timeframe, but then only like 3-4 hours of that is actual focused work. This plan was demanding a full on 8 hours of high focus everyday, which is probably just not possible, without sacrificing too much in my opinion. ㅤ I also realized this was getting in the way my driver’s license and prepping for grade 12, which were probably more important. ㅤ Don’t get me wrong, Stardance is pretty cool and important, but the other 2 things are more important, I think. ㅤ The breaking point came when I finally did reach two of my priorities for 2 days (Stardance and driver’s course). But, it was a very grueling 2 days, and it wasn’t even including anything from tuition. I quickly realized that this was going need a lot more sacrifices than I bargained for. ㅤ So yeah, I took a break. I finished the online course, now I have to do in-car lessons, but the bottleneck for that is now the driving instructor’s availability, now mine. I also tried catching up to the tuition hw (yeah tbh, that didn’t go too well). And I still didn’t touch any of my projects for a bit after that because I was genuinely burnt out. ㅤ But now I’m back! I’m not fully quitting Stardance at all, but now I will work at a slower pace than before. A pace that feels natural to me, rather than forced. Honestly, it might turn out to be the same amount of time as before, just because a bunch of my time has been freed up by finished that driver’s course. But whatever happens, I will finish all of my projects in a way that isn’t so taxing to me mentally and physically. What I actually did in this devlog So for this devlog, I made it so you can edit the velocity using polar coordinates (basically change it via longitude/latitude), as an alternative to x/y/z. ㅤ I initially tried to do this myself by stitching together some math formulas from Reddit, but it didn’t work because I didn’t understand the physics behind them. ㅤ This stuff goes under a field called spherical trigonometry, which is something they don’t usually teach until university math, so I definitely didn’t learn it in grade 11. ㅤ Eventually I gave up and just used Claude to implement the rougher details. However, I have decided to learn a bit of this stuff myself, since it seems like just high school trig but in 3d. Also, because why not!
What would happen if a second Sun randomly spawned in our solar system? Well clearly chaos according to my simulation. So previously, I made a button that automatically sets a velocity so that one object orbits another object, allowing you to easily make planet-moon systems. ㅤ However, what if you wanted to create gravity systems where objects are similar masses, like binary stars, or something like the Pluto-Charon system where clearly they orbit a point outside of each other? ㅤ This is what I set out to implement in this devlog, other than fixing a bug in the spacetime curvature grid where it would jitter around. ㅤ So I’m gonna be honest here, I did basically get AI to do this part for me, that’s not to say I didn’t try at all because I really did. But it turns out this stuff is way outside of high school physics and goes into orbital mechanics. ㅤ I wrote a simple solution which I thought might work, but it didn’t quite. ㅤ So I tried to watch this video to understand how to do it, but couldn’t understand what kind of vector math he was doing. So I basically gave up and got Claude to do it. ㅤ Looking at Claude’s solution, it seems kind of simple in that it’s not using crazy long equations to do things, but at the same time, I don’t think I would have been able to come up with those on my own, so ig it was a good use of AI to speed things up.
First ship is incoming very soon! In these 4 hours spread out across a whole month (I was too busy with school), I got it deployed as a website! ㅤ You can try it out at https://agokule.github.io/perihelion/ . I’m too lazy rn to upload a proper video, so if you can’t figure out how to use the app, check out my other devlogs. Lmk what you think about the app in the comments! Would this be good to ship, or are there still some things you are dying to see before that happens? How was it? Not very nice tbh. A part of me regrets choosing Raylib instead of SDL3 for this project, bc in my experience it was super easy to just port over an SDL3 project to a website. ㅤ Here it was not that easy. I ended fully refactoring the main file (like just rearranging things into different functions) just for it to work the way I wanted. ㅤ In particular the way it handles keyboard/mouse inputs on a website is soooo weird!! You have to check for them at a specific point in your code between two certain functions, which is weird!! ㅤ There were also a lot of weird niche bugs that were so annoying to find, and it turns many of them were with the way Raylib deals with the web, and I only found out because Claude ended up closely reading the source code for these fixes! ㅤ These were mostly minor nitpicks which AI helped me solve. Now, that this thing is almost done I am very glad. It’s like a huge weight has been lifted off my shoulders.
So my first ship got rejected because of 2 reasons: I generated my README with AI, which I didn’t know was not allowed They think I generated over 30% of code with AI I personally don’t think that’s the case, but ig I will have to follow it anyways. So in these 5.75 hours, I rewrote my github readme from scratch by hand. I also rewrote a bunch of my code so that it is by hand as well. ㅤ I’d like to specifically talk about the Spherical struct, since I feel it was most interesting. I previously vibe coded it because the math behind it (3D trigonometry) looked too scary. I tried rewriting it from scratch, and actually turns out it’s not too difficult. So in that case, I’m kind of glad my submission got flagged because now I learned something new! ㅤ While rewriting it, I found some weird choices in sort of architecture which the AI made. So I ended up moving things around to fix it. I also deleted the stupidly long comments that it made, like seriously they’re so long they really make the code worse for the most part. I also fixed two small bugs. So yeah, this will be the last devlog I make for sure.
Ships:
What did I make? This is a gravity simulator written in C++. Right now, it only simulates the solar system, but I am planning on adding more to it in later ships. For detailed instructions on how to use it, see the README, but as a TLDR: when your mouse disappears, use the WASD , Shift , and Space keys to move around. To show your cursor, press Esc . Click anywhere to hide it again. Click on a planet’s outline to select it. When it’s selected, you can press V to change its velocity, then you can press X , Y , or Z to lock to the axis, and click with your mouse to confirm. You can also edit its properties in a window. To unselect it, press the × button in the top center Challenges I finished IB SL Physics with a level 7 (highest one possible), so I naively thought all the physics calculations would be easy enough that I could solve them completely alone. Tbh, it was at first, with the actual gravity part just being the F = Gmm/r^2 equation over and over again. However, with my other features like the spacetime curvature grid, and especially the “Orbit eachother” button, those features required things from university level physics and were complicated. So for these specific physics features, I ended up defaulting to AI to write them. Additionally, figuring out 3D graphics was a challenge and for this, AI and the internet were very useful in figuring those out. I am also glad I used Raylib to code this, since it makes 3D graphics much easier than it normally is. Roadmap for future ships I will consider adding the following in future ships: Black Holes Make the planets rotate Presets other than the solar system Optimize the gravity simulation, right now it lags at around 40 objects Add a bunch of the planets’ moons Add collision detection, so you can smash an asteroid at a planet and see what happens Simulate atmosphere of a planet? There’s probably a lot more that I could add as well, feel free to suggest some features when you vote for this project!...
|
1793008343.8728714
|
1793094743.8728714
|
|
22382
|
The Art Archive by @danielSan | Stardance
|
danielSan
|
0
|
81.26
|
0
|
[]
|
[{"post_id": 78940, "ts": "202 [{"post_id": 78940, "ts": "2026-10-12T03:30:49Z", "hours": 10.2206, "text": "Hello fellow coders! Welcome to another devlog! It is now my time to share all the updates I have done to the app’s UI during this past week. Firstly, I started the development of the homeView, which looks really good so far! I have tried to keep the design familiar to what the infoView is like, so that it creates a sense of uniformity and familiarity to the user. Furthermore, I have also changed the tabView, so that, if you want to change between tabs, you can now simply slide between views, with no visible tab, so that you can use as much of the screen as possible. There are some things at which I am working on at the moment, but that I would like to finally share once they are refined and tested. Thanks for everything and see you really soon dear coders!"}, {"post_id": 76058, "ts": "2026-10-02T06:51:02Z", "hours": 10.0589, "text": "Hello dear coders! Welcome to another devlog! Just like I promised on last devlog, I have been profoundly working on the design itself of the app, since the database is now done, and I would like to show you some incredible changes we have done to make the experience as satisfying yet easy as possible. Firstly, you can now notice that we are using two main colors, instead of 1, extracted from the main artwork as both background and font colors, which make the view feel more “alive”. Also, I have now added both the name of the artwork and author on the “archive view”, which I hope you guys find more useful to identify artwork. Moreover, the most exciting feature for me to develop at the moment has been a proper landscape view, at which I have eliminated unnecessary elements (like title of the view or that long search bar) and substituted them for some more friendly alternatives, so that users can enjoy on this format without any big distractions. Furthermore, now the information view of each artwork includes a link to the web page of the museum where the data has been collected. That’s it for now! Thank you so much for everything, and see you really soon for more updates on the development of this app."}, {"post_id": 74223, "ts": "2026-09-26T23:33:32Z", "hours": 9.7308, "text": "Hello fellow coders to another devlog of my app! First of all, I am really excited for the announcement of the extension on stardande! It will allow me to be able to finish the app correctly without the need of rushing. Also, I would expect more devlogs as the date gets closer, as I am gonna try to focus harder on this project on the next few weeks. And even though there is not much to share (yet), I wanted to share some big news: The database is finally done!!! (yay). There will be a total of 400 selected artworks from all sorts of cultures available with their respective photo (at least on this basic version). And if you are wondering the reason why I am making my on database instead of just using an API, it’s for both ensuring a better look and simplicity + being able to access the app without the need of an internet connection. Even though I can not share any other news (yet), I would suggest staying tuned, as there are still many things to be unveiled about the app. See you soon!"}, {"post_id": 68466, "ts": "2026-09-15T04:52:10Z", "hours": 9.9583, "text": "Hello everyone! Welcome to another devlog about my app called “The Art Archive”. Firstly, I know I said the design of the menu of the Archive was already finished, but I felt like the old design wasn’t good enough, and I updated it to adapt to the size of the picture of the artwork. Sadly, that is all I can show at the moment, since I am currently working on polishing both the information view and the database, plus starting to design the home view. I will give you some updates really soon! See you all really soon!"}, {"post_id": 55650, "ts": "2026-08-27T16:39:51Z", "hours": 9.8736, "text": "Welcome to another devlog about my app called “The Art Archive”! Today I wanted to give some updates on what I have been working on for the past few weeks. Firstly, I have started developing a new screen at which you will be able to find all the information available about that artwork. And, even through there is still a long way to go on the development of the view, I would say that at the moment it is looking promising. Also, I have changed the artworks background colors and made them dynamic, so that they match the main color of it. Furthermore, I have also made some changes to the database, and I am expecting to finish it really soon, so that I can finally spend all my time developing and polishing the app’s design. And that is all the news I can share at the moment. I will see you all on the next devlog! Have a great day!"}, {"post_id": 39651, "ts": "2026-08-02T19:34:57Z", "hours": 10.3158, "text": "Hello! Welcome back to another devlog. Today I’m here to talk about some improvements that have been made onto the app UI, like a proper adaptation to the new header introduced in iOS 27, plus further improvements on the hierarchy of the cards typography. Moreover, there have been some minor changes made to the database of the art gallery with the addition of new artworks to it. In future updates, I am looking for making further improvements on the archive view before starting to develop the mainView and its system, plus adding some extra artworks onto the database. Hope you guys like how the app is looking so far! See you in the next devlog!"}, {"post_id": 27807, "ts": "2026-07-13T18:02:30Z", "hours": 9.9914, "text": "Hello Everyone! I wanted to give you some updates on my current project. Lately I have been updating the database and including some artworks from the Greek and British culture that I have found quite interesting. I have also started to plan the look of the UI, but I have not started developing it yet, since I would prefer to finish the database of the app before doing further changes to the UI. I will update the development of the app very soon with further changes at another devlog!"}, {"post_id": 22433, "ts": "2026-07-04T22:01:07Z", "hours": 11.1153, "text": "Hello everyone! Welcome to my first devlog ever about this new project I am currently developing during my free time, and which has been mainly driven by my love for art. Now, I would like to show you what I have been working on for the past week. Firstly, I have created a really basic interface (which will be updated later) and divided the app into two tabs: one tab called “home”, which has not been developed yet but it is planned to show 1 random artwork per day, and another one called “archive”, where all of the artworks are stored and can be accessed at any minute. Right now I am currently developing the database for the app, and obtaining all the necessary data from the MET museum. I am looking forward to sharing further progress in future devlogs!"}]...
|
Title: The Art Archive by @danielSan | Stardance
Title: The Art Archive by @danielSan | Stardance
Devlogs:
Hello everyone! Welcome to my first devlog ever about this new project I am currently developing during my free time, and which has been mainly driven by my love for art. Now, I would like to show you what I have been working on for the past week. Firstly, I have created a really basic interface (which will be updated later) and divided the app into two tabs: one tab called “home”, which has not been developed yet but it is planned to show 1 random artwork per day, and another one called “archive”, where all of the artworks are stored and can be accessed at any minute. Right now I am currently developing the database for the app, and obtaining all the necessary data from the MET museum. I am looking forward to sharing further progress in future devlogs!
Hello Everyone! I wanted to give you some updates on my current project. Lately I have been updating the database and including some artworks from the Greek and British culture that I have found quite interesting. I have also started to plan the look of the UI, but I have not started developing it yet, since I would prefer to finish the database of the app before doing further changes to the UI. I will update the development of the app very soon with further changes at another devlog!
Hello! Welcome back to another devlog. Today I’m here to talk about some improvements that have been made onto the app UI, like a proper adaptation to the new header introduced in iOS 27, plus further improvements on the hierarchy of the cards typography. Moreover, there have been some minor changes made to the database of the art gallery with the addition of new artworks to it. In future updates, I am looking for making further improvements on the archive view before starting to develop the mainView and its system, plus adding some extra artworks onto the database. Hope you guys like how the app is looking so far! See you in the next devlog!
Welcome to another devlog about my app called “The Art Archive”! Today I wanted to give some updates on what I have been working on for the past few weeks. Firstly, I have started developing a new screen at which you will be able to find all the information available about that artwork. And, even through there is still a long way to go on the development of the view, I would say that at the moment it is looking promising. Also, I have changed the artworks background colors and made them dynamic, so that they match the main color of it. Furthermore, I have also made some changes to the database, and I am expecting to finish it really soon, so that I can finally spend all my time developing and polishing the app’s design. And that is all the news I can share at the moment. I will see you all on the next devlog! Have a great day!
Hello everyone! Welcome to another devlog about my app called “The Art Archive”. Firstly, I know I said the design of the menu of the Archive was already finished, but I felt like the old design wasn’t good enough, and I updated it to adapt to the size of the picture of the artwork. Sadly, that is all I can show at the moment, since I am currently working on polishing both the information view and the database, plus starting to design the home view. I will give you some updates really soon! See you all really soon!
Hello fellow coders to another devlog of my app! First of all, I am really excited for the announcement of the extension on stardande! It will allow me to be able to finish the app correctly without the need of rushing. Also, I would expect more devlogs as the date gets closer, as I am gonna try to focus harder on this project on the next few weeks. And even though there is not much to share (yet), I wanted to share some big news: The database is finally done!!! (yay). There will be a total of 400 selected artworks from all sorts of cultures available with their respective photo (at least on this basic version). And if you are wondering the reason why I am making my on database instead of just using an API, it’s for both ensuring a better look and simplicity + being able to access the app without the need of an internet connection. Even though I can not share any other news (yet), I would suggest staying tuned, as there are still many things to be unveiled about the app. See you soon!
Hello dear coders! Welcome to another devlog! Just like I promised on last devlog, I have been profoundly working on the design itself of the app, since the database is now done, and I would like to show you some incredible changes we have done to make the experience as satisfying yet easy as possible. Firstly, you can now notice that we are using two main colors, instead of 1, extracted from the main artwork as both background and font colors, which make the view feel more “alive”. Also, I have now added both the name of the artwork and author on the “archive view”, which I hope you guys find more useful to identify artwork. Moreover, the most exciting feature for me to develop at the moment has been a proper landscape view, at which I have eliminated unnecessary elements (like title of the view or that long search bar) and substituted them for some more friendly alternatives, so that users can enjoy on this format without any big distractions. Furthermore, now the information view of each artwork includes a link to the web page of the museum where the data has been collected. That’s it for now! Thank you so much for everything, and see you really soon for more updates on the development of this app.
Hello fellow coders! Welcome to another devlog! It is now my time to share all the updates I have done to the app’s UI during this past week. Firstly, I started the development of the homeView, which looks really good so far! I have tried to keep the design familiar to what the infoView is like, so that it creates a sense of uniformity and familiarity to the user. Furthermore, I have also changed the tabView, so that, if you want to change between tabs, you can now simply slide between views, with no visible tab, so that you can use as much of the screen as possible. There are some things at which I am working on at the moment, but that I would like to finally share once they are refined and tested. Thanks for everything and see you really soon dear coders!...
|
1792774506.7667646
|
1793379306.7667646
|
|
44357
|
Starforge by @lacorte | Stardance
|
lacorte
|
2
|
81.24
|
1116
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-24T15:29:30Z", "hours": 34.0, "multiplier": 18.98, "payout": 618, "blessing": "neutral", "text": "⭐ Starforge is a pixel art & animation studio that runs entirely in your browser. Open (starforge.lacorte.city)[https://starforge.lacorte.city] and draw, as of this ship, your drawing moves. Ship 2 is the Animation Update. Animate : a frame timeline where every frame carries its own duration in milliseconds. Add, reorder and duplicate frames, play the reel on the document’s own clock, and draw with onion skinning. Export : an animated GIF encoder written byte by byte, from the GIF89a header to the LZW dictionary resets. When your art has more than 256 colors, a hand-rolled median-cut quantizer folds it into a legal palette instead of refusing. The Export dialog plays the actual GIF before you download it, next to its true byte size. Spritesheets come out of the same door. Draw : mirror mode, switch on an axis and the editor paints the reflection live under your pencil. The Color Studio mixes any color in HSV, hex or per-channel RGBA. Trackpad zoom got tamed: wheel deltas accumulate into clean notches instead of stepping twenty-five times per glide. Keep your work : editable .starforge project files, and Portable PNG, a real image with the whole project embedded inside, so the file you post is also the file you keep editing. Autosave still catches every stroke, and even a crash screen can still export your drawing. Under the hood : 563 tests, zero dependencies in the core. The encoder is proven against ffmpeg that decodes my GIFs and every pixel comes back identical, including a noise frame built to overflow the LZW dictionary. Quantization is deterministic, same art to the same bytes, and folds ~10,000 colors into 256 in about 23ms. Where it’s going : next ship, the “multiplayer” in the tagline becomes real, a hand-rolled CRDT (last-writer-wins per cell, Lamport clocks) and shareable rooms. Works on your phone. Shortcuts follow Aseprite. Press ? in the editor.", "repo": "https://github.com/Gabriel-Lacorte/starforge", "demo": "https://starforge.lacorte.city/"}, {"ship_num": 2, "ts": "2026-08-10T01:15:34Z", "hours": 29.0, "multiplier": 17.82, "payout": 498, "blessing": "neutral", "text": "⭐ Starforge is a pixel art studio that runs entirely in your browser. Open starforge.lacorte.city and draw. This first ship is the whole editor core, built from scratch in TypeScript with zero dependencies in the core. Draw : pencil, eraser, line, rectangle and ellipse (outline or filled), and a bucket fill with per-channel tolerance and a contiguous/global switch. Rectangular selection that lifts the pixels and lets you drag them anywhere. Layers : add, duplicate, reorder, rename. Per-layer opacity, seven blend modes, visibility and lock. Keep your work : undo/redo across pixel strokes and structural edits alike, autosave in the browser, and PNG export If the editor ever crashes, the error screen still exports your drawing. Under the hood : 208 tests, including property tests that throw hundreds of random actions at the history and require a byte-identical document back. The renderer composites once per change, not once per layer: the cache key is two integers, and panning triggers zero recompositions. Flood fill, Bresenham lines, ellipse rasterizer, composito, all hand-rolled, no graphics libraries. Where it’s going : the “multiplayer” in the tagline is the arc: a hand-rolled CRDT (last-writer-wins per cell with Lamport clocks) and shareable rooms are the next major ships. Works on your phone. Shortcuts follow Aseprite. Press ? in the editor.", "repo": "https://github.com/Gabriel-Lacorte/starforge", "demo": "https://starforge.lacorte.city/"}]...
|
[{"post_id": 64302, "ts": "202 [{"post_id": 64302, "ts": "2026-09-08T16:20:23Z", "hours": 8.6656, "text": "⭐ Starforge is a pixel art & animation studio that runs in your browser. Last time the relay queue was in memory. Now it is a real wire using native WebSocket to talk with the relay I wrote by hand on node:http , handshake, framing, mask, fragmentation, ping/pong, close codes, all of it. Draw a horizontal stroke here, a vertical one there, and both canvases land on the same pixels. 900 pixels travel in 2,730 bytes. Raw it would be 7,200 (8 bytes per pixel: u16 x , u16 y , u32 color ). On the wire the cells sort by (y, x) , coordinates go as zigzag deltas, colors go as an index into a 1-entry table. That is 3.033 bytes per pixel, and every one of the 19 operation kinds round-trips byte-for-byte. The server does not trust a single byte, each op is validated with the same applyOperation the editor uses, on a clone. A bad op earns an ERROR and the connection stays open. Receipts: 662 unit tests green 23 Chromium E2E zero production dependencies Next: the ephemeral room becomes shareable rooms /r/<id>"}, {"post_id": 61840, "ts": "2026-09-04T23:16:43Z", "hours": 9.5767, "text": "⭐ Starforge is a pixel art & animation studio that runs in your browser. Since last week Starforge learned how to disagree without falling apart, and got more comfortable on tablets along the way. This is the first piece of multiplayer, two complete editors, two independent copies of the same drawing, and a queue between them. There is no server yet. I can draw in both editors, hold every message back, reverse their order, deliver one twice, and the documents still finish on the same pixels. Alongside that invisible foundation, community conversations pointed at five visible workflow breaks: the compact tablet layout only kicked in below 720 px, colours sat with layers and frames instead of the brush, palette authoring bounced between two dialogs, brush opacity used a tiny track while layer opacity had a fine large slider, and precise add/subtract selection hid behind keyboard modifiers touch users never see. All five are fixed in this pass. Receipts 633 green unit tests, with 4 ffmpeg cross four pinned seeds × 100 generated operations across three replicas, including pixel conflicts, scalar edits, palette replacement, layer/frame creation, deletion and ordering 20 Chromium E2E tests pass receiving and applying a 900-pixel patch averages about 0.49 ms on my development machine (2,034 patches/second in the recorded run) zero production dependencies in the core Next: the queue becomes a real wire, WebSocket handshake will be written by hand on node:http with the relay on a Raspberry Pi."}, {"post_id": 52640, "ts": "2026-08-22T21:36:24Z", "hours": 9.3367, "text": "⭐ Day 18 of building Starforge, a pixel art & animation studio that lives in your browser. That heart is only half real. I drew the left side and the editor drew the right side under my pencil, live. Mirror mode landed today, and I spent an embarrassing amount of time just watching the other half appear. Two more things came with it. The Export dialog now plays your actual GIF before you download it, next to its true size, same bytes as the download, so the dialog can’t lie to you. My greeting star comes out at 2.4 KB, using 125 of 256 colors. And the encoder learned to lose colors gracefully, which is my favorite thing I’ve built this week: How it works A GIF holds at most 256 colors. Until today, art with more colors hit a wall, an error message asking you to reduce your palette. I hated that message, so now the encoder runs median cut instead. Median cut, in human terms: pour every color in your drawing into one box. Find the box’s longest side, red, green or blue, whichever stretches widest, sort the colors along that side, and cut the box in half at the median. Repeat, always cutting the widest box you have left. After 255 cuts you hold 256 boxes, and each box’s average becomes one crayon in the final palette. Colors that sat close together end up sharing a crayon, which is exactly the kind of loss your eye forgives. The sneaky part is that the same drawing must produce the identical file every single time, so every sort breaks ties by the color’s own value and every average rounds the same way. There’s a test that encodes the same art twice and demands the bytes back, identical. Receipts 563 green tests ~10,000 colors in, 256 out, in about 23ms ffmpeg decodes the quantized file, and re-encoding what it hands back produces the identical bytes Last post I asked you to export a GIF and drop it in the comments. Nobody did :C, fair enough, the star was doing all the work. So today I made it personal: open starforge.lacorte.city , turn on mirror mode, and draw half a thing. The editor does the other half. Post what you get, I’ll feature my favorite in the next devlog :D. And a real question I can’t decide alone: diagonal axes or kaleidoscope. which should mirror mode learn first? Both are on the backlog. You can decide the order. (If you want to catch the next post, follow the project, that button actually notifies you. )"}, {"post_id": 51943, "ts": "2026-08-21T21:51:53Z", "hours": 5.2739, "text": "⭐ Starforge is a pixel art & animation studio that runs in your browser. The GIF above was drawn, animated and exported inside Starforge. Yesterday I said I was writing the GIF encoder by hand. It’s finished, and already sitting behind the Export button in the editor. How it works A GIF doesn’t store pixels. It stores a conversation between two sides that build the same notebook and never send it. The encoder walks the image. The first time it meets a run of pixels it spells the run out, then writes that run in a notebook next to a number. The next time the same run shows up, it sends the number instead of the pixels. The decoder reads those numbers and builds the identical notebook as it goes, which is why the notebook itself never travels, both sides derive it from the same stream. That’s LZW, and it’s lovely right up until you notice the decoder is permanently one entry behind. It can’t file a new run until it has read the code that comes after it. So when the notebook outgrows the current code width, the two sides widen at different moments, and the encoder has to wait one step longer than feels correct. Get that off-by-one wrong and the file is perfect for a few hundred bytes and then dissolves into confetti. That was my morning. Receipts 545 green tests I encoded with my code and decoded with ffmpeg . Every pixel came back identical 16 frames of 256×256 encode in 135ms Browsers quietly treat any GIF delay under 2 centiseconds as 10, so the encoder floors every frame there. Draw something at starforge.lacorte.city , export the GIF, and drop it in the comments! I’ll feature my favorites in the next devlog :D."}, {"post_id": 51700, "ts": "2026-08-21T15:01:44Z", "hours": 7.9314, "text": "⭐ Starforge is a pixel art & animation studio that runs in your browser. Yesterday I said those numbered cells at the bottom of the screenshot were today’s story. Here they are: every cell is a frame with its own duration in milliseconds, play runs the reel on the document’s own clock, and since today, the frame you’re drawing shows its neighbours behind it as ghosts. The star that greets you is a loop with 4 frames now, so you can already see the animation. Receipts : 527 green tests 3 recompositions parked with ghosts on three new end-to-end tests in a real browser Next : I’m writing a GIF encoder from scratch. By hand. :D"}, {"post_id": 51127, "ts": "2026-08-20T17:01:06Z", "hours": 11.9494, "text": "⭐ Starforge is a pixel art & animation studio that runs in your browser. The first ship reviews asked for three things: custom colors (two voters), a less twitchy zoom (one), and opening files (one). All three landed this week. The Color Studio mixes any color in HSV, hex or per-channel RGBA and drops it straight into your palette. The zoom got tamed (story below). And you can now save and open editable .starforge projects, including inside a Portable PNG, a real image with the whole project embedded in it, so the file you post is also the file you can keep editing. Wheel deltas lie about intent A Mac voter said the zoom flew. They were right, and the bug was pretty interesting (it also ate my whole morning). One click of a mouse wheel arrives as a single event of about 100px, but a trackpad glide arrives as dozens of tiny ~4px events. The old code stepped the zoom once per event: a mouse user got one clean step per click, a trackpad user got twenty-five. And I didn’t even know pinch was part of the bug until I read how Chrome handles it: a pinch is faked as ctrl+wheel, so it lands in the same handler too. The fix: accumulate to 100, then discard the remainder. Every event banks its delta. A step only fires when the bank crosses a notch, and turning around mid-glide resets the bank instead of cancelling a step you already saw. Receipts : 511 green tests an e2e that draws, reloads the page and exports in a real browser golden ink fixtures pinned by SHA256 Those numbered cells at the bottom of the screenshot are tomorrow’s story :D"}, {"post_id": 44328, "ts": "2026-08-10T00:30:52Z", "hours": 5.2836, "text": "⭐ Starforge is a pixel art editor that runs in your browser. No engine work today, since I focused on a more important point: Whoever opens starforge.lacorte.city from a feed post, leaves in about two minutes, with no instructions and usually a phone in their hand, so the whole day went into that first visit. You can start your own document now insted of only erasing the star, your drawings survives a reload, and on a phone the layer panel became a drawer. How it works Most web editors take your drawing with them when they break. This one doesn’t. When a component throws, an error boundary renders a screen where Export PNG still works, if the editor dies, you get the PNG out before you reload. Two reasons that’s possible. The document never lived inside the component that broke: it belongs to the DocumentSession, outside the render tree. And the export never goes through the editor, it composites the frame straight from the document. The thing that holds your art and the thing that failed are not the same thing. Receipts: 208 green tests draw, reload, auto-save a keys help menu for shortcuts and gestures zoom by button, fit in one click Tomorrow morning the first real ship goes out :D"}, {"post_id": 43584, "ts": "2026-08-08T22:37:35Z", "hours": 6.3333, "text": "⭐ Starforge is a pixel art editor that runs in your browser. Yesterday it could only draw in a single surface. Today the same old star is five stacked layers, carrying its own opacity, visibility and lock, plus a rule for how its colors blend with the layers below. How it works Compositing every layer on every frame can’t hold 60fps. At 256x256 with eight layers at 800% zoom that’s eight blits of 2048×2048 per frame, about 33 megapixels of work to show a picture that didn’t change. So the editor composites once per change into an offscreen canvas, and the screen just draws that one image. Rendering with no cost since that nothing changed. All with 169 green tests."}, {"post_id": 42960, "ts": "2026-08-07T23:09:15Z", "hours": 10.7408, "text": "⭐ Starfoge: A multiplayer pixel art & animation studio that runs in your browser. Day three, and it finally draws! The whole toolbox landed with six drawing tools and keyboard shortcuts already known by pixel artists. Yesterday’s 37 green tests are 117 today. Today i want to deep dive in one of the questions i had: why fast strokes come out dotted. The browser only tells the page where the mouse is once per screen frame (~60fps), but a hand can cross half the canvas between two of those reports and a quick zigzag would become a trail of separated dots. The fix comes in two layers: First , the browser actually keeps the positions it skipped and hands them back in a bundle with each event, so I ask for those in-between samples. Second , even those have gaps when the gesture is really fast, so between every pair of samples I draw a tiny line using Bresenham algorithm , the same grid walker my line tool uses, it steps from one pixel to a touching neighbor and can’t skip a cell by construction. So every stroke you see is secretly dozens of tiny straight lines, stitched end to end. Tomorrow i will start landing Layers to our studio. Thanks for reading and see you on the next devlog :D"}, {"post_id": 42013, "ts": "2026-08-06T15:42:02Z", "hours": 6.3106, "text": "⭐ Starforge is alive in the browser! This is day two building a multiplayer pixel art studio. So far the editor opens with a little star, and every pixel stays razor sharp at any zoom. With 37 green tests I already started coding the first drawing tools (pencil, eraser, bucket). The sharpness comes from a two stage blit with shared memory. A sprite’s pixels live in one Uint8Array wrapped in an ImageData view, using only one buffer for model and image bytes. Stage one pushes just the changed rectangle onto an offscreen canvas (1:1) which ignores scaling and smoothing so it never blurs. Stage two is a single draw image that stretches the offscreen canvas to the current zoom with the GPU doing the nearest-neighbor upscaling for free. When the pencil lands next ship, the bytes it writes are already the bytes the renderer reads."}]...
|
Title: Starforge by @lacorte | Stardance
Devlogs: Title: Starforge by @lacorte | Stardance
Devlogs:
⭐ Starforge is alive in the browser! This is day two building a multiplayer pixel art studio. So far the editor opens with a little star, and every pixel stays razor sharp at any zoom. With 37 green tests I already started coding the first drawing tools (pencil, eraser, bucket). The sharpness comes from a two stage blit with shared memory. A sprite’s pixels live in one Uint8Array wrapped in an ImageData view, using only one buffer for model and image bytes. Stage one pushes just the changed rectangle onto an offscreen canvas (1:1) which ignores scaling and smoothing so it never blurs. Stage two is a single draw image that stretches the offscreen canvas to the current zoom with the GPU doing the nearest-neighbor upscaling for free. When the pencil lands next ship, the bytes it writes are already the bytes the renderer reads.
⭐ Starfoge: A multiplayer pixel art & animation studio that runs in your browser. Day three, and it finally draws! The whole toolbox landed with six drawing tools and keyboard shortcuts already known by pixel artists. Yesterday’s 37 green tests are 117 today. Today i want to deep dive in one of the questions i had: why fast strokes come out dotted. The browser only tells the page where the mouse is once per screen frame (~60fps), but a hand can cross half the canvas between two of those reports and a quick zigzag would become a trail of separated dots. The fix comes in two layers: First , the browser actually keeps the positions it skipped and hands them back in a bundle with each event, so I ask for those in-between samples. Second , even those have gaps when the gesture is really fast, so between every pair of samples I draw a tiny line using Bresenham algorithm , the same grid walker my line tool uses, it steps from one pixel to a touching neighbor and can’t skip a cell by construction. So every stroke you see is secretly dozens of tiny straight lines, stitched end to end. Tomorrow i will start landing Layers to our studio. Thanks for reading and see you on the next devlog :D
⭐ Starforge is a pixel art editor that runs in your browser. Yesterday it could only draw in a single surface. Today the same old star is five stacked layers, carrying its own opacity, visibility and lock, plus a rule for how its colors blend with the layers below. How it works Compositing every layer on every frame can’t hold 60fps. At 256x256 with eight layers at 800% zoom that’s eight blits of 2048×2048 per frame, about 33 megapixels of work to show a picture that didn’t change. So the editor composites once per change into an offscreen canvas, and the screen just draws that one image. Rendering with no cost since that nothing changed. All with 169 green tests.
⭐ Starforge is a pixel art editor that runs in your browser. No engine work today, since I focused on a more important point: Whoever opens starforge.lacorte.city from a feed post, leaves in about two minutes, with no instructions and usually a phone in their hand, so the whole day went into that first visit. You can start your own document now insted of only erasing the star, your drawings survives a reload, and on a phone the layer panel became a drawer. How it works Most web editors take your drawing with them when they break. This one doesn’t. When a component throws, an error boundary renders a screen where Export PNG still works, if the editor dies, you get the PNG out before you reload. Two reasons that’s possible. The document never lived inside the component that broke: it belongs to the DocumentSession, outside the render tree. And the export never goes through the editor, it composites the frame straight from the document. The thing that holds your art and the thing that failed are not the same thing. Receipts: 208 green tests draw, reload, auto-save a keys help menu for shortcuts and gestures zoom by button, fit in one click Tomorrow morning the first real ship goes out :D
⭐ Starforge is a pixel art & animation studio that runs in your browser. The first ship reviews asked for three things: custom colors (two voters), a less twitchy zoom (one), and opening files (one). All three landed this week. The Color Studio mixes any color in HSV, hex or per-channel RGBA and drops it straight into your palette. The zoom got tamed (story below). And you can now save and open editable .starforge projects, including inside a Portable PNG, a real image with the whole project embedded in it, so the file you post is also the file you can keep editing. Wheel deltas lie about intent A Mac voter said the zoom flew. They were right, and the bug was pretty interesting (it also ate my whole morning). One click of a mouse wheel arrives as a single event of about 100px, but a trackpad glide arrives as dozens of tiny ~4px events. The old code stepped the zoom once per event: a mouse user got one clean step per click, a trackpad user got twenty-five. And I didn’t even know pinch was part of the bug until I read how Chrome handles it: a pinch is faked as ctrl+wheel, so it lands in the same handler too. The fix: accumulate to 100, then discard the remainder. Every event banks its delta. A step only fires when the bank crosses a notch, and turning around mid-glide resets the bank instead of cancelling a step you already saw. Receipts : 511 green tests an e2e that draws, reloads the page and exports in a real browser golden ink fixtures pinned by SHA256 Those numbered cells at the bottom of the screenshot are tomorrow’s story :D
⭐ Starforge is a pixel art & animation studio that runs in your browser. Yesterday I said those numbered cells at the bottom of the screenshot were today’s story. Here they are: every cell is a frame with its own duration in milliseconds, play runs the reel on the document’s own clock, and since today, the frame you’re drawing shows its neighbours behind it as ghosts. The star that greets you is a loop with 4 frames now, so you can already see the animation. Receipts : 527 green tests 3 recompositions parked with ghosts on three new end-to-end tests in a real browser Next : I’m writing a GIF encoder from scratch. By hand. :D
⭐ Starforge is a pixel art & animation studio that runs in your browser. The GIF above was drawn, animated and exported inside Starforge. Yesterday I said I was writing the GIF encoder by hand. It’s finished, and already sitting behind the Export button in the editor. How it works A GIF doesn’t store pixels. It stores a conversation between two sides that build the same notebook and never send it. The encoder walks the image. The first time it meets a run of pixels it spells the run out, then writes that run in a notebook next to a number. The next time the same run shows up, it sends the number instead of the pixels. The decoder reads those numbers and builds the identical notebook as it goes, which is why the notebook itself never travels, both sides derive it from the same stream. That’s LZW, and it’s lovely right up until you notice the decoder is permanently one entry behind. It can’t file a new run until it has read the code that comes after it. So when the notebook outgrows the current code width, the two sides widen at different moments, and the encoder has to wait one step longer than feels correct. Get that off-by-one wrong and the file is perfect for a few hundred bytes and then dissolves into confetti. That was my morning. Receipts 545 green tests I encoded with my code and decoded with ffmpeg . Every pixel came back identical 16 frames of 256×256 encode in 135ms Browsers quietly treat any GIF delay under 2 centiseconds as 10, so the encoder floors every frame there. Draw something at starforge.lacorte.city , export the GIF, and drop it in the comments! I’ll feature my favorites in the next devlog :D.
⭐ Day 18 of building Starforge, a pixel art & animation studio that lives in your browser. That heart is only half real. I drew the left side and the editor drew the right side under my pencil, live. Mirror mode landed today, and I spent an embarrassing amount of time just watching the other half appear. Two more things came with it. The Export dialog now plays your actual GIF before you download it, next to its true size, same bytes as the download, so the dialog can’t lie to you. My greeting star comes out at 2.4 KB, using 125 of 256 colors. And the encoder learned to lose colors gracefully, which is my favorite thing I’ve built this week: How it works A GIF holds at most 256 colors. Until today, art with more colors hit a wall, an error message asking you to reduce your palette. I hated that message, so now the encoder runs median cut instead. Median cut, in human terms: pour every color in your drawing into one box. Find the box’s longest side, red, green or blue, whichever stretches widest, sort the colors along that side, and cut the box in half at the median. Repeat, always cutting the widest box you have left. After 255 cuts you hold 256 boxes, and each box’s average becomes one crayon in the final palette. Colors that sat close together end up sharing a crayon, which is exactly the kind of loss your eye forgives. The sneaky part is that the same drawing must produce the identical file every single time, so every sort breaks ties by the color’s own value and every average rounds the same way. There’s a test that encodes the same art twice and demands the bytes back, identical. Receipts 563 green tests ~10,000 colors in, 256 out, in about 23ms ffmpeg decodes the quantized file, and re-encoding what it hands back produces the identical bytes Last post I asked you to export a GIF and drop it in the comments. Nobody did :C, fair enough, the star was doing all the work. So today I made it personal: open starforge.lacorte.city , turn on mirror mode, and draw half a thing. The editor does the other half. Post what you get, I’ll feature my favorite in the next devlog :D. And a real question I can’t decide alone: diagonal axes or kaleidoscope. which should mirror mode learn first? Both are on the backlog. You can decide the order. (If you want to catch the next post, follow the project, that button actually notifies you. )
⭐ Starforge is a pixel art & animation studio that runs in your browser. Since last week Starforge learned how to disagree without falling apart, and got more comfortable on tablets along the way. This is the first piece of multiplayer, two complete editors, two independent copies of the same drawing, and a queue between them. There is no server yet. I can draw in both editors, hold every message back, reverse their order, deliver one twice, and the documents still finish on the same pixels. Alongside that invisible foundation, community conversations pointed at five visible workflow breaks: the compact tablet layout only kicked in below 720 px, colours sat with layers and frames instead of the brush, palette authoring bounced between two dialogs, brush opacity used a tiny track while layer opacity had a fine large slider, and precise add/subtract selection hid behind keyboard modifiers touch users never see. All five are fixed in this pass. Receipts 633 green unit tests, with 4 ffmpeg cross four pinned seeds × 100 generated operations across three replicas, including pixel conflicts, scalar edits, palette replacement, layer/frame creation, deletion and ordering 20 Chromium E2E tests pass receiving and applying a 900-pixel patch averages about 0.49 ms on my development machine (2,034 patches/second in the recorded run) zero production dependencies in the core Next: the queue becomes a real wire, WebSocket handshake will be written by hand on node:http with the relay on a Raspberry Pi.
⭐ Starforge is a pixel art & animation studio that runs in your browser. Last time the relay queue was in memory. Now it is a real wire using native WebSocket to talk with the relay I wrote by hand on node:http , handshake, framing, mask, fragmentation, ping/pong, close codes, all of it. Draw a horizontal stroke here, a vertical one there, and both canvases land on the same pixels. 900 pixels travel in 2,730 bytes. Raw it would be 7,200 (8 bytes per pixel: u16 x , u16 y , u32 color ). On the wire the cells sort by (y, x) , coordinates go as zigzag deltas, colors go as an index into a 1-entry table. That is 3.033 bytes per pixel, and every one of the 19 operation kinds round-trips byte-for-byte. The server does not trust a single byte, each op is validated with the same applyOperation the editor uses, on a clone. A bad op earns an ERROR and the connection stays open. Receipts: 662 unit tests green 23 Chromium E2E zero production dependencies Next: the ephemeral room becomes shareable rooms /r/<id>
Ships:
⭐ Starforge is a pixel art studio that runs entirely in your browser. Open starforge.lacorte.city and draw. This first ship is the whole editor core, built from scratch in TypeScript with zero dependencies in the core. Draw : pencil, eraser, line, rectangle and ellipse (outline or filled), and a bucket fill with per-channel tolerance and a contiguous/global switch. Rectangular selection that lifts the pixels and lets you drag them anywhere. Layers : add, duplicate, reorder, rename. Per-layer opacity, seven blend modes, visibility and lock. Keep your work : undo/redo across pixel strokes and structural edits alike, autosave in the browser, and PNG export If the editor ever crashes, the error screen still exports your drawing. Under the hood : 208 tests, including property tests that throw hundreds of random actions at the history and require a byte-identical document back. The renderer composites once per change, not once per layer: the cache key is two integers, and panning triggers zero recompositions. Flood fill, Bresenham lines, ellipse rasterizer, composito, all hand-rolled, no graphics libraries. Where it’s going : the “multiplayer” in the tagline is the arc: a hand-rolled CRDT (last-writer-wins per cell with Lamport clocks) and shareable rooms are the next major ships. Works on your phone. Shortcuts follow Aseprite. Press ? in the editor.
⭐ Starforge is a pixel art & animation studio that runs entirely in your browser. Open (starforge.lacorte.city)[https://starforge.lacorte.city] and draw, as of this ship, your drawing moves. Ship 2 is the Animation Update. Animate : a frame timeline where every frame carries its own duration in milliseconds. Add, reorder and duplicate frames, play the reel on the document’s own clock, and draw with onion skinning. Export : an animated GIF encoder written byte by byte, from the GIF89a header to the LZW dictionary resets. When your art has more than 256 colors, a hand-rolled median-cut quantizer folds it into a legal palette instead of refusing. The Export dialog plays the actual GIF before you download it, next to its true byte size. Spritesheets come out of the same door. Draw : mirror mode, switch on an axis and the editor paints the reflection live under your pencil. The Color Studio mixes any color in HSV, hex or per-channel RGBA. Trackpad zoom got tamed: wheel deltas accumulate into clean notches instead of stepping twenty-five times per glide. Keep your work : editable .starforge project files, and Portable PNG, a real image with the whole project embedded inside, so the file you post is also the file you keep editing. Autosave still catches every stroke, and even a crash screen can still export your drawing. Under the hood : 563 tests, zero dependencies in the core. The encoder is proven against ffmpeg that decodes my GIFs and every pixel comes back identical, including a noise frame built to overflow the LZW dictionary. Quantization is deterministic, same art to the same bytes, and folds ~10,000 colors into 256 in about 23ms. Where it’s going : next ship, the “multiplayer” in the tagline becomes real, a hand-rolled CRDT (last-writer-wins per cell, Lamport clocks) and shareable rooms. Works on your phone. Shortcuts follow Aseprite. Press ? in the editor....
|
1792878732.4859972
|
1793742732.4859972
|
|
40782
|
Ephemeral by @Nicormu | Stardance
|
Nicormu
|
1
|
81.05
|
256
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T02:22:42Z", "hours": 51.0, "multiplier": 7.0, "payout": 256, "blessing": "neutral", "text": "By now, I have finished implementing the mine generation. The mine is generated randomly, with the walls and floors receiving decorations that are also randomized according to the seed. The itch.io page is decorated and working. I had some trouble setting the correct width and height between Unity and itch.io, so I had to ask a partner who is currently traveling for help JAKSJASJK. The first scene of the game is also working. The Play and Exit buttons are functional, with the Exit button having a confirmation prompt to prevent accidental exits. One of the hardest things I have worked on so far has been the Rule Tiles and Unity’s animation system. What a headache it was to solve all the visual bugs I encountered along the way. Right now I have a problem with the void tiles (I think the problem is the spritesheet AJKAJKSJ) The game is still in a very, very early stage . Right now, there are no actual obstacles—only rocks that appear at dead ends. Their positions are currently hard-coded because I mainly wanted to test how the rock assets looked in the game. There is also already some enemy code implemented, but I have not worked on the enemy sprites yet. Therefore, there are no enemies, no obstacles; only the map changes every time you enter a new run One of the biggest things I have learned from this project is that drawing is soooooooo hard… and/or I absolutely suck at drawing.", "repo": "https://github.com/Nicormu/Ephemeral", "demo": "https://nicormu.itch.io/ephemeral"}]...
|
[{"post_id": 58548, "ts": "202 [{"post_id": 58548, "ts": "2026-08-30T23:57:10Z", "hours": 5.7664, "text": "Hi everyonee, I definitely hate animating and drawing, it does not fully convince me. However, I think I am finally done with the bat animations and sprites. Now they have their death animation, and it is already in the game. Also, I have been working on a new player sprite sheet because the look it has right now does not have the same vibe as the game, so I decided to change it. However, it’s been harder than I thought. On the other hand, I cleaned some UI scripts and improved the animation handlers in order to solve the problems I had with the bats."}, {"post_id": 54172, "ts": "2026-08-25T01:08:27Z", "hours": 5.6592, "text": "Hi everybody! I have been working and have made various room variations. Also, improved the bat sprites to determine whether it is a passive bat, melee bat, or range bat. Talking about this last one, I made more sprites to make its attack animation smoother. The last things to mention are that I fixed a bug with the doors that a friend of mine saw yesterday. I was like “But that didn’t happen to meeeee” and I think I already solved it. Moreover, the reset is also smoother, and finally, my friend that help me with sprites came back to work and started the slimes. Hope you likeeee"}, {"post_id": 52031, "ts": "2026-08-22T02:11:50Z", "hours": 6.0342, "text": "Hi everyoneeeee, I have finally finished with the bat enemies. All the enemies are in the game right now; however, they only spawn one time per room. Sorry for that. The animation part was a headache. I had to change some logic behind the player to properly detect the damage from the melee bat. Now it has two colliders: one on the root that is a trigger and detects enemy damage, and the other one inside the player’s child named “Visual,” which makes the player not move through the walls. This was also added to the creation of the enemies. In these days, I will focus on creating the new variations for ALLLLLLL the rooms. If I can, and my abilities allow me to, I will also change the player sprites. Btw, during this process, enemies and obstacles could be added :D"}, {"post_id": 50034, "ts": "2026-08-19T02:00:47Z", "hours": 2.4189, "text": "My first enemyyyyyyyyyy Hi everyone, I changed the wall generator (it was also a problem inside the Dungeon Wall Builder), and now, no matter what happens or what I do, the room will always be a rectangle :D The new feature is that I have been working on the bat enemies, and I’m going to make a total of three different bats. One will be passive but will follow the player at a slow speed; another will follow the player more quickly and will deal heart damage; and the last one will attack from a distance. I forgot to tell you that the visual part of the hearts has been added, and they will react when the player receives damage from falling through the void. By now, there is no death screen jaksjksjakj. Hope you like the sprites! It’s been very hard, and Unity’s Animator is known by me as my Achilles’ heel."}, {"post_id": 49278, "ts": "2026-08-18T00:03:29Z", "hours": 3.6475, "text": "Hi everybody! I have some good and bad news. Good news: I solved the problem of the void assets spawning in the void. At first, I thought it was a Rule Tile problem, but it turned out to be a code issue in my Dungeon Wall Builder script. Bad news: There’s a new problem :D It seems that either the Dungeon Wall Builder or the Rule Tile is making the walls disappear when a void tile is placed next to them. I’ll be working on fixing that, as well as adding new obstacles, fire, and enemies to make the game more playable."}, {"post_id": 47841, "ts": "2026-08-16T01:51:58Z", "hours": 6.5231, "text": "Hi everybody, I have been working on making the menu more visually appealing by changing the button panels, adding a title, adding an exit animation, and changing the fonts used for the game. I hope you like it By now, I have been lazy and have not started with the settings, therefore, the button does not work, so don’t use it :p I have been making some changes in the way floors and walls behave to add the void. However, the rules are really stressing me out. The void is now looking like a combination between upper walls and side walls. I don’t know how to config the rulessssssss In the code, I erased some things that were not necessary, such as the corridors in the dungeon manager and similar scripts that were in charge of the dungeon generation"}, {"post_id": 43655, "ts": "2026-08-09T01:31:17Z", "hours": 1.1764, "text": "Here is a look at how the Itch.io page looks. I changed the banner because I didn’t like the previous one. I also added an exit animation. It is missing the settings and other ideas. Thrust the process 😉"}, {"post_id": 43437, "ts": "2026-08-08T17:53:20Z", "hours": 8.7825, "text": "Hi everybodyyyyyyy The game now has its own itch.io By now, there is so much gameplay missing, I will be working on. If you have any ideas or comments, pls tell me :D"}, {"post_id": 41717, "ts": "2026-08-06T03:04:07Z", "hours": 4.4644, "text": "I have been working on the Banner for the game (I’m sure I will change it jkajskaj). Also, my friend told me that the colors used for the game were boring and too grey, so I decided to change them. On the other hand, I improved the placement of the doors and the minimap with its corresponding transition"}, {"post_id": 39808, "ts": "2026-08-03T01:28:11Z", "hours": 2.9711, "text": "Does anyone know what is happening here? The animation is not working, and I don’t know why. The animation is like frozen. If someone knows what it could be, tell me pls"}, {"post_id": 38573, "ts": "2026-08-01T01:39:57Z", "hours": 2.05, "text": "Now we have minimappppppppppppppp I’m not completely in love with the result, I didn’t know how to make the asset look nice to the viewer. I think an animation in the minimap when crossing a door would be nice. I also made small changes in the color and size of the decoration to make it more noticeable."}, {"post_id": 37995, "ts": "2026-07-31T02:53:37Z", "hours": 4.8167, "text": "Hi everyone!!! I improved the transition between the rooms and the animation of each door to be fully open. I also started with the decorations for the walls, but they seem to be veryyyyyyy small JAKSJAJSA I also improved a very long script I had and divided it into shorter ones to make changes easier and make the code understandable. Hope you like my journey :D"}, {"post_id": 36174, "ts": "2026-07-28T02:57:02Z", "hours": 2.295, "text": "Finally, I make it workkkkkkk The dungeon generation is workinngggggg It took me a little too much time, but I have done it, and I’m very proud of myself. Now I have to continue on this journey :D"}, {"post_id": 36064, "ts": "2026-07-27T22:17:53Z", "hours": 24.4097, "text": "This is sad :c But I don’t care; I hope all of you are fine, and I want to present the game I’m working on with a friend. The game is called Ephemeral, and I would like it to be a Roughlite like The Binding of Isaac or Enter the Gungeon. By now, I am working on the generation of the dungeon, and it has been very difficult. Any suggestions you have would be very helpful :D"}]...
|
Title: Ephemeral by @Nicormu | Stardance
Devlogs: Title: Ephemeral by @Nicormu | Stardance
Devlogs:
This is sad :c But I don’t care; I hope all of you are fine, and I want to present the game I’m working on with a friend. The game is called Ephemeral, and I would like it to be a Roughlite like The Binding of Isaac or Enter the Gungeon. By now, I am working on the generation of the dungeon, and it has been very difficult. Any suggestions you have would be very helpful :D
Finally, I make it workkkkkkk The dungeon generation is workinngggggg It took me a little too much time, but I have done it, and I’m very proud of myself. Now I have to continue on this journey :D
Hi everyone!!! I improved the transition between the rooms and the animation of each door to be fully open. I also started with the decorations for the walls, but they seem to be veryyyyyyy small JAKSJAJSA I also improved a very long script I had and divided it into shorter ones to make changes easier and make the code understandable. Hope you like my journey :D
Now we have minimappppppppppppppp I’m not completely in love with the result, I didn’t know how to make the asset look nice to the viewer. I think an animation in the minimap when crossing a door would be nice. I also made small changes in the color and size of the decoration to make it more noticeable.
Does anyone know what is happening here? The animation is not working, and I don’t know why. The animation is like frozen. If someone knows what it could be, tell me pls
I have been working on the Banner for the game (I’m sure I will change it jkajskaj). Also, my friend told me that the colors used for the game were boring and too grey, so I decided to change them. On the other hand, I improved the placement of the doors and the minimap with its corresponding transition
Hi everybodyyyyyyy The game now has its own itch.io By now, there is so much gameplay missing, I will be working on. If you have any ideas or comments, pls tell me :D
Here is a look at how the Itch.io page looks. I changed the banner because I didn’t like the previous one. I also added an exit animation. It is missing the settings and other ideas. Thrust the process 😉
Hi everybody, I have been working on making the menu more visually appealing by changing the button panels, adding a title, adding an exit animation, and changing the fonts used for the game. I hope you like it By now, I have been lazy and have not started with the settings, therefore, the button does not work, so don’t use it :p I have been making some changes in the way floors and walls behave to add the void. However, the rules are really stressing me out. The void is now looking like a combination between upper walls and side walls. I don’t know how to config the rulessssssss In the code, I erased some things that were not necessary, such as the corridors in the dungeon manager and similar scripts that were in charge of the dungeon generation
Hi everybody! I have some good and bad news. Good news: I solved the problem of the void assets spawning in the void. At first, I thought it was a Rule Tile problem, but it turned out to be a code issue in my Dungeon Wall Builder script. Bad news: There’s a new problem :D It seems that either the Dungeon Wall Builder or the Rule Tile is making the walls disappear when a void tile is placed next to them. I’ll be working on fixing that, as well as adding new obstacles, fire, and enemies to make the game more playable.
My first enemyyyyyyyyyy Hi everyone, I changed the wall generator (it was also a problem inside the Dungeon Wall Builder), and now, no matter what happens or what I do, the room will always be a rectangle :D The new feature is that I have been working on the bat enemies, and I’m going to make a total of three different bats. One will be passive but will follow the player at a slow speed; another will follow the player more quickly and will deal heart damage; and the last one will attack from a distance. I forgot to tell you that the visual part of the hearts has been added, and they will react when the player receives damage from falling through the void. By now, there is no death screen jaksjksjakj. Hope you like the sprites! It’s been very hard, and Unity’s Animator is known by me as my Achilles’ heel.
Hi everyoneeeee, I have finally finished with the bat enemies. All the enemies are in the game right now; however, they only spawn one time per room. Sorry for that. The animation part was a headache. I had to change some logic behind the player to properly detect the damage from the melee bat. Now it has two colliders: one on the root that is a trigger and detects enemy damage, and the other one inside the player’s child named “Visual,” which makes the player not move through the walls. This was also added to the creation of the enemies. In these days, I will focus on creating the new variations for ALLLLLLL the rooms. If I can, and my abilities allow me to, I will also change the player sprites. Btw, during this process, enemies and obstacles could be added :D
Hi everybody! I have been working and have made various room variations. Also, improved the bat sprites to determine whether it is a passive bat, melee bat, or range bat. Talking about this last one, I made more sprites to make its attack animation smoother. The last things to mention are that I fixed a bug with the doors that a friend of mine saw yesterday. I was like “But that didn’t happen to meeeee” and I think I already solved it. Moreover, the reset is also smoother, and finally, my friend that help me with sprites came back to work and started the slimes. Hope you likeeee
Hi everyonee, I definitely hate animating and drawing, it does not fully convince me. However, I think I am finally done with the bat animations and sprites. Now they have their death animation, and it is already in the game. Also, I have been working on a new player sprite sheet because the look it has right now does not have the same vibe as the game, so I decided to change it. However, it’s been harder than I thought. On the other hand, I cleaned some UI scripts and improved the animation handlers in order to solve the problems I had with the bats.
Ships:
By now, I have finished implementing the mine generation. The mine is generated randomly, with the walls and floors receiving decorations that are also randomized according to the seed. The itch.io page is decorated and working. I had some trouble setting the correct width and height between Unity and itch.io, so I had to ask a partner who is currently traveling for help JAKSJASJK. The first scene of the game is also working. The Play and Exit buttons are functional, with the Exit button having a confirmation prompt to prevent accidental exits. One of the hardest things I have worked on so far has been the Rule Tiles and Unity’s animation system. What a headache it was to solve all the visual bugs I encountered along the way. Right now I have a problem with the void tiles (I think the problem is the spritesheet AJKAJKSJ) The game is still in a very, very early stage . Right now, there are no actual obstacles—only rocks that appear at dead ends. Their positions are currently hard-coded because I mainly wanted to test how the rock assets looked in the game. There is also already some enemy code implemented, but I have not worked on the enemy sprites yet. Therefore, there are no enemies, no obstacles; only the map changes every time you enter a new run One of the biggest things I have learned from this project is that drawing is soooooooo hard… and/or I absolutely suck at drawing....
|
1793084024.980128
|
1793170424.980128
|
|
2718
|
Underwater Submarine Adventure by @NC | Stardance
|
NC
|
1
|
81.0
|
1715
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T09:00:20Z", "hours": 81.0, "multiplier": 17.91, "payout": 1715, "blessing": "neutral", "text": "I built Abysmal Echo. This is by far my most comprehensive project I have EVER made using the Godot Engine. I put a lot of effort into it and I hope you enjoy playing it This game is about recovering some nuclear warheads at the bottom of the sea while navigating fields of sea mines, cavernous tunnels and mutated sharks. Good Luck! P.S. Please read the controls on how to play the game. PLEEASE", "repo": "https://github.com/NCGameMaking/STEM-Video-Game-2026", "demo": "https://github.com/NCGameMaking/STEM-Video-Game-2026/releases/tag/V1.1"}]...
|
[{"post_id": 62767, "ts": "202 [{"post_id": 62767, "ts": "2026-09-06T08:57:09Z", "hours": 0.3867, "text": "Devlog 15: Exported Game & Ready for Submission! This is the last devlog until submissions, I was just getting the export templates and etc. I also finished with the README No actual progress…"}, {"post_id": 62603, "ts": "2026-09-06T02:18:32Z", "hours": 7.5394, "text": "Devlog 14: Received 2nd Round of Feedback and Implemented it. What have I accomplished: I went to my coding club and asked fellow Godot/Unity enthusiasts to test my game! Here’s basically what they said… They couldn’t find the tunnel entrances The Radio Messages don’t stand out enough Make the Flashlight brighter (again…) Add some sort of Sonar Scan circle thingy on the periscope - make it more useful rather than a wall of text Make the main menu brighter, can’t see the submarine Do not exactly know the initial objective of the game/where to go Make Arrows or hints to show player what to do in Finale sequence When the player escapes through the tunnel, add some decorations make it less boring. Additionally, I got a 2nd round of feedback from my Dad… He said the UI is much better, less cluttered and the flashlight is better as well as the other features, but he has some more feedback. He wants a minimap, so he can see where to go because he is lost and does not understand the compass heading. He wants a clearer font for the submarine UI as the current one is too blurry for him He wants me to put radioactive trifoils on the missiles So onto how I implemented their feedback I made some vines on blender, I did it fairly quicky i didn’t bother putting it on Lapse. So, I implemented the vines with a glowing green shader, so it is easily visible to the player. I placed them in paths leading to the entrance and tunnels, so player knows where to go. As for the radio messages I added a yellow flashing border around them to attract player attention. As for the flashlight, I just cranked the energy up to like 50+, did the job pretty well. I added a sonar scan because the testers believe that the beacon signal is too generic and not really helpful, thus making the periscope itself not useful. In order to improve this, I added a sonar scan, the circular map that actual submarines use. After looking at some tutorials, checking documentation and reddit posts, I realized that I just have to somehow convert my prior knowledge of polar coordinates and convert them into game code. After a while, I got the red dots (sea mines) to appear on the map when the player presses the scan button (x). Additionally, using groups, I got the warheads to come up as yellow dots on the sonar map. The main menu was an easy fix, just had to increase the energy of the light. As for the initial objective, I made an animation where the camera shows the player where the warheads are located and the journey they have to take, it like shows the whole path so the player has some knowledge of knowing if they are going on the right path. Also just added another hint telling the player of the direction (80-90° East.) As for the Finale sequence, I just added a spinning arrow that points to the warhead signalling that the player has to ram it with their hull. Additionally, there are radio messages telling the player what to do. When the player escapes, I added a tall, enclosed tunnel with hanging vines for the player to escape through. Makes the game design much more intentional and doesn’t confuse players into thinking they just broke through the map. For the minimap, I used a SubViewportContainer with a camera being referenced to the actual SubViewport Node. The camera is in Orthogonal mode, and just facing down on the player 30metres away. The input is being displayed on the SubViewport. For the submarine font, I changed some of the colors so the font stands out more and becomes more CRISP and changed the font so the player can easily understand what’s on the dashboard. Another quick and easy fix was the radioactive logos. Just got a MeshInstance3D and slapped the texture on there and stuck it on the side of the warhead. This is probably the last devlog until submission."}, {"post_id": 59511, "ts": "2026-09-01T11:47:53Z", "hours": 2.0072, "text": "Devlog 13 : Recieved Tester Feedback and implemented it What have I accomplished: I have asked a tester (Dad) to test my game. He started playing the game and gave me a sheet of feedback. Upon deciphering the handwriting I made a list of main list of what needs to be improved. Here is the list Give more screen-space for player to see ocean Do something about the radio messages being sent as they are very annoying when the player is exploring and they just appear and block the player’s screen Also the radio messages go away too quickly The flashlight isn’t crisp. It like bleeds into the ocean and doesn’t look nice The ocean environment is too dark, make it brigher What/How did I implement the feedback? As a result, I merged the top panel into the bottom panel while replacing the top section with the radio messages. This time the player has much more screen-space to play in while the radio messages just briefly appear on the screen, not blocking the player’s view. As for the flashlight, I used a MeshInstance3D equipped with an emission Material so the flashlight looks much “crisper”. I also increased the show time for the radio messages from 3 seconds to 5 seconds so player will realise that a message has popped and has sufficient time to read it. As for the ocean environment, I just boosted the emission of the volumetric fog while make the background color slightly lighter rather than leaving it pitch black (Made it like a really dark navy blue). Bonus bug patch! While testing the game, I also found a bug with the Restart button in the pause screen. The bug was that when the player pressed restart, the scene tree was still paused, so the intro animation wouldn’t start until you unpaused it. So in order to fix this I just added another single line of code. func _on_restart_button_pressed(): get_tree().paused = false#This was the line of code needed get_tree().reload_current_scene() That is it so far, definitely getting more people to test it (Family, friends etc…) and implementing more feedback!"}, {"post_id": 56260, "ts": "2026-08-27T23:09:35Z", "hours": 1.4308, "text": "Devlog 12 : Finished Death screen as well as added help features What have I accomplished: Added a death screen Added a ‘help’ feature and hints in the submarine Made a death screen The death screen was fairly easy, I just repurposed the pause screen to become the death screen when the player dies. Added a help feature Put a help option on the home screen. If you hover your mouse over the help button, the hints will appear on the side, similar to FNAF. Additionally, I added a scrolling bar that goes from right to left on the submarine UI. I didn’t want to add another button to the pause menu because it would look too cluttered. This new addition looks pretty neat. What’s Next? Making the README document Getting people to test my game Implement some of their feedback"}, {"post_id": 54076, "ts": "2026-08-24T20:58:15Z", "hours": 10.3475, "text": "Devlog 11: Working on UI as well as Prologue/Epilogue animations What have I accomplished: Made a main menu Made a mission de/briefing scene Made a pause menu Finished with the Prologue/Epilogue animations Added a bonus cutscene during the retrieval of the warheads Made a main menu I went for an extreme horror vibe, dark environment, low light, eerie background noises and single sonar ping. I also animated the camera so that it ‘floats’ around as well as a nearly invisible figure moving in the background to give that eerie feeling that you are not safe and something is watching you. This was done in response to my research on what makes a horror game so scary from the menu only. Mission de/briefing scene Using the visible characters setting in the Label node, I made this niche typewriter/coding briefing scene. With a single ‘ACCEPT’ button. Upon clicking it, player gets sent to the play scene. Pause screen I made a fairly simple pause screen. Nothing fancy, but vital at the same time. Press ‘Escape’, game paused. I am considering reusing the pause menu, change the text with code to use it as a death screen The intro/outro animations The animations are just the player being transported on the tugboat. The same one I modelled in the previous devlog. Intro takes the player to the site. Outro has 5/6 warheads on it and taking the player away from the site. This is to add cohesion so the player doesn’t get confused between scene transitions. However, I realised during the animations, the sky in the environment goes MAD. It starts rapidly flashing between white and blue, similar to lightning, but I am not a fan of it, must remove. BONUS scene! I decided to spice things up by adding a little bit of drama at the end. The player will collect the 6th warhead, uh-oh it’s jammed AND at the SAME time, the ceiling’s going to collapse! The player ram their hull with the warhead to trigger the ignition. The warhead will launch itself at the wall creating a huge hole for the player to escape through, they rise up to the surface and the epilogue cutscene plays. What’s Next? Making a death screen (Should be easy) Making a tutorial on the submarine functionality. Doing the README document"}, {"post_id": 51897, "ts": "2026-08-21T20:01:17Z", "hours": 10.3164, "text": "Devlog 10: Finished map layout and small tweaks to submarine started working on story and UI What have I accomplished: Finished making the environment Coded the sharks to move around the map Added clues for the player Started the story, the lore, the introduction Finished the environment: Making the environment definitely took the longest but it wasn’t the hardest task, just a lot of copy and paste of walls. However finding any gaps or holes in which the player can creep down into was annoying. After a few hours of looking around, banging into walls, I did find and patch up a few but am not sure if that is all of them. Hopefully, to discourage/guide the player away from the corners and edges, I put huge sharks guarding the walls as well as rows of sea mines to tell the player to look somewhere else, not here. Also, I added a couple of underwater ruins, like a wrecked ship and a submarine. The actual warhead retrieval process is working now, when the submarine touches it, a parachute will come up and lift the warhead to the surface, where hopefully the boat will collect. Coding the sharks! Coding the sharks was fairly easy (Literally 2 lines of code) as I used a Path3D and a PathFollow3D node to just map out the path in the inspector. func _process(delta): progress += 20*delta That is all the code, the progress, is how far the shark is along the track and the integer determines how fast the shark moves. I could’ve used an AnimationTree node but with my prior experience to that, just thinking of the whole coding part, setting the animations up, the chase player code made me cringe a lot, also there’s not enough time. Giving the player clues So in addition to the current features of the MMS scanner, it can also track the ‘SOS beacon’ of the abandoned target submarine by taking its position and comparing it to the player’s and using ranges of signal strength with distance to see how ‘strong’ the signal is. Additionally, it does the exact same for angle, so the scanner can tell player which direction the submarine was found. Started the introduction The plan in mind is like some cool visual graphics telling you, your objective, a brief map layout telling you of hazards, some lore, like ‘Secret weapon’s mission gone wrong, must retrieve warheads before enemies do so’ the submarine is on a tugboat sailing on the sea, the crane will pick it up and dump it in the water Full lapse of tugboat here : https://lapse.hackclub.com/timelapse/lsYzC1wA-xLH What’s next? Adding UI to the game, pause menu, main menu, death screen Finishing lore of game, animations, mission objective, win scene."}, {"post_id": 47824, "ts": "2026-08-16T01:16:04Z", "hours": 9.85, "text": "Devlog 9: Major Change of Plans and Coded Assets What have I accomplished: Started Making the environment Made a scanner for the periscope to detect objects Coded the sea mine Added explosion Particles The part that took the longest was the environment, taking in the lengths, finding hidden collision gaps, setting each zone up and placing obstacles. The sea mine code was fairly simple, I also added some explosion particles when it exploded. That was really fun. Additionally, I made a periscope scanner that can scan the ocean for any relics/mines/sharks in sight. The most aesthetic addition to the submarine and it gives the periscope a proper purpose rather than just a fun extra. I was heavily inspired by Call of Duty with their MMS (Milimeter scanner). This scanner can see through walls and highlight enemies! Major change in plans : Before we would have relics being the prized possession to retrieve. However, after realising how vast the map was and the extreme likelihood of players not being able to find all relics was too high to ignore. So instead of the player collecting relics, I have decided that they will go on an extremely difficult mission to retrieve some nuclear warheads/missiles on a U.S. nuclear submarine. The abandoned submarine will lie at the very bottom of 300m. The player must dodge sea mines, explore the other shipwrecks/submarines all before some rivals get their hands on it. Something like that for the briefing screen The player will deploy buoys/parachutes on the missiles, and they will float to the surface. A boat will come and collect them. Mission Complete! What’s Next? I will be using a similar layout but with a different set of decorations, more submarines/shipwrecks, signs of naval warfare, mines and the warhead finally."}, {"post_id": 45414, "ts": "2026-08-11T20:57:09Z", "hours": 10.4542, "text": "Devlog 8: Imported Environmental Assets and Hazards What I have accomplished: Using Blender 5.0 I hand modelled all the 3D assets. RUINS For some ruins where the relic might be, I have added some crumbled pillars, ruined archways, cracked stone slabs and an altar for the relic to rest on. I did some basic extruding to get the original shape down, then just pulled and twitched with the vertexes to give it the run down effect Sea mines! Additionally, the sea mine was fairly easy to make, a sphere, cylinders and a chain. Making the chain to the base was by far was the most satisfying part of the build as you just copy, paste, rotate and within seconds you get a neat, professional looking chain. Relics The relics were pretty easy, a glowing orb with unique patterns drawn across it and a shield. The plan is to just change the colour of the hues so the player has a common sense of what an orb looks like. Colours can be blue, violet, pink, red, yellow, gold, orange, and vice versa for the shield. Underwater Predator Now, the main event, the shark. I spent 6 hours and 32 minutes, modelling, texturing, rigging and animating this thing. This is by far the most complex project I have ever done (maybe even the most successful in terms of rigging!) Below is the link of all my lapses for the shark only https://lapse.hackclub.com/user/@NCGAMEMAKING I’ve set the basic environment up, just a big square with rocks as barriers. What’s next? Using all of these assets to make the environment. I have to layout the relics, ruins, sea mines, sharks. I have to code out the sea mine so it explodes with explosion graphics (not that hard) Code the shark so it like swims in its patrol area and so if the player’s flashlight is shining on the shark it will start chasing the player, hurt the player and move on with its basic patrol."}, {"post_id": 39279, "ts": "2026-08-02T04:45:38Z", "hours": 8.3853, "text": "Devlog 7: Finished Adding Submarine Polish and started working on building an environment Submarine Controls: Fixed and Polished During further testing of the submarine on new features, I felt like steering the submarine felt awkward as it was locked on a flat horizontal plane. Pitching up and down required extra key binds. So I decided to change/improve the physics and input methods of the submarine so driving it feels much more smoother. From Third person Camera to Periscope: I decided to change my third person camera into a periscope to give my game a more ‘claustrophobic’ feel hoping to get the element to show how small you are in such a big ocean. Well, the periscope has a open and shut animation and well as audio polish. The player can see through a small circle and see their surroundings. (Also for visual polish when the submarine is at low health the glass will even appear cracked!) Full Axis mouse control: Moving the mouse left and right handles the Yaw (left and right) but now I made it so that it can handle the pitch (up and down) so the player can point the sub’s nose up when ascending. Keyboard Axis controls: The player does have the direct keys for vertical changes like diving and climbing still giving players all the options when using the submarine. Full Audio Response: I have added dynamics pitch scaling so the background engine hum will go change when in different states. Quiet for idle. Loud for moving. I added hiss and bubble effects just like how real submarine use their ballasts to rise and fall, hull breach alarms, collision thuds, warning sounds as well deep pressure creaking of the hull. Death Animation and Warning Collision: When the player reaches 0(Zero) health, the sub will like spin out of control and ‘crash land’ in the water. The screens will show errors and soon fade away. The scene then reloads. Also using a Shapecast3D , I managed to make a collisions system. The bottom left text will say ‘COLLISION : FINE’ if there are no objects in the enlarged ShapeCast but if there are objects in that shape the text will go red and say ‘COLLISION : WARNING’ Responsive Steering Controls: I also added a script to the steering wheel so it would turn as the player is moving the mouse to give it more responsiveness. Much better than a static wheel in the front. Marine Particles: Additionally, to give that immersive feel I made simple marine particles. These are like your pieces of plankton or dust in the ocean. They just float around the screen and even rush by appropriate to the sub’s velocity. Upgrading the Ocean: Boujie Water Shader After the player features and movement was locked in. It was time for environmental visuals. I realised that my basic volumetric fog wasn’t quite cutting it for an immersive ocean. After some research, I stumbled upon the fantastic Boujie Water Shader created by Cory Petkovsek (GodotNite / Boujie) I love this addon. It really brings the ocean to life using Gerstner waves this is really good for optimization in the future! What’s Next? With Submarine movement, UI and audio out of the way, the focus is now entirely towards Level Design and Gameplay loops. Here is my todo list: Mapping out ocean zones: I will have 3 zones and each zone has 4 artifacts. Each zone will get darker, and more scarier. Relic Retrieval: Now that I am changing my placeholder of ‘RINGS : 0/12’ to Relics I am thinking of making 12 ancient, artifacts scattered across the map waiting for the player to collect them. Potential Underwater Hazards: By placing environmental obstacles, tight squeeze caverns, minefields or even patrolling enemies this will make the gameplay much more exciting! See you in the next devlog where we explore level design!"}, {"post_id": 31071, "ts": "2026-07-19T05:19:25Z", "hours": 6.3125, "text": "Devlog 6 Finished Making the Interactive UI Took a little while but in the end, totally worth it! What have I accomplished: Real-Time Telemetry Arrays: Dynamic Navigation Tools: Integrated a fully functional Compass Heading indicator, alongside precise Speed (m/s) and Depth trackers linked directly to the sub’s 3D transform and linear physics state. Not to mention there is also a compass, a progress tracker and a warning system Vital Resource Gauges: The console now cleanly maps out real-time Stamina and Exhaustion meters to handle high-speed maneuvering and sprint cooldowns smoothly. Smart Health & “Frame-Before” Velocity Systems: Implemented a custom predictive physics calculation that catches the sub’s exact velocity right before a collision occurs. This completely bypasses physics-engine quirks (like velocity instantly dropping to zero on impact frames), ensuring blunt collisions register perfectly every time. Dynamic Hull Integrity Status: The hull damage bar dynamically recalculates color states and screen readouts: Above 66%: Status reads STABLE with green theme aesthetics.25% to 66%: Automatically shifts to a warning state (DAMAGED) with an orange alert profile. Emergency Visual Alert System (Dynamic Warning Lights): When structural health drops below the 25% Critical Zone, a time-accumulating sine wave engine takes over the console mesh arrays. This triggers an aggressive, high-speed visual flashing sequence across the interior status plates to warn the player of if its gonna die. Terminal Polish & Hacking Decorations: To capture that retro, high-tech submarine atmosphere, the dashboard now features a multi-layered background Parallax Hacking Screen that slides continuously behind the telemetry values. Combined with sudden flickering screen effects, the terminal reacts heavily to impact forces, making the player feel every heavy rattle when diving too fast into rocky corridors. What’s next? I want to make my 3rd person camera a periscope with the cute little spyglass on top of the submarine and allow to have a 360 degree of motion Adding a death screen and animation, not so sure of seeing myself still being able to run Also doing something about this Collision Warning alert in the bottom left corner. Definitely add some visual juice (screen shake, glass crack) but that’s low priority Also some audio! See you guys later!"}, {"post_id": 27098, "ts": "2026-07-12T11:19:19Z", "hours": 2.7919, "text": "Devlog 5 : Actual progress coming in about UI! By carefully placing each and every word, section, icon and evaluating every single number… the top screen of the submarine is officially done! What’s on the screen right now: Hull Integrity: A functioning system variable. Custom Healthbar: A sick-looking visual health layout. Rings / Checkpoint tracking: Keeps tabs on your current objectives. Status Alarms: Two red dots on the wings (which will flash for critical signs or dangers once I code the triggers). I got so excited that I even found a cool hacking matrix background and threw a Parallax2D on it so it looks like the sub is constantly processing code in the background On top of that, I added a custom shader flicker effect so it feels like a real, raw electronic monitor. As you can see in the screenshot, I just slapped a ColorRect2D added some code (with the help of AI as shader code is way beyond my coding capabilities. The big game-changer: I just switched the viewport texture configuration from the default Albedo slot over to the Emission channel so the cockpit doesn’t look so dull. Because the display now literally emits its own light into the dark, I was able to delete the temporary OmniLight3D from the scene entirely. The cockpit lighting looks way more natural now. Next Up: Now that the formula is down, I’m moving on to complete the other two viewports: the primary speedometer display right on the steering wheel, and the auxiliary bottom viewport sitting behind it."}, {"post_id": 14954, "ts": "2026-06-24T09:13:03Z", "hours": 3.8142, "text": "Fixing the Submarine Screen Layout Spent some time wrestling with Godot’s SubViewport system today to get the submarine’s overhead display screen actually working. What went down: The Layout Battle: Setting up the UI scene with clean container nodes ( CenterContainer and VBoxContainer ) so the labels stay organized and readable. The UV Stretch Crisis: For a while, the text was completely giant and blown out across the entire 3D mesh. Turns out the mesh’s UV unwrapping stretched the texture out like crazy. After a lot of tweaking, setting a custom UV1 scale of -2.0 on the material ended up being the magic number to force everything to shrink down and fit right onto the screen arch. Viewport Quirks: Dealt with some classic Godot issues where the texture kept disappearing or turning bright purple when making edits, but finally got the paths reconnected and running. Next Steps: I have to now fix and test these screens and to make sure they display the text flawlessly. Next up is prettying it up to make the text layouts look nice and crisp and then getting the rest of the cockpit dashboard screens mapped out."}, {"post_id": 13059, "ts": "2026-06-21T11:14:31Z", "hours": 1.9336, "text": "Submarine Devlog Update: Polishing the Pilot Experience! What’s New? I have decided to shelf the torpedoes and missiles for a bit. The absolute priority right now is making the submarine movement feel completely seamless before adding combat mechanics! Here is what just went live: ** Dynamic Camera Sway:** Added procedural camera sway that reacts directly to the submarine’s velocity and turn angles, making the underwater physics feel incredibly weighty! ** Dual-Perspective Toggle:** Implemented a first-person cockpit view. Players can now seamlessly toggle between 3rd-person and 1st-person perspectives by tapping the V key! Current Roadblocks & Design Hurdles 1. Overwhelming Cockpit Screens I am starting to build out the internal monitors and pilot UI. However, in my opinion, the current setup of these screens covers the view a bit too much. The player can’t really see the outside environment! 2. Camera Clipping Through Walls Also, something I am discovering is that despite using a standard SpringArm3D node for my third-person view, the camera is still clipping into the walls. I have been banging my head for so long trying to stop it from clipping! What’s Next? Over the next few days, my primary focus will be making the cockpit interior more lively: ** Adding Submarine UI:** Actively building and designing the interface systems for the dashboard. Filling Empty Screens: Populating those blank monitors with live text, data feeds, and telemetry. Some questions I have been asking my friends regarding my issues. How should I handle the screen layout? What are your favorite tricks for keeping a cockpit UI highly functional without completely blocking the player’s view of the outside world? How can I fix the camera clipping? If you have experience with SpringArm3D or collision detection in this engine, what am I missing to keep the camera outside the cave walls? How can I make the screens look properly sci-fi? What kind of design elements, color palettes, or visual details should I add to give the terminal text that high-tech, futuristic submarine vibe?"}, {"post_id": 12471, "ts": "2026-06-20T11:15:19Z", "hours": 1.0014, "text": "Devlog 2 : Added some visual juice and added full direction movement logic What have I accomplished? Finished submarine movement as well as bubble particles Realistic Bubbles : I created a sphere and slapped on a realistic transparent bubble shader that I had spent hours looking over the internet on how to code in shader text and finally got something working. Dynamic Trails : I duplicated a few of the GPU particles and put them on all sides of the submarine. Full Directional Logic : Then with a few lines of code, I got them to dynamically emit bubbles wherever I go. It works for the strafing side-to-side as well as climbing and diving. Overall, a good start to the movement of the submarine. What’s next? I will start working on UI for the submarine, maybe add a few monitors inside it for the player to see"}, {"post_id": 12321, "ts": "2026-06-20T03:16:57Z", "hours": 4.3461, "text": "Making Movement for the Submarine"}]...
|
Title: Underwater Submarine Adventure by @NC | Sta Title: Underwater Submarine Adventure by @NC | Stardance
Devlogs:
Making Movement for the Submarine
Devlog 2 : Added some visual juice and added full direction movement logic What have I accomplished? Finished submarine movement as well as bubble particles Realistic Bubbles : I created a sphere and slapped on a realistic transparent bubble shader that I had spent hours looking over the internet on how to code in shader text and finally got something working. Dynamic Trails : I duplicated a few of the GPU particles and put them on all sides of the submarine. Full Directional Logic : Then with a few lines of code, I got them to dynamically emit bubbles wherever I go. It works for the strafing side-to-side as well as climbing and diving. Overall, a good start to the movement of the submarine. What’s next? I will start working on UI for the submarine, maybe add a few monitors inside it for the player to see
Submarine Devlog Update: Polishing the Pilot Experience! What’s New? I have decided to shelf the torpedoes and missiles for a bit. The absolute priority right now is making the submarine movement feel completely seamless before adding combat mechanics! Here is what just went live: ** Dynamic Camera Sway:** Added procedural camera sway that reacts directly to the submarine’s velocity and turn angles, making the underwater physics feel incredibly weighty! ** Dual-Perspective Toggle:** Implemented a first-person cockpit view. Players can now seamlessly toggle between 3rd-person and 1st-person perspectives by tapping the V key! Current Roadblocks & Design Hurdles 1. Overwhelming Cockpit Screens I am starting to build out the internal monitors and pilot UI. However, in my opinion, the current setup of these screens covers the view a bit too much. The player can’t really see the outside environment! 2. Camera Clipping Through Walls Also, something I am discovering is that despite using a standard SpringArm3D node for my third-person view, the camera is still clipping into the walls. I have been banging my head for so long trying to stop it from clipping! What’s Next? Over the next few days, my primary focus will be making the cockpit interior more lively: ** Adding Submarine UI:** Actively building and designing the interface systems for the dashboard. Filling Empty Screens: Populating those blank monitors with live text, data feeds, and telemetry. Some questions I have been asking my friends regarding my issues. How should I handle the screen layout? What are your favorite tricks for keeping a cockpit UI highly functional without completely blocking the player’s view of the outside world? How can I fix the camera clipping? If you have experience with SpringArm3D or collision detection in this engine, what am I missing to keep the camera outside the cave walls? How can I make the screens look properly sci-fi? What kind of design elements, color palettes, or visual details should I add to give the terminal text that high-tech, futuristic submarine vibe?
Fixing the Submarine Screen Layout Spent some time wrestling with Godot’s SubViewport system today to get the submarine’s overhead display screen actually working. What went down: The Layout Battle: Setting up the UI scene with clean container nodes ( CenterContainer and VBoxContainer ) so the labels stay organized and readable. The UV Stretch Crisis: For a while, the text was completely giant and blown out across the entire 3D mesh. Turns out the mesh’s UV unwrapping stretched the texture out like crazy. After a lot of tweaking, setting a custom UV1 scale of -2.0 on the material ended up being the magic number to force everything to shrink down and fit right onto the screen arch. Viewport Quirks: Dealt with some classic Godot issues where the texture kept disappearing or turning bright purple when making edits, but finally got the paths reconnected and running. Next Steps: I have to now fix and test these screens and to make sure they display the text flawlessly. Next up is prettying it up to make the text layouts look nice and crisp and then getting the rest of the cockpit dashboard screens mapped out.
Devlog 5 : Actual progress coming in about UI! By carefully placing each and every word, section, icon and evaluating every single number… the top screen of the submarine is officially done! What’s on the screen right now: Hull Integrity: A functioning system variable. Custom Healthbar: A sick-looking visual health layout. Rings / Checkpoint tracking: Keeps tabs on your current objectives. Status Alarms: Two red dots on the wings (which will flash for critical signs or dangers once I code the triggers). I got so excited that I even found a cool hacking matrix background and threw a Parallax2D on it so it looks like the sub is constantly processing code in the background On top of that, I added a custom shader flicker effect so it feels like a real, raw electronic monitor. As you can see in the screenshot, I just slapped a ColorRect2D added some code (with the help of AI as shader code is way beyond my coding capabilities. The big game-changer: I just switched the viewport texture configuration from the default Albedo slot over to the Emission channel so the cockpit doesn’t look so dull. Because the display now literally emits its own light into the dark, I was able to delete the temporary OmniLight3D from the scene entirely. The cockpit lighting looks way more natural now. Next Up: Now that the formula is down, I’m moving on to complete the other two viewports: the primary speedometer display right on the steering wheel, and the auxiliary bottom viewport sitting behind it.
Devlog 6 Finished Making the Interactive UI Took a little while but in the end, totally worth it! What have I accomplished: Real-Time Telemetry Arrays: Dynamic Navigation Tools: Integrated a fully functional Compass Heading indicator, alongside precise Speed (m/s) and Depth trackers linked directly to the sub’s 3D transform and linear physics state. Not to mention there is also a compass, a progress tracker and a warning system Vital Resource Gauges: The console now cleanly maps out real-time Stamina and Exhaustion meters to handle high-speed maneuvering and sprint cooldowns smoothly. Smart Health & “Frame-Before” Velocity Systems: Implemented a custom predictive physics calculation that catches the sub’s exact velocity right before a collision occurs. This completely bypasses physics-engine quirks (like velocity instantly dropping to zero on impact frames), ensuring blunt collisions register perfectly every time. Dynamic Hull Integrity Status: The hull damage bar dynamically recalculates color states and screen readouts: Above 66%: Status reads STABLE with green theme aesthetics.25% to 66%: Automatically shifts to a warning state (DAMAGED) with an orange alert profile. Emergency Visual Alert System (Dynamic Warning Lights): When structural health drops below the 25% Critical Zone, a time-accumulating sine wave engine takes over the console mesh arrays. This triggers an aggressive, high-speed visual flashing sequence across the interior status plates to warn the player of if its gonna die. Terminal Polish & Hacking Decorations: To capture that retro, high-tech submarine atmosphere, the dashboard now features a multi-layered background Parallax Hacking Screen that slides continuously behind the telemetry values. Combined with sudden flickering screen effects, the terminal reacts heavily to impact forces, making the player feel every heavy rattle when diving too fast into rocky corridors. What’s next? I want to make my 3rd person camera a periscope with the cute little spyglass on top of the submarine and allow to have a 360 degree of motion Adding a death screen and animation, not so sure of seeing myself still being able to run Also doing something about this Collision Warning alert in the bottom left corner. Definitely add some visual juice (screen shake, glass crack) but that’s low priority Also some audio! See you guys later!
Devlog 7: Finished Adding Submarine Polish and started working on building an environment Submarine Controls: Fixed and Polished During further testing of the submarine on new features, I felt like steering the submarine felt awkward as it was locked on a flat horizontal plane. Pitching up and down required extra key binds. So I decided to change/improve the physics and input methods of the submarine so driving it feels much more smoother. From Third person Camera to Periscope: I decided to change my third person camera into a periscope to give my game a more ‘claustrophobic’ feel hoping to get the element to show how small you are in such a big ocean. Well, the periscope has a open and shut animation and well as audio polish. The player can see through a small circle and see their surroundings. (Also for visual polish when the submarine is at low health the glass will even appear cracked!) Full Axis mouse control: Moving the mouse left and right handles the Yaw (left and right) but now I made it so that it can handle the pitch (up and down) so the player can point the sub’s nose up when ascending. Keyboard Axis controls: The player does have the direct keys for vertical changes like diving and climbing still giving players all the options when using the submarine. Full Audio Response: I have added dynamics pitch scaling so the background engine hum will go change when in different states. Quiet for idle. Loud for moving. I added hiss and bubble effects just like how real submarine use their ballasts to rise and fall, hull breach alarms, collision thuds, warning sounds as well deep pressure creaking of the hull. Death Animation and Warning Collision: When the player reaches 0(Zero) health, the sub will like spin out of control and ‘crash land’ in the water. The screens will show errors and soon fade away. The scene then reloads. Also using a Shapecast3D , I managed to make a collisions system. The bottom left text will say ‘COLLISION : FINE’ if there are no objects in the enlarged ShapeCast but if there are objects in that shape the text will go red and say ‘COLLISION : WARNING’ Responsive Steering Controls: I also added a script to the steering wheel so it would turn as the player is moving the mouse to give it more responsiveness. Much better than a static wheel in the front. Marine Particles: Additionally, to give that immersive feel I made simple marine particles. These are like your pieces of plankton or dust in the ocean. They just float around the screen and even rush by appropriate to the sub’s velocity. Upgrading the Ocean: Boujie Water Shader After the player features and movement was locked in. It was time for environmental visuals. I realised that my basic volumetric fog wasn’t quite cutting it for an immersive ocean. After some research, I stumbled upon the fantastic Boujie Water Shader created by Cory Petkovsek (GodotNite / Boujie) I love this addon. It really brings the ocean to life using Gerstner waves this is really good for optimization in the future! What’s Next? With Submarine movement, UI and audio out of the way, the focus is now entirely towards Level Design and Gameplay loops. Here is my todo list: Mapping out ocean zones: I will have 3 zones and each zone has 4 artifacts. Each zone will get darker, and more scarier. Relic Retrieval: Now that I am changing my placeholder of ‘RINGS : 0/12’ to Relics I am thinking of making 12 ancient, artifacts scattered across the map waiting for the player to collect them. Potential Underwater Hazards: By placing environmental obstacles, tight squeeze caverns, minefields or even patrolling enemies this will make the gameplay much more exciting! See you in the next devlog where we explore level design!
Devlog 8: Imported Environmental Assets and Hazards What I have accomplished: Using Blender 5.0 I hand modelled all the 3D assets. RUINS For some ruins where the relic might be, I have added some crumbled pillars, ruined archways, cracked stone slabs and an altar for the relic to rest on. I did some basic extruding to get the original shape down, then just pulled and twitched with the vertexes to give it the run down effect Sea mines! Additionally, the sea mine was fairly easy to make, a sphere, cylinders and a chain. Making the chain to the base was by far was the most satisfying part of the build as you just copy, paste, rotate and within seconds you get a neat, professional looking chain. Relics The relics were pretty easy, a glowing orb with unique patterns drawn across it and a shield. The plan is to just change the colour of the hues so the player has a common sense of what an orb looks like. Colours can be blue, violet, pink, red, yellow, gold, orange, and vice versa for the shield. Underwater Predator Now, the main event, the shark. I spent 6 hours and 32 minutes, modelling, texturing, rigging and animating this thing. This is by far the most complex project I have ever done (maybe even the most successful in terms of rigging!) Below is the link of all my lapses for the shark only https://lapse.hackclub.com/user/@NCGAMEMAKING I’ve set the basic environment up, just a big square with rocks as barriers. What’s next? Using all of these assets to make the environment. I have to layout the relics, ruins, sea mines, sharks. I have to code out the sea mine so it explodes with explosion graphics (not that hard) Code the shark so it like swims in its patrol area and so if the player’s flashlight is shining on the shark it will start chasing the player, hurt the player and move on with its basic patrol.
Devlog 9: Major Change of Plans and Coded Assets What have I accomplished: Started Making the environment Made a scanner for the periscope to detect objects Coded the sea mine Added explosion Particles The part that took the longest was the environment, taking in the lengths, finding hidden collision gaps, setting each zone up and placing obstacles. The sea mine code was fairly simple, I also added some explosion particles when it exploded. That was really fun. Additionally, I made a periscope scanner that can scan the ocean for any relics/mines/sharks in sight. The most aesthetic addition to the submarine and it gives the periscope a proper purpose rather than just a fun extra. I was heavily inspired by Call of Duty with their MMS (Milimeter scanner). This scanner can see through walls and highlight enemies! Major change in plans : Before we would have relics being the prized possession to retrieve. However, after realising how vast the map was and the extreme likelihood of players not being able to find all relics was too high to ignore. So instead of the player collecting relics, I have decided that they will go on an extremely difficult mission to retrieve some nuclear warheads/missiles on a U.S. nuclear submarine. The abandoned submarine will lie at the very bottom of 300m. The player must dodge sea mines, explore the other shipwrecks/submarines all before some rivals get their hands on it. Something like that for the briefing screen The player will deploy buoys/parachutes on the missiles, and they will float to the surface. A boat will come and collect them. Mission Complete! What’s Next? I will be using a similar layout but with a different set of decorations, more submarines/shipwrecks, signs of naval warfare, mines and the warhead finally.
Devlog 10: Finished map layout and small tweaks to submarine started working on story and UI What have I accomplished: Finished making the environment Coded the sharks to move around the map Added clues for the player Started the story, the lore, the introduction Finished the environment: Making the environment definitely took the longest but it wasn’t the hardest task, just a lot of copy and paste of walls. However finding any gaps or holes in which the player can creep down into was annoying. After a few hours of looking around, banging into walls, I did find and patch up a few but am not sure if that is all of them. Hopefully, to discourage/guide the player away from the corners and edges, I put huge sharks guarding the walls as well as rows of sea mines to tell the player to look somewhere else, not here. Also, I added a couple of underwater ruins, like a wrecked ship and a submarine. The actual warhead retrieval process is working now, when the submarine touches it, a parachute will come up and lift the warhead to the surface, where hopefully the boat will collect. Coding the sharks! Coding the sharks was fairly easy (Literally 2 lines of code) as I used a Path3D and a PathFollow3D node to just map out the path in the inspector. func _process(delta): progress += 20*delta That is all the code, the progress, is how far the shark is along the track and the integer determines how fast the shark moves. I could’ve used an AnimationTree node but with my prior experience to that, just thinking of the whole coding part, setting the animations up, the chase player code made me cringe a lot, also there’s not enough time. Giving the player clues So in addition to the current features of the MMS scanner, it can also track the ‘SOS beacon’ of the abandoned target submarine by taking its position and comparing it to the player’s and using ranges of signal strength with distance to see how ‘strong’ the signal is. Additionally, it does the exact same for angle, so the scanner can tell player which direction the submarine was found. Started the introduction The plan in mind is like some cool visual graphics telling you, your objective, a brief map layout telling you of hazards, some lore, like ‘Secret weapon’s mission gone wrong, must retrieve warheads before enemies do so’ the submarine is on a tugboat sailing on the sea, the crane will pick it up and dump it in the water Full lapse of tugboat here : https://lapse.hackclub.com/timelapse/lsYzC1wA-xLH What’s next? Adding UI to the game, pause menu, main menu, death screen Finishing lore of game, animations, mission objective, win scene.
Devlog 11: Working on UI as well as Prologue/Epilogue animations What have I accomplished: Made a main menu Made a mission de/briefing scene Made a pause menu Finished with the Prologue/Epilogue animations Added a bonus cutscene during the retrieval of the warheads Made a main menu I went for an extreme horror vibe, dark environment, low light, eerie background noises and single sonar ping. I also animated the camera so that it ‘floats’ around as well as a nearly invisible figure moving in the background to give that eerie feeling that you are not safe and something is watching you. This was done in response to my research on what makes a horror game so scary from the menu only. Mission de/briefing scene Using the visible characters setting in the Label node, I made this niche typewriter/coding briefing scene. With a single ‘ACCEPT’ button. Upon clicking it, player gets sent to the play scene. Pause screen I made a fairly simple pause screen. Nothing fancy, but vital at the same time. Press ‘Escape’, game paused. I am considering reusing the pause menu, change the text with code to use it as a death screen The intro/outro animations The animations are just the player being transported on the tugboat. The same one I modelled in the previous devlog. Intro takes the player to the site. Outro has 5/6 warheads on it and taking the player away from the site. This is to add cohesion so the player doesn’t get confused between scene transitions. However, I realised during the animations, the sky in the environment goes MAD. It starts rapidly flashing between white and blue, similar to lightning, but I am not a fan of it, must remove. BONUS scene! I decided to spice things up by adding a little bit of drama at the end. The player will collect the 6th warhead, uh-oh it’s jammed AND at the SAME time, the ceiling’s going to collapse! The player ram their hull with the warhead to trigger the ignition. The warhead will launch itself at the wall creating a huge hole for the player to escape through, they rise up to the surface and the epilogue cutscene plays. What’s Next? Making a death screen (Should be easy) Making a tutorial on the submarine functionality. Doing the README document
Devlog 12 : Finished Death screen as well as added help features What have I accomplished: Added a death screen Added a ‘help’ feature and hints in the submarine Made a death screen The death screen was fairly easy, I just repurposed the pause screen to become the death screen when the player dies. Added a help feature Put a help option on the home screen. If you hover your mouse over the help button, the hints will appear on the side, similar to FNAF. Additionally, I added a scrolling bar that goes from right to left on the submarine UI. I didn’t want to add another button to the pause menu because it would look too cluttered. This new addition looks pretty neat. What’s Next? Making the README document Getting people to test my game Implement some of their feedback
Devlog 13 : Recieved Tester Feedback and implemented it What have I accomplished: I have asked a tester (Dad) to test my game. He started playing the game and gave me a sheet of feedback. Upon deciphering the handwriting I made a list of main list of what needs to be improved. Here is the list Give more screen-space for player to see ocean Do something about the radio messages being sent as they are very annoying when the player is exploring and they just appear and block the player’s screen Also the radio messages go away too quickly The flashlight isn’t crisp. It like bleeds into the ocean and doesn’t look nice The ocean environment is too dark, make it brigher What/How did I implement the feedback? As a result, I merged the top panel into the bottom panel while replacing the top section with the radio messages. This time the player has much more screen-space to play in while the radio messages just briefly appear on the screen, not blocking the player’s view. As for the flashlight, I used a MeshInstance3D equipped with an emission Material so the flashlight looks much “crisper”. I also increased the show time for the radio messages from 3 seconds to 5 seconds so player will realise that a message has popped and has sufficient time to read it. As for the ocean environment, I just boosted the emission of the volumetric fog while make the background color slightly lighter rather than leaving it pitch black (Made it like a really dark navy blue). Bonus bug patch! While testing the game, I also found a bug with the Restart button in the pause screen. The bug was that when the player pressed restart, the scene tree was still paused, so the intro animation wouldn’t start until you unpaused it. So in order to fix this I just added another single line of code. func _on_restart_button_pressed(): get_tree().paused = false#This was the line of code needed get_tree().reload_current_scene() That is it so far, definitely getting more people to test it (Family, friends etc…) and implementing more feedback!
Devlog 14: Received 2nd Round of Feedback and Implemented it. What have I accomplished: I went to my coding club and asked fellow Godot/Unity enthusiasts to test my game! Here’s basically what they said… They couldn’t find the tunnel entrances The Radio Messages don’t stand out enough Make the Flashlight brighter (again…) Add some sort of Sonar Scan circle thingy on the periscope - make it more useful rather than a wall of text Make the main menu brighter, can’t see the submarine Do not exactly know the initial objective of the game/where to go Make Arrows or hints to show player what to do in Finale sequence When the player escapes through the tunnel, add some decorations make it less boring. Additionally, I got a 2nd round of feedback from my Dad… He said the UI is much better, less cluttered and the flashlight is better as well as the other features, but he has some more feedback. He wants a minimap, so he can see where to go because he is lost and does not understand the compass heading. He wants a clearer font for the submarine UI as the current one is too blurry for him He wants me to put radioactive trifoils on the missiles So onto how I implemented their feedback I made some vines on blender, I did it fairly quicky i didn’t bother putting it on Lapse. So, I implemented the vines with a glowing green shader, so it is easily visible to the player. I placed them in paths leading to the entrance and tunnels, so player knows where to go. As for the radio messages I added a yellow flashing border around them to attract player attention. As for the flashlight, I just cranked the energy up to like 50+, did the job pretty well. I added a sonar scan because the testers believe that the beacon signal is too generic and not really helpful, thus making the periscope itself not useful. In order to improve this, I added a sonar scan, the circular map that actual submarines use. After looking at some tutorials, checking documentation and reddit posts, I realized that I just have to somehow convert my prior knowledge of polar coordinates and convert them into game code. After a while, I got the red dots (sea mines) to appear on the map when the player presses the scan button (x). Additionally, using groups, I got the warheads to come up as yellow dots on the sonar map. The main menu was an easy fix, just had to increase the energy of the light. As for the initial objective, I made an animation where the camera shows the player where the warheads are located and the journey they have to take, it like shows the whole path so the player has some knowledge of knowing if they are going on the right path. Also just added another hint telling the player of the direction (80-90° East.) As for the Finale sequence, I just added a spinning arrow that points to the warhead signalling that the player has to ram it with their hull. Additionally, there are radio messages telling the player what to do. When the player escapes, I added a tall, enclosed tunnel with hanging vines for the player to escape through. Makes the game design much more intentional and doesn’t confuse players into thinking they just broke through the map. For the minimap, I used a SubViewportContainer with a camera being referenced to the actual SubViewport Node. The camera is in Orthogonal mode, and just facing down on the player 30metres away. The input is being displayed on the SubViewport. For the submarine font, I changed some of the colors so the font stands out more and becomes more CRISP and changed the font so the player can easily understand what’s on the dashboard. Another quick and easy fix was the radioactive logos. Just got a MeshInstance3D and slapped the texture on there and stuck it on the side of the warhead. This is probably the last devlog until submission.
Devlog 15: Exported Game & Ready for Submission! This is the last devlog until submissions, I was just getting the export templates and etc. I also finished with the README No actual progress…
Ships:
I built Abysmal Echo. This is by far my most comprehensive project I have EVER made using the Godot Engine. I put a lot of effort into it and I hope you enjoy playing it This game is about recovering some nuclear warheads at the bottom of the sea while navigating fields of sea mines, cavernous tunnels and mutated sharks. Good Luck! P.S. Please read the controls on how to play the game. PLEEASE...
|
1793004485.1695528
|
1793090885.1695528
|
|
17270
|
File Compressor in C by @barseghian_daniel | Stard File Compressor in C by @barseghian_daniel | Stardance...
|
barseghian_daniel
|
2
|
81.0
|
1044
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-27T08:05:03Z", "hours": 12.0, "multiplier": 14.9, "payout": 181, "blessing": "neutral", "text": "made a website for my C code! It was really challenging to work with the WASM module since it’s limited to 32 bits (4GB RAM), but I managed to make it work! I also optimized the C code to use much less RAM (see the devlog). Sadly the website is limited to 220MB per file (because of WASM), but you can still process large files with the GitHub release! You can test it via the website or the GitHub release!", "repo": "https://github.com/danielbarseghian/file-compressor", "demo": "https://dancing-hotteok-83ce45.netlify.app/"}, {"ship_num": 2, "ts": "2026-07-17T21:45:09Z", "hours": 69.0, "multiplier": 12.73, "payout": 863, "blessing": "neutral", "text": "I made a file compressor/decompressor written in C! You can use it on Linux, Windows, and macOS. The part that took the most time was DEBUGGING . It took SOOOOO much more time than I expected! I’m really proud of finishing the project. I consider this my first full project, so yeah, it took some time, but I finally finished it! You should know that all the information is in the README (installation, description, etc.). It was really fun working on it, but all good things come to an end!", "repo": "https://github.com/danielbarseghian/file-compressor", "demo": "https://dancing-hotteok-83ce45.netlify.app/"}]...
|
[{"post_id": 55426, "ts": "202 [{"post_id": 55426, "ts": "2026-08-27T07:56:40Z", "hours": 0.3333, "text": "ITS DEPLOYED! i added a small status text to know when its compressing/decompressing. you can try it the website here !"}, {"post_id": 55045, "ts": "2026-08-26T14:03:53Z", "hours": 3.1169, "text": "ITS REALEAAAAASEDD the updated C code is release go check it out here !"}, {"post_id": 54104, "ts": "2026-08-24T22:04:14Z", "hours": 3.4836, "text": "Optimized code for less R*M usage! For a 2.8gb file it was taking 2.8gb of ram but now its taking 42 KB! I was putting the file in the ram but now i stream the file to ram for 99.999% less ram usage!"}, {"post_id": 51584, "ts": "2026-08-21T11:04:04Z", "hours": 0.2833, "text": "Imported decompressor ! well it was super easy to import the decompressor since it was very similar to the compressor code!"}, {"post_id": 51554, "ts": "2026-08-21T10:19:38Z", "hours": 1.0667, "text": "Compressed file directly in the browser ! i compiled the C code into wasm (web assembly) so i can use it inside the browser!"}, {"post_id": 50560, "ts": "2026-08-19T19:27:18Z", "hours": 3.5453, "text": "BACK ON C ! F**K WINDOWS, C# AND UNITY i missed C so much and working on linux too its just so much more fun and fast and, i can’t make game look good… look at my latest project . Im finally back at my roots"}, {"post_id": 30609, "ts": "2026-07-18T10:06:56Z", "hours": 0.3169, "text": "My Ship got rejected… kinda My Ship got requested change because my banner didn’t showcase the project now i changed it, here i compress and decompress a jpeg file and then open it! Hope this next ship will be accepted!"}, {"post_id": 30322, "ts": "2026-07-17T19:42:36Z", "hours": 1.9761, "text": "ITS REALEAAAAAASED You can use it for Windows, macOS, and Linux. The tutorial is mentioned under the README for all three systems. I tested it on Windows and Linux. I don’t have any Apple devices to test it out. :("}, {"post_id": 29790, "ts": "2026-07-16T22:05:17Z", "hours": 2.9333, "text": "about the website… So… I abandoned it I CAN’T MAKE WEBSITES, I CAN’T STAND JAVASCRIPT. I tried to use WebAssembly, but it’s not widely used, so it’s really hard to work with. How can you use it? Well, use it with the CLI like a super nerd Don’t worry, everything is documented in the README. CLI » JAVASCRIPT"}, {"post_id": 29200, "ts": "2026-07-15T22:51:38Z", "hours": 2.3436, "text": "Started website, web assembly and my own extension! Extension I added the .huff extension since it will help me recognize files compressed by my compressor. The format used is .extension.huff (example: image.jpg.huff). Web Assembly I compiled the code to web assembly so it can run directly on the user’s PC and not on servers. Website I’m creating a simple website that just does the j*b (still woking on it, this is just the core). The website will not communicate with other APIs or services, thanks to web assembly. I hate JavaScript."}, {"post_id": 28517, "ts": "2026-07-14T20:28:35Z", "hours": 7.76, "text": "I reached… the end? So i’ve been testing for a while now and i didn’t have much to say…. I successfully compressed, decompressed and burnt a linux iso and booted into one ! It required alot of troubleshooting and waiting ( 5 - 15min PER TRY ) but hey now it works on any file!"}, {"post_id": 26022, "ts": "2026-07-10T16:30:07Z", "hours": 2.9822, "text": "how did it work? i REALLY don’t know how it worked but it worked, a famouse programming therm if it works, don’t touch it! I just changed a char to an unsigned char lol."}, {"post_id": 22897, "ts": "2026-07-05T15:12:46Z", "hours": 1.25, "text": "Learned mmap open …. I did some exercices on mmap , open , fstat and learned thoses, next i have to implemente it in compressor.c"}, {"post_id": 22178, "ts": "2026-07-04T14:41:32Z", "hours": 4.1289, "text": "Found the problem for segmentation error (I’m back) So i had this error for the past 4 days and i coudn’t fix it so i even take a step back for 2 days but still coudn’t find it, the problem was that i had to wait 5 min for every try i did. Fix ? I used claude so he run test on faster machines, and i got the errors i have to fix. (He wanted to script it himself, i obviously said no)."}, {"post_id": 19304, "ts": "2026-06-30T15:58:16Z", "hours": 4.4594, "text": "FINALLYYYYYYYYYYYYY I successfully compressed and decompressed a file other than text files, I used binary to write the files so it supports all the file types now! What was the problem ? So the compressed file were written in text and decompressed with text wich limited the compression for only text files. What was the fix ? I wrote the compressed file and decompressed in binary. (small part of the code i changed)"}, {"post_id": 17826, "ts": "2026-06-28T19:16:21Z", "hours": 2.0475, "text": "IT WORKS but only in text files… Why dosn’t it work? In the metadata, i write it as a text file (a:1|b:5…), it works fine for text files but for other files type, it dosn’t work since its written in binary. Any solutions? i have to write the metadata in binary, yayyy…"}, {"post_id": 17618, "ts": "2026-06-28T14:25:13Z", "hours": 4.9825, "text": "NEVER code something with AI What happened? So i said to myself that i can code this small part with AI since i don’t know the synstaxe and I did it and its the problem now. I learned bitwise operators and logique and then recoded the part, didnt finish yet."}, {"post_id": 16911, "ts": "2026-06-27T13:48:34Z", "hours": 1.3667, "text": "it’s SO HOT in europe There was an issue with compressor.c while doing it with other files than png. I’m still working on decompressor.c it can’t decode normally a file other than png. Text files still works. Heatwave Its so hot in europe, I can’t work normally, the temperatures will go down monday hopefully."}, {"post_id": 16759, "ts": "2026-06-27T06:54:22Z", "hours": 2.5828, "text": "FINALLY FINISHED compressor.c AND decompressor.c THE BUG so the main bug was that the two arrays which contained the frequencies of each letter were reversed so the huffman tree was not the same and the codes too weren’t the same. THE FIX so in decompressor.c i just reversed the codes. this is not a permanent fix will investigate further into compressor.c to see why its reversed!"}, {"post_id": 15823, "ts": "2026-06-25T18:36:34Z", "hours": 2.865, "text": "Finished reading bytes, Almost finished I’m almost finished with my code (this is my longest project yet) i’m so existed ! What am i doing next? pray for no bugs"}, {"post_id": 15143, "ts": "2026-06-24T16:30:30Z", "hours": 3.1906, "text": "Fixed swapping issues, transfer list array into node array, and building codes works Swapping issues i had an issue where i was putting the new node in first in the link list so i fix it, drawing it on a sketch really helped . Transfer list to node So i transfer it into an array since its easier to use it and i coudn’t built it before since an array is a fixed size, thats why I used a linked list to first get the values and the length. Building huffman codes I just imported function i already programmed in compressor.c . image from wikipedia"}, {"post_id": 14259, "ts": "2026-06-23T09:03:36Z", "hours": 5.0258, "text": "Started to code decompresor.c i have alot of problems with decompressor.c notably two nulls caracters at the start."}, {"post_id": 12483, "ts": "2026-06-20T11:51:35Z", "hours": 2.3331, "text": "FREED ALL THE MEMORY All this memory can be reused for other good causes now"}, {"post_id": 12168, "ts": "2026-06-19T21:33:52Z", "hours": 1.2511, "text": "Finally FINISHED compressor.c when you finally finished that code"}, {"post_id": 11891, "ts": "2026-06-19T11:42:29Z", "hours": 1.3531, "text": "C programmer TOUCHING grass for the FIRST TIME I didnt program for 2 days and touched some grass. How was it ? it was weird since it was grass (wich i don’t touch) but it was ok. btw it was fake grass"}, {"post_id": 9454, "ts": "2026-06-15T20:20:27Z", "hours": 0.9128, "text": "why are we only using I in loops? its a real question why only I ? I used f it was so cool. Use other letters for your loops. I’m onto something guys, it’s the next big thing. P.S : I’m going to take a break from coding in C since its pretty anoying and im not really doing anything while working maybe this challenge is really too hard for me. I’m maybe going to start another project then see."}, {"post_id": 8873, "ts": "2026-06-14T19:33:29Z", "hours": 0.6917, "text": "Brain cells aren’t connecting I’m super tired and my brain cells aren’t working right. sticker by fancy void"}, {"post_id": 8756, "ts": "2026-06-14T15:48:50Z", "hours": 2.1778, "text": "FINISHED COMPRESSOR.C Finnaly finished compressor.c after 7 hours on it! How did it did it ? Well i used AI… Yes I’m not proud but hey its finished! I was really tired and I just vibe coded it but now no more AI for decompressor.c ! Did i learn something? Yes i didn’t blindly ask AI do give answers i asked to help debug the code! What do i do next? Probably sleep, I’m so tired."}, {"post_id": 8557, "ts": "2026-06-14T07:01:26Z", "hours": 1.4881, "text": "Building huffman code tree Finally finished coding everything but the tree. I can finally code without AI so for relearning, i authorized myself to use AI but only to debug, now i can finally not use it (since i relearned C) Problems I ran into several problems: Segmentation problems, i was accessing things i normally can’t Future problem, i can’t name something with more than two carrecters so when i’m merging two nodes i can’t rename thoses."}, {"post_id": 8314, "ts": "2026-06-13T20:33:53Z", "hours": 3.7689, "text": "FINALLY FIXED SEGMENTATION PROBLEMS For context i was building the compressor and i had segmentation problems What is a segmentation problem? A segmentation problem is when you try and access memory your don’t have access. What was the problems? First the allocation, i didnt allocate for the array of pointers to my struct. Didnt check for NULL, so my arrays have 256 nodes (for all of the ASCII values) and i was trying to access values that just didnt existed. How did i fix it? I used AI to debug my code, I didnt directly asked for the awnsers, i asked it to help me without giving out awnsers. AI was very useful since i mad alot of small mistakes since i didnt program in C for a long time."}, {"post_id": 7715, "ts": "2026-06-12T21:35:38Z", "hours": 4.4744, "text": "CS50x C Refresher Redid one exercise from CS50x Psets 2, 3, 4, and 5. I wanted to refresh my C programming skills because after Week 5 the course shifts more toward web applications, databases, and other topics. This was a good way to get back into writing C before continuing work on Stardance."}, {"post_id": 7461, "ts": "2026-06-12T13:14:46Z", "hours": 0.2653, "text": "Studying Huffman Coding Huffman Coding is a lossless compression algorithm . Example text: ffffcdabdfdeeebcc First, count how often each character appears: f:4 c:3 d:3 e:3 b:2 a:1 Then repeatedly merge the least frequent characters into a binary tree until one final tree remains. Each character gets a binary code: Left = 0 Right = 1 More frequent characters receive shorter codes , reducing the total file size. A key rule: no code can start with another code . If f = 1 , then 100 cannot be another character, so decoding stays unambiguous. Time complexity: O(n log n) Image: GeeksforGeeks Video: Computerphile – Huffman Coding"}]...
|
Title: File Compressor in C by @barseghian_daniel Title: File Compressor in C by @barseghian_daniel | Stardance
Devlogs:
Studying Huffman Coding Huffman Coding is a lossless compression algorithm . Example text: ffffcdabdfdeeebcc First, count how often each character appears: f:4 c:3 d:3 e:3 b:2 a:1 Then repeatedly merge the least frequent characters into a binary tree until one final tree remains. Each character gets a binary code: Left = 0 Right = 1 More frequent characters receive shorter codes , reducing the total file size. A key rule: no code can start with another code . If f = 1 , then 100 cannot be another character, so decoding stays unambiguous. Time complexity: O(n log n) Image: GeeksforGeeks Video: Computerphile – Huffman Coding
CS50x C Refresher Redid one exercise from CS50x Psets 2, 3, 4, and 5. I wanted to refresh my C programming skills because after Week 5 the course shifts more toward web applications, databases, and other topics. This was a good way to get back into writing C before continuing work on Stardance.
FINALLY FIXED SEGMENTATION PROBLEMS For context i was building the compressor and i had segmentation problems What is a segmentation problem? A segmentation problem is when you try and access memory your don’t have access. What was the problems? First the allocation, i didnt allocate for the array of pointers to my struct. Didnt check for NULL, so my arrays have 256 nodes (for all of the ASCII values) and i was trying to access values that just didnt existed. How did i fix it? I used AI to debug my code, I didnt directly asked for the awnsers, i asked it to help me without giving out awnsers. AI was very useful since i mad alot of small mistakes since i didnt program in C for a long time.
Building huffman code tree Finally finished coding everything but the tree. I can finally code without AI so for relearning, i authorized myself to use AI but only to debug, now i can finally not use it (since i relearned C) Problems I ran into several problems: Segmentation problems, i was accessing things i normally can’t Future problem, i can’t name something with more than two carrecters so when i’m merging two nodes i can’t rename thoses.
FINISHED COMPRESSOR.C Finnaly finished compressor.c after 7 hours on it! How did it did it ? Well i used AI… Yes I’m not proud but hey its finished! I was really tired and I just vibe coded it but now no more AI for decompressor.c ! Did i learn something? Yes i didn’t blindly ask AI do give answers i asked to help debug the code! What do i do next? Probably sleep, I’m so tired.
Brain cells aren’t connecting I’m super tired and my brain cells aren’t working right. sticker by fancy void
why are we only using I in loops? its a real question why only I ? I used f it was so cool. Use other letters for your loops. I’m onto something guys, it’s the next big thing. P.S : I’m going to take a break from coding in C since its pretty anoying and im not really doing anything while working maybe this challenge is really too hard for me. I’m maybe going to start another project then see.
C programmer TOUCHING grass for the FIRST TIME I didnt program for 2 days and touched some grass. How was it ? it was weird since it was grass (wich i don’t touch) but it was ok. btw it was fake grass
Finally FINISHED compressor.c when you finally finished that code
FREED ALL THE MEMORY All this memory can be reused for other good causes now
Started to code decompresor.c i have alot of problems with decompressor.c notably two nulls caracters at the start.
Fixed swapping issues, transfer list array into node array, and building codes works Swapping issues i had an issue where i was putting the new node in first in the link list so i fix it, drawing it on a sketch really helped . Transfer list to node So i transfer it into an array since its easier to use it and i coudn’t built it before since an array is a fixed size, thats why I used a linked list to first get the values and the length. Building huffman codes I just imported function i already programmed in compressor.c . image from wikipedia
Finished reading bytes, Almost finished I’m almost finished with my code (this is my longest project yet) i’m so existed ! What am i doing next? pray for no bugs
FINALLY FINISHED compressor.c AND decompressor.c THE BUG so the main bug was that the two arrays which contained the frequencies of each letter were reversed so the huffman tree was not the same and the codes too weren’t the same. THE FIX so in decompressor.c i just reversed the codes. this is not a permanent fix will investigate further into compressor.c to see why its reversed!
it’s SO HOT in europe There was an issue with compressor.c while doing it with other files than png. I’m still working on decompressor.c it can’t decode normally a file other than png. Text files still works. Heatwave Its so hot in europe, I can’t work normally, the temperatures will go down monday hopefully.
NEVER code something with AI What happened? So i said to myself that i can code this small part with AI since i don’t know the synstaxe and I did it and its the problem now. I learned bitwise operators and logique and then recoded the part, didnt finish yet.
IT WORKS but only in text files… Why dosn’t it work? In the metadata, i write it as a text file (a:1|b:5…), it works fine for text files but for other files type, it dosn’t work since its written in binary. Any solutions? i have to write the metadata in binary, yayyy…
FINALLYYYYYYYYYYYYY I successfully compressed and decompressed a file other than text files, I used binary to write the files so it supports all the file types now! What was the problem ? So the compressed file were written in text and decompressed with text wich limited the compression for only text files. What was the fix ? I wrote the compressed file and decompressed in binary. (small part of the code i changed)
Found the problem for segmentation error (I’m back) So i had this error for the past 4 days and i coudn’t fix it so i even take a step back for 2 days but still coudn’t find it, the problem was that i had to wait 5 min for every try i did. Fix ? I used claude so he run test on faster machines, and i got the errors i have to fix. (He wanted to script it himself, i obviously said no).
Learned mmap open …. I did some exercices on mmap , open , fstat and learned thoses, next i have to implemente it in compressor.c
how did it work? i REALLY don’t know how it worked but it worked, a famouse programming therm if it works, don’t touch it! I just changed a char to an unsigned char lol.
I reached… the end? So i’ve been testing for a while now and i didn’t have much to say…. I successfully compressed, decompressed and burnt a linux iso and booted into one ! It required alot of troubleshooting and waiting ( 5 - 15min PER TRY ) but hey now it works on any file!
Started website, web assembly and my own extension! Extension I added the .huff extension since it will help me recognize files compressed by my compressor. The format used is .extension.huff (example: image.jpg.huff). Web Assembly I compiled the code to web assembly so it can run directly on the user’s PC and not on servers. Website I’m creating a simple website that just does the j*b (still woking on it, this is just the core). The website will not communicate with other APIs or services, thanks to web assembly. I hate JavaScript.
about the website… So… I abandoned it I CAN’T MAKE WEBSITES, I CAN’T STAND JAVASCRIPT. I tried to use WebAssembly, but it’s not widely used, so it’s really hard to work with. How can you use it? Well, use it with the CLI like a super nerd Don’t worry, everything is documented in the README. CLI » JAVASCRIPT
ITS REALEAAAAAASED You can use it for Windows, macOS, and Linux. The tutorial is mentioned under the README for all three systems. I tested it on Windows and Linux. I don’t have any Apple devices to test it out. :(
My Ship got rejected… kinda My Ship got requested change because my banner didn’t showcase the project now i changed it, here i compress and decompress a jpeg file and then open it! Hope this next ship will be accepted!
BACK ON C ! F**K WINDOWS, C# AND UNITY i missed C so much and working on linux too its just so much more fun and fast and, i can’t make game look good… look at my latest project . Im finally back at my roots
Compressed file directly in the browser ! i compiled the C code into wasm (web assembly) so i can use it inside the browser!
Imported decompressor ! well it was super easy to import the decompressor since it was very similar to the compressor code!
Optimized code for less R*M usage! For a 2.8gb file it was taking 2.8gb of ram but now its taking 42 KB! I was putting the file in the ram but now i stream the file to ram for 99.999% less ram usage!
ITS REALEAAAAASEDD the updated C code is release go check it out here !
ITS DEPLOYED! i added a small status text to know when its compressing/decompressing. you can try it the website here !
Ships:
I made a file compressor/decompressor written in C! You can use it on Linux, Windows, and macOS. The part that took the most time was DEBUGGING . It took SOOOOO much more time than I expected! I’m really proud of finishing the project. I consider this my first full project, so yeah, it took some time, but I finally finished it! You should know that all the information is in the README (installation, description, etc.). It was really fun working on it, but all good things come to an end!
made a website for my C code! It was really challenging to work with the WASM module since it’s limited to 32 bits (4GB RAM), but I managed to make it work! I also optimized the C code to use much less RAM (see the devlog). Sadly the website is limited to 220MB per file (because of WASM), but you can still process large files with the GitHub release! You can test it via the website or the GitHub release!...
|
1793001046.8565345
|
1793087446.8565345
|
|
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....
|
1793087330.799184
|
1793173730.799184
|
|
21847
|
Flux-OS by @Abhiram999 | Stardance
|
Abhiram999
|
3
|
81.0
|
828
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T07:57:02Z", "hours": 28.0, "multiplier": 8.97, "payout": 249, "blessing": "neutral", "text": "So, Yes FluxOS is a WebOS and i believe everyone is already aware of by now and is (mostly) made on vanilla CSS, HTML and JS Doesn’t really follow any design theme ( like other OS based on animals mostly ) But its kinda going with what i like mostly minimal , functional and customizable hence it is quite customizable ( not as customizable as real OS but common this is running on the web gng ) Not as functional as i would like but its pretty good, Id like to work on it more but I am ending this project right here Also It was hell to debug as the code base is simply massive, wayy too big for its own good Anyways I hope you like it ._.", "repo": "https://github.com/the-degenerate-otaku/Flux-OS", "demo": "https://the-degenerate-otaku.github.io/Flux-OS/"}, {"ship_num": 2, "ts": "2026-08-19T16:57:25Z", "hours": 52.0, "multiplier": 13.04, "payout": 579, "blessing": "neutral", "text": "So Essentially I Made a WebOS but It is customizable ( Well It tried to be at least ) How customizable? Well you change wallpapers , window accents , Window transparent and Window blurring , Have cursor effects which change with accents , a fully working file manager and notepad to scribble shi down And Yea IT TOOK A WHILE especially when your code is broken because you forgot to capitalize a letter for a function and then the function now doesn’t exist and you do everything and turn the entire code upside down before finding it on random Tuesday (smh) I’m gonna keeping working on this cause i did have a web browser in built into the OS and a Music player but got rid of it cause It just doesn’t work how i quite want it to right now frankly so It’ll probably next ship that the full version of this WebOS will release and I can put this project to rest ( fyi I’m one month overdue so yea gotta finish it fast", "repo": "https://github.com/the-degenerate-otaku/Flux-OS", "demo": "https://the-degenerate-otaku.github.io/Flux-OS/"}, {"ship_num": 3, "ts": "2026-07-01T12:09:25Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a custom OS build on html and is web-based using CSS, JS and HTML. Along the journey of me building the WebOS i learnt a lot of things like how to build a real-time clock and Terminal code, it was hard though cause the code kept breaking again and again and yea a lot of debugging and brain wrecking later it finally works and I’m quite proud of it ngl it maybe be small step it is an honest one :) k’bie", "repo": "https://github.com/the-degenerate-otaku/Flux-OS", "demo": "https://the-degenerate-otaku.github.io/Flux-OS/"}]...
|
[{"post_id": 62738, "ts": "202 [{"post_id": 62738, "ts": "2026-09-06T07:49:51Z", "hours": 3.8911, "text": "FluxOS Final Devlog #21 Date : 6 September 2026 So, Yes this is going to be my final Devvlog on this project and on Stardance as a whole probably though I have an entire month Infront of me I have shi to do in RL and i am focusing on the ysws too so yea gotta end this here i suppose, There is alot I still wanna build on Flux but there is technical and aesthetic constraints on vanilla CSS and JS so It would make the project so big that neither will i be able to complete it nor will it run well so im ending it here that said im pretty happy how it turned out, it looks pretty good for a project i started making when i began coding Whats New? Added the music player back Default settings have been updated Updated readme Taskbar google Search Final UI clean up PS: the clock position might change depending on your screen size it should be fine on most lap but on larger or smaller screen it might be a bit off target so just drag it back to where it is in the wallpaper ight? ( I cant figure it out )"}, {"post_id": 60932, "ts": "2026-09-03T16:34:30Z", "hours": 2.7239, "text": "Flux OS Devlog#20 Date: 3 September 2026 What New? So essentially small bug changes and a new feature the accent picker now has a auto or manual option to choose from the Auto accent picker bug where it displayed on top the manual accent has been fixed bug where the pet wouldnt come out in itss proper size has been fixed SEARCH BAR ADDED ( YES BROWSER SEARCH ) yea its not an embedded browser it does take you to a new tab when you search anything but its still better than having a half assed wiki page as the browser which doesnt event work and it got cool rolling text hehhehe"}, {"post_id": 60354, "ts": "2026-09-02T17:20:23Z", "hours": 1.8397, "text": "Flux OS Devlog #19 Date: 2 September 2026 What’s New? So accent picker the accent now automatically changes with the wallpaper colors ( still need to add the option to manually select it tho )"}, {"post_id": 59112, "ts": "2026-08-31T18:56:29Z", "hours": 0.275, "text": "Flux OS BTS #1 Date: 31 August 2026 heehehe here is a sneak peek on what im making ( yes im tired that why no devlog )"}, {"post_id": 58354, "ts": "2026-08-30T18:59:20Z", "hours": 1.8422, "text": "Flux OS Devlog #18 Date: 30 August 2026 ( well 31 actually ) Whats New? BETTER ACCENTS, so I earlier had only 4 accents and they were kinda eh meh so yea this is a fully reworked accents with now 10 colors which changes the color of the glass and the Globe live wallpaper and updates in real time ( pet is still white ) took shit ton of time cause i somehow broke the taskbar ( yep ik )"}, {"post_id": 57157, "ts": "2026-08-29T08:17:10Z", "hours": 2.7289, "text": "Flux OS Devlog #17 Date: 30 August 2026 Whats new? Honestly nothing much just some minor ahh changes fixed maximise , minimise and close button function so now the windows actually maximise properly instead of the old broken one Dock autohide when maximised Updated terminal lost the entire site for half an hour ( didnt even have dev console ) but fixed it"}, {"post_id": 56829, "ts": "2026-08-28T19:29:53Z", "hours": 2.1167, "text": "Flux OS Devlog #16 Date 29 August 2026 How come im not dead yet smh, its the middle of night and i got a cold Whats New? ⭐ THE PET IS FINALLY HERE ( YEES IK ISNT HE CUTE :O ) this one is so much of an improvement over thee last pet i had and the cat i tried to make omg and the math behind it is genuinely fascinating ( not gonna bother explaining it here ) so yea it was made the by this dude https://github.com/codetoanbug/ReptileInteractiveCursor or atleast that whom i used to understand how the code worked and yea the pet is togglable works on all background and yea pretty cool Now lemme go rest im sick af and i have a headache"}, {"post_id": 55190, "ts": "2026-08-26T18:18:10Z", "hours": 3.7108, "text": "Flux OS Devlog #15 Date : 26 August 2026 Whats new? Brought the taskbar icons back so now u can minimize and itll go to the taskbar, everything else is kinda broken tho Im making something big may have something to do with my pet hehe~"}, {"post_id": 53606, "ts": "2026-08-24T07:40:46Z", "hours": 1.1694, "text": "Flux OS Devlog#14 Date : 24 August 2026 Whats New? Brought back the custom wallpaper options I expect the live and static wallpaper shifting to be a lot more difficult cause I’m not using a video as the live wallpaper but a reactive that moves with your mouse and I had problems with this in the past nonetheless everything went pretty smoothly too smoothly in fact I thought something would break and I would have to spend 3hrs finding what broke but it took barely an hour hmm isn’t that interesting Cleaner up a visual bug for the accents where the colors weren’t rendering properly in their half and would leak into the other half"}, {"post_id": 53193, "ts": "2026-08-23T17:06:00Z", "hours": 2.1472, "text": "Flux OS Devlog#13 Date : 23 August 2026 Whats new? Small changes for small hours, Taskbar has now a Wi-Fi and Bluetooth symbol also has device specs and a Calendar yyyayyyyyy also there is an app finder Haven’t made much progress cause i was busy playing Genshin ( its too good )"}, {"post_id": 52359, "ts": "2026-08-22T13:57:37Z", "hours": 5.3289, "text": "Flux OS Devlog#12 Date : 22 August 2026 Whats new? More like is there anything left What all got removed? Music player , Browser , pet - Went for redesign and rework Notification centre - Removed and discarded Wallpaper capabilities - temporarily removed Ye, No joke i removed half of the entire WebOS What got added? Custom png icons new cursor effect removing the old one a new dynamic wallpaper ( which is the reason for removing custom wallpapers) New look generally speaking"}, {"post_id": 50436, "ts": "2026-08-19T16:31:20Z", "hours": 8.7722, "text": "Flux OS Devlog #11 Date 19 August 2026 Whats New? Apart from the fact im posting this almost a month since I last touched it there has been quoote alot of changes You can now close the notification centre the Accent colors and a new design Two apps has been removed for further development Cleaned up the code Fixed some bugs"}, {"post_id": 28865, "ts": "2026-07-15T12:55:50Z", "hours": 10.5608, "text": "Flux OS Devlog #10 Date: 15 July 2026 Whats New? So there is nothing much major to say new even though its over 10hrs of coding time almost 8hrs was debugging the things I already had cause there was may things that was broken from the last coding session that I had too dedicate the entire day towards Bugfixing the old code and since most of the old bugs where invisible i had to go through the entire code manually to come across over 10 bugs but all is good everything works as it should except the aero snap which I’m still figuring out and yes I have been coding almost the entire day and ngl Im seriously not stopping until tonight cause I’m basically hooked atp and I only stopped to post a Devlog otherwise my hours wont be counted Oh welp k’bie"}, {"post_id": 28439, "ts": "2026-07-14T17:55:57Z", "hours": 3.1869, "text": "Flux OS - Devlog #9 Date: 14 July 2026 Whats New? Sooooooo Its lookinh ppretty good ngl except for alot of shi breaking like always thing OS is finally coming together Cursor Particle trail system fixed Basic boot animation exsists a very bad but working aero snap ( tho ccant really function cause the dragging broke ) local storage ( VFS system ) added notification Centre added"}, {"post_id": 28287, "ts": "2026-07-14T13:30:52Z", "hours": 17.0628, "text": "Flux OS - Devlog #8 Date: 14 July 2026 Soooo Why do I have 17 hrs logged over 3 days and literally nearly no change to the actual WebOS and If anything a broken cursor?? Well so essentially I didnt know you had to log eveery 10hrs ( down goes 7 hrs in the drain ) and the 17 hrs I was trying alot of ideas trying to get work but couldnt cause well ehhh skilll issue….. ( ._. ) but i got a particle effect for the cursor working ….. except the cursor dosent work now …… oh well also i tried to get the cat working for like 10 hrs out of thee 17 and ye it is just not listening to me so yea im probably rethink my approach for this project and keep it oon the side for a few days"}, {"post_id": 26599, "ts": "2026-07-11T14:57:39Z", "hours": 6.3031, "text": "Flux OS - Devlog #7 Date : 11th July 2026 I am tired, so goddamn tired after 6hrs of coding ughhhhh so essentially i tried to make a desktop cat similar to the Comnyang pixel cat and after 6 hrs i havent moved anywhere i couldve probably spent more time making the OS better but nahh i spent it on a pixel cat that said i got something to work so idk i just need to find a way to make the json file better ahhh welp thats all k’bie"}, {"post_id": 26130, "ts": "2026-07-10T19:00:35Z", "hours": 1.6269, "text": "Flux OS - Devlog #6 Date 11 July 2026 Its 1 in the goddamn morning and I Finally got it to work finally after hours off debugging Jesus Christ and I’m currently cracked rn I’m very happy with what I made in 2hrs and that the debugging was soooo much more easy after i learned how to read errors, cause at first id just be confused and just start reading the code for the errors but its the entire codebase is over 700 lines long and reading it wasn’t plausible anymore anyway this is a major milestone What Changed ?? Basically the entire code changed to keep it short at first i coded CSS inline with HTML, now i just took my entire CSS file and made it a separate file You can put Custom Wallpapers now ( yes even you dog or cat can be your wallpaper ) using the Local storage property of JS the themes work but they aren’t much of use rn, Ill add more later and simplify them The control center isn’t how I want it now but honestly its already middle of the night so I’m doing that tomorrow You can change the transparency value of the windows and now can make them transparent, or frosty type whatever you like there is a WebApp Dock now where you can add your favorite sites and click them to immediately launch them like a real App dock Alr that’s enough for today im gonna log off and sleep have a good day k’bie"}, {"post_id": 26040, "ts": "2026-07-10T16:53:59Z", "hours": 3.1717, "text": "FluxOS - Devlog #5 Date 10 July 2026 What changed? I added Window transparency, Yes now the windows have a small frosted glass look though its not that visible because of the plain background but when u stack apps it becomes clear What’s Next? I have an idea for an app dock not sure if it’ll work I am trying to add a ability to customize your background Making a control center that pops up from the side k’bie"}, {"post_id": 20973, "ts": "2026-07-02T18:26:12Z", "hours": 1.3433, "text": "Flux-OS - Devlog #4 Date : 2 July 2026 So So I had a big brain scratching session of 4hrs with 90mins of actual coding but i did it i some got the NASA Uplink working What Changed? Researched a lot how to get uplink working it was either write a extremely long JS in Html and make it chaotic or make a equally challenging JS script file and type it out so I took the second route and made a JS file How does it work? In short I made a asynchronous module which uses a native fetch API to ask an External Rest API Which gets the info of the ISS k’bie"}, {"post_id": 19939, "ts": "2026-07-01T11:58:40Z", "hours": 0.385, "text": "Flux-OS Devlog #3 Date 1 July 2026 Changelog Now the terminal actually works it now reacts to commands and can take user input though it’ll still break if you put something other than the codes Whats Next Going forward i have quite a lot of changes cause the shell is now complete A full OS revamp with better animations Better Terminal More Apps Somehow make it customizable to the user"}, {"post_id": 19925, "ts": "2026-07-01T11:18:58Z", "hours": 0.6133, "text": "FluxOS Devlog #2 Date: 1 July 2026 So after bit of procrastination and thinking later i finally made some new changes Changelog changed the code to look cleaner and more readable Did alot of bugfixiing that came with the new change Added a custom Bootup Screen Problems i ran into Almost broke the entire code because a small syntax error file didn’t want to boot up ( still dont know why)"}, {"post_id": 19828, "ts": "2026-07-01T06:35:10Z", "hours": 0.0, "text": "Web-OS -Devlog #1 Date: 1 July 2026 So after alot of deliberation, studying , crying over my tight ahh schedule with literally no room to breathe ( I dont even get 6hrs of sleep atp ) I got 90 mins to make the shell of what is going to be my first ever Web-OS So What did I build in the 90mins? Trust me absolutely nothing significant, I managed to a framework running and made a shell of what going to be my future Web-OS ( which doesn’t even have a name atp) so ye, i got a lot of planned for this thing cause even if I’m not good at writing code im good at thinking up ideas which is usually a hit or miss so ye I’m feeling pretty good about this project Issues I ran into Even though Im pretty confident in my basic html skills atp i still suck at it and i generally am a slow typer which just makes me take so much time to write code its infuriating anyway there was nothing major to be tackled except myself ( why ofc not ) and my single celled brain who doesn’t understand syntax mistakes I do other than that all good What’s coming next Proper animations A boot up screen Custom commands for the terminal Proper working apps which look good Generally better user friendly design That’s all, K’bye"}]...
|
Title: Flux-OS by @Abhiram999 | Stardance
Devlogs Title: Flux-OS by @Abhiram999 | Stardance
Devlogs:
Web-OS -Devlog #1 Date: 1 July 2026 So after alot of deliberation, studying , crying over my tight ahh schedule with literally no room to breathe ( I dont even get 6hrs of sleep atp ) I got 90 mins to make the shell of what is going to be my first ever Web-OS So What did I build in the 90mins? Trust me absolutely nothing significant, I managed to a framework running and made a shell of what going to be my future Web-OS ( which doesn’t even have a name atp) so ye, i got a lot of planned for this thing cause even if I’m not good at writing code im good at thinking up ideas which is usually a hit or miss so ye I’m feeling pretty good about this project Issues I ran into Even though Im pretty confident in my basic html skills atp i still suck at it and i generally am a slow typer which just makes me take so much time to write code its infuriating anyway there was nothing major to be tackled except myself ( why ofc not ) and my single celled brain who doesn’t understand syntax mistakes I do other than that all good What’s coming next Proper animations A boot up screen Custom commands for the terminal Proper working apps which look good Generally better user friendly design That’s all, K’bye
FluxOS Devlog #2 Date: 1 July 2026 So after bit of procrastination and thinking later i finally made some new changes Changelog changed the code to look cleaner and more readable Did alot of bugfixiing that came with the new change Added a custom Bootup Screen Problems i ran into Almost broke the entire code because a small syntax error file didn’t want to boot up ( still dont know why)
Flux-OS Devlog #3 Date 1 July 2026 Changelog Now the terminal actually works it now reacts to commands and can take user input though it’ll still break if you put something other than the codes Whats Next Going forward i have quite a lot of changes cause the shell is now complete A full OS revamp with better animations Better Terminal More Apps Somehow make it customizable to the user
Flux-OS - Devlog #4 Date : 2 July 2026 So So I had a big brain scratching session of 4hrs with 90mins of actual coding but i did it i some got the NASA Uplink working What Changed? Researched a lot how to get uplink working it was either write a extremely long JS in Html and make it chaotic or make a equally challenging JS script file and type it out so I took the second route and made a JS file How does it work? In short I made a asynchronous module which uses a native fetch API to ask an External Rest API Which gets the info of the ISS k’bie
FluxOS - Devlog #5 Date 10 July 2026 What changed? I added Window transparency, Yes now the windows have a small frosted glass look though its not that visible because of the plain background but when u stack apps it becomes clear What’s Next? I have an idea for an app dock not sure if it’ll work I am trying to add a ability to customize your background Making a control center that pops up from the side k’bie
Flux OS - Devlog #6 Date 11 July 2026 Its 1 in the goddamn morning and I Finally got it to work finally after hours off debugging Jesus Christ and I’m currently cracked rn I’m very happy with what I made in 2hrs and that the debugging was soooo much more easy after i learned how to read errors, cause at first id just be confused and just start reading the code for the errors but its the entire codebase is over 700 lines long and reading it wasn’t plausible anymore anyway this is a major milestone What Changed ?? Basically the entire code changed to keep it short at first i coded CSS inline with HTML, now i just took my entire CSS file and made it a separate file You can put Custom Wallpapers now ( yes even you dog or cat can be your wallpaper ) using the Local storage property of JS the themes work but they aren’t much of use rn, Ill add more later and simplify them The control center isn’t how I want it now but honestly its already middle of the night so I’m doing that tomorrow You can change the transparency value of the windows and now can make them transparent, or frosty type whatever you like there is a WebApp Dock now where you can add your favorite sites and click them to immediately launch them like a real App dock Alr that’s enough for today im gonna log off and sleep have a good day k’bie
Flux OS - Devlog #7 Date : 11th July 2026 I am tired, so goddamn tired after 6hrs of coding ughhhhh so essentially i tried to make a desktop cat similar to the Comnyang pixel cat and after 6 hrs i havent moved anywhere i couldve probably spent more time making the OS better but nahh i spent it on a pixel cat that said i got something to work so idk i just need to find a way to make the json file better ahhh welp thats all k’bie
Flux OS - Devlog #8 Date: 14 July 2026 Soooo Why do I have 17 hrs logged over 3 days and literally nearly no change to the actual WebOS and If anything a broken cursor?? Well so essentially I didnt know you had to log eveery 10hrs ( down goes 7 hrs in the drain ) and the 17 hrs I was trying alot of ideas trying to get work but couldnt cause well ehhh skilll issue….. ( ._. ) but i got a particle effect for the cursor working ….. except the cursor dosent work now …… oh well also i tried to get the cat working for like 10 hrs out of thee 17 and ye it is just not listening to me so yea im probably rethink my approach for this project and keep it oon the side for a few days
Flux OS - Devlog #9 Date: 14 July 2026 Whats New? Sooooooo Its lookinh ppretty good ngl except for alot of shi breaking like always thing OS is finally coming together Cursor Particle trail system fixed Basic boot animation exsists a very bad but working aero snap ( tho ccant really function cause the dragging broke ) local storage ( VFS system ) added notification Centre added
Flux OS Devlog #10 Date: 15 July 2026 Whats New? So there is nothing much major to say new even though its over 10hrs of coding time almost 8hrs was debugging the things I already had cause there was may things that was broken from the last coding session that I had too dedicate the entire day towards Bugfixing the old code and since most of the old bugs where invisible i had to go through the entire code manually to come across over 10 bugs but all is good everything works as it should except the aero snap which I’m still figuring out and yes I have been coding almost the entire day and ngl Im seriously not stopping until tonight cause I’m basically hooked atp and I only stopped to post a Devlog otherwise my hours wont be counted Oh welp k’bie
Flux OS Devlog #11 Date 19 August 2026 Whats New? Apart from the fact im posting this almost a month since I last touched it there has been quoote alot of changes You can now close the notification centre the Accent colors and a new design Two apps has been removed for further development Cleaned up the code Fixed some bugs
Flux OS Devlog#12 Date : 22 August 2026 Whats new? More like is there anything left What all got removed? Music player , Browser , pet - Went for redesign and rework Notification centre - Removed and discarded Wallpaper capabilities - temporarily removed Ye, No joke i removed half of the entire WebOS What got added? Custom png icons new cursor effect removing the old one a new dynamic wallpaper ( which is the reason for removing custom wallpapers) New look generally speaking
Flux OS Devlog#13 Date : 23 August 2026 Whats new? Small changes for small hours, Taskbar has now a Wi-Fi and Bluetooth symbol also has device specs and a Calendar yyyayyyyyy also there is an app finder Haven’t made much progress cause i was busy playing Genshin ( its too good )
Flux OS Devlog#14 Date : 24 August 2026 Whats New? Brought back the custom wallpaper options I expect the live and static wallpaper shifting to be a lot more difficult cause I’m not using a video as the live wallpaper but a reactive that moves with your mouse and I had problems with this in the past nonetheless everything went pretty smoothly too smoothly in fact I thought something would break and I would have to spend 3hrs finding what broke but it took barely an hour hmm isn’t that interesting Cleaner up a visual bug for the accents where the colors weren’t rendering properly in their half and would leak into the other half
Flux OS Devlog #15 Date : 26 August 2026 Whats new? Brought the taskbar icons back so now u can minimize and itll go to the taskbar, everything else is kinda broken tho Im making something big may have something to do with my pet hehe~
Flux OS Devlog #16 Date 29 August 2026 How come im not dead yet smh, its the middle of night and i got a cold Whats New? ⭐ THE PET IS FINALLY HERE ( YEES IK ISNT HE CUTE :O ) this one is so much of an improvement over thee last pet i had and the cat i tried to make omg and the math behind it is genuinely fascinating ( not gonna bother explaining it here ) so yea it was made the by this dude https://github.com/codetoanbug/ReptileInteractiveCursor or atleast that whom i used to understand how the code worked and yea the pet is togglable works on all background and yea pretty cool Now lemme go rest im sick af and i have a headache
Flux OS Devlog #17 Date: 30 August 2026 Whats new? Honestly nothing much just some minor ahh changes fixed maximise , minimise and close button function so now the windows actually maximise properly instead of the old broken one Dock autohide when maximised Updated terminal lost the entire site for half an hour ( didnt even have dev console ) but fixed it
Flux OS Devlog #18 Date: 30 August 2026 ( well 31 actually ) Whats New? BETTER ACCENTS, so I earlier had only 4 accents and they were kinda eh meh so yea this is a fully reworked accents with now 10 colors which changes the color of the glass and the Globe live wallpaper and updates in real time ( pet is still white ) took shit ton of time cause i somehow broke the taskbar ( yep ik )
Flux OS BTS #1 Date: 31 August 2026 heehehe here is a sneak peek on what im making ( yes im tired that why no devlog )
Flux OS Devlog #19 Date: 2 September 2026 What’s New? So accent picker the accent now automatically changes with the wallpaper colors ( still need to add the option to manually select it tho )
Flux OS Devlog#20 Date: 3 September 2026 What New? So essentially small bug changes and a new feature the accent picker now has a auto or manual option to choose from the Auto accent picker bug where it displayed on top the manual accent has been fixed bug where the pet wouldnt come out in itss proper size has been fixed SEARCH BAR ADDED ( YES BROWSER SEARCH ) yea its not an embedded browser it does take you to a new tab when you search anything but its still better than having a half assed wiki page as the browser which doesnt event work and it got cool rolling text hehhehe
FluxOS Final Devlog #21 Date : 6 September 2026 So, Yes this is going to be my final Devvlog on this project and on Stardance as a whole probably though I have an entire month Infront of me I have shi to do in RL and i am focusing on the ysws too so yea gotta end this here i suppose, There is alot I still wanna build on Flux but there is technical and aesthetic constraints on vanilla CSS and JS so It would make the project so big that neither will i be able to complete it nor will it run well so im ending it here that said im pretty happy how it turned out, it looks pretty good for a project i started making when i began coding Whats New? Added the music player back Default settings have been updated Updated readme Taskbar google Search Final UI clean up PS: the clock position might change depending on your screen size it should be fine on most lap but on larger or smaller screen it might be a bit off target so just drag it back to where it is in the wallpaper ight? ( I cant figure it out )
Ships:
I made a custom OS build on html and is web-based using CSS, JS and HTML. Along the journey of me building the WebOS i learnt a lot of things like how to build a real-time clock and Terminal code, it was hard though cause the code kept breaking again and again and yea a lot of debugging and brain wrecking later it finally works and I’m quite proud of it ngl it maybe be small step it is an honest one :) k’bie
So Essentially I Made a WebOS but It is customizable ( Well It tried to be at least ) How customizable? Well you change wallpapers , window accents , Window transparent and Window blurring , Have cursor effects which change with accents , a fully working file manager and notepad to scribble shi down And Yea IT TOOK A WHILE especially when your code is broken because you forgot to capitalize a letter for a function and then the function now doesn’t exist and you do everything and turn the entire code upside down before finding it on random Tuesday (smh) I’m gonna keeping working on this cause i did have a web browser in built into the OS and a Music player but got rid of it cause It just doesn’t work how i quite want it to right now frankly so It’ll probably next ship that the full version of this WebOS will release and I can put this project to rest ( fyi I’m one month overdue so yea gotta finish it fast
So, Yes FluxOS is a WebOS and i believe everyone is already aware of by now and is (mostly) made on vanilla CSS, HTML and JS Doesn’t really follow any design theme ( like other OS based on animals mostly ) But its kinda going with what i like mostly minimal , functional and customizable hence it is quite customizable ( not as customizable as real OS but common this is running on the web gng ) Not as functional as i would like but its pretty good, Id like to work on it more but I am ending this project right here Also It was hell to debug as the code base is simply massive, wayy too big for its own good Anyways I hope you like it ._....
|
1792878728.3268666
|
1793742728.3268666
|
|
64126
|
EV - AI Assistant by @Alan-Betty | Stardance
|
Alan-Betty
|
1
|
81.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-26T01:10:32Z", "hours": 81.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "EV: the final devlog (for now) ok so i’m shipping it. it’s still under development and lowk always will be, but it’s at the point where it does real stuff, so here it is. so what even is EV EV is a voice controlled AI assistant i built from scratch. u say “ev” and then whatever u want, and it just does it. it’s full duplex, so it hears u while it’s talking. cut it off mid sentence and it actually shuts up and listens, instead of yapping over u like every other assistant. it does the normal assistant stuff: opens apps, finds files, plays music, remembers things about u, keeps ur to-do list. but the part i’m proud of is the complex stuff. ask it to find a gaming mouse with an infinite scroll wheel under 10k . it’ll open the browser, search, sort by price, read the listings, pick one that actually matches, and ask “Confirm?” before it puts anything in ur basket. no hand holding. it can also drive ur desktop. browser errands go through the page itself, apps go through their accessibility tree, and screenshots are the last resort. so “turn on dark mode in settings” doesn’t burn a whole vision call. the stuff nobody sees it’s light. no local model, no vendor sdks. it sits at like 90-160 mb of ram. everything heavy is a plain http call it has a face. a little floating robot face with glowing eyes that shows what it’s doing. u can tell it to look angry and it will lol it can’t go rogue. anything risky asks “Confirm?” first. say “stop everything” or hit ctrl+alt+q and it locks down. and the model can’t unlock itself, only u can it doesn’t trust the internet. text it reads off a webpage is fenced off, so a page saying “ignore ur instructions” doesn’t get to boss it around works on windows and ubuntu (yes even wayland, that was the final boss fr) the L’s that made it better it once read “Spoke:” out loud like a robot reading its own logs. fixed that at the root the mouse errand worked so well it added the same mouse to my basket four times 💀 now it refuses to press the same buy button twice on speakers it used to hear its own voice, think i was talking, and answer itself forever. it learned what i sound like vs what it sounds like now ~950 tests, all offline. still janky in places, but it’s mine and it works. go break it and tell me what happened. peace ✌️", "repo": "https://github.com/Alan-Betty/EV", "demo": "https://evassistant.vercel.app"}]...
|
[{"post_id": 82849, "ts": "202 [{"post_id": 82849, "ts": "2026-10-26T00:43:32Z", "hours": 8.3842, "text": "side devlog 3: less clutter + a manager page the page had way too much going on fr. cut the face readouts, the demo stepper, extra stats and the giant verify box. headline rises in word by word, the face boots up with its eyes opening, sections fade in once, and the nav has a little pill that slides around. all of it switches off if u have reduced motion on made a site manager ( npm run admin ). edit any text, pick which commit stable points at, update the roadmap, all next to a live preview. saves as u type drag an installer onto a platform and it gets hashed on upload, so the page shows the real sha-256. no more copy pasting hashes by hand it only runs on localhost and never ships in the build, so nobody’s editing my site but me. hehe nice try. Now that i think about it. i think i did way too much unneccessary stuff."}, {"post_id": 81991, "ts": "2026-10-23T11:09:50Z", "hours": 18.5944, "text": "side devlog 1: ev has a website now vite + tailwind + plain js. no react, cause ev’s whole thing is being lightweight and it’d be kinda hypocritical ngl nothing on it is made up. a script reads my git log before every build, so the commit list, the iteration number and the test count (950 btw) come straight from the repo the demo replays real ev errands with the real tool names. the amazon mouse one asks “Confirm?” before it touches the basket, same as the actual thing downloads are github zips pinned to the iteration commit since ev ships as source, plus a one liner to check which commit u got ctrl+k menu to jump around cause i’m lowk addicted to command palettes works on phones too, tested it at like 5 screen sizes side devlog 2: the face made it onto the site the hero used to be a particle orb. it was mid. ev literally has a face so now the site uses that instead ported the qt renderer ( ev/face/render.py ) to a canvas and it reads the same expressions.json as the real face. change a mood in python and the site picks it up on the next build eyes follow ur cursor, it dozes off if u leave it alone for 15s and wakes back up when u move. click it and it gets startled big bug: it kept going “surprised” every few seconds and stopped following the mouse. turns out mouse events can be 1ms apart so a tiny wiggle read as 5000px/s 💀 now it measures over 100ms and only near the face glow is additive now so the eyes don’t have that weird dark rim anymore"}, {"post_id": 81514, "ts": "2026-10-21T15:27:39Z", "hours": 9.5772, "text": "EV devlog: iterations 12-14 ~10k lines added. kinda unhinged week ngl. Iteration 12: ev learns who’s talking and gets self aware whisper kept mishearing me so now EV keeps track of how i sound. it learns the words i say a lot ( ev/hearing.py ) and loosens its “didn’t catch that” threshold if i’m just a quieter/mumblier speaker. it only ever loosens, never gets stricter, so it can’t drift into acting on noise stuff it learns is stored in a json, tests don’t touch it so the real profile stays clean wake word got a glow up: saying just “ev” while it’s on standby wakes it. before you had to say the whole “wake up” thing like a password. bro it’s literally your name face now knows it’s a face believe it or not. chat can take a mood so “look angry” or “wink at me” actually does something, and there’s a demo mode that cycles through every expression readme got gutted (585 lines → basically nothing) and moved into OVERVIEW.md, cause nobody was reading that Iteration 13: EV can use any app, not just the browser i forgot what all i did. but here is the best recap of what i remember. new tools/desktop/ folder. basically three tiers now, cheapest first: window stuff (list/focus/close/minimise) straight through the OS, no model call accessibility tree (AT-SPI on linux, UI Automation on windows, System Events on mac). EV reads buttons and fields by name instead of guessing pixels screenshots + vision, only when the first two can’t cook new app_control and app_agent tools so “turn on dark mode in settings” doesn’t burn a screenshot wayland was the final boss. x11 screenshots come back fully black there lol, so ev was describing a black rectangle. fixed with mutter’s screencast + remote desktop stuff wrote a tiny gnome shell extension ( [email protected] ) so wayland windows have real positions and focus works closing apps is polite by default. if an editor asks “save?” ev reads it out and waits, doesn’t just nuke your work. force kill needs a confirm. learnt that the hard way. added jeepney and comtypes to requirements, both lazy imported so nothing changes if you never use em Iteration 14: memory that actually remembers + overlay on linux semantic memory ( ev/semantic_memory.py ). remember_fact with no key stores a free note, and ev pulls up the ones relevant to what you just said. all local search (BM25 + fuzzy for misheard words), gemini embeddings are optional and only used inside tool calls. has dedup, archiving, backups, so one bad write doesn’t wipe everything. forgetting stuff asks for a confirm overlay on linux. the red “ev is driving your screen” frame was windows only. now it works through xwayland ( tools/desktop/xhud.py ), click-through and everything. the kill hotkey on gnome wayland goes through the extension (bumped to v2) since wayland won’t let apps grab global keys fixed a crash where tk objects got freed on the wrong thread and the process died with exit 134 after every takeover. cool vision got better on desktop, new test_desktop_vision.py tool schema had to get squished again to stay under the groq token limit. every new feature = something else gets shorter, it’s the circle of life where things are at works: voice, typed mode, browser errands, desktop apps on windows + ubuntu, memory. still janky: wayland without the extension (no window positions), snapped apps refusing accessibility, and my commit messages. next up: idk, tests probably. maybe sleep."}, {"post_id": 76026, "ts": "2026-10-02T03:28:11Z", "hours": 13.3536, "text": "E.V. got a face (and moved to Ubuntu) Iterations 9, 10 and 11. Lowkey the biggest glow up E.V. has had so far. 9 + 10: WE GOT A FACEEEE E.V. has a face now. It’s a little floating dark screen with two glowing eyes that sits on your desktop and reacts to whatever it’s doing. Listening, thinking, talking, happy, confused, sleepy, and even angry for some reason. yeah dont ask. It’s its own process. The face runs on PySide6 in a separate process, so the main assistant never loads Qt and stays tiny. If the face crashes, E.V. doesn’t care, it just keeps going. No PySide6 installed? No face, nothing else changes. Every mood is just JSON. All the expressions live in expressions.json as eye shapes, lid angles, glow and colour. The eyes ease between moods smoothly, blink on their own and glance around so it never looks dead inside. Captions. What you said and what E.V. says back pop up in a speech bubble next to the face. The bubble is click-through so it never gets in the way. It only pulls up when you call it. Say “E.V.” and it slides in, stop talking and it dips. If you’re watching something full screen it stays hidden, because nobody wants a robot photobombing their movie. Media control. “Pause the music”, “next song”, “turn it down”. Works on Linux and Windows without installing anything extra. Finally Stopped Ignoring Ubuntu. I switched to Ubuntu and half of E.V. broke ngl. The mic needed a fallback to pw-record / parec / arecord , app launching had to learn .desktop files, and the voice plays through GStreamer. Wayland doesn’t let apps float on top, so the face sneaks through XWayland instead. Bugs that were lowkey unhinged The face crashed instantly when started from VS Code because the snap terminal leaked its own libraries into Qt. Fixed by cleaning the environment before Qt loads.- On Ubuntu the “default microphone” was actually my speakers . E.V. was literally recording YouTube. Now it picks a real mic by name.- The glow was eating a third of a CPU core. Cached the drawing and dropped the frame rate when nothing is moving. Way chiller now. 11: E.V. stopped talking to itself. lol This one was actually wild. On speakers, E.V. would hear its own voice, think I was interrupting, transcribe itself and then reply to itself . Forever. Main character behaviour, but no. Three fixes, stacked: Compare against itself, not the room. Interrupting used to mean “louder than background noise”, and speakers win that every time. Now you have to be louder than E.V.’s own voice coming back through the mic. It learns what I sound like. A small voiceprint learns my voice and E.V.‘s voice through the speakers, and keeps adapting the more you use it. If the audio sounds like E.V., it’s ignored. It’s not face ID for voices, it just tells “me” apart from “the speakers”. It checks the words. If what it just heard matches what it just said, it gets dropped. This is the one that makes the loop actually impossible instead of just less likely.All of it is pinned in tests so it can’t sneak back. The suite is at 866 tests now, all offline. That’s the update fr. yk i gotta come clean. half of this major update was vibe coded. forgive me. but the other half was done by me. ALSO THIS DEVLOG is not vibecoded. it took too long."}, {"post_id": 73885, "ts": "2026-09-26T07:58:20Z", "hours": 6.9006, "text": "E.V. can drive my screen now This update was all about letting E.V. actually take over the computer, not just open apps. What’s new It can run a whole errand by itself. I said “find me a gaming mouse with an infinite scroll wheel and add it to my amazon cart” and it searched, picked one and added it. Web stuff goes through Playwright and reads the page instead of taking screenshots. Screenshots were eating my Groq rate limit in like 4 steps. There’s a red frame around the screen plus a little status panel whenever E.V. is in control, so you can tell it’s doing things and it’s not a virus lol Kill switch: ctrl+alt+q, or just say “stop everything”. It locks E.V. until you tell it to unlock. Bugs I hit It added the same mouse to my cart 4 times. Now it remembers what it already clicked and won’t do it twice. It got stuck on Amazon because “Search” matched 4 things on the page and it clicked a hidden one. Now if a step fails it reads the page and figures out a different way.Next up: getting it to use Brave instead of its own Chromium."}, {"post_id": 73523, "ts": "2026-09-25T09:42:45Z", "hours": 6.7417, "text": "I SPENT 6 Hours DEBUGGING i dont even have a major new photo to add. Please Understand"}, {"post_id": 72927, "ts": "2026-09-24T01:48:32Z", "hours": 9.2956, "text": "Gave My Assistant FULL SCREEN Control using Playwright. IT can now do complex tasks autonomously. eg: find a Gaming mouse under 5k with an inifinte scroll wheel. it will do that. The rest of the time was spent debugging"}, {"post_id": 71262, "ts": "2026-09-20T15:19:21Z", "hours": 8.4453, "text": "EV - THE AI ASSISTANT Just Spent 8 Hours on EV, Creating And Refactoring. to finally achieve as close as i can get towards the real thing with the resources that i was allowed. It is fully controlled via Voice ( BUT can be switched to text, if necessary). it can do advanced tasks like open Apps, Create Files, And Much more. All you need is a Groq or Gemini API key. and it consumes a maximum of 200MB RAM. I couldn’t just use an LLM for this purpose as I’m working with a PC that has 4GB RAM. AS OF NOW, this is a terminal program. but soon this will be much bigger. it will become a full scale app with enjoyable UI/UX Design and an avatar for EV"}]...
|
Title: EV - AI Assistant by @Alan-Betty | Stardanc Title: EV - AI Assistant by @Alan-Betty | Stardance
Devlogs:
EV - THE AI ASSISTANT Just Spent 8 Hours on EV, Creating And Refactoring. to finally achieve as close as i can get towards the real thing with the resources that i was allowed. It is fully controlled via Voice ( BUT can be switched to text, if necessary). it can do advanced tasks like open Apps, Create Files, And Much more. All you need is a Groq or Gemini API key. and it consumes a maximum of 200MB RAM. I couldn’t just use an LLM for this purpose as I’m working with a PC that has 4GB RAM. AS OF NOW, this is a terminal program. but soon this will be much bigger. it will become a full scale app with enjoyable UI/UX Design and an avatar for EV
Gave My Assistant FULL SCREEN Control using Playwright. IT can now do complex tasks autonomously. eg: find a Gaming mouse under 5k with an inifinte scroll wheel. it will do that. The rest of the time was spent debugging
I SPENT 6 Hours DEBUGGING i dont even have a major new photo to add. Please Understand
E.V. can drive my screen now This update was all about letting E.V. actually take over the computer, not just open apps. What’s new It can run a whole errand by itself. I said “find me a gaming mouse with an infinite scroll wheel and add it to my amazon cart” and it searched, picked one and added it. Web stuff goes through Playwright and reads the page instead of taking screenshots. Screenshots were eating my Groq rate limit in like 4 steps. There’s a red frame around the screen plus a little status panel whenever E.V. is in control, so you can tell it’s doing things and it’s not a virus lol Kill switch: ctrl+alt+q, or just say “stop everything”. It locks E.V. until you tell it to unlock. Bugs I hit It added the same mouse to my cart 4 times. Now it remembers what it already clicked and won’t do it twice. It got stuck on Amazon because “Search” matched 4 things on the page and it clicked a hidden one. Now if a step fails it reads the page and figures out a different way.Next up: getting it to use Brave instead of its own Chromium.
E.V. got a face (and moved to Ubuntu) Iterations 9, 10 and 11. Lowkey the biggest glow up E.V. has had so far. 9 + 10: WE GOT A FACEEEE E.V. has a face now. It’s a little floating dark screen with two glowing eyes that sits on your desktop and reacts to whatever it’s doing. Listening, thinking, talking, happy, confused, sleepy, and even angry for some reason. yeah dont ask. It’s its own process. The face runs on PySide6 in a separate process, so the main assistant never loads Qt and stays tiny. If the face crashes, E.V. doesn’t care, it just keeps going. No PySide6 installed? No face, nothing else changes. Every mood is just JSON. All the expressions live in expressions.json as eye shapes, lid angles, glow and colour. The eyes ease between moods smoothly, blink on their own and glance around so it never looks dead inside. Captions. What you said and what E.V. says back pop up in a speech bubble next to the face. The bubble is click-through so it never gets in the way. It only pulls up when you call it. Say “E.V.” and it slides in, stop talking and it dips. If you’re watching something full screen it stays hidden, because nobody wants a robot photobombing their movie. Media control. “Pause the music”, “next song”, “turn it down”. Works on Linux and Windows without installing anything extra. Finally Stopped Ignoring Ubuntu. I switched to Ubuntu and half of E.V. broke ngl. The mic needed a fallback to pw-record / parec / arecord , app launching had to learn .desktop files, and the voice plays through GStreamer. Wayland doesn’t let apps float on top, so the face sneaks through XWayland instead. Bugs that were lowkey unhinged The face crashed instantly when started from VS Code because the snap terminal leaked its own libraries into Qt. Fixed by cleaning the environment before Qt loads.- On Ubuntu the “default microphone” was actually my speakers . E.V. was literally recording YouTube. Now it picks a real mic by name.- The glow was eating a third of a CPU core. Cached the drawing and dropped the frame rate when nothing is moving. Way chiller now. 11: E.V. stopped talking to itself. lol This one was actually wild. On speakers, E.V. would hear its own voice, think I was interrupting, transcribe itself and then reply to itself . Forever. Main character behaviour, but no. Three fixes, stacked: Compare against itself, not the room. Interrupting used to mean “louder than background noise”, and speakers win that every time. Now you have to be louder than E.V.’s own voice coming back through the mic. It learns what I sound like. A small voiceprint learns my voice and E.V.‘s voice through the speakers, and keeps adapting the more you use it. If the audio sounds like E.V., it’s ignored. It’s not face ID for voices, it just tells “me” apart from “the speakers”. It checks the words. If what it just heard matches what it just said, it gets dropped. This is the one that makes the loop actually impossible instead of just less likely.All of it is pinned in tests so it can’t sneak back. The suite is at 866 tests now, all offline. That’s the update fr. yk i gotta come clean. half of this major update was vibe coded. forgive me. but the other half was done by me. ALSO THIS DEVLOG is not vibecoded. it took too long.
EV devlog: iterations 12-14 ~10k lines added. kinda unhinged week ngl. Iteration 12: ev learns who’s talking and gets self aware whisper kept mishearing me so now EV keeps track of how i sound. it learns the words i say a lot ( ev/hearing.py ) and loosens its “didn’t catch that” threshold if i’m just a quieter/mumblier speaker. it only ever loosens, never gets stricter, so it can’t drift into acting on noise stuff it learns is stored in a json, tests don’t touch it so the real profile stays clean wake word got a glow up: saying just “ev” while it’s on standby wakes it. before you had to say the whole “wake up” thing like a password. bro it’s literally your name face now knows it’s a face believe it or not. chat can take a mood so “look angry” or “wink at me” actually does something, and there’s a demo mode that cycles through every expression readme got gutted (585 lines → basically nothing) and moved into OVERVIEW.md, cause nobody was reading that Iteration 13: EV can use any app, not just the browser i forgot what all i did. but here is the best recap of what i remember. new tools/desktop/ folder. basically three tiers now, cheapest first: window stuff (list/focus/close/minimise) straight through the OS, no model call accessibility tree (AT-SPI on linux, UI Automation on windows, System Events on mac). EV reads buttons and fields by name instead of guessing pixels screenshots + vision, only when the first two can’t cook new app_control and app_agent tools so “turn on dark mode in settings” doesn’t burn a screenshot wayland was the final boss. x11 screenshots come back fully black there lol, so ev was describing a black rectangle. fixed with mutter’s screencast + remote desktop stuff wrote a tiny gnome shell extension ( [email protected] ) so wayland windows have real positions and focus works closing apps is polite by default. if an editor asks “save?” ev reads it out and waits, doesn’t just nuke your work. force kill needs a confirm. learnt that the hard way. added jeepney and comtypes to requirements, both lazy imported so nothing changes if you never use em Iteration 14: memory that actually remembers + overlay on linux semantic memory ( ev/semantic_memory.py ). remember_fact with no key stores a free note, and ev pulls up the ones relevant to what you just said. all local search (BM25 + fuzzy for misheard words), gemini embeddings are optional and only used inside tool calls. has dedup, archiving, backups, so one bad write doesn’t wipe everything. forgetting stuff asks for a confirm overlay on linux. the red “ev is driving your screen” frame was windows only. now it works through xwayland ( tools/desktop/xhud.py ), click-through and everything. the kill hotkey on gnome wayland goes through the extension (bumped to v2) since wayland won’t let apps grab global keys fixed a crash where tk objects got freed on the wrong thread and the process died with exit 134 after every takeover. cool vision got better on desktop, new test_desktop_vision.py tool schema had to get squished again to stay under the groq token limit. every new feature = something else gets shorter, it’s the circle of life where things are at works: voice, typed mode, browser errands, desktop apps on windows + ubuntu, memory. still janky: wayland without the extension (no window positions), snapped apps refusing accessibility, and my commit messages. next up: idk, tests probably. maybe sleep.
side devlog 1: ev has a website now vite + tailwind + plain js. no react, cause ev’s whole thing is being lightweight and it’d be kinda hypocritical ngl nothing on it is made up. a script reads my git log before every build, so the commit list, the iteration number and the test count (950 btw) come straight from the repo the demo replays real ev errands with the real tool names. the amazon mouse one asks “Confirm?” before it touches the basket, same as the actual thing downloads are github zips pinned to the iteration commit since ev ships as source, plus a one liner to check which commit u got ctrl+k menu to jump around cause i’m lowk addicted to command palettes works on phones too, tested it at like 5 screen sizes side devlog 2: the face made it onto the site the hero used to be a particle orb. it was mid. ev literally has a face so now the site uses that instead ported the qt renderer ( ev/face/render.py ) to a canvas and it reads the same expressions.json as the real face. change a mood in python and the site picks it up on the next build eyes follow ur cursor, it dozes off if u leave it alone for 15s and wakes back up when u move. click it and it gets startled big bug: it kept going “surprised” every few seconds and stopped following the mouse. turns out mouse events can be 1ms apart so a tiny wiggle read as 5000px/s 💀 now it measures over 100ms and only near the face glow is additive now so the eyes don’t have that weird dark rim anymore
side devlog 3: less clutter + a manager page the page had way too much going on fr. cut the face readouts, the demo stepper, extra stats and the giant verify box. headline rises in word by word, the face boots up with its eyes opening, sections fade in once, and the nav has a little pill that slides around. all of it switches off if u have reduced motion on made a site manager ( npm run admin ). edit any text, pick which commit stable points at, update the roadmap, all next to a live preview. saves as u type drag an installer onto a platform and it gets hashed on upload, so the page shows the real sha-256. no more copy pasting hashes by hand it only runs on localhost and never ships in the build, so nobody’s editing my site but me. hehe nice try. Now that i think about it. i think i did way too much unneccessary stuff.
Ships:
EV: the final devlog (for now) ok so i’m shipping it. it’s still under development and lowk always will be, but it’s at the point where it does real stuff, so here it is. so what even is EV EV is a voice controlled AI assistant i built from scratch. u say “ev” and then whatever u want, and it just does it. it’s full duplex, so it hears u while it’s talking. cut it off mid sentence and it actually shuts up and listens, instead of yapping over u like every other assistant. it does the normal assistant stuff: opens apps, finds files, plays music, remembers things about u, keeps ur to-do list. but the part i’m proud of is the complex stuff. ask it to find a gaming mouse with an infinite scroll wheel under 10k . it’ll open the browser, search, sort by price, read the listings, pick one that actually matches, and ask “Confirm?” before it puts anything in ur basket. no hand holding. it can also drive ur desktop. browser errands go through the page itself, apps go through their accessibility tree, and screenshots are the last resort. so “turn on dark mode in settings” doesn’t burn a whole vision call. the stuff nobody sees it’s light. no local model, no vendor sdks. it sits at like 90-160 mb of ram. everything heavy is a plain http call it has a face. a little floating robot face with glowing eyes that shows what it’s doing. u can tell it to look angry and it will lol it can’t go rogue. anything risky asks “Confirm?” first. say “stop everything” or hit ctrl+alt+q and it locks down. and the model can’t unlock itself, only u can it doesn’t trust the internet. text it reads off a webpage is fenced off, so a page saying “ignore ur instructions” doesn’t get to boss it around works on windows and ubuntu (yes even wayland, that was the final boss fr) the L’s that made it better it once read “Spoke:” out loud like a robot reading its own logs. fixed that at the root the mouse errand worked so well it added the same mouse to my basket four times 💀 now it refuses to press the same buy button twice on speakers it used to hear its own voice, think i was talking, and answer itself forever. it learned what i sound like vs what it sounds like now ~950 tests, all offline. still janky in places, but it’s mine and it works. go break it and tell me what happened. peace ✌️...
|
1793058698.490074
|
1793145098.490074
|
|
20908
|
SanePlan by @ethan_soh | Stardance
|
ethan_soh
|
0
|
80.93
|
0
|
[]
|
[{"post_id": 11995, "ts": "202 [{"post_id": 11995, "ts": "2026-06-19T15:55:34Z", "hours": 6.3756, "text": "So I made the landing a whole lot better and i fixed a few login bugs."}, {"post_id": 10665, "ts": "2026-06-17T15:04:40Z", "hours": 74.5514, "text": "Okay I made the main site. The landing is horrible so that is what I will do next."}]...
|
Title: SanePlan by @ethan_soh | Stardance
Devlogs Title: SanePlan by @ethan_soh | Stardance
Devlogs:
Okay I made the main site. The landing is horrible so that is what I will do next.
So I made the landing a whole lot better and i fixed a few login bugs....
|
1792806485.3682108
|
1793411285.3682108
|
|
25986
|
Katnip by @b1j2754 | Stardance
|
b1j2754
|
2
|
80.41
|
1182
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-11T09:31:56Z", "hours": 37.0, "multiplier": 19.83, "payout": 741, "blessing": "neutral", "text": "Katnip. For real this time. From text -> blocks. It now exists. Fully type-checked. Powerful enums. Function returns. And it all compiles into scratch. Over the past 36 hours I have worked on making the IR and Codegen layers come to life. From working with stacks, and other more complex algorithms, hoisting, scopes, and everything in between, It now compiles. Katnip is a language designed to not just be a surragate for scratch syntax, its supposed to fix it, and offer a scripting alternative. Gone are the days of wrong data types, debugging random lines, Katnip can do that for you. Types and bugs are well defined, and easy to find. To use this project, I currently do not have a website, but install it through NPM: https://www.npmjs.com/package/@katnip-org/compiler npm i @katnip-org/compiler Happy coding :P", "repo": "https://github.com/Katnip-org/Katnip/", "demo": "https://www.npmjs.com/package/@katnip-org/compiler"}, {"ship_num": 2, "ts": "2026-07-06T22:46:43Z", "hours": 25.0, "multiplier": 19.56, "payout": 441, "blessing": "neutral", "text": "I made the semantic analysis portion to a custom coding language for scratch. It aims to bridge the gap for kids between code blocks and real scripting. It has full type safety, and a variety of different language components, creating a rich and immersive transition from scratch into the real world of programming. It has both simple syntax but also allows a high skill ceiling with more complex syntax. I struggled a lot, spending hours on end chatting with programmers I am friends with, crafting a lot of these language decisions in late night chats. Every single step has been deliberately taken. I am proud of the consistency and quality of the code I wrote. I feel proud to have made this section, and hope that by shipping (and hopefully the community receiving it well) I will be able to continue forwards to finishing the IR and code gen. Since there isn’t a best way to use a programming language, I suggest both installing the npm package and the vscode extension (search ‘Katnip’ in the store). This will give you in-editor syntax highlighting and typechecking. Feel free to use the cli for lexing, parsing, and type checking.", "repo": "https://github.com/Katnip-org/Katnip/", "demo": "https://www.npmjs.com/package/@katnip-org/compiler"}]...
|
[{"post_id": 63302, "ts": "202 [{"post_id": 63302, "ts": "2026-09-07T01:41:07Z", "hours": 4.3019, "text": "Sigma Peak Editor Frfr The editor is turning out beautifully . Like I love it so far. Tons and tons of improvements to mainly the editor, but a few pivotal improvements to the compiler itself. Website / GUI Improvements File uploads — no longer are your costumes handwritten svgs :P AND you can import .knip files! QOL improvements — draggable files, auto-focus editor on openning of website Terminal prettification STAGE BUTTONS! — start / pause / stop + TurboMode Flag functionality rework click => compile + run shift+click => run without compiling Settings file actually does something Compiler improvements Costumes implementation (new syntax!) Forever block + more math blocks! Zip compression level compiler flag"}, {"post_id": 62117, "ts": "2026-09-05T11:32:11Z", "hours": 5.4575, "text": "Costumes + Sounds! Finally, after a long time of putting this off, Katnip finally has syntax to import sounds and assets to use for your projects! stage { costume \"./sky.svg\"; events.onFlag() { looks.switchBackdrop(\"sky\"); } } sprite Cat { costume \"./cat.svg\" as idle; costume \"./cat-blink.svg\" as blink; sound \"./meow.wav\"; events.onFlag() { motion.goTo(-100, 0); looks.switchCostume(\"idle\"); looks.say(\"costumes + sounds work\", 2); forever { wait(0.5); looks.nextCostume(); } } } Changelog Compiler changes Added costume and sound keywords Added stage keyword for stage override (previously auto-gen’d) Added forever keyword (cuz I forgot to add it somehow) Website changes Added upload icon for uploading files Added support for the new costume and sound required fs callbacks Added “rename” in dropdown right-click context Notes Not sure how the forever block and rename button took this long to add, both seem like something I could’ve adressed earlier, but—better late than never :P"}, {"post_id": 55346, "ts": "2026-08-27T03:01:18Z", "hours": 4.2003, "text": "Fleshing out the GUI Finally got a working prototype! Check it out at https://katnip.org Components added: Stage This was honestly a pretty hard part of the process. I am using tw-scaffolding, the core vm from TurboWarp. But it has no types, no docs, and the docs that exist are outdated. So I resorted to having Claude make a .d.ts file for me so I could fuzz my way through instead. This process wasn’t that bad once the functions were clear, and I hooked it up to my compiler—intentionally designed to output Uint8Array. Toolbar This was fun since I don’t know svelte yet that well. I had a state originally stored in my state.svelte.ts, but I figure out I could refactor and not need it. Then I just did some vm tomfoolery to ensure the threads stay open on pausing, and it was good to go. Terminal This is a super rudamentry approach. I plan to have an input method at some point, but we will see. Hopefully I implement a better technique, currently I just have a string array storing the logs. Makes it easy to make it stateful in svelte ig"}, {"post_id": 53486, "ts": "2026-08-24T01:41:19Z", "hours": 4.4464, "text": "Katnip GUI!!! Ahhhh im so excited. I’m building the gui for Katnip right now—built off a small foundation done by a friend. Currently repo is private, but I’ll open it once my computer’s not about to die and I’m on stable internet. Worked on the following things: Re-binding TextMate grammar tokens File editor popup TurboWarp scaffolding library for the running Pulling in my compiler through npm for compilation"}, {"post_id": 44833, "ts": "2026-08-10T21:09:24Z", "hours": 3.1028, "text": "Yikes. So this is a step I didn’t really want to take. I had to take away a part of the language that I always wanted to exist. The existence of the temp keyword. I mean this thing was literally covering my demos and other scripts in the docs and whatnot. But alas, it was not properly implemented, and I have no forseeable good solution to working it out. So its removed for the time being. Brighter note On the flipside, I did finalize and fully implement zip , enumerate , and range ! These functions now properly parse the list arguments and let tuple unpacking do its amazing goodness."}, {"post_id": 44242, "ts": "2026-08-09T21:24:44Z", "hours": 4.6969, "text": "Cooking up straight peak Great new features. Genuinely super cool. This new bout of progress that led to end-to-end compilation has given me so much motivation. Enums So, this already existed. But I realized that they are so much more than just a way to create states to check against, or store values in. Ever since I allowed scalar values to be the represenation of enum members, this has become more powerful than I realized. The key was implementing the type interpretation of an enum. I already was kind of doing this, but when you have an input param for a function, you can assign a type of enum FlowerType for instance. So the input only accepts FlowerType.x where x is the type. But thats long. Look at a function call: sniff(FlowerType.DAFFODIL, backup = FlowerType.ROSE); Instead, I like what typescript does with its discriminant types, allowing a type to represent a set of possible values. So, it was born. sniff(\"daffodil\", backup = \"rose\"); In order to use this, just assign values to your enum: enum FlowerType { DAFFODIL = \"daffodil\", ROSE = \"rose\", ... } STDLib improvements Prior, a lot of stuff including type casting was a mess. I just recently got this up and running, so it was hard to even try to think about this. Scratch only has a few types: round and angled and block. Thats it. And types really only apply to round/angled. So I implemented small blocks that allow scratch’s oddities and allow you to tell the compiler to “shut up”. Want to get the string of a bool? No problem. looks.say( Str(var == 2) + \"apple\") And many many other use cases. Made some marginal improvements to the CLI to allow parsing Made some commands to run with command pallete for the vscode ext"}, {"post_id": 43872, "ts": "2026-08-09T10:04:26Z", "hours": 8.3239, "text": "Holy Guacamole I’m So Excited Insane progress over the past few days has occurred, in large part due to my travels on train, and my apparent ability to lock in when I start seeing things. Codegen Probably the most recognizable part of the project, Katnip can now generate scratch code. Blocks are being made, and complex patterns written in the IR are finally revealing themselves. It is so important that you look at the pictures, as the improvements made here are hard to put into words. Writing this part was arguably the most fun part of the entire project. This part was more scratch-like than any other part so far (“well duh, its the closest stage” you might be saying. And you’d be right.) IR Writing a majority did not come without its need for the IR to step up its game. I was quite fed up with 0 visual progress, so I jumped to codegen to boost my morale for the improvements made to the IR. This includes dict and list slicing, and a proper handling of booleans. I’m so excited"}, {"post_id": 41989, "ts": "2026-08-06T15:08:47Z", "hours": 9.1267, "text": "The light I can see it… (what is it?) … the light at the end of the tunnel… (what are you talking about?) .. its almost here Yea no it ain’t Though the project isn’t done, I will admit I am nearing the closing moments of the IR stage, with only 1 last hurdle to overcome before I can transpile projects beginning -> end . Here’s a small overview of what’s been done in the last two weeks (nah who am I kidding its all last night, I haven’t touched this in a bit) Procedures Katnip is scratch. Kinda. It transpiles to scratch. So it needs procedures. I took a giant bite out of the huge problem that is procedures. It is very complex to try and emulate a return system in a program that just doesn’t support it. Having taken a DSA class, this was a problem that I took to paper, and got the following solution: Stacks are beautiful. Let me elaborate. A stack is a structure that follows FiLo , or first-in, last-out . This is super important for returning from procedures, when considering the fact that a single variable will not be enough for systems when/if the function recurses. So this way, you push and pop on the stack to keep the order, and all return values are kept track of nicely! Mangled vars. Scope is a really hard concept to grasp, but even harder to emulate in a non-scoped language. For the most part, I want to keep Scratch’s inherent scope-less design, in the sense that variables can exist in similar ways. But I do want scopes. So I take back the before-last sentence. To do this, I mangle vars, allowing scopes to exist, multiple instances of the same code to run, and to have variables not collide. For loops A smaller sections, but still cool. A for loop in scratch is a hidden–but supported–block. You can only iterate a variable, lets call it x , from 1..y inclusive, where y is the max range. So for lists, this means lowering this: for (x, myList) { looks.say(x); } into this: for (x, listLength(myList)) { x = myList[x]; looks.say(x); } Additionally, if doing a range function like this: for (x, range(4, 10, 2)) { looks.say(x); } it lowers into this: for (x, 3) { x = x * 2 + 4; looks.say(x); }"}, {"post_id": 32049, "ts": "2026-07-20T22:44:57Z", "hours": 6.3789, "text": "Project depth increase Retrospectively, this probably should’ve been multiple seperate posts. But I forgot. Again. Return statements For compiling to scratch, a variety of different appracohes have been done. Personally, these fall under a few distinct approaches: variable and list. Variable is simply setting a variable to the output, whereas a list is just a stack following LiFo rules. A variable should be used for single value, non-recursive functions. It’s pretty naive actually. The better alternative way is to use a stack, in which you push and pop from it. This way, you know the exact offset that correlates to the return value in recursive functions. The stack also allows for easy nesting of functions next to each other, like foo(1, 2) + foo(3, 4) , which is only possible in variable form with temporary vars. Vscode Autocomplete Less said here, but this was actually pretty simple. I just ran some regex to get all the identifiers, and then seperated them by type. Pretty rudamentry, but nice. Scratch Defs This was a huge first step in the IR design. Basically, I need a good way of storing metadata. Inventing whole new katnip syntax for this would: a. Look bad, but also b. Be horrible to implement So I wrote a typescript file that takes care of the json metadata, allowing only rudamentry tags and opcode to be stored in Katnip portion. Imports This was a fun portion to tackle. Because I am targeting 3 deployments: vsc, cli, and web, I need a design that covers all 3. A friend suggested callbacks. This allows me to assume the user will define a function that allows filesystem interactions, without me touching a thing. So all I did was bring in the code from the imported file, and ran compilation over it too. I pulled it in during the semantic analysis phase as that was the correct timing; after verifying the import statement; before the codegen. Structs Lots of deliberation occured here. It was very crucial to implement this, personally, because I use this type of feature (self-implemented, each time) in scratch. It always felt like a thing that I needed. I was torn between strided and parallel list storage for the pieces of it. Strided was cool, and was more efficient with space and project list bloat, but in the end parallel lists were just SO much cleaner."}, {"post_id": 29545, "ts": "2026-07-16T15:27:53Z", "hours": 5.7258, "text": "Bugfixes + webprep This will be a shorter devlog, because, though there is a lot of time logged, much of this was just troubleshooting the few things I was adding. Bugfixes: In the lexer, there existed some issues with my fsm, and the way I processed escaped characters Added some protections in the parser instead of semantic analysis so enforcement was throurough and non-manual Webprep: Removed external dependencies that only npm could run. This enabled the beginning of development of a web editor gui by my friend in Svelte Rewrote dependencies and npm-specific stuff to my npm-agnostic, using my own implementations (mostly just pico-colors tbh) The photo attached is it showing how another runtime (in this example, bun) can run the project that originally only worked with npm."}, {"post_id": 23783, "ts": "2026-07-06T22:36:35Z", "hours": 1.3239, "text": "Getting ready! Getting ready to ship the semantic analysis. General config stuff, npm registry, vsc ext, open vsx, all those fun things. https://www.npmjs.com/package/@katnip-org/compiler https://marketplace.visualstudio.com/items?itemName=Katnip-org.katnip-vscode https://open-vsx.org/extension/Katnip-org/katnip-vscode"}, {"post_id": 23347, "ts": "2026-07-06T07:47:42Z", "hours": 11.2783, "text": "Phase 2 complete (plus a lil extra) Phase 2 Function overloads This was an interesting task to take on. I had to first figure out how to match a function’s signiture to its call. I couldn’t simply check if a signiture existed or not, I had to check which variation it satisfied. This involved reworking the way I stored signitures, and allowed a single object to hold them all for a certain function name. This way, it was a lot cleaner and put together. STDLIB After working through the project, I realized that I needed a way to define the primitive blocks used in Scratch. I didn’t think adding them in as a Typescript object was elegant, and it definently wasn’t extendable. Instead, I opted to expand the language syntax to allow generics, and therefore enable modular and clean code in the form of a katnip-defined STDLib. Katnip LSP This section is less in depth, because the setup wasn’t as hard. I look up some docs, and most of it was drag and drop. There exists a single file for defining the regex expressions with which to color the words on the page, and then I connected my error reporter to the lsp’s standard error reporter to further enhance the experience. Every 300ms or so, it updates, and tells the user where the errors are, just like any other language supported in text editors."}, {"post_id": 18873, "ts": "2026-06-30T02:11:27Z", "hours": 4.7678, "text": "Almost completed phase 2 of the Semantic Analysis Today I built a wide variety of things. But 3 specific features. visit(node: StatementNode): void This function parses all of my nodes. It covers variable assignment, sprite declaration, etc etc. It has many jobs, including entering scopes, declaring bodies, and following each AST-node stack recursively. Some are left stubbed out, as I spent most of my time on #2: inferType(expression: ExpressionNode): InternalType This function is ~200loc. It covers a wide variety of cases, all pertaining to the type inference of an expression AST. It not only infers the type, but recursively builds an internal model of what the user has written. So a type of list<dict<num, str>> becomes the stored internal representation of: { kind : \" list \" , element : { kind : \" dict \" , key : { kind : \" primitive \" , name : \" num \" }, value : { kind : \" primitive \" , name : \" str \" } } } Though it is a lot more complex than that, that’s what it boils down to. And lots and lots and lots of error statements. InternalTypes itself I built a system that stores the type state, with a few extra helper functions: isAssignable and typeToString. The former recursively traces both types and ensures total match. This means that a variable of type to could be assigned to a value of type from . The latter is just a pretty-print function for pretty errors to see what types were being looked at/expected at certain parts of the code."}, {"post_id": 17300, "ts": "2026-06-28T00:56:35Z", "hours": 3.6656, "text": "Finished phase 1 of the Semantic Analysis Implemented Scope-Analysis checks. It can correctly identify and point out issues with scopes. It understands a variety of different scopes, from for-loops to functions to Sprites. Also added support for switch-statements. Importantly, I chose to force only 1 default, and force it to be only at the end. I also implemented true and false as a new Boolean primitive type, alongside a true return statement"}, {"post_id": 16732, "ts": "2026-06-27T05:49:23Z", "hours": 2.8311, "text": "2. Building Semantic Analysis This will be shorter, since most of what I say is better just written in code. The main idea is two passes: Hoist Bring procedures to the top to allow forward references. I explain why I did so above. Visit Acctually go through and validate. This is the main core bit of the semantic analysis portion. I am a little stuck at a desgin fork. Should I allow scripts inside no ‘Sprite’ Scope to be there? Or should I force them into the Stage. Or do I error? Scratch-like behaviors tell me that it should go to stage, but that feels tacky and wrong. Can functions be public? I think so. Can’t be temp. Need to make start and end possibly null Make function be able to be public/private. Assumed private Everything at the root of a file should be invalidated. The space should be reserved for imports, functions, global stuff. Overall, I worked on building semantic analysis, at least the basic parts. I added variable decleration handling in scopes, and all of expressionstatement parsing."}, {"post_id": 16096, "ts": "2026-06-26T05:23:16Z", "hours": 1.1658, "text": "Semantic Analysis Planning Currently trying to think about how best to implement semantic analysis. I can’t lie, I am just getting back into this project, so I am rediscovering what I had previously written.I guess I have to start at the beginning. What is semantic analysis? Type Checking Operations need to be with compatible data types One note to myself here is that I have reserved functions because it’s Scratch, so those need to have a designed store for their types2. Scope Resolution Make sure variables and functions are designed in the right parts of code I think this will cover imports too, but its worth thinking about Undeclared and redeclared variable checks Function Call Validation I’ll have to go back and check if I accidentally covered that in the parser, but I believe this should go here Flow Control Switch case validations, make sure fall through keywords and default cases etc. are all in valid places5. Reserved Keyword Check if variable and functions defined are conflicting with Katnip’s First I’m going to do symbol collection and scope resolution. One important nuance I discovered was whether or not to enforce scope declaration. Should there be an inferred scope? In Scratch, this inferred scope is mostly ‘Public’, as variables are shared across sprites. However, I think I am going to flip this, as it feels wrong to teach the user that variables work across sprites. Thought dump: ‘Private’ kward can’t be used at root level (stage). Can’t be used as modifier for sprite either, tho neither should any modifier. Scope-less definitions are okay. Scratch does this, just opposite of me. I am going to raise function declarations so that they can be referenced before making. Requires 2 passes, but seems simpler and more intuitive in my opinion. I am going to allow function overloading. It seems useful, and I like the way Java does it."}]...
|
Title: Katnip by @b1j2754 | Stardance
Devlogs:
Se Title: Katnip by @b1j2754 | Stardance
Devlogs:
Semantic Analysis Planning Currently trying to think about how best to implement semantic analysis. I can’t lie, I am just getting back into this project, so I am rediscovering what I had previously written.I guess I have to start at the beginning. What is semantic analysis? Type Checking Operations need to be with compatible data types One note to myself here is that I have reserved functions because it’s Scratch, so those need to have a designed store for their types2. Scope Resolution Make sure variables and functions are designed in the right parts of code I think this will cover imports too, but its worth thinking about Undeclared and redeclared variable checks Function Call Validation I’ll have to go back and check if I accidentally covered that in the parser, but I believe this should go here Flow Control Switch case validations, make sure fall through keywords and default cases etc. are all in valid places5. Reserved Keyword Check if variable and functions defined are conflicting with Katnip’s First I’m going to do symbol collection and scope resolution. One important nuance I discovered was whether or not to enforce scope declaration. Should there be an inferred scope? In Scratch, this inferred scope is mostly ‘Public’, as variables are shared across sprites. However, I think I am going to flip this, as it feels wrong to teach the user that variables work across sprites. Thought dump: ‘Private’ kward can’t be used at root level (stage). Can’t be used as modifier for sprite either, tho neither should any modifier. Scope-less definitions are okay. Scratch does this, just opposite of me. I am going to raise function declarations so that they can be referenced before making. Requires 2 passes, but seems simpler and more intuitive in my opinion. I am going to allow function overloading. It seems useful, and I like the way Java does it.
2. Building Semantic Analysis This will be shorter, since most of what I say is better just written in code. The main idea is two passes: Hoist Bring procedures to the top to allow forward references. I explain why I did so above. Visit Acctually go through and validate. This is the main core bit of the semantic analysis portion. I am a little stuck at a desgin fork. Should I allow scripts inside no ‘Sprite’ Scope to be there? Or should I force them into the Stage. Or do I error? Scratch-like behaviors tell me that it should go to stage, but that feels tacky and wrong. Can functions be public? I think so. Can’t be temp. Need to make start and end possibly null Make function be able to be public/private. Assumed private Everything at the root of a file should be invalidated. The space should be reserved for imports, functions, global stuff. Overall, I worked on building semantic analysis, at least the basic parts. I added variable decleration handling in scopes, and all of expressionstatement parsing.
Finished phase 1 of the Semantic Analysis Implemented Scope-Analysis checks. It can correctly identify and point out issues with scopes. It understands a variety of different scopes, from for-loops to functions to Sprites. Also added support for switch-statements. Importantly, I chose to force only 1 default, and force it to be only at the end. I also implemented true and false as a new Boolean primitive type, alongside a true return statement
Almost completed phase 2 of the Semantic Analysis Today I built a wide variety of things. But 3 specific features. visit(node: StatementNode): void This function parses all of my nodes. It covers variable assignment, sprite declaration, etc etc. It has many jobs, including entering scopes, declaring bodies, and following each AST-node stack recursively. Some are left stubbed out, as I spent most of my time on #2: inferType(expression: ExpressionNode): InternalType This function is ~200loc. It covers a wide variety of cases, all pertaining to the type inference of an expression AST. It not only infers the type, but recursively builds an internal model of what the user has written. So a type of list<dict<num, str>> becomes the stored internal representation of: { kind : " list " , element : { kind : " dict " , key : { kind : " primitive " , name : " num " }, value : { kind : " primitive " , name : " str " } } } Though it is a lot more complex than that, that’s what it boils down to. And lots and lots and lots of error statements. InternalTypes itself I built a system that stores the type state, with a few extra helper functions: isAssignable and typeToString. The former recursively traces both types and ensures total match. This means that a variable of type to could be assigned to a value of type from . The latter is just a pretty-print function for pretty errors to see what types were being looked at/expected at certain parts of the code.
Phase 2 complete (plus a lil extra) Phase 2 Function overloads This was an interesting task to take on. I had to first figure out how to match a function’s signiture to its call. I couldn’t simply check if a signiture existed or not, I had to check which variation it satisfied. This involved reworking the way I stored signitures, and allowed a single object to hold them all for a certain function name. This way, it was a lot cleaner and put together. STDLIB After working through the project, I realized that I needed a way to define the primitive blocks used in Scratch. I didn’t think adding them in as a Typescript object was elegant, and it definently wasn’t extendable. Instead, I opted to expand the language syntax to allow generics, and therefore enable modular and clean code in the form of a katnip-defined STDLib. Katnip LSP This section is less in depth, because the setup wasn’t as hard. I look up some docs, and most of it was drag and drop. There exists a single file for defining the regex expressions with which to color the words on the page, and then I connected my error reporter to the lsp’s standard error reporter to further enhance the experience. Every 300ms or so, it updates, and tells the user where the errors are, just like any other language supported in text editors.
Getting ready! Getting ready to ship the semantic analysis. General config stuff, npm registry, vsc ext, open vsx, all those fun things. https://www.npmjs.com/package/@katnip-org/compiler https://marketplace.visualstudio.com/items?itemName=Katnip-org.katnip-vscode https://open-vsx.org/extension/Katnip-org/katnip-vscode
Bugfixes + webprep This will be a shorter devlog, because, though there is a lot of time logged, much of this was just troubleshooting the few things I was adding. Bugfixes: In the lexer, there existed some issues with my fsm, and the way I processed escaped characters Added some protections in the parser instead of semantic analysis so enforcement was throurough and non-manual Webprep: Removed external dependencies that only npm could run. This enabled the beginning of development of a web editor gui by my friend in Svelte Rewrote dependencies and npm-specific stuff to my npm-agnostic, using my own implementations (mostly just pico-colors tbh) The photo attached is it showing how another runtime (in this example, bun) can run the project that originally only worked with npm.
Project depth increase Retrospectively, this probably should’ve been multiple seperate posts. But I forgot. Again. Return statements For compiling to scratch, a variety of different appracohes have been done. Personally, these fall under a few distinct approaches: variable and list. Variable is simply setting a variable to the output, whereas a list is just a stack following LiFo rules. A variable should be used for single value, non-recursive functions. It’s pretty naive actually. The better alternative way is to use a stack, in which you push and pop from it. This way, you know the exact offset that correlates to the return value in recursive functions. The stack also allows for easy nesting of functions next to each other, like foo(1, 2) + foo(3, 4) , which is only possible in variable form with temporary vars. Vscode Autocomplete Less said here, but this was actually pretty simple. I just ran some regex to get all the identifiers, and then seperated them by type. Pretty rudamentry, but nice. Scratch Defs This was a huge first step in the IR design. Basically, I need a good way of storing metadata. Inventing whole new katnip syntax for this would: a. Look bad, but also b. Be horrible to implement So I wrote a typescript file that takes care of the json metadata, allowing only rudamentry tags and opcode to be stored in Katnip portion. Imports This was a fun portion to tackle. Because I am targeting 3 deployments: vsc, cli, and web, I need a design that covers all 3. A friend suggested callbacks. This allows me to assume the user will define a function that allows filesystem interactions, without me touching a thing. So all I did was bring in the code from the imported file, and ran compilation over it too. I pulled it in during the semantic analysis phase as that was the correct timing; after verifying the import statement; before the codegen. Structs Lots of deliberation occured here. It was very crucial to implement this, personally, because I use this type of feature (self-implemented, each time) in scratch. It always felt like a thing that I needed. I was torn between strided and parallel list storage for the pieces of it. Strided was cool, and was more efficient with space and project list bloat, but in the end parallel lists were just SO much cleaner.
The light I can see it… (what is it?) … the light at the end of the tunnel… (what are you talking about?) .. its almost here Yea no it ain’t Though the project isn’t done, I will admit I am nearing the closing moments of the IR stage, with only 1 last hurdle to overcome before I can transpile projects beginning -> end . Here’s a small overview of what’s been done in the last two weeks (nah who am I kidding its all last night, I haven’t touched this in a bit) Procedures Katnip is scratch. Kinda. It transpiles to scratch. So it needs procedures. I took a giant bite out of the huge problem that is procedures. It is very complex to try and emulate a return system in a program that just doesn’t support it. Having taken a DSA class, this was a problem that I took to paper, and got the following solution: Stacks are beautiful. Let me elaborate. A stack is a structure that follows FiLo , or first-in, last-out . This is super important for returning from procedures, when considering the fact that a single variable will not be enough for systems when/if the function recurses. So this way, you push and pop on the stack to keep the order, and all return values are kept track of nicely! Mangled vars. Scope is a really hard concept to grasp, but even harder to emulate in a non-scoped language. For the most part, I want to keep Scratch’s inherent scope-less design, in the sense that variables can exist in similar ways. But I do want scopes. So I take back the before-last sentence. To do this, I mangle vars, allowing scopes to exist, multiple instances of the same code to run, and to have variables not collide. For loops A smaller sections, but still cool. A for loop in scratch is a hidden–but supported–block. You can only iterate a variable, lets call it x , from 1..y inclusive, where y is the max range. So for lists, this means lowering this: for (x, myList) { looks.say(x); } into this: for (x, listLength(myList)) { x = myList[x]; looks.say(x); } Additionally, if doing a range function like this: for (x, range(4, 10, 2)) { looks.say(x); } it lowers into this: for (x, 3) { x = x * 2 + 4; looks.say(x); }
Holy Guacamole I’m So Excited Insane progress over the past few days has occurred, in large part due to my travels on train, and my apparent ability to lock in when I start seeing things. Codegen Probably the most recognizable part of the project, Katnip can now generate scratch code. Blocks are being made, and complex patterns written in the IR are finally revealing themselves. It is so important that you look at the pictures, as the improvements made here are hard to put into words. Writing this part was arguably the most fun part of the entire project. This part was more scratch-like than any other part so far (“well duh, its the closest stage” you might be saying. And you’d be right.) IR Writing a majority did not come without its need for the IR to step up its game. I was quite fed up with 0 visual progress, so I jumped to codegen to boost my morale for the improvements made to the IR. This includes dict and list slicing, and a proper handling of booleans. I’m so excited
Cooking up straight peak Great new features. Genuinely super cool. This new bout of progress that led to end-to-end compilation has given me so much motivation. Enums So, this already existed. But I realized that they are so much more than just a way to create states to check against, or store values in. Ever since I allowed scalar values to be the represenation of enum members, this has become more powerful than I realized. The key was implementing the type interpretation of an enum. I already was kind of doing this, but when you have an input param for a function, you can assign a type of enum FlowerType for instance. So the input only accepts FlowerType.x where x is the type. But thats long. Look at a function call: sniff(FlowerType.DAFFODIL, backup = FlowerType.ROSE); Instead, I like what typescript does with its discriminant types, allowing a type to represent a set of possible values. So, it was born. sniff("daffodil", backup = "rose"); In order to use this, just assign values to your enum: enum FlowerType { DAFFODIL = "daffodil", ROSE = "rose", ... } STDLib improvements Prior, a lot of stuff including type casting was a mess. I just recently got this up and running, so it was hard to even try to think about this. Scratch only has a few types: round and angled and block. Thats it. And types really only apply to round/angled. So I implemented small blocks that allow scratch’s oddities and allow you to tell the compiler to “shut up”. Want to get the string of a bool? No problem. looks.say( Str(var == 2) + "apple") And many many other use cases. Made some marginal improvements to the CLI to allow parsing Made some commands to run with command pallete for the vscode ext
Yikes. So this is a step I didn’t really want to take. I had to take away a part of the language that I always wanted to exist. The existence of the temp keyword. I mean this thing was literally covering my demos and other scripts in the docs and whatnot. But alas, it was not properly implemented, and I have no forseeable good solution to working it out. So its removed for the time being. Brighter note On the flipside, I did finalize and fully implement zip , enumerate , and range ! These functions now properly parse the list arguments and let tuple unpacking do its amazing goodness.
Katnip GUI!!! Ahhhh im so excited. I’m building the gui for Katnip right now—built off a small foundation done by a friend. Currently repo is private, but I’ll open it once my computer’s not about to die and I’m on stable internet. Worked on the following things: Re-binding TextMate grammar tokens File editor popup TurboWarp scaffolding library for the running Pulling in my compiler through npm for compilation
Fleshing out the GUI Finally got a working prototype! Check it out at https://katnip.org Components added: Stage This was honestly a pretty hard part of the process. I am using tw-scaffolding, the core vm from TurboWarp. But it has no types, no docs, and the docs that exist are outdated. So I resorted to having Claude make a .d.ts file for me so I could fuzz my way through instead. This process wasn’t that bad once the functions were clear, and I hooked it up to my compiler—intentionally designed to output Uint8Array. Toolbar This was fun since I don’t know svelte yet that well. I had a state originally stored in my state.svelte.ts, but I figure out I could refactor and not need it. Then I just did some vm tomfoolery to ensure the threads stay open on pausing, and it was good to go. Terminal This is a super rudamentry approach. I plan to have an input method at some point, but we will see. Hopefully I implement a better technique, currently I just have a string array storing the logs. Makes it easy to make it stateful in svelte ig
Costumes + Sounds! Finally, after a long time of putting this off, Katnip finally has syntax to import sounds and assets to use for your projects! stage { costume "./sky.svg"; events.onFlag() { looks.switchBackdrop("sky"); } } sprite Cat { costume "./cat.svg" as idle; costume "./cat-blink.svg" as blink; sound "./meow.wav"; events.onFlag() { motion.goTo(-100, 0); looks.switchCostume("idle"); looks.say("costumes + sounds work", 2); forever { wait(0.5); looks.nextCostume(); } } } Changelog Compiler changes Added costume and sound keywords Added stage keyword for stage override (previously auto-gen’d) Added forever keyword (cuz I forgot to add it somehow) Website changes Added upload icon for uploading files Added support for the new costume and sound required fs callbacks Added “rename” in dropdown right-click context Notes Not sure how the forever block and rename button took this long to add, both seem like something I could’ve adressed earlier, but—better late than never :P
Sigma Peak Editor Frfr The editor is turning out beautifully . Like I love it so far. Tons and tons of improvements to mainly the editor, but a few pivotal improvements to the compiler itself. Website / GUI Improvements File uploads — no longer are your costumes handwritten svgs :P AND you can import .knip files! QOL improvements — draggable files, auto-focus editor on openning of website Terminal prettification STAGE BUTTONS! — start / pause / stop + TurboMode Flag functionality rework click => compile + run shift+click => run without compiling Settings file actually does something Compiler improvements Costumes implementation (new syntax!) Forever block + more math blocks! Zip compression level compiler flag
Ships:
I made the semantic analysis portion to a custom coding language for scratch. It aims to bridge the gap for kids between code blocks and real scripting. It has full type safety, and a variety of different language components, creating a rich and immersive transition from scratch into the real world of programming. It has both simple syntax but also allows a high skill ceiling with more complex syntax. I struggled a lot, spending hours on end chatting with programmers I am friends with, crafting a lot of these language decisions in late night chats. Every single step has been deliberately taken. I am proud of the consistency and quality of the code I wrote. I feel proud to have made this section, and hope that by shipping (and hopefully the community receiving it well) I will be able to continue forwards to finishing the IR and code gen. Since there isn’t a best way to use a programming language, I suggest both installing the npm package and the vscode extension (search ‘Katnip’ in the store). This will give you in-editor syntax highlighting and typechecking. Feel free to use the cli for lexing, parsing, and type checking.
Katnip. For real this time. From text -> blocks. It now exists. Fully type-checked. Powerful enums. Function returns. And it all compiles into scratch. Over the past 36 hours I have worked on making the IR and Codegen layers come to life. From working with stacks, and other more complex algorithms, hoisting, scopes, and everything in between, It now compiles. Katnip is a language designed to not just be a surragate for scratch syntax, its supposed to fix it, and offer a scripting alternative. Gone are the days of wrong data types, debugging random lines, Katnip can do that for you. Types and bugs are well defined, and easy to find. To use this project, I currently do not have a website, but install it through NPM: https://www.npmjs.com/package/@katnip-org/compiler npm i @katnip-org/compiler Happy coding :P...
|
1792993913.4194849
|
1793080313.4194849
|
|
37233
|
Drowned Fish by @cauadev | Stardance
|
cauadev
|
1
|
80.29
|
1155
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T15:31:11Z", "hours": 80.0, "multiplier": 14.43, "payout": 1155, "blessing": "neutral", "text": "Hello guys! Drowned-Fish A simple 2D troll game made with Love2D. The name is a thing as impossible as you beating this game. It has 26 levels, uncountable traps and lots and lots of teasing voicelines meant specifically to annoy you. Controls WASD - Move P - Pause/unpause Struggles (Only the main ones) Creative block at level design (especially for the last sectors). Physics, because I thought Bump.lua would do the job well, but discovered (too late to switch for something like love.physics ) that it doesn’t work well with moving objects (basically a lot of my game), so it still has some physics quirks, although I did my best to fix a lot of them. Making my game pretty (I’m a dev, not an artist) Voicelines (like finding them on my phone to transfer to the project or changing their volume because they were too low. Also, they’re kind of bad quality Drowned-Fish Initiative uses cheap speakers). UI, because Love2D, although being awesome, doesn’t have helpers for UI, so all UI logic had to be hand written Implementing specific props, such as lasers, moveable props, spinning platforms and boosters I’m proud of… Having a whole game to call mine Overcoming all topics mentioned in Struggles Learning: Game dev, a new language (Lua), a framework (Love2D) and some unexpected things (like discovering Tiled existence or how AppImage works under the hood) Download You can download it at the GitHub releases page . It’s officially supported for Windows and Linux at the x86_64 architecture. If your system isn’t supported, you can: Download the universal .love build, along with a Love2D runtime (they’re available at the official Love2D page ) and open the build with Love2D Skip this project and rate another project instead (don’t rate it if you can’t play it first, please)", "repo": "https://github.com/Br-Zueira/Drowned-Fish", "demo": "https://github.com/Br-Zueira/Drowned-Fish/releases/tag/v1.0.0"}]...
|
[{"post_id": 75741, "ts": "202 [{"post_id": 75741, "ts": "2026-09-30T22:18:40Z", "hours": 0.2886, "text": "Hello! Struggles at shipping My game was rejected for using an old OpenGL version, but forcing it to use a newer OpenGL by default isn’t something I can easily change without forking Love2D (simply not doable for me). Also, it did work as intended on a variety of devices (old, new, Windows, Linux). And searching a bit, apparently Love2D automatically try using OpenGL 3.0 if it’s available on the device. So, if you’re a shipwright, please take this in consideration. Note -> Also, I want to say that during this midtime I changed my Chromebook setup from ChromeOS Crostini (Debian container) to bare metal Linux (I use Arch btw)"}, {"post_id": 71223, "ts": "2026-09-20T14:03:54Z", "hours": 1.4161, "text": "Hello guys! Finally shipping this thing! Made S5L5 and S5L6 (yeah, this one has 6 levels, although level 6 is just like an “ending”) and added new voicelines. Goodbye! See you guys again in my new projects! (check out Hello-Raylib, my current one, or Boilerplater, my Vscode extension)"}, {"post_id": 62373, "ts": "2026-09-05T18:19:55Z", "hours": 2.1108, "text": "Hello guys! New levels Finished Sector 5 Level 3 (S5L3) and did S5L4. Features of S5L4 Fake integer overflow at the level deaths counter, which explains the “broken” level Falling tiles (Can go up, down and custom directions, either moving at a fixed speed or suffering from a “gravity”) Struggles Level design: Solved by testing whatever came to my mind and seemed fun, even for a slight bit. Figuring out how to make the falling tiles without being a total pain: Solved by some default values, syntatic sugar and abstractions (variables with isUp = true are assumed to go only up, else and not EndX and EndY are assumed to go only down). Bye!"}, {"post_id": 59957, "ts": "2026-09-02T01:01:40Z", "hours": 1.8258, "text": "Hello guys! Progress I’ve done this silly cursor (with a frowned face!) that can follow a target! It has two options: Fixed time to reach target (with variable speed) and fixed speed (with variable time to reach target). It has a trigger collision (equals no collision with player) by default, but can be solid. It uses mostly of moveable props updating logic. Struggles Thinking about edge cases (like time being on 0 and division by 0 happening or cursor already being at target) and how to implement my ideas (like a variable speed based on time). This silly bug where cursor can crush you (even when having a trigger collision). Probably letting it as a troll feature. Wanted to draw cursor over everything else (solved it by adding a “layer” property at props, where cursor is at layer 999 while tiles are at -999 and default is 0. Also, player is still rendering at cursor front, but probably ignoring this, as it’s not an issue.) TODO Finishing the level (S5L3) and doing lots of troll shenanigans."}, {"post_id": 59182, "ts": "2026-08-31T20:34:32Z", "hours": 2.2239, "text": "Hello guys! What I’ve done (No, I’ll not face myself) Sector 5 levels 1 and 2, and the beginning of brainstorming for level 3. Level 1 messes up with controls. Level 2 takes it further and also messes with gravity. Level 3 is… I dunno, have to think (creative block is being a huge roadblock for this game). Struggles Creative block for levels (already said it) Being lazy (mostly because the creative block makes my brain want to avoid this project) Lack of free time (It’s better now, but was kind of an issue for me) TODO More levels (at least Level 3 to 5, but I thought of doing more) Maybe improving UX/UI (NOT A PROMISE) More voicelines (absolutely needed)"}, {"post_id": 55251, "ts": "2026-08-26T22:19:20Z", "hours": 1.0742, "text": "Hello, guys! Development Yesterday, I’ve done this level (S4L5). It’s officially the last level for Sector 4. The X thing rotates clockwise, then there are the traps I won’t tell (go play it by yourself to discover!) Struggles I really struggled with physics (the player often noclips through the walls or the spinning X thing), and decided it’ll be a feature/something explained in-game (the sector already messes with physics, such as gravity inversion, so it can be treated as a “colateral effect”). I added a death condition, which is being squished at axis X (didn’t solve, but now it’s there). Sector 5 You guys can be sure Sector 5 will be the silliest one. I plan to get very creative at this one, such as messing with controls, breaking the 4th wall, etc. Note Just discovered those awesome emojis, so I’ll definitively start using them. Also, just decided to use Markdown features simply because I can."}, {"post_id": 54641, "ts": "2026-08-25T17:49:56Z", "hours": 2.0483, "text": "Hello guys! On the last days, I’ve been doing sector 4 level 3 (the one at the picture) and 4! I struggled with gravity effects (spoiler: those levels mess up with gravity and Y-axis acceleration), and this was not that easy. Ended up having to do a trigger that doesn’t get deleted as soon as it gets trigged, so it can smoothly slow down player until velY gets to 0. Also, changed jump system in order to be able of jumping from the ceiling. TODO: S4L5 (maybe horizontal gravity?) and S5 (probably the last sector, and the hardest to code, as I want it to break the 4th wall and mess up with controls and UI). Bye!"}, {"post_id": 51329, "ts": "2026-08-20T22:26:49Z", "hours": 1.6053, "text": "Hello guys! In the last days, I’ve done these translucid tiles. They pulsate using sine waves, and gets brighter if player is close (had to learn easing functions just to make it smoother!). Not too much struggles (fortunately), except by the fact I first tried to use bump.lua collision checking (for some forbidden reason didn’t work), then went to euclidian distance formula (linear) and finally used an easing formula (as smooth as butter on hot knife). That’s it! (Also, some tiny patches that are probably smaller than this sentence so are not worth being mentioned.)"}, {"post_id": 49790, "ts": "2026-08-18T18:40:46Z", "hours": 2.57, "text": "Hello guys! Oh these days, I worked on these amazing particle systems. Also, did you notice a small delay between dying or touching a goal/sector gate and respawning or loading the new level? That’s the brand new freeze player option. The player becomes invisible, immortal and immoveable for a small amount of time (500ms to be more specific) to make it feel more smooth. At first, it caused me a simple yet huge headache involving voicelines that play right at the start of levels entered by a sector gate. Turns out it was that the sector gates kept detecting collision with frozen player (and consequently refiring logic) and bugging it all. Shout out to Claude for finding the bug root for me!"}, {"post_id": 48535, "ts": "2026-08-16T23:15:39Z", "hours": 2.7033, "text": "Hello guys! On the last days, I’ve been making this level (S4L2). The single thing that was a thorn at my side was the rotating moving platform at right. The individual tiles would incorrectly spin around rotation center because they wouldn’t keep a constant radius from center, causing a mess. The solution was to force the tiles to keep a constant radius from rotation center. Also, level design is being a real struggle for me: Lack of inspiration for cool, unique and with funny trolling. I’m open for suggestions!"}, {"post_id": 45346, "ts": "2026-08-11T18:53:24Z", "hours": 3.4861, "text": "Hello guys! In those days, I’ve been making those spinning platforms, and also S4L1 (this level). It’s probably not 100% finished, considering its still not troll. Struggle: Physics (Bump.lua really hates moving and rotating props) and figuring out how to actually make it rotate. Also, I’m struggling with ideas for the level."}, {"post_id": 43235, "ts": "2026-08-08T11:38:33Z", "hours": 4.205, "text": "Hello guys! In the last days, I added new assets, such as songs and backgrounds (one for each sector). I also finally added SFX! Then, I re-included and re-formulated death by crush (struggled with it, ended up having to use subtick system for it to work correctly). Finally, I did a logo/icon for the game."}, {"post_id": 41350, "ts": "2026-08-05T14:39:50Z", "hours": 5.0219, "text": "Hello guys! Yesterday, I made s3l5. I’ve also made s3l4 a bit easier. Also, I’ve made the laser seem a bit thicker and way more cool. Finally, I’ve done some bash scripts: bundle.sh = Bundles the game modules, assets, maps, libraries, main.lua (entry point) and conf.lua (Love2D configurations) into a .love file windows-package.sh = Merges the .love file with Love2D standalone .exe, puts it into a folder with Love2D dlls, game license and readme linux-x86_64-package.sh = Unpacks Love2D AppImage, changes variables and filenames, merges Love2D bin with the .love file, handles both Love2D and game license and game readme and packs it back into an AppImage using AppImageTool"}, {"post_id": 39807, "ts": "2026-08-03T01:25:25Z", "hours": 2.1606, "text": "Hello guys! Today, I’ve basically done those lasers and s3l4 (the level on the pic). Struggled with: alternating laser patterns based on lasers that started disabled. It was a single line of code (if isDisabled then return instance end) but lots of headaches and anger and unexpected behaviour. Also, it was kind of hard to figure out how to make these dynamic beans work out. Ended up basically taking advantage of table references (parent laser emitters coordinates) and “if isDisabled then return end” code guards."}, {"post_id": 39229, "ts": "2026-08-02T01:56:01Z", "hours": 3.1364, "text": "Hello guys! Today, I’ve made Sector 3 Level 3 (the background level). I’ve also done this pause menu. It even saves the volume and the muted state in a settings.json file. TODO: More levels, maybe a few brand new props and probably my first sound effects."}, {"post_id": 37947, "ts": "2026-07-31T00:06:18Z", "hours": 6.5086, "text": "Hey guys! On these days, I made sector 3 along with its two first levels. I also started making this terminal-style pause menu where you can adjust the audio channels. Finally, I enhanced the song playing (now it has better support to multiple tracks). Struggles: making a UI that is both functional and not completely awful simply with Love (pun intended). TODO: Put a volume changer (probably not a slider, more simple, like arrow keys) and a button to go back to hub."}, {"post_id": 36483, "ts": "2026-07-28T16:50:27Z", "hours": 1.8083, "text": "Hello guys! Yesterday and the day before, I made sector 2 level 4. I also added springs and speed boosters to the game. Save features: Unlocking levels gradually and saving least death count per sector, everything in save.json file and with temp json files to avoid corruption (atomic saving). The least death count is showed at sector hub over each sector gate. Struggles: boosting player’s velX (its zeroed after every frame to avoid sliding, but this also zeroed the boost. The solution was to create a different variable in player, called boostedX, that is managed diferently from velX and taken in account with velX to move player). And bump.lua’s bounce, which I had to replace with “self.velY = -self.velY”, and for some reason automatically ensured energy loss (realistic physics) even though I didn’t program it. And I’ll keep it this way because it’s good, realistic and, most important, fun. Bye!"}, {"post_id": 35973, "ts": "2026-07-27T19:22:49Z", "hours": 2.6047, "text": "Hello fellas! Yesterday and today, I added a saving system. It saves unlocked sectors and least death counts. This least death counts is showed in sector hub below sector number. I also made sector 2 level 3 (the level in the picture)."}, {"post_id": 35502, "ts": "2026-07-26T23:48:00Z", "hours": 4.0628, "text": "Hello, guys! On the last days, I did this sector hub! Also, I was finally able of patching the physics bugs involving moveables and player! Besides that, I added sector 2 level 2. Bye!"}, {"post_id": 34631, "ts": "2026-07-25T14:50:05Z", "hours": 4.7336, "text": "Hello, fellas! Yesterday, I did this new UI and also added a moveable prop class (until that, every moving prop was jury-rigging involving moversaws) and sector 2 level 1."}, {"post_id": 34000, "ts": "2026-07-24T12:09:06Z", "hours": 4.9647, "text": "Hello, guys! Yesterday, I did two brand new levels: 4 and 5 (this one). I also started organizing levels in “sectors” - Level groups. Besides that, I made improvements in mover saws, debugging (now the game supports level and sector flags) and even a separate test map if I ever need to test specific things. Issues: Collision. Yeah, that’s it. The fake saw in level 4 gave me looots of trouble, debugging and some unfixed bugs involving player on vertically moving objects. The ultimate “fix”? Slowing the saw. But it worked. That’s what matters."}, {"post_id": 33469, "ts": "2026-07-23T13:26:08Z", "hours": 4.6464, "text": "Hello guys! Yesterday and today, I added level 3, with portals. I also added a voiceline manager module and two brand new voicelines. Besides that, as you can see, I added some new visual improvements: A background, a font and a sprite for the player. Now the game went from 100% ugly to 99% ugly. It’s still an improvement, though, plus I want to replace these sprites later."}, {"post_id": 32972, "ts": "2026-07-22T14:01:01Z", "hours": 4.7653, "text": "Hello guys! Yesterday and today, I did the first two actual levels of the game (I discarded the old test map!) I also did some new obstacles, such as fake tiles and moving saws. Not only that, but a trigger class too. I added some helpers for audio and even a soundtrack (Thanks Imphenzia for the awesome and no copyright “Discovery of Planet X” soundtrack). Struggles: Crostini (ChromeOS Linux container) mysterious volume changes each time I opened it, making me think the problem were the voicelines and the soundtrack, collision quirks (like the saw from the gif getting stuck at the player and not killing or triggers being sticky instead of untoucheable) and Tiled/STI (mainly about tilesets). That’s it!"}, {"post_id": 32316, "ts": "2026-07-21T12:36:06Z", "hours": 4.3033, "text": "Hello guys! Yesterday, I moved the main logic from props to player itself (the deadly and the goal thing). Also, as you can see in this gif, I added some of the first troll items: a goal that moves when player is close and a spike that only appears when player is close. Besides that, I added a logic handler where you can have levelx__data.lua separate from the Tiled’s levelx.lua, where __data contains logic exclusive to that level. Finally, I used all my dubbing skills (100% of 0 is 0) to make some voice lines to the game. It’s a narrator that keeps teasing you."}, {"post_id": 31539, "ts": "2026-07-20T00:57:14Z", "hours": 2.9972, "text": "Hey guys! Today, I officially integrated Tiled to the game and added spawn points and “killable” (killer) props. Today’s struggles: nil values, killer props not killing and Tiled itself. TODO: a lot, probably more focused on organizing code and adding new props."}, {"post_id": 31211, "ts": "2026-07-19T12:56:11Z", "hours": 3.0753, "text": "Hey guys! Yesterday and today, I’ve made this simple setup. It has a player and a prop managment (the green platform is composed by individual tiles of 32x32px, where a tile is considered a prop). As you can see, it also has death system (with counting) and movement system. This is just the beginning!"}]...
|
Title: Drowned Fish by @cauadev | Stardance
Devlo Title: Drowned Fish by @cauadev | Stardance
Devlogs:
Hey guys! Yesterday and today, I’ve made this simple setup. It has a player and a prop managment (the green platform is composed by individual tiles of 32x32px, where a tile is considered a prop). As you can see, it also has death system (with counting) and movement system. This is just the beginning!
Hey guys! Today, I officially integrated Tiled to the game and added spawn points and “killable” (killer) props. Today’s struggles: nil values, killer props not killing and Tiled itself. TODO: a lot, probably more focused on organizing code and adding new props.
Hello guys! Yesterday, I moved the main logic from props to player itself (the deadly and the goal thing). Also, as you can see in this gif, I added some of the first troll items: a goal that moves when player is close and a spike that only appears when player is close. Besides that, I added a logic handler where you can have levelx__data.lua separate from the Tiled’s levelx.lua, where __data contains logic exclusive to that level. Finally, I used all my dubbing skills (100% of 0 is 0) to make some voice lines to the game. It’s a narrator that keeps teasing you.
Hello guys! Yesterday and today, I did the first two actual levels of the game (I discarded the old test map!) I also did some new obstacles, such as fake tiles and moving saws. Not only that, but a trigger class too. I added some helpers for audio and even a soundtrack (Thanks Imphenzia for the awesome and no copyright “Discovery of Planet X” soundtrack). Struggles: Crostini (ChromeOS Linux container) mysterious volume changes each time I opened it, making me think the problem were the voicelines and the soundtrack, collision quirks (like the saw from the gif getting stuck at the player and not killing or triggers being sticky instead of untoucheable) and Tiled/STI (mainly about tilesets). That’s it!
Hello guys! Yesterday and today, I added level 3, with portals. I also added a voiceline manager module and two brand new voicelines. Besides that, as you can see, I added some new visual improvements: A background, a font and a sprite for the player. Now the game went from 100% ugly to 99% ugly. It’s still an improvement, though, plus I want to replace these sprites later.
Hello, guys! Yesterday, I did two brand new levels: 4 and 5 (this one). I also started organizing levels in “sectors” - Level groups. Besides that, I made improvements in mover saws, debugging (now the game supports level and sector flags) and even a separate test map if I ever need to test specific things. Issues: Collision. Yeah, that’s it. The fake saw in level 4 gave me looots of trouble, debugging and some unfixed bugs involving player on vertically moving objects. The ultimate “fix”? Slowing the saw. But it worked. That’s what matters.
Hello, fellas! Yesterday, I did this new UI and also added a moveable prop class (until that, every moving prop was jury-rigging involving moversaws) and sector 2 level 1.
Hello, guys! On the last days, I did this sector hub! Also, I was finally able of patching the physics bugs involving moveables and player! Besides that, I added sector 2 level 2. Bye!
Hello fellas! Yesterday and today, I added a saving system. It saves unlocked sectors and least death counts. This least death counts is showed in sector hub below sector number. I also made sector 2 level 3 (the level in the picture).
Hello guys! Yesterday and the day before, I made sector 2 level 4. I also added springs and speed boosters to the game. Save features: Unlocking levels gradually and saving least death count per sector, everything in save.json file and with temp json files to avoid corruption (atomic saving). The least death count is showed at sector hub over each sector gate. Struggles: boosting player’s velX (its zeroed after every frame to avoid sliding, but this also zeroed the boost. The solution was to create a different variable in player, called boostedX, that is managed diferently from velX and taken in account with velX to move player). And bump.lua’s bounce, which I had to replace with “self.velY = -self.velY”, and for some reason automatically ensured energy loss (realistic physics) even though I didn’t program it. And I’ll keep it this way because it’s good, realistic and, most important, fun. Bye!
Hey guys! On these days, I made sector 3 along with its two first levels. I also started making this terminal-style pause menu where you can adjust the audio channels. Finally, I enhanced the song playing (now it has better support to multiple tracks). Struggles: making a UI that is both functional and not completely awful simply with Love (pun intended). TODO: Put a volume changer (probably not a slider, more simple, like arrow keys) and a button to go back to hub.
Hello guys! Today, I’ve made Sector 3 Level 3 (the background level). I’ve also done this pause menu. It even saves the volume and the muted state in a settings.json file. TODO: More levels, maybe a few brand new props and probably my first sound effects.
Hello guys! Today, I’ve basically done those lasers and s3l4 (the level on the pic). Struggled with: alternating laser patterns based on lasers that started disabled. It was a single line of code (if isDisabled then return instance end) but lots of headaches and anger and unexpected behaviour. Also, it was kind of hard to figure out how to make these dynamic beans work out. Ended up basically taking advantage of table references (parent laser emitters coordinates) and “if isDisabled then return end” code guards.
Hello guys! Yesterday, I made s3l5. I’ve also made s3l4 a bit easier. Also, I’ve made the laser seem a bit thicker and way more cool. Finally, I’ve done some bash scripts: bundle.sh = Bundles the game modules, assets, maps, libraries, main.lua (entry point) and conf.lua (Love2D configurations) into a .love file windows-package.sh = Merges the .love file with Love2D standalone .exe, puts it into a folder with Love2D dlls, game license and readme linux-x86_64-package.sh = Unpacks Love2D AppImage, changes variables and filenames, merges Love2D bin with the .love file, handles both Love2D and game license and game readme and packs it back into an AppImage using AppImageTool
Hello guys! In the last days, I added new assets, such as songs and backgrounds (one for each sector). I also finally added SFX! Then, I re-included and re-formulated death by crush (struggled with it, ended up having to use subtick system for it to work correctly). Finally, I did a logo/icon for the game.
Hello guys! In those days, I’ve been making those spinning platforms, and also S4L1 (this level). It’s probably not 100% finished, considering its still not troll. Struggle: Physics (Bump.lua really hates moving and rotating props) and figuring out how to actually make it rotate. Also, I’m struggling with ideas for the level.
Hello guys! On the last days, I’ve been making this level (S4L2). The single thing that was a thorn at my side was the rotating moving platform at right. The individual tiles would incorrectly spin around rotation center because they wouldn’t keep a constant radius from center, causing a mess. The solution was to force the tiles to keep a constant radius from rotation center. Also, level design is being a real struggle for me: Lack of inspiration for cool, unique and with funny trolling. I’m open for suggestions!
Hello guys! Oh these days, I worked on these amazing particle systems. Also, did you notice a small delay between dying or touching a goal/sector gate and respawning or loading the new level? That’s the brand new freeze player option. The player becomes invisible, immortal and immoveable for a small amount of time (500ms to be more specific) to make it feel more smooth. At first, it caused me a simple yet huge headache involving voicelines that play right at the start of levels entered by a sector gate. Turns out it was that the sector gates kept detecting collision with frozen player (and consequently refiring logic) and bugging it all. Shout out to Claude for finding the bug root for me!
Hello guys! In the last days, I’ve done these translucid tiles. They pulsate using sine waves, and gets brighter if player is close (had to learn easing functions just to make it smoother!). Not too much struggles (fortunately), except by the fact I first tried to use bump.lua collision checking (for some forbidden reason didn’t work), then went to euclidian distance formula (linear) and finally used an easing formula (as smooth as butter on hot knife). That’s it! (Also, some tiny patches that are probably smaller than this sentence so are not worth being mentioned.)
Hello guys! On the last days, I’ve been doing sector 4 level 3 (the one at the picture) and 4! I struggled with gravity effects (spoiler: those levels mess up with gravity and Y-axis acceleration), and this was not that easy. Ended up having to do a trigger that doesn’t get deleted as soon as it gets trigged, so it can smoothly slow down player until velY gets to 0. Also, changed jump system in order to be able of jumping from the ceiling. TODO: S4L5 (maybe horizontal gravity?) and S5 (probably the last sector, and the hardest to code, as I want it to break the 4th wall and mess up with controls and UI). Bye!
Hello, guys! Development Yesterday, I’ve done this level (S4L5). It’s officially the last level for Sector 4. The X thing rotates clockwise, then there are the traps I won’t tell (go play it by yourself to discover!) Struggles I really struggled with physics (the player often noclips through the walls or the spinning X thing), and decided it’ll be a feature/something explained in-game (the sector already messes with physics, such as gravity inversion, so it can be treated as a “colateral effect”). I added a death condition, which is being squished at axis X (didn’t solve, but now it’s there). Sector 5 You guys can be sure Sector 5 will be the silliest one. I plan to get very creative at this one, such as messing with controls, breaking the 4th wall, etc. Note Just discovered those awesome emojis, so I’ll definitively start using them. Also, just decided to use Markdown features simply because I can.
Hello guys! What I’ve done (No, I’ll not face myself) Sector 5 levels 1 and 2, and the beginning of brainstorming for level 3. Level 1 messes up with controls. Level 2 takes it further and also messes with gravity. Level 3 is… I dunno, have to think (creative block is being a huge roadblock for this game). Struggles Creative block for levels (already said it) Being lazy (mostly because the creative block makes my brain want to avoid this project) Lack of free time (It’s better now, but was kind of an issue for me) TODO More levels (at least Level 3 to 5, but I thought of doing more) Maybe improving UX/UI (NOT A PROMISE) More voicelines (absolutely needed)
Hello guys! Progress I’ve done this silly cursor (with a frowned face!) that can follow a target! It has two options: Fixed time to reach target (with variable speed) and fixed speed (with variable time to reach target). It has a trigger collision (equals no collision with player) by default, but can be solid. It uses mostly of moveable props updating logic. Struggles Thinking about edge cases (like time being on 0 and division by 0 happening or cursor already being at target) and how to implement my ideas (like a variable speed based on time). This silly bug where cursor can crush you (even when having a trigger collision). Probably letting it as a troll feature. Wanted to draw cursor over everything else (solved it by adding a “layer” property at props, where cursor is at layer 999 while tiles are at -999 and default is 0. Also, player is still rendering at cursor front, but probably ignoring this, as it’s not an issue.) TODO Finishing the level (S5L3) and doing lots of troll shenanigans.
Hello guys! New levels Finished Sector 5 Level 3 (S5L3) and did S5L4. Features of S5L4 Fake integer overflow at the level deaths counter, which explains the “broken” level Falling tiles (Can go up, down and custom directions, either moving at a fixed speed or suffering from a “gravity”) Struggles Level design: Solved by testing whatever came to my mind and seemed fun, even for a slight bit. Figuring out how to make the falling tiles without being a total pain: Solved by some default values, syntatic sugar and abstractions (variables with isUp = true are assumed to go only up, else and not EndX and EndY are assumed to go only down). Bye!
Hello guys! Finally shipping this thing! Made S5L5 and S5L6 (yeah, this one has 6 levels, although level 6 is just like an “ending”) and added new voicelines. Goodbye! See you guys again in my new projects! (check out Hello-Raylib, my current one, or Boilerplater, my Vscode extension)
Hello! Struggles at shipping My game was rejected for using an old OpenGL version, but forcing it to use a newer OpenGL by default isn’t something I can easily change without forking Love2D (simply not doable for me). Also, it did work as intended on a variety of devices (old, new, Windows, Linux). And searching a bit, apparently Love2D automatically try using OpenGL 3.0 if it’s available on the device. So, if you’re a shipwright, please take this in consideration. Note -> Also, I want to say that during this midtime I changed my Chromebook setup from ChromeOS Crostini (Debian container) to bare metal Linux (I use Arch btw)
Ships:
Hello guys! Drowned-Fish A simple 2D troll game made with Love2D. The name is a thing as impossible as you beating this game. It has 26 levels, uncountable traps and lots and lots of teasing voicelines meant specifically to annoy you. Controls WASD - Move P - Pause/unpause Struggles (Only the main ones) Creative block at level design (especially for the last sectors). Physics, because I thought Bump.lua would do the job well, but discovered (too late to switch for something like love.physics ) that it doesn’t work well with moving objects (basically a lot of my game), so it still has some physics quirks, although I did my best to fix a lot of them. Making my game pretty (I’m a dev, not an artist) Voicelines (like finding them on my phone to transfer to the project or changing their volume because they were too low. Also, they’re kind of bad quality Drowned-Fish Initiative uses cheap speakers). UI, because Love2D, although being awesome, doesn’t have helpers for UI, so all UI logic had to be hand written Implementing specific props, such as lasers, moveable props, spinning platforms and boosters I’m proud of… Having a whole game to call mine Overcoming all topics mentioned in Struggles Learning: Game dev, a new language (Lua), a framework (Love2D) and some unexpected things (like discovering Tiled existence or how AppImage works under the hood) Download You can download it at the GitHub releases page . It’s officially supported for Windows and Linux at the x86_64 architecture. If your system isn’t supported, you can: Download the universal .love build, along with a Love2D runtime (they’re available at the official Love2D page ) and open the build with Love2D Skip this project and rate another project instead (don’t rate it if you can’t play it first, please)...
|
1793008192.4110355
|
1793094592.4110355
|
|
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 ....
|
1793004827.1515436
|
1793091227.1515436
|
|
43412
|
Java Utils by @ryan_ | Stardance
|
ryan_
|
1
|
80.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-15T11:20:22Z", "hours": 80.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built java-utils, a collection of high-performance Java utilities and APIs designed for Java 21+. It provides optimised and robust core features, featuring a high-performance event dispatching system, a multi layered and priority based service loading framework, thread safe object registries, and more. Features: High performance polymorphic event dispatching system (event bus) supporting priority-based routing and cancellation logic. It utilises SPI loaded compile time generated invoker factories for reflection free dispatch when compiled with the annotation processor, alongside high performance fallbacks via LambdaMetafactory and MethodHandle . A multilayered and priority service loading framework. Provided ServiceLayer s are passed to ServiceBootstrap to create ServiceRegistry , which allows users to find and locate implementations by providing the registry with a contract class, where the layers will locate the implementations. Thread safe freezable object Registry<T> with a mutate and freeze lifecycle, allowing safe registration during bootstrap before turning strictly read only on freeze. Config helpers to aid config serialisation with Kaleido Config (e.g. implement ISerializableEnum<T> on an enum to make it serialisable, ElementOrList type to either take a single element or a list) Reflection wrapper designed to try comply with the Java Language Specification (JLS)", "repo": "", "demo": ""}]...
|
[{"post_id": 47386, "ts": "202 [{"post_id": 47386, "ts": "2026-08-15T09:25:47Z", "hours": 5.1492, "text": "Event Bus: Make MainBus#get static instead of instance method to allow users to utilise the provided MainBus Service API: Fix ClassLoaderServiceLoader not working in module environments by declaring Module#addUses Add MutableServiceLayer for manual service layers and create factory method for configuring them Registry: Add static factory methods to create MutableMappedIdRegistry and MutableKeylessRegistry instances Other: Add demo subproject (CC0 license) showcasing features and how to use eventbus, registry and service api Update build workflow to publish demo artifact Add release github workflow to automatically publish artifacts when a release is created Promote config helpers, registry and service api from WIP to experimental Update README with event bus demo image"}, {"post_id": 47004, "ts": "2026-08-14T16:09:05Z", "hours": 8.4878, "text": "Event bus: Disallowed @Weak on static event handlers for reflection discovered methods. Static handlers do not have a listener to bound to and thus have no reason to be declared as weak listeners; this additionally improves parity with the annotation processor. Service API: Added factory methods to create ServiceLayer instances across different ClassLoader s and ModuleLayer s. Registry system: The registry system was redesigned essentially from the ground up. MutableRegistry has been detached from Registry , and extending interfaces such as MutableMappedRegistry provide additional features (e.g. key -> value mappings) Key -> value mappings are now supported via MappedRegistry and its implementors and ID mappings have been added via the IdRegistry interface. Current implementations like SimpleMutableKeylessRegistry and SimpleMutableMappedIdRegistry provide O(1) operations for lookup and registration whilst still supporting concurrent operations via BoundedSnapshotMap and BoundedSnapshotList as each registration is immutable. Other: Updated build workflow Added USAGE documentation to README showing how to add the library as a dependency in Gradle."}, {"post_id": 46095, "ts": "2026-08-13T01:54:52Z", "hours": 10.0317, "text": "Remove read lock on event dispatch by providing an activeTable Supplier to pass events to if this DispatchTable is closed, allowing #dispatch to race with #close safely. Decouple creation of DispatchTable from Flattener Add option to disable recursion guard in EventBusBuilder Further optimize event dispatch for guarded event buses by removing ThreadLocal#remove call. This remains safe as it is a lightweight 1 length int[] array. Fix ClassValueDispatchTable not dispatching events Improve internal RecursionGuard usability by accepting a Runnable instead of manual #increment and #resetTo(int) calls. Updated unit tests where appropriate to account for refactors Added JMH benchmarks for guarded and unguarded recursion event buses Updated README with benchmark results."}, {"post_id": 44383, "ts": "2026-08-10T03:00:29Z", "hours": 9.3928, "text": "Added support for compile time generated @Weak instance and static event processors. Full refactor of the annotation processor to cleanup the code structure and improve safety via compile time validation. New abstract MethodDescriptor implemented by alongside some implementations like ElementMethodDescriptor (annotation processor variant), ReflectionMethodDescriptor (runtime reflection variant) and MethodKeyDescriptor (cached reflection variant), used to compare methods cleanly. Individual method registration has not yet been implemented. MethodDescriptor will be utilised to locate individual handlers."}, {"post_id": 43302, "ts": "2026-08-08T14:19:28Z", "hours": 11.6325, "text": "Introduced compile-time generated event listeners via an Annotation Processor (AP automatically generates SPI implementations) to reduce runtime reflection which will fallback to reflection path ( LambdaMetafactory + MethodHandle fallback) on failure. Currently only built for instance event listeners: static listeners and direct method registrations will be implemented in the future. The annotation processor looks for classes annotated with @CompiledEventHandlers and generates a SubscriberInvokerFactory which holds an EventSubscriberInvoker for each method. Refactored the reflection subscriber path ( EventSubscriberCompiler and EventHandlerCompiler ) to follow SOLID better and improve extensibility Update unit tests to work with the updated code"}, {"post_id": 41860, "ts": "2026-08-06T10:32:43Z", "hours": 3.4558, "text": "Fixed issues with configuration caching Repackage and add javadoc to config helpers Improved usability by improving javadoc. Renamed Linkable to SubscribtionAware to better fit the name. Finalized EventBusBuilder by adding a register to global registry flag, replacing event consumers with dedicated functional interfaces, updating ErrorHandler to have throwUnchecked helper and replacing the old deprecated EventBus with the new one Repackage and rename module to com.github.rcubedev.utils"}, {"post_id": 40744, "ts": "2026-08-04T13:55:54Z", "hours": 1.1664, "text": "Updated the README by adding a project description, listing components and listing requirements."}, {"post_id": 40086, "ts": "2026-08-03T13:57:01Z", "hours": 30.5581, "text": "Deprecated the old EventBus god object, in favour for the new EventBus implementation which now better following SOLID, improving debugging and DX. It utilises composition, where all features are separated into different classes for testability. Migrated from a flat array dispatch table to a class value dispatch table for O(1) handler lookups after caching vs O(n) before."}]...
|
Title: Java Utils by @ryan_ | Stardance
Devlogs:
Title: Java Utils by @ryan_ | Stardance
Devlogs:
Deprecated the old EventBus god object, in favour for the new EventBus implementation which now better following SOLID, improving debugging and DX. It utilises composition, where all features are separated into different classes for testability. Migrated from a flat array dispatch table to a class value dispatch table for O(1) handler lookups after caching vs O(n) before.
Updated the README by adding a project description, listing components and listing requirements.
Fixed issues with configuration caching Repackage and add javadoc to config helpers Improved usability by improving javadoc. Renamed Linkable to SubscribtionAware to better fit the name. Finalized EventBusBuilder by adding a register to global registry flag, replacing event consumers with dedicated functional interfaces, updating ErrorHandler to have throwUnchecked helper and replacing the old deprecated EventBus with the new one Repackage and rename module to com.github.rcubedev.utils
Introduced compile-time generated event listeners via an Annotation Processor (AP automatically generates SPI implementations) to reduce runtime reflection which will fallback to reflection path ( LambdaMetafactory + MethodHandle fallback) on failure. Currently only built for instance event listeners: static listeners and direct method registrations will be implemented in the future. The annotation processor looks for classes annotated with @CompiledEventHandlers and generates a SubscriberInvokerFactory which holds an EventSubscriberInvoker for each method. Refactored the reflection subscriber path ( EventSubscriberCompiler and EventHandlerCompiler ) to follow SOLID better and improve extensibility Update unit tests to work with the updated code
Added support for compile time generated @Weak instance and static event processors. Full refactor of the annotation processor to cleanup the code structure and improve safety via compile time validation. New abstract MethodDescriptor implemented by alongside some implementations like ElementMethodDescriptor (annotation processor variant), ReflectionMethodDescriptor (runtime reflection variant) and MethodKeyDescriptor (cached reflection variant), used to compare methods cleanly. Individual method registration has not yet been implemented. MethodDescriptor will be utilised to locate individual handlers.
Remove read lock on event dispatch by providing an activeTable Supplier to pass events to if this DispatchTable is closed, allowing #dispatch to race with #close safely. Decouple creation of DispatchTable from Flattener Add option to disable recursion guard in EventBusBuilder Further optimize event dispatch for guarded event buses by removing ThreadLocal#remove call. This remains safe as it is a lightweight 1 length int[] array. Fix ClassValueDispatchTable not dispatching events Improve internal RecursionGuard usability by accepting a Runnable instead of manual #increment and #resetTo(int) calls. Updated unit tests where appropriate to account for refactors Added JMH benchmarks for guarded and unguarded recursion event buses Updated README with benchmark results.
Event bus: Disallowed @Weak on static event handlers for reflection discovered methods. Static handlers do not have a listener to bound to and thus have no reason to be declared as weak listeners; this additionally improves parity with the annotation processor. Service API: Added factory methods to create ServiceLayer instances across different ClassLoader s and ModuleLayer s. Registry system: The registry system was redesigned essentially from the ground up. MutableRegistry has been detached from Registry , and extending interfaces such as MutableMappedRegistry provide additional features (e.g. key -> value mappings) Key -> value mappings are now supported via MappedRegistry and its implementors and ID mappings have been added via the IdRegistry interface. Current implementations like SimpleMutableKeylessRegistry and SimpleMutableMappedIdRegistry provide O(1) operations for lookup and registration whilst still supporting concurrent operations via BoundedSnapshotMap and BoundedSnapshotList as each registration is immutable. Other: Updated build workflow Added USAGE documentation to README showing how to add the library as a dependency in Gradle.
Event Bus: Make MainBus#get static instead of instance method to allow users to utilise the provided MainBus Service API: Fix ClassLoaderServiceLoader not working in module environments by declaring Module#addUses Add MutableServiceLayer for manual service layers and create factory method for configuring them Registry: Add static factory methods to create MutableMappedIdRegistry and MutableKeylessRegistry instances Other: Add demo subproject (CC0 license) showcasing features and how to use eventbus, registry and service api Update build workflow to publish demo artifact Add release github workflow to automatically publish artifacts when a release is created Promote config helpers, registry and service api from WIP to experimental Update README with event bus demo image
Ships:
I built java-utils, a collection of high-performance Java utilities and APIs designed for Java 21+. It provides optimised and robust core features, featuring a high-performance event dispatching system, a multi layered and priority based service loading framework, thread safe object registries, and more. Features: High performance polymorphic event dispatching system (event bus) supporting priority-based routing and cancellation logic. It utilises SPI loaded compile time generated invoker factories for reflection free dispatch when compiled with the annotation processor, alongside high performance fallbacks via LambdaMetafactory and MethodHandle . A multilayered and priority service loading framework. Provided ServiceLayer s are passed to ServiceBootstrap to create ServiceRegistry , which allows users to find and locate implementations by providing the registry with a contract class, where the layers will locate the implementations. Thread safe freezable object Registry<T> with a mutate and freeze lifecycle, allowing safe registration during bootstrap before turning strictly read only on freeze. Config helpers to aid config serialisation with Kaleido Config (e.g. implement ISerializableEnum<T> on an enum to make it serialisable, ElementOrList type to either take a single element or a list) Reflection wrapper designed to try comply with the Java Language Specification (JLS)...
|
1793087905.3826394
|
1793174305.3826394
|
|
33771
|
AtomSim by @yaasshh | Stardance
|
yaasshh
|
2
|
79.17
|
847
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-05T11:10:43Z", "hours": 12.0, "multiplier": 13.8, "payout": 163, "blessing": "neutral", "text": "AtomSim is a website I built that lets you actually see what an atom looks like. You pick an element, or hydrogen, and pick which electron shell you want to look at. Then it draws it. Not a cartoon of dots going around a circle like the diagrams in school, the real shape, the cloud where the electron actually is. Some of them look like spheres, some look like dumbbells, some look like weird four leaf clovers. All of that is real, it just falls out of the math. You can spin it around, slice it in half, look at it as a graph instead, or look at the colored lines of light the atom gives off when it gets hot. That last one is how we know what stars are made of, and you can watch it happen. The part I care about most is that it never fakes anything. Every single number on the screen carries a label saying how it was made. Some are exact, straight from the equations. Some are computed numerically with an error bar attached. Some are approximations, and it says which physical effects it left out. And a few are deliberate “what if” experiments, like turning off the rule that stops two electrons sitting in the same place, just to see the atom collapse. Those are labeled too. So if a picture is pretty rather than true, the app tells you. I wanted something a curious fifteen year old could poke at for an hour and come away with a correct picture in their head, not a comfortable wrong one. It runs in a browser, works on a phone, and every view has its own link you can share. PS: It also has mobile view now!", "repo": "https://github.com/yaasshh09/AtomSim", "demo": "https://atomsim.fly.dev"}, {"ship_num": 2, "ts": "2026-08-07T18:00:05Z", "hours": 58.0, "multiplier": 18.43, "payout": 684, "blessing": "neutral", "text": "Atom Sim is a browser app that solves atoms from scratch and shows you the result. Hydrogen comes out of closed-form math, real atoms like carbon and argon come out of a Hartree-Fock solver I wrote, and you can look at any of them as a 3D electron cloud, a 2D slice, a radial plot, an energy-level diagram or an emission spectrum. You can also break physics on purpose: switch off the Pauli exclusion principle, switch off electron exchange, or type in your own potential V(r) and see what kind of atom falls out. The rule I built everything around is that the model never quietly lies. Every number carries a tag saying how it was made: exact, numerical, approximation, counterfactual, or just a visual choice. That tag follows the number from the solver all the way to the label on screen. What was challenging Hartree-Fock was brutal. The angular coefficients in the Fock operator are easy to get slightly wrong, and when you do, the solver still converges and hands you smooth, beautiful, completely wrong orbitals. Nothing crashes, nothing warns you. I had to re-derive the algebra instead of nudging numbers until a benchmark matched. Error bars were the other trap. Mine looked great for a while and were simply lying, because the real error was coming from the box size, not the grid spacing I was measuring. Argon also took about an hour on a uniform grid until I moved to an exponential mesh, which cut it to seconds. What I’m proud of That it’s honest. Plenty of simulators draw a pretty orbital and say nothing about where it came from. Mine tells you, and the tests enforce it. The spectra are checked against real NIST data inside the test suite, so a physics regression fails CI rather than shipping quietly. How to test it It’s live at https://atomsim.fly.dev . The server sleeps when nobody is using it, so the very first load can take around 15 seconds. After that it’s quick. Good things to try: pick n=3, l=1 and rotate the cloud, then flip to Plane view for the cross-section. Switch the element to argon. Open a guided tour if you want the short version. Every view is a shareable URL, so you can link someone to an exact state.", "repo": "https://github.com/yaasshh09/AtomSim", "demo": "https://atomsim.fly.dev"}]...
|
[{"post_id": 82647, "ts": "202 [{"post_id": 82647, "ts": "2026-10-25T14:39:55Z", "hours": 2.1, "text": "Devlog #10 Since last time I’ve mostly been adding new physics, so here’s the list. Momentum space: The Radial view now shows how fast the electron is likely to be moving, not just where it is. This one is exact math too. Decay cascade: An excited hydrogen atom doesn’t fall straight to the bottom. It drops down step by step, and now you can watch every path it might take and how likely each one is. Lasers: There’s a new laser panel where you shine light on the atom and watch the electron flip back and forth between two levels (these are called Rabi oscillations). Relativity: For one-electron atoms you can now see the Dirac version of the wavefunction, which is what you get when you add Einstein’s relativity to quantum mechanics. The proton radius puzzle: The nucleus isn’t a perfect point. It has a size, and that shifts the energy levels a tiny bit. Two different experiments measured the proton’s size and got different answers, and you can see both predictions side by side. Antihydrogen: You can now make an atom out of antimatter. It matches normal hydrogen exactly, and the app explains why. Nuclear mass slider: You can drag the nucleus mass anywhere from as light as an electron to heavier than tritium and watch the atom change as you go. All of this is getting pushed to the live site now, so it should be up soon!"}, {"post_id": 82281, "ts": "2026-10-24T13:30:25Z", "hours": 5.4447, "text": "Devlog #9 God Ive got a lot show since the last update. First, the atom moves now. If you mix two states, you can watch the electron cloud slosh back and forth. Arrows show where the electron is flowing, and you can color the cloud by its phase. I also changed the look to seem more natural and less AI, I added a plain white theme with a dark mode, grids on every graph, and buttons to save any graph as a picture or a spreadsheet. Then I added a bunch of other features such as: Potassium and calcium, the first atoms past argon. There’s a mini experiment showing why 4s fills before 3d, even when 3d is lower in energy. A table that checks my calculations against real lab measurements for every atom from helium to calcium. sp, sp2 and sp3 hybrid orbitals, the shapes chemists use for bonds. Lines showing exactly where the electron can never be (nodes), and a scale bar in real units. A “measure the electron” button that drops dots one at a time until they build up the real shape. Some smaller things: Every graph has a “Reproduce in Python” box with code you can copy. Any number can be cited with one click. You can export 3D models for printing. Shared links now preview the actual orbital. There’s an API guide, a changelog and a feedback link. I also made the site faster by saving common results, and I fixed the phase colors so colorblind people can tell them apart. I still need to test it in a browser and then deploy it so stay tuned for that!"}, {"post_id": 79261, "ts": "2026-10-13T07:33:52Z", "hours": 1.625, "text": "Devlog #8 This update was mostly about cleaning things up. Firstly, I went through the whole site with a checklist of things that make websites feel cheap or fake. I took out the gradients, made the rounded pill-shaped buttons and badges square, and replaced an emoji warning icon with a normal one. Then I added a Terms page and a Privacy page, linked at the bottom of the side panel. The privacy page explains what the app does and doesn’t track, which isn’t much. All of this was to remove any “ALL AI” msgs ive received I also changed the license. AtomSim used to be MIT, which meant anyone could take it and sell it. Now it’s CC BY-NC 4.0, so people can still use it, share it and change it, as long as they credit me and don’t make money off it. Every font on the site is now Poppins, and it’s bundled with the app so it doesn’t have to load from Google. After that I reread all the text on the site and in the README and fixed anything that sounded robotic. That included a few curly quotes and one sentence that sounded like a press release. I also rewrote the line explaining “provenance” so it just says what it means. All of that is live on the site now. Next up is making the atom move. If you mix two states, the electron cloud sloshes back and forth at the exact frequency of the light the atom gives off. I’ve planned it out and I’m starting on it next. I also wrote down a big list of other ideas for later."}, {"post_id": 62105, "ts": "2026-09-05T11:07:13Z", "hours": 5.0147, "text": "DEVLOG : 7? Since that last update, the cleanup turned into actual features. I finished the frontend narrator pass. Every disclosure string, every physics note, every view intro is now plain prose instead of the app talking about itself in first person. Then I went after the parts of the app that were just annoying to use. Plots are zoomable now. Wheel to zoom, drag to pan, on all five analytic views. I also built a small notation layer so the ASCII the engine emits gets typeset properly at render time, subscripts and superscripts where they belong, without dragging in a whole math library. The big one was mobile. The app used to just refuse to render below a certain width. Now it works down to 320px: a proper mobile shell, view tabs instead of a sidebar list, controls that collapse, and per-view width floors so nothing spills sideways. That took a lot of small fixes I did not expect, a fixed SVG viewBox that hid fixed-width text, and an overflow rule that was already scrolling the page sideways before I touched anything. After that, the URL got a real history. Back and Forward actually work now, and moving between orbitals pushes a history entry while flipping a display toggle just replaces one. Added a copy-link button and keyboard shortcuts for stepping through n, l, m and switching views. Last thing, the title is now just AtomSim. The tagline was doing nothing for anyone."}, {"post_id": 61040, "ts": "2026-09-03T19:03:50Z", "hours": 6.8269, "text": "Devlog #5 or 6??? Since the site went live, most of the work has been cleanup rather than new physics. The whole app used to talk in first person. Every explanation said “I compute this” or “what I’m showing you.” It read like the code was narrating itself, which was odd. So I went through the entire Python engine module by module and rewrote it in plain technical prose. That’s done. Then I started on the frontend, which had way more of it. The disclosure text, the physics notes under each equation, the view intros. That’s still in progress. there were 2 things I had to be extra careful about. Some of those strings are checked word-for-word by tests, so rewording one has potential to break complete the build by itself. In addition, I also tidied the repo layout for public viewing, fixed a deploy pipeline failure, and added privacy-safe visitor counting. Right now i’m cutting padding, and pitching it so a high schooler can follow it without boring a physics grad."}, {"post_id": 42762, "ts": "2026-08-07T17:14:45Z", "hours": 7.2728, "text": "Devlog: Phase 30 to now Phase 30, Instrument frontend. Redesigned the UI to read like a physics instrument. Bundled the fonts, dropped four fields nothing actually measured, and learned that text-transform: uppercase turns 3d into 3D and α² into A², so uppercase is now confined to section headings only. Phase 31, Guided tours. Added walkthroughs that drive the app for you. Nearly shipped a tour that quoted the wrong hydrogen energy because it skipped reduced mass, and fixed two spotlight rings that measured their target before layout settled. Absorption band cleanup. Abutting sub-pixel SVG rects were drawing lines that weren’t in the data. Settled the mean vs deepest-per-column question and fixed decade ticks that failed at both ends of the axis. Housekeeping. Moved specs and plans out to docs/specs and docs/plans. Personal ignores went into .git/info/exclude so no tracked file carries tooling names. Rate limiting. Sized the burst from the app’s real fan-out per action rather than from click counts. The n=6 row plus an auto-refetch was quietly doubling the load. Web hosting. Containerized and deployed to Fly.io as a single process. Cold start from a snapshot is about 1.6s, occasionally up to 22s if the snapshot gets discarded. Argon solves in 2.8s on the deployed box against 1.4s locally. Suspended machines cost nothing, so occasional use stays near a dollar or two a month. Also added rate-limiter logging that identifies refused clients, and confirmed the proxy overwrites forged IP headers, so spoofing doesn’t get you past the limit."}, {"post_id": 41525, "ts": "2026-08-05T19:44:43Z", "hours": 10.8628, "text": "DevLog #3: New Frontend, Plus Small Bits Phase 22 to now. P22, distinguishable electrons. Turned off exchange in Hartree-Fock. Electrons still repel, they just stop being identical. Marked COUNTERFACTUAL. Helium came back exactly zero, so it was gone. P24, Pauli off. Dropped the occupancy cap and everything falls into the 1s. Argon becomes 1s^18 and the periodic table stops existing. P22’s slow convergence was shells, not exchange. P25, isosurfaces. Never size a box on the grid you draw on. The fraction error bar is blind to the box. A 90% p orbital is one piece, not two lobes. P26, HF in 3D. Now in Cloud, Plane, Radial and Surface. Whole-atom and one-orbital radii move opposite ways. Fidelity tiers were literals under the solve. P27, total density. Added D(r), the shape both models describe. A uniform grid steps over the 1s peak, so the test asserts convergence rate, not tolerance. P28, screened density. GSZ gets its own D(r). A density needs its own box. A log axis quietly breaks area = electron count. P29, comparison. Both models on one axis, gap measured. Caught a noise floor, a real number printing as zero, and a wrong caption. Sulfur, chlorine. Split ATOM_KEYS into identity and capability. Derive flags, never pass them. A client check exposed a deep-link race. P30, instrument frontend. Fonts bundled for offline. –edge is a border colour, never a fill. Dropped four fields with no engine behind them. Uppercase turned 3d into 3D, so headings only now. Plot polish. Zoomed line profile labels offsets from window centre, since absolute wavelengths printed the same string six times. Drew xyz axes through the cloud. Absorption, curve of growth. Stopped a zero equivalent width stretching the axis 300 decades. The band drew anti-aliasing seams as absorption lines where transmission was really 0.98 to 1.00. It now bins one column per unit and draws the deepest sample, beside what a real detector pixel would see."}, {"post_id": 38322, "ts": "2026-07-31T17:22:25Z", "hours": 11.9403, "text": "DevLog: Phase 18 to now P18, line shapes. Real lines are not infinitely thin spikes. Atoms move (Doppler) and get jostled by neighbours (pressure), so each line spreads into a bell shape, a Voigt profile. I added that, plus a zoom so you can look at one line up close. The useful trick was a flux-closure check: whatever area a line has before broadening, it has to still have after. That caught two grid bugs that were invisible on screen. P19, optical depth. Until now every line acted as if light escaped freely. In a thick gas strong lines saturate, so doubling the atoms stops doubling the brightness. That is the curve of growth. Lesson: decide which regime a line sits in from the physics, not by eyeballing the slope. Also the wavelength window has to widen as the column thickens, or you clip the wings you are trying to measure. P20, absorption. The mirror of emission. Shine a continuum through the gas, look at what is missing. The trap was that 14 hydrogen lines land on only 6 distinct wavelengths, so matching a profile to its source line by wavelength quietly pairs the wrong ones. I key on the transition instead. P21, Hartree-Fock. The big one. Instead of a fitted screening formula, each electron feels a potential built from all the others, solved over and over until it stops changing. That gets me sulfur and chlorine, which the old model could not touch, plus ions with no preset. Two things worth remembering: the solver’s own error bar was lying to me and needed re-deriving, and what made convergence fast was not a clever algorithm, it was the right mixing constant. P22, cleanup. Made features honest about where they apply. The classical ghost and the force-law lab only make sense for one-electron atoms, so they explain themselves now instead of erroring on a screened atom. Fixed He+ breaking every API call, because the “+” was never URL-encoded. Unknown systems say so instead of spinning. Right now I am fixing hint text that escapes its panel on narrow screens."}, {"post_id": 35332, "ts": "2026-07-26T17:27:28Z", "hours": 27.8683, "text": "Atom_Sim: Physics Simulator Dev Log An atom simulator built on one rule: Every number has a label ( exact , numerical , approximation , counterfactual , or visual_liberty ). Unlabeled numbers are treated as bugs. Stack: Python physics engine -> React + Three.js frontend. Phase Logs Phases 1–3: The Hydrogen Foundation Hydrogen Core: Uses exact math for energies and wavefunctions. Validates its electron clouds using statistical KS tests. Numerical Solver: Solves the Schrödinger equation for custom shapes. It calculates its own accuracy by halving the grid spacing. Constants Lab: Allows changing fundamental constants (hbar, e, c). It proves that changing individual units changes nothing if the ratio between them stays the same. Classical Ghost: Shows old Bohr orbits collapsing, proving why classical physics cannot explain atoms. Phases 4–6: Altered Potential & Real Atoms Fake Physics: Simulates universes with non-standard forces (like Yukawa or power laws) under a clear warning banner. Screened Atoms: Models elements from Helium to Argon using historic 1974 data. If an element (like Sulfur or Chlorine) lacks clean data, it is left out entirely rather than guessed. Phases 7–12: Fields, Relativity & Nuance Dirac Math: Tracks exact relativistic shifts and highlights what the math misses (the Lamb shift). External Fields: Simulates atoms splitting under magnetic fields (Zeeman effect) and electric fields (Stark effect). Hyperfine: Models the 21 cm hydrogen line using the precise electron-to-proton mass ratio. Phases 13–17: Light, Speed & Thermodynamics Fast Math: Uses a custom integration trick to calculate atomic lifetimes exactly and 13x faster. Doublet Ratios: Proves via quantum math (Wigner 6j) why certain spectral lines are twice as bright as others. Heat Sliders: Combines Saha and Boltzmann equations to turn raw rates into actual visible light. Dragging the temperature slider smoothly hands Lyman lines over to Balmer lines. Phase 18: Line Profiles (Current Work) Replaces infinitely sharp lines with realistic Voigt profiles using three combined factors: Natural Width: A Lorentzian shape caused by how fast an excited state decays. Doppler Width: A Gaussian shape caused by thermal motion. Works perfectly for normal hydrogen, positronium, and muonic hydrogen. Instrumental Width: A Gaussian blur based on the user’s chosen telescope or sensor resolution. Note on Missing Physics: Collision/pressure broadening is not simulated. Instead of a text disclaimer, the app calculates how large that missing effect would be and prints the raw margin of error right next to the chart. Core Development Rules No Smoke Tests: Every physics feature must pass an automated math test. No Live Fetches: All reference data is saved locally with a hard citation. No Silent Approximations: If the code cannot calculate something honestly, it stops and prints exactly what data is missing."}]...
|
Title: AtomSim by @yaasshh | Stardance
Devlogs:
A Title: AtomSim by @yaasshh | Stardance
Devlogs:
Atom_Sim: Physics Simulator Dev Log An atom simulator built on one rule: Every number has a label ( exact , numerical , approximation , counterfactual , or visual_liberty ). Unlabeled numbers are treated as bugs. Stack: Python physics engine -> React + Three.js frontend. Phase Logs Phases 1–3: The Hydrogen Foundation Hydrogen Core: Uses exact math for energies and wavefunctions. Validates its electron clouds using statistical KS tests. Numerical Solver: Solves the Schrödinger equation for custom shapes. It calculates its own accuracy by halving the grid spacing. Constants Lab: Allows changing fundamental constants (hbar, e, c). It proves that changing individual units changes nothing if the ratio between them stays the same. Classical Ghost: Shows old Bohr orbits collapsing, proving why classical physics cannot explain atoms. Phases 4–6: Altered Potential & Real Atoms Fake Physics: Simulates universes with non-standard forces (like Yukawa or power laws) under a clear warning banner. Screened Atoms: Models elements from Helium to Argon using historic 1974 data. If an element (like Sulfur or Chlorine) lacks clean data, it is left out entirely rather than guessed. Phases 7–12: Fields, Relativity & Nuance Dirac Math: Tracks exact relativistic shifts and highlights what the math misses (the Lamb shift). External Fields: Simulates atoms splitting under magnetic fields (Zeeman effect) and electric fields (Stark effect). Hyperfine: Models the 21 cm hydrogen line using the precise electron-to-proton mass ratio. Phases 13–17: Light, Speed & Thermodynamics Fast Math: Uses a custom integration trick to calculate atomic lifetimes exactly and 13x faster. Doublet Ratios: Proves via quantum math (Wigner 6j) why certain spectral lines are twice as bright as others. Heat Sliders: Combines Saha and Boltzmann equations to turn raw rates into actual visible light. Dragging the temperature slider smoothly hands Lyman lines over to Balmer lines. Phase 18: Line Profiles (Current Work) Replaces infinitely sharp lines with realistic Voigt profiles using three combined factors: Natural Width: A Lorentzian shape caused by how fast an excited state decays. Doppler Width: A Gaussian shape caused by thermal motion. Works perfectly for normal hydrogen, positronium, and muonic hydrogen. Instrumental Width: A Gaussian blur based on the user’s chosen telescope or sensor resolution. Note on Missing Physics: Collision/pressure broadening is not simulated. Instead of a text disclaimer, the app calculates how large that missing effect would be and prints the raw margin of error right next to the chart. Core Development Rules No Smoke Tests: Every physics feature must pass an automated math test. No Live Fetches: All reference data is saved locally with a hard citation. No Silent Approximations: If the code cannot calculate something honestly, it stops and prints exactly what data is missing.
DevLog: Phase 18 to now P18, line shapes. Real lines are not infinitely thin spikes. Atoms move (Doppler) and get jostled by neighbours (pressure), so each line spreads into a bell shape, a Voigt profile. I added that, plus a zoom so you can look at one line up close. The useful trick was a flux-closure check: whatever area a line has before broadening, it has to still have after. That caught two grid bugs that were invisible on screen. P19, optical depth. Until now every line acted as if light escaped freely. In a thick gas strong lines saturate, so doubling the atoms stops doubling the brightness. That is the curve of growth. Lesson: decide which regime a line sits in from the physics, not by eyeballing the slope. Also the wavelength window has to widen as the column thickens, or you clip the wings you are trying to measure. P20, absorption. The mirror of emission. Shine a continuum through the gas, look at what is missing. The trap was that 14 hydrogen lines land on only 6 distinct wavelengths, so matching a profile to its source line by wavelength quietly pairs the wrong ones. I key on the transition instead. P21, Hartree-Fock. The big one. Instead of a fitted screening formula, each electron feels a potential built from all the others, solved over and over until it stops changing. That gets me sulfur and chlorine, which the old model could not touch, plus ions with no preset. Two things worth remembering: the solver’s own error bar was lying to me and needed re-deriving, and what made convergence fast was not a clever algorithm, it was the right mixing constant. P22, cleanup. Made features honest about where they apply. The classical ghost and the force-law lab only make sense for one-electron atoms, so they explain themselves now instead of erroring on a screened atom. Fixed He+ breaking every API call, because the “+” was never URL-encoded. Unknown systems say so instead of spinning. Right now I am fixing hint text that escapes its panel on narrow screens.
DevLog #3: New Frontend, Plus Small Bits Phase 22 to now. P22, distinguishable electrons. Turned off exchange in Hartree-Fock. Electrons still repel, they just stop being identical. Marked COUNTERFACTUAL. Helium came back exactly zero, so it was gone. P24, Pauli off. Dropped the occupancy cap and everything falls into the 1s. Argon becomes 1s^18 and the periodic table stops existing. P22’s slow convergence was shells, not exchange. P25, isosurfaces. Never size a box on the grid you draw on. The fraction error bar is blind to the box. A 90% p orbital is one piece, not two lobes. P26, HF in 3D. Now in Cloud, Plane, Radial and Surface. Whole-atom and one-orbital radii move opposite ways. Fidelity tiers were literals under the solve. P27, total density. Added D(r), the shape both models describe. A uniform grid steps over the 1s peak, so the test asserts convergence rate, not tolerance. P28, screened density. GSZ gets its own D(r). A density needs its own box. A log axis quietly breaks area = electron count. P29, comparison. Both models on one axis, gap measured. Caught a noise floor, a real number printing as zero, and a wrong caption. Sulfur, chlorine. Split ATOM_KEYS into identity and capability. Derive flags, never pass them. A client check exposed a deep-link race. P30, instrument frontend. Fonts bundled for offline. –edge is a border colour, never a fill. Dropped four fields with no engine behind them. Uppercase turned 3d into 3D, so headings only now. Plot polish. Zoomed line profile labels offsets from window centre, since absolute wavelengths printed the same string six times. Drew xyz axes through the cloud. Absorption, curve of growth. Stopped a zero equivalent width stretching the axis 300 decades. The band drew anti-aliasing seams as absorption lines where transmission was really 0.98 to 1.00. It now bins one column per unit and draws the deepest sample, beside what a real detector pixel would see.
Devlog: Phase 30 to now Phase 30, Instrument frontend. Redesigned the UI to read like a physics instrument. Bundled the fonts, dropped four fields nothing actually measured, and learned that text-transform: uppercase turns 3d into 3D and α² into A², so uppercase is now confined to section headings only. Phase 31, Guided tours. Added walkthroughs that drive the app for you. Nearly shipped a tour that quoted the wrong hydrogen energy because it skipped reduced mass, and fixed two spotlight rings that measured their target before layout settled. Absorption band cleanup. Abutting sub-pixel SVG rects were drawing lines that weren’t in the data. Settled the mean vs deepest-per-column question and fixed decade ticks that failed at both ends of the axis. Housekeeping. Moved specs and plans out to docs/specs and docs/plans. Personal ignores went into .git/info/exclude so no tracked file carries tooling names. Rate limiting. Sized the burst from the app’s real fan-out per action rather than from click counts. The n=6 row plus an auto-refetch was quietly doubling the load. Web hosting. Containerized and deployed to Fly.io as a single process. Cold start from a snapshot is about 1.6s, occasionally up to 22s if the snapshot gets discarded. Argon solves in 2.8s on the deployed box against 1.4s locally. Suspended machines cost nothing, so occasional use stays near a dollar or two a month. Also added rate-limiter logging that identifies refused clients, and confirmed the proxy overwrites forged IP headers, so spoofing doesn’t get you past the limit.
Devlog #5 or 6??? Since the site went live, most of the work has been cleanup rather than new physics. The whole app used to talk in first person. Every explanation said “I compute this” or “what I’m showing you.” It read like the code was narrating itself, which was odd. So I went through the entire Python engine module by module and rewrote it in plain technical prose. That’s done. Then I started on the frontend, which had way more of it. The disclosure text, the physics notes under each equation, the view intros. That’s still in progress. there were 2 things I had to be extra careful about. Some of those strings are checked word-for-word by tests, so rewording one has potential to break complete the build by itself. In addition, I also tidied the repo layout for public viewing, fixed a deploy pipeline failure, and added privacy-safe visitor counting. Right now i’m cutting padding, and pitching it so a high schooler can follow it without boring a physics grad.
DEVLOG : 7? Since that last update, the cleanup turned into actual features. I finished the frontend narrator pass. Every disclosure string, every physics note, every view intro is now plain prose instead of the app talking about itself in first person. Then I went after the parts of the app that were just annoying to use. Plots are zoomable now. Wheel to zoom, drag to pan, on all five analytic views. I also built a small notation layer so the ASCII the engine emits gets typeset properly at render time, subscripts and superscripts where they belong, without dragging in a whole math library. The big one was mobile. The app used to just refuse to render below a certain width. Now it works down to 320px: a proper mobile shell, view tabs instead of a sidebar list, controls that collapse, and per-view width floors so nothing spills sideways. That took a lot of small fixes I did not expect, a fixed SVG viewBox that hid fixed-width text, and an overflow rule that was already scrolling the page sideways before I touched anything. After that, the URL got a real history. Back and Forward actually work now, and moving between orbitals pushes a history entry while flipping a display toggle just replaces one. Added a copy-link button and keyboard shortcuts for stepping through n, l, m and switching views. Last thing, the title is now just AtomSim. The tagline was doing nothing for anyone.
Devlog #8 This update was mostly about cleaning things up. Firstly, I went through the whole site with a checklist of things that make websites feel cheap or fake. I took out the gradients, made the rounded pill-shaped buttons and badges square, and replaced an emoji warning icon with a normal one. Then I added a Terms page and a Privacy page, linked at the bottom of the side panel. The privacy page explains what the app does and doesn’t track, which isn’t much. All of this was to remove any “ALL AI” msgs ive received I also changed the license. AtomSim used to be MIT, which meant anyone could take it and sell it. Now it’s CC BY-NC 4.0, so people can still use it, share it and change it, as long as they credit me and don’t make money off it. Every font on the site is now Poppins, and it’s bundled with the app so it doesn’t have to load from Google. After that I reread all the text on the site and in the README and fixed anything that sounded robotic. That included a few curly quotes and one sentence that sounded like a press release. I also rewrote the line explaining “provenance” so it just says what it means. All of that is live on the site now. Next up is making the atom move. If you mix two states, the electron cloud sloshes back and forth at the exact frequency of the light the atom gives off. I’ve planned it out and I’m starting on it next. I also wrote down a big list of other ideas for later.
Devlog #9 God Ive got a lot show since the last update. First, the atom moves now. If you mix two states, you can watch the electron cloud slosh back and forth. Arrows show where the electron is flowing, and you can color the cloud by its phase. I also changed the look to seem more natural and less AI, I added a plain white theme with a dark mode, grids on every graph, and buttons to save any graph as a picture or a spreadsheet. Then I added a bunch of other features such as: Potassium and calcium, the first atoms past argon. There’s a mini experiment showing why 4s fills before 3d, even when 3d is lower in energy. A table that checks my calculations against real lab measurements for every atom from helium to calcium. sp, sp2 and sp3 hybrid orbitals, the shapes chemists use for bonds. Lines showing exactly where the electron can never be (nodes), and a scale bar in real units. A “measure the electron” button that drops dots one at a time until they build up the real shape. Some smaller things: Every graph has a “Reproduce in Python” box with code you can copy. Any number can be cited with one click. You can export 3D models for printing. Shared links now preview the actual orbital. There’s an API guide, a changelog and a feedback link. I also made the site faster by saving common results, and I fixed the phase colors so colorblind people can tell them apart. I still need to test it in a browser and then deploy it so stay tuned for that!
Devlog #10 Since last time I’ve mostly been adding new physics, so here’s the list. Momentum space: The Radial view now shows how fast the electron is likely to be moving, not just where it is. This one is exact math too. Decay cascade: An excited hydrogen atom doesn’t fall straight to the bottom. It drops down step by step, and now you can watch every path it might take and how likely each one is. Lasers: There’s a new laser panel where you shine light on the atom and watch the electron flip back and forth between two levels (these are called Rabi oscillations). Relativity: For one-electron atoms you can now see the Dirac version of the wavefunction, which is what you get when you add Einstein’s relativity to quantum mechanics. The proton radius puzzle: The nucleus isn’t a perfect point. It has a size, and that shifts the energy levels a tiny bit. Two different experiments measured the proton’s size and got different answers, and you can see both predictions side by side. Antihydrogen: You can now make an atom out of antimatter. It matches normal hydrogen exactly, and the app explains why. Nuclear mass slider: You can drag the nucleus mass anywhere from as light as an electron to heavier than tritium and watch the atom change as you go. All of this is getting pushed to the live site now, so it should be up soon!
Ships:
Atom Sim is a browser app that solves atoms from scratch and shows you the result. Hydrogen comes out of closed-form math, real atoms like carbon and argon come out of a Hartree-Fock solver I wrote, and you can look at any of them as a 3D electron cloud, a 2D slice, a radial plot, an energy-level diagram or an emission spectrum. You can also break physics on purpose: switch off the Pauli exclusion principle, switch off electron exchange, or type in your own potential V(r) and see what kind of atom falls out. The rule I built everything around is that the model never quietly lies. Every number carries a tag saying how it was made: exact, numerical, approximation, counterfactual, or just a visual choice. That tag follows the number from the solver all the way to the label on screen. What was challenging Hartree-Fock was brutal. The angular coefficients in the Fock operator are easy to get slightly wrong, and when you do, the solver still converges and hands you smooth, beautiful, completely wrong orbitals. Nothing crashes, nothing warns you. I had to re-derive the algebra instead of nudging numbers until a benchmark matched. Error bars were the other trap. Mine looked great for a while and were simply lying, because the real error was coming from the box size, not the grid spacing I was measuring. Argon also took about an hour on a uniform grid until I moved to an exponential mesh, which cut it to seconds. What I’m proud of That it’s honest. Plenty of simulators draw a pretty orbital and say nothing about where it came from. Mine tells you, and the tests enforce it. The spectra are checked against real NIST data inside the test suite, so a physics regression fails CI rather than shipping quietly. How to test it It’s live at https://atomsim.fly.dev . The server sleeps when nobody is using it, so the very first load can take around 15 seconds. After that it’s quick. Good things to try: pick n=3, l=1 and rotate the cloud, then flip to Plane view for the cross-section. Switch the element to argon. Open a guided tour if you want the short version. Every view is a shareable URL, so you can link someone to an exact state.
AtomSim is a website I built that lets you actually see what an atom looks like. You pick an element, or hydrogen, and pick which electron shell you want to look at. Then it draws it. Not a cartoon of dots going around a circle like the diagrams in school, the real shape, the cloud where the electron actually is. Some of them look like spheres, some look like dumbbells, some look like weird four leaf clovers. All of that is real, it just falls out of the math. You can spin it around, slice it in half, look at it as a graph instead, or look at the colored lines of light the atom gives off when it gets hot. That last one is how we know what stars are made of, and you can watch it happen. The part I care about most is that it never fakes anything. Every single number on the screen carries a label saying how it was made. Some are exact, straight from the equations. Some are computed numerically with an error bar attached. Some are approximations, and it says which physical effects it left out. And a few are deliberate “what if” experiments, like turning off the rule that stops two electrons sitting in the same place, just to see the atom collapse. Those are labeled too. So if a picture is pretty rather than true, the app tells you. I wanted something a curious fifteen year old could poke at for an hour and come away with a correct picture in their head, not a comfortable wrong one. It runs in a browser, works on a phone, and every view has its own link you can share. PS: It also has mobile view now!...
|
1792990059.5776522
|
1793076459.5776522
|
|
45806
|
Valence - Lang by @fAILedKnight | Stardance
|
fAILedKnight
|
1
|
79.14
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-20T07:54:42Z", "hours": 62.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Valence! A language that connects any language! the issues… don’t even get me started! I first off hade very little understanding of rust(knew a bit of the basics well enough to start). My laptop crashed like 5 times while coding and took long time to compile heavy updates! I added a command and another command broke! I sat in front of the computer for hours and now my back hurts! I got scrutinized by people who that I should be doing better things! BUT I didn’t quit cuz after all its all for the love of the game! Finally I am still updating, my laptop still heats and melts, but I LOVE IT! And below is Valence running java and python!", "repo": "https://github.com/failedknight-exe/Valence-Lang", "demo": "https://valence.freehosting.dev/"}]...
|
[{"post_id": 76292, "ts": "202 [{"post_id": 76292, "ts": "2026-10-03T03:12:58Z", "hours": 2.2606, "text": "I HATE MY LIFE!!!! why you ask? cuz guess what? cor morph failed me! its gone dead! And guess what I find out the my vbp register got deleted when I restructured my code! and now I decided to rip cor morph out and delete it! so now I have fixed vbp.register! and yep im still sick every joint hurts but the grind doesn’t stop till i literally stop! oh and I do not think my laptop is doing too good! it burning itself its a pyromaniac!!!!"}, {"post_id": 75470, "ts": "2026-09-30T05:46:45Z", "hours": 14.8808, "text": "I am sick and have been working like a madman on the cor morph feature! idk what more to say stay tuned!"}, {"post_id": 71040, "ts": "2026-09-20T07:35:14Z", "hours": 5.3744, "text": "I made it so you can code in any language not just the ones I hardcoded!"}, {"post_id": 69408, "ts": "2026-09-17T00:15:14Z", "hours": 2.1011, "text": "Well If you lock in you can do anything… So I took it personally and decide Valence needs to level TF up. And well trust me when I say It will not disappoint! Valence before could only connect to the languages I hardcoded. That 💩 is NOT UNIVERSAL! So I decided why make it my job to link up all langs? So, I decided to give the job to the dev, BUT to be clear from my end I made it simple as HELL! and well, you now can connect to any language!"}, {"post_id": 68374, "ts": "2026-09-15T00:59:45Z", "hours": 16.6725, "text": "IT HAS BEEN A LONG TIME! and ofc i wasn’t Idle! I COOKED SO HARD THAT well… Valence(connect) now actually connects. YEP it connected to python first then I locked in and added C C++ (both these are a pain to work with on windows maybe a skill issue idk) then I integrated C# WAY EASIER cuz ofc it is builtin to windows and then Java, Rust ofc and zig (it was mainly for the compilation of C and C++ and yea) and now it officially can connect after testing it runs all the files in 13.261 ms and on the warmed up loop it ran in about 2.189 ms."}, {"post_id": 56400, "ts": "2026-08-28T04:56:13Z", "hours": 4.9431, "text": "I have successfully added async and protect it may have taken me 4 hrs but it was worth it! Connect v0.2 is out. well do to copyright issues im naming it Valence and v0.2 Memory Rush update is out! you can go to my github release and download the .exe’s and use it. but I need to document it and actually clarify syntax, but it works! sorry I’m in a rush so this devlog wasn’t as informative!"}, {"post_id": 49467, "ts": "2026-08-18T10:14:05Z", "hours": 6.0528, "text": "My laptop has failed me… I’ve been busy for the past few days with family and friends and decided to lock in again but after 2 hours of coding my laptop sputtered to a stop at first I thought it froze but then the screen went black and it stopped I couldn’t do anything after an hour of good waiting I pressed the power button and it started up again. this time I deleted all background processes this helped I later cleaned the system up even more than I usually do then I came to conclusion that it had to be related to hardware and not software so I downloaded a cpu temp reader and once I had setup what I was working with I saw my cpu reached a temp of 100+ and it then climbed to 113 and my laptops screen went black again. this time I made sure to keep system super lean and delete anything that I can use later and am not in dire need of. I then started to code again I started with string extras this allows you to truly modify and change strings. I then add a crypto extension which allows you to generate a uuid or hash or even encode and decode bas64 and so on. those were the easy parts then it came to me that I should make a cool feature so I decided to build func[auto] well make it usefull and bring trigger to life too. and with this I sadly announce that func[onetime] is no more. And I am happy to announce that Connect-Lang is extremly close to v0.2."}, {"post_id": 46730, "ts": "2026-08-14T06:09:44Z", "hours": 3.9842, "text": "For the past few devlogs it seems as if my journey was finally smoothing out. well… it was the calm before the storm. because right after I thought nothing go bad ALL WENT BAD. My laptop Crashed Yes it Crashed and then my keyboard and trackpad failed. I thought only I failed but my things fail too. So I ran to find anything to keep on working and found a working keyboard and mouse and after finding one I went back to work. I hade a easy time implementing the system integration that allows you to check you OS and everything related. and After that I wondered what would be cool and fun to have… well I wanted pain so I decide let me add Http Extension. Yes my lang can now after a painful journey of trial and error can download retrieve and interact with URL’s. I don’t even want to say what happened but either way I will go on and relive that pain to “paint a picture”. Basically I came back after my laptops tantrum to lock in and build Http but my laptop failed me. So I fixed it and I started building halfway through after build a solid structure I tested and saw that Http was existing but it wasn’t being useful. so, I thought and went in to add the stronger features, but before I knew it the addons I integrated weren’t compatible and failed miserably after talking to a few AI’s(Actual intelligence’s not artificial) to get some insight they all called me stupid and told me to stop. SO i realized I’m not just stupid I’m stupid stupid and - -=+ and that’s fine by me. SO I locked in ad went through the rust ref book and dived into my code head first and fought my way in and added in all my features. I then went ahead and tested it and it worked."}, {"post_id": 45967, "ts": "2026-08-12T19:49:42Z", "hours": 0.9403, "text": "After spending about an hour I have successfully added in date/time integration. It was very simple."}, {"post_id": 45915, "ts": "2026-08-12T18:01:11Z", "hours": 1.5136, "text": "Well my project just LEVELED UP. this level up was actually super clean and didn’t make me ball my eyes out at how I should’ve stuck to my old project. It was quite pleasant. this update allows my lang to store data in a separate file and format… json. Yep connect can now read and understand json format. It can conver data into json strings through json.stringify and can turn json strings into data."}, {"post_id": 45514, "ts": "2026-08-12T01:52:12Z", "hours": 3.2867, "text": "after testing my language heavily I came to realize my language needs an error handling system so I thought on how id implement it and after researching on what it does I added attempt, recue, and always. attempt will try running a chunk or line of code. rescue catches the error without stopping the script and shows a message. And finally always will run a block or line of code no matter what. At first try the attempt was working cuz well it just runs the could but because return wasn’t working the code showed a error in terminal after everything. so, I pondered and pondered when I finally cam e to the conclusion to change all error messages for everything to be compatible with attempt and after that it worked. P.S(CoreAi in the MyApp folder is my personal AI I will integrate into my lang, but that’s a very later feature and beta feature.)"}, {"post_id": 44693, "ts": "2026-08-10T17:05:18Z", "hours": 3.8947, "text": "After heavy testing of the summon command I came to the conclusion that I failed it. So I thought how could I make local variables stay local and not be global? so I decided to add VarAccess an identifier resolution. I then tested again just to see it fail AGAIN. SO I I thought okay why is it failing so went ahead and added in debug prints in the rust code to see what was happening and I found it parent_locals was getting popped but local_vars never got restored so summon wasn’t working because there was nothing it could summon. and before summon I added in maps and recursion but that was a very smooth workflow."}, {"post_id": 43746, "ts": "2026-08-09T05:09:47Z", "hours": 13.0456, "text": "After days of fighting procrastination and boredom. I failed. and then when I opened up my old project I failed to feel any fun. this made my concerned for I deeply love my projects. so I scrambled my brain and I realized the project was too easy and too simple it wasn’t challenging. It didn’t make me want to pull my hair out. This made me think what if I created my very own… language. I felt very challenged and so I researched and decided to use rust for my lang. And I chose rust because before I tried learning it and instead failed. So this made me feel highly motivated. I went to do what any sane human would do in my position. I went to code. Yep code without any knowledge. so that was another fail. and after deep research on rust I decided to actually learn it but use AI to boost time and I learned the basics of rust within 2 hours and after a few hundred lines of code I realized I should run it. Yep… It showed error after error after error my little kingdom crumbled to dust like the inside of my wallet. I cried myself to sleep that night and the next morning I woke up and ready to fight my laptop. and I went to my laptop and deleted the folder and created a new one and started coding and testing and after 10hrs of grueling work and an additional 7hrs researching I bring to you the very start of connect. My first rust based language."}]...
|
Title: Valence - Lang by @fAILedKnight | Stardance Title: Valence - Lang by @fAILedKnight | Stardance
Devlogs:
After days of fighting procrastination and boredom. I failed. and then when I opened up my old project I failed to feel any fun. this made my concerned for I deeply love my projects. so I scrambled my brain and I realized the project was too easy and too simple it wasn’t challenging. It didn’t make me want to pull my hair out. This made me think what if I created my very own… language. I felt very challenged and so I researched and decided to use rust for my lang. And I chose rust because before I tried learning it and instead failed. So this made me feel highly motivated. I went to do what any sane human would do in my position. I went to code. Yep code without any knowledge. so that was another fail. and after deep research on rust I decided to actually learn it but use AI to boost time and I learned the basics of rust within 2 hours and after a few hundred lines of code I realized I should run it. Yep… It showed error after error after error my little kingdom crumbled to dust like the inside of my wallet. I cried myself to sleep that night and the next morning I woke up and ready to fight my laptop. and I went to my laptop and deleted the folder and created a new one and started coding and testing and after 10hrs of grueling work and an additional 7hrs researching I bring to you the very start of connect. My first rust based language.
After heavy testing of the summon command I came to the conclusion that I failed it. So I thought how could I make local variables stay local and not be global? so I decided to add VarAccess an identifier resolution. I then tested again just to see it fail AGAIN. SO I I thought okay why is it failing so went ahead and added in debug prints in the rust code to see what was happening and I found it parent_locals was getting popped but local_vars never got restored so summon wasn’t working because there was nothing it could summon. and before summon I added in maps and recursion but that was a very smooth workflow.
after testing my language heavily I came to realize my language needs an error handling system so I thought on how id implement it and after researching on what it does I added attempt, recue, and always. attempt will try running a chunk or line of code. rescue catches the error without stopping the script and shows a message. And finally always will run a block or line of code no matter what. At first try the attempt was working cuz well it just runs the could but because return wasn’t working the code showed a error in terminal after everything. so, I pondered and pondered when I finally cam e to the conclusion to change all error messages for everything to be compatible with attempt and after that it worked. P.S(CoreAi in the MyApp folder is my personal AI I will integrate into my lang, but that’s a very later feature and beta feature.)
Well my project just LEVELED UP. this level up was actually super clean and didn’t make me ball my eyes out at how I should’ve stuck to my old project. It was quite pleasant. this update allows my lang to store data in a separate file and format… json. Yep connect can now read and understand json format. It can conver data into json strings through json.stringify and can turn json strings into data.
After spending about an hour I have successfully added in date/time integration. It was very simple.
For the past few devlogs it seems as if my journey was finally smoothing out. well… it was the calm before the storm. because right after I thought nothing go bad ALL WENT BAD. My laptop Crashed Yes it Crashed and then my keyboard and trackpad failed. I thought only I failed but my things fail too. So I ran to find anything to keep on working and found a working keyboard and mouse and after finding one I went back to work. I hade a easy time implementing the system integration that allows you to check you OS and everything related. and After that I wondered what would be cool and fun to have… well I wanted pain so I decide let me add Http Extension. Yes my lang can now after a painful journey of trial and error can download retrieve and interact with URL’s. I don’t even want to say what happened but either way I will go on and relive that pain to “paint a picture”. Basically I came back after my laptops tantrum to lock in and build Http but my laptop failed me. So I fixed it and I started building halfway through after build a solid structure I tested and saw that Http was existing but it wasn’t being useful. so, I thought and went in to add the stronger features, but before I knew it the addons I integrated weren’t compatible and failed miserably after talking to a few AI’s(Actual intelligence’s not artificial) to get some insight they all called me stupid and told me to stop. SO i realized I’m not just stupid I’m stupid stupid and - -=+ and that’s fine by me. SO I locked in ad went through the rust ref book and dived into my code head first and fought my way in and added in all my features. I then went ahead and tested it and it worked.
My laptop has failed me… I’ve been busy for the past few days with family and friends and decided to lock in again but after 2 hours of coding my laptop sputtered to a stop at first I thought it froze but then the screen went black and it stopped I couldn’t do anything after an hour of good waiting I pressed the power button and it started up again. this time I deleted all background processes this helped I later cleaned the system up even more than I usually do then I came to conclusion that it had to be related to hardware and not software so I downloaded a cpu temp reader and once I had setup what I was working with I saw my cpu reached a temp of 100+ and it then climbed to 113 and my laptops screen went black again. this time I made sure to keep system super lean and delete anything that I can use later and am not in dire need of. I then started to code again I started with string extras this allows you to truly modify and change strings. I then add a crypto extension which allows you to generate a uuid or hash or even encode and decode bas64 and so on. those were the easy parts then it came to me that I should make a cool feature so I decided to build func[auto] well make it usefull and bring trigger to life too. and with this I sadly announce that func[onetime] is no more. And I am happy to announce that Connect-Lang is extremly close to v0.2.
I have successfully added async and protect it may have taken me 4 hrs but it was worth it! Connect v0.2 is out. well do to copyright issues im naming it Valence and v0.2 Memory Rush update is out! you can go to my github release and download the .exe’s and use it. but I need to document it and actually clarify syntax, but it works! sorry I’m in a rush so this devlog wasn’t as informative!
IT HAS BEEN A LONG TIME! and ofc i wasn’t Idle! I COOKED SO HARD THAT well… Valence(connect) now actually connects. YEP it connected to python first then I locked in and added C C++ (both these are a pain to work with on windows maybe a skill issue idk) then I integrated C# WAY EASIER cuz ofc it is builtin to windows and then Java, Rust ofc and zig (it was mainly for the compilation of C and C++ and yea) and now it officially can connect after testing it runs all the files in 13.261 ms and on the warmed up loop it ran in about 2.189 ms.
Well If you lock in you can do anything… So I took it personally and decide Valence needs to level TF up. And well trust me when I say It will not disappoint! Valence before could only connect to the languages I hardcoded. That 💩 is NOT UNIVERSAL! So I decided why make it my job to link up all langs? So, I decided to give the job to the dev, BUT to be clear from my end I made it simple as HELL! and well, you now can connect to any language!
I made it so you can code in any language not just the ones I hardcoded!
I am sick and have been working like a madman on the cor morph feature! idk what more to say stay tuned!
I HATE MY LIFE!!!! why you ask? cuz guess what? cor morph failed me! its gone dead! And guess what I find out the my vbp register got deleted when I restructured my code! and now I decided to rip cor morph out and delete it! so now I have fixed vbp.register! and yep im still sick every joint hurts but the grind doesn’t stop till i literally stop! oh and I do not think my laptop is doing too good! it burning itself its a pyromaniac!!!!
Ships:
I made Valence! A language that connects any language! the issues… don’t even get me started! I first off hade very little understanding of rust(knew a bit of the basics well enough to start). My laptop crashed like 5 times while coding and took long time to compile heavy updates! I added a command and another command broke! I sat in front of the computer for hours and now my back hurts! I got scrutinized by people who that I should be doing better things! BUT I didn’t quit cuz after all its all for the love of the game! Finally I am still updating, my laptop still heats and melts, but I LOVE IT! And below is Valence running java and python!...
|
1793004786.8087177
|
1793091186.8087177
|
|
44319
|
Path Traced Vulkan Engine by @DubbsPi | Stardance
|
DubbsPi
|
1
|
79.07
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-15T13:24:22Z", "hours": 55.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a made from scratch path tracer that I made using vulkan in rust. It was quite the challenge since I never had used any sort of hardware RT and wasn’t really that experienced with vulkan at the start. Luckily, although the learning curve was steep, I did manage to get far enough to make this project. There still is a lot of tweaking and changes that should be made, but it is definitely good enough to ship, hence the reason I finally chose to. There were definitely challenges making this, from GPU crashes to memory leaks, most of which have been fixed by now. For running it, it has not been tested on windows! , how well it works I don’t know. Linux works perfectly fine (or at least my machine, it should be cross compatible enough though. Even mac should work, just you guys will have to compile it and deal with bad performance)", "repo": "https://github.com/DubbsPi/vulkan-engine-v2", "demo": "https://github.com/DubbsPi/RTX-Vulkan-Engine-Rust/releases/tag/noTagHere"}]...
|
[{"post_id": 76882, "ts": "202 [{"post_id": 76882, "ts": "2026-10-04T22:37:10Z", "hours": 24.0711, "text": "Thought I might as well push one final public update. I’ve been adding features such as planets, stars, glass, NEE, and improved performance by as much as 95% in the worst case. I am starting to use this engine hopefully for my own game, so I may update it as I fix stuff, but other than that, this will probably be my final log."}, {"post_id": 68339, "ts": "2026-09-14T23:40:45Z", "hours": 4.2086, "text": "Made tracing run faster and optimizing denoiser. Ngl I kinda forgot what I spent four hours doing other than this. I think I also spent a bit of time trying to fix metals but I’m not exactly 100% sure it fixed it so…"}, {"post_id": 67041, "ts": "2026-09-13T02:43:37Z", "hours": 4.7586, "text": "Path tracing anyone? I still have to fix a bunch of bugs with jittering that are there and there is an animation bug, but that will be fixed with time. I also don’t know why the noise is so bad in some places, I have 1024 samples setup to accumulate. This is actually a good approach for me since this all runs at 3k fps, so almost instantly it converges to be near noiseless."}, {"post_id": 66758, "ts": "2026-09-12T17:25:40Z", "hours": 4.25, "text": "Optimized the tracing a ton. Basically, what I did was instead of making a BLAS for each model and letting the TLAS sort everything out, I moved to three blases since that removed most of the tlas overhead. In doing that, I created three types of objects, static (terrain), semi-dynamic, and dynamic (animated). So now with this smarter system in place stuff can be loaded/used easier than before with higher performance! The initial setup didn’t take too long for this, but it was a debugging nightmare since the blases kept moving/being stale so shadows would dupe or models were cutout and stuff."}, {"post_id": 64263, "ts": "2026-09-08T15:14:31Z", "hours": 4.6214, "text": "Got dynamic scenes (mostly) working! Now while the code is running, models can be loaded and added. Probably will have to add blas merging for the future since each model having its own is a linear compared to logarithmic cost of combining them. Combining similar shouldn’t be hard since that is actually just modifying the root of of the animation framework. I might have like a cap of 5-10 with one being static geometry and the rest clumps of models. Still have to get removal working which shouldn’t be too bad. The hardest part was lining up all of my Vec<_>s so what I might do is combine it into a struct to organize, but I’ll leave it for now since that will probably conflict with the merging. Also, I’m planning on adding multithreading for the future so fingers crossed!"}, {"post_id": 61858, "ts": "2026-09-04T23:53:41Z", "hours": 2.5428, "text": "Got a bunch of PBR added to the shaders. Now has a lot of stuff so if you export more complex materials from blender or something it can parse and render them. I do still have to get transparency working, but that is much more complex than just solids tbh. For some reason my model’s animations kinda broke and only play like 60% of the animation before looping, but that isn’t the engines fault, I probably just need to make blender behave better."}, {"post_id": 61161, "ts": "2026-09-03T23:02:02Z", "hours": 6.2597, "text": "Got models working!! Fully rigged and animated! I setup the framework to auto load any anims, and then they can be played from lets say the main with something like this: app.scene.animations[2].play(“Chop_Tree RT.001”);, so that works pretty well! I also implemented a pause/play/stop and fuzzy search since some of the anim names can be weird. Thanks to mesh2motion’s huge animation library and stuff. This model is custom textured by me, so I do own it. However, you may feel free to use it (with credit!) wherever. His name is Xenon btw"}, {"post_id": 59272, "ts": "2026-08-31T23:45:23Z", "hours": 2.2472, "text": "Got dynamic transforms working!!! You can’t see it, but that truck on the bottom is actually spinning so helicopter. This took a bit to add in, but thanks to the model system, I just had to add a transformation matrix for each one, which is done easier than said. I did have a bunch of issues with the multi bvh setup, but now that its done updating the matrices only takes about 0.02ms with the two. Might end up being more in the future with more, but definitely not bad in the slightest."}, {"post_id": 59017, "ts": "2026-08-31T16:29:39Z", "hours": 2.9919, "text": "Got something really nice working: Instancing!! Basically now, when you want to start the scene up, you just call Scene::new() and then if you want to load a model into memory, just use load_model_into_memory() and you can stamp that out without reloading the model from the disc each time. Plus I added dedicated scale/transform functions that you just call on a specific model’s id (like for the first truck I loaded, I moved and scaled it with its id of 0). Basically loading models and transforming them is near effortless. Dynamic transforms next and then probably rigging!"}, {"post_id": 58328, "ts": "2026-08-30T18:25:40Z", "hours": 4.6275, "text": "Got a ton done towards an actual engine!! Added more model formats (glb files) and the ability to load more than one at a time! Also, textures have been introduced so if you look closely you can actually see the truck has a duramax engine label (boo! cummins is better). Shadows have been improved even more, although this screenshot doesn’t really show it too much. Next thing I have to add is dynamic vertices at runtime, which will allow me to actually change geometry without restarting the engine, and then after that, model rigs! There are a couple validation errors still (so a potential memory leak), but they only appear every couple of times the program is ran, and I really couldn’t find it, so thats a later problem."}, {"post_id": 57445, "ts": "2026-08-29T16:23:54Z", "hours": 3.7739, "text": "Got some stuff done with the engine. Improved lighting with smooth normals and stuff. Also I added atmospheric scattering from one of my other shaders. Currently, the model that is loaded (although it may look not the greatest, I don’t have textures setup yet) has 8.5 million triangles and 16 million vertices. In 1440p, everything is currently running 1300 fps, with the majority of the hit coming from the scatterer as without it its a bit closer to 2300 fps."}, {"post_id": 56190, "ts": "2026-08-27T20:31:20Z", "hours": 4.0733, "text": "Got a lot more done involving obj files and refinement! Now I can change the vertices on the fly, have decent indexing of them, and have raytraced shadows. Currently, on my rtx5070, in 1440p, this 408k triangle model runs around 1500fps, so pretty decent for now. I hope to lower that soon…"}, {"post_id": 55206, "ts": "2026-08-26T19:13:31Z", "hours": 6.4922, "text": "I had a nice devlog wrote, but it didn’t fully upload QwQ. Basically, I had to lean into AI to implement RT instead of raster due to a lack of rust tutorials for that. Spent most of the time debugging a slight misordering error that produce zero errors that caused nothing to render."}, {"post_id": 41500, "ts": "2026-08-05T19:01:42Z", "hours": 4.385, "text": "Got a triangle showing! Definately took me a while, but now I fully understand (ok like 90%) the pipeline! Also, now since I worked on my minecraft shader in the past, this will definitely look pretty good in the end. My goal of doing this engine is just because when I made my shader, I was running into performance issues due to minecraft and opengl, so this way I can bypass it all and have hardware vulkan support."}]...
|
Title: Path Traced Vulkan Engine by @DubbsPi | Sta Title: Path Traced Vulkan Engine by @DubbsPi | Stardance
Devlogs:
Got a triangle showing! Definately took me a while, but now I fully understand (ok like 90%) the pipeline! Also, now since I worked on my minecraft shader in the past, this will definitely look pretty good in the end. My goal of doing this engine is just because when I made my shader, I was running into performance issues due to minecraft and opengl, so this way I can bypass it all and have hardware vulkan support.
I had a nice devlog wrote, but it didn’t fully upload QwQ. Basically, I had to lean into AI to implement RT instead of raster due to a lack of rust tutorials for that. Spent most of the time debugging a slight misordering error that produce zero errors that caused nothing to render.
Got a lot more done involving obj files and refinement! Now I can change the vertices on the fly, have decent indexing of them, and have raytraced shadows. Currently, on my rtx5070, in 1440p, this 408k triangle model runs around 1500fps, so pretty decent for now. I hope to lower that soon…
Got some stuff done with the engine. Improved lighting with smooth normals and stuff. Also I added atmospheric scattering from one of my other shaders. Currently, the model that is loaded (although it may look not the greatest, I don’t have textures setup yet) has 8.5 million triangles and 16 million vertices. In 1440p, everything is currently running 1300 fps, with the majority of the hit coming from the scatterer as without it its a bit closer to 2300 fps.
Got a ton done towards an actual engine!! Added more model formats (glb files) and the ability to load more than one at a time! Also, textures have been introduced so if you look closely you can actually see the truck has a duramax engine label (boo! cummins is better). Shadows have been improved even more, although this screenshot doesn’t really show it too much. Next thing I have to add is dynamic vertices at runtime, which will allow me to actually change geometry without restarting the engine, and then after that, model rigs! There are a couple validation errors still (so a potential memory leak), but they only appear every couple of times the program is ran, and I really couldn’t find it, so thats a later problem.
Got something really nice working: Instancing!! Basically now, when you want to start the scene up, you just call Scene::new() and then if you want to load a model into memory, just use load_model_into_memory() and you can stamp that out without reloading the model from the disc each time. Plus I added dedicated scale/transform functions that you just call on a specific model’s id (like for the first truck I loaded, I moved and scaled it with its id of 0). Basically loading models and transforming them is near effortless. Dynamic transforms next and then probably rigging!
Got dynamic transforms working!!! You can’t see it, but that truck on the bottom is actually spinning so helicopter. This took a bit to add in, but thanks to the model system, I just had to add a transformation matrix for each one, which is done easier than said. I did have a bunch of issues with the multi bvh setup, but now that its done updating the matrices only takes about 0.02ms with the two. Might end up being more in the future with more, but definitely not bad in the slightest.
Got models working!! Fully rigged and animated! I setup the framework to auto load any anims, and then they can be played from lets say the main with something like this: app.scene.animations[2].play(“Chop_Tree RT.001”);, so that works pretty well! I also implemented a pause/play/stop and fuzzy search since some of the anim names can be weird. Thanks to mesh2motion’s huge animation library and stuff. This model is custom textured by me, so I do own it. However, you may feel free to use it (with credit!) wherever. His name is Xenon btw
Got a bunch of PBR added to the shaders. Now has a lot of stuff so if you export more complex materials from blender or something it can parse and render them. I do still have to get transparency working, but that is much more complex than just solids tbh. For some reason my model’s animations kinda broke and only play like 60% of the animation before looping, but that isn’t the engines fault, I probably just need to make blender behave better.
Got dynamic scenes (mostly) working! Now while the code is running, models can be loaded and added. Probably will have to add blas merging for the future since each model having its own is a linear compared to logarithmic cost of combining them. Combining similar shouldn’t be hard since that is actually just modifying the root of of the animation framework. I might have like a cap of 5-10 with one being static geometry and the rest clumps of models. Still have to get removal working which shouldn’t be too bad. The hardest part was lining up all of my Vec<_>s so what I might do is combine it into a struct to organize, but I’ll leave it for now since that will probably conflict with the merging. Also, I’m planning on adding multithreading for the future so fingers crossed!
Optimized the tracing a ton. Basically, what I did was instead of making a BLAS for each model and letting the TLAS sort everything out, I moved to three blases since that removed most of the tlas overhead. In doing that, I created three types of objects, static (terrain), semi-dynamic, and dynamic (animated). So now with this smarter system in place stuff can be loaded/used easier than before with higher performance! The initial setup didn’t take too long for this, but it was a debugging nightmare since the blases kept moving/being stale so shadows would dupe or models were cutout and stuff.
Path tracing anyone? I still have to fix a bunch of bugs with jittering that are there and there is an animation bug, but that will be fixed with time. I also don’t know why the noise is so bad in some places, I have 1024 samples setup to accumulate. This is actually a good approach for me since this all runs at 3k fps, so almost instantly it converges to be near noiseless.
Made tracing run faster and optimizing denoiser. Ngl I kinda forgot what I spent four hours doing other than this. I think I also spent a bit of time trying to fix metals but I’m not exactly 100% sure it fixed it so…
Thought I might as well push one final public update. I’ve been adding features such as planets, stars, glass, NEE, and improved performance by as much as 95% in the worst case. I am starting to use this engine hopefully for my own game, so I may update it as I fix stuff, but other than that, this will probably be my final log.
Ships:
This is a made from scratch path tracer that I made using vulkan in rust. It was quite the challenge since I never had used any sort of hardware RT and wasn’t really that experienced with vulkan at the start. Luckily, although the learning curve was steep, I did manage to get far enough to make this project. There still is a lot of tweaking and changes that should be made, but it is definitely good enough to ship, hence the reason I finally chose to. There were definitely challenges making this, from GPU crashes to memory leaks, most of which have been fixed by now. For running it, it has not been tested on windows! , how well it works I don’t know. Linux works perfectly fine (or at least my machine, it should be cross compatible enough though. Even mac should work, just you guys will have to compile it and deal with bad performance)...
|
1793004667.385387
|
1793091067.385387
|
|
6839
|
Swerve Drive by @joshua_r | Stardance
|
joshua_r
|
2
|
79.0
|
379
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-19T14:57:23Z", "hours": 1.0, "multiplier": 5.0, "payout": 5, "blessing": "neutral", "text": "3D printed coaxial swerve drive! This was heavily inspired by FRC swerves and it really fun to make. Designing and everything hardware related was honestly pretty easy, but wiring was a pain. Each brushless motor driver needed 3 pwm pins on the same hardware timer and on nucleos, some of the pins serve multiple uses, creating some problems for me. Also there were a lot of times that things that seemed like software issues were actually wiring issues, like when the adafruit motor shield stopped working because its i2c connection was tied to pins A4 and A5. Overall, this was the most technologically advanced project I have ever made, partly because I was using a new microcontroller (stm32 nucleo) but also because I had to understand the math involved in driving a swerve correctly. Not to mention I was also running 4 brushless motors and 4 separate PIDs. It was really fun to build and I would definitely do it again given the opportunity. Maybe even a differential swerve next time? RESHIP FOR NEW HARDWARE MUTLIPLIER: Public video link is the video of project button.", "repo": "https://github.com/Joshuar9202/Swerve-Drive-Arduino", "demo": ""}, {"ship_num": 2, "ts": "2026-07-06T16:35:33Z", "hours": 78.0, "multiplier": 5.0, "payout": 374, "blessing": "neutral", "text": "3D printed coaxial swerve drive! This was heavily inspired by FRC swerves and it really fun to make. Designing and everything hardware related was honestly pretty easy, but wiring was a pain. Each brushless motor driver needed 3 pwm pins on the same hardware timer and on nucleos, some of the pins serve multiple uses, creating some problems for me. Also there were a lot of times that things that seemed like software issues were actually wiring issues, like when the adafruit motor shield stopped working because its i2c connection was tied to pins A4 and A5. Overall, this was the most technologically advanced project I have ever made, partly because I was using a new microcontroller (stm32 nucleo) but also because I had to understand the math involved in driving a swerve correctly. Not to mention I was also running 4 brushless motors and 4 separate PIDs. It was really fun to build and I would definitely do it again given the opportunity. Maybe even a differential swerve next time?", "repo": "https://github.com/Joshuar9202/Swerve-Drive-Arduino", "demo": ""}]...
|
[{"post_id": 70649, "ts": "202 [{"post_id": 70649, "ts": "2026-09-19T14:53:46Z", "hours": 0.9042, "text": "Finally hardware projects are getting payout multipliers like software projects! Thus, I will be reshipping my project so that I can get multiplier. (Also opensauce was awesome sauce! Only real changes made to the project were encoder offsets and tuning things at opensauce because of reassembly at the venue. Also got into a rev reel!)"}, {"post_id": 22493, "ts": "2026-07-05T00:00:05Z", "hours": 11.3317, "text": "Done! 🎉 I finished making all the things for the github like the wiring diagram and demo video. Fixed all issues with field relative control, my original math was incorrect. Also one of the modules wasn’t rotating correctly but it turns out it was just the magnet came loose. Will be submitting to Outpost soon! Demo video link: https://www.youtube.com/watch?v=bPC4PA_9ZH0"}, {"post_id": 19694, "ts": "2026-07-01T02:39:11Z", "hours": 5.0708, "text": "First Movements Tested full motion for the first time woohoo! 🎉🎊 Things surprisingly worked alright, the kinematics for the rotation while strafing is still a bit off but translation by itself works great. Also the wheels have very little traction so I’ll have to increase that somehow. Additionally, field centric control on the joystick works really well, so up on the joystick means up in real life relative to the start heading and regardless of the rotation of the robot. Things Left to Do on Hardware Add traction to the wheels Things Left to Do on Software Fix swerve kinematics for rotation"}, {"post_id": 18892, "ts": "2026-06-30T02:50:31Z", "hours": 11.6183, "text": "Integration Pain I got all the subsystems working separately but the extremely fun part of integrating them all together was the first time I truly understood why engineers hate integration. There were a plethora of pin conflicts underlying the hardware since many of the pins on the nucleo serve multiple purposes. One example of this was the adafruit motor shield’s i2c bus interfering with the front left drive motor’s FOC math since PB8 and PB9 are connected to the sda and scl pins on the Arduino headers of the nucleo. As you can see from the extremely janky wiring in the photo, just connecting the shield so it gets power on the other side of headers and manually connecting the shield to a separate i2c bus using jumper wires, I was able to finally make all the subsystems work together. This was just one example of the many problems that arose, hence why there are almost 12 hours being logged in this post, but this project is finally on the last stretch. I did also make a lot of other progress like confirming the swerve kinematics work along with the flysky controller for inputs :) Things Left to Do on Hardware Cut off the sda and scl pins on the motor shield and solder a jumper wire to the new i2c bus Things Left to Do on Software Tune the pid for FR, BR, and BL turn motors Integrate offsets into the steering angle for the motors Integrate the MPU6050 readings for field oriented swerve control"}, {"post_id": 15434, "ts": "2026-06-25T02:36:01Z", "hours": 3.0789, "text": "Side Quest The adafruit motor shield v2 that I am using to control the n20 motors suddenly stopped working today. After a long struggle, I managed to trace it back to the A4 and A5 pins being attached to the nucelo alongside the dedicated SDA and SCL pins. Since SDA and SCL are tied to A4 and A5 on normal arduinos but seemingly not on nucelos, simply removing those pins fixed all issues. A very unsatisfying end to a 3 hour struggle :( I did mange to test out the front left module, and spent some time tuning the azimuth pid. Things Left to Do on Hardware Wire management Things Left to Do on Software Test the rest of the hardware (FR, BR, and BL modules, radio communication, and gyro). Program the rest of the swerveKinematics.cpp file Program mpu6050 gyro Program in controls from the inputs from the flysky controller"}, {"post_id": 14820, "ts": "2026-06-24T02:09:04Z", "hours": 3.2439, "text": "Finished Wiring As you can tell by this extremely beautiful cable management and totally not messy arrangement of wires, I should have probably made a pcb for this (Maybe I will later). Things Left to Do on Hardware Wire management Things Left to Do on Software Test all hardware individually to isolate any potential wiring issues Program the rest of the swerveKinematics.cpp file Program in controls from the inputs from the flysky controller"}, {"post_id": 14094, "ts": "2026-06-23T02:30:21Z", "hours": 6.4664, "text": "Swerve Drivebase update Cut out bellypan out of scrap board because creating large panels isn’t really suited for 3d printing and I can drill new holes into this material easily for mounting electronics. Mounted the majority of the electronics as well. On the software side I got radio communication working and created a new .h and .cpp file for implementing radio control into the main program. Things Left to Do on Hardware Attach radio receiver and battery Wire all components together Resolder the wires on one of the n20 motors (bad connection the first time lol). Things Left to Do on Software Program the rest of the swerveKinematics.cpp file Program in controls from the inputs from the flysky controller"}, {"post_id": 12296, "ts": "2026-06-20T02:02:20Z", "hours": 8.5414, "text": "Finished Drive Base Got all the modules built and attached. Some modules are a little bit stiff so if that hinders the motors I’ll need to change some clearances, but I think its minimal enough to where it won’t matter. Things Left to Do on Hardware Build and attach bellypan for electronics Mount electronics to bellypan Wire everything up Things Left to Do on Software Test radio communication from fs-ia6B receiver to nucleo Program commands in based on controller input Program swerve kinematics in using the custom angle control and drive control functions already created"}, {"post_id": 10917, "ts": "2026-06-17T21:51:43Z", "hours": 7.2928, "text": "Swerve azimuth control Got PID working for one module, though it probably still needs to be tuned. Also I need to figure out the logic for wrapping around since the encoder measures values from 0-1023 which I have mapped to 0 to 360, but after 360 it goes back to 0 which complicates the logic a bit. I also need to implement the logic for the swerve just switching the wheel rotation direction rather than rotate the entire module 180 degrees whenever it can. Realistically, the module should only ever rotate a max of 90 degrees from one input to the next"}, {"post_id": 8164, "ts": "2026-06-13T16:37:44Z", "hours": 8.9011, "text": "Tested all hardware for the swerve drive. The latest version of SimpleFOC (2.4.0) doesn’t work for some reason but the previous version (2.3.5) works perfectly fine. The as5600 encoders work great and track the rotation of the module nicely. I also made a few design changes to make assembly easier which includes changing the design of the encoder column support and the design of the standoffs."}, {"post_id": 5328, "ts": "2026-06-09T01:59:37Z", "hours": 3.0031, "text": "Swerve module v1 assembled! The gears mesh nicely and the entire system has a lot less friction than I thought it would :) Things needed to do in terms of design: Design support for the shaft that holds the central drive gear column since right now its cantilevered. Redesign standoffs because the current design breaks too easily Design encoder for brushless drive motor so FOC can be used"}, {"post_id": 4618, "ts": "2026-06-08T00:12:06Z", "hours": 3.3511, "text": "Finished soldering wires to the motors and header pins to the encoders. Got stm32 nucleo 64 f411re working with platformio ready for programming along with the motor shield to control everything!"}, {"post_id": 3587, "ts": "2026-06-06T16:15:48Z", "hours": 1.9147, "text": "finished building one module in real life!"}, {"post_id": 2479, "ts": "2026-06-05T00:05:00Z", "hours": 1.3253, "text": "Added drive column for drive gear train which is coaxial to the encoder column which has the magnet for the as5600 to track the module’s rotation. Done with the drive module for now, moving on to the motor mounts!"}, {"post_id": 2227, "ts": "2026-06-04T16:44:41Z", "hours": 2.6103, "text": "CAD for a single module done including gear relations. No motors yet"}]...
|
Title: Swerve Drive by @joshua_r | Stardance
Devl Title: Swerve Drive by @joshua_r | Stardance
Devlogs:
CAD for a single module done including gear relations. No motors yet
Added drive column for drive gear train which is coaxial to the encoder column which has the magnet for the as5600 to track the module’s rotation. Done with the drive module for now, moving on to the motor mounts!
finished building one module in real life!
Finished soldering wires to the motors and header pins to the encoders. Got stm32 nucleo 64 f411re working with platformio ready for programming along with the motor shield to control everything!
Swerve module v1 assembled! The gears mesh nicely and the entire system has a lot less friction than I thought it would :) Things needed to do in terms of design: Design support for the shaft that holds the central drive gear column since right now its cantilevered. Redesign standoffs because the current design breaks too easily Design encoder for brushless drive motor so FOC can be used
Tested all hardware for the swerve drive. The latest version of SimpleFOC (2.4.0) doesn’t work for some reason but the previous version (2.3.5) works perfectly fine. The as5600 encoders work great and track the rotation of the module nicely. I also made a few design changes to make assembly easier which includes changing the design of the encoder column support and the design of the standoffs.
Swerve azimuth control Got PID working for one module, though it probably still needs to be tuned. Also I need to figure out the logic for wrapping around since the encoder measures values from 0-1023 which I have mapped to 0 to 360, but after 360 it goes back to 0 which complicates the logic a bit. I also need to implement the logic for the swerve just switching the wheel rotation direction rather than rotate the entire module 180 degrees whenever it can. Realistically, the module should only ever rotate a max of 90 degrees from one input to the next
Finished Drive Base Got all the modules built and attached. Some modules are a little bit stiff so if that hinders the motors I’ll need to change some clearances, but I think its minimal enough to where it won’t matter. Things Left to Do on Hardware Build and attach bellypan for electronics Mount electronics to bellypan Wire everything up Things Left to Do on Software Test radio communication from fs-ia6B receiver to nucleo Program commands in based on controller input Program swerve kinematics in using the custom angle control and drive control functions already created
Swerve Drivebase update Cut out bellypan out of scrap board because creating large panels isn’t really suited for 3d printing and I can drill new holes into this material easily for mounting electronics. Mounted the majority of the electronics as well. On the software side I got radio communication working and created a new .h and .cpp file for implementing radio control into the main program. Things Left to Do on Hardware Attach radio receiver and battery Wire all components together Resolder the wires on one of the n20 motors (bad connection the first time lol). Things Left to Do on Software Program the rest of the swerveKinematics.cpp file Program in controls from the inputs from the flysky controller
Finished Wiring As you can tell by this extremely beautiful cable management and totally not messy arrangement of wires, I should have probably made a pcb for this (Maybe I will later). Things Left to Do on Hardware Wire management Things Left to Do on Software Test all hardware individually to isolate any potential wiring issues Program the rest of the swerveKinematics.cpp file Program in controls from the inputs from the flysky controller
Side Quest The adafruit motor shield v2 that I am using to control the n20 motors suddenly stopped working today. After a long struggle, I managed to trace it back to the A4 and A5 pins being attached to the nucelo alongside the dedicated SDA and SCL pins. Since SDA and SCL are tied to A4 and A5 on normal arduinos but seemingly not on nucelos, simply removing those pins fixed all issues. A very unsatisfying end to a 3 hour struggle :( I did mange to test out the front left module, and spent some time tuning the azimuth pid. Things Left to Do on Hardware Wire management Things Left to Do on Software Test the rest of the hardware (FR, BR, and BL modules, radio communication, and gyro). Program the rest of the swerveKinematics.cpp file Program mpu6050 gyro Program in controls from the inputs from the flysky controller
Integration Pain I got all the subsystems working separately but the extremely fun part of integrating them all together was the first time I truly understood why engineers hate integration. There were a plethora of pin conflicts underlying the hardware since many of the pins on the nucleo serve multiple purposes. One example of this was the adafruit motor shield’s i2c bus interfering with the front left drive motor’s FOC math since PB8 and PB9 are connected to the sda and scl pins on the Arduino headers of the nucleo. As you can see from the extremely janky wiring in the photo, just connecting the shield so it gets power on the other side of headers and manually connecting the shield to a separate i2c bus using jumper wires, I was able to finally make all the subsystems work together. This was just one example of the many problems that arose, hence why there are almost 12 hours being logged in this post, but this project is finally on the last stretch. I did also make a lot of other progress like confirming the swerve kinematics work along with the flysky controller for inputs :) Things Left to Do on Hardware Cut off the sda and scl pins on the motor shield and solder a jumper wire to the new i2c bus Things Left to Do on Software Tune the pid for FR, BR, and BL turn motors Integrate offsets into the steering angle for the motors Integrate the MPU6050 readings for field oriented swerve control
First Movements Tested full motion for the first time woohoo! 🎉🎊 Things surprisingly worked alright, the kinematics for the rotation while strafing is still a bit off but translation by itself works great. Also the wheels have very little traction so I’ll have to increase that somehow. Additionally, field centric control on the joystick works really well, so up on the joystick means up in real life relative to the start heading and regardless of the rotation of the robot. Things Left to Do on Hardware Add traction to the wheels Things Left to Do on Software Fix swerve kinematics for rotation
Done! 🎉 I finished making all the things for the github like the wiring diagram and demo video. Fixed all issues with field relative control, my original math was incorrect. Also one of the modules wasn’t rotating correctly but it turns out it was just the magnet came loose. Will be submitting to Outpost soon! Demo video link: https://www.youtube.com/watch?v=bPC4PA_9ZH0
Finally hardware projects are getting payout multipliers like software projects! Thus, I will be reshipping my project so that I can get multiplier. (Also opensauce was awesome sauce! Only real changes made to the project were encoder offsets and tuning things at opensauce because of reassembly at the venue. Also got into a rev reel!)
Ships:
3D printed coaxial swerve drive! This was heavily inspired by FRC swerves and it really fun to make. Designing and everything hardware related was honestly pretty easy, but wiring was a pain. Each brushless motor driver needed 3 pwm pins on the same hardware timer and on nucleos, some of the pins serve multiple uses, creating some problems for me. Also there were a lot of times that things that seemed like software issues were actually wiring issues, like when the adafruit motor shield stopped working because its i2c connection was tied to pins A4 and A5. Overall, this was the most technologically advanced project I have ever made, partly because I was using a new microcontroller (stm32 nucleo) but also because I had to understand the math involved in driving a swerve correctly. Not to mention I was also running 4 brushless motors and 4 separate PIDs. It was really fun to build and I would definitely do it again given the opportunity. Maybe even a differential swerve next time?
3D printed coaxial swerve drive! This was heavily inspired by FRC swerves and it really fun to make. Designing and everything hardware related was honestly pretty easy, but wiring was a pain. Each brushless motor driver needed 3 pwm pins on the same hardware timer and on nucleos, some of the pins serve multiple uses, creating some problems for me. Also there were a lot of times that things that seemed like software issues were actually wiring issues, like when the adafruit motor shield stopped working because its i2c connection was tied to pins A4 and A5. Overall, this was the most technologically advanced project I have ever made, partly because I was using a new microcontroller (stm32 nucleo) but also because I had to understand the math involved in driving a swerve correctly. Not to mention I was also running 4 brushless motors and 4 separate PIDs. It was really fun to build and I would definitely do it again given the opportunity. Maybe even a differential swerve next time? RESHIP FOR NEW HARDWARE MUTLIPLIER: Public video link is the video of project button....
|
1792990061.9122665
|
1793076461.9122665
|
|
17862
|
Arona Chat by @yearcakes | Stardance
|
yearcakes
|
4
|
79.0
|
1237
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-30T12:39:46Z", "hours": 1.0, "multiplier": 9.78, "payout": 7, "blessing": "neutral", "text": "Some small improvements.", "repo": "https://github.com/zhaozhuoran/arona-chat-open", "demo": "https://aronachat.yearcakes.com/"}, {"ship_num": 2, "ts": "2026-09-16T14:26:13Z", "hours": 21.0, "multiplier": 18.5, "payout": 396, "blessing": "neutral", "text": "This is the last ship for Arona Chat for the time being. Since my new semester started on August 31st, I won’t have as much time to work on Arona Chat or add new features. Anyway, I hope you all enjoy Arona Chat!", "repo": "https://github.com/zhaozhuoran/arona-chat-open", "demo": "https://aronachat.yearcakes.com/"}, {"ship_num": 3, "ts": "2026-07-20T05:46:47Z", "hours": 56.0, "multiplier": 14.84, "payout": 826, "blessing": "neutral", "text": "After a lot of work, AronaChat v1.2.0 is finally here! With this update, I’m continuing to transform AronaChat from a simple project into a real product that people can actually use. The Public Demo is now live! This is not just a temporary showcase — I want to build it into a long-term usable product. You can connect your own API providers and use AronaChat with your own models. Security and privacy are also a priority. API keys are stored with encryption and protected by multiple security measures to keep your credentials as safe as possible. Due to storage and cost considerations, each user currently has a limited storage quota. When the limit is reached, attachments will be automatically removed using a FIFO rolling deletion system. Chat history will be preserved as long as possible while keeping operating costs sustainable. Thank you everyone who has followed AronaChat’s journey! This is only the beginning, and I hope AronaChat can become a tool that people truly enjoy using.", "repo": "https://github.com/zhaozhuoran/arona-chat-open", "demo": "https://aronachat.yearcakes.com/"}, {"ship_num": 4, "ts": "2026-06-13T09:11:19Z", "hours": 1.0, "multiplier": 8.56, "payout": 8, "blessing": "neutral", "text": "What did you make? I built Arona Chat, a full-stack AI chat application powered by Cloudflare Workers, D1, R2, Durable Objects, and OpenRouter. It supports chat sessions, file attachments, usage tracking, budget management, authentication, and model selection, all wrapped in a Blue Archive-inspired interface. What was challenging? The most challenging part was designing the backend architecture around long-running AI responses and usage tracking. One lesson I learned the hard way is that inefficient SQLite access patterns can dramatically increase database costs. As the project grew, I had to rethink how usage statistics were stored and aggregated instead of recalculating everything repeatedly. Another challenge was handling very long SSE streams. For AI responses that may take a long time to complete, it is important that processing continues even if the client disconnects. This was my first time introducing Durable Objects into a production project, and they turned out to be a great fit for maintaining state and ensuring reliable streaming behavior. What are you proud of? I’m proud that this project pushed me beyond simple CRUD applications and into distributed system design. Integrating Durable Objects, building usage aggregation, and optimizing streaming performance taught me a lot about how real-world AI applications are built. I’m also genuinely impressed by Cloudflare R2. It was extremely easy to integrate, works reliably, and offers a very generous free tier, making it an excellent choice for student developers and hobby projects. How can people test it? Fork this repository. Update the wrangler.toml configuration for your own Cloudflare resources (do not commit any secrets). Deploy the frontend (frontend) to Cloudflare Pages and the backend (backend) to Cloudflare Workers. Configure the required Secrets in Cloudflare after deployment. Open the deployed site and log in using the password you configured. Create your first Passkey (highly recommended for a better login experience). Start chatting, upload files, try different models, and explore usage statistics and budget management features.", "repo": "https://github.com/zhaozhuoran/arona-chat-open", "demo": "https://aronachat.yearcakes.com/"}]...
|
[{"post_id": 75553, "ts": "202 [{"post_id": 75553, "ts": "2026-09-30T12:37:56Z", "hours": 1.2942, "text": "I added a simple sharing function. I also added automatic picture attachment compression, which should save a lot of tokens. Commit"}, {"post_id": 68643, "ts": "2026-09-15T13:37:00Z", "hours": 4.7658, "text": "This is the last update for Arona Chat for the time being. In this update, I’ve added automatic image resizing, support for TXT and Markdown files, dynamic username injection in the greeting and system prompt, and the new Ethereal Dark theme. However, since my new semester started on August 31st, I won’t have as much time to work on Arona Chat or add new features. Anyway, I hope you all enjoy Arona Chat! Commit"}, {"post_id": 40574, "ts": "2026-08-04T06:52:05Z", "hours": 2.5586, "text": "Hey guys! I’m currently working on a new theme (Ethereal Dark) for Arona Chat, and it will probably introduce a very large diff with many UI/CSS/component changes. I’m thinking about creating a dedicated feature branch (theme/ethereal-dark) for this work instead of directly committing everything to main. The idea is to keep the development process transparent and easier to review for future reviewers and users. After the theme is complete, I’ll merge it back into main. So I’d like to get your opinion: Do you prefer seeing the full development history through a feature branch? Or do you think keeping a cleaner main history with a larger commit is better? Thanks!"}, {"post_id": 40524, "ts": "2026-08-04T03:31:20Z", "hours": 6.0331, "text": "Settings now save automatically as soon as you make changes, so there’s no more clicking Save everywhere. The user list also shows each user’s email when available (falling back to the Clerk ID). Improved auth by showing a recovery screen if initialization gets stuck for 12 seconds, and hardened SSRF protection against alternative IPv4 bypass tricks. I’ve already started designing the Ethereal Dark theme too, but since it’s unrelated to this commit I didn’t include it yet. Still probably another 8–10 hours to go before it’s ready. Commit"}, {"post_id": 38059, "ts": "2026-07-31T07:37:52Z", "hours": 4.6294, "text": "After using the Ethereal Light theme for a while, I realized that although the core chat interface was done, many secondary pages still looked like they belonged to a completely different application. So this update wasn’t about adding a flashy new feature, it was about finishing what Ethereal Light was always meant to be. This is one of those updates where most users probably won’t notice every individual change, but I hope everyone notices that Ethereal Light feels even more beautiful now. I also realized that good UI isn’t about making one page beautiful, it’s about making every page feel like it was designed together. Commit"}, {"post_id": 37591, "ts": "2026-07-30T12:56:46Z", "hours": 1.7836, "text": "Confession time: I’m a high school STEM student. I spend far more time studying math, physics, chemistry, and biology than anything related to design. I have almost no artistic background, and I’m much more of a coder than a designer, so building Ethereal Light has been quite a journey. Half of the CSS for Ethereal Light only exists because I kept googling, “How do I make this look less ugly?” 😭 Somehow, after countless tiny tweaks, it’s finally starting to look like the theme I imagined. Anyway, I hope you love Arona Chat."}, {"post_id": 37517, "ts": "2026-07-30T10:14:34Z", "hours": 1.0261, "text": "I’m planning to further polish Ethereal Light theme and address the suggestions mentioned in the rating feedback. Thanks everyone for the support!"}, {"post_id": 32697, "ts": "2026-07-22T00:42:44Z", "hours": 0.5992, "text": "Upcoming Changes: Add more personalization features, such as customizable tone and emoji usage. Refine the Ethereal Light theme."}, {"post_id": 31626, "ts": "2026-07-20T05:40:15Z", "hours": 1.5953, "text": "After fixing a number of issues, the Arona Chat Public Demo is finally ready! You can try it using the link below. https://aronachat.yearcakes.com/"}, {"post_id": 31317, "ts": "2026-07-19T16:46:36Z", "hours": 4.7217, "text": "AronaChat v1.2.0 — A Bigger Update Than The Version Number Suggests Today, I completed AronaChat v1.2.0! Although this is only a minor version bump, it actually includes a lot of major improvements and new features. In this update, I added multi-provider support, custom models, the new Ethereal Light theme, and many other improvements. There are still many things to polish, but I’m working hard to turn AronaChat into something that we can genuinely use in our daily lives — not just a project. The current codebase has grown into a very complex system, so I’m planning to deploy the Public Demo version tomorrow. But this Public Demo is not just a temporary showcase. My goal is to make it a long-term usable product. You will be able to connect your own API providers and use AronaChat with your own services. To protect your privacy and security, the current version includes encrypted API key storage and multiple layers of security protection to keep your credentials as safe as possible. Due to storage and cost considerations, each user will have a fixed storage quota. If the limit is exceeded, attachments will be automatically removed using a FIFO (First In, First Out) rolling deletion system. For chat history, I’ll try my best to keep conversations stored for as long as possible while maintaining reasonable operating costs. Thank you for following the development of AronaChat! This is still just the beginning, and I hope it can become a tool that people truly enjoy using."}, {"post_id": 30657, "ts": "2026-07-18T12:26:38Z", "hours": 2.2361, "text": "The core development work is pretty much done! I’m now moving into the final polishing phase—doing security reviews, testing everything thoroughly, and fixing all the little rough edges I can find. Once that’s finished, I’ll deploy the new build as a public instance that everyone can use long-term. Can’t wait to share it with you all!"}, {"post_id": 30560, "ts": "2026-07-18T07:28:12Z", "hours": 2.12, "text": "🌸 Devlog Update I’m currently exploring a better and more reasonable resource limitation system, hoping to make the DEMO experience smoother, friendlier, and more enjoyable for everyone! I’m also working on adding support for custom model providers, so you’ll be able to add your own providers and use this project as a complete long-term solution instead of just a DEMO. Of course, this also brings some new challenges qwq Since users will be able to add their own API Keys, I need to carefully design a secure system to make sure your keys stay safe and never get exposed. I’m planning a layered architecture with encryption, multiple authentication layers, and additional security protections. This project is becoming much more complicated than I originally expected… but I want to build it properly instead of rushing it 🥺✨ 🌱 About Storage S3-compatible storage is really expensive qwq, so for now I’ve added per-user file size limits and a 7-day automatic cleanup system. I know these limits are a little too strict, and I’m really sorry about that 🥲💦 I hope you can understand that I’m still a solo developer trying to keep the service sustainable. To improve this, I’m building my own tiered storage system — Minamo 🌊 After Minamo is finished, attachment storage limits will be increased significantly, and the 7-day automatic cleanup will be removed! 🎉 If you like this project, you can follow this project or follow Minamo to receive future updates and new features 💫 Thank you so much for supporting this project! 💙"}, {"post_id": 30185, "ts": "2026-07-17T15:34:58Z", "hours": 4.2597, "text": "Whitelist is almost finished! There’s only a little bit left to polish, and I should have it done within the next few days. New ship coming soon™"}, {"post_id": 29884, "ts": "2026-07-17T01:31:04Z", "hours": 1.4356, "text": "Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish [DONE] Final UI review - almost done Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 27088, "ts": "2026-07-12T10:32:05Z", "hours": 2.3678, "text": "Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish [IN PROGRESS] Final UI review - almost done Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 27039, "ts": "2026-07-12T06:47:49Z", "hours": 1.4494, "text": "Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 27020, "ts": "2026-07-12T05:11:34Z", "hours": 2.5303, "text": "Finally fixed the security vulnerabilities and the remaining bugs. Next, I’ll continue reviewing the codebase and finish the new theme."}, {"post_id": 26596, "ts": "2026-07-11T14:50:43Z", "hours": 3.3919, "text": "I’m currently fixing a number of bugs in the new Ethereal Light theme. At the same time, I had the codebase audited by AI, which identified several critical security issues. I’m actively working through both the theme bugs and the reported vulnerabilities, so the next public commit may be delayed a bit. Before anything is published, I’ll also perform a full manual security review to make sure the public release is free of known security issues."}, {"post_id": 26481, "ts": "2026-07-11T09:28:21Z", "hours": 2.2219, "text": "Unexpectedly discovered several critical bugs. Currently fixing them."}, {"post_id": 26419, "ts": "2026-07-11T06:13:44Z", "hours": 1.4672, "text": "Fixed a bunch of UI, animation, rendering, and performance issues across the Ethereal Light theme and the Settings Panel. Real-time reasoning topic extraction now handles unfinished Markdown chunks correctly, so active words no longer get cut off while responses are streaming. I also switched to stable React keys, which eliminates the annoying text flickering during streaming. The scrolling lock, content clipping, and hidden input issues in Ethereal Light have also been fixed by improving layer isolation and hardware acceleration. Finally, repeated clicks on the Save button in Settings are now automatically deduplicated, preventing duplicate requests when the same configuration is submitted multiple times within 5 seconds."}, {"post_id": 26378, "ts": "2026-07-11T04:07:14Z", "hours": 0.9244, "text": "Fixed a critical bug that could allow users to perform unauthorized operations."}, {"post_id": 25794, "ts": "2026-07-10T08:01:30Z", "hours": 2.67, "text": "Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 25669, "ts": "2026-07-10T02:34:24Z", "hours": 3.2403, "text": "Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [IN PROGRESS] Animations (almost done) Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 25112, "ts": "2026-07-09T03:30:04Z", "hours": 2.4272, "text": "I couldn’t decide between a typewriter effect and a fade-in animation for AI responses, so I added both! You can now choose your preferred output animation in Settings."}, {"post_id": 24128, "ts": "2026-07-07T14:30:38Z", "hours": 0.7944, "text": "I refactored the usage calculation. This fixes an issue where the per-model cost wasn’t updated automatically, while also reducing database usage."}, {"post_id": 22584, "ts": "2026-07-05T03:34:45Z", "hours": 2.1117, "text": "I discovered that adding a new feature caused an existing feature to break. To prevent similar regressions, I added smoke tests and a full end-to-end (E2E) test suite."}, {"post_id": 21564, "ts": "2026-07-03T16:19:24Z", "hours": 4.1964, "text": "Status Updated! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft Animations Component art polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading"}, {"post_id": 19919, "ts": "2026-07-01T11:05:33Z", "hours": 2.1733, "text": "I am currently working on: New frontend UI theme (I named it Ethereal Light. It will be very, very beautiful!), and it will be released with a theme selector (if you don’t like it, you can switch to the current Classic theme). Whitelist: enabling you to have a private deployment! User resource usage limits: designed for the demo. Lazy frontend loading: makes the frontend start faster! Bug fixes: the current version has many bugs, including Clerk integration, multi-provider switching, etc. Locating the source of these bugs is very tiring. The next public version will take a long time to release and be pushed to the public repo. I will sync my progress via devlogs. If you have any suggestions, please tell me — they are very, very important to me!"}, {"post_id": 16796, "ts": "2026-06-27T08:28:33Z", "hours": 3.0211, "text": "Integrated Clerk for authentication and fixed various bugs :D"}, {"post_id": 13718, "ts": "2026-06-22T14:21:24Z", "hours": 3.1058, "text": "feat: optimize chat stream stability, security, and frontend rendering performance- Security: Added sensitive data redaction (masking password , secret , token , apiKey ) for trace logs in backend utility request/response body parsing. Stability: Enhanced Durable Object state recovery by persisting and restoring runtime payloads, ensuring the process queue resumes on restart, and adding a 100-second upstream API fetch timeout. Database: Bumped DB schema version to 15, adding applySchemaV14 and applySchemaV15 compatibility stubs. Performance: Refactored ChatSession message lists by extracting and memoizing UserMessageRow and AssistantMessageRow with React.memo , and extracted static Markdown plugins outside of render scopes to eliminate redundant parsing. State Management: Integrated Zustand useShallow selectors across App , ChatInputArea , and ChatSession to prevent unnecessary re-renders. Resilience: Upgraded stream reconnect/resume flow in the store to pass existing stream progress (content and reasoning), preventing flickering and duplicate content rendering on stream recovery."}, {"post_id": 12359, "ts": "2026-06-20T05:08:29Z", "hours": 1.1664, "text": "Added a Demo Mode that allows guest access via a password-based login. Demo mode can be enabled via config. Guests can log in using a shared demo password. All demo sessions are isolated per device. Demo data is separated from production."}, {"post_id": 7960, "ts": "2026-06-13T08:59:45Z", "hours": 0.5317, "text": "Release 1.1.0 This update focuses on enhancing usage tracking capabilities, introducing flexible service tiers and budget management, and delivering deep performance optimizations for the chat experience. 🌟 New Features Usage Aggregation: Added persistent tracking of total requests, prompt/completion tokens, and total cost (USD) within user profiles, including a detailed breakdown by model. Service Tiers: Introduced OpenRouter Service Tier support to balance cost and performance: Flex (0.5x cost): More affordable, but potentially slower or less reliable. Default (1.0x cost): Standard service level. Priority (2.5x cost): Fastest response times and highest priority. Temporary Daily Budget: Added the ability to set a temporary budget override for the current UTC day, allowing short-term flexibility without altering long-term settings. Usage Sync Tool: A new “Recalculate Usage Statistics” feature in the settings allows users to force a backend scan of all records to synchronize aggregated totals. ⚡ Performance Improvements Streaming Render Optimization: Implemented a buffering mechanism using requestAnimationFrame in useStore, shifting high-frequency streaming updates from “immediate trigger” to “frame-synced updates,” significantly reducing re-renders and improving UI smoothness. Refined Auto-Scroll: Overhauled auto-scroll logic in ChatSession to distinguish between session switches, message count changes, and active streaming, ensuring smoother scrolling behavior. 🎨 UI/UX Enhancements Session Management: Pagination: Session list now uses lazy loading (“Load More”) instead of loading all sessions at once, improving startup speed. Quick Actions: Added Pin and Archive capabilities in session menu for better organization. Settings Panel Upgrade: Advanced Tab: Introduced a new “Advanced” tab for system maintenance tools and technical information. Budget UI: Improved budget settings interface with detailed cost multiplier explanations and a dedicated temporary budget input. System Info: Added visibility for Instance ID and Schema Version. 🛠️ Technical Changes Backend Architecture: Modularized routing and migrated chat sessions to a Durable Object-based implementation for better state consistency. Database Migration: Updated user profile schema to support usage aggregation (Schema v13). Shared Types: Updated UserProfile and ChatGenerationSettings types to support new tracking and configuration options."}, {"post_id": 7928, "ts": "2026-06-13T06:57:41Z", "hours": 0.3606, "text": "First Public Release!"}]...
|
Title: Arona Chat by @yearcakes | Stardance
Devlo Title: Arona Chat by @yearcakes | Stardance
Devlogs:
First Public Release!
Release 1.1.0 This update focuses on enhancing usage tracking capabilities, introducing flexible service tiers and budget management, and delivering deep performance optimizations for the chat experience. 🌟 New Features Usage Aggregation: Added persistent tracking of total requests, prompt/completion tokens, and total cost (USD) within user profiles, including a detailed breakdown by model. Service Tiers: Introduced OpenRouter Service Tier support to balance cost and performance: Flex (0.5x cost): More affordable, but potentially slower or less reliable. Default (1.0x cost): Standard service level. Priority (2.5x cost): Fastest response times and highest priority. Temporary Daily Budget: Added the ability to set a temporary budget override for the current UTC day, allowing short-term flexibility without altering long-term settings. Usage Sync Tool: A new “Recalculate Usage Statistics” feature in the settings allows users to force a backend scan of all records to synchronize aggregated totals. ⚡ Performance Improvements Streaming Render Optimization: Implemented a buffering mechanism using requestAnimationFrame in useStore, shifting high-frequency streaming updates from “immediate trigger” to “frame-synced updates,” significantly reducing re-renders and improving UI smoothness. Refined Auto-Scroll: Overhauled auto-scroll logic in ChatSession to distinguish between session switches, message count changes, and active streaming, ensuring smoother scrolling behavior. 🎨 UI/UX Enhancements Session Management: Pagination: Session list now uses lazy loading (“Load More”) instead of loading all sessions at once, improving startup speed. Quick Actions: Added Pin and Archive capabilities in session menu for better organization. Settings Panel Upgrade: Advanced Tab: Introduced a new “Advanced” tab for system maintenance tools and technical information. Budget UI: Improved budget settings interface with detailed cost multiplier explanations and a dedicated temporary budget input. System Info: Added visibility for Instance ID and Schema Version. 🛠️ Technical Changes Backend Architecture: Modularized routing and migrated chat sessions to a Durable Object-based implementation for better state consistency. Database Migration: Updated user profile schema to support usage aggregation (Schema v13). Shared Types: Updated UserProfile and ChatGenerationSettings types to support new tracking and configuration options.
Added a Demo Mode that allows guest access via a password-based login. Demo mode can be enabled via config. Guests can log in using a shared demo password. All demo sessions are isolated per device. Demo data is separated from production.
feat: optimize chat stream stability, security, and frontend rendering performance- Security: Added sensitive data redaction (masking password , secret , token , apiKey ) for trace logs in backend utility request/response body parsing. Stability: Enhanced Durable Object state recovery by persisting and restoring runtime payloads, ensuring the process queue resumes on restart, and adding a 100-second upstream API fetch timeout. Database: Bumped DB schema version to 15, adding applySchemaV14 and applySchemaV15 compatibility stubs. Performance: Refactored ChatSession message lists by extracting and memoizing UserMessageRow and AssistantMessageRow with React.memo , and extracted static Markdown plugins outside of render scopes to eliminate redundant parsing. State Management: Integrated Zustand useShallow selectors across App , ChatInputArea , and ChatSession to prevent unnecessary re-renders. Resilience: Upgraded stream reconnect/resume flow in the store to pass existing stream progress (content and reasoning), preventing flickering and duplicate content rendering on stream recovery.
Integrated Clerk for authentication and fixed various bugs :D
I am currently working on: New frontend UI theme (I named it Ethereal Light. It will be very, very beautiful!), and it will be released with a theme selector (if you don’t like it, you can switch to the current Classic theme). Whitelist: enabling you to have a private deployment! User resource usage limits: designed for the demo. Lazy frontend loading: makes the frontend start faster! Bug fixes: the current version has many bugs, including Clerk integration, multi-provider switching, etc. Locating the source of these bugs is very tiring. The next public version will take a long time to release and be pushed to the public repo. I will sync my progress via devlogs. If you have any suggestions, please tell me — they are very, very important to me!
Status Updated! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft Animations Component art polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading
I discovered that adding a new feature caused an existing feature to break. To prevent similar regressions, I added smoke tests and a full end-to-end (E2E) test suite.
I refactored the usage calculation. This fixes an issue where the per-model cost wasn’t updated automatically, while also reducing database usage.
I couldn’t decide between a typewriter effect and a fade-in animation for AI responses, so I added both! You can now choose your preferred output animation in Settings.
Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [IN PROGRESS] Animations (almost done) Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading
Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading
Fixed a critical bug that could allow users to perform unauthorized operations.
Fixed a bunch of UI, animation, rendering, and performance issues across the Ethereal Light theme and the Settings Panel. Real-time reasoning topic extraction now handles unfinished Markdown chunks correctly, so active words no longer get cut off while responses are streaming. I also switched to stable React keys, which eliminates the annoying text flickering during streaming. The scrolling lock, content clipping, and hidden input issues in Ethereal Light have also been fixed by improving layer isolation and hardware acceleration. Finally, repeated clicks on the Save button in Settings are now automatically deduplicated, preventing duplicate requests when the same configuration is submitted multiple times within 5 seconds.
Unexpectedly discovered several critical bugs. Currently fixing them.
I’m currently fixing a number of bugs in the new Ethereal Light theme. At the same time, I had the codebase audited by AI, which identified several critical security issues. I’m actively working through both the theme bugs and the reported vulnerabilities, so the next public commit may be delayed a bit. Before anything is published, I’ll also perform a full manual security review to make sure the public release is free of known security issues.
Finally fixed the security vulnerabilities and the remaining bugs. Next, I’ll continue reviewing the codebase and finish the new theme.
Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish Final UI review Whitelist User resource usage limits (for the demo) Lazy frontend loading
Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish [IN PROGRESS] Final UI review - almost done Whitelist User resource usage limits (for the demo) Lazy frontend loading
Status Update! [IN PROGRESS] New frontend UI theme — Ethereal Light [DONE] Draft [DONE] Animations [DONE] Visual polish [DONE] Final UI review - almost done Whitelist User resource usage limits (for the demo) Lazy frontend loading
Whitelist is almost finished! There’s only a little bit left to polish, and I should have it done within the next few days. New ship coming soon™
🌸 Devlog Update I’m currently exploring a better and more reasonable resource limitation system, hoping to make the DEMO experience smoother, friendlier, and more enjoyable for everyone! I’m also working on adding support for custom model providers, so you’ll be able to add your own providers and use this project as a complete long-term solution instead of just a DEMO. Of course, this also brings some new challenges qwq Since users will be able to add their own API Keys, I need to carefully design a secure system to make sure your keys stay safe and never get exposed. I’m planning a layered architecture with encryption, multiple authentication layers, and additional security protections. This project is becoming much more complicated than I originally expected… but I want to build it properly instead of rushing it 🥺✨ 🌱 About Storage S3-compatible storage is really expensive qwq, so for now I’ve added per-user file size limits and a 7-day automatic cleanup system. I know these limits are a little too strict, and I’m really sorry about that 🥲💦 I hope you can understand that I’m still a solo developer trying to keep the service sustainable. To improve this, I’m building my own tiered storage system — Minamo 🌊 After Minamo is finished, attachment storage limits will be increased significantly, and the 7-day automatic cleanup will be removed! 🎉 If you like this project, you can follow this project or follow Minamo to receive future updates and new features 💫 Thank you so much for supporting this project! 💙
The core development work is pretty much done! I’m now moving into the final polishing phase—doing security reviews, testing everything thoroughly, and fixing all the little rough edges I can find. Once that’s finished, I’ll deploy the new build as a public instance that everyone can use long-term. Can’t wait to share it with you all!
AronaChat v1.2.0 — A Bigger Update Than The Version Number Suggests Today, I completed AronaChat v1.2.0! Although this is only a minor version bump, it actually includes a lot of major improvements and new features. In this update, I added multi-provider support, custom models, the new Ethereal Light theme, and many other improvements. There are still many things to polish, but I’m working hard to turn AronaChat into something that we can genuinely use in our daily lives — not just a project. The current codebase has grown into a very complex system, so I’m planning to deploy the Public Demo version tomorrow. But this Public Demo is not just a temporary showcase. My goal is to make it a long-term usable product. You will be able to connect your own API providers and use AronaChat with your own services. To protect your privacy and security, the current version includes encrypted API key storage and multiple layers of security protection to keep your credentials as safe as possible. Due to storage and cost considerations, each user will have a fixed storage quota. If the limit is exceeded, attachments will be automatically removed using a FIFO (First In, First Out) rolling deletion system. For chat history, I’ll try my best to keep conversations stored for as long as possible while maintaining reasonable operating costs. Thank you for following the development of AronaChat! This is still just the beginning, and I hope it can become a tool that people truly enjoy using.
After fixing a number of issues, the Arona Chat Public Demo is finally ready! You can try it using the link below. https://aronachat.yearcakes.com/
Upcoming Changes: Add more personalization features, such as customizable tone and emoji usage. Refine the Ethereal Light theme.
I’m planning to further polish Ethereal Light theme and address the suggestions mentioned in the rating feedback. Thanks everyone for the support!
Confession time: I’m a high school STEM student. I spend far more time studying math, physics, chemistry, and biology than anything related to design. I have almost no artistic background, and I’m much more of a coder than a designer, so building Ethereal Light has been quite a journey. Half of the CSS for Ethereal Light only exists because I kept googling, “How do I make this look less ugly?” 😭 Somehow, after countless tiny tweaks, it’s finally starting to look like the theme I imagined. Anyway, I hope you love Arona Chat.
After using the Ethereal Light theme for a while, I realized that although the core chat interface was done, many secondary pages still looked like they belonged to a completely different application. So this update wasn’t about adding a flashy new feature, it was about finishing what Ethereal Light was always meant to be. This is one of those updates where most users probably won’t notice every individual change, but I hope everyone notices that Ethereal Light feels even more beautiful now. I also realized that good UI isn’t about making one page beautiful, it’s about making every page feel like it was designed together. Commit
Settings now save automatically as soon as you make changes, so there’s no more clicking Save everywhere. The user list also shows each user’s email when available (falling back to the Clerk ID). Improved auth by showing a recovery screen if initialization gets stuck for 12 seconds, and hardened SSRF protection against alternative IPv4 bypass tricks. I’ve already started designing the Ethereal Dark theme too, but since it’s unrelated to this commit I didn’t include it yet. Still probably another 8–10 hours to go before it’s ready. Commit
Hey guys! I’m currently working on a new theme (Ethereal Dark) for Arona Chat, and it will probably introduce a very large diff with many UI/CSS/component changes. I’m thinking about creating a dedicated feature branch (theme/ethereal-dark) for this work instead of directly committing everything to main. The idea is to keep the development process transparent and easier to review for future reviewers and users. After the theme is complete, I’ll merge it back into main. So I’d like to get your opinion: Do you prefer seeing the full development history through a feature branch? Or do you think keeping a cleaner main history with a larger commit is better? Thanks!
This is the last update for Arona Chat for the time being. In this update, I’ve added automatic image resizing, support for TXT and Markdown files, dynamic username injection in the greeting and system prompt, and the new Ethereal Dark theme. However, since my new semester started on August 31st, I won’t have as much time to work on Arona Chat or add new features. Anyway, I hope you all enjoy Arona Chat! Commit
I added a simple sharing function. I also added automatic picture attachment compression, which should save a lot of tokens. Commit
Ships:
What did you make? I built Arona Chat, a full-stack AI chat application powered by Cloudflare Workers, D1, R2, Durable Objects, and OpenRouter. It supports chat sessions, file attachments, usage tracking, budget management, authentication, and model selection, all wrapped in a Blue Archive-inspired interface. What was challenging? The most challenging part was designing the backend architecture around long-running AI responses and usage tracking. One lesson I learned the hard way is that inefficient SQLite access patterns can dramatically increase database costs. As the project grew, I had to rethink how usage statistics were stored and aggregated instead of recalculating everything repeatedly. Another challenge was handling very long SSE streams. For AI responses that may take a long time to complete, it is important that processing continues even if the client disconnects. This was my first time introducing Durable Objects into a production project, and they turned out to be a great fit for maintaining state and ensuring reliable streaming behavior. What are you proud of? I’m proud that this project pushed me beyond simple CRUD applications and into distributed system design. Integrating Durable Objects, building usage aggregation, and optimizing streaming performance taught me a lot about how real-world AI applications are built. I’m also genuinely impressed by Cloudflare R2. It was extremely easy to integrate, works reliably, and offers a very generous free tier, making it an excellent choice for student developers and hobby projects. How can people test it? Fork this repository. Update the wrangler.toml configuration for your own Cloudflare resources (do not commit any secrets). Deploy the frontend (frontend) to Cloudflare Pages and the backend (backend) to Cloudflare Workers. Configure the required Secrets in Cloudflare after deployment. Open the deployed site and log in using the password you configured. Create your first Passkey (highly recommended for a better login experience). Start chatting, upload files, try different models, and explore usage statistics and budget management features.
After a lot of work, AronaChat v1.2.0 is finally here! With this update, I’m continuing to transform AronaChat from a simple project into a real product that people can actually use. The Public Demo is now live! This is not just a temporary showcase — I want to build it into a long-term usable product. You can connect your own API providers and use AronaChat with your own models. Security and privacy are also a priority. API keys are stored with encryption and protected by multiple security measures to keep your credentials as safe as possible. Due to storage and cost considerations, each user currently has a limited storage quota. When the limit is reached, attachments will be automatically removed using a FIFO rolling deletion system. Chat history will be preserved as long as possible while keeping operating costs sustainable. Thank you everyone who has followed AronaChat’s journey! This is only the beginning, and I hope AronaChat can become a tool that people truly enjoy using.
This is the last ship for Arona Chat for the time being. Since my new semester started on August 31st, I won’t have as much time to work on Arona Chat or add new features. Anyway, I hope you all enjoy Arona Chat!
Some small improvements....
|
1792986647.1937532
|
1793073047.1937532
|
|
29172
|
My own site! by @IshanWarrior2012 | Stardance
|
IshanWarrior2012
|
1
|
79.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-06T08:59:44Z", "hours": 79.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built my own portfolio site and its very personal to me. I took me 80 hrs of work to complete . The design of the website is inspired from dribble.", "repo": "https://github.com/kurkuregamerz/My-Personal-Site", "demo": "https://kurkuregamerz.github.io/My-Personal-Site/"}]...
|
[{"post_id": 62763, "ts": "202 [{"post_id": 62763, "ts": "2026-09-06T08:55:04Z", "hours": 9.45, "text": "i completed my project today shipping now"}, {"post_id": 60657, "ts": "2026-09-03T04:56:26Z", "hours": 15.9433, "text": "ok i did a lot of things i cant explain"}, {"post_id": 43917, "ts": "2026-08-09T11:20:31Z", "hours": 5.2208, "text": "added services projects and our development process to the home page and added credits in footer"}, {"post_id": 39846, "ts": "2026-08-03T03:18:01Z", "hours": 16.9303, "text": "added more single time scroll animations"}, {"post_id": 31375, "ts": "2026-07-19T18:18:12Z", "hours": 2.6469, "text": "Footer added"}, {"post_id": 31123, "ts": "2026-07-19T08:34:30Z", "hours": 11.9322, "text": "Added responsiveness"}, {"post_id": 26028, "ts": "2026-07-10T16:39:30Z", "hours": 8.4264, "text": "completed loader exit"}, {"post_id": 22972, "ts": "2026-07-05T17:28:22Z", "hours": 7.8617, "text": "Milestone Devlog Today I finished the hero section and here is a glance of it. I added animations in the hero section in the opening of the page"}, {"post_id": 19952, "ts": "2026-07-01T12:23:34Z", "hours": 0.4825, "text": "Designing layout and theme"}, {"post_id": 19776, "ts": "2026-07-01T05:06:54Z", "hours": 0.3875, "text": "Created the app structure and did some basic code by adding boilerplate in html and root styles in css"}]...
|
Title: My own site! by @IshanWarrior2012 | Stardan Title: My own site! by @IshanWarrior2012 | Stardance
Devlogs:
Created the app structure and did some basic code by adding boilerplate in html and root styles in css
Designing layout and theme
Milestone Devlog Today I finished the hero section and here is a glance of it. I added animations in the hero section in the opening of the page
completed loader exit
Added responsiveness
Footer added
added more single time scroll animations
added services projects and our development process to the home page and added credits in footer
ok i did a lot of things i cant explain
i completed my project today shipping now
Ships:
I built my own portfolio site and its very personal to me. I took me 80 hrs of work to complete . The design of the website is inspired from dribble....
|
1793054875.406016
|
1793141275.406016
|
|
48315
|
Storm by @Draaal | Stardance
|
Draaal
|
1
|
79.0
|
1279
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-01T20:25:22Z", "hours": 79.0, "multiplier": 18.99, "payout": 1279, "blessing": "neutral", "text": "storm I made a rules engine for the card game MTG. Its basically a giant state machine. You tell it what the players do and based on that it changes the game state. My experience The most challenging thing by far was finding a data model that would allow everything you can do in MTG. And since cards are written in english, there are A LOT of possible actions. Shiny new things I learned I finallyyy have a proper understanding of generics; before it was just this “magic in angle brackets” Pros & Cons of different data structures while I decided what to use for storing cards Experience in how to manage a project that has > 10 files. Might actually be the most valuable thing I gained from all of this.. A somewhat decent understanding of lifetimes in rust Also I finally had a look at metaprogramming with macros (only declarative macros though) I am proud of this The thing I am really proud of in here is how you can have these generic components that define behaviour or targets or such an how you can then use them to create cards as pure data through the power of generics and macros. They are literally just a constant in the code. My experience with AI Later in the implementation when my data structure was mostly fixed I tried having an AI agent do some of the boring work of hooking things up, but it didn’t work. And by that I mean it was pretty awful. It didn’t understand my design, reinvented the wheel several times, took shortcuts that would work for exactly this one card I asked about and just created wrong behaviour. Maybe this was a me problem, because I provided bad context, but I think I will stick writing code by hand for a while longer.", "repo": "https://github.com/andraaal/storm", "demo": "https://crates.io/crates/storm-engine"}]...
|
[{"post_id": 75713, "ts": "202 [{"post_id": 75713, "ts": "2026-09-30T20:35:17Z", "hours": 2.5422, "text": "#12 Of course there is an extension of one month right as I was going to ship… Anyway I published it on crates.io, I added some minimal executable example, did the README and added some metadata for publication. And I drew this wonderful new banner. Its a bit whacky, but I like it"}, {"post_id": 75316, "ts": "2026-09-29T18:52:32Z", "hours": 7.1283, "text": "#11 Devlog (AI adventure) So, since stardance ends soon I have to ship this and I am not sure if I can manage in time. So I had a look at AI coding and how to do it properly, because I tried vibe-coding before and it was abysmal. And I have to say it was miles ahead of anything else AI has ever done for me, when you use some specialized skills, create a roadmap first, split it into tickets (The AI even created tickets on GitHub for whatever godforsaken reason; It knew this is a solo project), structure your work, … It is also a TON more work. And it was still lacking. Maybe it was because my student subscription isn’t that powerful, maybe MTG is just too complex or I didn’t explain my messed up design well enough to the agent. Either way I wasted a bunch more time and … yeah, here’s hoping that I will get a working v0.1 alpha in time!"}, {"post_id": 68841, "ts": "2026-09-15T20:56:08Z", "hours": 7.1406, "text": "#10 Devlog How could I forget git THIS hard??? I didn’t make a single commit in like the last 20 hours. And now everything is so different that I might as well make a new repo. Also the line count in the screenshots is bugged somehow. Its more like +28XX lines. And it took THREE screenshots!! Anyways, heres an actual update: Now casting spells is finally complete (kinda) and static abilities work too. They even share some code through common “behaviour”. Thats just some common action that can be executed on the game state. Also with the help of a few todo! macros (Magic for fixing anything, but throws at runtime) the code finally compiles again. For like the second time in the entire development. There is bound to be a million bugs in there…."}, {"post_id": 66240, "ts": "2026-09-11T23:06:07Z", "hours": 8.4828, "text": "#9 Devlog Casting spells is now almost complete, and my overengineered type system got even more crazy. We have now: Card , that represent, well… cards StackDefinition , which the targets and some other metadata for Spells Selectors , as there name suggests, select objects Behaviour , a closure that can change the game state, but with a lot of fancy type shenanigans to make sure it is only used with appropriate StackDefinitions. Below are some highlights from the new types"}, {"post_id": 63238, "ts": "2026-09-06T22:41:41Z", "hours": 4.5017, "text": "#8 Devlog (Sorry; last one is actually #7) So I finally completed the rewrite my entire project now uses my new overengineered typing. Yay! Finally!! But that also meant that I had to change my library API to use all of those types. What you see below are just the function definitions for that + some minor input validation. And, yes, you could defnitiely make that a lot shorter with macros but it is 1am and I can’t be bothered to go learn how they work."}, {"post_id": 61426, "ts": "2026-09-04T10:21:58Z", "hours": 4.1117, "text": "#5 Devlog Of course fixing stuff took longer than I thought (as always), but we are almost there. Only 16 more errors to go!"}, {"post_id": 59051, "ts": "2026-08-31T17:20:49Z", "hours": 7.4244, "text": "#6 Devlog You know the rewrite I talked about last time? I am STILL doing that. It changed so much more that I had expected. Now I have changed just about every function signature in the entire project. Also there were a million little problems that also needed attention. I think I am close to completing the rewrite though; the core types are all set, I just have to deal with the downstream effects of changing them. That shouldn’t (I hope) take too long"}, {"post_id": 56248, "ts": "2026-08-27T22:35:34Z", "hours": 3.4006, "text": "#5 Devlog I redesigned my engine (not implemented yet); It makes much more extensive use of generics now and has in general much better type-safety. This eliminates a ton of bounds checks and potential errors, because the compiler can prove at compile-time that the program is valid (or not). Also kind of crazy that it says 3.5h for designing. I feel like I spent most of my time in the browser explaining my code to ChatGPT to understand it better myself (ChatGPT did little besides saying “Ah, yes, great idea” and explaining my idea back to me)"}, {"post_id": 55056, "ts": "2026-08-26T14:14:51Z", "hours": 1.5544, "text": "#4 Devlog I have been developing a new model for how cards on the “stack” (a zone for cards). This moves a lot of the verification and testing (“Is the card that is reference by this Id, the card I expect?, Is this card really in the correct zone?, …”) to compile-time and the compiler will simply refuse to compile if its wrong. And I am really proud of it, since this is by far the most advanced thing I have ever done with generics and it is beautiful. All these ifs are just gone"}, {"post_id": 53369, "ts": "2026-08-23T21:53:02Z", "hours": 1.0717, "text": "#3 Devlog I created a single method in this hour. I wanted to just have method that creates an Iterator over a collection of objects. But if you have different objects that becomes very messy very fast, because the concrete type of the iterator is also different then. Now the method only claims to return something that is an iterator, so it shouldn’t be a problem, right? Well it is, because the compiler doesn’t know at compile time what type will be returned and thus can’t do monomorphization. The solution: Make the types of all of the objects the same through static polymorphism BEFORE you construct the iterator by putting everything into an enum and implementing an access method. You could of course avoid all of that and just use dynamic polymorphism, but who needs that. Also sorry for posting so little, I will try to post more often."}, {"post_id": 53291, "ts": "2026-08-23T19:04:07Z", "hours": 11.1336, "text": "#2 Devlog I reworked how static abilities are applied - now they are (mostly) compliant with MTG comp rules. By far the hardest (and most time-consuming) part was coming up with a design that can actually accommodate all of the requirements the rules have. It’s madness; you can change abilities during resolution, partially apply abilities and the order of application is incredibly complicated. Once I had that figured out the implementation was pretty straightforward. Design is in the image below. The second big thing is that I started creating a unified iterator interface to access my cards in a structured manner."}, {"post_id": 47560, "ts": "2026-08-15T15:14:23Z", "hours": 20.0756, "text": "#1 Devlog So originally I didn’t even plan to put this here, it was just me trying some different ideas. But now that I have spent over 20h and the design isn’t complete trash anymore, I should probably put this here as well. It is still far from complete and actually not that much code for 20h due to a million rewrites. Still, it has a working model for spells, permanents and various effects, so some basic cards can already work. What still needs a lot of work is how to cast a spell, but it is so freaking complicated. Also sorry for no image, but it is a lib and far from runnable, so yeah.."}]...
|
Title: Storm by @Draaal | Stardance
Devlogs:
#1 D Title: Storm by @Draaal | Stardance
Devlogs:
#1 Devlog So originally I didn’t even plan to put this here, it was just me trying some different ideas. But now that I have spent over 20h and the design isn’t complete trash anymore, I should probably put this here as well. It is still far from complete and actually not that much code for 20h due to a million rewrites. Still, it has a working model for spells, permanents and various effects, so some basic cards can already work. What still needs a lot of work is how to cast a spell, but it is so freaking complicated. Also sorry for no image, but it is a lib and far from runnable, so yeah..
#2 Devlog I reworked how static abilities are applied - now they are (mostly) compliant with MTG comp rules. By far the hardest (and most time-consuming) part was coming up with a design that can actually accommodate all of the requirements the rules have. It’s madness; you can change abilities during resolution, partially apply abilities and the order of application is incredibly complicated. Once I had that figured out the implementation was pretty straightforward. Design is in the image below. The second big thing is that I started creating a unified iterator interface to access my cards in a structured manner.
#3 Devlog I created a single method in this hour. I wanted to just have method that creates an Iterator over a collection of objects. But if you have different objects that becomes very messy very fast, because the concrete type of the iterator is also different then. Now the method only claims to return something that is an iterator, so it shouldn’t be a problem, right? Well it is, because the compiler doesn’t know at compile time what type will be returned and thus can’t do monomorphization. The solution: Make the types of all of the objects the same through static polymorphism BEFORE you construct the iterator by putting everything into an enum and implementing an access method. You could of course avoid all of that and just use dynamic polymorphism, but who needs that. Also sorry for posting so little, I will try to post more often.
#4 Devlog I have been developing a new model for how cards on the “stack” (a zone for cards). This moves a lot of the verification and testing (“Is the card that is reference by this Id, the card I expect?, Is this card really in the correct zone?, …”) to compile-time and the compiler will simply refuse to compile if its wrong. And I am really proud of it, since this is by far the most advanced thing I have ever done with generics and it is beautiful. All these ifs are just gone
#5 Devlog I redesigned my engine (not implemented yet); It makes much more extensive use of generics now and has in general much better type-safety. This eliminates a ton of bounds checks and potential errors, because the compiler can prove at compile-time that the program is valid (or not). Also kind of crazy that it says 3.5h for designing. I feel like I spent most of my time in the browser explaining my code to ChatGPT to understand it better myself (ChatGPT did little besides saying “Ah, yes, great idea” and explaining my idea back to me)
#6 Devlog You know the rewrite I talked about last time? I am STILL doing that. It changed so much more that I had expected. Now I have changed just about every function signature in the entire project. Also there were a million little problems that also needed attention. I think I am close to completing the rewrite though; the core types are all set, I just have to deal with the downstream effects of changing them. That shouldn’t (I hope) take too long
#5 Devlog Of course fixing stuff took longer than I thought (as always), but we are almost there. Only 16 more errors to go!
#8 Devlog (Sorry; last one is actually #7) So I finally completed the rewrite my entire project now uses my new overengineered typing. Yay! Finally!! But that also meant that I had to change my library API to use all of those types. What you see below are just the function definitions for that + some minor input validation. And, yes, you could defnitiely make that a lot shorter with macros but it is 1am and I can’t be bothered to go learn how they work.
#9 Devlog Casting spells is now almost complete, and my overengineered type system got even more crazy. We have now: Card , that represent, well… cards StackDefinition , which the targets and some other metadata for Spells Selectors , as there name suggests, select objects Behaviour , a closure that can change the game state, but with a lot of fancy type shenanigans to make sure it is only used with appropriate StackDefinitions. Below are some highlights from the new types
#10 Devlog How could I forget git THIS hard??? I didn’t make a single commit in like the last 20 hours. And now everything is so different that I might as well make a new repo. Also the line count in the screenshots is bugged somehow. Its more like +28XX lines. And it took THREE screenshots!! Anyways, heres an actual update: Now casting spells is finally complete (kinda) and static abilities work too. They even share some code through common “behaviour”. Thats just some common action that can be executed on the game state. Also with the help of a few todo! macros (Magic for fixing anything, but throws at runtime) the code finally compiles again. For like the second time in the entire development. There is bound to be a million bugs in there….
#11 Devlog (AI adventure) So, since stardance ends soon I have to ship this and I am not sure if I can manage in time. So I had a look at AI coding and how to do it properly, because I tried vibe-coding before and it was abysmal. And I have to say it was miles ahead of anything else AI has ever done for me, when you use some specialized skills, create a roadmap first, split it into tickets (The AI even created tickets on GitHub for whatever godforsaken reason; It knew this is a solo project), structure your work, … It is also a TON more work. And it was still lacking. Maybe it was because my student subscription isn’t that powerful, maybe MTG is just too complex or I didn’t explain my messed up design well enough to the agent. Either way I wasted a bunch more time and … yeah, here’s hoping that I will get a working v0.1 alpha in time!
#12 Of course there is an extension of one month right as I was going to ship… Anyway I published it on crates.io, I added some minimal executable example, did the README and added some metadata for publication. And I drew this wonderful new banner. Its a bit whacky, but I like it
Ships:
storm I made a rules engine for the card game MTG. Its basically a giant state machine. You tell it what the players do and based on that it changes the game state. My experience The most challenging thing by far was finding a data model that would allow everything you can do in MTG. And since cards are written in english, there are A LOT of possible actions. Shiny new things I learned I finallyyy have a proper understanding of generics; before it was just this “magic in angle brackets” Pros & Cons of different data structures while I decided what to use for storing cards Experience in how to manage a project that has > 10 files. Might actually be the most valuable thing I gained from all of this.. A somewhat decent understanding of lifetimes in rust Also I finally had a look at metaprogramming with macros (only declarative macros though) I am proud of this The thing I am really proud of in here is how you can have these generic components that define behaviour or targets or such an how you can then use them to create cards as pure data through the power of generics and macros. They are literally just a constant in the code. My experience with AI Later in the implementation when my data structure was mostly fixed I tried having an AI agent do some of the boring work of hooking things up, but it didn’t work. And by that I mean it was pretty awful. It didn’t understand my design, reinvented the wheel several times, took shortcuts that would work for exactly this one card I asked about and just created wrong behaviour. Maybe this was a me problem, because I provided bad context, but I think I will stick writing code by hand for a while longer....
|
1793004597.9073024
|
1793090997.9073024
|