|
70567
|
Quiz by @syedakhter | Stardance
|
syedakhter
|
0
|
1.01
|
0
|
[]
|
[{"post_id": 81144, "ts": "202 [{"post_id": 81144, "ts": "2026-10-20T02:16:31Z", "hours": 1.0067, "text": "A quiz only spent 1hr on this because im busy"}]...
|
Title: Quiz by @syedakhter | Stardance
Devlogs:
A Title: Quiz by @syedakhter | Stardance
Devlogs:
A quiz only spent 1hr on this because im busy...
|
1792464435.2018352
|
1793069235.2018352
|
|
67137
|
Autonomously landing TVC rocket by @sangyupl511 | Autonomously landing TVC rocket by @sangyupl511 | Stardance...
|
sangyupl511
|
0
|
27.26
|
0
|
[]
|
[{"post_id": 81146, "ts": "202 [{"post_id": 81146, "ts": "2026-10-20T02:29:29Z", "hours": 1.45, "text": "I replaced the lower leg ring with the improved design and I also added funtak to the bottom where the legs and ring contact. In theory, the funtak should slow down and absorb the impact/velocity of the legs before they hit the bottom. I added the funtak because in the last lower leg ring design, the velocity that the legs were coming down at snapped the platform below it."}, {"post_id": 80860, "ts": "2026-10-19T02:18:06Z", "hours": 1.7456, "text": "I installed the new avionics holder today. However, when I was testing the lower leg ring, I found a weakness in the design. The ring has snapped where the legs came into contact with it. I failed to see the issue with my previous design where the 90 degree angle that the leg platform and the ring made was a point where the 3D print was fragile and could snap easily. So, I redesigned the lower leg ring so that the is a 0.25in fillet that tapers toward 0.125in at the edge along the edge where the 3D print had previously snapped. Below is a picture of the snapped leg ring."}, {"post_id": 80545, "ts": "2026-10-18T04:02:46Z", "hours": 2.9158, "text": "I added the avionics and avionics holder into the lower body tube of the rocket. After that I attached the top tube to the bottom. I then performed multiple drop tests testing a straight down vertical drop, lateral and vertical drop, and spinning drop. I found that the rocket performed really well on the lateral and vertical lateral drops which I’m really proud of because the landing pads were doing their jobs of absorbing the shock. However, I found that on spinning drops, the rocket had a tendency to tip over, but not enough to fall. I think reducing the angular velocity about the body tube is something that I should look out for when performing my test flights."}, {"post_id": 80027, "ts": "2026-10-16T00:51:22Z", "hours": 1.8667, "text": "I installed the new servo arm into the spring system and tested it, but in one of the trials, the crook where the servo arm is placed into the bulkhead broke off, so I had to redesign the bulkhead so that the fillet value on the corner where the bulkhead crook broke off to a greater value. The increased value on the fillet will hopefully increase the crook’s resistance to snapping. Also I had to solder together a female XT-30 connector port to another wire that plugged into the Li-ion charger because I didn’t have the adapter. The old wire was a female XT-60 connector which didn’t work with my male XT-30 connector. I also epoxied the bungee cord connected to the nose cone to the upper body tube."}, {"post_id": 79709, "ts": "2026-10-15T05:03:35Z", "hours": 2.2167, "text": "I finished drilling out the holes in the body and I installed the spring mechanism into the tube. The arm of the servo was starting to become detached due to the stress that it experienced when holding back the spring’s force when locked, so I wrapped wire around it and epoxied the arm again to make the arm strong again. Next step is to find a place to attach the nose cone and confirm the spring mechanism actually works with a static test with a loaded parachute."}, {"post_id": 79246, "ts": "2026-10-13T05:54:23Z", "hours": 1.3833, "text": "Today I got the spring mechanism for ejecting the parachute to work reliably. I made a few improvements. Specifically, I made a new top bulkhead for the ejection system that featured a latch/crook for the servo arm to swing into when the spring is compressed and ready to be locked into. In contrast, the previous version had the servo arm swing directly in between the spring coils, which led to inconsistency and jammed ejections. Overall, today was a pretty productive day and I’m happy I got the mechanism finished since I thought I would’ve taken a lot longer on it."}, {"post_id": 78951, "ts": "2026-10-12T05:33:59Z", "hours": 1.9169, "text": "I tested the spring mechanism that launches the parachute out of the top rocket tube. I cut open an old tube so that I could see the length that the spring compresses. Still need to verify the system works and touch up on the actual mechanism."}, {"post_id": 78643, "ts": "2026-10-11T05:00:49Z", "hours": 1.3567, "text": "Took apart old version of the spring mechanism on the parachute bulkhead to use the spring on my next iteration of parachute bulkhead. Below is a picture of the parachute bulkhead before I took it apart."}, {"post_id": 78423, "ts": "2026-10-10T19:24:12Z", "hours": 3.2831, "text": "I worked on the parachute spring and more importantly, the e-matches that ignite the descent motor and cut the rubber band holding the legs together, to then release the legs to landing. Today was most likely the biggest leap in the project because I finally got the e-matches to not only ignite, but also ignite of command with little to no delay. I still need to work a little more on the parachute spring ejection system, but that’s as expected because I only started that component a few days ago. (Also peep the white monster in the corner)."}, {"post_id": 78184, "ts": "2026-10-09T22:11:13Z", "hours": 0.6336, "text": "I glued the landing pads onto the legs of the rocket. After expoxying them, I tested the landing leg deployment and how it would land and they legs worked!"}, {"post_id": 77752, "ts": "2026-10-08T05:03:37Z", "hours": 1.5, "text": "I wired the two positive wires from the second 7.4V LiPo and negative wires to the LiPo negative and Teensy 4.1 ground for each of the two MOSFET gates."}, {"post_id": 77713, "ts": "2026-10-08T01:38:33Z", "hours": 1.95, "text": "Today I attached the legs on the rocket and confirmed the leg deployment system worked with one of the four leg structures. Next step is to epoxy the landing pads onto the ends of the legs."}, {"post_id": 76892, "ts": "2026-10-04T23:02:18Z", "hours": 1.0725, "text": "Added servo that controls the parachute ejection system. The servo will release a spring that will then eject the parachute out. Also I needed to cut and add additional wire and then shrink tube it bc the wires were too short."}, {"post_id": 76546, "ts": "2026-10-03T22:06:15Z", "hours": 1.8833, "text": "Soldered the wires connecting to MOSFET to ignite the descent motor. Tried to wire the additionally connected wires to create the spark, but could not complete today."}, {"post_id": 76517, "ts": "2026-10-03T19:53:27Z", "hours": 0.5339, "text": "Build the bulkhead that will be used to platform the black powder charge or mechanical spring parachute ejection system."}, {"post_id": 75780, "ts": "2026-10-01T02:58:20Z", "hours": 1.55, "text": "Today, I mounted the thrust vector control mount onto the lower body frame of the rocket. Still need to confirm it works tho, for next work session…"}]...
|
Title: Autonomously landing TVC rocket by @sangyup Title: Autonomously landing TVC rocket by @sangyupl511 | Stardance
Devlogs:
Today, I mounted the thrust vector control mount onto the lower body frame of the rocket. Still need to confirm it works tho, for next work session…
Build the bulkhead that will be used to platform the black powder charge or mechanical spring parachute ejection system.
Soldered the wires connecting to MOSFET to ignite the descent motor. Tried to wire the additionally connected wires to create the spark, but could not complete today.
Added servo that controls the parachute ejection system. The servo will release a spring that will then eject the parachute out. Also I needed to cut and add additional wire and then shrink tube it bc the wires were too short.
Today I attached the legs on the rocket and confirmed the leg deployment system worked with one of the four leg structures. Next step is to epoxy the landing pads onto the ends of the legs.
I wired the two positive wires from the second 7.4V LiPo and negative wires to the LiPo negative and Teensy 4.1 ground for each of the two MOSFET gates.
I glued the landing pads onto the legs of the rocket. After expoxying them, I tested the landing leg deployment and how it would land and they legs worked!
I worked on the parachute spring and more importantly, the e-matches that ignite the descent motor and cut the rubber band holding the legs together, to then release the legs to landing. Today was most likely the biggest leap in the project because I finally got the e-matches to not only ignite, but also ignite of command with little to no delay. I still need to work a little more on the parachute spring ejection system, but that’s as expected because I only started that component a few days ago. (Also peep the white monster in the corner).
Took apart old version of the spring mechanism on the parachute bulkhead to use the spring on my next iteration of parachute bulkhead. Below is a picture of the parachute bulkhead before I took it apart.
I tested the spring mechanism that launches the parachute out of the top rocket tube. I cut open an old tube so that I could see the length that the spring compresses. Still need to verify the system works and touch up on the actual mechanism.
Today I got the spring mechanism for ejecting the parachute to work reliably. I made a few improvements. Specifically, I made a new top bulkhead for the ejection system that featured a latch/crook for the servo arm to swing into when the spring is compressed and ready to be locked into. In contrast, the previous version had the servo arm swing directly in between the spring coils, which led to inconsistency and jammed ejections. Overall, today was a pretty productive day and I’m happy I got the mechanism finished since I thought I would’ve taken a lot longer on it.
I finished drilling out the holes in the body and I installed the spring mechanism into the tube. The arm of the servo was starting to become detached due to the stress that it experienced when holding back the spring’s force when locked, so I wrapped wire around it and epoxied the arm again to make the arm strong again. Next step is to find a place to attach the nose cone and confirm the spring mechanism actually works with a static test with a loaded parachute.
I installed the new servo arm into the spring system and tested it, but in one of the trials, the crook where the servo arm is placed into the bulkhead broke off, so I had to redesign the bulkhead so that the fillet value on the corner where the bulkhead crook broke off to a greater value. The increased value on the fillet will hopefully increase the crook’s resistance to snapping. Also I had to solder together a female XT-30 connector port to another wire that plugged into the Li-ion charger because I didn’t have the adapter. The old wire was a female XT-60 connector which didn’t work with my male XT-30 connector. I also epoxied the bungee cord connected to the nose cone to the upper body tube.
I added the avionics and avionics holder into the lower body tube of the rocket. After that I attached the top tube to the bottom. I then performed multiple drop tests testing a straight down vertical drop, lateral and vertical drop, and spinning drop. I found that the rocket performed really well on the lateral and vertical lateral drops which I’m really proud of because the landing pads were doing their jobs of absorbing the shock. However, I found that on spinning drops, the rocket had a tendency to tip over, but not enough to fall. I think reducing the angular velocity about the body tube is something that I should look out for when performing my test flights.
I installed the new avionics holder today. However, when I was testing the lower leg ring, I found a weakness in the design. The ring has snapped where the legs came into contact with it. I failed to see the issue with my previous design where the 90 degree angle that the leg platform and the ring made was a point where the 3D print was fragile and could snap easily. So, I redesigned the lower leg ring so that the is a 0.25in fillet that tapers toward 0.125in at the edge along the edge where the 3D print had previously snapped. Below is a picture of the snapped leg ring.
I replaced the lower leg ring with the improved design and I also added funtak to the bottom where the legs and ring contact. In theory, the funtak should slow down and absorb the impact/velocity of the legs before they hit the bottom. I added the funtak because in the last lower leg ring design, the velocity that the legs were coming down at snapped the platform below it....
|
1792464655.0087295
|
1793069455.0087295
|
|
67744
|
A custom cybersecurity oriented cyberdeck. by @mat A custom cybersecurity oriented cyberdeck. by @matthieu_obyrne | Stardance...
|
matthieu_obyrne
|
0
|
9.06
|
0
|
[]
|
[{"post_id": 81147, "ts": "202 [{"post_id": 81147, "ts": "2026-10-20T02:57:49Z", "hours": 0.9139, "text": "I finally added an up-to-date readme and cleared up my github"}, {"post_id": 81057, "ts": "2026-10-19T18:12:28Z", "hours": 0.8217, "text": "I updated my pcb back to the old fold version, and placed everything back on it, i think I am finally ready to print it, I also made a quick cad of the pcb that will allow me to make and design the case."}, {"post_id": 78901, "ts": "2026-10-11T23:24:19Z", "hours": 1.6881, "text": "Added a rough draft of the opensource proxmark 3 into my pcb integrated inside"}, {"post_id": 77728, "ts": "2026-10-08T03:19:34Z", "hours": 5.6342, "text": "I started working on the pcb and placing all the parts e"}]...
|
Title: A custom cybersecurity oriented cyberdeck. Title: A custom cybersecurity oriented cyberdeck. by @matthieu_obyrne | Stardance
Devlogs:
I started working on the pcb and placing all the parts e
Added a rough draft of the opensource proxmark 3 into my pcb integrated inside
I updated my pcb back to the old fold version, and placed everything back on it, i think I am finally ready to print it, I also made a quick cad of the pcb that will allow me to make and design the case.
I finally added an up-to-date readme and cleared up my github...
|
1792468250.6375535
|
1793073050.6375535
|
|
3519
|
Name That Nation by @brlin888 | Stardance
|
brlin888
|
2
|
19.87
|
262
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-17T21:15:15Z", "hours": 1.0, "multiplier": 7.33, "payout": 6, "blessing": "neutral", "text": "Hi everyone or whoever is reviewing this ship! This is my #2 ship for NameThatNation. To recap, NameThatNation is a game that allows the user to learn more about different countries through answering questions. Overall, for these couple of hours I continued to work on this project. Based on the comments from the people that reviewed on my last ship, I mainly worked on organizing the images in my panels better and adjusting the panels to be more visually appealing. If you want a better experience while playing the game, make sure to check out the settings panel where you can customize your gaming experience. For this ship, I recreated the images in my panels so that they fit the game better, so I am proud so say there was NO AI used in creating any of the images! Just a note that if you want to check out this game, make sure to go to releases or click on the “try project” button which will direct you towards the github releases. Ensure that you have download Java JDK because this entire project is coded entirely in JAVA which is an extremely technical language, so organization wise and how this game works is limited to some extent (harder to organize because need to manually run and check program each time to ensure object is placed where you want it to be and components are have a limited size by Java). Hope you have fun reviewing my ship!", "repo": "https://github.com/brlin888-create/Name-That-Nation", "demo": "https://github.com/brlin888-create/Name-That-Nation/releases/tag/v1.0.0"}, {"ship_num": 2, "ts": "2026-09-27T23:51:25Z", "hours": 18.0, "multiplier": 14.44, "payout": 256, "blessing": "neutral", "text": "Hi all, this is my ship for Name That Nation! Name That Nation is a game I thought of that tests and trains a person’s ability of naming countries based on the shape of the country (all 198 countries). The game is made completely using Java, all coded line by line, with some images being AI generated. The most challenging part of this project was actually making sure the project worked, because Java is a really technical language. One missing semicolon, and you have to go back and manually fix it. Additionally, since there are a lot of JButtons and components I had to add, the formatting depended on individually testing and organizing in order for the project to look visually aesthetic. Lastly, one of the biggest challenges was reading/writing from multiple files, since there was hundreds of country image files I had to organize, as well as ensuring that each country was actually accounted for. Overall, the testing through each individual panel allowed me to slowly build up this project as a whole. One interesting thing I added was incorporating powerups and achievements, that would incentive players to continuously play to achieve a higher score. Players can customize their gaming experience on background color, font size, difficulty, etc. in the settings panel. There are hints present, a timer present, and three lives, but by utilizing the powerups, this will boost the scores an individual can set. After gameplay, players can see what they scored wrong on, save their score to the txt file which includes (and sorts) all names, as well as see what achievements they have accomplished. This pretty much sums up my project as a whole, over 20+ hours (from image downloads to testing which was not accounted for in the Hackatime hours) as well as over 2400 lines of code. Hope whoever is reading this enjoys this project!!!", "repo": "https://github.com/brlin888-create/Name-That-Nation", "demo": "https://github.com/brlin888-create/Name-That-Nation/releases/tag/v1.0.0"}]...
|
[{"post_id": 81153, "ts": "202 [{"post_id": 81153, "ts": "2026-10-20T03:59:17Z", "hours": 0.8692, "text": "Hi everyone, i am continuing to build on my project for NameThatNation! Mainly this time focusing on organization for website as well as implementing more features and polishing my readme! also if any of you guys know when a manuel review submission for a ship will get approved, please let me know!"}, {"post_id": 78454, "ts": "2026-10-10T20:37:00Z", "hours": 0.2667, "text": "Hi all, My project got rejected again… for using AI assets. After changing the images on canva and ensuring the game still works, hopefully this time my ship will go through. If you guys want to see the new changes made to my project, feel free to check out the github for Name That Nation. Hopefully @Amu or other shipwrights will consider these new changes made as it took me over 2 hrs+ to find images and individually change the assets that were AI generated. So now I am happy to say my project does not use a single AI generated image!"}, {"post_id": 77989, "ts": "2026-10-09T03:57:33Z", "hours": 0.3039, "text": "Hi all, I have made a few changes for my project in order to fulfill the shipping request so hopefully whoever reviews my ship takes this into consideration @Jack_ . Just some further instructions on how to run my code: since I am using java in my project especially libraries that call for java JFrame and JPanel, java must be INSTALLED on the device for whoever is playing the game. In my github releases, I have updated with more clear instructions on how to download java JDK based on your device, then compiling my code. This is the only way, as converting into an executable still won’t run the code as whoever has the code doesn’t have the java libraries specific for my game pre-loaded. Thank you for reading this and hopefully my ship goes through successfully (I haven’t gotten an update in like 5 days…)!"}, {"post_id": 75771, "ts": "2026-10-01T01:34:52Z", "hours": 0.255, "text": "Hi all, I thought my project would be finished but apparently there were some issues with shipping the project. To whoever is reading this or people that judge ships, I have edited my github to have a releases zip file which can be downloaded to test out my game. You may still see the youtube video still attached for my game demo, but you can now try out the game yourself in github by retrieving the required assets. Additionally, I added more clear instructions and descriptions on NameThatNation and its properties. Hopefully you guys go check it out and take into consideration when evaluating my ship!"}, {"post_id": 74676, "ts": "2026-09-27T23:41:08Z", "hours": 0.3425, "text": "Hi all, This will be the last devlog for Name That Nation. I am so excited for you guys to see what I have been able to accomplish throughout the summer. Since NameThatNation is coded in Java completely, it CANNOT be converted into a website. I have attached a video (took 2 hours to edit) to demonstrate how the game can be played, as well as attached the source code in github. The reason that it cannot be made into a website is that it reads and writes through specific files that is not possible on a website. Additionally, Java JPanel and JFrame is not compatible with websites, meaning that I would have to code the entire game again in another programming language in order for the game to function. Today I placed my finishing touches such as incorporating the achievements panel and added final touches/testings for the entire game. This game took over 20+ hours (not shown through Hackatime) because there was more time spent on individually downloading all 198 country images and organizing files to include all countries but maintain functionality. I hope this project finds you well and thanks for those that have been following along the journey!!! Hope you guys like my project!!!"}, {"post_id": 74328, "ts": "2026-09-27T05:36:03Z", "hours": 2.78, "text": "NameThatNation!!! Hi all, for those that have been following along, there has been significant progress throughout the game. I have finally been able to get the gamepanel to work. I added powerups and different features such as lives count, hints, and changing colors on JButtons which utilizes a button listener to detect if the button clicked is correct. Although this may look simple, this project has taken me over several hours to what you see today. Java is an easy language to learn, but to implement it to this level is extremely hard, as image reading, file reading, JButtons, JCheckboxes, etc. are extremely technical and one wrong step will cause the entire program to not function. Tomorrow, I will finish the last panels which are the Achievements panel, and leaderboard panels. After that I will, post a demo of the project (as java is not compatible with online user websites and I am using read/write from files), and do my final commit before I ship my project!!! Thank you for those that have been following along!"}, {"post_id": 68387, "ts": "2026-09-15T01:24:48Z", "hours": 0.5231, "text": "What is up everyone! If you haven’t checked my last devlog, my main issue is still converting my code to a website or mainly a way for you guys to play the game without downloading the source code. I add some improvements to the game, fixing a JButton error because all of the buttons kept on lighting up when I didn’t click any of them. I also added more countries to the country info panel, so I’m pretty sure I have all 198 countries for now in the game. Next up is still fixing the website issue and adding to the game! Stay tuned for more!!!!!!!!!!!!!!"}, {"post_id": 66733, "ts": "2026-09-12T16:56:45Z", "hours": 6.6714, "text": "I know I haven’t posted a dev log for a long time… but here is it after 2 months and what I have been working on!!! After completely the country info and instructions panel, I started to work on the game panel which was definitely one of the hardest panels to complete. This is because working in Java JFrame/JPanel requires a lot of technical code to allow buttons to be clicked and change color when an answer choice is correct. Other than this, I had to download EVERY SINGLE COUNTRY’s image and add it to a folder which took over 2 hours to do (not included in the 6 hours) because I couldn’t find a website that had all of them. Other than that, the project is going extremely smoothly and I am currently working on adding different powerups that can aid the person playing the game. My only concern is converting this JFrame/JPanel game onto a demo website because the game is currently reading files from on my computer such as the images and files for instructions etc. If you guys have any suggestions, please feel free to leave it in the chat!"}, {"post_id": 25118, "ts": "2026-07-09T03:48:31Z", "hours": 0.6564, "text": "Continued to work on the project! Short Dev Log Today! finished settings and still working on instructions panel started working on game panel game hard to implement need to locate specific coordinates follow for more!"}, {"post_id": 23809, "ts": "2026-07-06T23:37:24Z", "hours": 2.2889, "text": "Hey everyone! It’s been a massive day of coding on NameThatNation. If you’ve been following along, you know the goal: a game where you look at maps/images and guess the country before the timer runs out. Today, I wired up the core skeleton for the Settings Panel, Country Info Panel, and initialized the beast that is the Game Panel. Here is exactly what went down today: The Settings Panel: I wanted players to be able to customize their UI, but things got a little chaotic in the grid layouts. The RGB Sliders: Added JSlider controls for Red, Green, and Blue. Players can dynamically alter the theme color (info.setColor). The Continents Customization: Implemented checkboxes for all 7 continents. But I had to add a hard rule in the ButtonListener: You must choose at least 3 continents before you can leave. Why? Because guessing between just the USA and Canada is too easy everyone is going to get it right… Image Size Scrollbar: Added a JScrollBar allowing players to scale the image sizes. Scroll down or up. Difficulty JMenu: A nice dropdown menu (Font.BOLD, 30) to swap between Easy, Medium, and Hard. Current Visual Bug: The continent checkboxes currently text-render in a terrifying new Color(183, 9, 9) (deep blood red) alongside a red warning label. The Country Info Panel: Players need a place to study up, so I built the CountryInfoPanel. It utilizes a try-catch block inside a custom fileIn() method to read a massive text file: countriesContinentHard.txt. It dumps all that text into a non-editable, word-wrapping JTextArea wrapped in a JScrollPane so you can scroll through hundreds of countries. The Aesthetic: On the left side, it renders a nice big sprite of planet Earth (Earth.png), while the data scrolls smoothly on the right. The Game Panel (The Brain of the Operation) Finally, I started prototyping the actual gameplay panel. It’s not fully rendered yet, but the logic infrastructure is going to be a lot! I will continue to work on this panel this week and make sure to follow along the game making!!!"}, {"post_id": 21667, "ts": "2026-07-03T19:03:46Z", "hours": 1.4492, "text": "Dev Log: Name That Nation Implementation of Core UI Panels (Start, Instructions, & Settings) Overview: Successfully built and structured the primary navigational and configuration panels for NameThatNation. Implemented Java Swing components across three core areas: the StartPanel (handling user onboarding and core navigation), the InstructionsPanel (displaying gameplay mechanics in a scrollable format), and the SettingsPanel (giving users control over gameplay parameters like difficulty, map sizes, background colors, and continent selection). Key Implementations: StartPanelUser Onboarding: Added a JTextField for name entry along with strict data validation. If the field is empty or left as default, a warning message (noName JLabel) triggers in red text, blocking gameplay progression. Animated Background: Integrated a javax.swing.Timer alongside a modified paintComponent method to alternate every 0.5 seconds between three unique world images (World1.png to World3.png), creating a smooth looping animation of a rotating Earth.CardLayout Navigation: Configured centralized action listeners (buttons and exitListener) to pass state data to the parent container, cleanly swapping panels or closing the application altogether. InstructionsPanelLayout & Scrolling: Used a BorderLayout to organize an informative overview of rules, score tallies, powerups, and level details. Scroll Mechanics: Embedded a heavy block of instruction text into a non-editable JTextArea wrapped in a JScrollPane, forcing explicit vertical navigation while keeping horizontal scrolling locked. Visual Assets: Overlaid a game preview snapshot (Game.png) on top of a custom backdrop image to give players context before starting. SettingsPanelRGB Customization: Implemented three distinct JSlider inputs (Red, Green, Blue) bound to a ColorHandler listener. This updates the player’s canvas background dynamically via the shared Information state object. Game Parameters: Combined a JScrollBar to control image scale thresholds, a JMenuBar with JMenuItem nodes for changing the match difficulty (Easy, Medium, Hard), and an array of JCheckBox fields representing all seven continents. Challenges: Absolute Layout Positioning: Managing explicit component bounds (setBounds) in the null-layout StartPanel requires highly specific coordinates that can scale poorly if window sizes are dramatically altered later. Validation Multi-threading: Syncing state requirements—such as throwing warnings when fewer than 3 continents are selected or managing name checks—requires seamless communication between panel instances and the core Information holder class. Next Steps: Enforce Continent Validation: Active counters ensuring the validation warning dynamically locks or unlocks the “Back” button if the 3-continent minimum isn’t met. Integrate Game Logic: Establish properties inside the GamePanel constructor that ingest the finalized values set by the sliders, checkboxes, and scrollbars from the configuration stage."}, {"post_id": 20985, "ts": "2026-07-02T18:41:17Z", "hours": 3.0508, "text": "Working on a game to allow people to get better at identifying countries based on the shape (will have powerups, customized settings, etc.). This project will be done in java through vscode! Feel free to give any feedback or advice on what I should add to the game. I currently only have the JPanels working for the settings panel as well as the start panel with buttons. Stay tuned for more updates!!! Issues encountered and fixed: panel switching setting JButtons in settings panel layouts -> placing components in the right location"}]...
|
Title: Name That Nation by @brlin888 | Stardance
Title: Name That Nation by @brlin888 | Stardance
Devlogs:
Working on a game to allow people to get better at identifying countries based on the shape (will have powerups, customized settings, etc.). This project will be done in java through vscode! Feel free to give any feedback or advice on what I should add to the game. I currently only have the JPanels working for the settings panel as well as the start panel with buttons. Stay tuned for more updates!!! Issues encountered and fixed: panel switching setting JButtons in settings panel layouts -> placing components in the right location
Dev Log: Name That Nation Implementation of Core UI Panels (Start, Instructions, & Settings) Overview: Successfully built and structured the primary navigational and configuration panels for NameThatNation. Implemented Java Swing components across three core areas: the StartPanel (handling user onboarding and core navigation), the InstructionsPanel (displaying gameplay mechanics in a scrollable format), and the SettingsPanel (giving users control over gameplay parameters like difficulty, map sizes, background colors, and continent selection). Key Implementations: StartPanelUser Onboarding: Added a JTextField for name entry along with strict data validation. If the field is empty or left as default, a warning message (noName JLabel) triggers in red text, blocking gameplay progression. Animated Background: Integrated a javax.swing.Timer alongside a modified paintComponent method to alternate every 0.5 seconds between three unique world images (World1.png to World3.png), creating a smooth looping animation of a rotating Earth.CardLayout Navigation: Configured centralized action listeners (buttons and exitListener) to pass state data to the parent container, cleanly swapping panels or closing the application altogether. InstructionsPanelLayout & Scrolling: Used a BorderLayout to organize an informative overview of rules, score tallies, powerups, and level details. Scroll Mechanics: Embedded a heavy block of instruction text into a non-editable JTextArea wrapped in a JScrollPane, forcing explicit vertical navigation while keeping horizontal scrolling locked. Visual Assets: Overlaid a game preview snapshot (Game.png) on top of a custom backdrop image to give players context before starting. SettingsPanelRGB Customization: Implemented three distinct JSlider inputs (Red, Green, Blue) bound to a ColorHandler listener. This updates the player’s canvas background dynamically via the shared Information state object. Game Parameters: Combined a JScrollBar to control image scale thresholds, a JMenuBar with JMenuItem nodes for changing the match difficulty (Easy, Medium, Hard), and an array of JCheckBox fields representing all seven continents. Challenges: Absolute Layout Positioning: Managing explicit component bounds (setBounds) in the null-layout StartPanel requires highly specific coordinates that can scale poorly if window sizes are dramatically altered later. Validation Multi-threading: Syncing state requirements—such as throwing warnings when fewer than 3 continents are selected or managing name checks—requires seamless communication between panel instances and the core Information holder class. Next Steps: Enforce Continent Validation: Active counters ensuring the validation warning dynamically locks or unlocks the “Back” button if the 3-continent minimum isn’t met. Integrate Game Logic: Establish properties inside the GamePanel constructor that ingest the finalized values set by the sliders, checkboxes, and scrollbars from the configuration stage.
Hey everyone! It’s been a massive day of coding on NameThatNation. If you’ve been following along, you know the goal: a game where you look at maps/images and guess the country before the timer runs out. Today, I wired up the core skeleton for the Settings Panel, Country Info Panel, and initialized the beast that is the Game Panel. Here is exactly what went down today: The Settings Panel: I wanted players to be able to customize their UI, but things got a little chaotic in the grid layouts. The RGB Sliders: Added JSlider controls for Red, Green, and Blue. Players can dynamically alter the theme color (info.setColor). The Continents Customization: Implemented checkboxes for all 7 continents. But I had to add a hard rule in the ButtonListener: You must choose at least 3 continents before you can leave. Why? Because guessing between just the USA and Canada is too easy everyone is going to get it right… Image Size Scrollbar: Added a JScrollBar allowing players to scale the image sizes. Scroll down or up. Difficulty JMenu: A nice dropdown menu (Font.BOLD, 30) to swap between Easy, Medium, and Hard. Current Visual Bug: The continent checkboxes currently text-render in a terrifying new Color(183, 9, 9) (deep blood red) alongside a red warning label. The Country Info Panel: Players need a place to study up, so I built the CountryInfoPanel. It utilizes a try-catch block inside a custom fileIn() method to read a massive text file: countriesContinentHard.txt. It dumps all that text into a non-editable, word-wrapping JTextArea wrapped in a JScrollPane so you can scroll through hundreds of countries. The Aesthetic: On the left side, it renders a nice big sprite of planet Earth (Earth.png), while the data scrolls smoothly on the right. The Game Panel (The Brain of the Operation) Finally, I started prototyping the actual gameplay panel. It’s not fully rendered yet, but the logic infrastructure is going to be a lot! I will continue to work on this panel this week and make sure to follow along the game making!!!
Continued to work on the project! Short Dev Log Today! finished settings and still working on instructions panel started working on game panel game hard to implement need to locate specific coordinates follow for more!
I know I haven’t posted a dev log for a long time… but here is it after 2 months and what I have been working on!!! After completely the country info and instructions panel, I started to work on the game panel which was definitely one of the hardest panels to complete. This is because working in Java JFrame/JPanel requires a lot of technical code to allow buttons to be clicked and change color when an answer choice is correct. Other than this, I had to download EVERY SINGLE COUNTRY’s image and add it to a folder which took over 2 hours to do (not included in the 6 hours) because I couldn’t find a website that had all of them. Other than that, the project is going extremely smoothly and I am currently working on adding different powerups that can aid the person playing the game. My only concern is converting this JFrame/JPanel game onto a demo website because the game is currently reading files from on my computer such as the images and files for instructions etc. If you guys have any suggestions, please feel free to leave it in the chat!
What is up everyone! If you haven’t checked my last devlog, my main issue is still converting my code to a website or mainly a way for you guys to play the game without downloading the source code. I add some improvements to the game, fixing a JButton error because all of the buttons kept on lighting up when I didn’t click any of them. I also added more countries to the country info panel, so I’m pretty sure I have all 198 countries for now in the game. Next up is still fixing the website issue and adding to the game! Stay tuned for more!!!!!!!!!!!!!!
NameThatNation!!! Hi all, for those that have been following along, there has been significant progress throughout the game. I have finally been able to get the gamepanel to work. I added powerups and different features such as lives count, hints, and changing colors on JButtons which utilizes a button listener to detect if the button clicked is correct. Although this may look simple, this project has taken me over several hours to what you see today. Java is an easy language to learn, but to implement it to this level is extremely hard, as image reading, file reading, JButtons, JCheckboxes, etc. are extremely technical and one wrong step will cause the entire program to not function. Tomorrow, I will finish the last panels which are the Achievements panel, and leaderboard panels. After that I will, post a demo of the project (as java is not compatible with online user websites and I am using read/write from files), and do my final commit before I ship my project!!! Thank you for those that have been following along!
Hi all, This will be the last devlog for Name That Nation. I am so excited for you guys to see what I have been able to accomplish throughout the summer. Since NameThatNation is coded in Java completely, it CANNOT be converted into a website. I have attached a video (took 2 hours to edit) to demonstrate how the game can be played, as well as attached the source code in github. The reason that it cannot be made into a website is that it reads and writes through specific files that is not possible on a website. Additionally, Java JPanel and JFrame is not compatible with websites, meaning that I would have to code the entire game again in another programming language in order for the game to function. Today I placed my finishing touches such as incorporating the achievements panel and added final touches/testings for the entire game. This game took over 20+ hours (not shown through Hackatime) because there was more time spent on individually downloading all 198 country images and organizing files to include all countries but maintain functionality. I hope this project finds you well and thanks for those that have been following along the journey!!! Hope you guys like my project!!!
Hi all, I thought my project would be finished but apparently there were some issues with shipping the project. To whoever is reading this or people that judge ships, I have edited my github to have a releases zip file which can be downloaded to test out my game. You may still see the youtube video still attached for my game demo, but you can now try out the game yourself in github by retrieving the required assets. Additionally, I added more clear instructions and descriptions on NameThatNation and its properties. Hopefully you guys go check it out and take into consideration when evaluating my ship!
Hi all, I have made a few changes for my project in order to fulfill the shipping request so hopefully whoever reviews my ship takes this into consideration @Jack_ . Just some further instructions on how to run my code: since I am using java in my project especially libraries that call for java JFrame and JPanel, java must be INSTALLED on the device for whoever is playing the game. In my github releases, I have updated with more clear instructions on how to download java JDK based on your device, then compiling my code. This is the only way, as converting into an executable still won’t run the code as whoever has the code doesn’t have the java libraries specific for my game pre-loaded. Thank you for reading this and hopefully my ship goes through successfully (I haven’t gotten an update in like 5 days…)!
Hi all, My project got rejected again… for using AI assets. After changing the images on canva and ensuring the game still works, hopefully this time my ship will go through. If you guys want to see the new changes made to my project, feel free to check out the github for Name That Nation. Hopefully @Amu or other shipwrights will consider these new changes made as it took me over 2 hrs+ to find images and individually change the assets that were AI generated. So now I am happy to say my project does not use a single AI generated image!
Hi everyone, i am continuing to build on my project for NameThatNation! Mainly this time focusing on organization for website as well as implementing more features and polishing my readme! also if any of you guys know when a manuel review submission for a ship will get approved, please let me know!
Ships:
Hi all, this is my ship for Name That Nation! Name That Nation is a game I thought of that tests and trains a person’s ability of naming countries based on the shape of the country (all 198 countries). The game is made completely using Java, all coded line by line, with some images being AI generated. The most challenging part of this project was actually making sure the project worked, because Java is a really technical language. One missing semicolon, and you have to go back and manually fix it. Additionally, since there are a lot of JButtons and components I had to add, the formatting depended on individually testing and organizing in order for the project to look visually aesthetic. Lastly, one of the biggest challenges was reading/writing from multiple files, since there was hundreds of country image files I had to organize, as well as ensuring that each country was actually accounted for. Overall, the testing through each individual panel allowed me to slowly build up this project as a whole. One interesting thing I added was incorporating powerups and achievements, that would incentive players to continuously play to achieve a higher score. Players can customize their gaming experience on background color, font size, difficulty, etc. in the settings panel. There are hints present, a timer present, and three lives, but by utilizing the powerups, this will boost the scores an individual can set. After gameplay, players can see what they scored wrong on, save their score to the txt file which includes (and sorts) all names, as well as see what achievements they have accomplished. This pretty much sums up my project as a whole, over 20+ hours (from image downloads to testing which was not accounted for in the Hackatime hours) as well as over 2400 lines of code. Hope whoever is reading this enjoys this project!!!
Hi everyone or whoever is reviewing this ship! This is my #2 ship for NameThatNation. To recap, NameThatNation is a game that allows the user to learn more about different countries through answering questions. Overall, for these couple of hours I continued to work on this project. Based on the comments from the people that reviewed on my last ship, I mainly worked on organizing the images in my panels better and adjusting the panels to be more visually appealing. If you want a better experience while playing the game, make sure to check out the settings panel where you can customize your gaming experience. For this ship, I recreated the images in my panels so that they fit the game better, so I am proud so say there was NO AI used in creating any of the images! Just a note that if you want to check out this game, make sure to go to releases or click on the “try project” button which will direct you towards the github releases. Ensure that you have download Java JDK because this entire project is coded entirely in JAVA which is an extremely technical language, so organization wise and how this game works is limited to some extent (harder to organize because need to manually run and check program each time to ensure object is placed where you want it to be and components are have a limited size by Java). Hope you have fun reviewing my ship!...
|
1792853475.5860295
|
1792939875.5860295
|
|
55524
|
Oi Site by @oishani | Stardance
|
oishani
|
0
|
2.73
|
0
|
[]
|
[{"post_id": 81158, "ts": "202 [{"post_id": 81158, "ts": "2026-10-20T04:22:46Z", "hours": 2.7278, "text": "First I was just making a simple link tree, then started playing around and adding new style elements. I plan to make it more of a real personal website now too, adding like a bio and interests and actual stuff about me."}]...
|
Title: Oi Site by @oishani | Stardance
Devlogs:
F Title: Oi Site by @oishani | Stardance
Devlogs:
First I was just making a simple link tree, then started playing around and adding new style elements. I plan to make it more of a real personal website now too, adding like a bio and interests and actual stuff about me....
|
1792500592.2460642
|
1793105392.2460642
|
|
2693
|
Stitch-Craft by @Peneroni | Stardance
|
Peneroni
|
1
|
44.0
|
798
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T04:42:02Z", "hours": 44.0, "multiplier": 17.93, "payout": 798, "blessing": "neutral", "text": "#Welcome to Stitch-Craft! Work in a dying costume shop with Dennis the costume designer as you build, pull, and buy new costumes. There are many ways to house and attain costumes, and it’s your job to do just that! This is my passion project that I’ve been working on for the past several and I’m ver excited to share the beginnings of it with you all! My mom gave me the idea because she works in a costume shop, and we both thought it would be a fun game to play. One thing to note that this is an early ship of the MVP I set for myself. Most of the assets are placeholders, you can’t fully make costumes and submit them for a show yet, and not all features that I plan to add are in the game yet. I wanted to ship what I have so far, which is the system of how you gain costumes in the dysfunctional costume shop of yours. Currently you can go through the tutorial with Dennis, play the sewing minigame for costumes, buy costumes, and store your costumes in the storage. This is what I shipped, and I hope you enjoy!", "repo": "https://github.com/Penn-the-Great/Stitch-Craft", "demo": "https://peneroni.itch.io/stitch-craft"}]...
|
[{"post_id": 81159, "ts": "202 [{"post_id": 81159, "ts": "2026-10-20T04:29:34Z", "hours": 1.5197, "text": "Build bugs and ship I know I said the last devlog would be the last one, but as expected there were a few last bugs, especially with rendering. There were lots of sizing bugs and technical Unity bugs, and I also had to get the Unity web building package and configure it to how I wanted. BUT, the biggest change is that I got my game on Itch, and I finally shipped! Main changes: Optimization and sizing bugs Added game to Itch.io SHIPPED"}, {"post_id": 81141, "ts": "2026-10-20T02:13:05Z", "hours": 3.3975, "text": "Tutorial and finishing touches The tutorial was created, and you can go around each of the rooms where Dennis will explain each of the features. The tutorial dialogue will also only appear ONCE, which took me forever to figure out. I also added some actual words to the end of the timer/weeks, and its just a thank you message to all who played the beta/demo with some buttons to return to title or quit. Some other smaller changes is I added some text to the Slamazon website to be a placeholder logo, I also changed the chapter select background, which used to be the picture of that cat eating chips in the distance of the windows xp wallpaper. I’m so excited because I think I have an MVP to ship, and it has been a very long journey. One thing I had to accept before shipping was that I was never going to get the full chapter 1 shipped in time for Stardance like I wanted it to be, which is okay. I was hoping for all the assets to be done in time, but there was still so much to do and no time to do it, and unfortunately the submission part of my game relied on having all of the mannequin assets done. My solution to this was to just have the demo be about exploring the clothing system and exploring the costume shop, and like someone once told me, it doesn’t have to look good to be good. However, I will not stop working on Stitch-Craft after Stardance is over, and I fully intend to keep adding and improving the game as much as I can. Thank you to all who have liked my devlogs and shown your support for my game and its progress. Main changes: Tutorial added that shows player around the shop Slight cosmetic changes to placeholders and other missing assets Completed MVP"}, {"post_id": 81089, "ts": "2026-10-19T20:37:54Z", "hours": 2.4767, "text": "Dialogue, cleaning, and more The dialogue system is finally in place! The player can now go down different dialogue “paths”, allowing them to choose between 2 options. I was also going back and cleaning up some of my older codes a little bit when I realized that not a single one had been commented. It was at that moment that I hated my entire existence and this whole project because I made one of the biggest mistakes of this whole thing. I had also not learned about commenting at all until I took a computer programming class this year, and that my video game development teacher last year did not teach us about commenting, and now I can’t remember how half of the code works. If any of you have any suggestions on how to go about this, that would be very helpful! There have also been small updates to assets as I am getting ready to ship. There are just a few things left to do to get the MVP since most finalized assets will not be finished by the time I ship, so I think the demo will just be an exploration of the clothing system. I’m expecting one more devlog, and the stitchcraft demo will be shipped! Main changes: Dialogue system with options and branching dialogue Code has been cleaned a little Final touches for shipping"}, {"post_id": 63920, "ts": "2026-09-07T23:26:53Z", "hours": 4.2289, "text": "Mannequin Assets! New assets for the mannequin, money/time labels, info panel, and other buttons. There were bugs, bugs, and many more bugs, especially with getting the sprites to show up, which was somewhat caused by me trying to use SVGs, but ultimately falling back to PNGs for now. Special thanks to my amazing mother for helping me create the mannequin assets, and my amazing father for teaching me how to use Figma. The tops now have basic assets (to be updated and more added later) that snap onto the mannequin, and can be taken off in a similar fashion (hehe, fashion) to the storage room. Some other bug fixes were making sure the purchasing system works completely, and slamazon looks good. Main changes: The clothing pieces have assets and are aligned with the mannequin New UI assets all around Slamazon delivery system bug fixes"}, {"post_id": 63687, "ts": "2026-09-07T16:52:49Z", "hours": 3.8639, "text": "Settings Overhaul I changed the settings’ visual look. Before, there was mostly placeholder images, placeholder sliders, and placeholder fonts. So I did some work in Figma, and lots of troubleshooting with the code to create the spinning pattern. My biggest challenge was that I was originally going to have the pattern slowly moving off screen to look like an infinite stream of icons, but I decided not to and to just have them spin slowly in place. This is the finished product, and more visual updates to all other screens to come! Main changes: Spinning icon pattern in the background of the settings New font chosen for most of the game UI style chosen and developed final settings UI"}, {"post_id": 30341, "ts": "2026-07-17T20:20:26Z", "hours": 4.4286, "text": "Submission system created Now you can submit costumes to the required amount for a chapter. You can put costumes on, and take them off with very similar logic as the storage system. You can only submit when the minimum requirement of a top and bottom, or full piece, is met. The image below is the layout of the UI. Everything is currently placeholders, which the rest of the project will be mostly a lot of drawing assets, so the demo is close to being ready! Main changes: Requirement costume amount added Clothing pieces can be placed as a child of the mannequin Clothing pieces can be sumitted towards the final costume count"}, {"post_id": 12889, "ts": "2026-06-21T03:34:51Z", "hours": 2.4853, "text": "Cosmetic minigame updates I made some cosmetic minigame updates to really finalize it. The different phases now slide into each other making a really nice looking transition. I also did tons of bug fixes around the actual creation of the final clothing piece, especially with canvases and canvas types. My main bug I had to fix was the workspace canvas being visible, but setting it as inactive made the hanger object spawn on the wrong canvas die to incorrect references, however, the problem was solved by using alpha values instead of setting the worspace canvas as inactive. The minigames look plain right now, but I will put animated backgrounds to show the different settings (like cutting out fabric, sewing, and ironing). Main changes: Sliding transitions between minigame phases Workspace canvas disappears during minigames Clothing piece confirmed to spawn after minigames with correct grade"}, {"post_id": 12221, "ts": "2026-06-19T22:59:05Z", "hours": 2.6964, "text": "Minigame updates! I made some updates to the minigame system. I mostly added things to the version from the last devlog. The line renderer shows up now, but I had to make it disconnected from the accuracy, so it’s purely cosmetic. The second phase is a timing minigame where you have to click the slider at the right time, and I changed it from a horizontal orientation to vertical. The buttons in phase 3 got a slight timing update and little steam puffs, which the video below is of that working. The last thing I updated was make the flow of starting and ending the minigame nice with the start minigame button. Main updates: Line renderer fixed Small cosmetic changes to phases 2 and 3 Minigames can be started with the start minigame button"}, {"post_id": 11410, "ts": "2026-06-18T17:53:30Z", "hours": 3.8108, "text": "Remade the minigame system. It comes in 3 phases still, and accuracy can be calculated. I had to take a pretty long break after the first attempt at the minigames because I got so burnt out from how badly the last one turned out, but I persist. My main struggle with this update was trying to get the line renderer to work, which I am still working on. The picture below is a look at what the first phase will look like, I’ll probably add more cosmetic changes later when I’m focusing on assets near the end of the game. Main changes Remade base minigames system 3 phases can be played, and accuracy is deducted Added a few more placeholder assets"}, {"post_id": 2556, "ts": "2026-06-05T03:19:02Z", "hours": 3.45, "text": "First minigame system I created a sewing system with a series of 3 mini games to cut, sew, and press costumes. Unfortunately it doesn’t run very smoothly, and I am unable to get a screenshot of it working. I am going to overhaul it later, but it’s good for getting the idea of what I want the mini games to be. The image below is what the main pattern picking UI will look like. Main changes: Made fabric a currency to use in sewing Made sewing draft games Made a few new assets"}, {"post_id": 2361, "ts": "2026-06-04T20:18:29Z", "hours": 2.135, "text": "Currency system I created a currency system for my game! It includes a storefront that refreshes every week to buy clothing pieces and fabric (which will come into play later) which get delivered to your storage after the amount of weeks it takes to deliver. The deliveries also show up in a calendar on the desk. Once again, it was a little bit of a struggle to get items to keep references across scenes and on start, but I figured it out. Everything is mostly placeholders right now, but that will change in the future. Main changes: Currency system created using unity gaming services Storefront created to refresh with new clothes to buy every week Calendar shows pending deliveries Completed deliveries get sent to the storage as a draggable hanger object to use Budget for each chapter gets set at the beginning, which players use to spend"}, {"post_id": 1797, "ts": "2026-06-04T00:26:59Z", "hours": 2.9922, "text": "Storage system I made a storage system for my hanger objects with a sorting system. The hardest part was making the hangers move from one canvas to another canvas on another scene. The hangers also kept spawning in all the wrong places, and there was a lot of scene management bugs. But, it works smoothly now as seen in the demo below. Main changes : Created storage system that moves hangers from player’s canvas to storage canvas in separate scene Hangers keep their properties when stored, and stay in storage when player loads and unloads scene Sorting system sorts the clothes in storage by attributes"}, {"post_id": 1280, "ts": "2026-06-03T05:15:27Z", "hours": 6.6208, "text": "Timer system I added a timer system in weeks for each chapter. I also updated my navigation system to support additive scenes rather than single scenes to preserve references. I also made sure that the timer worked for free play mode as well as the chapters. I ran into a lot of bugs with the scene logic, especially trying to get additive scenes to unload. However, I figured it out and it works nicely."}, {"post_id": 428, "ts": "2026-06-01T20:38:44Z", "hours": 0.3897, "text": "First official devlog! My progress before this includes a design document, I made most scenes that I anticipate will be used, made a navigation logic with a fader for smooth transitions, a few icons and visuals (I attached the title for now to this devlog), and a system to create hangers with data like clothing type, material, color, etc. There was a lot of unnecessary bugs that could’ve been avoided easily, but I learned a lot from them. All this to say that updates will be more recorded from now on."}]...
|
Title: Stitch-Craft by @Peneroni | Stardance
Devl Title: Stitch-Craft by @Peneroni | Stardance
Devlogs:
First official devlog! My progress before this includes a design document, I made most scenes that I anticipate will be used, made a navigation logic with a fader for smooth transitions, a few icons and visuals (I attached the title for now to this devlog), and a system to create hangers with data like clothing type, material, color, etc. There was a lot of unnecessary bugs that could’ve been avoided easily, but I learned a lot from them. All this to say that updates will be more recorded from now on.
Timer system I added a timer system in weeks for each chapter. I also updated my navigation system to support additive scenes rather than single scenes to preserve references. I also made sure that the timer worked for free play mode as well as the chapters. I ran into a lot of bugs with the scene logic, especially trying to get additive scenes to unload. However, I figured it out and it works nicely.
Storage system I made a storage system for my hanger objects with a sorting system. The hardest part was making the hangers move from one canvas to another canvas on another scene. The hangers also kept spawning in all the wrong places, and there was a lot of scene management bugs. But, it works smoothly now as seen in the demo below. Main changes : Created storage system that moves hangers from player’s canvas to storage canvas in separate scene Hangers keep their properties when stored, and stay in storage when player loads and unloads scene Sorting system sorts the clothes in storage by attributes
Currency system I created a currency system for my game! It includes a storefront that refreshes every week to buy clothing pieces and fabric (which will come into play later) which get delivered to your storage after the amount of weeks it takes to deliver. The deliveries also show up in a calendar on the desk. Once again, it was a little bit of a struggle to get items to keep references across scenes and on start, but I figured it out. Everything is mostly placeholders right now, but that will change in the future. Main changes: Currency system created using unity gaming services Storefront created to refresh with new clothes to buy every week Calendar shows pending deliveries Completed deliveries get sent to the storage as a draggable hanger object to use Budget for each chapter gets set at the beginning, which players use to spend
First minigame system I created a sewing system with a series of 3 mini games to cut, sew, and press costumes. Unfortunately it doesn’t run very smoothly, and I am unable to get a screenshot of it working. I am going to overhaul it later, but it’s good for getting the idea of what I want the mini games to be. The image below is what the main pattern picking UI will look like. Main changes: Made fabric a currency to use in sewing Made sewing draft games Made a few new assets
Remade the minigame system. It comes in 3 phases still, and accuracy can be calculated. I had to take a pretty long break after the first attempt at the minigames because I got so burnt out from how badly the last one turned out, but I persist. My main struggle with this update was trying to get the line renderer to work, which I am still working on. The picture below is a look at what the first phase will look like, I’ll probably add more cosmetic changes later when I’m focusing on assets near the end of the game. Main changes Remade base minigames system 3 phases can be played, and accuracy is deducted Added a few more placeholder assets
Minigame updates! I made some updates to the minigame system. I mostly added things to the version from the last devlog. The line renderer shows up now, but I had to make it disconnected from the accuracy, so it’s purely cosmetic. The second phase is a timing minigame where you have to click the slider at the right time, and I changed it from a horizontal orientation to vertical. The buttons in phase 3 got a slight timing update and little steam puffs, which the video below is of that working. The last thing I updated was make the flow of starting and ending the minigame nice with the start minigame button. Main updates: Line renderer fixed Small cosmetic changes to phases 2 and 3 Minigames can be started with the start minigame button
Cosmetic minigame updates I made some cosmetic minigame updates to really finalize it. The different phases now slide into each other making a really nice looking transition. I also did tons of bug fixes around the actual creation of the final clothing piece, especially with canvases and canvas types. My main bug I had to fix was the workspace canvas being visible, but setting it as inactive made the hanger object spawn on the wrong canvas die to incorrect references, however, the problem was solved by using alpha values instead of setting the worspace canvas as inactive. The minigames look plain right now, but I will put animated backgrounds to show the different settings (like cutting out fabric, sewing, and ironing). Main changes: Sliding transitions between minigame phases Workspace canvas disappears during minigames Clothing piece confirmed to spawn after minigames with correct grade
Submission system created Now you can submit costumes to the required amount for a chapter. You can put costumes on, and take them off with very similar logic as the storage system. You can only submit when the minimum requirement of a top and bottom, or full piece, is met. The image below is the layout of the UI. Everything is currently placeholders, which the rest of the project will be mostly a lot of drawing assets, so the demo is close to being ready! Main changes: Requirement costume amount added Clothing pieces can be placed as a child of the mannequin Clothing pieces can be sumitted towards the final costume count
Settings Overhaul I changed the settings’ visual look. Before, there was mostly placeholder images, placeholder sliders, and placeholder fonts. So I did some work in Figma, and lots of troubleshooting with the code to create the spinning pattern. My biggest challenge was that I was originally going to have the pattern slowly moving off screen to look like an infinite stream of icons, but I decided not to and to just have them spin slowly in place. This is the finished product, and more visual updates to all other screens to come! Main changes: Spinning icon pattern in the background of the settings New font chosen for most of the game UI style chosen and developed final settings UI
Mannequin Assets! New assets for the mannequin, money/time labels, info panel, and other buttons. There were bugs, bugs, and many more bugs, especially with getting the sprites to show up, which was somewhat caused by me trying to use SVGs, but ultimately falling back to PNGs for now. Special thanks to my amazing mother for helping me create the mannequin assets, and my amazing father for teaching me how to use Figma. The tops now have basic assets (to be updated and more added later) that snap onto the mannequin, and can be taken off in a similar fashion (hehe, fashion) to the storage room. Some other bug fixes were making sure the purchasing system works completely, and slamazon looks good. Main changes: The clothing pieces have assets and are aligned with the mannequin New UI assets all around Slamazon delivery system bug fixes
Dialogue, cleaning, and more The dialogue system is finally in place! The player can now go down different dialogue “paths”, allowing them to choose between 2 options. I was also going back and cleaning up some of my older codes a little bit when I realized that not a single one had been commented. It was at that moment that I hated my entire existence and this whole project because I made one of the biggest mistakes of this whole thing. I had also not learned about commenting at all until I took a computer programming class this year, and that my video game development teacher last year did not teach us about commenting, and now I can’t remember how half of the code works. If any of you have any suggestions on how to go about this, that would be very helpful! There have also been small updates to assets as I am getting ready to ship. There are just a few things left to do to get the MVP since most finalized assets will not be finished by the time I ship, so I think the demo will just be an exploration of the clothing system. I’m expecting one more devlog, and the stitchcraft demo will be shipped! Main changes: Dialogue system with options and branching dialogue Code has been cleaned a little Final touches for shipping
Tutorial and finishing touches The tutorial was created, and you can go around each of the rooms where Dennis will explain each of the features. The tutorial dialogue will also only appear ONCE, which took me forever to figure out. I also added some actual words to the end of the timer/weeks, and its just a thank you message to all who played the beta/demo with some buttons to return to title or quit. Some other smaller changes is I added some text to the Slamazon website to be a placeholder logo, I also changed the chapter select background, which used to be the picture of that cat eating chips in the distance of the windows xp wallpaper. I’m so excited because I think I have an MVP to ship, and it has been a very long journey. One thing I had to accept before shipping was that I was never going to get the full chapter 1 shipped in time for Stardance like I wanted it to be, which is okay. I was hoping for all the assets to be done in time, but there was still so much to do and no time to do it, and unfortunately the submission part of my game relied on having all of the mannequin assets done. My solution to this was to just have the demo be about exploring the clothing system and exploring the costume shop, and like someone once told me, it doesn’t have to look good to be good. However, I will not stop working on Stitch-Craft after Stardance is over, and I fully intend to keep adding and improving the game as much as I can. Thank you to all who have liked my devlogs and shown your support for my game and its progress. Main changes: Tutorial added that shows player around the shop Slight cosmetic changes to placeholders and other missing assets Completed MVP
Build bugs and ship I know I said the last devlog would be the last one, but as expected there were a few last bugs, especially with rendering. There were lots of sizing bugs and technical Unity bugs, and I also had to get the Unity web building package and configure it to how I wanted. BUT, the biggest change is that I got my game on Itch, and I finally shipped! Main changes: Optimization and sizing bugs Added game to Itch.io SHIPPED
Ships:
#Welcome to Stitch-Craft! Work in a dying costume shop with Dennis the costume designer as you build, pull, and buy new costumes. There are many ways to house and attain costumes, and it’s your job to do just that! This is my passion project that I’ve been working on for the past several and I’m ver excited to share the beginnings of it with you all! My mom gave me the idea because she works in a costume shop, and we both thought it would be a fun game to play. One thing to note that this is an early ship of the MVP I set for myself. Most of the assets are placeholders, you can’t fully make costumes and submit them for a show yet, and not all features that I plan to add are in the game yet. I wanted to ship what I have so far, which is the system of how you gain costumes in the dysfunctional costume shop of yours. Currently you can go through the tutorial with Dennis, play the sewing minigame for costumes, buy costumes, and store your costumes in the storage. This is what I shipped, and I hope you enjoy!...
|
1792723760.1957817
|
1792810160.1957817
|
|
68695
|
rp - raspberry pi pico dev tui by @neset | Stardan rp - raspberry pi pico dev tui by @neset | Stardance...
|
neset
|
0
|
13.48
|
0
|
[]
|
[{"post_id": 81161, "ts": "202 [{"post_id": 81161, "ts": "2026-10-20T04:40:44Z", "hours": 1.9253, "text": "you can now live reload your config and it wont crash! i also cleaned up a ton of code. and refactored a lot. todo: allow u to resize window makefile for compiling the project readme emulator??? make it very pretty and informative with ascii art !"}, {"post_id": 80004, "ts": "2026-10-15T21:55:58Z", "hours": 1.7744, "text": "refactored a little bit of Runner to make it more consistent. changed the actions to a parsed json rather than hardcoded to make it easier for others to use rp, and so that its easier down the line"}, {"post_id": 79416, "ts": "2026-10-13T21:34:31Z", "hours": 2.3903, "text": "took a TON of time and learning but i made a new file and some new methods in order to accurately display status! it updates independently every second, rather than every loop. and, everything there is actual information, nothing pre-written! todo: bug fix make the ui more interactive and user-friendly add more commands idk"}, {"post_id": 79229, "ts": "2026-10-13T03:45:24Z", "hours": 1.0331, "text": "wrote a TON of code in order to get to this point. drawing the status lines is now halfway there (there’s front end but no back end). i also implemented it in such a way that (hopefully) making this look pretty wont mean rewriting a lot of code. onto writing the functionality!"}, {"post_id": 78867, "ts": "2026-10-11T20:16:07Z", "hours": 0.2778, "text": "added a stop command which allows me to stop a command that i ran from the tui!"}, {"post_id": 78261, "ts": "2026-10-10T06:01:57Z", "hours": 1.0844, "text": "commands now run in their own thread! this makes sure that i cant run multiple commands on the pico at the same time."}, {"post_id": 78227, "ts": "2026-10-10T01:13:07Z", "hours": 0.3317, "text": "finally have commands running with their output!"}, {"post_id": 78219, "ts": "2026-10-10T00:35:38Z", "hours": 0.6278, "text": "moved everything into their own files, to keep stuff more organized. learned what .hpp is. now i can move on to actually making it functional !!!"}, {"post_id": 78186, "ts": "2026-10-09T22:13:07Z", "hours": 1.3733, "text": "did a lot of backend changes! i added a lot of error handling, changed the terminal and each section to classes, and added colors. i also added titles to each section."}, {"post_id": 78155, "ts": "2026-10-09T20:14:10Z", "hours": 1.2611, "text": "i made a vector with actions and keybinds to each of those actions! i can also go up and down with arrow keys and use enter or spacebar to select that action. i also made one of my windows into logs, and made sure that it only shows the latest lines!"}, {"post_id": 77982, "ts": "2026-10-09T03:07:26Z", "hours": 1.4008, "text": "learning c++ asw as how to make a tui! i made something that splits my windows into 3, outputs a changing variable (time), and takes my keyboard inputs and does stuff with them! im hoping to learn more UI and then start on the actual functionality."}]...
|
Title: rp - raspberry pi pico dev tui by @neset | Title: rp - raspberry pi pico dev tui by @neset | Stardance
Devlogs:
learning c++ asw as how to make a tui! i made something that splits my windows into 3, outputs a changing variable (time), and takes my keyboard inputs and does stuff with them! im hoping to learn more UI and then start on the actual functionality.
i made a vector with actions and keybinds to each of those actions! i can also go up and down with arrow keys and use enter or spacebar to select that action. i also made one of my windows into logs, and made sure that it only shows the latest lines!
did a lot of backend changes! i added a lot of error handling, changed the terminal and each section to classes, and added colors. i also added titles to each section.
moved everything into their own files, to keep stuff more organized. learned what .hpp is. now i can move on to actually making it functional !!!
finally have commands running with their output!
commands now run in their own thread! this makes sure that i cant run multiple commands on the pico at the same time.
added a stop command which allows me to stop a command that i ran from the tui!
wrote a TON of code in order to get to this point. drawing the status lines is now halfway there (there’s front end but no back end). i also implemented it in such a way that (hopefully) making this look pretty wont mean rewriting a lot of code. onto writing the functionality!
took a TON of time and learning but i made a new file and some new methods in order to accurately display status! it updates independently every second, rather than every loop. and, everything there is actual information, nothing pre-written! todo: bug fix make the ui more interactive and user-friendly add more commands idk
refactored a little bit of Runner to make it more consistent. changed the actions to a parsed json rather than hardcoded to make it easier for others to use rp, and so that its easier down the line
you can now live reload your config and it wont crash! i also cleaned up a ton of code. and refactored a lot. todo: allow u to resize window makefile for compiling the project readme emulator??? make it very pretty and informative with ascii art !...
|
1792472085.9788766
|
1793076885.9788766
|
|
48213
|
Level Up by @Lalith | Stardance
|
Lalith
|
4
|
78.0
|
654
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T05:23:19Z", "hours": 9.0, "multiplier": 12.16, "payout": 112, "blessing": "neutral", "text": "Shipped LevelUp! It started as a way to make a long self-development video easier to read. Now it has 28 chapters, practical plans, habits, focus timers, and a daily mission system. You can save an idea from a chapter and actually try it instead of forgetting it five minutes later. Milo is the little companion that reacts to your reading and focus activity. Everything important works locally, without an account or trackers. There’s also an offline progress system called Nexus, which handles changes across tabs and lets you move progress using encrypted files. This update mostly brought the different parts together. I fixed mobile layouts, added larger text and a quick tutorial, and made backups include the newer features. Cloud chat still needs work, and the app could be simpler, but the full version is live now. Try it: https://hustlenix.github.io/LevelUp/", "repo": "https://github.com/Hustlenix/LevelUp", "demo": "https://hustlenix.github.io/LevelUp/"}, {"ship_num": 2, "ts": "2026-09-30T12:09:06Z", "hours": 11.0, "multiplier": 9.76, "payout": 103, "blessing": "neutral", "text": "This is my final ship for Level Up. Level Up originally started as a simple idea: turn a 20-hour self-improvement video into something I could actually read, search, understand, and use. It started as basically a local-first book. Over time I kept asking the same question: “How do I make this useful after someone finishes reading?” So I kept rebuilding it. Now Level Up is much closer to a complete self-improvement app. The main experience is built around Today — you open the app, see what you are working toward, get a clear next action, start a focus/study session, and track your progress instead of just consuming more content. I also added Goals, Progress, Study Mode, a daily planner, tutor/coach tools, local AI through Ollama, chapter search, quizzes, streaks, highlights, backups, restore, and a much more consistent UI across the app. The hardest part was making all of this work while keeping the original idea of Level Up: no account required, no cloud database, and your personal progress stays on your device. I had to rebuild a lot of the local state system, handle migrations and corrupted data, improve backup/restore, and make sure the app still works properly offline or without local AI installed. The thing I’m most proud of is that it no longer feels like a book with random features added around it. It finally feels like one connected product. If you test it, don’t just click around. Actually use it: Create a goal Open Today and follow the next action Start a focus/study session Read or study a chapter Check your Progress Refresh/reopen the app and see your data persist There are definitely things I could keep polishing forever, but I don’t want this project to become an endless cycle of “one more redesign.” This is the version I’m calling finished. Try it: https://hustlenix.github.io/LevelUp/ Source: https://github.com/Hustlenix/LevelUp Thanks to everyone who tested it, gave feedback, or followed the devlogs while this went from a small reading website into this. LEVEL UP. 🚀", "repo": "https://github.com/Hustlenix/LevelUp", "demo": "https://hustlenix.github.io/LevelUp/"}, {"ship_num": 3, "ts": "2026-09-20T07:44:58Z", "hours": 18.0, "multiplier": 8.6, "payout": 153, "blessing": "neutral", "text": "I upgraded my MVP called Level Up: transforming a local-first self-development book into a full-featured, Today-first operating system—still running 100% in your browser. The Motivation While Ship #1 proved that a 20-hour video transcript could become a searchable, evidence-graded web book, the feedback was clear: the UI/UX felt fragmented. Having deep individual features wasn’t enough if the home experience didn’t tell you what to do right now. I set out to redesign Level Up from a passive reading interface into an actionable personal operating system. What’s New: The Today-First OS & Local AI Instead of a crowded home screen, the app now centers on a streamlined /today/ hub that answers one core question: “What should I do next?” Today Shell Navigation: Simplified navigation down to Today, Learn, Goals, Progress, and More, placing your current focus front and center. On-Device Study Workspace: Integrated a dedicated Study Mode featuring an automated Daily Planner, a Local Coach, and an interactive Tutor mode to explain or practice any of the 28 chapters. Smart Local AI Integration: Added support for local LLMs via Ollama with full offline fallback, letting you generate study plans and ask questions without leaking private data to external servers. How We Upgraded It Typed Local State Boundary: Replaced fragmented localStorage usage with a single, typed local repository boundary managed via pure TypeScript modules and useSyncExternalStore. Data Diagnostics & Migrations: Hardened JSON schema validation, improved backup/restore transaction handling, and added local data health checks to ensure offline state never gets corrupted. UI/UX Consistency System: Standardized spacing, card hierarchies, buttons, forms, and empty states across all routes so every tool feels like part of a unified product. Into the Trenches (Challenges & Learnings) The Monolith vs. Workspaces Tradeoff: Moving from a multi-tool dashboard to a focused Today-first layout meant rethinking information architecture. We hid creation forms behind empty states and compressed secondary features like inbox items into compact panels to avoid visual clutter. Local AI Fallbacks: Integrating Ollama required explicit status checks and graceful local degradation so non-technical users or fully offline environments still get a clean UI without broken promises. What I’m Proud Of Coherent OS Feel: Level Up no longer feels like separate utilities tacked together; it operates as one smooth, self-contained habit driver. Privacy Preserved: Despite adding AI study tools and custom daily planners, everything remains zero-tracking, zero-backend, and fully functional on-device. Try it out: Live site: https://hustlenix.github.io/LevelUp/ Source code: https://github.com/Hustlenix/LevelUp Tech Stack: Next.js 16, Tailwind v4, TypeScript, node:sqlite, MiniSearch, Ollama / On-Device Local State, GitHub Pages", "repo": "https://github.com/Hustlenix/LevelUp", "demo": "https://hustlenix.github.io/LevelUp/"}, {"ship_num": 4, "ts": "2026-09-11T17:51:26Z", "hours": 40.0, "multiplier": 16.67, "payout": 286, "blessing": "neutral", "text": "I built a free MVP called Level Up : a 28-chapter self-development book built from a 20-hour video transcript, running entirely in your browser. The Motivation It started with a simple question: What if you could turn a 20-hour self-dev video into something you could actually read, search, and verify? Most online self-development content exists to sell courses, not to present evidence. I wanted something honest. So, I built a real book where every notable claim is graded against cited research. What It Is: Zero Tracking, 100% Local The result is roughly 32k words across four pillars, a 30-claim evidence audit (graded A–D/U), 13 testable protocols, and full-text search. The best part? Zero tracking. No accounts, no APIs, no cookies. Your reading progress, streaks, highlights, themes, and quiz scores live entirely in your browser’s localStorage . Nothing leaves your machine. How We Built It The original video transcript was ~20k lines. We tag-teamed Claude, Gemini, and Opencode to compress it. From there, we built the site in layers: The Content Pipeline: scripts/build-data.mjs compiles Markdown chapters into SQLite using node:sqlite , then emits JSON data and a 30KB MiniSearch index. The Frontend: Next.js 16 static export and Tailwind v4. We used useSyncExternalStore for reactive local state via pure TypeScript modules. The Deploy: Automated via GitHub Actions straight to GitHub Pages. Into the Trenches (Challenges & Learnings) The CI Spiral: We added a React 19 QuoteCard. It built flawlessly locally (22/22 tests green), but failed eight consecutive GitHub Actions runs with a phantom TS error. It wasn’t a code bug; it was an environment disagreement. Lesson: Sometimes a feature just isn’t ready. We deleted it rather than fighting the environment or shipping it broken. Turbopack’s Quiet Types: The dev server uses Turbopack, which skips full type-checking for speed. We shipped a PR that built locally but failed in CI. Lesson: Always run tsc locally, or CI will aggressively remind you of the difference between “builds” and “types.” Case Sensitivity: GitHub Pages serves paths case-sensitively. NEXT_PUBLIC_BASE_PATH=/LevelUp is fundamentally different from /levelup . We learned this the hard way. What I’m Proud Of Honest Grading: No invented citations. If a famous “5x flow” stat is folklore, the site tells you so. Backend-less Magic: Search, quizzes, highlights, streaks, and schema-validated JSON backup/restore—all completely offline-capable. The Architecture: The data layer isn’t just a pile of JSON; it’s a statically served, compiled artifact from Markdown. Try it out: Live site: https://hustlenix.github.io/LevelUp/ Source code: https://github.com/Hustlenix/LevelUp Tech Stack: Next.js 16, Tailwind v4, node:sqlite, MiniSearch, GitHub Pages", "repo": "https://github.com/Hustlenix/LevelUp", "demo": "https://hustlenix.github.io/LevelUp/"}]...
|
[{"post_id": 81165, "ts": "202 [{"post_id": 81165, "ts": "2026-10-20T05:15:28Z", "hours": 9.1767, "text": "Finishing touches, i think this is coming to and end, so i lokced in in these 10 hours and did some major changes, like used HCB APi key and give MILO an life so it can interact with you guys, and bumped up the UI/UX to and next level and: Milo Talk with offline guidance and explicit approval before saving suggested actions. Replayable walkthrough and app-wide text sizing up to 150%. Distinct Deep Work/Cyberpunk themes; preserved Light/Dark. Install guidance, offline support, refreshed screenshots, and technical documentation. Fixed Settings headings and Deep Work contrast. As per your reviews and real time feedback, thank you guys!"}, {"post_id": 75526, "ts": "2026-09-30T11:33:39Z", "hours": 8.6486, "text": "I tried making this the final boss of Self Improvement APP, i think i am finally over, longin and start LEVELING UPPP!!!!!!!!!!!"}, {"post_id": 72287, "ts": "2026-09-22T16:18:34Z", "hours": 1.9244, "text": "I think there is nothing to be upgraded in this, all i have to do now is add subscryptions and make money!!!!!!!!!!!!"}, {"post_id": 71049, "ts": "2026-09-20T07:44:31Z", "hours": 0.8897, "text": "I upgraded my MVP called Level Up: transforming a local-first self-development book into a full-featured, Today-first operating system—still running 100% in your browser.The Motivation While Ship #1 proved that a 20-hour video transcript could become a searchable, evidence-graded web book, the feedback was clear: the UI/UX felt fragmented. Having deep individual features wasn’t enough if the home experience didn’t tell you what to do right now. I set out to redesign Level Up from a passive reading interface into an actionable personal operating system.What’s New: The Today-First OS & Local AI Instead of a crowded home screen, the app now centers on a streamlined /today/ hub that answers one core question: “What should I do next?”Today Shell Navigation: Simplified navigation down to Today, Learn, Goals, Progress, and More, placing your current focus front and center.On-Device Study Workspace: Integrated a dedicated Study Mode featuring an automated Daily Planner, a Local Coach, and an interactive Tutor mode to explain or practice any of the 28 chapters.Smart Local AI Integration: Added support for local LLMs via Ollama with full offline fallback, letting you generate study plans and ask questions without leaking private data to external servers.How We Upgraded ItTyped Local State Boundary: Replaced fragmented localStorage usage with a single, typed local repository boundary managed via pure TypeScript modules and useSyncExternalStore.Data Diagnostics & Migrations: Hardened JSON schema validation, improved backup/restore transaction handling, and added local data health checks to ensure offline state never gets corrupted.UI/UX Consistency System: Standardized spacing, card hierarchies, buttons, forms, and empty states across all routes so every tool feels like part of a unified product.Into the Trenches (Challenges & Learnings)The Monolith vs. Workspaces Tradeoff: Moving from a multi-tool dashboard to a focused Today-first layout meant rethinking information architecture. We hid creation forms behind empty states and compressed secondary features like inbox items into compact panels to avoid visual clutter.Local AI Fallbacks: Integrating Ollama required explicit status checks and graceful local degradation so non-technical users or fully offline environments still get a clean UI without broken promises.What I’m Proud OfCoherent OS Feel: Level Up no longer feels like separate utilities tacked together; it operates as one smooth, self-contained habit driver.Privacy Preserved: Despite adding AI study tools and custom daily planners, everything remains zero-tracking, zero-backend, and fully functional on-device.Try it out:Live site: https://hustlenix.github.io/LevelUp/Source code: https://github.com/Hustlenix/LevelUpTech Stack: Next.js 16, Tailwind v4, TypeScript, node:sqlite, MiniSearch, Ollama / On-Device Local State, GitHub Pages"}, {"post_id": 70978, "ts": "2026-09-20T04:38:42Z", "hours": 5.0881, "text": "Till now for my app i have like genrated the overall Backend and front end, but the frontend UI/UX is kinda mid. so i am thinking of improving it and opt for te second ship. In UI/UX i am thinking of doind this: 1. Today-first operating system shell — recommended Make /today/ the clear home of the product. Changes: Simplify navigation to: Today Learn Goals Progress More Make Today answer one question: “What should I do next?” Replace the long stacked Today page with a priority layout: Current goal One next action Start session Progress signal Recovery option Move goal creation into a focused onboarding/empty state instead of displaying a large form immediately. Turn Inbox, patterns, and reminders into compact secondary sections. Keep Goals, Focus, Review, Portfolio, and Roadmap as deep workspaces. Apply the same card, spacing, button, form, and empty-state system across all routes. Keep the existing editorial chapter experience intact. Backend/local-state work: Add a single typed local repository boundary. Harden localStorage validation and migrations. Improve backup/restore transaction handling. Make Ollama status and fallback behavior clearer. Add local data health diagnostics. Preserve offline use. Tradeoff: largest visible improvement, but touches navigation and the main execution surfaces. Editorial workspace polish Keep the existing navigation and route structure, but improve every page individually. Changes: Refine each page’s spacing and hierarchy. Upgrade cards, forms, progress indicators, and empty states. Add shared page headers and breadcrumbs. Improve mobile behavior without changing information architecture. Backend/local-state work remains the same. Tradeoff: lowest risk, but the product may still feel like multiple separate tools rather than one coherent operating system. Dashboard-centric command center Make /dashboard/ the main product and move most functionality into a dense professional workspace. Changes: Dashboard becomes a multi-panel command center. Today, Goals, Focus, Review, and Progress become dashboard tabs or panels. More information is visible at once. Strong for desktop power users. Tradeoff: efficient for experienced users but heavier, more complex, and less approachable on mobile."}, {"post_id": 70451, "ts": "2026-09-19T07:02:36Z", "hours": 8.2389, "text": "I thought to keep this as a normal book website for a 20 hr video, until i didnt i wanted to somehow plan to make money out of this, so I am not planning to improve this to a full App and Add pricing and make money out of it. The app is gonna be about implementing the things for the 20 hr video effectively in my website for a lil $. For now everyone can try it our for free on https://hustlenix.github.io/LevelUp"}, {"post_id": 68897, "ts": "2026-09-16T00:04:43Z", "hours": 1.1653, "text": "Me corrently using my own app to study and finish my home work🤣🤣. Youto use it on https://hustlenix.github.io/LevelUp/ for free"}, {"post_id": 67964, "ts": "2026-09-14T09:11:00Z", "hours": 2.6825, "text": "Instead of making this website feel like a simple website like a book, i am on a mission to make this website a full stack website for self improvement and i am thinking of adding paywall and make some money, but stripe isnt working from INDIA someone please help. STAY HARD!!!!!!!!!!!!!!!"}, {"post_id": 66090, "ts": "2026-09-11T17:47:02Z", "hours": 13.0997, "text": "I built a free MVP called Level Up: a 28-chapter self-development book built from a 20-hour video transcript, running entirely in your browser.The Motivation It started with a simple question: What if you could turn a 20-hour self-dev video into something you could actually read, search, and verify? Most online self-development content exists to sell courses, not to present evidence. I wanted something honest. So, I built a real book where every notable claim is graded against cited research.What It Is: Zero Tracking, 100% Local The result is roughly 32k words across four pillars, a 30-claim evidence audit (graded A–D/U), 13 testable protocols, and full-text search.The best part? Zero tracking. No accounts, no APIs, no cookies. Your reading progress, streaks, highlights, themes, and quiz scores live entirely in your browser’s localStorage. Nothing leaves your machine.How We Built It The original video transcript was ~20k lines. We tag-teamed Claude, Gemini, and Opencode to compress it. From there, we built the site in layers:The Content Pipeline: scripts/build-data.mjs compiles Markdown chapters into SQLite using node:sqlite, then emits JSON data and a 30KB MiniSearch index.The Frontend: Next.js 16 static export and Tailwind v4. We used useSyncExternalStore for reactive local state via pure TypeScript modules.The Deploy: Automated via GitHub Actions straight to GitHub Pages.Into the Trenches (Challenges & Learnings)The CI Spiral: We added a React 19 QuoteCard. It built flawlessly locally (22/22 tests green), but failed eight consecutive GitHub Actions runs with a phantom TS error. It wasn’t a code bug; it was an environment disagreement. Lesson: Sometimes a feature just isn’t ready. We deleted it rather than fighting the environment or shipping it broken.Turbopack’s Quiet Types: The dev server uses Turbopack, which skips full type-checking for speed. We shipped a PR that built locally but failed in CI. Lesson: Always run tsc locally, or CI will aggressively remind you of the difference between “builds” and “types.“Case Sensitivity: GitHub Pages serves paths case-sensitively. NEXT_PUBLIC_BASE_PATH=/LevelUp is fundamentally different from /levelup. We learned this the hard way.What I’m Proud OfHonest Grading: No invented citations. If a famous “5x flow” stat is folklore, the site tells you so.Backend-less Magic: Search, quizzes, highlights, streaks, and schema-validated JSON backup/restore—all completely offline-capable.The Architecture: The data layer isn’t just a pile of JSON; it’s a statically served, compiled artifact from Markdown.Try it out:Live site: https://hustlenix.github.io/LevelUp/Source code: https://github.com/Hustlenix/LevelUpTech Stack: Next.js 16, Tailwind v4, node:sqlite, MiniSearch, GitHub Pages"}, {"post_id": 50297, "ts": "2026-08-19T13:37:53Z", "hours": 12.4239, "text": "So called Devlog, 3 The agenda today is to simplify the home page. I paid attention to it for 8 hours and ended up with two fewer things on screen than when I started lol😅✌🏻. After removing the large hero box and changing the chapter list to an accordion, the homepage appeared empty. I created a big wishlists of items to add: heatmaps, quote-generators, streak-trackers, quiz-cards, XP-counters, etc. Everything was built local-first on Next.js 16 (static export on GitHub Pages) using localStorage keys like levelup-streak-v1 no tracking or backend APIs. I constructed a QuoteCard component to retrieve data from /data/quotes.json. All 22 tests passed on my machine, but for some reason, GitHub Actions fails a phantom TS7006 type error 8+ times in a row because of that one CI error. I kept spamming commit messages like “force CI re-run”, “force CI re-re-re-run, and this time ts-ignore…”. It turned out to be a weird CI environment mismatch that ate half my day. I discarded the quote card to avoid clutter. In what was shipped was a simple PrivacyBadge (“100% Private · On-Device Storage Only”) along with a ThemeTimeShift script that alters the –hue CSS variable based off your clock. Next thing we must do is transition smoothly into the chapter! Stay techulated or smtg. STAY HARD GNG!"}, {"post_id": 47521, "ts": "2026-08-15T14:15:55Z", "hours": 0.4181, "text": "Finished writing the git hub repo, and used AI to organise the words cause it was full of gramatical mistakes and stuff. I am ready to ship this project GNG, what did I miss, please check this out and give some valid review please."}, {"post_id": 47501, "ts": "2026-08-15T13:29:22Z", "hours": 13.9158, "text": "This is my trust worthy, non tracked website for leveling up in your life but somehow works without any login or stuff, the tracking just works, inspired by this 20 hour video: https://www.youtube.com/watch?v=wvaY5bG5p7A&t=65s which is totally worth it. To build this I started by getting the transcript for making this website, and with that 20k lines transcript I pasted it into claude to compact this, and it ran out of tokens, and i tried gemini too sadly it too ran out of tokens, and lastly I tried Opencode few time and it finally gave me the summary for this and after few hours i finished the website and pushed the code to git hub, branched it real good, and finally build and in actions started a build and deploy workflow and got this running. STAY HARD GNG!!!!!!!!"}]...
|
Title: Level Up by @Lalith | Stardance
Devlogs:
T Title: Level Up by @Lalith | Stardance
Devlogs:
This is my trust worthy, non tracked website for leveling up in your life but somehow works without any login or stuff, the tracking just works, inspired by this 20 hour video: https://www.youtube.com/watch?v=wvaY5bG5p7A&t=65s which is totally worth it. To build this I started by getting the transcript for making this website, and with that 20k lines transcript I pasted it into claude to compact this, and it ran out of tokens, and i tried gemini too sadly it too ran out of tokens, and lastly I tried Opencode few time and it finally gave me the summary for this and after few hours i finished the website and pushed the code to git hub, branched it real good, and finally build and in actions started a build and deploy workflow and got this running. STAY HARD GNG!!!!!!!!
Finished writing the git hub repo, and used AI to organise the words cause it was full of gramatical mistakes and stuff. I am ready to ship this project GNG, what did I miss, please check this out and give some valid review please.
So called Devlog, 3 The agenda today is to simplify the home page. I paid attention to it for 8 hours and ended up with two fewer things on screen than when I started lol😅✌🏻. After removing the large hero box and changing the chapter list to an accordion, the homepage appeared empty. I created a big wishlists of items to add: heatmaps, quote-generators, streak-trackers, quiz-cards, XP-counters, etc. Everything was built local-first on Next.js 16 (static export on GitHub Pages) using localStorage keys like levelup-streak-v1 no tracking or backend APIs. I constructed a QuoteCard component to retrieve data from /data/quotes.json. All 22 tests passed on my machine, but for some reason, GitHub Actions fails a phantom TS7006 type error 8+ times in a row because of that one CI error. I kept spamming commit messages like “force CI re-run”, “force CI re-re-re-run, and this time ts-ignore…”. It turned out to be a weird CI environment mismatch that ate half my day. I discarded the quote card to avoid clutter. In what was shipped was a simple PrivacyBadge (“100% Private · On-Device Storage Only”) along with a ThemeTimeShift script that alters the –hue CSS variable based off your clock. Next thing we must do is transition smoothly into the chapter! Stay techulated or smtg. STAY HARD GNG!
I built a free MVP called Level Up: a 28-chapter self-development book built from a 20-hour video transcript, running entirely in your browser.The Motivation It started with a simple question: What if you could turn a 20-hour self-dev video into something you could actually read, search, and verify? Most online self-development content exists to sell courses, not to present evidence. I wanted something honest. So, I built a real book where every notable claim is graded against cited research.What It Is: Zero Tracking, 100% Local The result is roughly 32k words across four pillars, a 30-claim evidence audit (graded A–D/U), 13 testable protocols, and full-text search.The best part? Zero tracking. No accounts, no APIs, no cookies. Your reading progress, streaks, highlights, themes, and quiz scores live entirely in your browser’s localStorage. Nothing leaves your machine.How We Built It The original video transcript was ~20k lines. We tag-teamed Claude, Gemini, and Opencode to compress it. From there, we built the site in layers:The Content Pipeline: scripts/build-data.mjs compiles Markdown chapters into SQLite using node:sqlite, then emits JSON data and a 30KB MiniSearch index.The Frontend: Next.js 16 static export and Tailwind v4. We used useSyncExternalStore for reactive local state via pure TypeScript modules.The Deploy: Automated via GitHub Actions straight to GitHub Pages.Into the Trenches (Challenges & Learnings)The CI Spiral: We added a React 19 QuoteCard. It built flawlessly locally (22/22 tests green), but failed eight consecutive GitHub Actions runs with a phantom TS error. It wasn’t a code bug; it was an environment disagreement. Lesson: Sometimes a feature just isn’t ready. We deleted it rather than fighting the environment or shipping it broken.Turbopack’s Quiet Types: The dev server uses Turbopack, which skips full type-checking for speed. We shipped a PR that built locally but failed in CI. Lesson: Always run tsc locally, or CI will aggressively remind you of the difference between “builds” and “types.“Case Sensitivity: GitHub Pages serves paths case-sensitively. NEXT_PUBLIC_BASE_PATH=/LevelUp is fundamentally different from /levelup. We learned this the hard way.What I’m Proud OfHonest Grading: No invented citations. If a famous “5x flow” stat is folklore, the site tells you so.Backend-less Magic: Search, quizzes, highlights, streaks, and schema-validated JSON backup/restore—all completely offline-capable.The Architecture: The data layer isn’t just a pile of JSON; it’s a statically served, compiled artifact from Markdown.Try it out:Live site: https://hustlenix.github.io/LevelUp/Source code: https://github.com/Hustlenix/LevelUpTech Stack: Next.js 16, Tailwind v4, node:sqlite, MiniSearch, GitHub Pages
Instead of making this website feel like a simple website like a book, i am on a mission to make this website a full stack website for self improvement and i am thinking of adding paywall and make some money, but stripe isnt working from INDIA someone please help. STAY HARD!!!!!!!!!!!!!!!
Me corrently using my own app to study and finish my home work🤣🤣. Youto use it on https://hustlenix.github.io/LevelUp/ for free
I thought to keep this as a normal book website for a 20 hr video, until i didnt i wanted to somehow plan to make money out of this, so I am not planning to improve this to a full App and Add pricing and make money out of it. The app is gonna be about implementing the things for the 20 hr video effectively in my website for a lil $. For now everyone can try it our for free on https://hustlenix.github.io/LevelUp
Till now for my app i have like genrated the overall Backend and front end, but the frontend UI/UX is kinda mid. so i am thinking of improving it and opt for te second ship. In UI/UX i am thinking of doind this: 1. Today-first operating system shell — recommended Make /today/ the clear home of the product. Changes: Simplify navigation to: Today Learn Goals Progress More Make Today answer one question: “What should I do next?” Replace the long stacked Today page with a priority layout: Current goal One next action Start session Progress signal Recovery option Move goal creation into a focused onboarding/empty state instead of displaying a large form immediately. Turn Inbox, patterns, and reminders into compact secondary sections. Keep Goals, Focus, Review, Portfolio, and Roadmap as deep workspaces. Apply the same card, spacing, button, form, and empty-state system across all routes. Keep the existing editorial chapter experience intact. Backend/local-state work: Add a single typed local repository boundary. Harden localStorage validation and migrations. Improve backup/restore transaction handling. Make Ollama status and fallback behavior clearer. Add local data health diagnostics. Preserve offline use. Tradeoff: largest visible improvement, but touches navigation and the main execution surfaces. Editorial workspace polish Keep the existing navigation and route structure, but improve every page individually. Changes: Refine each page’s spacing and hierarchy. Upgrade cards, forms, progress indicators, and empty states. Add shared page headers and breadcrumbs. Improve mobile behavior without changing information architecture. Backend/local-state work remains the same. Tradeoff: lowest risk, but the product may still feel like multiple separate tools rather than one coherent operating system. Dashboard-centric command center Make /dashboard/ the main product and move most functionality into a dense professional workspace. Changes: Dashboard becomes a multi-panel command center. Today, Goals, Focus, Review, and Progress become dashboard tabs or panels. More information is visible at once. Strong for desktop power users. Tradeoff: efficient for experienced users but heavier, more complex, and less approachable on mobile.
I upgraded my MVP called Level Up: transforming a local-first self-development book into a full-featured, Today-first operating system—still running 100% in your browser.The Motivation While Ship #1 proved that a 20-hour video transcript could become a searchable, evidence-graded web book, the feedback was clear: the UI/UX felt fragmented. Having deep individual features wasn’t enough if the home experience didn’t tell you what to do right now. I set out to redesign Level Up from a passive reading interface into an actionable personal operating system.What’s New: The Today-First OS & Local AI Instead of a crowded home screen, the app now centers on a streamlined /today/ hub that answers one core question: “What should I do next?”Today Shell Navigation: Simplified navigation down to Today, Learn, Goals, Progress, and More, placing your current focus front and center.On-Device Study Workspace: Integrated a dedicated Study Mode featuring an automated Daily Planner, a Local Coach, and an interactive Tutor mode to explain or practice any of the 28 chapters.Smart Local AI Integration: Added support for local LLMs via Ollama with full offline fallback, letting you generate study plans and ask questions without leaking private data to external servers.How We Upgraded ItTyped Local State Boundary: Replaced fragmented localStorage usage with a single, typed local repository boundary managed via pure TypeScript modules and useSyncExternalStore.Data Diagnostics & Migrations: Hardened JSON schema validation, improved backup/restore transaction handling, and added local data health checks to ensure offline state never gets corrupted.UI/UX Consistency System: Standardized spacing, card hierarchies, buttons, forms, and empty states across all routes so every tool feels like part of a unified product.Into the Trenches (Challenges & Learnings)The Monolith vs. Workspaces Tradeoff: Moving from a multi-tool dashboard to a focused Today-first layout meant rethinking information architecture. We hid creation forms behind empty states and compressed secondary features like inbox items into compact panels to avoid visual clutter.Local AI Fallbacks: Integrating Ollama required explicit status checks and graceful local degradation so non-technical users or fully offline environments still get a clean UI without broken promises.What I’m Proud OfCoherent OS Feel: Level Up no longer feels like separate utilities tacked together; it operates as one smooth, self-contained habit driver.Privacy Preserved: Despite adding AI study tools and custom daily planners, everything remains zero-tracking, zero-backend, and fully functional on-device.Try it out:Live site: https://hustlenix.github.io/LevelUp/Source code: https://github.com/Hustlenix/LevelUpTech Stack: Next.js 16, Tailwind v4, TypeScript, node:sqlite, MiniSearch, Ollama / On-Device Local State, GitHub Pages
I think there is nothing to be upgraded in this, all i have to do now is add subscryptions and make money!!!!!!!!!!!!
I tried making this the final boss of Self Improvement APP, i think i am finally over, longin and start LEVELING UPPP!!!!!!!!!!!
Finishing touches, i think this is coming to and end, so i lokced in in these 10 hours and did some major changes, like used HCB APi key and give MILO an life so it can interact with you guys, and bumped up the UI/UX to and next level and: Milo Talk with offline guidance and explicit approval before saving suggested actions. Replayable walkthrough and app-wide text sizing up to 150%. Distinct Deep Work/Cyberpunk themes; preserved Light/Dark. Install guidance, offline support, refreshed screenshots, and technical documentation. Fixed Settings headings and Deep Work contrast. As per your reviews and real time feedback, thank you guys!
Ships:
I built a free MVP called Level Up : a 28-chapter self-development book built from a 20-hour video transcript, running entirely in your browser. The Motivation It started with a simple question: What if you could turn a 20-hour self-dev video into something you could actually read, search, and verify? Most online self-development content exists to sell courses, not to present evidence. I wanted something honest. So, I built a real book where every notable claim is graded against cited research. What It Is: Zero Tracking, 100% Local The result is roughly 32k words across four pillars, a 30-claim evidence audit (graded A–D/U), 13 testable protocols, and full-text search. The best part? Zero tracking. No accounts, no APIs, no cookies. Your reading progress, streaks, highlights, themes, and quiz scores live entirely in your browser’s localStorage . Nothing leaves your machine. How We Built It The original video transcript was ~20k lines. We tag-teamed Claude, Gemini, and Opencode to compress it. From there, we built the site in layers: The Content Pipeline: scripts/build-data.mjs compiles Markdown chapters into SQLite using node:sqlite , then emits JSON data and a 30KB MiniSearch index. The Frontend: Next.js 16 static export and Tailwind v4. We used useSyncExternalStore for reactive local state via pure TypeScript modules. The Deploy: Automated via GitHub Actions straight to GitHub Pages. Into the Trenches (Challenges & Learnings) The CI Spiral: We added a React 19 QuoteCard. It built flawlessly locally (22/22 tests green), but failed eight consecutive GitHub Actions runs with a phantom TS error. It wasn’t a code bug; it was an environment disagreement. Lesson: Sometimes a feature just isn’t ready. We deleted it rather than fighting the environment or shipping it broken. Turbopack’s Quiet Types: The dev server uses Turbopack, which skips full type-checking for speed. We shipped a PR that built locally but failed in CI. Lesson: Always run tsc locally, or CI will aggressively remind you of the difference between “builds” and “types.” Case Sensitivity: GitHub Pages serves paths case-sensitively. NEXT_PUBLIC_BASE_PATH=/LevelUp is fundamentally different from /levelup . We learned this the hard way. What I’m Proud Of Honest Grading: No invented citations. If a famous “5x flow” stat is folklore, the site tells you so. Backend-less Magic: Search, quizzes, highlights, streaks, and schema-validated JSON backup/restore—all completely offline-capable. The Architecture: The data layer isn’t just a pile of JSON; it’s a statically served, compiled artifact from Markdown. Try it out: Live site: https://hustlenix.github.io/LevelUp/ Source code: https://github.com/Hustlenix/LevelUp Tech Stack: Next.js 16, Tailwind v4, node:sqlite, MiniSearch, GitHub Pages
I upgraded my MVP called Level Up: transforming a local-first self-development book into a full-featured, Today-first operating system—still running 100% in your browser. The Motivation While Ship #1 proved that a 20-hour video transcript could become a searchable, evidence-graded web book, the feedback was clear: the UI/UX felt fragmented. Having deep individual features wasn’t enough if the home experience didn’t tell you what to do right now. I set out to redesign Level Up from a passive reading interface into an actionable personal operating system. What’s New: The Today-First OS & Local AI Instead of a crowded home screen, the app now centers on a streamlined /today/ hub that answers one core question: “What should I do next?” Today Shell Navigation: Simplified navigation down to Today, Learn, Goals, Progress, and More, placing your current focus front and center. On-Device Study Workspace: Integrated a dedicated Study Mode featuring an automated Daily Planner, a Local Coach, and an interactive Tutor mode to explain or practice any of the 28 chapters. Smart Local AI Integration: Added support for local LLMs via Ollama with full offline fallback, letting you generate study plans and ask questions without leaking private data to external servers. How We Upgraded It Typed Local State Boundary: Replaced fragmented localStorage usage with a single, typed local repository boundary managed via pure TypeScript modules and useSyncExternalStore. Data Diagnostics & Migrations: Hardened JSON schema validation, improved backup/restore transaction handling, and added local data health checks to ensure offline state never gets corrupted. UI/UX Consistency System: Standardized spacing, card hierarchies, buttons, forms, and empty states across all routes so every tool feels like part of a unified product. Into the Trenches (Challenges & Learnings) The Monolith vs. Workspaces Tradeoff: Moving from a multi-tool dashboard to a focused Today-first layout meant rethinking information architecture. We hid creation forms behind empty states and compressed secondary features like inbox items into compact panels to avoid visual clutter. Local AI Fallbacks: Integrating Ollama required explicit status checks and graceful local degradation so non-technical users or fully offline environments still get a clean UI without broken promises. What I’m Proud Of Coherent OS Feel: Level Up no longer feels like separate utilities tacked together; it operates as one smooth, self-contained habit driver. Privacy Preserved: Despite adding AI study tools and custom daily planners, everything remains zero-tracking, zero-backend, and fully functional on-device. Try it out: Live site: https://hustlenix.github.io/LevelUp/ Source code: https://github.com/Hustlenix/LevelUp Tech Stack: Next.js 16, Tailwind v4, TypeScript, node:sqlite, MiniSearch, Ollama / On-Device Local State, GitHub Pages
This is my final ship for Level Up. Level Up originally started as a simple idea: turn a 20-hour self-improvement video into something I could actually read, search, understand, and use. It started as basically a local-first book. Over time I kept asking the same question: “How do I make this useful after someone finishes reading?” So I kept rebuilding it. Now Level Up is much closer to a complete self-improvement app. The main experience is built around Today — you open the app, see what you are working toward, get a clear next action, start a focus/study session, and track your progress instead of just consuming more content. I also added Goals, Progress, Study Mode, a daily planner, tutor/coach tools, local AI through Ollama, chapter search, quizzes, streaks, highlights, backups, restore, and a much more consistent UI across the app. The hardest part was making all of this work while keeping the original idea of Level Up: no account required, no cloud database, and your personal progress stays on your device. I had to rebuild a lot of the local state system, handle migrations and corrupted data, improve backup/restore, and make sure the app still works properly offline or without local AI installed. The thing I’m most proud of is that it no longer feels like a book with random features added around it. It finally feels like one connected product. If you test it, don’t just click around. Actually use it: Create a goal Open Today and follow the next action Start a focus/study session Read or study a chapter Check your Progress Refresh/reopen the app and see your data persist There are definitely things I could keep polishing forever, but I don’t want this project to become an endless cycle of “one more redesign.” This is the version I’m calling finished. Try it: https://hustlenix.github.io/LevelUp/ Source: https://github.com/Hustlenix/LevelUp Thanks to everyone who tested it, gave feedback, or followed the devlogs while this went from a small reading website into this. LEVEL UP. 🚀
Shipped LevelUp! It started as a way to make a long self-development video easier to read. Now it has 28 chapters, practical plans, habits, focus timers, and a daily mission system. You can save an idea from a chapter and actually try it instead of forgetting it five minutes later. Milo is the little companion that reacts to your reading and focus activity. Everything important works locally, without an account or trackers. There’s also an offline progress system called Nexus, which handles changes across tabs and lets you move progress using encrypted files. This update mostly brought the different parts together. I fixed mobile layouts, added larger text and a quick tutorial, and made backups include the newer features. Cloud chat still needs work, and the app could be simpler, but the full version is live now. Try it: https://hustlenix.github.io/LevelUp/...
|
1792853431.3206584
|
1792939831.3206584
|
|
69440
|
Bamboo cutter by @Jango | Stardance
|
Jango
|
0
|
4.33
|
0
|
[]
|
[{"post_id": 81169, "ts": "202 [{"post_id": 81169, "ts": "2026-10-20T05:33:59Z", "hours": 4.3306, "text": "Finished it but forgot to post devlogs i did a bunch on terra though but its a clicking game with upgrade its simple but there are no visual srry"}]...
|
Title: Bamboo cutter by @Jango | Stardance
Devlog Title: Bamboo cutter by @Jango | Stardance
Devlogs:
Finished it but forgot to post devlogs i did a bunch on terra though but its a clicking game with upgrade its simple but there are no visual srry...
|
1792835415.6783261
|
1793440215.6783261
|
|
38886
|
WEB APP FOR STUDENTS by @Uxyamo | Stardance
|
Uxyamo
|
3
|
76.0
|
621
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T06:40:42Z", "hours": 18.0, "multiplier": 8.4, "payout": 99, "blessing": "neutral", "text": "I’m going to continue improving my project with some others creatorsn and thanks you everyone for all the support I had!!! Good luck!!", "repo": "https://github.com/mbbs-iam/APP---FermatNote---Make-my-Grades", "demo": "https://cuentasfermat.web.app/"}, {"ship_num": 2, "ts": "2026-08-28T16:13:00Z", "hours": 4.0, "multiplier": 12.19, "payout": 43, "blessing": "neutral", "text": "Hi everyone! This project is for the delegates, 12 delegates of the best Hightschools in France and Morroco will use it the next year. A big tech company will help me with giving me servers to deploy my app.", "repo": "https://github.com/mbbs-iam/APP---FermatNote---Make-my-Grades", "demo": "https://cuentasfermat.web.app/"}, {"ship_num": 3, "ts": "2026-08-16T08:22:09Z", "hours": 54.0, "multiplier": 10.6, "payout": 479, "blessing": "neutral", "text": "Hi everyone! This project is for the delegates, 12 delegates of the best Hightschools in France and Morroco will use it the next year. A big tech company will help me with giving me servers to deploy my app. I am developing Fermat-Note, an application designed especially for high school and higher education students to centralize everything: class chat, shared homework management, self-help forums and collective organization. The app allows the class to be more organized and connected to improve class performance. Thanks you so much, I would like you to appreciate it, and if you would like to use it for your class, send me a message!! ❤️👌👌", "repo": "https://github.com/mbbs-iam/APP---FermatNote---Make-my-Grades", "demo": "https://cuentasfermat.web.app/"}]...
|
[{"post_id": 81181, "ts": "202 [{"post_id": 81181, "ts": "2026-10-20T06:39:31Z", "hours": 1.7442, "text": "I decided that because all students use discord, instagram and more I will transform my PWA into an app so they will can use that apps in my app"}, {"post_id": 76794, "ts": "2026-10-04T16:11:16Z", "hours": 15.7992, "text": "Some modifications…"}, {"post_id": 56718, "ts": "2026-08-28T16:12:12Z", "hours": 3.5033, "text": "Hi everyone, there is some students that want to help me the next year, I readed all the messages of my deploy and I decided that it will be international"}, {"post_id": 47987, "ts": "2026-08-16T08:17:36Z", "hours": 0.3178, "text": "I finished the project!! Thanks yo evryone that helped me and followed me in my project!!"}, {"post_id": 47541, "ts": "2026-08-15T14:48:56Z", "hours": 3.5642, "text": "Already finished the diaporama for the students that will use my app!! Take a look please, and say me what to improve!!"}, {"post_id": 46530, "ts": "2026-08-13T20:28:50Z", "hours": 5.1931, "text": "I already deployed the project to 12 firebase accounts to let the students use my project the next year and I would like it to help them. I alse send them to each delegue an email to say them what they have to do"}, {"post_id": 45816, "ts": "2026-08-12T15:19:22Z", "hours": 2.1239, "text": "Use the app now for free with all the hightschools above France!! Link: https://cuentasfermat.web.app/ The password is : ChromaFermat@2026 Have fun!! 😊😊"}, {"post_id": 45595, "ts": "2026-08-12T05:53:03Z", "hours": 1.1178, "text": "Best 12 Hightschools use my app. They’re happy with it Already finished !! I will do an audit to see if they’re is some bugs and I will deploy it !!"}, {"post_id": 45170, "ts": "2026-08-11T14:20:09Z", "hours": 4.26, "text": "There’s 12 Hightshools that will use my app. I already ended the app. Thanks you for all those who helped me, and followed me in my project❤️❤️❤️❤️ I’m sorry that the app is it in french, i will translate to english for the next version. If youre interested to use that app at your hightschool I can translate it to your language."}, {"post_id": 43311, "ts": "2026-08-08T14:38:46Z", "hours": 4.4058, "text": "I finished three sections of my app, I love it. I used the free API of lemonde.fr (french news) to have the news all days. I also finished and added some features on the chat section. And I writed a message to the best High school at France to use it. Finnaly, at the configuration section, I added the list of all the membres of the class (they’re bots)"}, {"post_id": 41494, "ts": "2026-08-05T18:52:57Z", "hours": 1.5481, "text": "Already 10 high schools are going to use my app! I created this app for high schools in France, and a big tech company will help me deploy it throughout France. I will translate it to English next day. I also created a form, and so many people have already responded! I really enjoyed setting it up to connect with everyone."}, {"post_id": 40272, "ts": "2026-08-03T18:13:14Z", "hours": 1.2458, "text": "I configurated the chat section, and it works well, I have some users that use it. I used Firebase with the free trial to connect all the user messages so we can talk together. I did it fast because I already started yesterday, also I added a lot of buttons that spoils all the features that the app will have. Please like my post to let other people se my project, and if they’re interested to use it in they’re class."}, {"post_id": 40025, "ts": "2026-08-03T11:28:39Z", "hours": 2.4278, "text": "I finished the PowerPoint that I will send to delegates from different hightschools in France. I don’t have a good english so I translated it in english with translator. Please tell me what you think about the project, and if you should recommend me to improve some things. Thankss!!"}, {"post_id": 39633, "ts": "2026-08-02T19:12:07Z", "hours": 8.9369, "text": "That’s amazing. Hello !! I’m working on a project for studentsss!!! I’m so motivated because a big tech company will help me giving me servers to deploy it on all France. I’m working a lot, I’ve contacted already some people of the best hightschools in France to use my app. I will improve all and add features. I’m sorry, it’s in French because I’m french and will be used by French people, but if I see that more people are interested I will translate it to english, and at the end of the project I will translate it to english if they’re people that want it"}, {"post_id": 34515, "ts": "2026-07-25T09:32:54Z", "hours": 19.0533, "text": "I’m working a lot, I would like to create a an app that is like the schools apps for see our degrees but for students. It will be fun, and in an Inthership with a big company of tech and they said that they will help me. That motivated me a lot 😊😊"}]...
|
Title: WEB APP FOR STUDENTS by @Uxyamo | Stardance Title: WEB APP FOR STUDENTS by @Uxyamo | Stardance
Devlogs:
I’m working a lot, I would like to create a an app that is like the schools apps for see our degrees but for students. It will be fun, and in an Inthership with a big company of tech and they said that they will help me. That motivated me a lot 😊😊
That’s amazing. Hello !! I’m working on a project for studentsss!!! I’m so motivated because a big tech company will help me giving me servers to deploy it on all France. I’m working a lot, I’ve contacted already some people of the best hightschools in France to use my app. I will improve all and add features. I’m sorry, it’s in French because I’m french and will be used by French people, but if I see that more people are interested I will translate it to english, and at the end of the project I will translate it to english if they’re people that want it
I finished the PowerPoint that I will send to delegates from different hightschools in France. I don’t have a good english so I translated it in english with translator. Please tell me what you think about the project, and if you should recommend me to improve some things. Thankss!!
I configurated the chat section, and it works well, I have some users that use it. I used Firebase with the free trial to connect all the user messages so we can talk together. I did it fast because I already started yesterday, also I added a lot of buttons that spoils all the features that the app will have. Please like my post to let other people se my project, and if they’re interested to use it in they’re class.
Already 10 high schools are going to use my app! I created this app for high schools in France, and a big tech company will help me deploy it throughout France. I will translate it to English next day. I also created a form, and so many people have already responded! I really enjoyed setting it up to connect with everyone.
I finished three sections of my app, I love it. I used the free API of lemonde.fr (french news) to have the news all days. I also finished and added some features on the chat section. And I writed a message to the best High school at France to use it. Finnaly, at the configuration section, I added the list of all the membres of the class (they’re bots)
There’s 12 Hightshools that will use my app. I already ended the app. Thanks you for all those who helped me, and followed me in my project❤️❤️❤️❤️ I’m sorry that the app is it in french, i will translate to english for the next version. If youre interested to use that app at your hightschool I can translate it to your language.
Best 12 Hightschools use my app. They’re happy with it Already finished !! I will do an audit to see if they’re is some bugs and I will deploy it !!
Use the app now for free with all the hightschools above France!! Link: https://cuentasfermat.web.app/ The password is : ChromaFermat@2026 Have fun!! 😊😊
I already deployed the project to 12 firebase accounts to let the students use my project the next year and I would like it to help them. I alse send them to each delegue an email to say them what they have to do
Already finished the diaporama for the students that will use my app!! Take a look please, and say me what to improve!!
I finished the project!! Thanks yo evryone that helped me and followed me in my project!!
Hi everyone, there is some students that want to help me the next year, I readed all the messages of my deploy and I decided that it will be international
Some modifications…
I decided that because all students use discord, instagram and more I will transform my PWA into an app so they will can use that apps in my app
Ships:
Hi everyone! This project is for the delegates, 12 delegates of the best Hightschools in France and Morroco will use it the next year. A big tech company will help me with giving me servers to deploy my app. I am developing Fermat-Note, an application designed especially for high school and higher education students to centralize everything: class chat, shared homework management, self-help forums and collective organization. The app allows the class to be more organized and connected to improve class performance. Thanks you so much, I would like you to appreciate it, and if you would like to use it for your class, send me a message!! ❤️👌👌
Hi everyone! This project is for the delegates, 12 delegates of the best Hightschools in France and Morroco will use it the next year. A big tech company will help me with giving me servers to deploy my app.
I’m going to continue improving my project with some others creatorsn and thanks you everyone for all the support I had!!! Good luck!!...
|
1792842686.0336046
|
1792929086.0336046
|
|
70589
|
Matchday by @rudranil | Stardance
|
rudranil
|
0
|
3.83
|
0
|
[]
|
[{"post_id": 81187, "ts": "202 [{"post_id": 81187, "ts": "2026-10-20T07:20:25Z", "hours": 3.8264, "text": "UI UX for matchday"}]...
|
Title: Matchday by @rudranil | Stardance
Devlogs: Title: Matchday by @rudranil | Stardance
Devlogs:
UI UX for matchday...
|
1792482439.2377214
|
1793087239.2377214
|
|
46626
|
CobraOS by @Prajwol_Gynawali | Stardance
|
Prajwol_Gynawali
|
1
|
5.74
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-13T06:25:00Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "CobraOS is a web-based desktop environment I built with HTML, CSS, and JavaScript, inspired by my Fedora GNOME setup. The biggest challenge was making the different apps, windows, and interactions work together, but I’m proud that I turned a simple WebOS idea into a desktop that feels like my own. I used AI mainly for JavaScript debugging, browser integration, CSS improvements, and solving problems along the way.", "repo": "https://github.com/SnaggingCobra/CobraOS", "demo": "https://snaggingcobra.github.io/CobraOS/"}]...
|
[{"post_id": 81193, "ts": "202 [{"post_id": 81193, "ts": "2026-10-20T07:43:09Z", "hours": 1.085, "text": "finally finished adding paints in the os its a basic paints where you can draaw erse and simple thing"}, {"post_id": 46382, "ts": "2026-08-13T15:39:04Z", "hours": 0.6572, "text": "problem on theme and file explorer fixed"}, {"post_id": 46173, "ts": "2026-08-13T06:20:54Z", "hours": 0.2825, "text": "done in this project live through github pages"}, {"post_id": 46161, "ts": "2026-08-13T05:46:09Z", "hours": 0.3728, "text": "first time writing so much big codes its gettig intresting working icons and much more"}, {"post_id": 45884, "ts": "2026-08-12T16:59:00Z", "hours": 1.0267, "text": "done makinng lot of application working window working but still need to make this actual working"}, {"post_id": 45808, "ts": "2026-08-12T15:06:26Z", "hours": 0.3739, "text": "added working broweser winow inmy webos but coudnt configure how to actually make the sites working can anyone help me"}, {"post_id": 45495, "ts": "2026-08-12T01:03:39Z", "hours": 1.0533, "text": "done making the prototype with real time date and time mac style dock that enlarge when hover added battery indicator but idk it didnt supported still need to make the icon working"}, {"post_id": 45256, "ts": "2026-08-11T16:33:12Z", "hours": 0.65, "text": "added some thing in my web os with a welcome page with a button hat leadds you to main screen also added a task bar at top"}, {"post_id": 45218, "ts": "2026-08-11T15:33:49Z", "hours": 0.3339, "text": "started the project my Webos named it Cobra os just started this im looking a yt vedio to understand how to do these"}]...
|
Title: CobraOS by @Prajwol_Gynawali | Stardance
D Title: CobraOS by @Prajwol_Gynawali | Stardance
Devlogs:
started the project my Webos named it Cobra os just started this im looking a yt vedio to understand how to do these
added some thing in my web os with a welcome page with a button hat leadds you to main screen also added a task bar at top
done making the prototype with real time date and time mac style dock that enlarge when hover added battery indicator but idk it didnt supported still need to make the icon working
added working broweser winow inmy webos but coudnt configure how to actually make the sites working can anyone help me
done makinng lot of application working window working but still need to make this actual working
first time writing so much big codes its gettig intresting working icons and much more
done in this project live through github pages
problem on theme and file explorer fixed
finally finished adding paints in the os its a basic paints where you can draaw erse and simple thing
Ships:
CobraOS is a web-based desktop environment I built with HTML, CSS, and JavaScript, inspired by my Fedora GNOME setup. The biggest challenge was making the different apps, windows, and interactions work together, but I’m proud that I turned a simple WebOS idea into a desktop that feels like my own. I used AI mainly for JavaScript debugging, browser integration, CSS improvements, and solving problems along the way....
|
1792839131.4996657
|
1792925531.4996657
|
|
46814
|
text to desmos by @z2 | Stardance
|
z2
|
0
|
45.8
|
0
|
[]
|
[{"post_id": 81202, "ts": "202 [{"post_id": 81202, "ts": "2026-10-20T08:20:32Z", "hours": 2.1039, "text": "Implemented exporting and added text segment metrics. It’s 4 am here. This is my final devlog, goodbye 👋"}, {"post_id": 81174, "ts": "2026-10-20T05:57:42Z", "hours": 11.1444, "text": "Polished up everything. A lot of UI work and a few other changes I can’t remember. Anyways, we finally have something resembling a MVP :)"}, {"post_id": 79239, "ts": "2026-10-13T05:18:31Z", "hours": 7.4878, "text": "Finally embedded the actual calculator (which was surprisingly easy, thanks desmos team!) Also, I fixed a bug where control points were being rounded to a grid at small font sizes. I don’t think the current error metric for bezier curve flatness is good, since it’s a distance that depends on the size of the curve (which depends on font size). Maybe I could just scale the threshold by the font size, but I’d have to look more into it. That’s why in the new screenshot, there are way too many samples, even though I set the tolerance slider to the max. The sampling now happens in glyph space, which is at a way larger scale (1em = around 1000 units) compared to the output space, and I forgot to change the slider’s bounds. Also did a bunch of rewrites, and bumped the text shaping/font loading dependencies; their new API is so much simpler that I was able to get rid of a dependency I previously needed. It’s funny, but I regret that I had to deal with the old API."}, {"post_id": 70388, "ts": "2026-09-19T02:56:00Z", "hours": 1.5586, "text": "Implemented recursive subdivision sampling (why was this so easy?) Basically you split each cubic curve into two cub-curves at t=0.5, and repeat until the curve is approximately a line segment. Though I need to find error metrics that are easy to understand, the current one depends on font size. Image: sample points in black, control points in blue"}, {"post_id": 66194, "ts": "2026-09-11T21:13:10Z", "hours": 4.2167, "text": "Refactoring and cleaning up, in preparation for at least 2 more sampling options (fixed density and adaptive). Also removed duplicated code so that the debug view actually reflects the polygon output, instead of doing its own text shaping. Have random code screenshots now"}, {"post_id": 64570, "ts": "2026-09-09T02:34:21Z", "hours": 2.7386, "text": "Cleaned up the code and implemented a makeshift curve sampler. Currently I’m taking a fixed number of samples for each bezier segment in the glyph splines, so the resolution is inconsistent and there’s way more points than necessary in some places."}, {"post_id": 61702, "ts": "2026-09-04T18:59:18Z", "hours": 5.7539, "text": "Can now load .woff and .woff2 fonts, and the decompressed font & its shaper are stored globally instead of re-parsing every text update. I’m just outputting control points now, but soon I can finally implement the actual sampling. Also, something weird is going on with the Fira code variable font?"}, {"post_id": 50075, "ts": "2026-08-19T04:07:14Z", "hours": 8.8028, "text": "Drawing text to an svg path. Also set up a debug ui to make sure the text shaping (glyph layout, ligatures, etc) is being done properly. For that, I ended up using a recent HarfBuzz port with basically no docs, which was really fun and not at all hard to understand. I also spent a lot of time searching up browser apis on MDN, and figuring out how to work with async. Next up: keep the parsed font loaded on the Rust side detect and decompress .woff files actually convert it to polygon allow specifying fallback fonts find out how to allow more formatted text (italic/bold, line breaks, centering, etc)"}, {"post_id": 45325, "ts": "2026-08-11T18:19:47Z", "hours": 1.9942, "text": "First commit, I finished setting up the tooling and a template for svelte/wasm. Now time to go learn svelte"}]...
|
Title: text to desmos by @z2 | Stardance
Devlogs: Title: text to desmos by @z2 | Stardance
Devlogs:
First commit, I finished setting up the tooling and a template for svelte/wasm. Now time to go learn svelte
Drawing text to an svg path. Also set up a debug ui to make sure the text shaping (glyph layout, ligatures, etc) is being done properly. For that, I ended up using a recent HarfBuzz port with basically no docs, which was really fun and not at all hard to understand. I also spent a lot of time searching up browser apis on MDN, and figuring out how to work with async. Next up: keep the parsed font loaded on the Rust side detect and decompress .woff files actually convert it to polygon allow specifying fallback fonts find out how to allow more formatted text (italic/bold, line breaks, centering, etc)
Can now load .woff and .woff2 fonts, and the decompressed font & its shaper are stored globally instead of re-parsing every text update. I’m just outputting control points now, but soon I can finally implement the actual sampling. Also, something weird is going on with the Fira code variable font?
Cleaned up the code and implemented a makeshift curve sampler. Currently I’m taking a fixed number of samples for each bezier segment in the glyph splines, so the resolution is inconsistent and there’s way more points than necessary in some places.
Refactoring and cleaning up, in preparation for at least 2 more sampling options (fixed density and adaptive). Also removed duplicated code so that the debug view actually reflects the polygon output, instead of doing its own text shaping. Have random code screenshots now
Implemented recursive subdivision sampling (why was this so easy?) Basically you split each cubic curve into two cub-curves at t=0.5, and repeat until the curve is approximately a line segment. Though I need to find error metrics that are easy to understand, the current one depends on font size. Image: sample points in black, control points in blue
Finally embedded the actual calculator (which was surprisingly easy, thanks desmos team!) Also, I fixed a bug where control points were being rounded to a grid at small font sizes. I don’t think the current error metric for bezier curve flatness is good, since it’s a distance that depends on the size of the curve (which depends on font size). Maybe I could just scale the threshold by the font size, but I’d have to look more into it. That’s why in the new screenshot, there are way too many samples, even though I set the tolerance slider to the max. The sampling now happens in glyph space, which is at a way larger scale (1em = around 1000 units) compared to the output space, and I forgot to change the slider’s bounds. Also did a bunch of rewrites, and bumped the text shaping/font loading dependencies; their new API is so much simpler that I was able to get rid of a dependency I previously needed. It’s funny, but I regret that I had to deal with the old API.
Polished up everything. A lot of UI work and a few other changes I can’t remember. Anyways, we finally have something resembling a MVP :)
Implemented exporting and added text segment metrics. It’s 4 am here. This is my final devlog, goodbye 👋...
|
1792489845.8267293
|
1793094645.8267293
|
|
7614
|
UniScan by @dexrn | Stardance
|
dexrn
|
0
|
239.34
|
0
|
[]
|
[{"post_id": 81208, "ts": "202 [{"post_id": 81208, "ts": "2026-10-20T09:19:45Z", "hours": 9.0592, "text": "Coming in the next full update will also be UI modes This is so that the UI is optimized for every device and their input methods This is the Mobile one, and the main page will (when its finished) have all remotes including non-connected ones and a button to add more remotes and such."}, {"post_id": 80144, "ts": "2026-10-16T11:58:28Z", "hours": 3.9517, "text": "Working on settings…! After this there will be configuration on the serverside and then after that, audio streaming!"}, {"post_id": 79731, "ts": "2026-10-15T07:54:37Z", "hours": 6.7103, "text": "New logo! (credits at end) I intend to make the logo customizable by allowing you to change the color of various elements, and choose between different logos (since no other software ive seen does this) Maybe even change the color of the scanner display when someone is talking even… Thanks to Unomelon for the base, which I used to draw the scanner. Check out Unomelon here: https://bsky.app/profile/unomelon.bsky.social , and his very cool game Allumeria here: https://allumeria.com/ (wasnt asked to add this but I think the game is really cool and am somewhat active in the community)"}, {"post_id": 77782, "ts": "2026-10-08T08:12:30Z", "hours": 5.2025, "text": "Finally committed the latest Shiki changes, will release UniScan’s next commit tomorrow."}, {"post_id": 76647, "ts": "2026-10-04T07:57:18Z", "hours": 11.0072, "text": "Have been working on more Shiki refactors and a nice language system for servers in UniScan to provide language strings without being able to overwrite client language strings Reworked most of the TaskPipelineBuilder with many more accepting delegate types and have done some cleanup since Tomorrow I will finish up releasing the next Shiki version and then I think I will be able to release the next UniScan commit and then keep working for an alpha release."}, {"post_id": 73501, "ts": "2026-09-25T07:49:46Z", "hours": 9.2694, "text": "getting yelled at by starpheus because I haven’t made devlog yet spent all nighter last night refactoring shiki’s modulemanagement project and then today I refactored lots of shiki’s taskpipeline project, as well as some work being done on Shiki’s Result and family (shiki is the side project library with most of it’s code originating from UniScan, and UniScan heavily depends on it) Now the browser initialization is much cleaner (but not perfect of course) (first screenshot is new, second is old) Removed HostEnvironment because we usually only grab the parts from DI anyway"}, {"post_id": 73041, "ts": "2026-09-24T08:06:31Z", "hours": 11.4114, "text": "For funzies, here’s the dev build running inside a rooted Oculus Quest 2 (thanks to my friend for testing this) This is also a good test of the netcode over a long distance (they’re in Malaysia while I’m in the US) Getting close to committing this all alongside Shiki and such… Long cleanup process."}, {"post_id": 70021, "ts": "2026-09-18T09:20:00Z", "hours": 2.1572, "text": "Here’s a showcase of my Uniden SDS100 scanning, with UniScan showing the details in real time! I programmed in some garbage test channels so you won’t see any channels talking in this video. Everything shown here is sent by the server and updated by the server… Still somewhat far from complete as I have to figure out more stuff (mainly more stuff for the client to deal with, like hiding state display textblock on null bindings and more UI features/styling)."}, {"post_id": 69912, "ts": "2026-09-18T01:47:47Z", "hours": 10.1983, "text": "Okayyy so I was able to actually completely gut DeviceState and now it’s actually just a class which is also used to serialize individual states. This also means I can nuke reflection from the serialization process since I can just make IDeviceState forced to inherit IStateSerializer which will be much more dynamic!!! This means literally any states can be sent to the client and as long as the server or the module has the UI to render the states, it will work. This also allows states to be diffed and only the changed parts to be sent Second screenshot shows the UI sent by the server, note that the Volume: 0 is actually all being handled on the client via binding strings (where the server only sends the client the device states and the binding strings will look up those states itself)"}, {"post_id": 67990, "ts": "2026-09-14T10:18:38Z", "hours": 0.7964, "text": "And now we can finally start seeing the fruits of our labor"}, {"post_id": 67864, "ts": "2026-09-14T04:29:36Z", "hours": 7.07, "text": "IT FINALLY WORKS The UI shit I built on the server now syncs to the client correctly, and the flow isn’t actually too bad! Although this will be improved by also having a registry…registry…(yeah I know it’s weird) on the client so that UI elements can have values bind to them, and all the server has to do is send the client data to those registries"}, {"post_id": 65237, "ts": "2026-09-10T07:13:02Z", "hours": 3.4144, "text": "Went on a small side-tangent. Icons! (dw still working on the SSR device stuff)"}, {"post_id": 63401, "ts": "2026-09-07T06:50:20Z", "hours": 5.6181, "text": "Sorry, haven’t been super active due to life. Fixed a few bugs in the meantime and implemented most of the SSR binding stuff, but it’s far from finished, hell I haven’t even gotten to test it yet. Will be gone for a bit tomorrow, and the next day I will be at a different house for a few days albeit with my computer."}, {"post_id": 61349, "ts": "2026-09-04T07:02:15Z", "hours": 5.4761, "text": "While I didn’t get to scanner state displaying yet, I did refactor the classes that handle how remotes connect, disconnect, etc so that it’s not spread around the codebase. This fixes a few bugs related to state management due to how originally these viewmodels were constructed separately of eachother. Tomorrow I will be gone for a few hrs but should be back soon enough to hopefully make some more refactors and/or start on the remote display. Pictured is the new disconnect button in the remote on the sidebar"}, {"post_id": 60741, "ts": "2026-09-03T09:41:59Z", "hours": 2.8389, "text": "The client can now disconnect itself, and more styling has been added to the SSR UI (shown here is a Container which is centered and has a slight margin) tomorrow will be some more work on the SSR UI and then finally getting the scanner state to show on the client. I’m not too pleased with the idea that the server may change the look of the device pages on the clients, though… I still feel like there could be some better way to go about this."}, {"post_id": 60674, "ts": "2026-09-03T06:03:58Z", "hours": 7.28, "text": "I FINALLY GOT SSR WORKING MY GOD still too primitive to do anything atm, working on it."}, {"post_id": 59441, "ts": "2026-09-01T09:14:39Z", "hours": 2.6186, "text": "A friend of mine was able to test it on iOS, we got it working. Gonna have them send in the PR later and set up CI for it."}, {"post_id": 58714, "ts": "2026-08-31T07:59:18Z", "hours": 3.1222, "text": "Started working on state sync, will continue tomorrow probably States are synced now but I need to think about how to deal with scanner groups and channels and such because there are different types of channels (such as P25, conventional, etc) among other type issues and I want to reduce the need for any modules on the client if I can."}, {"post_id": 56408, "ts": "2026-08-28T05:18:41Z", "hours": 1.9061, "text": "UniScan Client v0.1.0, UniScan Server (Host) v0.1.1 Lots of changes, most of them are backend changes, but there are also a handful of frontend changes too! https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.1.0 Remotes are now stored per file instead of one large file, and the UI has been neatened up. The server now sends metadata containing a logo, various information, an MOTD, links, etc. The UI has been updated to display this information too. There are more changes than this, but there are too many to list here without hitting the 4000 char limit. Attached is a small video showing some of the new UI stuffs. By no means is it bug free, but the PR reached a point where it could be merged to allow for other important tasks to be focused on (like y’know, showing the actual scanner info)"}, {"post_id": 55440, "ts": "2026-08-27T08:29:55Z", "hours": 1.0639, "text": "I think this looks pretty nice apparently Avalonia has some nuget package that adds ItemsRepeater which does what I was originally trying to do in a cleaner way"}, {"post_id": 55410, "ts": "2026-08-27T06:57:46Z", "hours": 0.9983, "text": "Here’s the announcements UI, I think I’m almost done on this branch and then I’ll continue on main."}, {"post_id": 55287, "ts": "2026-08-27T00:47:49Z", "hours": 2.4511, "text": "Need opinions on this UI The server logo now shows where possible, so on the home view and in the sidebar In the remote view, there is a top ‘window’(?) that holds (from top to bottom): logo (to the side: title, description), server links and then the bottom floating window thing holds the server MOTD I still need to find a place to hold the server announcements… Alongside this were a ton of internal refactors, and the subscribe button now works (but the server still won’t properly send the current state) Been trying to post this since yesterday (I re-recorded the video today), but Hackatime has been down."}, {"post_id": 54227, "ts": "2026-08-25T03:48:43Z", "hours": 5.8811, "text": "Remotes are now stored per file instead of all inside one file. Additionally, server info is now properly cached! I had to rewrite most of the remote initialization flow, but now it’s much better. Adding and removing remotes automatically saves to disk because I can observe the list. This isn’t the end of this overhaul, but we’re getting closer… I think I want to refactor more of UniScanClient next. This is happening on another branch: https://github.com/UniScanProject/UniScan/tree/feat/use_server_provided_display_names After this branch is merged into main, I will make the available server info also show since we have the entire RemoteInfo being sent, which includes announcements, a description, a logo, etc."}, {"post_id": 53539, "ts": "2026-08-24T04:08:25Z", "hours": 3.6514, "text": "Working on dropping display names from client remotes As well as some refactor of the connection flow using my new TaskPipeline Once this is done, the server will be able to send branding, announcements, and other useful information on connect for the client to display!"}, {"post_id": 52159, "ts": "2026-08-22T07:56:54Z", "hours": 1.7483, "text": "Just released a new version, now you can make remotes from the UI finally. Here’s a video showing the creation flow. Note that the list is dynamic based on classes implementing IConnectionMethodFactoryViewModel with attribute ConnectionMethodFactoryViewModelAttribute"}, {"post_id": 52085, "ts": "2026-08-22T04:54:12Z", "hours": 2.8142, "text": "working on fixing the fact that you can’t really make remotes"}, {"post_id": 51645, "ts": "2026-08-21T13:05:32Z", "hours": 3.4047, "text": "FINALLY I GOT IT DONE IM SO TIRED New loading screen!!!! And OPFS file handles are now keyed by int im going to sleep now https://uniscan.dexrn.me"}, {"post_id": 51484, "ts": "2026-08-21T06:59:47Z", "hours": 0.3158, "text": "Much nicer loading screen"}, {"post_id": 51332, "ts": "2026-08-20T22:40:12Z", "hours": 2.3814, "text": "Alright I’ve committed and now you can access UniScan through https://uniscan.dexrn.me Note that since this is still an early version, you can’t really do much. You can also install it as a PWA on iOS, Android, and most desktop browsers. (pictured is UniScan as a PWA in ungoogled-chromium) Hopefully tomorrow I will fix the crash with adding remotes by making some sort of map of connection type -> UI widget to define the settings for them. (meant to post this yesterday, but GH was still working on some cert garbage)"}, {"post_id": 50726, "ts": "2026-08-20T02:11:03Z", "hours": 1.7997, "text": "UniScan now works in browser! I’ve also added a nice crash handler since unhandled exceptions act weird in the browser. Just polishing up now, will commit and set up Actions to host this. Once it’s up, the link will be https://uniscan.dexrn.me (The crash shown in the video is a real issue and will be fixed later.)"}, {"post_id": 50685, "ts": "2026-08-20T00:10:14Z", "hours": 2.6617, "text": "FINALLY I GOT OPFS WORKING GG"}, {"post_id": 50163, "ts": "2026-08-19T08:34:19Z", "hours": 0.6781, "text": "OK I GOT IT SOMEWHAT WORKING IN BROWSER FINALLY still need to keep implementing OPFS stuff though. serilog 01:32:29 [ERR | UniScan.Client.Core.Config.Remote.RemotesListFile] Failed to save remotes to remotes.json System.Exception: Entry not found at SpawnDev.SpawnJS.SpawnJSRuntime.<_InteropCallApplyAsync>d__132`1[[SpawnDev.SpawnJS.JSObjects.FileSystemSyncAccessHandle, SpawnDev.SpawnJS, Version=2.1.8.0, Culture=neutral, PublicKeyToken=null]].MoveNext()"}, {"post_id": 50120, "ts": "2026-08-19T06:14:18Z", "hours": 1.0522, "text": "I think this looks pretty good for a little loading screen. I’ll probably add a try/catch if possible and show an error dialog when some fatal exception is thrown… The “Loading…” text is temporary and is done in Avalonia, will make a proper loading screen there sometime later."}, {"post_id": 50073, "ts": "2026-08-19T03:53:07Z", "hours": 1.5272, "text": "Using this time to test out M3 web (even though it’s in maintenance mode) This is just for the loading screen while it downloads all the WASMs. The cell tower is temporary until I can either make my own logo or find someone who will make one for me."}, {"post_id": 49405, "ts": "2026-08-18T06:53:24Z", "hours": 0.5689, "text": "Waiting on a bug to be fixed in SpawnJS.WebWorkers and then hopefully next update will include web support + a website for y’all to test the client!!! Couldn’t do much today since I was so busy, however since I’m home now I can work on UniScan at a better time than 12 in the morning."}, {"post_id": 48708, "ts": "2026-08-17T06:57:16Z", "hours": 2.0306, "text": "Didn’t get to release last night, as a new bug popped up. 11>MessagePack.GeneratedMessagePackResolver.g.cs(74,74): Error CS0426 : The type name 'Shiki' does not exist in the type 'GeneratedMessagePackResolver'11>------- Finished building project: UniScan.Network. Succeeded: False. Errors: 1. Was able to fix it with some property in the AssemblyInfo. (see: github.com/MessagePack-CSharp/MessagePack-CSharp/issues/2133) I changed the Identifier to be a Slug instead for the devices. Working on browser stuff real quick and will commit sometime soon."}, {"post_id": 47901, "ts": "2026-08-16T05:27:47Z", "hours": 1.0794, "text": "Not fully happy with the manner in which this works, but the virtual scanner does work! Will publish some if not all of it tonight, but no version tag for this yet until I fix my refactoring."}, {"post_id": 47322, "ts": "2026-08-15T06:23:55Z", "hours": 1.4389, "text": "Working on a virtual scanner module to help development by simulating a scanner, hope to have it ready by tomorrow. This also means any future contributors will be able to start contributing even if they do not own a scanner!"}, {"post_id": 46716, "ts": "2026-08-14T05:00:44Z", "hours": 0.8869, "text": "spun up entire android emulator just to realize it was some debug code I forgot to remove that was causing it to throw and die because afaik currentdirectory is / for android apps? gonna release this and then start working on remote adding from UI I think"}, {"post_id": 46099, "ts": "2026-08-13T02:11:59Z", "hours": 5.3278, "text": "UniScan source is now up, you can view it at https://github.com/UniScanProject/UniScan UniScan Client & Server v0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Server.Host%2F0.0.2 Added CI for UniScan.Server.Host UniScan.Client.Core Use DI for PacketRegistry Update RemoteFactory.Create to pass PacketRegistry instance from DI Breaking Changes Updated RemoteServer constructors to take an instance of PacketRegistry Removed InternalUniScanClientPacketConfigurator Packets are now registered from AssembliesPacketSource InternalUniScanClientModule no longer adds an IPacketConfigurator to DI as this class has been removed. UniScan.Network Breaking Changes Renamed ScannerInfoPacket -> ScannerRegistrationPacket The new ID for this packet is UniScan:packet/clientbound/device/registration This fixes a bug where there were two instances of the same packet ID used for different packets in the codebase Removed BuiltinPacketRegistrar Removed IPacketConfigurator Moved PacketRegistry and RegistryPacketAttribute to UniScan.Network.Registry Created IPacketSource and AssembliesPacketSource AssembliesPacketSource collects all classes that inherit IPacket and have the RegistryPacket attribute. Removed the singleton Instance property from PacketRegistry Created PacketRegistry.RegisterFromSource and PacketRegistry.RegisterFromSource<TPacketSource> PacketRegistry.RegisterFromSource takes a given IPacketSource and registers all the packets it provides. PacketRegistry.RegisterFromSource<TPacketSource> creates a new instance of the given TPacketSource type and passes it to PacketRegistry.RegisterFromSource UniScan.Server.Core SubscribePacketHandler now sends the newly renamed ScannerRegistrationPacket Breaking Changes Removed PacketRegistry.RegisterFromSource InternalUniScanServerModule no longer adds an IPacketConfigurator to DI as this class has been removed. Packets are now registered from AssembliesPacketSource UniScan.Server.Host Now creates its own PacketRegistry and passes it to the UniScanServer constructor. UniScan.Tests Now creates its own PacketRegistry and passes it to the ClientSocket constructor."}, {"post_id": 44449, "ts": "2026-08-10T06:23:32Z", "hours": 11.9661, "text": "Been working on cleaning up the codebase in preparation for the initial commit. (thanks @CT5 for some of the motivation) https://github.com/UniScanProject/UniScan will be the project’s home. This does NOT mean it is ready to use, it is far from so. However, it means I will be able to publish releases and such, and everyone will be able to read the code. I will also be working on a Module alongside the core project, which acts as a virtual scanner, for testing of course. My next steps will be getting the virtual scanner module good enough to use as testing, then figure out what to do about the UI, as I don’t really want to force modules onto users. My idea here is that we send a UI ‘definition’(?) to the client for it to render, and let modules hook into them. Means we can also have each button call to the server when pressed if it’s meant to perform a server-side action. I am also planning a scope increase to include SDRs and two-way radios in the distant future. Would like y’alls opinions."}, {"post_id": 28082, "ts": "2026-07-14T03:34:16Z", "hours": 15.6422, "text": "Doing better at Avalonia so I was able to fix some issues and make the Home screen actually contain something useful, with this being a list of all connected remotes and their devices in one place. Oh, and a ton of netcode setup which I forgot to post in this devlog, will show it in the next one."}, {"post_id": 18787, "ts": "2026-06-30T00:07:21Z", "hours": 34.5525, "text": "so far so good! I might want to make the Identifier text slightly smaller….. Now onto making “subscriptions” work, couldn’t come up with a better name than this though. It takes me so long to do anything because I constantly have the urge to refactor things, as well as trying to get stuff perfect the first time."}, {"post_id": 7411, "ts": "2026-06-12T10:42:10Z", "hours": 11.1469, "text": "FINALLY HOLY SHIT WHY IS IT SUCH PAIN TO DO ASYNC INIT IN AVALONIA I wouldnt need to do this if the browser wasnt so picky with OPFS and async………. UGH basically now during OnFrameworkInitializationCompleted I just run task in background that calls my async function at end of async function it sets Content of root view to newly created MainViewModel"}, {"post_id": 6029, "ts": "2026-06-10T03:40:35Z", "hours": 2.2417, "text": "Finally getting remotes closer to working Now you can add them from the GUI (but you can’t connect to them yet…)"}, {"post_id": 5432, "ts": "2026-06-09T06:21:20Z", "hours": 0.9203, "text": "didn’t notice at the time but I was writing out the length with the wrong endianness fixed it and now dotnetty doesn’t silently ignore it"}, {"post_id": 5404, "ts": "2026-06-09T04:53:56Z", "hours": 10.0017, "text": "testing the socket, seems like packets aren’t being handled just yet but at least we’re getting somewhere"}]...
|
Title: UniScan by @dexrn | Stardance
Devlogs:
tes Title: UniScan by @dexrn | Stardance
Devlogs:
testing the socket, seems like packets aren’t being handled just yet but at least we’re getting somewhere
didn’t notice at the time but I was writing out the length with the wrong endianness fixed it and now dotnetty doesn’t silently ignore it
Finally getting remotes closer to working Now you can add them from the GUI (but you can’t connect to them yet…)
FINALLY HOLY SHIT WHY IS IT SUCH PAIN TO DO ASYNC INIT IN AVALONIA I wouldnt need to do this if the browser wasnt so picky with OPFS and async………. UGH basically now during OnFrameworkInitializationCompleted I just run task in background that calls my async function at end of async function it sets Content of root view to newly created MainViewModel
so far so good! I might want to make the Identifier text slightly smaller….. Now onto making “subscriptions” work, couldn’t come up with a better name than this though. It takes me so long to do anything because I constantly have the urge to refactor things, as well as trying to get stuff perfect the first time.
Doing better at Avalonia so I was able to fix some issues and make the Home screen actually contain something useful, with this being a list of all connected remotes and their devices in one place. Oh, and a ton of netcode setup which I forgot to post in this devlog, will show it in the next one.
Been working on cleaning up the codebase in preparation for the initial commit. (thanks @CT5 for some of the motivation) https://github.com/UniScanProject/UniScan will be the project’s home. This does NOT mean it is ready to use, it is far from so. However, it means I will be able to publish releases and such, and everyone will be able to read the code. I will also be working on a Module alongside the core project, which acts as a virtual scanner, for testing of course. My next steps will be getting the virtual scanner module good enough to use as testing, then figure out what to do about the UI, as I don’t really want to force modules onto users. My idea here is that we send a UI ‘definition’(?) to the client for it to render, and let modules hook into them. Means we can also have each button call to the server when pressed if it’s meant to perform a server-side action. I am also planning a scope increase to include SDRs and two-way radios in the distant future. Would like y’alls opinions.
UniScan source is now up, you can view it at https://github.com/UniScanProject/UniScan UniScan Client & Server v0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.0.2 https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Server.Host%2F0.0.2 Added CI for UniScan.Server.Host UniScan.Client.Core Use DI for PacketRegistry Update RemoteFactory.Create to pass PacketRegistry instance from DI Breaking Changes Updated RemoteServer constructors to take an instance of PacketRegistry Removed InternalUniScanClientPacketConfigurator Packets are now registered from AssembliesPacketSource InternalUniScanClientModule no longer adds an IPacketConfigurator to DI as this class has been removed. UniScan.Network Breaking Changes Renamed ScannerInfoPacket -> ScannerRegistrationPacket The new ID for this packet is UniScan:packet/clientbound/device/registration This fixes a bug where there were two instances of the same packet ID used for different packets in the codebase Removed BuiltinPacketRegistrar Removed IPacketConfigurator Moved PacketRegistry and RegistryPacketAttribute to UniScan.Network.Registry Created IPacketSource and AssembliesPacketSource AssembliesPacketSource collects all classes that inherit IPacket and have the RegistryPacket attribute. Removed the singleton Instance property from PacketRegistry Created PacketRegistry.RegisterFromSource and PacketRegistry.RegisterFromSource<TPacketSource> PacketRegistry.RegisterFromSource takes a given IPacketSource and registers all the packets it provides. PacketRegistry.RegisterFromSource<TPacketSource> creates a new instance of the given TPacketSource type and passes it to PacketRegistry.RegisterFromSource UniScan.Server.Core SubscribePacketHandler now sends the newly renamed ScannerRegistrationPacket Breaking Changes Removed PacketRegistry.RegisterFromSource InternalUniScanServerModule no longer adds an IPacketConfigurator to DI as this class has been removed. Packets are now registered from AssembliesPacketSource UniScan.Server.Host Now creates its own PacketRegistry and passes it to the UniScanServer constructor. UniScan.Tests Now creates its own PacketRegistry and passes it to the ClientSocket constructor.
spun up entire android emulator just to realize it was some debug code I forgot to remove that was causing it to throw and die because afaik currentdirectory is / for android apps? gonna release this and then start working on remote adding from UI I think
Working on a virtual scanner module to help development by simulating a scanner, hope to have it ready by tomorrow. This also means any future contributors will be able to start contributing even if they do not own a scanner!
Not fully happy with the manner in which this works, but the virtual scanner does work! Will publish some if not all of it tonight, but no version tag for this yet until I fix my refactoring.
Didn’t get to release last night, as a new bug popped up. 11>MessagePack.GeneratedMessagePackResolver.g.cs(74,74): Error CS0426 : The type name 'Shiki' does not exist in the type 'GeneratedMessagePackResolver'11>------- Finished building project: UniScan.Network. Succeeded: False. Errors: 1. Was able to fix it with some property in the AssemblyInfo. (see: github.com/MessagePack-CSharp/MessagePack-CSharp/issues/2133) I changed the Identifier to be a Slug instead for the devices. Working on browser stuff real quick and will commit sometime soon.
Waiting on a bug to be fixed in SpawnJS.WebWorkers and then hopefully next update will include web support + a website for y’all to test the client!!! Couldn’t do much today since I was so busy, however since I’m home now I can work on UniScan at a better time than 12 in the morning.
Using this time to test out M3 web (even though it’s in maintenance mode) This is just for the loading screen while it downloads all the WASMs. The cell tower is temporary until I can either make my own logo or find someone who will make one for me.
I think this looks pretty good for a little loading screen. I’ll probably add a try/catch if possible and show an error dialog when some fatal exception is thrown… The “Loading…” text is temporary and is done in Avalonia, will make a proper loading screen there sometime later.
OK I GOT IT SOMEWHAT WORKING IN BROWSER FINALLY still need to keep implementing OPFS stuff though. serilog 01:32:29 [ERR | UniScan.Client.Core.Config.Remote.RemotesListFile] Failed to save remotes to remotes.json System.Exception: Entry not found at SpawnDev.SpawnJS.SpawnJSRuntime.<_InteropCallApplyAsync>d__132`1[[SpawnDev.SpawnJS.JSObjects.FileSystemSyncAccessHandle, SpawnDev.SpawnJS, Version=2.1.8.0, Culture=neutral, PublicKeyToken=null]].MoveNext()
FINALLY I GOT OPFS WORKING GG
UniScan now works in browser! I’ve also added a nice crash handler since unhandled exceptions act weird in the browser. Just polishing up now, will commit and set up Actions to host this. Once it’s up, the link will be https://uniscan.dexrn.me (The crash shown in the video is a real issue and will be fixed later.)
Alright I’ve committed and now you can access UniScan through https://uniscan.dexrn.me Note that since this is still an early version, you can’t really do much. You can also install it as a PWA on iOS, Android, and most desktop browsers. (pictured is UniScan as a PWA in ungoogled-chromium) Hopefully tomorrow I will fix the crash with adding remotes by making some sort of map of connection type -> UI widget to define the settings for them. (meant to post this yesterday, but GH was still working on some cert garbage)
Much nicer loading screen
FINALLY I GOT IT DONE IM SO TIRED New loading screen!!!! And OPFS file handles are now keyed by int im going to sleep now https://uniscan.dexrn.me
working on fixing the fact that you can’t really make remotes
Just released a new version, now you can make remotes from the UI finally. Here’s a video showing the creation flow. Note that the list is dynamic based on classes implementing IConnectionMethodFactoryViewModel with attribute ConnectionMethodFactoryViewModelAttribute
Working on dropping display names from client remotes As well as some refactor of the connection flow using my new TaskPipeline Once this is done, the server will be able to send branding, announcements, and other useful information on connect for the client to display!
Remotes are now stored per file instead of all inside one file. Additionally, server info is now properly cached! I had to rewrite most of the remote initialization flow, but now it’s much better. Adding and removing remotes automatically saves to disk because I can observe the list. This isn’t the end of this overhaul, but we’re getting closer… I think I want to refactor more of UniScanClient next. This is happening on another branch: https://github.com/UniScanProject/UniScan/tree/feat/use_server_provided_display_names After this branch is merged into main, I will make the available server info also show since we have the entire RemoteInfo being sent, which includes announcements, a description, a logo, etc.
Need opinions on this UI The server logo now shows where possible, so on the home view and in the sidebar In the remote view, there is a top ‘window’(?) that holds (from top to bottom): logo (to the side: title, description), server links and then the bottom floating window thing holds the server MOTD I still need to find a place to hold the server announcements… Alongside this were a ton of internal refactors, and the subscribe button now works (but the server still won’t properly send the current state) Been trying to post this since yesterday (I re-recorded the video today), but Hackatime has been down.
Here’s the announcements UI, I think I’m almost done on this branch and then I’ll continue on main.
I think this looks pretty nice apparently Avalonia has some nuget package that adds ItemsRepeater which does what I was originally trying to do in a cleaner way
UniScan Client v0.1.0, UniScan Server (Host) v0.1.1 Lots of changes, most of them are backend changes, but there are also a handful of frontend changes too! https://github.com/UniScanProject/UniScan/releases/tag/UniScan.Client.App%2F0.1.0 Remotes are now stored per file instead of one large file, and the UI has been neatened up. The server now sends metadata containing a logo, various information, an MOTD, links, etc. The UI has been updated to display this information too. There are more changes than this, but there are too many to list here without hitting the 4000 char limit. Attached is a small video showing some of the new UI stuffs. By no means is it bug free, but the PR reached a point where it could be merged to allow for other important tasks to be focused on (like y’know, showing the actual scanner info)
Started working on state sync, will continue tomorrow probably States are synced now but I need to think about how to deal with scanner groups and channels and such because there are different types of channels (such as P25, conventional, etc) among other type issues and I want to reduce the need for any modules on the client if I can.
A friend of mine was able to test it on iOS, we got it working. Gonna have them send in the PR later and set up CI for it.
I FINALLY GOT SSR WORKING MY GOD still too primitive to do anything atm, working on it.
The client can now disconnect itself, and more styling has been added to the SSR UI (shown here is a Container which is centered and has a slight margin) tomorrow will be some more work on the SSR UI and then finally getting the scanner state to show on the client. I’m not too pleased with the idea that the server may change the look of the device pages on the clients, though… I still feel like there could be some better way to go about this.
While I didn’t get to scanner state displaying yet, I did refactor the classes that handle how remotes connect, disconnect, etc so that it’s not spread around the codebase. This fixes a few bugs related to state management due to how originally these viewmodels were constructed separately of eachother. Tomorrow I will be gone for a few hrs but should be back soon enough to hopefully make some more refactors and/or start on the remote display. Pictured is the new disconnect button in the remote on the sidebar
Sorry, haven’t been super active due to life. Fixed a few bugs in the meantime and implemented most of the SSR binding stuff, but it’s far from finished, hell I haven’t even gotten to test it yet. Will be gone for a bit tomorrow, and the next day I will be at a different house for a few days albeit with my computer.
Went on a small side-tangent. Icons! (dw still working on the SSR device stuff)
IT FINALLY WORKS The UI shit I built on the server now syncs to the client correctly, and the flow isn’t actually too bad! Although this will be improved by also having a registry…registry…(yeah I know it’s weird) on the client so that UI elements can have values bind to them, and all the server has to do is send the client data to those registries
And now we can finally start seeing the fruits of our labor
Okayyy so I was able to actually completely gut DeviceState and now it’s actually just a class which is also used to serialize individual states. This also means I can nuke reflection from the serialization process since I can just make IDeviceState forced to inherit IStateSerializer which will be much more dynamic!!! This means literally any states can be sent to the client and as long as the server or the module has the UI to render the states, it will work. This also allows states to be diffed and only the changed parts to be sent Second screenshot shows the UI sent by the server, note that the Volume: 0 is actually all being handled on the client via binding strings (where the server only sends the client the device states and the binding strings will look up those states itself)
Here’s a showcase of my Uniden SDS100 scanning, with UniScan showing the details in real time! I programmed in some garbage test channels so you won’t see any channels talking in this video. Everything shown here is sent by the server and updated by the server… Still somewhat far from complete as I have to figure out more stuff (mainly more stuff for the client to deal with, like hiding state display textblock on null bindings and more UI features/styling).
For funzies, here’s the dev build running inside a rooted Oculus Quest 2 (thanks to my friend for testing this) This is also a good test of the netcode over a long distance (they’re in Malaysia while I’m in the US) Getting close to committing this all alongside Shiki and such… Long cleanup process.
getting yelled at by starpheus because I haven’t made devlog yet spent all nighter last night refactoring shiki’s modulemanagement project and then today I refactored lots of shiki’s taskpipeline project, as well as some work being done on Shiki’s Result and family (shiki is the side project library with most of it’s code originating from UniScan, and UniScan heavily depends on it) Now the browser initialization is much cleaner (but not perfect of course) (first screenshot is new, second is old) Removed HostEnvironment because we usually only grab the parts from DI anyway
Have been working on more Shiki refactors and a nice language system for servers in UniScan to provide language strings without being able to overwrite client language strings Reworked most of the TaskPipelineBuilder with many more accepting delegate types and have done some cleanup since Tomorrow I will finish up releasing the next Shiki version and then I think I will be able to release the next UniScan commit and then keep working for an alpha release.
Finally committed the latest Shiki changes, will release UniScan’s next commit tomorrow.
New logo! (credits at end) I intend to make the logo customizable by allowing you to change the color of various elements, and choose between different logos (since no other software ive seen does this) Maybe even change the color of the scanner display when someone is talking even… Thanks to Unomelon for the base, which I used to draw the scanner. Check out Unomelon here: https://bsky.app/profile/unomelon.bsky.social , and his very cool game Allumeria here: https://allumeria.com/ (wasnt asked to add this but I think the game is really cool and am somewhat active in the community)
Working on settings…! After this there will be configuration on the serverside and then after that, audio streaming!
Coming in the next full update will also be UI modes This is so that the UI is optimized for every device and their input methods This is the Mobile one, and the main page will (when its finished) have all remotes including non-connected ones and a button to add more remotes and such....
|
1792785158.047574
|
1793389958.047574
|
|
66734
|
GothOS by @ojasthakur | Stardance
|
ojasthakur
|
2
|
33.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T18:06:48Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Since the last ship for WebOS1. I had already added alotta features which seemed like an overkill for the last one. This time, I’ve added 3 small features and a few bug fixes for WebOS2. Cursor following Bat-pet A better welcome page with animated text saying “Goth”. To-Do list.", "repo": "https://github.com/OjasQwQ/GothOS", "demo": "https://ojasqwq.github.io/GothOS/"}, {"ship_num": 2, "ts": "2026-10-12T10:54:25Z", "hours": 31.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I’ve made a Goth/Alt themed WebOS. I’ve made this because I’m fond of Rock Music and I really resonate with Goth Subculture. It has the following features:- Notes/Journal App Vinyl themed music player. A basic calculator “Now Playing” flyer. Music visualiser which reacts to the vinyl player. Google Search Bar with typewriting animation.", "repo": "https://github.com/OjasQwQ/GothOS", "demo": "https://ojasqwq.github.io/GothOS/"}]...
|
[{"post_id": 81209, "ts": "202 [{"post_id": 81209, "ts": "2026-10-20T09:24:25Z", "hours": 1.0547, "text": "Changed the unclean gif with a looping mp4 typewriter animated effect on the word “Goth”. Changed the position of the nametag and and added the click event to change webpages on the whole screen. The design looks way better and clean now."}, {"post_id": 81196, "ts": "2026-10-20T08:01:47Z", "hours": 1.0583, "text": "I just created this bat pet which follows the mouse cursor on the OS page. The bat image is an SVG and and the wings on the back are animated. Its able to flip to the right before catching up to the cursor when the its is dragged fast across the screen"}, {"post_id": 79004, "ts": "2026-10-12T09:48:17Z", "hours": 0.5125, "text": "I’ve fixed the majority of the bugs related to the calculator and the music visualiser. LETS SHIP THE PROJECT GNG!"}, {"post_id": 78992, "ts": "2026-10-12T08:48:57Z", "hours": 3.0678, "text": "Added a calculator to the OS but its really buggy rn. All the buttons are concentrated in the bottom right lol. I’ll fix this soon. I added a music visualiser aswell which reacts the the music from the media player in the OS."}, {"post_id": 78734, "ts": "2026-10-11T13:06:11Z", "hours": 4.1992, "text": "I just gave the search-bar a typewriter animation, made the header for music-window transparent, customized the taskbar and made it sleeker, changed all png logos to svgs, bug fixes related to screen initialisation. I also gave it a new feature of a “Now Playing” popup/flyer upon changing/starting the tracks."}, {"post_id": 78134, "ts": "2026-10-09T18:00:54Z", "hours": 4.4858, "text": "Ok so I’m pivoting the whole idea into a Goth/Alt theme and hence changed the named to GothOS. I’ve updated the homepage. The vinyl player works better and is more scalable now. I’ll be adding more songs to it. I’m thinking of adding a “Music Playing” flyout on the top left of the OS screen the music is changed."}, {"post_id": 77261, "ts": "2026-10-06T10:20:43Z", "hours": 1.38, "text": "Made this Vinyl player which plays My Own Summer (for now) for my webOS. I made this on css mainly and used js to make this functional. The disk rotates aswell as the tone-arm when a song is played. The slider is to adjust the volume."}, {"post_id": 76819, "ts": "2026-10-04T18:17:57Z", "hours": 3.5981, "text": "I’ve been looking for a better wallpaper but couldn’t find much :( Added those two “see this Angel?” images for I-don’t-know-why but I thought that maybe we can make them clickable and they change their position to a random location on the screen lol. Google searchbar works and Css patches."}, {"post_id": 76598, "ts": "2026-10-04T03:54:31Z", "hours": 3.3169, "text": "So the notes application’s functionality is nearly complete! (The design part is not). I also implemented a way to make change the index of windows upon click to bring them to the foreground. Icons on the taskbar become smaller when selected and comes back to their original size when exiting the window or selecting another window/icon."}, {"post_id": 76393, "ts": "2026-10-03T12:06:47Z", "hours": 4.3689, "text": "Started working on the first app- Notes 1.Implemented a draggable notes window with open/close functionality (guitar logo for now). 2.Updated taskbar logo with an ID for click animation. 3.Improved CSS styles and alignments for taskbar, logos, and notes window. [removed the space bw the logos and the taskbar boundary which was bothering me]"}, {"post_id": 75913, "ts": "2026-10-01T16:14:54Z", "hours": 1.7258, "text": "I made another page for the OS and connected it with the welcome screen. I decided to keep the tab on the bottom where I’ll find better icons to put thing. Can someone suggest me a better wallpaper? It needs alotta work. I made my nametag on the initial welcome screen movable while I was trying it out lol."}, {"post_id": 75667, "ts": "2026-09-30T17:58:27Z", "hours": 2.4381, "text": "Checked off quite a few things off my To-Do list. Hosted the pages, corrected allignments, dragable elements, added a README. Looked dope on my phone."}, {"post_id": 75512, "ts": "2026-09-30T10:21:30Z", "hours": 1.9194, "text": "I’ve just started to work on “RockOS” for all the music nerds out there! Lets see where this project takes me."}]...
|
Title: GothOS by @ojasthakur | Stardance
Devlogs: Title: GothOS by @ojasthakur | Stardance
Devlogs:
I’ve just started to work on “RockOS” for all the music nerds out there! Lets see where this project takes me.
Checked off quite a few things off my To-Do list. Hosted the pages, corrected allignments, dragable elements, added a README. Looked dope on my phone.
I made another page for the OS and connected it with the welcome screen. I decided to keep the tab on the bottom where I’ll find better icons to put thing. Can someone suggest me a better wallpaper? It needs alotta work. I made my nametag on the initial welcome screen movable while I was trying it out lol.
Started working on the first app- Notes 1.Implemented a draggable notes window with open/close functionality (guitar logo for now). 2.Updated taskbar logo with an ID for click animation. 3.Improved CSS styles and alignments for taskbar, logos, and notes window. [removed the space bw the logos and the taskbar boundary which was bothering me]
So the notes application’s functionality is nearly complete! (The design part is not). I also implemented a way to make change the index of windows upon click to bring them to the foreground. Icons on the taskbar become smaller when selected and comes back to their original size when exiting the window or selecting another window/icon.
I’ve been looking for a better wallpaper but couldn’t find much :( Added those two “see this Angel?” images for I-don’t-know-why but I thought that maybe we can make them clickable and they change their position to a random location on the screen lol. Google searchbar works and Css patches.
Made this Vinyl player which plays My Own Summer (for now) for my webOS. I made this on css mainly and used js to make this functional. The disk rotates aswell as the tone-arm when a song is played. The slider is to adjust the volume.
Ok so I’m pivoting the whole idea into a Goth/Alt theme and hence changed the named to GothOS. I’ve updated the homepage. The vinyl player works better and is more scalable now. I’ll be adding more songs to it. I’m thinking of adding a “Music Playing” flyout on the top left of the OS screen the music is changed.
I just gave the search-bar a typewriter animation, made the header for music-window transparent, customized the taskbar and made it sleeker, changed all png logos to svgs, bug fixes related to screen initialisation. I also gave it a new feature of a “Now Playing” popup/flyer upon changing/starting the tracks.
Added a calculator to the OS but its really buggy rn. All the buttons are concentrated in the bottom right lol. I’ll fix this soon. I added a music visualiser aswell which reacts the the music from the media player in the OS.
I’ve fixed the majority of the bugs related to the calculator and the music visualiser. LETS SHIP THE PROJECT GNG!
I just created this bat pet which follows the mouse cursor on the OS page. The bat image is an SVG and and the wings on the back are animated. Its able to flip to the right before catching up to the cursor when the its is dragged fast across the screen
Changed the unclean gif with a looping mp4 typewriter animated effect on the word “Goth”. Changed the position of the nametag and and added the click event to change webpages on the whole screen. The design looks way better and clean now.
Ships:
I’ve made a Goth/Alt themed WebOS. I’ve made this because I’m fond of Rock Music and I really resonate with Goth Subculture. It has the following features:- Notes/Journal App Vinyl themed music player. A basic calculator “Now Playing” flyer. Music visualiser which reacts to the vinyl player. Google Search Bar with typewriting animation.
Since the last ship for WebOS1. I had already added alotta features which seemed like an overkill for the last one. This time, I’ve added 3 small features and a few bug fixes for WebOS2. Cursor following Bat-pet A better welcome page with animated text saying “Goth”. To-Do list....
|
1792817357.1172106
|
1792903757.1172106
|
|
63792
|
PrepBS by @Labrez | Stardance
|
Labrez
|
1
|
42.09
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-02T07:38:40Z", "hours": 14.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I am building a web app PrepBS, a dashboard to make a record of your study. If we take examples, if you are preparing for an Olympiad, while you are onboarding you can fill in the details regarding your exam, the date of the exams, your targeted study time, daily study time, and things more like that. When you fill that while onboarding, according to that data a specialized personalized dashboard has been created. You can use that dashboard as the main feature. The core feature of the dashboard is the focus sessions. In that there are three modes: Pomodoro, focus, and deep focus, and in each you have different timers. You can start your session and after that session is over, an automatic break timer is set up. After that is over you can start your session again and continue your preparation. It helps to manage your time and preparation and you can also see your records of how many study sessions you’ve had. If you select a targeted study time, like 3 hours, as the sessions are over, your target bar is also increasing. When you reach 3 hours you can see on the dashboard that your study target is completed. Add more cool features to my project and I’m proud of it. It is my first full-stack project and I deployed the frontend on Vercel and my backend on Render. Using Render is a new thing and I am also proud of it as it is the first time I have built and deployed my project. Very enthusiastic things happen to me.", "repo": "https://github.com/Labrez-2010/PrepBS", "demo": "https://prep-bs.vercel.app"}]...
|
[{"post_id": 81216, "ts": "202 [{"post_id": 81216, "ts": "2026-10-20T10:26:01Z", "hours": 3.7881, "text": "After a long time finally, my new theme is completed. I don’t know why I made the mistake in just a simple language, CSS. Even though I write the maximum code by myself, still for the responsiveness of the website I use ChatGPT. That’s the part I need to work on by myself. That project also helped me to know my skills and where I am lagging behind. now i only need to update Readme then i ready to ship….."}, {"post_id": 80450, "ts": "2026-10-17T17:37:52Z", "hours": 10.35, "text": "finally i completed my all pages now only dashboard is left that i do then newlook of PrepBS is ready"}, {"post_id": 79064, "ts": "2026-10-12T15:26:38Z", "hours": 8.4353, "text": "i successfully build my register ( create account) page and first page of onboarding ..in which i have a botton for lets starting ( basucally it is asking are you ready) and i feeling i am thinking about i taking too much time for writing css because i am slowly-slowly writes my css and i try to write faster for my upcoming pages …."}, {"post_id": 77043, "ts": "2026-10-05T13:57:09Z", "hours": 5.5206, "text": "Here is a new look of PrepBS. It gives a very nice vibe and also I changed the CSS code and I wrote it by myself. Then I observed one thing: my website is not responsive. What I did was I copied all the code and tried to set it to be responsive, the smallest one. i only said to ChatGPT than in code ChatGPT add limits are between my page load cards and all the components load, then my website is also built to be responsive. Now that’s the look of my login page."}, {"post_id": 76061, "ts": "2026-10-02T07:14:12Z", "hours": 0.6733, "text": "I’m ready my project for development. I changed the Some code Create .env and more….., and then I deployed my backend on Render and my frontend on the Vercel and I connected both of them. First time i deploying my project. I took help from ChatGPT to know how to implement the command. I need to run the command npm run build and do more thing then my web App go live on internet"}, {"post_id": 75960, "ts": "2026-10-01T18:56:57Z", "hours": 7.7631, "text": "i completed my MVP , i build complete my webapp in MERN stack and i am confuse abour whether i add more features or deploy i buided a complete AUTH aspect to my add connected to real time Database , build all pages and component , debug all needed Api and check their functionality …and more ……."}, {"post_id": 74927, "ts": "2026-09-28T16:38:11Z", "hours": 1.2411, "text": "Yahhh.. Today i complete my auth pages and System in which user can create profile and login if they already have a account . Next i do … work on onboarding page and dashboard ……."}, {"post_id": 74550, "ts": "2026-09-27T16:47:52Z", "hours": 3.8144, "text": "Today I completed my authentication system, in which I created the registration and login page i also created the frontend of Login Page, I need to connected the frontend to the backend through and APIs and then… I built 70% of the authentication system of my app."}, {"post_id": 70986, "ts": "2026-09-20T05:01:39Z", "hours": 0.4897, "text": "I am building PrepBS , A smart study management platform …. i spent some time a create a basic server …then i will start programming for my real WEBAPP"}]...
|
Title: PrepBS by @Labrez | Stardance
Devlogs:
I a Title: PrepBS by @Labrez | Stardance
Devlogs:
I am building PrepBS , A smart study management platform …. i spent some time a create a basic server …then i will start programming for my real WEBAPP
Today I completed my authentication system, in which I created the registration and login page i also created the frontend of Login Page, I need to connected the frontend to the backend through and APIs and then… I built 70% of the authentication system of my app.
Yahhh.. Today i complete my auth pages and System in which user can create profile and login if they already have a account . Next i do … work on onboarding page and dashboard …….
i completed my MVP , i build complete my webapp in MERN stack and i am confuse abour whether i add more features or deploy i buided a complete AUTH aspect to my add connected to real time Database , build all pages and component , debug all needed Api and check their functionality …and more …….
I’m ready my project for development. I changed the Some code Create .env and more….., and then I deployed my backend on Render and my frontend on the Vercel and I connected both of them. First time i deploying my project. I took help from ChatGPT to know how to implement the command. I need to run the command npm run build and do more thing then my web App go live on internet
Here is a new look of PrepBS. It gives a very nice vibe and also I changed the CSS code and I wrote it by myself. Then I observed one thing: my website is not responsive. What I did was I copied all the code and tried to set it to be responsive, the smallest one. i only said to ChatGPT than in code ChatGPT add limits are between my page load cards and all the components load, then my website is also built to be responsive. Now that’s the look of my login page.
i successfully build my register ( create account) page and first page of onboarding ..in which i have a botton for lets starting ( basucally it is asking are you ready) and i feeling i am thinking about i taking too much time for writing css because i am slowly-slowly writes my css and i try to write faster for my upcoming pages ….
finally i completed my all pages now only dashboard is left that i do then newlook of PrepBS is ready
After a long time finally, my new theme is completed. I don’t know why I made the mistake in just a simple language, CSS. Even though I write the maximum code by myself, still for the responsiveness of the website I use ChatGPT. That’s the part I need to work on by myself. That project also helped me to know my skills and where I am lagging behind. now i only need to update Readme then i ready to ship…..
Ships:
I am building a web app PrepBS, a dashboard to make a record of your study. If we take examples, if you are preparing for an Olympiad, while you are onboarding you can fill in the details regarding your exam, the date of the exams, your targeted study time, daily study time, and things more like that. When you fill that while onboarding, according to that data a specialized personalized dashboard has been created. You can use that dashboard as the main feature. The core feature of the dashboard is the focus sessions. In that there are three modes: Pomodoro, focus, and deep focus, and in each you have different timers. You can start your session and after that session is over, an automatic break timer is set up. After that is over you can start your session again and continue your preparation. It helps to manage your time and preparation and you can also see your records of how many study sessions you’ve had. If you select a targeted study time, like 3 hours, as the sessions are over, your target bar is also increasing. When you reach 3 hours you can see on the dashboard that your study target is completed. Add more cool features to my project and I’m proud of it. It is my first full-stack project and I deployed the frontend on Vercel and my backend on Render. Using Render is a new thing and I am also proud of it as it is the first time I have built and deployed my project. Very enthusiastic things happen to me....
|
1792814070.6056218
|
1792900470.6056218
|
|
54623
|
My_TechPad by @MoonRock | Stardance
|
MoonRock
|
0
|
14.66
|
0
|
[]
|
[{"post_id": 81220, "ts": "202 [{"post_id": 81220, "ts": "2026-10-20T10:49:46Z", "hours": 4.3033, "text": "Devlog #5: Final development update before I submit my project for review. I coded nonstop for four hours and have finally finished the firmware. I also organized everything, and it’s now ready for submission."}, {"post_id": 81100, "ts": "2026-10-19T21:22:20Z", "hours": 3.4397, "text": "devlog #4 :: completed cad desiging, and half bit work regarding firmware"}, {"post_id": 80758, "ts": "2026-10-18T18:25:05Z", "hours": 4.1617, "text": "devlog#3: Finalyy completed the entire pcb circuit. quite a feat. Will be starting main design from tommorrow"}, {"post_id": 80340, "ts": "2026-10-17T10:08:47Z", "hours": 0.4833, "text": "devlog#2: finally started with the schematic design for my Techpad.Built the switch matrix and figured out some stuff.(Nothing beats google)"}, {"post_id": 80213, "ts": "2026-10-16T19:21:16Z", "hours": 2.2769, "text": "devlog1:: Gathered my thoughts and began working on my new project. I read the complete guide, defined a clear goal and design, installed everything I needed, and started building the PCB."}]...
|
Title: My_TechPad by @MoonRock | Stardance
Devlog Title: My_TechPad by @MoonRock | Stardance
Devlogs:
devlog1:: Gathered my thoughts and began working on my new project. I read the complete guide, defined a clear goal and design, installed everything I needed, and started building the PCB.
devlog#2: finally started with the schematic design for my Techpad.Built the switch matrix and figured out some stuff.(Nothing beats google)
devlog#3: Finalyy completed the entire pcb circuit. quite a feat. Will be starting main design from tommorrow
devlog #4 :: completed cad desiging, and half bit work regarding firmware
Devlog #5: Final development update before I submit my project for review. I coded nonstop for four hours and have finally finished the firmware. I also organized everything, and it’s now ready for submission....
|
1792799233.1845396
|
1793404033.1845396
|
|
19230
|
20% Cooler KEYBOARD by @matthewwong12 | Stardance
|
matthewwong12
|
0
|
63.9
|
0
|
[]
|
[{"post_id": 81226, "ts": "202 [{"post_id": 81226, "ts": "2026-10-20T11:14:38Z", "hours": 1.9336, "text": "what’s up Everypony this is the last devblog im posting before i ship my project for funding. during this time period , i made some finishing touches to the Case , prep it for production and i am just writing and updating my repo constantly. anyway i think i done with this project for now gotta work on my website fr fr it’s also exam season now for me, so there might be less frequent update enjoy this assembly animation i made :)"}, {"post_id": 79099, "ts": "2026-10-12T17:35:09Z", "hours": 7.5019, "text": "howdy pony ! this is it im done with my case this is it we’re done with the designing phase , things i did: changed the 3d model of the pi pico with a usb c cut out the upper case heatset insert hole cut out space for the screw head sticking out at the plate cut out the usb-c charger hole rounded the case edges oooo idk if u notice but there’s a big hole on top of pico and that’s there on purpose so i can add a clear acrylic plate there. oh yeah and the text there also have space below to insert some light dispersing material. tomorrow is repo day people im going go over yer tutorial now once you finish your pcb and it all checks out , now it’s time to create an enclosure for it . first export the stp file from kicad(there’s an option for you to export the silkscreen). then go to your software and import your stp file into your cad software.when i did this process i did encounter an issue where the stp file fail to translate(FUSION) so big L but there’s a work around. first i go to onshape and import and translate the file there. then we export the file that is just translated by onshape into fusion and voila success there’s many type of different design and mounting style to choose from and of course the more fancy you want it the harder it gets (to model :P ) i used the bottom mount layout , it’s sort of a balanced options out of all the style . but hey what matters is personal preference do you like it thocky or creamy or clicky ? so choose what you want. either way i don’t really have much advice for this. much of it drawing sketch and basic math . it’s not hard and not easy, there’s definitely a learning curve and there will be a lot of failing before something stuck. fact btw when i was pushing to finish this keyboard for keeb i sat down for almost 6 hour and i felt like the ash baby afterwards (ps i didn’t make it). so trial and error buddy when you fall seven times, you stand up eight !!!"}, {"post_id": 77908, "ts": "2026-10-08T18:46:17Z", "hours": 10.4783, "text": "wassup Every Pony it’s me again with another devblog now the schematics is out the way, it’s time to move on to the actual PCB , this by far the longest process for me, you have take lots of things into consideration. when you first open the PCB editor , the first thing you do is import the parts you place in your schematics (there’s a button for that) then you would wanna go back to Keyboard layout editor to download the JSON File of your layout , then go back to kicad and open the plugin manager then download keyboard layout placer. you then go back to the pcb editor and open the plugin , there you will be able to insert your JSON file then the plugin will do the placing for you how cool is that ? there also an option to add more parts to be auto place. when you finish that you would need to draw out your pcb board edge with that we first select the edge cut layer then select whether the draw line tool or rectangles tool, left click and drag then voila you define your pcb borders. FOR RGB LED and HOT SWAP sockets you need to flip those to backside of the board for them to work. you also need the 5v trace to be thicker, how thick ? there’s a tool for that (PCB Trace width calculator) , a standard usb 3.0 output 0.9amps at 5v while usb 2.0 outputs 0.5 amps at 5v, check your usb port before deciding. now here comes the actual complicated part , routing it all together in a basic pcb you have two layer the front and back , so you have two layers to work with, you route wire by pressing x , to switch to the backside press v note v is also use to place vias vias are like channel that connect the front trace to back trace and it works the other way around. utilize them to the fullest extend . placing ground plane adding a ground plane is quick and easy press the draw filled zones ,select which layers have the most or both, set the net as GND and draw. a ground plane is like a filter of some sort, idk go google it. therefore adding one is good practice. DRC this is the most important thing you need to do everytime you finish making a change, the DRC checks for everything unconnected traces , shorted wires , parts clipping , silkscreen clipping. so i would advise you to run the drc everytime you finish a task, so you can fix the issue. customizing your board you can customize your board and add art using SVG and SIlkscreen. silkscreen is a non conductive layer use to add text and cool arts. woah now that’s a long read but there’s more What i did this past few day so this few days i just been doing CAD , the plate finish , i got the top case rough shape finish and i almost finish the bottom case just the usb-c port left. i went through three different design variations and eventually settle down for the design for the bottom case (in picture). i also model my own custom rotary encoder knob. i want to import a knurl design at first but then the model i import was too large and when i scale it down it won’t fit. either way we’re getting close to finishing the design phase."}, {"post_id": 76808, "ts": "2026-10-04T17:15:26Z", "hours": 3.0169, "text": "Hello every Pony im back again with more things to share. so now that you figure out what fancy features you want for your keyboard it’s time to make it come to fruition. you would need to first create your PCB first and to do that i use KICAD. the first step is to create your schematics first (it’s like instruction telling your component which wire goes where).In My schematics i use the PI PICO as my brain of my keyboard and i created a keyboard matrix based on the layout i want . so the Pi pico have a limited amount of GPIO pins if wire all our keyswitch to our pico we would need a dozen of pico and we don’t want that. so we create a keyboard matrix. i also added in a GPIO expansion chip mcp23017 to accommodate those other fancy feature i have.This stage is very crucial as any mistake make here will be a big headache when you wire your actual pcb. some tools that i found very useful: Keyboard layout editor.com, Marbastlib(KIcad plugin) so what i did today, i continue working on my keyboard cad files today, boy o boy is tiring , i have to manually place and align each keycap and it took a while bcs im such a perfectionist. anyway i decided to use a top mount layout for my keyboard so there will three layer a bottom case , the plate and the upper case. im so impatient , i want to finish this quickly !!! anyhow , everything i just said was oversimplified , remember to do your own research. until next time stay cool every pony"}, {"post_id": 75955, "ts": "2026-10-01T18:42:40Z", "hours": 0.6833, "text": "hey ya guys since i started project sometime ago i will tried to retell what i did and also include some ongoing process like what i did etc. so what do you do when you want to make a keyboard ? you do tons of research of course. keyboard format 60% 75% TKL etc features like knobs ,backlit and display Hot swappable ? or simply solder it on? all this have to be taken into consideration ultimately i choose to go with the 75% format ,with all kinds of fancy features(knobs,oled display,rgb backlit,hot swappable). below is an early sketch of what i want in my keyboard // so today i went back to the pcb and added more graphics cause why not , i got more time now"}, {"post_id": 75817, "ts": "2026-10-01T07:30:14Z", "hours": 40.2828, "text": "what’s up Guys alright so i may have been gone for a few days but now im back with a new project. RAINBOW DASH KEYBOARD yeah it was originally gonna be submitted to #keeb but i miss the deadline so im going to submit to Stardance instead. so currently i have Logged 40h 16min with lapse and i have finished designing the PCB and now currently designing the case for it. everything before this devblog will be in my github REPO ie timeline, pcb ,sch and case so definitely go through my repo. the features ; so this keyboard will have hot swappable backlit keyswitch with a rotary encoder, oled screen and a custom 3d case to go with it"}]...
|
Title: 20% Cooler KEYBOARD by @matthewwong12 | Sta Title: 20% Cooler KEYBOARD by @matthewwong12 | Stardance
Devlogs:
what’s up Guys alright so i may have been gone for a few days but now im back with a new project. RAINBOW DASH KEYBOARD yeah it was originally gonna be submitted to #keeb but i miss the deadline so im going to submit to Stardance instead. so currently i have Logged 40h 16min with lapse and i have finished designing the PCB and now currently designing the case for it. everything before this devblog will be in my github REPO ie timeline, pcb ,sch and case so definitely go through my repo. the features ; so this keyboard will have hot swappable backlit keyswitch with a rotary encoder, oled screen and a custom 3d case to go with it
hey ya guys since i started project sometime ago i will tried to retell what i did and also include some ongoing process like what i did etc. so what do you do when you want to make a keyboard ? you do tons of research of course. keyboard format 60% 75% TKL etc features like knobs ,backlit and display Hot swappable ? or simply solder it on? all this have to be taken into consideration ultimately i choose to go with the 75% format ,with all kinds of fancy features(knobs,oled display,rgb backlit,hot swappable). below is an early sketch of what i want in my keyboard // so today i went back to the pcb and added more graphics cause why not , i got more time now
Hello every Pony im back again with more things to share. so now that you figure out what fancy features you want for your keyboard it’s time to make it come to fruition. you would need to first create your PCB first and to do that i use KICAD. the first step is to create your schematics first (it’s like instruction telling your component which wire goes where).In My schematics i use the PI PICO as my brain of my keyboard and i created a keyboard matrix based on the layout i want . so the Pi pico have a limited amount of GPIO pins if wire all our keyswitch to our pico we would need a dozen of pico and we don’t want that. so we create a keyboard matrix. i also added in a GPIO expansion chip mcp23017 to accommodate those other fancy feature i have.This stage is very crucial as any mistake make here will be a big headache when you wire your actual pcb. some tools that i found very useful: Keyboard layout editor.com, Marbastlib(KIcad plugin) so what i did today, i continue working on my keyboard cad files today, boy o boy is tiring , i have to manually place and align each keycap and it took a while bcs im such a perfectionist. anyway i decided to use a top mount layout for my keyboard so there will three layer a bottom case , the plate and the upper case. im so impatient , i want to finish this quickly !!! anyhow , everything i just said was oversimplified , remember to do your own research. until next time stay cool every pony
wassup Every Pony it’s me again with another devblog now the schematics is out the way, it’s time to move on to the actual PCB , this by far the longest process for me, you have take lots of things into consideration. when you first open the PCB editor , the first thing you do is import the parts you place in your schematics (there’s a button for that) then you would wanna go back to Keyboard layout editor to download the JSON File of your layout , then go back to kicad and open the plugin manager then download keyboard layout placer. you then go back to the pcb editor and open the plugin , there you will be able to insert your JSON file then the plugin will do the placing for you how cool is that ? there also an option to add more parts to be auto place. when you finish that you would need to draw out your pcb board edge with that we first select the edge cut layer then select whether the draw line tool or rectangles tool, left click and drag then voila you define your pcb borders. FOR RGB LED and HOT SWAP sockets you need to flip those to backside of the board for them to work. you also need the 5v trace to be thicker, how thick ? there’s a tool for that (PCB Trace width calculator) , a standard usb 3.0 output 0.9amps at 5v while usb 2.0 outputs 0.5 amps at 5v, check your usb port before deciding. now here comes the actual complicated part , routing it all together in a basic pcb you have two layer the front and back , so you have two layers to work with, you route wire by pressing x , to switch to the backside press v note v is also use to place vias vias are like channel that connect the front trace to back trace and it works the other way around. utilize them to the fullest extend . placing ground plane adding a ground plane is quick and easy press the draw filled zones ,select which layers have the most or both, set the net as GND and draw. a ground plane is like a filter of some sort, idk go google it. therefore adding one is good practice. DRC this is the most important thing you need to do everytime you finish making a change, the DRC checks for everything unconnected traces , shorted wires , parts clipping , silkscreen clipping. so i would advise you to run the drc everytime you finish a task, so you can fix the issue. customizing your board you can customize your board and add art using SVG and SIlkscreen. silkscreen is a non conductive layer use to add text and cool arts. woah now that’s a long read but there’s more What i did this past few day so this few days i just been doing CAD , the plate finish , i got the top case rough shape finish and i almost finish the bottom case just the usb-c port left. i went through three different design variations and eventually settle down for the design for the bottom case (in picture). i also model my own custom rotary encoder knob. i want to import a knurl design at first but then the model i import was too large and when i scale it down it won’t fit. either way we’re getting close to finishing the design phase.
howdy pony ! this is it im done with my case this is it we’re done with the designing phase , things i did: changed the 3d model of the pi pico with a usb c cut out the upper case heatset insert hole cut out space for the screw head sticking out at the plate cut out the usb-c charger hole rounded the case edges oooo idk if u notice but there’s a big hole on top of pico and that’s there on purpose so i can add a clear acrylic plate there. oh yeah and the text there also have space below to insert some light dispersing material. tomorrow is repo day people im going go over yer tutorial now once you finish your pcb and it all checks out , now it’s time to create an enclosure for it . first export the stp file from kicad(there’s an option for you to export the silkscreen). then go to your software and import your stp file into your cad software.when i did this process i did encounter an issue where the stp file fail to translate(FUSION) so big L but there’s a work around. first i go to onshape and import and translate the file there. then we export the file that is just translated by onshape into fusion and voila success there’s many type of different design and mounting style to choose from and of course the more fancy you want it the harder it gets (to model :P ) i used the bottom mount layout , it’s sort of a balanced options out of all the style . but hey what matters is personal preference do you like it thocky or creamy or clicky ? so choose what you want. either way i don’t really have much advice for this. much of it drawing sketch and basic math . it’s not hard and not easy, there’s definitely a learning curve and there will be a lot of failing before something stuck. fact btw when i was pushing to finish this keyboard for keeb i sat down for almost 6 hour and i felt like the ash baby afterwards (ps i didn’t make it). so trial and error buddy when you fall seven times, you stand up eight !!!
what’s up Everypony this is the last devblog im posting before i ship my project for funding. during this time period , i made some finishing touches to the Case , prep it for production and i am just writing and updating my repo constantly. anyway i think i done with this project for now gotta work on my website fr fr it’s also exam season now for me, so there might be less frequent update enjoy this assembly animation i made :)...
|
1792705755.8393843
|
1793310555.8393843
|
|
33986
|
Turtlebrowse by @leethana | Stardance
|
leethana
|
1
|
92.7
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-18T14:07:25Z", "hours": 57.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Turtlebrowse, a Material 3 Expressive, Chromium (JCEF) based agentic browser that can navigate the web autonomously with you. Features Discord Rich Presence, a YouTube video downloader with yt-dlp, customizable appearence, many tools for the AI agent to navigate the wb for you, and more!", "repo": "https://github.com/ingStudiosOfficial/turtlebrowse", "demo": "https://github.com/ingStudiosOfficial/turtlebrowse/releases/latest"}]...
|
[{"post_id": 81234, "ts": "202 [{"post_id": 81234, "ts": "2026-10-20T12:09:04Z", "hours": 5.07, "text": "added userscripts scaffolding and a new easter egg :)"}, {"post_id": 79741, "ts": "2026-10-15T08:21:14Z", "hours": 0.4258, "text": "fixed windows focus bug finally. after 9 months. youre telling me the answer is a simple clear global focus owner. really man?"}, {"post_id": 79022, "ts": "2026-10-12T12:03:43Z", "hours": 5.045, "text": "added auto updating for linux appimages. i also improved the adblocker and ported a cube minigame into the browser."}, {"post_id": 78054, "ts": "2026-10-09T12:08:14Z", "hours": 12.2119, "text": "Added adblocking, zooming, new improved UI, and favicon support!"}, {"post_id": 72634, "ts": "2026-09-23T12:15:24Z", "hours": 1.9778, "text": "Added an integrated terminal using JediTerm and pty4j to the browser sidebar. Silly feature but cool and useful. First browser to do so."}, {"post_id": 72176, "ts": "2026-09-22T11:45:30Z", "hours": 1.3872, "text": "Added fullscreen mode support and fixed toolbar bad contrast when dark mode bug."}, {"post_id": 71083, "ts": "2026-09-20T08:49:42Z", "hours": 2.7953, "text": "Added OS theme detection for light/dark mode. Modified the buttons and text to follow the theme as well."}, {"post_id": 70650, "ts": "2026-09-19T14:54:50Z", "hours": 2.745, "text": "Added an update microservice using Go and migrated the update UI to the settings page."}, {"post_id": 70467, "ts": "2026-09-19T07:56:12Z", "hours": 4.0381, "text": "Added find and replace to Turtlebrowse and a new tool panel that can be swapper for AI, find and replace, and yt-dlp"}, {"post_id": 70101, "ts": "2026-09-18T13:43:43Z", "hours": 5.9531, "text": "Added browsing history, made tab switching more efficient. I struggled with fixing the grey paint on tab switch bcuz it looks like its unfixable and an issue with JCEF on Linux."}, {"post_id": 69527, "ts": "2026-09-17T07:20:24Z", "hours": 13.5119, "text": "Added Linux AppImage, YouTube video downloader, and more! Features and bugs fixed: YouTube video downloader via yt-dlp Better menu buttons Web browser registration and xdg-open handlers on Linux Frontend search suggestor AppImage build"}, {"post_id": 47273, "ts": "2026-08-15T03:00:13Z", "hours": 8.1233, "text": "Multiple new changes in Turtlebrowse v1.4.5, including: Setting to enable AI integration and model selection New Tab settings New Tab wallpaper uploading Migrated from Vue to Nuxt for turtlebrowse.ingstudios.dev for better SEO Improved performance for wallpapers (serving images directly from backend rather than creating an ObjectURL based on the returned Blob)"}, {"post_id": 43807, "ts": "2026-08-09T07:27:24Z", "hours": 2.9322, "text": "I used the DuckDuckGo autocompleter API to add autocompletions to Turtlebrowse. It uses a JavaFX Popup component with an embedded ListView. I also changed the jpackage to use a custom jlink."}, {"post_id": 41298, "ts": "2026-08-05T13:16:17Z", "hours": 3.7625, "text": "Completed the settings page! User can now choose between many different search engines including Brave Search, DuckDuckGo, Google, Startpage, Vyntr, Bing and Yahoo. Users can also choose to enable or disable the Discord Rich Presence IPC connection."}, {"post_id": 39991, "ts": "2026-08-03T10:42:48Z", "hours": 2.4553, "text": "we (finally) managed to fix macos build on turtlebrowse! turns out the issue was single process flag that had to be added because of linux and focus issues that caused a StackOverflowError on mac! try v1.2.9 now at https://turtlebrowse.ingstudios.dev !"}, {"post_id": 36840, "ts": "2026-07-29T04:55:36Z", "hours": 3.2208, "text": "Fixed some critical bugs, including: AI chat agent freezing main thread due to joining virtual thread Fixed AI chat not running because did not start the thread Fixed the search tool returning 429 due to the lack of headers"}, {"post_id": 32267, "ts": "2026-07-21T10:25:02Z", "hours": 5.6911, "text": "Fixed some bugs and added new features in the new update such as: Discord Rich Presence Profile editing Stability fixes"}, {"post_id": 27063, "ts": "2026-07-12T08:46:45Z", "hours": 11.7428, "text": "Added new features and bug fixes such as: Multi process architecture Multiple isolated user profiles Fixed the profile switcher Fixed the Ctrl + L shortcut to focus the URL bar Added the Ctrl + W shortcut to close the current tab"}]...
|
Title: Turtlebrowse by @leethana | Stardance
Devl Title: Turtlebrowse by @leethana | Stardance
Devlogs:
Added new features and bug fixes such as: Multi process architecture Multiple isolated user profiles Fixed the profile switcher Fixed the Ctrl + L shortcut to focus the URL bar Added the Ctrl + W shortcut to close the current tab
Fixed some bugs and added new features in the new update such as: Discord Rich Presence Profile editing Stability fixes
Fixed some critical bugs, including: AI chat agent freezing main thread due to joining virtual thread Fixed AI chat not running because did not start the thread Fixed the search tool returning 429 due to the lack of headers
we (finally) managed to fix macos build on turtlebrowse! turns out the issue was single process flag that had to be added because of linux and focus issues that caused a StackOverflowError on mac! try v1.2.9 now at https://turtlebrowse.ingstudios.dev !
Completed the settings page! User can now choose between many different search engines including Brave Search, DuckDuckGo, Google, Startpage, Vyntr, Bing and Yahoo. Users can also choose to enable or disable the Discord Rich Presence IPC connection.
I used the DuckDuckGo autocompleter API to add autocompletions to Turtlebrowse. It uses a JavaFX Popup component with an embedded ListView. I also changed the jpackage to use a custom jlink.
Multiple new changes in Turtlebrowse v1.4.5, including: Setting to enable AI integration and model selection New Tab settings New Tab wallpaper uploading Migrated from Vue to Nuxt for turtlebrowse.ingstudios.dev for better SEO Improved performance for wallpapers (serving images directly from backend rather than creating an ObjectURL based on the returned Blob)
Added Linux AppImage, YouTube video downloader, and more! Features and bugs fixed: YouTube video downloader via yt-dlp Better menu buttons Web browser registration and xdg-open handlers on Linux Frontend search suggestor AppImage build
Added browsing history, made tab switching more efficient. I struggled with fixing the grey paint on tab switch bcuz it looks like its unfixable and an issue with JCEF on Linux.
Added find and replace to Turtlebrowse and a new tool panel that can be swapper for AI, find and replace, and yt-dlp
Added an update microservice using Go and migrated the update UI to the settings page.
Added OS theme detection for light/dark mode. Modified the buttons and text to follow the theme as well.
Added fullscreen mode support and fixed toolbar bad contrast when dark mode bug.
Added an integrated terminal using JediTerm and pty4j to the browser sidebar. Silly feature but cool and useful. First browser to do so.
Added adblocking, zooming, new improved UI, and favicon support!
added auto updating for linux appimages. i also improved the adblocker and ported a cube minigame into the browser.
fixed windows focus bug finally. after 9 months. youre telling me the answer is a simple clear global focus owner. really man?
added userscripts scaffolding and a new easter egg :)
Ships:
I built Turtlebrowse, a Material 3 Expressive, Chromium (JCEF) based agentic browser that can navigate the web autonomously with you. Features Discord Rich Presence, a YouTube video downloader with yt-dlp, customizable appearence, many tools for the AI agent to navigate the wb for you, and more!...
|
1792853814.5923214
|
1792940214.5923214
|
|
55756
|
demon slayer by @v3n5590 | Stardance
|
v3n5590
|
0
|
19.46
|
0
|
[]
|
[{"post_id": 81236, "ts": "202 [{"post_id": 81236, "ts": "2026-10-20T12:11:38Z", "hours": 0.8269, "text": "muichro page done"}, {"post_id": 81185, "ts": "2026-10-20T07:04:03Z", "hours": 1.0678, "text": "hashira page done"}, {"post_id": 80104, "ts": "2026-10-16T07:27:02Z", "hours": 1.4686, "text": "rengoku page doneee"}, {"post_id": 73690, "ts": "2026-09-25T18:14:47Z", "hours": 0.6964, "text": "done nezuko page"}, {"post_id": 72868, "ts": "2026-09-23T21:56:34Z", "hours": 2.3903, "text": "working on nezuko page cause i forgot some characters done some css pages duhh😭😭😭😭"}, {"post_id": 72131, "ts": "2026-09-22T07:56:40Z", "hours": 0.8083, "text": "akaza page is done gone for 2 min to feed my cat"}, {"post_id": 71907, "ts": "2026-09-21T19:04:30Z", "hours": 0.7094, "text": "working on some pages"}, {"post_id": 71886, "ts": "2026-09-21T18:12:14Z", "hours": 1.1517, "text": "done demon page bruhhhhh😫😫😫😫😫😫😫😫"}, {"post_id": 71814, "ts": "2026-09-21T16:23:17Z", "hours": 0.8333, "text": "done douma page"}, {"post_id": 71673, "ts": "2026-09-21T08:58:20Z", "hours": 0.9708, "text": "completed entry page and enmu page total 2 pages"}, {"post_id": 71654, "ts": "2026-09-21T07:49:46Z", "hours": 1.8494, "text": "working on genya complete"}, {"post_id": 66459, "ts": "2026-09-12T09:33:31Z", "hours": 1.0531, "text": "sanemi sub page"}, {"post_id": 59092, "ts": "2026-08-31T18:28:09Z", "hours": 0.9992, "text": "completed a page"}, {"post_id": 58331, "ts": "2026-08-30T18:28:20Z", "hours": 0.8597, "text": "completed swords page"}, {"post_id": 58229, "ts": "2026-08-30T16:14:13Z", "hours": 0.8333, "text": "page about tanjiro has been completed"}, {"post_id": 57504, "ts": "2026-08-29T17:50:36Z", "hours": 0.8175, "text": "5th page done"}, {"post_id": 57454, "ts": "2026-08-29T16:31:26Z", "hours": 1.6061, "text": "after searching for the content created third page"}, {"post_id": 57346, "ts": "2026-08-29T13:55:00Z", "hours": 0.5147, "text": "created two pages about.html and index.html"}]...
|
Title: demon slayer by @v3n5590 | Stardance
Devlo Title: demon slayer by @v3n5590 | Stardance
Devlogs:
created two pages about.html and index.html
after searching for the content created third page
5th page done
page about tanjiro has been completed
completed swords page
completed a page
sanemi sub page
working on genya complete
completed entry page and enmu page total 2 pages
done douma page
done demon page bruhhhhh😫😫😫😫😫😫😫😫
working on some pages
akaza page is done gone for 2 min to feed my cat
working on nezuko page cause i forgot some characters done some css pages duhh😭😭😭😭
done nezuko page
rengoku page doneee
hashira page done
muichro page done...
|
1792633833.6010208
|
1793238633.6010208
|
|
33983
|
ValoGuess by @NHero | Stardance
|
NHero
|
1
|
104.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T14:59:44Z", "hours": 104.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built ValoGuess , a real-time multiplayer Valorant guessing game inspired by guessing videos on youtube (VCT Pacific). Players can challenge friends in 1v1 matches, eliminate agents, ask questions, and race to identify their opponent’s secret agent. It includes party lobbies, friend invites, real-time chat, player profiles, and match history. The most challenging part was building the real-time backend: synchronizing game state between players, handling disconnects and reconnections, hiding secret agents from opponents, and managing live state with Socket.IO and Redis. I’m proud of building the full experience from the game UI to the backend architecture, with separate Next.js and Socket.IO server repositories. Try it: Visit https://valoguess.fun , sign in or continue as a guest, and invite a friend for a match. Atleast one extra friend is needed or a different browser or incognito tab.", "repo": "https://github.com/valoguess/valoguess", "demo": "https://valoguess.fun"}]...
|
[{"post_id": 81260, "ts": "202 [{"post_id": 81260, "ts": "2026-10-20T14:40:52Z", "hours": 1.8425, "text": "Devlog 12 So I think this one is the last before ship, I promise. 😂🥹 Fixed some bugs here and there Added readme Added some bg and showcase photos Added a layout for the home pages (lobby, settings, leaderboard, match history) where the top navbar and the friend sidebar is given to all. I think that’s it. I got no friends, or the friends I have aren’t like best of friends So I wasn’t able to test the game on scale. Feel free to open a issue in github or message me on slack"}, {"post_id": 81097, "ts": "2026-10-19T21:13:57Z", "hours": 10.1267, "text": "Devlog 11 So I have done lots of stuff and this is the last devlog before the first ship. Little sleepy rn as its 2:35 am my time, so I will wrap up fast. Added pino in Nextjs (Its a logger) Added caching wherever possible in nextjs using the cacheLife Added auth refresh event so if the name is changed it doesn’t need socket reconnect Optimised some code in socket server and also nextjs. Games getting saved to DB and there is a career history page now. Mostly did fixes of stuff and redesigned some elements in the lobby page. Like there is nothing else to talk about I’m mostly fixed stuff. I gotta sleep, have to ship the project too maybe I do it after waking up because readme is not ready yet. I think I’m gonna do after waking up so tired rn"}, {"post_id": 79776, "ts": "2026-10-15T11:01:26Z", "hours": 10.6203, "text": "Devlog - 10 I will keep this devlog sweet and short as I wanna ship this project as soon as possible as It has taken a lot of time now. I added some more rate limiting remove game Id / party id payload where neccessary from client in socket server as game/party id can be retrieved from player stored in redis. I’m directly getting friendships from db instead of relying on nextjs api in the socket server to show the initial friends list with presence (online/offline status). Removed TTL from party and game as they may get deleted mid game (prev ttl was 10 mins). I have also added token refreshing in socket server as socket server only verifies token once so now when the token refreshes (only for when user details are mutated) socket disconnects and connects, I know this is a bad logic I will change that but 10h 37m will be logged so I don’t wanna waste any more time , so it will be in next devlog Using AVIF instead of PNG for Agents Banner & Icon Added new fields to user (tagline, banner, usernamedUpdatedAt, nameUpdatedAt) Cleaned up many of the files in the frontend party Added logic for If user changes their avatar it should delete the old image in cloudinary Added Match ending design ENV are now accessed from ENV.ts Removed console.logs etc from nexjs Fixed some bugs."}, {"post_id": 78076, "ts": "2026-10-09T14:19:49Z", "hours": 9.7719, "text": "Devlog - 9 NextJS I added upload avatar in the settings page, user uploads an avatar and crops it accordingly , max file size limit is 5mb also the image gets uploaded to cloudinary and the secure url of the image is stored in db Changed the lobby UI to make it less cluttered Now there are drawers for gamemode settings and party stuff Changed the friends sidebar to be attaced to the right wall and closed and when you open it , it comes out of the screen not occupieing any space. Made a UI for FREEFORM questionMode Added a animated starting screen. Socket Server Added a new questionMode inside the Guess Agent gamemode now you can have freeform questions or preset Preset is same as before you will have a preset of questions to choose from and all its all like before Freeform is different you will have two buttons instead of questionPanel, you will have make guess and consume no. This gamemode is meant to be played in a vc like discord or any of your choice you can ask questions to the opponent direclty if there is a no you can just consume no and if you wanna guess you can guess. its like a offline game but you can count the nos and guess and have a agent panel to deduce Added a game starting phase where some details are created to show to the frontend. Added game cleanup functions, not perfect but will do for now Added a new event CONSUME_NO to consume no for questionMode Made some changes to type to adjust for freeform question mode EXTRA Added rate limiting in some parts In socket server rate limiting is token bucket and in nextjs rate limiting is sliding window counter (somewhat strict rate limiting in guest login and magic link) The rate limiting is handled by the same redis used for game states and stuff Fixed some bugs here and there. I know this devlog doesn’t feel personal and I only talk about the stuff I did, its because I wanna Ship this project as soon as possible and get done with it and move on to something else, because projects like this never end and you have to decide when to stop. I think next devlog will be the last devlog before the first ship"}, {"post_id": 76249, "ts": "2026-10-02T21:25:10Z", "hours": 9.7156, "text": "Devlog - 8 Big devlog, here we go again. Lets talk about nextjs first. So I added magic link to the app as the feedback I received was I don’t wanna use my google account as I don’t the trust the website enough to use it and I also want to use all the features so guest won’t work. This pushed me to add somewhat of a email login. I dont like password login so I wanted to add passwordless login and it wasn’t a debate I just picked one which is magic link. I am using resend for sending emails and i already have a domain for the app so using that for send email with auth@mydomain I created a template in resend dashboard itself so i can direclty use it in my nextjs app. Now lets talk about the big thing which made this a long devlog !!! Drum Roll please 🥁🥁🥁 I decided to restructure many parts of my socket server because of scalability as my previous architecture wouldn’t have survived If i added more gamemodes and all. What were the flaws Room was acting like if it was the party and the game Current gamemode is available is guess the agent so all the connecting modules were designed based on that which would have made adding other gamemodes impossible. There was no generic game module it was just Guess the Agent What I did Changed room to game and separated game ( previously room ) from party and added a separate events and module for party and party gets stored in redis as well. Inside the game module added a core folder where core mechanics (listener, types, service) of each game regardless of gamemode lives. Each gamemode has its own folder inside game containing the logic specific to that game. Redis player now has a partyId element too. Improved player presence (connection and disconnect) and using switch statements in places where if the mode is different some logic might be different. Why did it took so much time and What I learnt. Because when I started the restructure I didn’t know how my architecture would look like or what would work ( still haven’t tested anything ). So I researched some stuff but some stuff you decide along the way. I learnt that no matter what the project is and what you decide at the start that you are gonna build there will always be a time where the plans fail and we have to decide should we go through with it or suffer in the future or should we just focus right now and work hard so that in the future it all comes back to us with a lots of happiness!!! Cheers, Neerav"}, {"post_id": 74034, "ts": "2026-09-26T15:51:51Z", "hours": 10.095, "text": "Devlog - 7 Another Long Devlog Time So I was setting up my project to be deployed on the nest container that I have since nest only gives public ipv6 I couldn’t host my nextjs app on vercel because then I wouldn’t have been able to connect to my postgres database which was on nest as vercel dont have ipv6 support so I moved my nextjs to nestjs and It caused me hell lot of problems and bugs. First of all had to make sure nextjs, postgres and socket server were running on same docker network. My nest container was crashing when building the nextjs for docker. Had to move building process to my laptop then push the image to ghcr.io And some silly mistakes that took me long time to fix. Lets talk about the project what I update in that So first of all made a presence for managing friends online status. Added logic to connection and disconnection events of player socket. As when players connects through socket it should know whom his friends and what friend requets he got and what friends are currently online and also if he is reconnecting (For now 1minute reconnect window) the socketId should be updated in the needed area (room and player redis store). When the socket disconnects, set the socketId in player redis store to null . After the reconnect window is over check if he is in a room, if yes remove him from the room and in both cases delete the player record from redis . Also lets expand on connection syncFriends the socket requests data from an internal api route only accessible through the socket for what friendship records are there and formats it in friends: [], requests: [ incoming: [], outgoing: [] ] Then socket server retrieves all the playes using their playerid from redis via mget and then returns the same object structure but in friends its adds a online: true/false to the player objects Also removed polling for friendships as now socket does them all. So there is less db calls now. Fixed few bugs too. Now let me tell you a funny story. When testing stuff in prod, I was confused why stuff wasn’t working because it was working fine during development then i remembered I didn’t update the .env file in prod. It may have cut some years from my lifetime."}, {"post_id": 71723, "ts": "2026-09-21T11:48:59Z", "hours": 9.9617, "text": "Devlog - 6 This is gonna be a long devlog. Lets start with the frotend I committed the prev work from the previous devlog as mentioned there. Added welcome, settings page, Added friends sidebar with realtime functionalities. Added a friends store to store incoming friends invites. Fixed some file structure to have protected routes inside (protected). And mostly this covers it for frotend Now lets talk about backend that made this devlog of 10 hours Backend I first connected the socket with the player from the db via jwt tokens. Stored some player data like id, username inside socket.data. Then I changed my room mapper implementation to use player Id instead of socket Id and messed up in some places where socket Id was still getting passed to room mapper which made me spent so much time looking for what is the issue why isn’t my room details getting sent to me and I was looking in nextjs frontend for the issue. I spent so much time finding this bug I added some more events for player invites and added a new redis key:value pair -> player:playerid to store player details like id, username, socket id, roomId, lastHeartBeatAt also removed lastHeartBeatAt and reconnectToken from room player. Added events for invite, server event of invite:sync and made realtime invite work which took me forever. Made some changes in connection event so it handles reconnection Finally let me tell you something when visting the website if the thing looks small the implementation of that thing takes so much time. Bro Literally the friends sidebar took so much code to make in the frontend and in the backend and in the socket server as well. like that small piece of the page took me so much time to make which also made this devlog So long. Incountered so many bugs along the way. They were all silly mistakes some were logic error but most were silly mistakes as there are so many files in the project now its hard to find some things."}, {"post_id": 68663, "ts": "2026-09-15T14:28:10Z", "hours": 9.7922, "text": "Devlog 5 So I am now using drizzle with postgres and I also took some time to tinker with it and understand it a little better. I am also using better auth with google signIn and anonymous login. In the user i have username and name , username is for adding friends or locating a user, name is to be displayed , username is unique, name isn’t. Created the db model with friends support and matches history. We can add friends in the game also added user settings to customise stuff. Project is starting to look like something. All the drizzle + backend part that i have done in the period is committed and pushed but the frontend part still remains to be committed."}, {"post_id": 61087, "ts": "2026-09-03T20:08:51Z", "hours": 9.3056, "text": "Devlog 4 So first of all I switched from using npm to pnpm and updated the docker file accordingly for the socket server. Then I started working on adding users / db functionality in the nextjs app. I created login and register page with two options for signIn -> google or guest. I started tinkering with prisma and better auth and the prisma8 has just come so I started setting it up and had made the schema and had written up some services too but then when I tried to logIn i got few problems which I researched and searched and found out that betterAuth hasn’t adjusted to prism8. So I did what I should have done before, I switched to drizzle. Around 3-4 or more hours were wasted!. Now I’m using drizzle and have setup the schema and tables and also better auth in it and the signIn are working. Now I have to create routes or server Actions to retrieve data or send data. Now the games will be saved and stored once finished and user will able to see it in match history."}, {"post_id": 51021, "ts": "2026-08-20T14:43:00Z", "hours": 5.5508, "text": "Devlog 3 Backend Socket Server Made few changes to setting type and added a questionPool in gameState Settings now have a option to change totalQuestions and a randomly generated questionPool from the totalQuestions Removed spectator logic as not planning on pursuing it right now Also added a heartbeat event which supplies heartBeat every 5 seconds or so and if there is no heartBeat provided by the player for over 30 seconds the player gets removed from the room Now Frontend Redesigned the lobby page and home page If you open the game for the first time it asks for the name which is currently stored in localstorage for a guest user. When users are added then people would be able to login using google and save their details in database. For now nothing is stored , only gameState are persistent for the duration of the game in redis and after few minutes of inactivity in the room , the room expires via ttl. Also added SEO Optimisations. Future Plan I will either work on adding more gamemodes or adding the user authentication stuff using postgresql and prims direclty in nextjs After the auth has been added then I will publish the project so that it has atleast some complete features and users can see their stats and prev games results"}, {"post_id": 39462, "ts": "2026-08-02T12:58:48Z", "hours": 8.5258, "text": "Devlog 2 Making this devlog after a long time of doing all this work, the frontend part is still uncommited in github though Lets talk about backend first -> I first of all was using playerId for the routes to verify the user, but now I’m using socketId And also for reconnection I’m now using a reconnectToken which is created on the socket server and given to the frontend to it can pass it when reconnecting. Also I added a ROOM_KICK event. And I added docker setup too but its still buggy Changed Winning logic so that first correct guess wins Now Frontend I designed the pages using AI because I am not a good designer rather I am a good coder you can say, because if there is a already made design, I can make a similar one using tailwind and shadcn and other UI libraries I added socket setup for the frontend which goes as follow src/socket -> index.ts, emitter.ts, events.ts src/components/SocketProvider.tsx Socket Provider has the listeners emitter.ts has small functions that can be directly used inside tsx instead of importing socket There are 3 pages currently -> /, /lobby, /play"}, {"post_id": 30879, "ts": "2026-07-18T20:44:34Z", "hours": 8.6403, "text": "Devlog 1 So I’ve been working on the socket server for this game for the past couple of days. What I’ve learned so far is that game logic is sometimes so frustrating like there can be so many edge cases you have to think about and there can be many nested if else. So my tech stack for the socket server is: Socket.io IoRedis (redis hosted using docker) Zod and node httpServer Ofcourse everything is written in typescript. I didn’t made separate devlogs because I forgot, sorry for that Here’s what I did I made the folder structure moduler having different modules for different logic : room, game, question Shared files are in shared folder Each module has its own listener, service, schema with some having util/helper file I first worked on room then game then question Some things are still left to do, but first I would like to make some of the frontend"}]...
|
Title: ValoGuess by @NHero | Stardance
Devlogs:
D Title: ValoGuess by @NHero | Stardance
Devlogs:
Devlog 1 So I’ve been working on the socket server for this game for the past couple of days. What I’ve learned so far is that game logic is sometimes so frustrating like there can be so many edge cases you have to think about and there can be many nested if else. So my tech stack for the socket server is: Socket.io IoRedis (redis hosted using docker) Zod and node httpServer Ofcourse everything is written in typescript. I didn’t made separate devlogs because I forgot, sorry for that Here’s what I did I made the folder structure moduler having different modules for different logic : room, game, question Shared files are in shared folder Each module has its own listener, service, schema with some having util/helper file I first worked on room then game then question Some things are still left to do, but first I would like to make some of the frontend
Devlog 2 Making this devlog after a long time of doing all this work, the frontend part is still uncommited in github though Lets talk about backend first -> I first of all was using playerId for the routes to verify the user, but now I’m using socketId And also for reconnection I’m now using a reconnectToken which is created on the socket server and given to the frontend to it can pass it when reconnecting. Also I added a ROOM_KICK event. And I added docker setup too but its still buggy Changed Winning logic so that first correct guess wins Now Frontend I designed the pages using AI because I am not a good designer rather I am a good coder you can say, because if there is a already made design, I can make a similar one using tailwind and shadcn and other UI libraries I added socket setup for the frontend which goes as follow src/socket -> index.ts, emitter.ts, events.ts src/components/SocketProvider.tsx Socket Provider has the listeners emitter.ts has small functions that can be directly used inside tsx instead of importing socket There are 3 pages currently -> /, /lobby, /play
Devlog 3 Backend Socket Server Made few changes to setting type and added a questionPool in gameState Settings now have a option to change totalQuestions and a randomly generated questionPool from the totalQuestions Removed spectator logic as not planning on pursuing it right now Also added a heartbeat event which supplies heartBeat every 5 seconds or so and if there is no heartBeat provided by the player for over 30 seconds the player gets removed from the room Now Frontend Redesigned the lobby page and home page If you open the game for the first time it asks for the name which is currently stored in localstorage for a guest user. When users are added then people would be able to login using google and save their details in database. For now nothing is stored , only gameState are persistent for the duration of the game in redis and after few minutes of inactivity in the room , the room expires via ttl. Also added SEO Optimisations. Future Plan I will either work on adding more gamemodes or adding the user authentication stuff using postgresql and prims direclty in nextjs After the auth has been added then I will publish the project so that it has atleast some complete features and users can see their stats and prev games results
Devlog 4 So first of all I switched from using npm to pnpm and updated the docker file accordingly for the socket server. Then I started working on adding users / db functionality in the nextjs app. I created login and register page with two options for signIn -> google or guest. I started tinkering with prisma and better auth and the prisma8 has just come so I started setting it up and had made the schema and had written up some services too but then when I tried to logIn i got few problems which I researched and searched and found out that betterAuth hasn’t adjusted to prism8. So I did what I should have done before, I switched to drizzle. Around 3-4 or more hours were wasted!. Now I’m using drizzle and have setup the schema and tables and also better auth in it and the signIn are working. Now I have to create routes or server Actions to retrieve data or send data. Now the games will be saved and stored once finished and user will able to see it in match history.
Devlog 5 So I am now using drizzle with postgres and I also took some time to tinker with it and understand it a little better. I am also using better auth with google signIn and anonymous login. In the user i have username and name , username is for adding friends or locating a user, name is to be displayed , username is unique, name isn’t. Created the db model with friends support and matches history. We can add friends in the game also added user settings to customise stuff. Project is starting to look like something. All the drizzle + backend part that i have done in the period is committed and pushed but the frontend part still remains to be committed.
Devlog - 6 This is gonna be a long devlog. Lets start with the frotend I committed the prev work from the previous devlog as mentioned there. Added welcome, settings page, Added friends sidebar with realtime functionalities. Added a friends store to store incoming friends invites. Fixed some file structure to have protected routes inside (protected). And mostly this covers it for frotend Now lets talk about backend that made this devlog of 10 hours Backend I first connected the socket with the player from the db via jwt tokens. Stored some player data like id, username inside socket.data. Then I changed my room mapper implementation to use player Id instead of socket Id and messed up in some places where socket Id was still getting passed to room mapper which made me spent so much time looking for what is the issue why isn’t my room details getting sent to me and I was looking in nextjs frontend for the issue. I spent so much time finding this bug I added some more events for player invites and added a new redis key:value pair -> player:playerid to store player details like id, username, socket id, roomId, lastHeartBeatAt also removed lastHeartBeatAt and reconnectToken from room player. Added events for invite, server event of invite:sync and made realtime invite work which took me forever. Made some changes in connection event so it handles reconnection Finally let me tell you something when visting the website if the thing looks small the implementation of that thing takes so much time. Bro Literally the friends sidebar took so much code to make in the frontend and in the backend and in the socket server as well. like that small piece of the page took me so much time to make which also made this devlog So long. Incountered so many bugs along the way. They were all silly mistakes some were logic error but most were silly mistakes as there are so many files in the project now its hard to find some things.
Devlog - 7 Another Long Devlog Time So I was setting up my project to be deployed on the nest container that I have since nest only gives public ipv6 I couldn’t host my nextjs app on vercel because then I wouldn’t have been able to connect to my postgres database which was on nest as vercel dont have ipv6 support so I moved my nextjs to nestjs and It caused me hell lot of problems and bugs. First of all had to make sure nextjs, postgres and socket server were running on same docker network. My nest container was crashing when building the nextjs for docker. Had to move building process to my laptop then push the image to ghcr.io And some silly mistakes that took me long time to fix. Lets talk about the project what I update in that So first of all made a presence for managing friends online status. Added logic to connection and disconnection events of player socket. As when players connects through socket it should know whom his friends and what friend requets he got and what friends are currently online and also if he is reconnecting (For now 1minute reconnect window) the socketId should be updated in the needed area (room and player redis store). When the socket disconnects, set the socketId in player redis store to null . After the reconnect window is over check if he is in a room, if yes remove him from the room and in both cases delete the player record from redis . Also lets expand on connection syncFriends the socket requests data from an internal api route only accessible through the socket for what friendship records are there and formats it in friends: [], requests: [ incoming: [], outgoing: [] ] Then socket server retrieves all the playes using their playerid from redis via mget and then returns the same object structure but in friends its adds a online: true/false to the player objects Also removed polling for friendships as now socket does them all. So there is less db calls now. Fixed few bugs too. Now let me tell you a funny story. When testing stuff in prod, I was confused why stuff wasn’t working because it was working fine during development then i remembered I didn’t update the .env file in prod. It may have cut some years from my lifetime.
Devlog - 8 Big devlog, here we go again. Lets talk about nextjs first. So I added magic link to the app as the feedback I received was I don’t wanna use my google account as I don’t the trust the website enough to use it and I also want to use all the features so guest won’t work. This pushed me to add somewhat of a email login. I dont like password login so I wanted to add passwordless login and it wasn’t a debate I just picked one which is magic link. I am using resend for sending emails and i already have a domain for the app so using that for send email with auth@mydomain I created a template in resend dashboard itself so i can direclty use it in my nextjs app. Now lets talk about the big thing which made this a long devlog !!! Drum Roll please 🥁🥁🥁 I decided to restructure many parts of my socket server because of scalability as my previous architecture wouldn’t have survived If i added more gamemodes and all. What were the flaws Room was acting like if it was the party and the game Current gamemode is available is guess the agent so all the connecting modules were designed based on that which would have made adding other gamemodes impossible. There was no generic game module it was just Guess the Agent What I did Changed room to game and separated game ( previously room ) from party and added a separate events and module for party and party gets stored in redis as well. Inside the game module added a core folder where core mechanics (listener, types, service) of each game regardless of gamemode lives. Each gamemode has its own folder inside game containing the logic specific to that game. Redis player now has a partyId element too. Improved player presence (connection and disconnect) and using switch statements in places where if the mode is different some logic might be different. Why did it took so much time and What I learnt. Because when I started the restructure I didn’t know how my architecture would look like or what would work ( still haven’t tested anything ). So I researched some stuff but some stuff you decide along the way. I learnt that no matter what the project is and what you decide at the start that you are gonna build there will always be a time where the plans fail and we have to decide should we go through with it or suffer in the future or should we just focus right now and work hard so that in the future it all comes back to us with a lots of happiness!!! Cheers, Neerav
Devlog - 9 NextJS I added upload avatar in the settings page, user uploads an avatar and crops it accordingly , max file size limit is 5mb also the image gets uploaded to cloudinary and the secure url of the image is stored in db Changed the lobby UI to make it less cluttered Now there are drawers for gamemode settings and party stuff Changed the friends sidebar to be attaced to the right wall and closed and when you open it , it comes out of the screen not occupieing any space. Made a UI for FREEFORM questionMode Added a animated starting screen. Socket Server Added a new questionMode inside the Guess Agent gamemode now you can have freeform questions or preset Preset is same as before you will have a preset of questions to choose from and all its all like before Freeform is different you will have two buttons instead of questionPanel, you will have make guess and consume no. This gamemode is meant to be played in a vc like discord or any of your choice you can ask questions to the opponent direclty if there is a no you can just consume no and if you wanna guess you can guess. its like a offline game but you can count the nos and guess and have a agent panel to deduce Added a game starting phase where some details are created to show to the frontend. Added game cleanup functions, not perfect but will do for now Added a new event CONSUME_NO to consume no for questionMode Made some changes to type to adjust for freeform question mode EXTRA Added rate limiting in some parts In socket server rate limiting is token bucket and in nextjs rate limiting is sliding window counter (somewhat strict rate limiting in guest login and magic link) The rate limiting is handled by the same redis used for game states and stuff Fixed some bugs here and there. I know this devlog doesn’t feel personal and I only talk about the stuff I did, its because I wanna Ship this project as soon as possible and get done with it and move on to something else, because projects like this never end and you have to decide when to stop. I think next devlog will be the last devlog before the first ship
Devlog - 10 I will keep this devlog sweet and short as I wanna ship this project as soon as possible as It has taken a lot of time now. I added some more rate limiting remove game Id / party id payload where neccessary from client in socket server as game/party id can be retrieved from player stored in redis. I’m directly getting friendships from db instead of relying on nextjs api in the socket server to show the initial friends list with presence (online/offline status). Removed TTL from party and game as they may get deleted mid game (prev ttl was 10 mins). I have also added token refreshing in socket server as socket server only verifies token once so now when the token refreshes (only for when user details are mutated) socket disconnects and connects, I know this is a bad logic I will change that but 10h 37m will be logged so I don’t wanna waste any more time , so it will be in next devlog Using AVIF instead of PNG for Agents Banner & Icon Added new fields to user (tagline, banner, usernamedUpdatedAt, nameUpdatedAt) Cleaned up many of the files in the frontend party Added logic for If user changes their avatar it should delete the old image in cloudinary Added Match ending design ENV are now accessed from ENV.ts Removed console.logs etc from nexjs Fixed some bugs.
Devlog 11 So I have done lots of stuff and this is the last devlog before the first ship. Little sleepy rn as its 2:35 am my time, so I will wrap up fast. Added pino in Nextjs (Its a logger) Added caching wherever possible in nextjs using the cacheLife Added auth refresh event so if the name is changed it doesn’t need socket reconnect Optimised some code in socket server and also nextjs. Games getting saved to DB and there is a career history page now. Mostly did fixes of stuff and redesigned some elements in the lobby page. Like there is nothing else to talk about I’m mostly fixed stuff. I gotta sleep, have to ship the project too maybe I do it after waking up because readme is not ready yet. I think I’m gonna do after waking up so tired rn
Devlog 12 So I think this one is the last before ship, I promise. 😂🥹 Fixed some bugs here and there Added readme Added some bg and showcase photos Added a layout for the home pages (lobby, settings, leaderboard, match history) where the top navbar and the friend sidebar is given to all. I think that’s it. I got no friends, or the friends I have aren’t like best of friends So I wasn’t able to test the game on scale. Feel free to open a issue in github or message me on slack
Ships:
I built ValoGuess , a real-time multiplayer Valorant guessing game inspired by guessing videos on youtube (VCT Pacific). Players can challenge friends in 1v1 matches, eliminate agents, ask questions, and race to identify their opponent’s secret agent. It includes party lobbies, friend invites, real-time chat, player profiles, and match history. The most challenging part was building the real-time backend: synchronizing game state between players, handling disconnects and reconnections, hiding secret agents from opponents, and managing live state with Socket.IO and Redis. I’m proud of building the full experience from the game UI to the backend architecture, with separate Next.js and Socket.IO server repositories. Try it: Visit https://valoguess.fun , sign in or continue as a guest, and invite a friend for a match. Atleast one extra friend is needed or a different browser or incognito tab....
|
1792774139.0417645
|
1792860539.0417645
|
|
6278
|
Card it! by @Potyi | Stardance
|
Potyi
|
0
|
72.17
|
0
|
[]
|
[{"post_id": 81268, "ts": "202 [{"post_id": 81268, "ts": "2026-10-20T15:25:56Z", "hours": 2.9333, "text": "a lot of bug fix, added difficulties easy - 5 discards medium - 3 discards hard - 1 discard started working on music"}, {"post_id": 70654, "ts": "2026-09-19T15:02:50Z", "hours": 3.8, "text": "added more sounds, click sound, settings menu added, bug fixes"}, {"post_id": 65949, "ts": "2026-09-11T12:52:58Z", "hours": 8.2, "text": "added sounds to almost everything, a lot of big mug fixes, card animation added"}, {"post_id": 62363, "ts": "2026-09-05T18:08:43Z", "hours": 4.5667, "text": "added a console where you can control a lot of stuff with commands, more commands will come later made some bug fixes and completly reworked how the card playing mechanic worked so its now more stable and you can select cards instead of instant playing them out, wil add animation to that later"}, {"post_id": 60842, "ts": "2026-09-03T13:53:49Z", "hours": 4.4667, "text": "Added animation to the non attack cards after they played, some bug fixes"}, {"post_id": 57603, "ts": "2026-08-29T20:10:40Z", "hours": 5.2, "text": "added different types of card effects, card menu, great animation to the card menu"}, {"post_id": 52624, "ts": "2026-08-22T20:54:40Z", "hours": 5.1667, "text": "added new attack animation, fixed bugs like you can play out a card after u just played out one, and enemy now attacks and the game cycles"}, {"post_id": 47527, "ts": "2026-08-15T14:25:42Z", "hours": 5.6, "text": "i added animations to the attacks"}, {"post_id": 33664, "ts": "2026-07-23T19:20:57Z", "hours": 8.4667, "text": "-A lot of bug fixes -enemylevel based enemy damage, the bigger the level of the enemy is, the more damage it deals -levelup -shop where you can buy card level ups -gold earning -game cycle -timer -you can defeat the enemy if the timer runs out and you have more hp or killing, if you have less hp when the timer runs out you lose, or if it kills you, if you have same hp when the timer runs out then plus 30sec -started making animations for the attacks sorry i only uploaded a picture of the shop but i wasnt able to post a video (if you have any idea that would make the game more fun please tell me it)"}, {"post_id": 25257, "ts": "2026-07-09T12:34:18Z", "hours": 3.6333, "text": "i added animations to all the characters, and the animations play during the game on interact (yet only the attack animation works but later i add all)"}, {"post_id": 16997, "ts": "2026-06-27T16:05:46Z", "hours": 3.0, "text": "some bug fixes and added that if you start to fight with an enemy the chosen enemy will spawn"}, {"post_id": 14324, "ts": "2026-06-23T12:40:15Z", "hours": 3.0333, "text": "i added a new ui for when you start a run as you can see you can only play with the enemies that you unlocked"}, {"post_id": 7673, "ts": "2026-06-12T20:24:06Z", "hours": 3.9, "text": "Using bug fixed, after you use a card you get a new one i know it took long but i just didnt knew how to do it and spent hours finding out what even is the problem"}, {"post_id": 4144, "ts": "2026-06-07T10:56:13Z", "hours": 3.4, "text": "a debugged the the menu and added that you can start the game, and the deck shuffles and gives you the first two cards from it, and you can “use” those cards"}, {"post_id": 3404, "ts": "2026-06-06T09:56:42Z", "hours": 2.6333, "text": "i added that you can move anything on the screen and interact with them, and started making the ui i know it took me a long time but i learned how to do it while making it so yea"}, {"post_id": 2733, "ts": "2026-06-05T14:20:16Z", "hours": 0.9, "text": "i added new use cards"}, {"post_id": 2314, "ts": "2026-06-04T18:55:16Z", "hours": 1.5333, "text": "i added use card designs and made a simple drag and drop system but thats temporary so i dont post it yet"}, {"post_id": 2123, "ts": "2026-06-04T13:33:41Z", "hours": 1.4, "text": "i added new character cards, that will be shown during fight"}, {"post_id": 1580, "ts": "2026-06-03T18:00:38Z", "hours": 0.3333, "text": "i made a template card that later i can easily modify to other versions"}]...
|
Title: Card it! by @Potyi | Stardance
Devlogs:
i Title: Card it! by @Potyi | Stardance
Devlogs:
i made a template card that later i can easily modify to other versions
i added new character cards, that will be shown during fight
i added use card designs and made a simple drag and drop system but thats temporary so i dont post it yet
i added new use cards
i added that you can move anything on the screen and interact with them, and started making the ui i know it took me a long time but i learned how to do it while making it so yea
a debugged the the menu and added that you can start the game, and the deck shuffles and gives you the first two cards from it, and you can “use” those cards
Using bug fixed, after you use a card you get a new one i know it took long but i just didnt knew how to do it and spent hours finding out what even is the problem
i added a new ui for when you start a run as you can see you can only play with the enemies that you unlocked
some bug fixes and added that if you start to fight with an enemy the chosen enemy will spawn
i added animations to all the characters, and the animations play during the game on interact (yet only the attack animation works but later i add all)
-A lot of bug fixes -enemylevel based enemy damage, the bigger the level of the enemy is, the more damage it deals -levelup -shop where you can buy card level ups -gold earning -game cycle -timer -you can defeat the enemy if the timer runs out and you have more hp or killing, if you have less hp when the timer runs out you lose, or if it kills you, if you have same hp when the timer runs out then plus 30sec -started making animations for the attacks sorry i only uploaded a picture of the shop but i wasnt able to post a video (if you have any idea that would make the game more fun please tell me it)
i added animations to the attacks
added new attack animation, fixed bugs like you can play out a card after u just played out one, and enemy now attacks and the game cycles
added different types of card effects, card menu, great animation to the card menu
Added animation to the non attack cards after they played, some bug fixes
added a console where you can control a lot of stuff with commands, more commands will come later made some bug fixes and completly reworked how the card playing mechanic worked so its now more stable and you can select cards instead of instant playing them out, wil add animation to that later
added sounds to almost everything, a lot of big mug fixes, card animation added
added more sounds, click sound, settings menu added, bug fixes
a lot of bug fix, added difficulties easy - 5 discards medium - 3 discards hard - 1 discard started working on music...
|
1792781291.7578242
|
1793386091.7578242
|
|
69847
|
Pet by @singhshiv3108 | Stardance
|
singhshiv3108
|
0
|
3.06
|
0
|
[]
|
[{"post_id": 81270, "ts": "202 [{"post_id": 81270, "ts": "2026-10-20T15:33:07Z", "hours": 1.57, "text": "DEVLOG3: In this devlog i added dragging, idling, flipping at the border , text and shaders."}, {"post_id": 80957, "ts": "2026-10-19T11:53:15Z", "hours": 1.0147, "text": "DEVLOG 2: Added my own sprite and movement, it took me time to finalize sprite ( i made several) and also my movement code wasnt working later i realised i didnt even attached the script 😭."}, {"post_id": 80165, "ts": "2026-10-16T14:19:00Z", "hours": 0.4753, "text": "DEVLOG 1: In this log , I did basic setup and added sprite (temporary sprite I am looking forward to make my own currently I have no idea what theme I should select) and also I added animation and collision body."}]...
|
Title: Pet by @singhshiv3108 | Stardance
Devlogs: Title: Pet by @singhshiv3108 | Stardance
Devlogs:
DEVLOG 1: In this log , I did basic setup and added sprite (temporary sprite I am looking forward to make my own currently I have no idea what theme I should select) and also I added animation and collision body.
DEVLOG 2: Added my own sprite and movement, it took me time to finalize sprite ( i made several) and also my movement code wasnt working later i realised i didnt even attached the script 😭.
DEVLOG3: In this devlog i added dragging, idling, flipping at the border , text and shaders....
|
1792860518.3279607
|
1793465318.3279607
|
|
69462
|
My awesome HackPad! by @Leon_know | Stardance
|
Leon_know
|
0
|
26.35
|
0
|
[]
|
[{"post_id": 81276, "ts": "202 [{"post_id": 81276, "ts": "2026-10-20T16:10:23Z", "hours": 3.1183, "text": "Finished my 3D design. What do you think? :)"}, {"post_id": 81103, "ts": "2026-10-19T21:30:59Z", "hours": 1.8056, "text": "I made a weele."}, {"post_id": 80809, "ts": "2026-10-18T20:57:53Z", "hours": 4.42, "text": "My Head Hurts… Spent a lot of time just learning Fusion today, and I think I’m going to have a fever tomorrow."}, {"post_id": 80512, "ts": "2026-10-17T22:48:27Z", "hours": 1.9822, "text": "Designing, designing, designing, … Designing the 2D sketch of the 3D model and that’s it."}, {"post_id": 80255, "ts": "2026-10-16T23:11:10Z", "hours": 1.6958, "text": "It’s 1am, you should go to sleep I spent the first hours of the morning putting switches and keycaps on my board in Fusion. It took me some time to get it set up and used to it, but I’m getting the hang of it."}, {"post_id": 80212, "ts": "2026-10-16T19:18:10Z", "hours": 0.7761, "text": "FINISHED THE PCB Finally finished the PCB! It took some time, but it was worth the effort; I can’t find a single flaw with it."}, {"post_id": 80008, "ts": "2026-10-15T23:12:02Z", "hours": 4.7556, "text": "Still PCB designing Almost finished with the board. It took me about 12 hours to get to this point, but I’m happy with the outcome. I really took my time with tracing, but it looks amazing. I hope 3D modeling is going to go a bit faster, though."}, {"post_id": 79750, "ts": "2026-10-15T08:41:57Z", "hours": 2.1381, "text": "I continued with my PCB by making traces. Next up is making the shape of the board and creating the ground plane, but I still need to figure out how to do that."}, {"post_id": 79658, "ts": "2026-10-14T22:59:46Z", "hours": 3.3756, "text": "Today, I was working on the PCB for my design. I concluded that I won’t have enough ports to use two rotary encoders, so I removed one. I also updated the design accordingly. In the end, I finished the schematic and started routing the PCB. I still have to figure out how to make a breakout board. Does anyone have a good tutorial or tips?"}, {"post_id": 79487, "ts": "2026-10-14T08:22:30Z", "hours": 0.8953, "text": "I was making an electrical schematic for my HackPad, and I ran into an issue when connecting all the components to the controller, as there are not enough pins. I have: dispaly(2 pins), 3x3 matrix(6 pins), rgb leds(1 pin) and 2 rotary encoders(4 pins, the buttons are in the matrix). The controler has 11 data pins but I need 13. Can someone help?"}, {"post_id": 79402, "ts": "2026-10-13T20:26:58Z", "hours": 0.9164, "text": "Finishing the day by creating an overall design for the hackPad to give myself an idea of how to build the PCB and case. I ended up with the idea of making a breakout board that I can connect with some wires to the main board and mount one of the rotary encoders on the side. Also im wondering what you guys use to make quick design, personally use draw.io ."}, {"post_id": 79363, "ts": "2026-10-13T17:27:33Z", "hours": 0.4692, "text": "My first PCB design."}]...
|
Title: My awesome HackPad! by @Leon_know | Stardan Title: My awesome HackPad! by @Leon_know | Stardance
Devlogs:
My first PCB design.
Finishing the day by creating an overall design for the hackPad to give myself an idea of how to build the PCB and case. I ended up with the idea of making a breakout board that I can connect with some wires to the main board and mount one of the rotary encoders on the side. Also im wondering what you guys use to make quick design, personally use draw.io .
I was making an electrical schematic for my HackPad, and I ran into an issue when connecting all the components to the controller, as there are not enough pins. I have: dispaly(2 pins), 3x3 matrix(6 pins), rgb leds(1 pin) and 2 rotary encoders(4 pins, the buttons are in the matrix). The controler has 11 data pins but I need 13. Can someone help?
Today, I was working on the PCB for my design. I concluded that I won’t have enough ports to use two rotary encoders, so I removed one. I also updated the design accordingly. In the end, I finished the schematic and started routing the PCB. I still have to figure out how to make a breakout board. Does anyone have a good tutorial or tips?
I continued with my PCB by making traces. Next up is making the shape of the board and creating the ground plane, but I still need to figure out how to do that.
Still PCB designing Almost finished with the board. It took me about 12 hours to get to this point, but I’m happy with the outcome. I really took my time with tracing, but it looks amazing. I hope 3D modeling is going to go a bit faster, though.
FINISHED THE PCB Finally finished the PCB! It took some time, but it was worth the effort; I can’t find a single flaw with it.
It’s 1am, you should go to sleep I spent the first hours of the morning putting switches and keycaps on my board in Fusion. It took me some time to get it set up and used to it, but I’m getting the hang of it.
Designing, designing, designing, … Designing the 2D sketch of the 3D model and that’s it.
My Head Hurts… Spent a lot of time just learning Fusion today, and I think I’m going to have a fever tomorrow.
I made a weele.
Finished my 3D design. What do you think? :)...
|
1792849851.7541702
|
1793454651.7541702
|
|
70649
|
Stardance Setup by @prathameshpvp | Stardance
|
prathameshpvp
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T16:15:04Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "PRATHAMESH.EXE — building my own little corner of the internet ✦ There’s something special about creating a place on the internet that feels entirely your own. PRATHAMESH.EXE started with a simple idea: what if my portfolio felt less like a résumé and more like stepping into a tiny digital world? Inspired by the early internet, Y2K aesthetics, and old-school terminal interfaces, I’ve been shaping it with dark backgrounds, neon pink and purple, pixel typography, and a boot sequence that makes opening a website feel a little like starting up a computer from another era. But I don’t want it to be nostalgia for the sake of nostalgia. I want it to grow with me — a home for my projects, experiments, ideas, and everything I’m still figuring out how to build. Along the way, I’m learning that good design is about more than making something look interesting. Every animation, font, and interaction should have a purpose. There’s still plenty to build, break, rethink, and improve. And honestly, that’s my favourite part. For now, the system is booting.", "repo": "https://github.com/prathameshparkhi/personal-website", "demo": "https://coeus-exoplanet-classifier.streamlit.app/"}]...
|
[{"post_id": 81277, "ts": "202 [{"post_id": 81277, "ts": "2026-10-20T16:11:28Z", "hours": 2.0761, "text": "I wanted to make my personal website feel less like a standard portfolio and more like a little digital world of its own. I went with a Y2K-inspired aesthetic, using a black background, neon pink and purple accents, Press Start 2P, and Space Mono to create that retro terminal feel. I also worked on the startup sequence, with messages like “INITIALISING SYSTEM…” and “LOADING STARFIELD…”, alongside a terminal-inspired layout for blog posts and development logs. One of the main things I’m trying to get right is balancing the visual effects with usability. I want the website to have personality without becoming cluttered or difficult to navigate. Next up: refining the responsive layout, polishing the interactions, and making the project sections feel more complete."}]...
|
Title: Stardance Setup by @prathameshpvp | Stardan Title: Stardance Setup by @prathameshpvp | Stardance
Devlogs:
I wanted to make my personal website feel less like a standard portfolio and more like a little digital world of its own. I went with a Y2K-inspired aesthetic, using a black background, neon pink and purple accents, Press Start 2P, and Space Mono to create that retro terminal feel. I also worked on the startup sequence, with messages like “INITIALISING SYSTEM…” and “LOADING STARFIELD…”, alongside a terminal-inspired layout for blog posts and development logs. One of the main things I’m trying to get right is balancing the visual effects with usability. I want the website to have personality without becoming cluttered or difficult to navigate. Next up: refining the responsive layout, polishing the interactions, and making the project sections feel more complete.
Ships:
PRATHAMESH.EXE — building my own little corner of the internet ✦ There’s something special about creating a place on the internet that feels entirely your own. PRATHAMESH.EXE started with a simple idea: what if my portfolio felt less like a résumé and more like stepping into a tiny digital world? Inspired by the early internet, Y2K aesthetics, and old-school terminal interfaces, I’ve been shaping it with dark backgrounds, neon pink and purple, pixel typography, and a boot sequence that makes opening a website feel a little like starting up a computer from another era. But I don’t want it to be nostalgia for the sake of nostalgia. I want it to grow with me — a home for my projects, experiments, ideas, and everything I’m still figuring out how to build. Along the way, I’m learning that good design is about more than making something look interesting. Every animation, font, and interaction should have a purpose. There’s still plenty to build, break, rethink, and improve. And honestly, that’s my favourite part. For now, the system is booting....
|
1792857319.125368
|
1792943719.125368
|
|
16025
|
MediaPipe Hand Mouse but In java by @ShauryaMathur MediaPipe Hand Mouse but In java by @ShauryaMathur | Stardance...
|
ShauryaMathur
|
1
|
8.0
|
85
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T16:08:02Z", "hours": 8.0, "multiplier": 10.19, "payout": 85, "blessing": "neutral", "text": "StarkMouse - High-Performance Hand Tracking System AP Computer Science A Final Project StarkMouse is an advanced gesture-controlled cursor controller that allows users to operate their computer mouse hands-free. Using MediaPipe and OpenCV on a native C++ backend combined with a Java Swing overlay HUD, the application tracks hand movements, applies coordinate smoothing, and detects finger-pinch gestures to trigger mouse actions. 1. How to Use the Program Prerequisites Java Runtime Environment (JRE) / JDK 17 or higher A working Webcam Windows OS (64-bit) for native dynamic library compatibility ( stark_mouse_jni.dll and opencv_world3416.dll must be in the project root directory) How to Build and Run To build the project and execute the MainApp entry point: Open a terminal in the root directory. Compile and package the application: mvn package Run the generated executable JAR containing all dependencies: java -jar target/stark-mouse-1.0.0-jar-with-dependencies.jar Controls and Gestures Mouse Movement : Hold your hand in front of the webcam. Your cursor will follow the position of the base of your middle finger This anchor was specifically chosen to prevent cursor jumping when fingers pinch. Left Click / Click-and-Drag : Pinch your Thumb and Index Finger together. Releasing the pinch releases the mouse button. Right Click : Pinch your Thumb and Middle Finger together. Mouse Scrolling (Scroll Mode) : Pinch your Thumb and Pinky Finger together. While holding the pinch, move your hand vertically: Moving your hand up scrolls up. Moving your hand down scrolls down. While scrolling, mouse cursor movement is locked to prevent cursor drift. Toggle HUD Overlay (Ctrl+Shift+G) : Press this global hotkey to show or hide the Swing HUD window displaying the camera feed and landmarks. Repositioning HUD : Click and drag anywhere on the HUD panel to move the floating window across your desktop screen. 2. Problems Encountered During Development The “java being anti cv” bottleneck : Initially we planned on using a method called convex hulling to detect fingers as before libraries such as mediapipe that was a common finger detection method. We then realised that convexHull was terrible and we became primary sources as to why libraries such as MediaPipe have been developed. We then tried to bend the rules of the project by calling a python script running mediapipe detection. Our idea was quickly shut down. Our final option was taking the c++ library that was wrapped for python and creating a Java Native Interface from it using a tool called bezelisk. This process took a total of 5 hours, 10 gigabites of Shaurya Mathur’s hotspot and our mental stanities. Once we finally got bezel instealled and working with our library we learned that c++ itself is annoying. Initially, running the Mediapipe tracker and the JNI JVM invocation on the same thread blocked the Swing event thread, resulting in a frozen UI. We resolved this by spawning a separate native execution thread ( std::thread ) in the DLL, calling AttachCurrentThread to register it with the Java VM, and passing frames asynchronously.", "repo": "https://github.com/T-Perm/Ap-CSA-Final-Jarvis", "demo": "https://github.com/T-Perm/Ap-CSA-Final-Jarvis/releases/tag/v1.0.0"}]...
|
[{"post_id": 8128, "ts": "2026 [{"post_id": 8128, "ts": "2026-06-13T15:57:43Z", "hours": 2.9525, "text": "I finally finished the project and submitted it to my teacher. I genuinely got a 95% compared to others who had just recreated games as their project. I’m not mad but rather disappointed that lack of creativity is being celebrated. Its okay tho because here are the changes Change 1: No detecting how many fingers are held up but rather distance between fingers Change 2: JavaSwing UI with a jarvis style bootup Change 3: fixed double clicking and related problems"}, {"post_id": 6531, "ts": "2026-06-10T23:50:19Z", "hours": 5.3514, "text": "My CSA final project is due in an hour. Instead of working on a game in (Trigger warning) java s*ing I’m building an app that turns your gestures into mouse commands. I started with a group of 3 but I have been the only one who has done any work. Its due in 6 hours wish me luck"}]...
|
Title: MediaPipe Hand Mouse but In java by @Shaury Title: MediaPipe Hand Mouse but In java by @ShauryaMathur | Stardance
Devlogs:
My CSA final project is due in an hour. Instead of working on a game in (Trigger warning) java s*ing I’m building an app that turns your gestures into mouse commands. I started with a group of 3 but I have been the only one who has done any work. Its due in 6 hours wish me luck
I finally finished the project and submitted it to my teacher. I genuinely got a 95% compared to others who had just recreated games as their project. I’m not mad but rather disappointed that lack of creativity is being celebrated. Its okay tho because here are the changes Change 1: No detecting how many fingers are held up but rather distance between fingers Change 2: JavaSwing UI with a jarvis style bootup Change 3: fixed double clicking and related problems
Ships:
StarkMouse - High-Performance Hand Tracking System AP Computer Science A Final Project StarkMouse is an advanced gesture-controlled cursor controller that allows users to operate their computer mouse hands-free. Using MediaPipe and OpenCV on a native C++ backend combined with a Java Swing overlay HUD, the application tracks hand movements, applies coordinate smoothing, and detects finger-pinch gestures to trigger mouse actions. 1. How to Use the Program Prerequisites Java Runtime Environment (JRE) / JDK 17 or higher A working Webcam Windows OS (64-bit) for native dynamic library compatibility ( stark_mouse_jni.dll and opencv_world3416.dll must be in the project root directory) How to Build and Run To build the project and execute the MainApp entry point: Open a terminal in the root directory. Compile and package the application: mvn package Run the generated executable JAR containing all dependencies: java -jar target/stark-mouse-1.0.0-jar-with-dependencies.jar Controls and Gestures Mouse Movement : Hold your hand in front of the webcam. Your cursor will follow the position of the base of your middle finger This anchor was specifically chosen to prevent cursor jumping when fingers pinch. Left Click / Click-and-Drag : Pinch your Thumb and Index Finger together. Releasing the pinch releases the mouse button. Right Click : Pinch your Thumb and Middle Finger together. Mouse Scrolling (Scroll Mode) : Pinch your Thumb and Pinky Finger together. While holding the pinch, move your hand vertically: Moving your hand up scrolls up. Moving your hand down scrolls down. While scrolling, mouse cursor movement is locked to prevent cursor drift. Toggle HUD Overlay (Ctrl+Shift+G) : Press this global hotkey to show or hide the Swing HUD window displaying the camera feed and landmarks. Repositioning HUD : Click and drag anywhere on the HUD panel to move the floating window across your desktop screen. 2. Problems Encountered During Development The “java being anti cv” bottleneck : Initially we planned on using a method called convex hulling to detect fingers as before libraries such as mediapipe that was a common finger detection method. We then realised that convexHull was terrible and we became primary sources as to why libraries such as MediaPipe have been developed. We then tried to bend the rules of the project by calling a python script running mediapipe detection. Our idea was quickly shut down. Our final option was taking the c++ library that was wrapped for python and creating a Java Native Interface from it using a tool called bezelisk. This process took a total of 5 hours, 10 gigabites of Shaurya Mathur’s hotspot and our mental stanities. Once we finally got bezel instealled and working with our library we learned that c++ itself is annoying. Initially, running the Mediapipe tracker and the JNI JVM invocation on the same thread blocked the Swing event thread, resulting in a frozen UI. We resolved this by spawning a separate native execution thread ( std::thread ) in the DLL, calling AttachCurrentThread to register it with the Java VM, and passing frames asynchronously....
|
1792842509.8789637
|
1792928909.8789637
|
|
70655
|
handybits by @aryanscode | Stardance
|
aryanscode
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T16:41:39Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "yay shipped", "repo": "https://github.com/aryanscodingden/handybits", "demo": "https://handybits.vercel.app"}]...
|
[{"post_id": 81281, "ts": "202 [{"post_id": 81281, "ts": "2026-10-20T16:40:07Z", "hours": 4.2658, "text": "I was very sketchy about uploading random shit to websites, so I coded a toolkit where, locally, you can upload stuff, and it can be done all locally. For example: remove background, sign a PDF. everything that every other tool on the website on the internet needs. It uploads the files to a server and then to the dark web, so I didn’t want that. I just coded this over the weekend."}]...
|
Title: handybits by @aryanscode | Stardance
Devlo Title: handybits by @aryanscode | Stardance
Devlogs:
I was very sketchy about uploading random shit to websites, so I coded a toolkit where, locally, you can upload stuff, and it can be done all locally. For example: remove background, sign a PDF. everything that every other tool on the website on the internet needs. It uploads the files to a server and then to the dark web, so I didn’t want that. I just coded this over the weekend.
Ships:
yay shipped...
|
1792857320.208667
|
1792943720.208667
|
|
69049
|
Wish sender by @sarthak_jnj | Stardance
|
sarthak_jnj
|
1
|
4.35
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-11T14:16:50Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "It is supposed to be a bot that automatically runs with your device startup, checks it’s own history and then executes the command to send a specific message & image to a defined contact on WhatsApp. I personally kept it at 9 days as a small fun project to tease a friend during a 9-day long indian traditional festival. The messages, phone number, file location and photos can easily be replaced. The difficulty for me was the new experience, making projects itself is a new thing for me I’ve recently added to my timeline, and i prefer hardware mostly so I’m not much experienced with software work and working with so many libraries, that’s why this project is more of a reminder that “you have to do this today too. just keep an eye if something goes wrong” rather than something dealing with itself in the background. What i am proud of can be that i learnt the JSON thing for this project solely but practice rather than any theory reading. and even tho i used an AI to guide me, i genuinely found a lot of troubles and came up with 3-4 creative workarounds by the end and completely made the structure myself even if i asked the specific commands from AI. For those trying this, it is easy to use as it is, just make sure you already have logged into WhatsApp, adjust the pixel locations according to your device as given in README.md, increase time.sleep() if you think your device/network is taking too long. adjust the file location before running it and don’t use it to actually mess with someone, it’s supposed to be something for a joke, not to irritate anyone (unless they’re a close friend)", "repo": "https://github.com/Sarthak-jnj/Just-a-wishing-bot", "demo": "https://github.com/Sarthak-jnj/Just-a-wishing-bot/blob/main/Demo.zip"}]...
|
[{"post_id": 81289, "ts": "202 [{"post_id": 81289, "ts": "2026-10-20T17:20:08Z", "hours": 0.3531, "text": "Just worked up with a needed demo to quick install the files."}, {"post_id": 78728, "ts": "2026-10-11T12:36:51Z", "hours": 1.4719, "text": "Devlog Post-final Yeah…..so i discovered some more issues. primarily the WhatsApp’s internal safeguard to prevent automated bots from attaching files. had to work around that. should definetly be final devlog tho."}, {"post_id": 78665, "ts": "2026-10-11T07:05:07Z", "hours": 0.4492, "text": "Devlog final: Finished it up and set the GitHub repository, although forgot to record that on lapse. run a test once to ensure it’s working too. Link on the project page"}, {"post_id": 78424, "ts": "2026-10-10T19:29:56Z", "hours": 1.8186, "text": "Devlog 1 Pretty much completed the thing; it took me more time than expected. Since it’s late, I’ll just finish up a few remaining adjustments tomorrow morning and post a GitHub repo. A basic WhatsApp bot that scans the date every time you turn your computer on and will send a wish to any defined number through WhatsApp, if you turn your pc on a second time the same day it won’t trigger. Feel free to use it as a meme with friends or genuinely with family (once i finish up tomorrow). Was kinda a micro-fun-project, nothing serious."}]...
|
Title: Wish sender by @sarthak_jnj | Stardance
De Title: Wish sender by @sarthak_jnj | Stardance
Devlogs:
Devlog 1 Pretty much completed the thing; it took me more time than expected. Since it’s late, I’ll just finish up a few remaining adjustments tomorrow morning and post a GitHub repo. A basic WhatsApp bot that scans the date every time you turn your computer on and will send a wish to any defined number through WhatsApp, if you turn your pc on a second time the same day it won’t trigger. Feel free to use it as a meme with friends or genuinely with family (once i finish up tomorrow). Was kinda a micro-fun-project, nothing serious.
Devlog final: Finished it up and set the GitHub repository, although forgot to record that on lapse. run a test once to ensure it’s working too. Link on the project page
Devlog Post-final Yeah…..so i discovered some more issues. primarily the WhatsApp’s internal safeguard to prevent automated bots from attaching files. had to work around that. should definetly be final devlog tho.
Just worked up with a needed demo to quick install the files.
Ships:
It is supposed to be a bot that automatically runs with your device startup, checks it’s own history and then executes the command to send a specific message & image to a defined contact on WhatsApp. I personally kept it at 9 days as a small fun project to tease a friend during a 9-day long indian traditional festival. The messages, phone number, file location and photos can easily be replaced. The difficulty for me was the new experience, making projects itself is a new thing for me I’ve recently added to my timeline, and i prefer hardware mostly so I’m not much experienced with software work and working with so many libraries, that’s why this project is more of a reminder that “you have to do this today too. just keep an eye if something goes wrong” rather than something dealing with itself in the background. What i am proud of can be that i learnt the JSON thing for this project solely but practice rather than any theory reading. and even tho i used an AI to guide me, i genuinely found a lot of troubles and came up with 3-4 creative workarounds by the end and completely made the structure myself even if i asked the specific commands from AI. For those trying this, it is easy to use as it is, just make sure you already have logged into WhatsApp, adjust the pixel locations according to your device as given in README.md, increase time.sleep() if you think your device/network is taking too long. adjust the file location before running it and don’t use it to actually mess with someone, it’s supposed to be something for a joke, not to irritate anyone (unless they’re a close friend)...
|
1792817497.0705569
|
1792903897.0705569
|
|
29722
|
Pikne by @marksdude | Stardance
|
marksdude
|
0
|
115.02
|
0
|
[]
|
[{"post_id": 81292, "ts": "202 [{"post_id": 81292, "ts": "2026-10-20T17:46:43Z", "hours": 6.5956, "text": "I have finished version 0.1 of the firmware. It currently only has a simple menu to check some battery information. It relies on the ArduinoSMBus library for communicating with the BMS and the Adafruit SSD1306 and Adafruit GFX libraries for drawing on the OLED. I also made some wiring diagrams."}, {"post_id": 77053, "ts": "2026-10-05T14:31:05Z", "hours": 2.1569, "text": "Started work on the main firmware file. I will implement the more important stuff first, like the stuff needed for the power bank to function and most of the status displaying. Then, I will start work on the less important features, like more advanced safety (in case one of the BMS’s MOSFETs fail) and communication between the power bank and modules. I have currently made functions for reading the USB output current and for reading the battery charger’s status."}, {"post_id": 74074, "ts": "2026-09-26T16:57:15Z", "hours": 3.0439, "text": "I learned how to send data over UART to ESPHome. I will use this to send battery info from the power bank to the LED controller module, so it could be displayed in Home Assistant. How will it work? First the ATmega328P in the power bank will put all the values that will be sent into a single string. The string will look like this: bat:xx|current:xx|voltage:xx|usb_current:xx Then when the module receives it, ESPHome will run a lambda that splits the received string into separate strings for each value. They will then be converted into floats and sent to the corresponding sensor component. For testing, I used a XIAO ESP32-C3 to send dummy data to a revision 1 LED controller PCB. Next, I will work on module detection or the OLED interface for the power bank."}, {"post_id": 69799, "ts": "2026-09-17T20:11:47Z", "hours": 0.55, "text": "Took some pictures First I’m going to talk about funding. I’m currently waiting for funding. Hopefully I get it before Stardance ends. I requested funding for the power bank and the LED controller module, no flashlight module because I’m prioritizing getting the power bank working. It was also the most expensive module and would have required me to write even more firmware. Firmware development isn’t my strong suit. In the meantime I thought it would be a good idea to ask for permission to use my school’s 3D printers. Got the permission, printed the enclosure and took some pictures. Currently, it is basically just an empty enclosure, I put in the screws, OLED, pogo connector and the first revision non-working PCB to test how the parts would fit and so it would look better on the pictures. That’s all for now, thank you. I will be working on the firmware from now on."}, {"post_id": 66872, "ts": "2026-09-12T20:22:03Z", "hours": 8.9631, "text": "Been working on the BOM. It has been pretty boring. Every PCB has its own BOM and I have put the final price of every one of them into one main BOM so it will be easier to read. I also changed the inductor on the main power bank PCB to a one that fits the enclosure. I found one that has the needed current rating and is small enough so I didn’t have to change anything other than the inductor on the PCB."}, {"post_id": 60975, "ts": "2026-09-03T17:34:00Z", "hours": 1.1475, "text": "Not enough space yay!!! With a higher current inductor comes a bigger package which doesn’t fit. I have a few options now: Change the case Find a smaller connector that can handle the current use a different inductor that isn’t that tall Probably going to try to find a shorter inductor. I may be able to make the 5v regulator inductor smaller because I don’t think it needs a current rating that high and then maybe use the regained space for a wider and shorter inductor."}, {"post_id": 59573, "ts": "2026-09-01T13:56:19Z", "hours": 2.8336, "text": "Found an issue on the BMS board I found that I had connected the cell sense pins in the wrong order. I had connected them like this: B- to VC0, B+ to VC1 and cell 1 to VC2, but it should have been connected like this: B- to VC0, cell 1 to VC1 and B+ to VC2. I almost didn’t notice it because I didn’t check that part of it. I thought that I wouldn’t have made a mistake like that. This wasn’t the only issue with the sense connections the other was that I didn’t use kelvin connections for them. Without kelvin connections you will get less accurate readings because of voltage drop in the copper. I also improved it a little. I added cutouts for the current sensing resistor so I have separate pads for the sensing traces and the high current path. This should improve the current sensing accuracy which means I get a more accurate battery charge estimate. Then I added buttons for waking the IC up for programming and for shutting the output down so the battery can safely be removed. I moved the connector for the thermistors and the balance lead to the other side so the wires won’t have to run near a high current switching inductor which is on the main PCB. Thank you for reading!"}, {"post_id": 57572, "ts": "2026-08-29T19:15:51Z", "hours": 4.9053, "text": "Discovered some issues with the main PCB’s schematic when I was checking it before making the BOM First issue was that the inductor I chose for the battery charge IC (BQ25792) that also makes the 9, 12, 15 and 20V for USB PD had a current rating too little (guess that’s what happens if you design a PCB like this very inexperienced like I was 8 months ago) which would have limited it to around 30W output max, so this time I calculated the required rating myself (previously got the inductor from a reference design). Found that it should have been almost double the previous 7A for the 45W I initially aimed for, but if the IC can handle 60W then why not choose an inductor for 60W? So that’s what I did, the new inductor that has a rating of 15.8A should be able handle 60W. Second was that for some reason I tied the SDRV pin of the battery charge IC to the battery when instead it should have been tied to GND through a 1nf capacitor if not in use. I don’t know why I did it because the datasheet clearly says “Connect a 0402 / 50V / 1nF ceramic capacitor from SDRV to GND when the ship FET is not used.” This may have been the cause why the PCB didn’t work correctly when I made the first prototype of it around 2 months ago. I thought it was because of bad soldering, so I tried to resolder everything with a hot plate and burned bunch of my capacitors and probably some other components too. There were some other minor issues like me choosing footprints too small for some capacitors and not using the output current monitoring of the efuse. The efuse current monitoring isn’t really an issue but it is nice to see the exact output current on the display. I probably skipped it because I couldn’t understand how it worked back then. Thank you for reading!"}, {"post_id": 55106, "ts": "2026-08-26T15:45:34Z", "hours": 6.0947, "text": "Added logos to everything, fixed some alignment issues and added little holes for the module to go into to take stress away from the USB-C plug when dropped or twisted."}, {"post_id": 53222, "ts": "2026-08-23T17:43:03Z", "hours": 7.9406, "text": "Finished the flashlight module case! It will be CNCed out of aluminum, so it could act as a heatsink only the frame that holds the acrylic lens is 3D printed. I tried to fill up as much free space as possible with aluminum so the LEDs could run at max brightness for as long as possible. And… about the LiPo charger module I probably won’t make it I don’t think I have enough time since getting a grant and shipping of the PCBs will take a few weeks, so I may not have enough time to make firmware for everything so I’m skipping it for now."}, {"post_id": 49133, "ts": "2026-08-17T19:24:28Z", "hours": 3.1836, "text": "Started designing the case for the flashlight module. I had to move some stuff around on the driver PCB to make a cutout for the pogo connector. Also changed the connector for the LEDs from JST VH to JST XH for a smaller footprint."}, {"post_id": 47123, "ts": "2026-08-14T19:37:40Z", "hours": 4.6836, "text": "Finished the LED controller shell and made a logo I solved the pogo connector mounting problem by having the front of the upper part open and having the wall on the bottom part."}, {"post_id": 45372, "ts": "2026-08-11T19:45:09Z", "hours": 5.3339, "text": "I’ve been designing the shell for the LED controller module. I Currently have a problem with mounting the pogo connector. The issue is that the design I had in mind won’t work because I have no way of putting brass inserts into the screw holes so I have to find another way. Maybe I could have the top in 2 parts then I could put the brass inserts in."}, {"post_id": 44206, "ts": "2026-08-09T20:18:29Z", "hours": 3.9331, "text": "Finished the LED PCB for the flashlight module I couldn’t fit 40 LEDs like I said I would so there are 30 LEDs. It should still have close to 9000 lm max brightness (It will probably run only for a few seconds at max brightness before it will overheat). I’m just going to drive the LEDs little harder. I first wanted to have connectors for power and the thermistor but I found that JLCPCB only offers 1 layer aluminum core PCBs so I was limited to a 1 layer PCB and I couldn’t use THT connectors so instead I’m going to solder the wires straight to the board."}, {"post_id": 43450, "ts": "2026-08-08T18:21:27Z", "hours": 4.0211, "text": "Finished the LED driver board of the flashlight module! So that’s one of the PCBs done for the flashlight module will do the one that holds the LEDs next. I will be using about 40 of these LEDs so the max brightness will be around 9600 lm. I probably won’t be able to run it at max brightness for very long because it will (probably) hit thermal limits since the only cooling for it is the aluminum core PCB and maybe a CNC aluminum body."}, {"post_id": 42675, "ts": "2026-08-07T15:03:56Z", "hours": 3.1503, "text": "Started designing the flashlight module PCB! I finished the schematic for the driver board yesterday. It’s going to have 2 different PCBs one that does all the communication and driving of the LEDs and the other that is going to have all the LEDs on it. I think thermal management will be easier this way since the LEDs will get pretty hot. I also thought of a name for the project I’m going to name it Pikne which means lightning in estonian."}, {"post_id": 40833, "ts": "2026-08-04T16:44:28Z", "hours": 6.6417, "text": "Finished routing the PCB Now I just got to run it through drc and fix silkscreen. Then the LiPo charger module PCB should be finished."}, {"post_id": 39039, "ts": "2026-08-01T18:32:26Z", "hours": 4.9156, "text": "Finished the LiPo charger module schematic! I had some problems making the battery balancing circuitry because I didn’t know how to switch the balancing mosfets without frying the microcontroller. The problem was that the ground reference for the microcontroller and mosfets were different that basically means that for example the mosfet connected for balancing cell 3 of the battery will have its reference from cell 3 of the pack but the microcontroller will have its reference from the negative of the pack (cell 1) so for the mosfet its source will be at 0V (gnd), but for the microcontroller the mosfet’s source will be around 10.8V. That will mean if I try to turn on the mosfet with 3.3V from the microcontroller Vgs would equal -7.5V (3.3V - 10.8V) which means the mosfet will not turn on since for an N-channel mosfet Vgs has to be positive (atleast 2V for the one I used). First I wanted to use a P-channel mosfet to connect the positive side of the cell to the gate of the N-channel mosfet that would turn on the N-channel mosfet since Vgs would be around 3.6V (3.6V - 0V) but when the balancing mosfet will be off the P-channel mosfet’s gate will be pulled up to the cell voltage so for the mosfets its around 3.6V but for the microcontroller around 10.8v for cell 3 that will fry the microcontroller. Instead I used a octocoupler to connect the positive side of the cell to the N-channel mosfet. Like this I can turn the balancing mosfet on without having the high voltage on the pin of the microcontroller. That probably wasn’t a very good explanation. I’m not very good at explaining. Expected features of the module: Supports charging 1-4S LiPo and Li-Ion batteries Max charge current: 5-6A (1S), 4-4.5A (2S), 3A (3S), 2A (4S) If you actually read through all of this, thank you!"}, {"post_id": 35984, "ts": "2026-07-27T19:43:01Z", "hours": 2.7172, "text": "Finished the shell! This should mean that the hardware of the power bank is mostly finished I still have to test it and then also make firmware for it. Now I think I’m gonna start working more on the modules. I currently have these planned: A Led controller module that will integrate with Home Assistant and allow you to control led strips and stuff (I already have a PCB made for this one). A LiPo charger module that will allow you to charge up to 3s LiPos maybe even 4s A flashlight module (I don’t think I have to explain this) If you have any ideas on more modules I should make please comment them."}, {"post_id": 35430, "ts": "2026-07-26T20:40:28Z", "hours": 8.3822, "text": "Got done with the redesign of the front It took longer than I thought it would. Most of the time I spent fixing the stuff that broke after changing the shell size, but after 8h it’s done! Now I just gotta figure out the button placement again because the old place won’t work with the new design and do some finishing touches and then the shell should be ready. Also I didn’t need to redesign the BMS because the current design fit the new design no problem."}, {"post_id": 33690, "ts": "2026-07-23T20:18:58Z", "hours": 4.6111, "text": "I had almost finished the shell but I got an idea on how to make the power bank a little smaller (2 mm thinner and 4-10 mm shorter). So now I’m gonna redesign the BMS and hope that my idea will actually work without any clearance issues. And also I now have a github repo for the project so you can go take a look at the current PCB designs yourself."}, {"post_id": 32507, "ts": "2026-07-21T18:49:13Z", "hours": 7.6381, "text": "I finished the lower shell part! I ran into some issues with the button placement because I didn’t think about it when designing the main PCB. I placed the button too close to the edge of the PCB, leaving only about 3mm of space between the button and the wall of the shell, as shown in one of the pictures. Since I already have the PCB and I don’t want to order a new revision just to move the button, I will use a different button on the side of the power bank that I will solder to the original button pads with wires. It’s probably not the best solution, but it should work."}, {"post_id": 28833, "ts": "2026-07-15T10:39:10Z", "hours": 6.8114, "text": "So I had to resolder the main PCB because I ripped a pad off a IC while trying to reflow it. I learned the hard way that capacitors also don’t like being on a hot plate for too long. I ended up burning most of them. Now I have to wait for new capacitors before I can fully assemble the PCB."}, {"post_id": 22286, "ts": "2026-07-04T17:52:55Z", "hours": 4.7672, "text": "First devlog on my power bank. Just finished the battery holder in cad. Next will be the lower shell part."}]...
|
Title: Pikne by @marksdude | Stardance
Devlogs:
F Title: Pikne by @marksdude | Stardance
Devlogs:
First devlog on my power bank. Just finished the battery holder in cad. Next will be the lower shell part.
So I had to resolder the main PCB because I ripped a pad off a IC while trying to reflow it. I learned the hard way that capacitors also don’t like being on a hot plate for too long. I ended up burning most of them. Now I have to wait for new capacitors before I can fully assemble the PCB.
I finished the lower shell part! I ran into some issues with the button placement because I didn’t think about it when designing the main PCB. I placed the button too close to the edge of the PCB, leaving only about 3mm of space between the button and the wall of the shell, as shown in one of the pictures. Since I already have the PCB and I don’t want to order a new revision just to move the button, I will use a different button on the side of the power bank that I will solder to the original button pads with wires. It’s probably not the best solution, but it should work.
I had almost finished the shell but I got an idea on how to make the power bank a little smaller (2 mm thinner and 4-10 mm shorter). So now I’m gonna redesign the BMS and hope that my idea will actually work without any clearance issues. And also I now have a github repo for the project so you can go take a look at the current PCB designs yourself.
Got done with the redesign of the front It took longer than I thought it would. Most of the time I spent fixing the stuff that broke after changing the shell size, but after 8h it’s done! Now I just gotta figure out the button placement again because the old place won’t work with the new design and do some finishing touches and then the shell should be ready. Also I didn’t need to redesign the BMS because the current design fit the new design no problem.
Finished the shell! This should mean that the hardware of the power bank is mostly finished I still have to test it and then also make firmware for it. Now I think I’m gonna start working more on the modules. I currently have these planned: A Led controller module that will integrate with Home Assistant and allow you to control led strips and stuff (I already have a PCB made for this one). A LiPo charger module that will allow you to charge up to 3s LiPos maybe even 4s A flashlight module (I don’t think I have to explain this) If you have any ideas on more modules I should make please comment them.
Finished the LiPo charger module schematic! I had some problems making the battery balancing circuitry because I didn’t know how to switch the balancing mosfets without frying the microcontroller. The problem was that the ground reference for the microcontroller and mosfets were different that basically means that for example the mosfet connected for balancing cell 3 of the battery will have its reference from cell 3 of the pack but the microcontroller will have its reference from the negative of the pack (cell 1) so for the mosfet its source will be at 0V (gnd), but for the microcontroller the mosfet’s source will be around 10.8V. That will mean if I try to turn on the mosfet with 3.3V from the microcontroller Vgs would equal -7.5V (3.3V - 10.8V) which means the mosfet will not turn on since for an N-channel mosfet Vgs has to be positive (atleast 2V for the one I used). First I wanted to use a P-channel mosfet to connect the positive side of the cell to the gate of the N-channel mosfet that would turn on the N-channel mosfet since Vgs would be around 3.6V (3.6V - 0V) but when the balancing mosfet will be off the P-channel mosfet’s gate will be pulled up to the cell voltage so for the mosfets its around 3.6V but for the microcontroller around 10.8v for cell 3 that will fry the microcontroller. Instead I used a octocoupler to connect the positive side of the cell to the N-channel mosfet. Like this I can turn the balancing mosfet on without having the high voltage on the pin of the microcontroller. That probably wasn’t a very good explanation. I’m not very good at explaining. Expected features of the module: Supports charging 1-4S LiPo and Li-Ion batteries Max charge current: 5-6A (1S), 4-4.5A (2S), 3A (3S), 2A (4S) If you actually read through all of this, thank you!
Finished routing the PCB Now I just got to run it through drc and fix silkscreen. Then the LiPo charger module PCB should be finished.
Started designing the flashlight module PCB! I finished the schematic for the driver board yesterday. It’s going to have 2 different PCBs one that does all the communication and driving of the LEDs and the other that is going to have all the LEDs on it. I think thermal management will be easier this way since the LEDs will get pretty hot. I also thought of a name for the project I’m going to name it Pikne which means lightning in estonian.
Finished the LED driver board of the flashlight module! So that’s one of the PCBs done for the flashlight module will do the one that holds the LEDs next. I will be using about 40 of these LEDs so the max brightness will be around 9600 lm. I probably won’t be able to run it at max brightness for very long because it will (probably) hit thermal limits since the only cooling for it is the aluminum core PCB and maybe a CNC aluminum body.
Finished the LED PCB for the flashlight module I couldn’t fit 40 LEDs like I said I would so there are 30 LEDs. It should still have close to 9000 lm max brightness (It will probably run only for a few seconds at max brightness before it will overheat). I’m just going to drive the LEDs little harder. I first wanted to have connectors for power and the thermistor but I found that JLCPCB only offers 1 layer aluminum core PCBs so I was limited to a 1 layer PCB and I couldn’t use THT connectors so instead I’m going to solder the wires straight to the board.
I’ve been designing the shell for the LED controller module. I Currently have a problem with mounting the pogo connector. The issue is that the design I had in mind won’t work because I have no way of putting brass inserts into the screw holes so I have to find another way. Maybe I could have the top in 2 parts then I could put the brass inserts in.
Finished the LED controller shell and made a logo I solved the pogo connector mounting problem by having the front of the upper part open and having the wall on the bottom part.
Started designing the case for the flashlight module. I had to move some stuff around on the driver PCB to make a cutout for the pogo connector. Also changed the connector for the LEDs from JST VH to JST XH for a smaller footprint.
Finished the flashlight module case! It will be CNCed out of aluminum, so it could act as a heatsink only the frame that holds the acrylic lens is 3D printed. I tried to fill up as much free space as possible with aluminum so the LEDs could run at max brightness for as long as possible. And… about the LiPo charger module I probably won’t make it I don’t think I have enough time since getting a grant and shipping of the PCBs will take a few weeks, so I may not have enough time to make firmware for everything so I’m skipping it for now.
Added logos to everything, fixed some alignment issues and added little holes for the module to go into to take stress away from the USB-C plug when dropped or twisted.
Discovered some issues with the main PCB’s schematic when I was checking it before making the BOM First issue was that the inductor I chose for the battery charge IC (BQ25792) that also makes the 9, 12, 15 and 20V for USB PD had a current rating too little (guess that’s what happens if you design a PCB like this very inexperienced like I was 8 months ago) which would have limited it to around 30W output max, so this time I calculated the required rating myself (previously got the inductor from a reference design). Found that it should have been almost double the previous 7A for the 45W I initially aimed for, but if the IC can handle 60W then why not choose an inductor for 60W? So that’s what I did, the new inductor that has a rating of 15.8A should be able handle 60W. Second was that for some reason I tied the SDRV pin of the battery charge IC to the battery when instead it should have been tied to GND through a 1nf capacitor if not in use. I don’t know why I did it because the datasheet clearly says “Connect a 0402 / 50V / 1nF ceramic capacitor from SDRV to GND when the ship FET is not used.” This may have been the cause why the PCB didn’t work correctly when I made the first prototype of it around 2 months ago. I thought it was because of bad soldering, so I tried to resolder everything with a hot plate and burned bunch of my capacitors and probably some other components too. There were some other minor issues like me choosing footprints too small for some capacitors and not using the output current monitoring of the efuse. The efuse current monitoring isn’t really an issue but it is nice to see the exact output current on the display. I probably skipped it because I couldn’t understand how it worked back then. Thank you for reading!
Found an issue on the BMS board I found that I had connected the cell sense pins in the wrong order. I had connected them like this: B- to VC0, B+ to VC1 and cell 1 to VC2, but it should have been connected like this: B- to VC0, cell 1 to VC1 and B+ to VC2. I almost didn’t notice it because I didn’t check that part of it. I thought that I wouldn’t have made a mistake like that. This wasn’t the only issue with the sense connections the other was that I didn’t use kelvin connections for them. Without kelvin connections you will get less accurate readings because of voltage drop in the copper. I also improved it a little. I added cutouts for the current sensing resistor so I have separate pads for the sensing traces and the high current path. This should improve the current sensing accuracy which means I get a more accurate battery charge estimate. Then I added buttons for waking the IC up for programming and for shutting the output down so the battery can safely be removed. I moved the connector for the thermistors and the balance lead to the other side so the wires won’t have to run near a high current switching inductor which is on the main PCB. Thank you for reading!
Not enough space yay!!! With a higher current inductor comes a bigger package which doesn’t fit. I have a few options now: Change the case Find a smaller connector that can handle the current use a different inductor that isn’t that tall Probably going to try to find a shorter inductor. I may be able to make the 5v regulator inductor smaller because I don’t think it needs a current rating that high and then maybe use the regained space for a wider and shorter inductor.
Been working on the BOM. It has been pretty boring. Every PCB has its own BOM and I have put the final price of every one of them into one main BOM so it will be easier to read. I also changed the inductor on the main power bank PCB to a one that fits the enclosure. I found one that has the needed current rating and is small enough so I didn’t have to change anything other than the inductor on the PCB.
Took some pictures First I’m going to talk about funding. I’m currently waiting for funding. Hopefully I get it before Stardance ends. I requested funding for the power bank and the LED controller module, no flashlight module because I’m prioritizing getting the power bank working. It was also the most expensive module and would have required me to write even more firmware. Firmware development isn’t my strong suit. In the meantime I thought it would be a good idea to ask for permission to use my school’s 3D printers. Got the permission, printed the enclosure and took some pictures. Currently, it is basically just an empty enclosure, I put in the screws, OLED, pogo connector and the first revision non-working PCB to test how the parts would fit and so it would look better on the pictures. That’s all for now, thank you. I will be working on the firmware from now on.
I learned how to send data over UART to ESPHome. I will use this to send battery info from the power bank to the LED controller module, so it could be displayed in Home Assistant. How will it work? First the ATmega328P in the power bank will put all the values that will be sent into a single string. The string will look like this: bat:xx|current:xx|voltage:xx|usb_current:xx Then when the module receives it, ESPHome will run a lambda that splits the received string into separate strings for each value. They will then be converted into floats and sent to the corresponding sensor component. For testing, I used a XIAO ESP32-C3 to send dummy data to a revision 1 LED controller PCB. Next, I will work on module detection or the OLED interface for the power bank.
Started work on the main firmware file. I will implement the more important stuff first, like the stuff needed for the power bank to function and most of the status displaying. Then, I will start work on the less important features, like more advanced safety (in case one of the BMS’s MOSFETs fail) and communication between the power bank and modules. I have currently made functions for reading the USB output current and for reading the battery charger’s status.
I have finished version 0.1 of the firmware. It currently only has a simple menu to check some battery information. It relies on the ArduinoSMBus library for communicating with the BMS and the Adafruit SSD1306 and Adafruit GFX libraries for drawing on the OLED. I also made some wiring diagrams....
|
1792532864.413885
|
1793137664.413885
|
|
30933
|
HamOS (ham-ster, not ham) by @Luksus | Stardance
|
Luksus
|
4
|
37.0
|
361
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T19:20:33Z", "hours": 13.0, "multiplier": 16.46, "payout": 219, "blessing": "neutral", "text": "PLEASE READ LAST DEVLOG <3 Hello. This is the 3rd and last ship of HamOS. It was incredibly fun making this project. In this ship I added a lots of things which I don’t remember (CurrentOpenAppsBar, F11, animations, styles, widgets, bug fixes, QoL updates, etc..) Please checkout every app, windows, features in HamOS. There is a hidden secret for you the second, you enter the website! My main inspiration for this project was the old era of computers and my hamster “Džambule”. (May my luck find 188 stardust for grants from this ship)", "repo": "https://github.com/lkspodmol/hamos", "demo": "https://lkspodmol.github.io/hamos"}, {"ship_num": 2, "ts": "2026-08-10T20:10:55Z", "hours": 8.0, "multiplier": 9.8, "payout": 81, "blessing": "neutral", "text": "Hello everyone! This is my 3nd ship of HamOS. (2nd of WebOS 2) A lot has changed since 2nd ship and those are: Apps: Help, App for helping users with QnA Settings, App for customization of HamOS HamOS To Go, Similar app (tool) to Windows To Go, it will launch HamOS in your tab instead of Džambulas computer. A new shortcut to Wikipedia New look for existing Introduction app, in NOKIA style (hands) And the biggest nightmare…. Scaling. I had problems with scaling HamOS website to other resolutions. Only 1920x1080 was supported, but now from 720p to 4K (16:9) should work without any major issues. The most annoying thing about this were also always changing margins, so app icons are alligned, etc… And for fun, I added a little sticky note that will help visitors start up the computer with HamOS. Also please, do not mind if the window you are moving is faster or slower than your mouse pointer. (check app Help) If you have any ideas, on what I should add, comment please! Visit HamOS at: https://lkspodmol.github.io/myos1/ (Please try F11) Thanks for reading. Happy coding and happy rating!", "repo": "https://github.com/lkspodmol/hamos", "demo": "https://lkspodmol.github.io/hamos"}, {"ship_num": 3, "ts": "2026-07-24T23:17:16Z", "hours": 7.0, "multiplier": 8.65, "payout": 61, "blessing": "neutral", "text": "Hello everyone! This is 2nd ship of HamOS, that brought some cool features and that are: Crt monitor Coslop Starting and shutting down the system Sound effects! I had a lot of fun drawing in this ship. I think the crt monitor turned out very good. I am also very happy with the sounds I added. Fits in so well. I am also updating the very fine text on the “Floppy”, that says, what version you are running (always the newest). I have some ideas for the future, but I think that a little break whould be also very good idea. If you have any ideas, on what I should add, comment please! Likes are very appreciated <3. Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)", "repo": "https://github.com/lkspodmol/hamos", "demo": "https://lkspodmol.github.io/hamos"}, {"ship_num": 4, "ts": "2026-07-22T16:02:57Z", "hours": 9.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Have a working webpage with multiple draggable windows, Check It should look like your own and not exactly like the guide, Check Have at least 3 devlogs showing your progress along the way, Check Have at least 1 new feature that the guide didn’t list, Check It shouldn’t have a password (so anyone can test it out!), Check Hello everyone! This is my first ship on stardance and I hope, that you will like my WebOS 1. My WebOS 1 is HamOS. Not ham like ham, but ham like ham-ster. Hamster, because of my hamster Džambule. I love him very much, so I got an idea to create WebOS, that is designed for him and you got in somehow. Little things that I liked when coding is being lost in my own code. The best things I added in my opinion are: The loading screen!! Photo gallery of him And the custom hand drew icons made by me (intentionally bad) So please, visit and try HamOS at: https://lkspodmol.github.io/myos1/ . WebOS 1 was incredibly fun and interesting and I will try to continue in WebOS 2. Should it be HamOS, or HamOS PRO? Let me know. Thank you for reading this or commenting, liking and happy coding!", "repo": "https://github.com/lkspodmol/hamos", "demo": "https://lkspodmol.github.io/hamos"}]...
|
[{"post_id": 81298, "ts": "202 [{"post_id": 81298, "ts": "2026-10-20T18:28:24Z", "hours": 1.8453, "text": "Devlog? #15 - PLEASE READ! Hello everyone… New version of HamOS v1.7 just rolled out. What have I added or fixed? Bugs: volume lowered of loud sounds Added: new styles menu new styles The end? So yeah. This will be probably the last devlog of HamOS. I had many laughs when making HamOS and I must thank the organizers of Stardance for this! I want to say thank you to the every person I have talked to on stardance / hackclub. That includes slack. Specifically: Ethan, Brahmtej, Craw, Fraud squad , mixid_mbb, LakasZada, Thunder, starviper, SeradedStripes and all of unmentioned. You made my day less boring either with just chatting in the #stardance, huddling in huddle, playing on our minecraft server or playing games in #boba-bash-greater-noida. #boba-bash-greater-noida deserves its own section. It was incredibly fun playing with all of you for a week. The best ones were Skribbl, Among Us and Gartic Phone. I will include some funny screenshots. Big + to the organizers of this event, Brahmtej and agm. I hope we will meet again next year or sooner ❤️ . I will remember (hopefully). Lukas out . Visit HamOS at: https://lkspodmol.github.io/hamos/"}, {"post_id": 77886, "ts": "2026-10-08T17:29:40Z", "hours": 1.905, "text": "Devlog #14 Hello everyone! New version of HamOS v1.6 just rolled out! What have I added or fixed? Bugs: Added: “current open apps bar” animations! New system of indexes.html and fodler structures! A whole new STYLES system!! The boring part: I had idea of different styles a long time back in time. So I implemented them in this update. You can select what style you want and it will apply. The new selection menu will be more polished in the next update. I promise. If YOU (yes, you) want to make a style for hamos, please click the link in the selection menu and dm me! I would be very happy! With the animations of “CAOB”. It was a little difficult. I need to make the timing right, make it launch or not close when app is still open. It had its bugs when in development, but it should be working flawlessly now. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!"}, {"post_id": 75899, "ts": "2026-10-01T15:22:15Z", "hours": 0.9667, "text": "The opening of community styles for HamOS! Hello everyone. Today im announcing that YOU, can create styles for HamOS, that will be added! If anyone wants to make a style (please do, I will be very happy), dm me on slack @luksus with the files, etc. (View the before last attached photo.) Everything you will need, will be in the template that I made for you (dimensions, info, restricted areas, etc.) Please download the template ( https://drive.google.com/drive/folders/1wteLNYUOm6-3gt77MpcvDc4UFpRlmfD8?usp=sharing ). You can also view the finished example. Edit 2 hours later: I just tried doing style myself and it turned out pretty okay! Check before last attached screenshot. I will be waiting for everyone’s styles ! Happy coding stardancers. ( https://lapse.hackclub.com/timelapse/7iCZKuc8ZhRJ )"}, {"post_id": 74799, "ts": "2026-09-28T09:18:33Z", "hours": 1.6833, "text": "Devlog #13 Hello everyone! What did I add in this update? Animations for “Currently opened apps bar”! And delay for the apps to launch (just like in a real life). When you open app, the little icon BOUNCES (video in attachment). This update isn’t live right now and wont be until v1.6. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!"}, {"post_id": 74152, "ts": "2026-09-26T19:42:31Z", "hours": 2.7161, "text": "Devlog #12 Hello everyone! New version of HamOS v1.5 just rolled out! What have I added or fixed? Bugs: cursor: pointer; bug fix (entire desktop was clickable) cursor: pointer; bug fix (entire app rows were clickable, not only apps) Added: Widgets! Current apps opened bar! New settings feature New QnA The boring part: In this version, I had an idea to add widgets (because I loved widgets in Windows Vista). Then I needed content for the widgets. I wanted clock, but I was lazy to create some clock, so I just used clock widget iframe. Some people dont have to like the widgets, so I added a new option in settings to hide them. And with all of the apps opened, it was a little bit difficult to navigate between them, so I added “Current apps opened bar”. When app is opened, it shows its icon in the bar, which can be clicked for focusing the app window. The order of app icons in the bar is fixed, because I was too lazy to implement some kind of order-system. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!"}, {"post_id": 69102, "ts": "2026-09-16T11:33:43Z", "hours": 2.94, "text": "Devlog #11 Hello everyone! A little devlog after a long time of inactivity. The break was amazing. Been to Bulgaria. Nice sea they’ve got. And now to HamOS. I am currently working on widgets, (little inspiration taken from my beloved Windows Vista). I am too lazy to create some clock, so I just used clock widget iframe. ( ) The version of the HamOS with a one widget added is live now, but it is in beta and not polished. (Something like a developer version of iOS) I had a lot of ideas for HamOS, but I don’t know if I will have enough time to add all of them. Visit HamOS at: https://lkspodmol.github.io/myos1/ That is all. Happy coding everyone!"}, {"post_id": 46604, "ts": "2026-08-13T23:20:19Z", "hours": 0.3886, "text": "oh my god. What am I even publishing? Before checking the code for other bugs, etc.. I shipped it, because I was very excited and wanted to get item that I very want. I checked on HamOS today if I didn’t overlook anything and I saw that newly opened app windows weren’t in the center of the crt. So I changed multiple % values. And then I noticed that Welcome and Introduction app windows weren’t getting focused when they are clicked. I left welcome app and introduction app in one div, because of one < /div >. After fixing that, the app windows weren’t in the center of the crt AGAIN. So I had to revert every % value that I changed. (Thank god for github commits) So this was a little log of fixing ONE < /DIV > that caused these issues… Happy coding everyone.. happy happy."}, {"post_id": 45451, "ts": "2026-08-11T22:18:13Z", "hours": 0.8619, "text": "Hey everyone! Quick fix happened. On some screens, there was a bug that the icons weren’t aligned properly. My dumb ah put row div in a row div in a row div. The best code you will ever see. Had to change so many % values. But it is over now. Fix is now live (thankfully, before reviewers could rate it)."}, {"post_id": 44783, "ts": "2026-08-10T19:54:34Z", "hours": 1.0506, "text": "Devlog #10 Hello everyone! Just published HamOS v1.4, version mainly about resolution scaling and small fixes. In v1.4 was alongside added Settings app that has personalization features (primary colors and set wallpapers). And if you will notice, a little sticky paper was added that will help visitors start up HamOS. After this Devlog I will ship HamOS Again! I want more opinions :> (and stardust tooo–.) Visit HamOS at: https://lkspodmol.github.io/myos1/ That is all. Happy coding everyone!"}, {"post_id": 42926, "ts": "2026-08-07T22:05:49Z", "hours": 3.1981, "text": "Devlog #9 omg this was a nightmare. Hey everyone! Just wanted to share that I finally somehow fixed scaling of HamOS! Previously, only 1920x1080 was supported, but now, 720p HD —> 4K! Yippie! : b Now I just need to add one more feature and this update will be live in the next version of HamOS v1.4. The biggest issue I encountered while making this was also applying it to the top bar. I also somehow broke a bug, bug-feature, that the top bar is always under app windows, now, app windows are under the top bar. Happy coding everyone! Ham out. –hehe"}, {"post_id": 41033, "ts": "2026-08-04T23:18:32Z", "hours": 4.0636, "text": "Devlog #8 Hey everyone! HamOS v1.3 is here. This is everything that happened in this update: The new Help app contains some problems that people issue with HamOS. In the style of QnA. If you have any questions or problems with HamOS, please comment under one of my devlogs. And the new HamOS To Go tool does something like Windows To Go tool. Windows To Go creates Windows on usb drive that you can plug into any computer and run your version of Windows. The HamOS To Go tool opens a new tab that will have only the HamOS, without the crt monitor. I added this feature to help some people with bugs or if they only want the HamOS without the crt monitor. And a new shortcut for Wikipedia. I was also playing with margins, so icons, divs look aligned. I used the existing icon of app Introduction for the new app Help and designed a new icon for it. I had idea in my mind, that well, if it is an introduction, it is like connecting people (or hamsters) no? I remembered old nokia loading screen and was inspired by it (the hands). And at the end, I added a little bit more info to the githubs README file. After the break, I had a whole set of ideas that I wrote down. One of them is Theme app suggested from anonymous that rated 2nd ship. Sadly, I have to fix a big issue first and that is screen scaling D: HamOS is only fully supported on 1920x1080 for now. Others have to workaround by scaling the site bigger or smaller. That is it. Happy coding everyone! Visit HamOS here: https://lkspodmol.github.io/myos1/"}, {"post_id": 34338, "ts": "2026-07-24T23:03:03Z", "hours": 1.3542, "text": "Devlog #7 Hey everyone! HamOS version v1.2 is here! What have I updated: Different crt monitor stand LED retextured Power-on button retextured Added Welcome SOUNDS!! (starting up, power-on button, welcome) If you have any ideas, on what I should add, comment please! Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)"}, {"post_id": 34077, "ts": "2026-07-24T15:19:18Z", "hours": 3.3767, "text": "Devlog #6 Hey everyone! HamOS version v1.1 is here! What have I updated: Copilot, but Coslop The crt monitor! Nicer power-on button Removed the Pro If you have any ideas, on what I should add, comment please! Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)"}, {"post_id": 33562, "ts": "2026-07-23T16:23:39Z", "hours": 2.3761, "text": "Hey everyone! Just added a crt monitor that will show HamOS Pro! Check it out at: https://lkspodmol.github.io/myos1/ Likes and comments are appreciated <3. (image is a sneak peak, until you check it out yourself)"}, {"post_id": 32989, "ts": "2026-07-22T14:45:45Z", "hours": 1.8106, "text": "Devlog #5 Hey everyone! Last update on HamOS. What have I updated: Removed link texts in bar Added new shortcuts with new goated icons Image optimisations ( < picture > idea @ethmarks , Thanks!) New loading screen! I will probably continue HamOS in WebOS 2, so HamOS 2, HamOS PRO? - Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)"}, {"post_id": 32503, "ts": "2026-07-21T18:36:49Z", "hours": 1.0731, "text": "Devlog #4 Hey everyone! A lot of this update wasn’t about adding huge features, just one app and fixing some small things. I added a Photos app, so Džambule finally has somewhere to keep his favorite pictures. 🐹📸 You can also click individual photo and view it in full resolution / quality. Also fyi, the icons are drawn by me. It is intentionally bad, don’t think that I cant draw. hehe.. I’m thinking about adding a very lite version of Start button. We will see if that will happen. Whould be cool. I’m also wondering how does stardances algorithm work. I’ve seen one devlog, that had one sentence and got hundreds of views. Hope algorithm will notice me. If the Start button will happen, then I’m probably gonna ship my HamOS to the stars. Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding."}, {"post_id": 29815, "ts": "2026-07-16T23:12:33Z", "hours": 0.6344, "text": "Not technically a devlog, but Devlog #3 Hey everyone! It struck me out of nowhere, that I am making a HamOS. OS for / about hamster. So should not it be about my hamster? Its logic. So, I personalized it to my hamster Džambule. You will by in my hamsters computer (please do not break anything). In the next update, I am thinking that I will make apps like Notes and Photos, that will already have something in them (Džambule’s notes or photos) Thanks everyone for reading this and happy coding!"}, {"post_id": 29565, "ts": "2026-07-16T16:16:43Z", "hours": 3.4081, "text": "Devlog #2 Hey everyone! Heres what I added to my HamOS: Draggable windows Bar at top of a window with X Closing and opening apps/windows Desktop icons Only welcome window shows up when page is loaded Window focusing… Etc. It looks very nice in this state right now. Little bit scared of part 5 in the tutorial. I have an idea for the app, but I just hope that it wont be too hard. Thanks everyone for reading this devlog and maybe visiting my HamOS? Bye! Link for HamOS: https://lkspodmol.github.io/myos1/"}, {"post_id": 29029, "ts": "2026-07-15T17:59:05Z", "hours": 1.7144, "text": "Hello everyone! Just started working on my WebOS, that will be called HamOS. No, not ham, like ham, but ham like ham-ster :D. The tutorial was super helpful even though it didn’t look like at first. This HamOS will be mainly customized to my hamster Džambule. I even added a gif of him :>. That was enough coding for the day. Finished 2 parts. Thanks stardance for this, for everything and for the STICKERS!!. Out."}]...
|
Title: HamOS (ham-ster, not ham) by @Luksus | Star Title: HamOS (ham-ster, not ham) by @Luksus | Stardance
Devlogs:
Hello everyone! Just started working on my WebOS, that will be called HamOS. No, not ham, like ham, but ham like ham-ster :D. The tutorial was super helpful even though it didn’t look like at first. This HamOS will be mainly customized to my hamster Džambule. I even added a gif of him :>. That was enough coding for the day. Finished 2 parts. Thanks stardance for this, for everything and for the STICKERS!!. Out.
Devlog #2 Hey everyone! Heres what I added to my HamOS: Draggable windows Bar at top of a window with X Closing and opening apps/windows Desktop icons Only welcome window shows up when page is loaded Window focusing… Etc. It looks very nice in this state right now. Little bit scared of part 5 in the tutorial. I have an idea for the app, but I just hope that it wont be too hard. Thanks everyone for reading this devlog and maybe visiting my HamOS? Bye! Link for HamOS: https://lkspodmol.github.io/myos1/
Not technically a devlog, but Devlog #3 Hey everyone! It struck me out of nowhere, that I am making a HamOS. OS for / about hamster. So should not it be about my hamster? Its logic. So, I personalized it to my hamster Džambule. You will by in my hamsters computer (please do not break anything). In the next update, I am thinking that I will make apps like Notes and Photos, that will already have something in them (Džambule’s notes or photos) Thanks everyone for reading this and happy coding!
Devlog #4 Hey everyone! A lot of this update wasn’t about adding huge features, just one app and fixing some small things. I added a Photos app, so Džambule finally has somewhere to keep his favorite pictures. 🐹📸 You can also click individual photo and view it in full resolution / quality. Also fyi, the icons are drawn by me. It is intentionally bad, don’t think that I cant draw. hehe.. I’m thinking about adding a very lite version of Start button. We will see if that will happen. Whould be cool. I’m also wondering how does stardances algorithm work. I’ve seen one devlog, that had one sentence and got hundreds of views. Hope algorithm will notice me. If the Start button will happen, then I’m probably gonna ship my HamOS to the stars. Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding.
Devlog #5 Hey everyone! Last update on HamOS. What have I updated: Removed link texts in bar Added new shortcuts with new goated icons Image optimisations ( < picture > idea @ethmarks , Thanks!) New loading screen! I will probably continue HamOS in WebOS 2, so HamOS 2, HamOS PRO? - Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)
Hey everyone! Just added a crt monitor that will show HamOS Pro! Check it out at: https://lkspodmol.github.io/myos1/ Likes and comments are appreciated <3. (image is a sneak peak, until you check it out yourself)
Devlog #6 Hey everyone! HamOS version v1.1 is here! What have I updated: Copilot, but Coslop The crt monitor! Nicer power-on button Removed the Pro If you have any ideas, on what I should add, comment please! Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)
Devlog #7 Hey everyone! HamOS version v1.2 is here! What have I updated: Different crt monitor stand LED retextured Power-on button retextured Added Welcome SOUNDS!! (starting up, power-on button, welcome) If you have any ideas, on what I should add, comment please! Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)
Devlog #8 Hey everyone! HamOS v1.3 is here. This is everything that happened in this update: The new Help app contains some problems that people issue with HamOS. In the style of QnA. If you have any questions or problems with HamOS, please comment under one of my devlogs. And the new HamOS To Go tool does something like Windows To Go tool. Windows To Go creates Windows on usb drive that you can plug into any computer and run your version of Windows. The HamOS To Go tool opens a new tab that will have only the HamOS, without the crt monitor. I added this feature to help some people with bugs or if they only want the HamOS without the crt monitor. And a new shortcut for Wikipedia. I was also playing with margins, so icons, divs look aligned. I used the existing icon of app Introduction for the new app Help and designed a new icon for it. I had idea in my mind, that well, if it is an introduction, it is like connecting people (or hamsters) no? I remembered old nokia loading screen and was inspired by it (the hands). And at the end, I added a little bit more info to the githubs README file. After the break, I had a whole set of ideas that I wrote down. One of them is Theme app suggested from anonymous that rated 2nd ship. Sadly, I have to fix a big issue first and that is screen scaling D: HamOS is only fully supported on 1920x1080 for now. Others have to workaround by scaling the site bigger or smaller. That is it. Happy coding everyone! Visit HamOS here: https://lkspodmol.github.io/myos1/
Devlog #9 omg this was a nightmare. Hey everyone! Just wanted to share that I finally somehow fixed scaling of HamOS! Previously, only 1920x1080 was supported, but now, 720p HD —> 4K! Yippie! : b Now I just need to add one more feature and this update will be live in the next version of HamOS v1.4. The biggest issue I encountered while making this was also applying it to the top bar. I also somehow broke a bug, bug-feature, that the top bar is always under app windows, now, app windows are under the top bar. Happy coding everyone! Ham out. –hehe
Devlog #10 Hello everyone! Just published HamOS v1.4, version mainly about resolution scaling and small fixes. In v1.4 was alongside added Settings app that has personalization features (primary colors and set wallpapers). And if you will notice, a little sticky paper was added that will help visitors start up HamOS. After this Devlog I will ship HamOS Again! I want more opinions :> (and stardust tooo–.) Visit HamOS at: https://lkspodmol.github.io/myos1/ That is all. Happy coding everyone!
Hey everyone! Quick fix happened. On some screens, there was a bug that the icons weren’t aligned properly. My dumb ah put row div in a row div in a row div. The best code you will ever see. Had to change so many % values. But it is over now. Fix is now live (thankfully, before reviewers could rate it).
oh my god. What am I even publishing? Before checking the code for other bugs, etc.. I shipped it, because I was very excited and wanted to get item that I very want. I checked on HamOS today if I didn’t overlook anything and I saw that newly opened app windows weren’t in the center of the crt. So I changed multiple % values. And then I noticed that Welcome and Introduction app windows weren’t getting focused when they are clicked. I left welcome app and introduction app in one div, because of one < /div >. After fixing that, the app windows weren’t in the center of the crt AGAIN. So I had to revert every % value that I changed. (Thank god for github commits) So this was a little log of fixing ONE < /DIV > that caused these issues… Happy coding everyone.. happy happy.
Devlog #11 Hello everyone! A little devlog after a long time of inactivity. The break was amazing. Been to Bulgaria. Nice sea they’ve got. And now to HamOS. I am currently working on widgets, (little inspiration taken from my beloved Windows Vista). I am too lazy to create some clock, so I just used clock widget iframe. ( ) The version of the HamOS with a one widget added is live now, but it is in beta and not polished. (Something like a developer version of iOS) I had a lot of ideas for HamOS, but I don’t know if I will have enough time to add all of them. Visit HamOS at: https://lkspodmol.github.io/myos1/ That is all. Happy coding everyone!
Devlog #12 Hello everyone! New version of HamOS v1.5 just rolled out! What have I added or fixed? Bugs: cursor: pointer; bug fix (entire desktop was clickable) cursor: pointer; bug fix (entire app rows were clickable, not only apps) Added: Widgets! Current apps opened bar! New settings feature New QnA The boring part: In this version, I had an idea to add widgets (because I loved widgets in Windows Vista). Then I needed content for the widgets. I wanted clock, but I was lazy to create some clock, so I just used clock widget iframe. Some people dont have to like the widgets, so I added a new option in settings to hide them. And with all of the apps opened, it was a little bit difficult to navigate between them, so I added “Current apps opened bar”. When app is opened, it shows its icon in the bar, which can be clicked for focusing the app window. The order of app icons in the bar is fixed, because I was too lazy to implement some kind of order-system. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!
Devlog #13 Hello everyone! What did I add in this update? Animations for “Currently opened apps bar”! And delay for the apps to launch (just like in a real life). When you open app, the little icon BOUNCES (video in attachment). This update isn’t live right now and wont be until v1.6. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!
The opening of community styles for HamOS! Hello everyone. Today im announcing that YOU, can create styles for HamOS, that will be added! If anyone wants to make a style (please do, I will be very happy), dm me on slack @luksus with the files, etc. (View the before last attached photo.) Everything you will need, will be in the template that I made for you (dimensions, info, restricted areas, etc.) Please download the template ( https://drive.google.com/drive/folders/1wteLNYUOm6-3gt77MpcvDc4UFpRlmfD8?usp=sharing ). You can also view the finished example. Edit 2 hours later: I just tried doing style myself and it turned out pretty okay! Check before last attached screenshot. I will be waiting for everyone’s styles ! Happy coding stardancers. ( https://lapse.hackclub.com/timelapse/7iCZKuc8ZhRJ )
Devlog #14 Hello everyone! New version of HamOS v1.6 just rolled out! What have I added or fixed? Bugs: Added: “current open apps bar” animations! New system of indexes.html and fodler structures! A whole new STYLES system!! The boring part: I had idea of different styles a long time back in time. So I implemented them in this update. You can select what style you want and it will apply. The new selection menu will be more polished in the next update. I promise. If YOU (yes, you) want to make a style for hamos, please click the link in the selection menu and dm me! I would be very happy! With the animations of “CAOB”. It was a little difficult. I need to make the timing right, make it launch or not close when app is still open. It had its bugs when in development, but it should be working flawlessly now. Visit HamOS at: https://lkspodmol.github.io/myos1/ Thanks for reading and that is all for this update. Happy coding everyone!
Devlog? #15 - PLEASE READ! Hello everyone… New version of HamOS v1.7 just rolled out. What have I added or fixed? Bugs: volume lowered of loud sounds Added: new styles menu new styles The end? So yeah. This will be probably the last devlog of HamOS. I had many laughs when making HamOS and I must thank the organizers of Stardance for this! I want to say thank you to the every person I have talked to on stardance / hackclub. That includes slack. Specifically: Ethan, Brahmtej, Craw, Fraud squad , mixid_mbb, LakasZada, Thunder, starviper, SeradedStripes and all of unmentioned. You made my day less boring either with just chatting in the #stardance, huddling in huddle, playing on our minecraft server or playing games in #boba-bash-greater-noida. #boba-bash-greater-noida deserves its own section. It was incredibly fun playing with all of you for a week. The best ones were Skribbl, Among Us and Gartic Phone. I will include some funny screenshots. Big + to the organizers of this event, Brahmtej and agm. I hope we will meet again next year or sooner ❤️ . I will remember (hopefully). Lukas out . Visit HamOS at: https://lkspodmol.github.io/hamos/
Ships:
Have a working webpage with multiple draggable windows, Check It should look like your own and not exactly like the guide, Check Have at least 3 devlogs showing your progress along the way, Check Have at least 1 new feature that the guide didn’t list, Check It shouldn’t have a password (so anyone can test it out!), Check Hello everyone! This is my first ship on stardance and I hope, that you will like my WebOS 1. My WebOS 1 is HamOS. Not ham like ham, but ham like ham-ster. Hamster, because of my hamster Džambule. I love him very much, so I got an idea to create WebOS, that is designed for him and you got in somehow. Little things that I liked when coding is being lost in my own code. The best things I added in my opinion are: The loading screen!! Photo gallery of him And the custom hand drew icons made by me (intentionally bad) So please, visit and try HamOS at: https://lkspodmol.github.io/myos1/ . WebOS 1 was incredibly fun and interesting and I will try to continue in WebOS 2. Should it be HamOS, or HamOS PRO? Let me know. Thank you for reading this or commenting, liking and happy coding!
Hello everyone! This is 2nd ship of HamOS, that brought some cool features and that are: Crt monitor Coslop Starting and shutting down the system Sound effects! I had a lot of fun drawing in this ship. I think the crt monitor turned out very good. I am also very happy with the sounds I added. Fits in so well. I am also updating the very fine text on the “Floppy”, that says, what version you are running (always the newest). I have some ideas for the future, but I think that a little break whould be also very good idea. If you have any ideas, on what I should add, comment please! Likes are very appreciated <3. Visit HamOS here: https://lkspodmol.github.io/myos1/ Thanks for reading! Happy coding. (pls algorithm, big views)
Hello everyone! This is my 3nd ship of HamOS. (2nd of WebOS 2) A lot has changed since 2nd ship and those are: Apps: Help, App for helping users with QnA Settings, App for customization of HamOS HamOS To Go, Similar app (tool) to Windows To Go, it will launch HamOS in your tab instead of Džambulas computer. A new shortcut to Wikipedia New look for existing Introduction app, in NOKIA style (hands) And the biggest nightmare…. Scaling. I had problems with scaling HamOS website to other resolutions. Only 1920x1080 was supported, but now from 720p to 4K (16:9) should work without any major issues. The most annoying thing about this were also always changing margins, so app icons are alligned, etc… And for fun, I added a little sticky note that will help visitors start up the computer with HamOS. Also please, do not mind if the window you are moving is faster or slower than your mouse pointer. (check app Help) If you have any ideas, on what I should add, comment please! Visit HamOS at: https://lkspodmol.github.io/myos1/ (Please try F11) Thanks for reading. Happy coding and happy rating!
PLEASE READ LAST DEVLOG <3 Hello. This is the 3rd and last ship of HamOS. It was incredibly fun making this project. In this ship I added a lots of things which I don’t remember (CurrentOpenAppsBar, F11, animations, styles, widgets, bug fixes, QoL updates, etc..) Please checkout every app, windows, features in HamOS. There is a hidden secret for you the second, you enter the website! My main inspiration for this project was the old era of computers and my hamster “Džambule”. (May my luck find 188 stardust for grants from this ship)...
|
1792821141.4660888
|
1792907541.4660888
|
|
70680
|
Test by @radioblahaj | Stardance
|
radioblahaj
|
0
|
1.27
|
0
|
[]
|
[{"post_id": 81303, "ts": "202 [{"post_id": 81303, "ts": "2026-10-20T18:50:20Z", "hours": 1.275, "text": "Desktop pet"}]...
|
Title: Test by @radioblahaj | Stardance
Devlogs:
Title: Test by @radioblahaj | Stardance
Devlogs:
Desktop pet...
|
1792525633.882755
|
1793130433.882755
|
|
69463
|
fast typing by @pmandal7355 | Stardance
|
pmandal7355
|
0
|
5.54
|
0
|
[]
|
[{"post_id": 81310, "ts": "202 [{"post_id": 81310, "ts": "2026-10-20T19:30:08Z", "hours": 0.6739, "text": "made the readme and now its time to ship"}, {"post_id": 81200, "ts": "2026-10-20T08:12:57Z", "hours": 1.3483, "text": "made the game , just some bugs need to be fixed and the readme is left"}, {"post_id": 80997, "ts": "2026-10-19T15:31:09Z", "hours": 0.6178, "text": "made the full parts of the rendering , just the ui is left to made and the readme is left"}, {"post_id": 80668, "ts": "2026-10-18T13:25:01Z", "hours": 1.8475, "text": "made the livery and race sentences and some tweaks, next will be the rendering part and ui , everything is from scratch"}, {"post_id": 79632, "ts": "2026-10-14T19:16:52Z", "hours": 1.0489, "text": "made some parts of the game and downloaded the dependencies and made the graphics"}]...
|
Title: fast typing by @pmandal7355 | Stardance
De Title: fast typing by @pmandal7355 | Stardance
Devlogs:
made some parts of the game and downloaded the dependencies and made the graphics
made the livery and race sentences and some tweaks, next will be the rendering part and ui , everything is from scratch
made the full parts of the rendering , just the ui is left to made and the readme is left
made the game , just some bugs need to be fixed and the readme is left
made the readme and now its time to ship...
|
1792849852.9382157
|
1793454652.9382157
|
|
70686
|
Unsub by @Capy | Stardance
|
Capy
|
0
|
0.47
|
0
|
[]
|
[{"post_id": 81318, "ts": "202 [{"post_id": 81318, "ts": "2026-10-20T20:12:13Z", "hours": 0.4694, "text": "I started coding Unsub! Currently, I’ve got a nice intro panel which smoothly transitions into the screen upon which the game will be played! (you could even call it screen-ception! ..Or not…) Anyway, I think this project will stick more than the others I’ve tried making recently! :) I’ll add some fun gameplay features. Hope to see you in the next devlog, thanks for reading! :D Anyway, I’m off to bed! :)"}]...
|
Title: Unsub by @Capy | Stardance
Devlogs:
I star Title: Unsub by @Capy | Stardance
Devlogs:
I started coding Unsub! Currently, I’ve got a nice intro panel which smoothly transitions into the screen upon which the game will be played! (you could even call it screen-ception! ..Or not…) Anyway, I think this project will stick more than the others I’ve tried making recently! :) I’ll add some fun gameplay features. Hope to see you in the next devlog, thanks for reading! :D Anyway, I’m off to bed! :)...
|
1792529224.3276656
|
1793134024.3276656
|
|
57429
|
UltimateWarioPlane by @niejestemprawdziwyy | Stard UltimateWarioPlane by @niejestemprawdziwyy | Stardance...
|
niejestemprawdziwyy
|
0
|
6.55
|
0
|
[]
|
[{"post_id": 81320, "ts": "202 [{"post_id": 81320, "ts": "2026-10-20T20:14:01Z", "hours": 4.4625, "text": "Ole mole guacamole Got seriously lost and had to fix a bug, because the game crashed but now i’ve got minigame 1 done. I also wanted to add the explosion when losing a life, because why not. The next minigame will be either clicker or space invaders clone, we’ll see. And why is piwo the substitute of heart here, when it’s a game about a plane? Because piwo is my fuel."}, {"post_id": 77100, "ts": "2026-10-05T17:08:55Z", "hours": 2.0906, "text": "Just a simple look at the platform level, most things still don’t have textures, so what would i be showing lol. For now i’m following the tutorial, but i still want to add some variations. Except the playable character being, well, a plane. And all jokes aside, flappy bird with it would be quite the idea for another minigame. And also, if anyone reads devlogs, do you know why is the plane so blurry? When i look at the image it’s normal, but in godot it’s all blurred. I made it in piskel and exported as .png. Lastly, if YOU have an idea of a fun minigame, comment down below and remember to like, subscribe and whatever byee"}]...
|
Title: UltimateWarioPlane by @niejestemprawdziwyy Title: UltimateWarioPlane by @niejestemprawdziwyy | Stardance
Devlogs:
Just a simple look at the platform level, most things still don’t have textures, so what would i be showing lol. For now i’m following the tutorial, but i still want to add some variations. Except the playable character being, well, a plane. And all jokes aside, flappy bird with it would be quite the idea for another minigame. And also, if anyone reads devlogs, do you know why is the plane so blurry? When i look at the image it’s normal, but in godot it’s all blurred. I made it in piskel and exported as .png. Lastly, if YOU have an idea of a fun minigame, comment down below and remember to like, subscribe and whatever byee
Ole mole guacamole Got seriously lost and had to fix a bug, because the game crashed but now i’ve got minigame 1 done. I also wanted to add the explosion when losing a life, because why not. The next minigame will be either clicker or space invaders clone, we’ll see. And why is piwo the substitute of heart here, when it’s a game about a plane? Because piwo is my fuel....
|
1792705933.8041182
|
1793310733.8041182
|
|
37056
|
Main Website/Portfolio by @reshiiiram | Stardance
|
reshiiiram
|
2
|
23.0
|
61
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T20:28:46Z", "hours": 8.0, "multiplier": 7.28, "payout": 61, "blessing": "neutral", "text": "Alright!!! this is going to be my website’s second ship! Please check out the art gallery and the cool image map! I’m really proud of how this portfolio came out and I will be adding the photography page next and may be a blog page next ship.", "repo": "https://github.com/mairemare/reshi-the-coolram", "demo": "https://mairemare.github.io/reshi-the-coolram/"}, {"ship_num": 2, "ts": "2026-07-26T04:11:47Z", "hours": 15.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "It’s finally done!!! I really love how this website turned out after 15 hours of coding. This website really shows my interests and love for space. My website includes: an about me, projects section, and an updates section where I’ll put any important updates on my projects or my life. I’m gonna improve more on website making so that I can promote my future projects even more and my friends with their fan merch businesses. Thank you for all your support! I might take a short break on coding after this and begin on Library of Halcyon.", "repo": "https://github.com/mairemare/reshi-the-coolram", "demo": "https://mairemare.github.io/reshi-the-coolram/"}]...
|
[{"post_id": 81322, "ts": "202 [{"post_id": 81322, "ts": "2026-10-20T20:24:59Z", "hours": 0.4608, "text": "Alright!!! my website it ready for shipping! Not all the pages are done but the gallery is up!"}, {"post_id": 81109, "ts": "2026-10-19T22:17:55Z", "hours": 0.8553, "text": "Image Map Complete! I am now currently adding my art in my art gallery and I will potentially add my photos next."}, {"post_id": 80882, "ts": "2026-10-19T04:44:37Z", "hours": 1.2711, "text": "Added my first link on image map. I’m having a slight problem on alignment but that just means I need to watch a tut on how to actually do this. I also added some of the stuff back from the first version of the website."}, {"post_id": 78923, "ts": "2026-10-12T01:57:39Z", "hours": 1.0742, "text": "reworked about me Okay so I reworked the about me section and put up small details about myself. I will be working on adding coordinates on my image map after I’m done with the main page so that there wouldn’t be any conflict (just in case that it turns my html does not care that the image is a separate entity)."}, {"post_id": 78739, "ts": "2026-10-11T13:25:37Z", "hours": 1.3261, "text": "progress^^ I’m working on an image map so my website can look more cooler and colorful. Might make mini-pages alongside that to show all my artworks and coding projects. I should be able to ship this before stardance ends."}, {"post_id": 60642, "ts": "2026-09-03T04:03:41Z", "hours": 2.9783, "text": "I’ve been reworking on my main website layout (since witchyware is out and there isn’t enough space on the page). I’m still sticking to the space concept and I’m gonna try and figure out the script for making tabs. Probably tomorrow night I’ll think of a different header design."}, {"post_id": 46158, "ts": "2026-08-13T05:36:00Z", "hours": 0.3444, "text": "I’m back! — okay so I updated the website to put concept arts and new updates. I’ve been watching and learning css stuff so that I can make my website easier to navigate. My plan is to separate the sections and the projects…something like that. Then, I’ll add a gallery section and other stuff. — I think I’ll be able to update it once I finish half of the warioware mission."}, {"post_id": 34961, "ts": "2026-07-26T02:47:43Z", "hours": 4.6428, "text": "My website is about to be ready for shipping! I can’t figure out how to get the link to open my website instead of my readme. Either way, here’s a preview of my read me!"}, {"post_id": 34417, "ts": "2026-07-25T03:27:28Z", "hours": 3.8119, "text": "Almost done with the site! All I need to do is to add a few aesthetics and more mechanisms. Anyways, here’s a preview of the projects section. Thank you for all your support chat."}, {"post_id": 33894, "ts": "2026-07-24T05:29:07Z", "hours": 2.3725, "text": "New Layout!! I finally got the arrangement and the buttons to work. I might be able to ship this tomorrow or the day after that."}, {"post_id": 33350, "ts": "2026-07-23T05:56:41Z", "hours": 1.1056, "text": "a lot of progress!! I discovered the existence of img src and text align and underwent an Industrial Revolution. I just need to learn how to code buttons and I’m off to designing and adding stuff."}, {"post_id": 33329, "ts": "2026-07-23T04:24:55Z", "hours": 1.9858, "text": "After 3 Youtube tutorials and 10 google searches later, I finally made some great progress! Well, it doesn’t really look like what I had planned, but everything is starting to come together."}, {"post_id": 32784, "ts": "2026-07-22T05:14:34Z", "hours": 0.4086, "text": "Lowkey finished my website’s outline and what it should look like. I’m working on a cyberpunk style website where I can put up my works and all that stuff."}, {"post_id": 32768, "ts": "2026-07-22T04:13:21Z", "hours": 0.6614, "text": "Just finished the personal web tutorial. Not bad as my first coding project that isn’t block based. I’m gonna start outlining what I want my web to look like on Canva and learn CSS after this log."}]...
|
Title: Main Website/Portfolio by @reshiiiram | Sta Title: Main Website/Portfolio by @reshiiiram | Stardance
Devlogs:
Just finished the personal web tutorial. Not bad as my first coding project that isn’t block based. I’m gonna start outlining what I want my web to look like on Canva and learn CSS after this log.
Lowkey finished my website’s outline and what it should look like. I’m working on a cyberpunk style website where I can put up my works and all that stuff.
After 3 Youtube tutorials and 10 google searches later, I finally made some great progress! Well, it doesn’t really look like what I had planned, but everything is starting to come together.
a lot of progress!! I discovered the existence of img src and text align and underwent an Industrial Revolution. I just need to learn how to code buttons and I’m off to designing and adding stuff.
New Layout!! I finally got the arrangement and the buttons to work. I might be able to ship this tomorrow or the day after that.
Almost done with the site! All I need to do is to add a few aesthetics and more mechanisms. Anyways, here’s a preview of the projects section. Thank you for all your support chat.
My website is about to be ready for shipping! I can’t figure out how to get the link to open my website instead of my readme. Either way, here’s a preview of my read me!
I’m back! — okay so I updated the website to put concept arts and new updates. I’ve been watching and learning css stuff so that I can make my website easier to navigate. My plan is to separate the sections and the projects…something like that. Then, I’ll add a gallery section and other stuff. — I think I’ll be able to update it once I finish half of the warioware mission.
I’ve been reworking on my main website layout (since witchyware is out and there isn’t enough space on the page). I’m still sticking to the space concept and I’m gonna try and figure out the script for making tabs. Probably tomorrow night I’ll think of a different header design.
progress^^ I’m working on an image map so my website can look more cooler and colorful. Might make mini-pages alongside that to show all my artworks and coding projects. I should be able to ship this before stardance ends.
reworked about me Okay so I reworked the about me section and put up small details about myself. I will be working on adding coordinates on my image map after I’m done with the main page so that there wouldn’t be any conflict (just in case that it turns my html does not care that the image is a separate entity).
Added my first link on image map. I’m having a slight problem on alignment but that just means I need to watch a tut on how to actually do this. I also added some of the stuff back from the first version of the website.
Image Map Complete! I am now currently adding my art in my art gallery and I will potentially add my photos next.
Alright!!! my website it ready for shipping! Not all the pages are done but the gallery is up!
Ships:
It’s finally done!!! I really love how this website turned out after 15 hours of coding. This website really shows my interests and love for space. My website includes: an about me, projects section, and an updates section where I’ll put any important updates on my projects or my life. I’m gonna improve more on website making so that I can promote my future projects even more and my friends with their fan merch businesses. Thank you for all your support! I might take a short break on coding after this and begin on Library of Halcyon.
Alright!!! this is going to be my website’s second ship! Please check out the art gallery and the cool image map! I’m really proud of how this portfolio came out and I will be adding the photography page next and may be a blog page next ship....
|
1792824909.3665135
|
1792911309.3665135
|
|
70689
|
mini About me website for Boba Bash workshop by @L mini About me website for Boba Bash workshop by @Luksus | Stardance...
|
Luksus
|
0
|
2.2
|
0
|
[]
|
[{"post_id": 81325, "ts": "202 [{"post_id": 81325, "ts": "2026-10-20T20:39:12Z", "hours": 2.2047, "text": "Website for Boba bash workshop The workshop was about learning basic html, css, js. Since I know how to html, I created something funny, because I wanted to be a part of the workshop that was online. Those who live in India in some spot, Boba Bash will have a live event, where you need your website to enter. I wont ship this project as I don’t take it as a serious project. I added it because it was a part of Stardance and I wanted it here. The website contains basic js, css, html. Only true coders mix html and css into index.html. When you click the “next” button, you get next message and the button will move to another spot for funsies ."}]...
|
Title: mini About me website for Boba Bash worksho Title: mini About me website for Boba Bash workshop by @Luksus | Stardance
Devlogs:
Website for Boba bash workshop The workshop was about learning basic html, css, js. Since I know how to html, I created something funny, because I wanted to be a part of the workshop that was online. Those who live in India in some spot, Boba Bash will have a live event, where you need your website to enter. I wont ship this project as I don’t take it as a serious project. I added it because it was a part of Stardance and I wanted it here. The website contains basic js, css, html. Only true coders mix html and css into index.html. When you click the “next” button, you get next message and the button will move to another spot for funsies ....
|
1792529227.4880378
|
1793134027.4880378
|
|
70691
|
2d platformer for Cardputer ADV by @Grant19 | Star 2d platformer for Cardputer ADV by @Grant19 | Stardance...
|
Grant19
|
0
|
1.87
|
0
|
[]
|
[{"post_id": 81329, "ts": "202 [{"post_id": 81329, "ts": "2026-10-20T21:04:27Z", "hours": 1.8664, "text": "I have made a level select screen, a character the frog and level 1s begening with gravity, adding movement next"}]...
|
Title: 2d platformer for Cardputer ADV by @Grant19 Title: 2d platformer for Cardputer ADV by @Grant19 | Stardance
Devlogs:
I have made a level select screen, a character the frog and level 1s begening with gravity, adding movement next...
|
1792532832.6256576
|
1793137632.6256576
|
|
9961
|
Koganeee by @quintessence24 | Stardance
|
quintessence24
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-20T23:30:59Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "As a Jujutsu Kaisen fan and an admirer of flying pets, I wanted to make Kogane for my room. The objective of Kogane is to be a person-following flying pet assistant that can communicate with voice and through a retractable screen, sort of like a flying Alexa but friendlier! I also wanted to make drones for a while and it seemed like a cool approach to make Kogane. A use case that I had in mind is when I’m working in my room and my hands are busy and if I need to quickly pull up a tutorial, I would normally have to put things down to find my laptop. Instead with Kogane, I can call for Kogane wherever I am in my room and quickly check for information or pull up a Youtube tutorial from its screen without any physical contact. I got everything to work on a very close call, but my harnesses weren’t very strong and accidentally tangled with the propeller for a second, causing a motor to burn up and failing the first test flight (and of course, the shell for Koganeee was pretty but reduced performance aerodynamically). Nonetheless, all of the tests passed and I just need to swap out the motor, but still a successful project regardless and I’m proud of everything I was able to learn, whether it be firmware and networking with the ESP32, the endless soldering sessions for different kinds of components, taking care of batteries, etc. Check out my project and of course, contact me on Slack (sujaygolla24) for questions or just to nerd out about JJK or other anime!!! :D", "repo": "https://github.com/Sujay-Golla/koganeee", "demo": ""}]...
|
[{"post_id": 81355, "ts": "202 [{"post_id": 81355, "ts": "2026-10-20T23:13:21Z", "hours": 6.1683, "text": "Devlog #4 - Preparing and starting build Summary Had to unpack and arrange all of the electronics I received, checked connectors and what I needed to make connectors for again. Realized I had designed for JST-XH rather than JST-SH connectors so spent a while trying to learn all of the different types of connectors so that I can avoid making the same mistake again For the time being, I stripped wires, crimped them and used my JST-XH connectors for the FC to ESC connection I had no idea how to solder XT60 connectors so I had to learn, and then after a while, I realized I needed to connect a male female pair at the end to avoid deformation so I had wasted the soldering session Next Steps Noticed that JOURNAL.md is more preferred for hardware projects, so I will be switching to that for future documentation Will continue soldering, wiring and coding step by step, but more specifically, I will work on checking if the ESC to FC connection works and if I can power the 5V rail on the board"}, {"post_id": 22542, "ts": "2026-07-05T02:00:31Z", "hours": 16.4061, "text": "Devlog #3 - Finishing the CAD and Ready to Ship Summary Finished the CAD for Kogane, the drone and the ground station Vibe coded firmware temporarily and tested functionality with my laptop webcam manually Finished documentation and shipping it to Outpost Next Steps Once approved, I have to order and build Will work on firmware while waiting for the parts to arrive to save time"}, {"post_id": 21100, "ts": "2026-07-02T21:54:54Z", "hours": 16.3197, "text": "Devlog #2 - Finishing the FC PCB Summary Followed the tutorial for tips to layout the board Used more tutorials and datasheets to understand different concepts of board layout like via stitching and filled zones Made a 4-layer PCB for the first time and learned how to connect power and grounds to appropriate components with vias Learned different routing practices, and despite the suboptimal routing, I am pretty confident now that it will at least be functional Next Steps Finishing the CAD model and final BOM Finishing the firmware template, maybe even using some cameras to test the positioning system"}, {"post_id": 15499, "ts": "2026-06-25T06:02:25Z", "hours": 25.7803, "text": "Devlog #1 [Real] - Schematic design and shopping Summary Used various different sources to learn about different components used in FCs Learned how to use datasheets, Webench, LCSC part selections, etc. Spent time reviewing different requirements for batteries and W/T ratios for drones in general and picking the right batteries and circuit designs Spent a lot of time scoping and rescoping the PCB, including having to remove battery charger and using an external ESC as it was too complex and tight for the compact PCB, especially while having a separate MCU and a lot of other peripherals Learned how to use the STM32CubeMX firmware and how different protocols worked Started exploring PCB editor and systematically arranging components Next Steps Finish arranging PCB Route the PCB and get it verified Finish the CAD model and final BOM Come up with a basic template for firmware"}, {"post_id": 8169, "ts": "2026-06-13T16:44:15Z", "hours": 1.3878, "text": "Spent some time figuring out how to deal with the placement of different components and the scope of this project. Firstly, I decided that it made sense to use lightweight models for voice and video, keeping it limited so that it can run independently on A7S rather than relying on my laptop. Then I decided to have 2 mmWave sensors to cover blindspots and detect position of humans in the room, and decided it would be cool to integrate CV with mmWave, so added a fixed camera to help inform the drone position. A small FPV camera on the drone can allow it to avoid obstacles, and it would be cool to integrate VISTA (a research paper about drones navigating unknown maps) at least for initial calibration. Still figuring out the feasibility of a custom FC or if it would be easier to have a basic FC and a separate ESP32 for communication, camera and for extending the project to control servos for the rolling screen and a gripper in the future. Drafted the BOM but will find more stuff on AliExpress tomorrow. I also explored how to use Hackatime with Onshape and started making the head of Kogane"}]...
|
Title: Koganeee by @quintessence24 | Stardance
De Title: Koganeee by @quintessence24 | Stardance
Devlogs:
Spent some time figuring out how to deal with the placement of different components and the scope of this project. Firstly, I decided that it made sense to use lightweight models for voice and video, keeping it limited so that it can run independently on A7S rather than relying on my laptop. Then I decided to have 2 mmWave sensors to cover blindspots and detect position of humans in the room, and decided it would be cool to integrate CV with mmWave, so added a fixed camera to help inform the drone position. A small FPV camera on the drone can allow it to avoid obstacles, and it would be cool to integrate VISTA (a research paper about drones navigating unknown maps) at least for initial calibration. Still figuring out the feasibility of a custom FC or if it would be easier to have a basic FC and a separate ESP32 for communication, camera and for extending the project to control servos for the rolling screen and a gripper in the future. Drafted the BOM but will find more stuff on AliExpress tomorrow. I also explored how to use Hackatime with Onshape and started making the head of Kogane
Devlog #1 [Real] - Schematic design and shopping Summary Used various different sources to learn about different components used in FCs Learned how to use datasheets, Webench, LCSC part selections, etc. Spent time reviewing different requirements for batteries and W/T ratios for drones in general and picking the right batteries and circuit designs Spent a lot of time scoping and rescoping the PCB, including having to remove battery charger and using an external ESC as it was too complex and tight for the compact PCB, especially while having a separate MCU and a lot of other peripherals Learned how to use the STM32CubeMX firmware and how different protocols worked Started exploring PCB editor and systematically arranging components Next Steps Finish arranging PCB Route the PCB and get it verified Finish the CAD model and final BOM Come up with a basic template for firmware
Devlog #2 - Finishing the FC PCB Summary Followed the tutorial for tips to layout the board Used more tutorials and datasheets to understand different concepts of board layout like via stitching and filled zones Made a 4-layer PCB for the first time and learned how to connect power and grounds to appropriate components with vias Learned different routing practices, and despite the suboptimal routing, I am pretty confident now that it will at least be functional Next Steps Finishing the CAD model and final BOM Finishing the firmware template, maybe even using some cameras to test the positioning system
Devlog #3 - Finishing the CAD and Ready to Ship Summary Finished the CAD for Kogane, the drone and the ground station Vibe coded firmware temporarily and tested functionality with my laptop webcam manually Finished documentation and shipping it to Outpost Next Steps Once approved, I have to order and build Will work on firmware while waiting for the parts to arrive to save time
Devlog #4 - Preparing and starting build Summary Had to unpack and arrange all of the electronics I received, checked connectors and what I needed to make connectors for again. Realized I had designed for JST-XH rather than JST-SH connectors so spent a while trying to learn all of the different types of connectors so that I can avoid making the same mistake again For the time being, I stripped wires, crimped them and used my JST-XH connectors for the FC to ESC connection I had no idea how to solder XT60 connectors so I had to learn, and then after a while, I realized I needed to connect a male female pair at the end to avoid deformation so I had wasted the soldering session Next Steps Noticed that JOURNAL.md is more preferred for hardware projects, so I will be switching to that for future documentation Will continue soldering, wiring and coding step by step, but more specifically, I will work on checking if the ESC to FC connection works and if I can power the 5V rail on the board
Ships:
As a Jujutsu Kaisen fan and an admirer of flying pets, I wanted to make Kogane for my room. The objective of Kogane is to be a person-following flying pet assistant that can communicate with voice and through a retractable screen, sort of like a flying Alexa but friendlier! I also wanted to make drones for a while and it seemed like a cool approach to make Kogane. A use case that I had in mind is when I’m working in my room and my hands are busy and if I need to quickly pull up a tutorial, I would normally have to put things down to find my laptop. Instead with Kogane, I can call for Kogane wherever I am in my room and quickly check for information or pull up a Youtube tutorial from its screen without any physical contact. I got everything to work on a very close call, but my harnesses weren’t very strong and accidentally tangled with the propeller for a second, causing a motor to burn up and failing the first test flight (and of course, the shell for Koganeee was pretty but reduced performance aerodynamically). Nonetheless, all of the tests passed and I just need to swap out the motor, but still a successful project regardless and I’m proud of everything I was able to learn, whether it be firmware and networking with the ESP32, the endless soldering sessions for different kinds of components, taking care of batteries, etc. Check out my project and of course, contact me on Slack (sujaygolla24) for questions or just to nerd out about JJK or other anime!!! :D...
|
1792857363.3293931
|
1792943763.3293931
|
|
26228
|
Memory Galaxy by @Sparky10 | Stardance
|
Sparky10
|
0
|
14.53
|
0
|
[]
|
[{"post_id": 81363, "ts": "202 [{"post_id": 81363, "ts": "2026-10-21T00:04:38Z", "hours": 4.1786, "text": "Hi guys after a long gap I almost done with the galaxy just a small part left which is to create by GitHub repo and demo url stay tuned for updates (note the pic is a reference not the exact output of the project)✨🌌☁️"}, {"post_id": 57384, "ts": "2026-08-29T14:55:02Z", "hours": 1.4961, "text": "Today, I done with next part that is the tags and then the searching part. I made some change in the front so the web looks more elegant"}, {"post_id": 55573, "ts": "2026-08-27T14:43:48Z", "hours": 1.3958, "text": "Today, I done with the important part my website it is album. I faced a problem with the html code even after completing css and js code still some part stayed in the interface I changed the html code to resolve it"}, {"post_id": 53928, "ts": "2026-08-24T17:04:36Z", "hours": 0.3219, "text": "Today, I made some changes in the html and css code and started with the code for my album and done with the html part 📸📸🌟🌟(if you guys have any suggestions pls comment)"}, {"post_id": 51898, "ts": "2026-08-21T20:02:57Z", "hours": 0.7314, "text": "Hi guys today I have done ✅ with the time line part and faced a small issue due to conflicting of codes with when I added the js code for album I am working on it to make it much more realistic and similar to space"}, {"post_id": 50334, "ts": "2026-08-19T14:32:24Z", "hours": 0.8083, "text": "Hi guys today I made some important changed in java script file so that website can create memories as stars and save it in json and i am having a plan of sync the web with the gallery so we can retrieve the pic even it is permanently deleted from our device"}, {"post_id": 49295, "ts": "2026-08-18T01:06:29Z", "hours": 0.3667, "text": "Hi guys today I made some small changes in the html code to make it look better but it still look the old one…."}, {"post_id": 48002, "ts": "2026-08-16T08:53:58Z", "hours": 1.4181, "text": "Hi today DAY-3 I worked on some important changes that can be made to make the web site much similar to milkyway galaxy"}, {"post_id": 47425, "ts": "2026-08-15T10:52:59Z", "hours": 3.5581, "text": "DAY-2 Hi, today I have made some change in my html and done my css and java script and about 50% of my websites frontend got over😃😃😺😺"}, {"post_id": 46490, "ts": "2026-08-13T18:47:01Z", "hours": 0.2553, "text": "DAY-1 Hi guys this the day one after resolving the problem in my vs code . I had done my html code for the login page and the combines t with the css and js code which is progress .i had just created the required buttons ,headings"}]...
|
Title: Memory Galaxy by @Sparky10 | Stardance
Dev Title: Memory Galaxy by @Sparky10 | Stardance
Devlogs:
DAY-1 Hi guys this the day one after resolving the problem in my vs code . I had done my html code for the login page and the combines t with the css and js code which is progress .i had just created the required buttons ,headings
DAY-2 Hi, today I have made some change in my html and done my css and java script and about 50% of my websites frontend got over😃😃😺😺
Hi today DAY-3 I worked on some important changes that can be made to make the web site much similar to milkyway galaxy
Hi guys today I made some small changes in the html code to make it look better but it still look the old one….
Hi guys today I made some important changed in java script file so that website can create memories as stars and save it in json and i am having a plan of sync the web with the gallery so we can retrieve the pic even it is permanently deleted from our device
Hi guys today I have done ✅ with the time line part and faced a small issue due to conflicting of codes with when I added the js code for album I am working on it to make it much more realistic and similar to space
Today, I made some changes in the html and css code and started with the code for my album and done with the html part 📸📸🌟🌟(if you guys have any suggestions pls comment)
Today, I done with the important part my website it is album. I faced a problem with the html code even after completing css and js code still some part stayed in the interface I changed the html code to resolve it
Today, I done with next part that is the tags and then the searching part. I made some change in the front so the web looks more elegant
Hi guys after a long gap I almost done with the galaxy just a small part left which is to create by GitHub repo and demo url stay tuned for updates (note the pic is a reference not the exact output of the project)✨🌌☁️...
|
1792734459.8385558
|
1793339259.8385558
|
|
46447
|
My own site! by @spearedrice | Stardance
|
spearedrice
|
0
|
163.4
|
0
|
[]
|
[{"post_id": 81376, "ts": "202 [{"post_id": 81376, "ts": "2026-10-21T01:50:11Z", "hours": 0.3669, "text": "we all love larpin!!"}, {"post_id": 81365, "ts": "2026-10-21T00:13:33Z", "hours": 8.1392, "text": "more poses ig"}, {"post_id": 81231, "ts": "2026-10-20T11:42:14Z", "hours": 18.3669, "text": "added window snapping for realism (accidentally spent 18 hrs on this because I screwed up the code)"}, {"post_id": 80282, "ts": "2026-10-17T03:01:36Z", "hours": 10.0369, "text": "added the konami code so now lots of stuff happens"}, {"post_id": 80056, "ts": "2026-10-16T02:48:40Z", "hours": 15.3181, "text": "adding a INSANE feature"}, {"post_id": 79517, "ts": "2026-10-14T12:36:15Z", "hours": 10.6333, "text": "progress (adding screensaver, unfinished so here is some blurry code)"}, {"post_id": 78938, "ts": "2026-10-12T03:06:08Z", "hours": 10.0128, "text": "adding a button that finally mutes the music"}, {"post_id": 78726, "ts": "2026-10-11T12:33:55Z", "hours": 11.0222, "text": "almost done, 2 features left"}, {"post_id": 78482, "ts": "2026-10-10T22:27:34Z", "hours": 10.0333, "text": "amazing things (unfinished)"}, {"post_id": 78316, "ts": "2026-10-10T12:13:10Z", "hours": 11.795, "text": "uhh unfinished right now but great things coming 😭"}, {"post_id": 78205, "ts": "2026-10-09T23:36:45Z", "hours": 56.6311, "text": "spent 50 hours on THIS"}, {"post_id": 57011, "ts": "2026-08-29T02:36:13Z", "hours": 0.6814, "text": "Adding windows to my site, also added GTA 6"}, {"post_id": 54873, "ts": "2026-08-26T02:26:45Z", "hours": 0.3675, "text": "I made my own site (for the 2nd time) and added some pretty cool styling."}]...
|
Title: My own site! by @spearedrice | Stardance
D Title: My own site! by @spearedrice | Stardance
Devlogs:
I made my own site (for the 2nd time) and added some pretty cool styling.
Adding windows to my site, also added GTA 6
spent 50 hours on THIS
uhh unfinished right now but great things coming 😭
amazing things (unfinished)
almost done, 2 features left
adding a button that finally mutes the music
progress (adding screensaver, unfinished so here is some blurry code)
adding a INSANE feature
added the konami code so now lots of stuff happens
added window snapping for realism (accidentally spent 18 hrs on this because I screwed up the code)
more poses ig
we all love larpin!!...
|
1792662908.7921853
|
1793267708.7921853
|
|
47578
|
Digital Compass by @Luminix | Stardance
|
Luminix
|
1
|
88.36
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-16T17:21:34Z", "hours": 38.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "🎉 The theoretical content for all the modules is finally complete! Now I’m focusing on translating the content into English and polishing everything.", "repo": "https://github.com/lucianahernandezgutierrez77-jpg/brujula-digital", "demo": "https://lucianahernandezgutierrez77-jpg.github.io/brujula-digital/"}]...
|
[{"post_id": 81379, "ts": "202 [{"post_id": 81379, "ts": "2026-10-21T02:25:52Z", "hours": 8.8906, "text": "The activity for module 4 is finally finished :)"}, {"post_id": 79430, "ts": "2026-10-13T23:03:07Z", "hours": 11.1847, "text": "Finished designing the Deepfakes activity! Now working on its functionality."}, {"post_id": 68926, "ts": "2026-09-16T01:46:03Z", "hours": 12.1794, "text": "I created a simple living room with a computer, sofa, window, and other decorations. The scene will lead into the computer activity."}, {"post_id": 59619, "ts": "2026-09-01T15:15:18Z", "hours": 8.265, "text": "Today I’m working on the interactive activity for module 3! I’m currently adding structure and visual design 🖥️⌨️ There’s still a lot of work to build, but I’m excited to see it finally come together :)"}, {"post_id": 53104, "ts": "2026-08-23T15:17:20Z", "hours": 9.8364, "text": "Today I worked on the interactive activity for Module 2. I implemented the question structure and started integrating the activity with the project’s translation system 🧭"}, {"post_id": 47717, "ts": "2026-08-15T20:16:30Z", "hours": 3.935, "text": "Currently working on translating Digital Compass from Spanish to English! :) Making sure everything sounds natural in both languages. ✨"}, {"post_id": 46572, "ts": "2026-08-13T21:59:14Z", "hours": 33.9433, "text": "Today I’m working on the interactive activity for Module 1. It encourages users to take breaks after spending time on a computer. I’m currently working on the walking animation and the questions that appear during the activity."}]...
|
Title: Digital Compass by @Luminix | Stardance
De Title: Digital Compass by @Luminix | Stardance
Devlogs:
Today I’m working on the interactive activity for Module 1. It encourages users to take breaks after spending time on a computer. I’m currently working on the walking animation and the questions that appear during the activity.
Currently working on translating Digital Compass from Spanish to English! :) Making sure everything sounds natural in both languages. ✨
Today I worked on the interactive activity for Module 2. I implemented the question structure and started integrating the activity with the project’s translation system 🧭
Today I’m working on the interactive activity for module 3! I’m currently adding structure and visual design 🖥️⌨️ There’s still a lot of work to build, but I’m excited to see it finally come together :)
I created a simple living room with a computer, sofa, window, and other decorations. The scene will lead into the computer activity.
Finished designing the Deepfakes activity! Now working on its functionality.
The activity for module 4 is finally finished :)
Ships:
🎉 The theoretical content for all the modules is finally complete! Now I’m focusing on translating the content into English and polishing everything....
|
1792831789.667856
|
1792918189.667856
|
|
7118
|
Starboard! by @world | Stardance
|
world
|
1
|
47.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T01:43:23Z", "hours": 47.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Starboard! I made this macro keyboard from scratch. This was my first time using KiCad and Fusion for a project! (And it took forever…) But it was a really fun project. Checkout the demo website using Three.js! I really can’t wait to see my keyboard irl", "repo": "https://github.com/deveworld/starboard", "demo": ""}]...
|
[{"post_id": 8138, "ts": "2026 [{"post_id": 8138, "ts": "2026-06-13T16:09:32Z", "hours": 10.5117, "text": "Starboard! Starboard is a compact 63×63 mm Hackpad macropad built entirely from kit parts with QMK firmware and a fully 3D-printed sandwich case. I designed the 2-layer PCB in KiCad and wrote a custom-matrix QMK keymap (six keys plus encoder press, encoder volume control, OLED status readout, and RGB underglow), then cross-checked the firmware pin map against the board netlist from three independent sources. Along the way I caught and fixed a stale prebuilt UF2 (a leftover 10 ms vs 30 ms bootmagic delay) by rebuilding deterministically from source, and confirmed every checklist dimension. Finally I packaged the repo to the required structure and pushed it public!"}, {"post_id": 5702, "ts": "2026-06-09T16:26:54Z", "hours": 5.8964, "text": "Full 3D Modeling It was way harder than my first thought… Many PCB correction… etc."}, {"post_id": 5509, "ts": "2026-06-09T09:49:13Z", "hours": 12.2217, "text": "I’m working on Fusion! But I think I need to fix some collision and clearance a bit. Does it look good?"}, {"post_id": 3420, "ts": "2026-06-06T11:04:16Z", "hours": 3.4808, "text": "PCB also done!!!"}, {"post_id": 3353, "ts": "2026-06-06T07:34:15Z", "hours": 14.6039, "text": "Schematic Done!"}]...
|
Title: Starboard! by @world | Stardance
Devlogs:
Title: Starboard! by @world | Stardance
Devlogs:
Schematic Done!
PCB also done!!!
I’m working on Fusion! But I think I need to fix some collision and clearance a bit. Does it look good?
Full 3D Modeling It was way harder than my first thought… Many PCB correction… etc.
Starboard! Starboard is a compact 63×63 mm Hackpad macropad built entirely from kit parts with QMK firmware and a fully 3D-printed sandwich case. I designed the 2-layer PCB in KiCad and wrote a custom-matrix QMK keymap (six keys plus encoder press, encoder volume control, OLED status readout, and RGB underglow), then cross-checked the firmware pin map against the board netlist from three independent sources. Along the way I caught and fixed a stale prebuilt UF2 (a leftover 10 ms vs 30 ms bootmagic delay) by rebuilding deterministically from source, and confirmed every checklist dimension. Finally I packaged the repo to the required structure and pushed it public!
Ships:
Starboard! I made this macro keyboard from scratch. This was my first time using KiCad and Fusion for a project! (And it took forever…) But it was a really fun project. Checkout the demo website using Three.js! I really can’t wait to see my keyboard irl...
|
1792846467.753229
|
1792932867.753229
|
|
14130
|
Immortal Cultivation Mod (修仙) by @m3e660 | Stardan Immortal Cultivation Mod (修仙) by @m3e660 | Stardance...
|
m3e660
|
4
|
345.45
|
3100
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T17:07:11Z", "hours": 76.0, "multiplier": 18.81, "payout": 1254, "blessing": "neutral", "text": "I WANT MY POLAROID GO GEN 3 PLSSSSS I AM JUST A TINY BIT AWAY", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 2, "ts": "2026-08-23T01:53:50Z", "hours": 96.0, "multiplier": 15.99, "payout": 1340, "blessing": "neutral", "text": "I want my VR ahaahahahahah plssss Nothing much to say here just look at the images and video in the previous logs", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 3, "ts": "2026-07-11T00:52:33Z", "hours": 44.0, "multiplier": 18.82, "payout": 297, "blessing": "neutral", "text": "This update adds a huge amount of new content! You can now explore newly added structures, use new spells, control and evolve zombies through the new 怨气 and 控尸 systems, and wear new design accessories. The 金丹 system has also been remade with its own pocket dimension, breakthrough system, and new mechanics. Spell casting has been reworked, flying swords are now fully usable, and a complete forging system lets you craft weapons using materials, molds, purity, and temperature. There are also plenty of new items, crops, effects, and fixes to improve the overall experience!", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}, {"ship_num": 4, "ts": "2026-06-16T02:19:15Z", "hours": 23.0, "multiplier": 10.72, "payout": 209, "blessing": "neutral", "text": "Getting Started The first steps of cultivation. Enlightenment Pill Use an Enlightenment Pill to step from mortal life into Qi Refining. The stat menu shows qi, realm, max health, max age, luck, moral, soul, thoughts, spirit roots, and cultivation progress. Spells Fireball (Lianqi Early, Fire, 10 Qi) Shoots a fireball that deals damage and ignites targets. Lingbeng (Lianqi Late, Thunder, 50 Qi) Enter a breaking-force state. Punch a block or entity to release an explosion. Recasting stacks the explosion radius. Regeneration (Lianqi Middle, Wood, 20 Qi) Restores health with a short healing effect. Beam (Lianqi Early, Light, 30 Qi) Allows you to sense nearby entities. Earth Escape (Lianqi Late, Earth) Sink underground. Move faster while underground. Consumes Qi over time until you surface. Cleanse (Lianqi Early, Water, 10 Qi) Removes harmful effects from yourself. Qi Gathering (Lianqi Early, Wind, 0 Qi) Greatly increases Qi regeneration. You cannot attack or block while active. Damage taken is tripled. Ignite Flare (Lianqi Early, Fire, 10 Qi) Fires a straight flare. Ignites the block it hits. Spirit Sight (Lianqi Early, Light, 5 Qi/sec) Grants night vision while active. Zhenshan Palm (Foundation Establishment Middle, Earth, 130 Qi) Releases a giant hand-shaped earth wave for 3 seconds. Destroys blocks touched by the palm. Light Ball (Foundation Establishment Late, Light, 30 Qi summon, 10 Qi per shot) Summons 6 light balls in a hexagon behind you. Can stack up to 3 rings. Punch to fire one ball. Shift-punch to fire all balls. Each shot deals 50 damage. Each shot can break through up to 24 blocks.", "repo": "https://github.com/m3e66/immortal_cultivation_mod-source", "demo": "https://modrinth.com/mod/immortal-cultivation-mod"}]...
|
[{"post_id": 81380, "ts": "202 [{"post_id": 81380, "ts": "2026-10-21T02:39:43Z", "hours": 10.3219, "text": "Devlog #33** A shentong ability:湮灭未尽之人 and a dummy for testing purposes A lot of bug fixing and small thing like better formatting of the gui etc"}, {"post_id": 80679, "ts": "2026-10-18T13:51:12Z", "hours": 8.0572, "text": "Devlog #32 Added new effect in domain like abilities: Lilies, ice, big space warp (don’t yell at this devlog, I wrote it on the phone)"}, {"post_id": 80384, "ts": "2026-10-17T14:03:45Z", "hours": 10.4, "text": "Devlog #31 Added BLAST QI, where you can BLAST YOUR QI in your enemies face and be cool And fix the flying sword thing And fix a whole a lot of fix"}, {"post_id": 79682, "ts": "2026-10-15T01:38:45Z", "hours": 8.0478, "text": "Devlog #30 Remaking the whole life sim system adding new event (making them actually have somewhat of a story) added new battle system and more small thing to better help the experience And ton of bugs"}, {"post_id": 79208, "ts": "2026-10-13T01:21:10Z", "hours": 9.6014, "text": "Devlog #29 Remake all the magic circle texture and automated it (tool here https://m3e66.github.io/xiuxian-circle-generator/ ) Optimize all the code Added new body types 赤炎灵体 — Crimson Flame Body +25% fire damage; burning enemies take 10% extra damage from you 玄冰灵体 — Profound Ice Body +25% ice damage; attacks build Frost, briefly freezing enemies after 5 stacks 紫霄雷体 — Violet Thunder Body +25% lightning damage; every fifth lightning attack summons an extra thunderbolt dealing 50% damage 青木长生体 — Evergreen Longevity Body +15% maximum HP; +25% natural HP regeneration; +10% healing effectiveness 厚土玄体 — Profound Earth Body +20% armor; standing still for 3s grants an additional 10% damage reduction until moving 庚金剑体 — Geng Metal Sword Body +20% sword damage; +10% sword attack speed; sword strikes ignore 10% armor 沧海灵体 — Vast Sea Body +20% water damage; +20% maximum Qi; water spells cost 15% less Qi 逐风灵体 — Windchaser Body +20% movement speed; +15% attack speed; dodging grants +10% damage for 3s 先天道体 — Innate Dao Body +15% cultivation gain; all spells cost 10% less Qi; +5% all elemental damage 无垢灵体 — Immaculate Spirit Body +30% negative-effect resistance; debuffs last 25% less time; +15% healing received 九窍玲珑体 — Nine-Orifice Exquisite Body +25% Qi regeneration; +10% maximum Qi; spell cooldowns reduced by 10% 万毒之体 — Myriad Poison Body Immune to poison; poison attacks deal +25% damage; poisoned enemies restore 1% max Qi when killed 血煞魔体 — Blood Fiend Body +20% melee damage; heal for 5% of melee damage dealt; healing from pills reduced by 20% 不灭金身 — Imperishable Golden Body +15% maximum HP; +15% damage reduction; when HP falls below 20%, gain 30% damage reduction for 5s 吞灵之体 — Spirit-Devouring Body Killing an enemy restores 5% max Qi; attacks against shields and Qi barriers deal +20% damage 荒古圣体 — Ancient Desolate Sacred Body +25% maximum HP; +20% physical damage; +15% armor; Qi regeneration reduced by 15% 太阴神体 — Supreme Yin Divine Body +30% dark and ice damage; +20% Qi regeneration at night; sunlight reduces Qi regeneration by 15% 太阳神体 — Solar Divine Body +30% fire and light damage; immune to burning; +20% HP regeneration in sunlight"}, {"post_id": 78918, "ts": "2026-10-12T01:31:10Z", "hours": 10.5922, "text": "Devlog #28 Added 8 guide books for different part of the mod Added new bear model"}, {"post_id": 78651, "ts": "2026-10-11T05:20:58Z", "hours": 10.4994, "text": "Devlog #27 Improve overall guidance and improve existing model"}, {"post_id": 77981, "ts": "2026-10-09T03:03:43Z", "hours": 9.3439, "text": "Devlog #26 I going to improve the overall survivability of the mod: So there is going to be like more guides book in coming And more item that were creative only now actually getting ways to get the items"}, {"post_id": 76814, "ts": "2026-10-04T17:37:22Z", "hours": 9.2553, "text": "Devlog #25 Add a lot of new weapons A lot of new fire And more clothes"}, {"post_id": 75392, "ts": "2026-09-29T22:21:34Z", "hours": 9.3814, "text": "Devlog #24 121 NEW SPELL ICONSSS MY SOULLLSLLSLSLLS I pick the best 20 icon i love"}, {"post_id": 72892, "ts": "2026-09-23T23:37:48Z", "hours": 10.9486, "text": "Devlog #23 REVISE MOSTLY OF THE VFX AND ADD ALOTTTTT OF DRIP"}, {"post_id": 67505, "ts": "2026-09-13T17:02:49Z", "hours": 8.2731, "text": "Devlog #22 Not much like I said school started, it was more planning and stuff, revised npc battle logic"}, {"post_id": 64408, "ts": "2026-09-08T19:30:48Z", "hours": 15.1625, "text": "Devlog #21 Added whip physics Added new item mechinacs Added straw doll Added a luck system"}, {"post_id": 61873, "ts": "2026-09-05T01:00:25Z", "hours": 12.3611, "text": "Devlog #20 School is starting and college stuff is like piling on so my brain is slowing down, so there isnt much stuff i did when you compare it to the hours in this devlog. Mirror Thingy It is like a shield can absorb some dmg Straw Doll Like a totem of undying Jei Compatibility You can see the forging recipes in Jei now!"}, {"post_id": 59887, "ts": "2026-09-01T21:31:56Z", "hours": 11.3725, "text": "Devlog #19 Some mobs, yea that is really it"}, {"post_id": 59086, "ts": "2026-08-31T18:20:43Z", "hours": 10.5844, "text": "Devlog #18 Working on flying boat or valkyrie skies like things, I dont think that is copyright as it is not the main part of my mod, if it is tell me in the comments thanks Flying Boats Four core tiers control maximum capture size: Low: 100×100×100 Medium: 200×200×200 High: 400×400×400 Sect: 800×800×800 Existing ships can still be minimized into an item and placed again later The lingzhou core GUI is where you manage the ship. It shows the ship’s status, tier, size, fuel/灵气, current pilot, permissions, settings, movement mode, anchor controls, shutdown, and storage Fuel use is based on how many blocks the ship actually has and what it is doing. Hovering uses fuel, while an anchored ship does not The ship helm is used to pilot the lingzhou. While controlling it, the mouse wheel can be used to change the ship’s speed Autopilot lets you enter destination coordinates and have the ship travel toward them automatically Players and other entities move together with the ship. You can walk around the deck, jump, climb stairs, and move around normally while the ship is flying If part of the ship gets disconnected, that section is no longer supported by the lingzhou and falls back into the world as normal blocks Turning off the lingzhou core removes the ship’s magical lift. The ship keeps whatever momentum it already had and begins falling under gravity Etc Fix system prices Fix textures Fix names of items Added JEI compatibility for 鼎 forging Added recipes for a lot of weapons Removed combo system Added a fox beast"}, {"post_id": 55551, "ts": "2026-08-27T14:05:21Z", "hours": 9.8333, "text": "Devlog #17 MORE STRUCTURES i got into the phase of building so more structres!"}, {"post_id": 54475, "ts": "2026-08-25T14:27:13Z", "hours": 8.5392, "text": "Devlog #16 Did some structures, and there is the talisman data like I said Talismans Tier 1 清尘符 — Dust-Cleansing: Extinguishes fire and removes blindness and darkness 微光符 — Dim-Light: Creates light ball for 2–3 minutes, hold while aiming at a block to anchor it, you can use water extinguishes it 敛声符 — Sound-Gathering: For 25 seconds, nearby mobs lose you as their target when more than 2.5 blocks away 火球符 — Fireball: Fires 8 fireballs. Each deals 10 damage in a 2.4 block explosion 风刃符 — Wind-Blade: Fires 3 wind blades dealing 11 damage each and pushing targets backward Tier 2 星火符 — Sparkfire: Fires 5 flames dealing 30 damage each and igniting for 4 seconds 薄金护符 — Thin-Gold Protection: Give shield worth 200 + 1% maximum HP for 15 seconds 缠丝困符 — Spirit-Silk Binding: Fires 6 strands dealing 1 damage each. Strands stack slowness for 5 seconds and 4+ strands nearly immobilize the target 短途神行符 — Short-Journey Divine-Step: Give speed VIII and jump boost III for 30 seconds 传音符 — Voice-Transmission: Sends a written message to another player with in 100 blocks in the same dimension 修复符 — Repair: Repairs the damaged item held in the opposite hand Tier 3 避邪安魂符 — Evil-Warding Soul-Calming: Evil ward for 5 minutes, clears and prevents darkness/nausea, and restores 1% maximum Thoughts each second for 3 minutes 镇扰符 — Disturbance-Suppressing: Hostile mobs within a certain range get slowness II 爆风符 — Blast-Wind: Produces a blast dealing 50 damage, applying daze, and deflecting projectiles 火狱焚邪符 — Evil-Burning Fire-Prison: Creates a 10-block explosion, deals 50 area damage 五雷小伐符 — Lesser Five-Thunder: Deals 40 damage and give slowness III for 1.75 seconds 标记符 — Marking: Permanently marks a entity up to 300 blocks away for owner,and marked mobs are also prevented from naturally despawning 遁空符 — Void-Escape: Teleports in the direction you are looking, normally up to 20 blocks. Repeated uses within 5 seconds lower the maximum to 17, 14, then 12 blocks 化兵符 — Weapon-Manifestation: Creates an owner only temporary sword lasting 25 seconds Tier 4 金光护体符 — Golden-Light Body Protection: Adds a shield worth 600 + 1% maximum HP for 25 seconds 封灵符 — Spirit-Sealing: Seals everyone’s qi within 3 blocks of impact, interrupts casting 破障开山符 — Barrier-Breaking Mountain-Opening: Creates a massive 20-block explosion dealing 500 area damage Tier 5 千里传讯符 — Thousand-Li Message: Long range version of the Voice Transmission Talisman, but it is 1,000 blocks in the same dimension Tier 6 玄焰焚界符 — World-Scorching Black Flame: Creates a black-flame domain that grows from a 5 block radius and deals 100 damage per second. It destroys terrain, consumes dropped items and projectiles, and grows by consuming matter and victims, potentially reaching 48 blocks 五岳辟厄符 — Five-Mountains Calamity-Warding: Grants luck for 10 minutes and stacks three times: +15, then +7, then +3 Ancient 禁空符 — Forbidden-Air: Places a field 24-block radius lasts 8 seconds. It suppresses jumping and flight, and pulls flyingentities downward"}, {"post_id": 52657, "ts": "2026-08-22T22:04:35Z", "hours": 10.8006, "text": "Devlog #15 Uhm a lot of update and unfinished things so it is more of a sneak peek so, there not going to be a long devlog, maybe i am just lazy :). Cosmic Void New dimension that is like space use for mostly travel and battles Talismans A lot I added a lot but it is for later show you guys some pics tho"}, {"post_id": 46112, "ts": "2026-08-13T03:24:25Z", "hours": 11.3525, "text": "Devlog #14 Hmmm why does the picture devlog get more view than the videos, let this be a test then Added: Tutorial System Qi Sensing Thingy Remake Spatial Pouch and like 20 new spells and 4 new method Remake Spatial Pouch Replace the whole backpack like spatial pouch system to a pocket like dimension (in the in the picture) you can place all functionable block and still use it by left clicking it and double click to remove it. (oh and redstone work :) i know there is people that can do smth op with redstone) Tutorial System Full tutorial system that guide you through everything, because so much people said there is a big learning curve, so boom :) Qi Sensing Thingy You can sense entities, items and qi ahhhhh there is not too much stuff or maybe i am too lazy…. definitely not that trust"}, {"post_id": 44036, "ts": "2026-08-09T15:23:44Z", "hours": 11.2058, "text": "Devlog #13 Sooo, did a few entities and most important zhenpan and flags for the magic circle. Zhenpan When empty shift right click to store a magic center When full shift right click to place a magic center back down When store magic center the radius of the magic center is changed to 5 if higher When right click summon a temp magic center of the radius 5 that appear for 20 sec The cost is calculated based on the spirit stones in inventory first then player’s qi Flags Now in the magic center there is a new tab with a gui (in the pics) where you can put flags, they modified the effect of your magic circle. But each newly added flag will increase the cost of the magic center by 1.3x, so the cost can reach to 2693457 qi when using a maxed out zhenpan. Formation Flag Effects Blank Formation Flag — No active effect, used to forge specialized flags Duration Flag — Adds 3 seconds to a temporary Magic Center’s lifetime per flag Amplifier Flag — Adds 1 extra attack whenever an formation triggers Spirit Gathering Flag — Reduces formation fuel/energy consumption by 25% per flag, it does not add the normal ×1.5 flag cost Swift Formation Flag — Makes normal formation effects trigger 30% faster per flag and increases fuel consumption by 30% Qi Return Flag — Restores 10 Qi per flag when a player kills an enemy inside the formation"}, {"post_id": 39851, "ts": "2026-08-03T03:24:18Z", "hours": 12.4425, "text": "Devlog #13 Oops, I got the 8 hours warning and I forgot about it and not I have 12 hours…. sigh. So this update I mainly update the magic ritual mod I have before, and before you ask yes this is the right project, I merge the magic ritual mod with this mod and then revamped the whole thing. This devlog is kinda short because I am getting lazy. Magic Ritual Combo system The Ritual Dagger is your primary tool for creating and managing magic rituals. Right-click with the dagger to open the Magic Circle Selection screen, where you can choose a magic circle type to place at your feet. Shift + Right-click to open the Radius Selection screen, where you can place a Magic Center Block with a chosen radius Attack Red - Grants Strength I Defense Blue - Grants Resistance I Regeneration Green - Grants Regeneration I There are certain pattern for special effect after putting it in its pattern you can punch the center with the dagger and the new magic center is formed Combo visuals and glyph behavior Basic center have one image pattern Combo center have two image pattern If glyph mode is turned off, there is an entering animation"}, {"post_id": 37945, "ts": "2026-07-30T23:57:05Z", "hours": 10.8044, "text": "Devlog #12 A bit in a rush so no video this time, but i added pics so it should be fine. Battle System 战斗状态/Battle Mode: activates when hitting something, or dmg from players, cultivators, or mobs counts too, normally lasts 15 seconds Manual mode: press Y to lock combat mode on until pressed again it can be disabled in settings Normal attacks (left click just normal attack) Heavy attacks (hold attack for 0.5 seconds, then release, normal heavy attacks deal 120% weapon dmg) Blocking (hold left and right click together you dont take dmg, but the weapon loses durability and the blocked dmg harms posture) 架势/Posture: maximum posture is 100 + Physical Attack × 100 + Max HP ÷ 2. It regenerates by 1% each second 破势/Zero Posture: at zero posture, the player is stunned for 1.5 seconds, cannot block, takes 25% more dmg, and loses their current spell charge 外放灵气/External qi: qi injected weapons can release long, straight qi slashes, with the dmg, width, and range scaling with injected qi amount Recent Weapons 精铁枪: A 14 dmg spear normal attacks is like normal, while heavy attacks use a thrust animation and forms a qi cone shaped thingy 铁骨扇: Shift right click switches forms: closed form deals 3 dmg and uses a cone heavy attack and open form deals 5 dmg and uses slash attacks 拂尘: Deals 7 dmg normal attacks is normal too, but its heavy attack spins five times in front of the player, damaging everything within 3 blocks. Right click binds a physically weaker target within 5 blocks for 3 seconds, with a 10 second cooldown 飞刀: Deals 4 dmg and you can stack 5 more all together into one. Right click throws normally and heavy attacks throw a faster knife that can break five blocks before exploding. 飞针 and 袖箭: 飞针 deals 4 dmg, has 1,000 durability, and consumes 10 durability per shot. 袖箭 can be held or equipped in a back accessory slot. Normal attacks fire ordinary needles but heavy attacks fire qi powered explosive needles Etc Added more English Remake some gui Remake some models"}, {"post_id": 35415, "ts": "2026-07-26T20:10:28Z", "hours": 11.2708, "text": "Devlog #11 Sorry for the quality of the video, the quality had to be sacrifice for the length I have formed a habit of writing random thoughts I had, so here is more: wow I kinda hate the 10 hours devlog maybe it is because I am working on a big update orrrr I am just too lazy Revamp Update (plus other stuff (it is more of a random update)): More quest for all of the identity Giving a use for the jindan quality Added 烬火心燎 (mental attack kinda) Added 碎轨星陨 (big boom) Added 洞天借灵 (restore alot of qi) Added 时序迟流 (time slow zone) Added a soul system (when npc or player die there are a soul) Added 炼神术 (increase thoughts stat) Added DunWu Stele (can be used to crave spells into it so for spells like 炼神术 that have no spell item you can learn it like this) Added 噬魂幡 (cool stuff too much so just watch the video) Added 怨魂瓶 (used to store soul) New identity 邪修 功法 improvement (when use qi there is new particle effects) Etc (gui update and others) Config There is a new config button: Auto inject qi into weapon Outside qi (when in new battle system when swing your weapon it shoot out qi slash breaking blocks and killing enemies) New battle system Jindan creative flight New Puzzle Update 灵枢算盘 (the minigame to crave 禁制) it is use to upgrade weapons and eventually evolving it 灵脉六角阵 (the minigame that the player encounters when breaking through jindan) 灵气轨迹 (the minigame when learning spells) 雷劫 (Heavenly Tribulation for jindan) Strike 1 — A thin white-blue bolt 50 dmg Strike 2 — Two branching bolts 100 dmg Strike 3 — Three quick lightning 50 each hit Strike 4 — A thicker blue-white bolt 100 and take 30 dmg per sec for 5 sec Strike 5 — Lightning strikes the ground in eight positions around the player 300 dmg Strike 6 — Several smaller bolts repeatedly strike the player for three seconds 30 each Strike 7 — A massive branching bolt 400 dmg Strike 8 — Purple heavenly lightning 50 dmg per sec for 5 sec Strike 9 — Four bolts strike the north, south, east, and west sides of the player, followed by one direct central strike 400 dmg Strike 10 — A continuous pillar of lightning 100 per 3 sec Strike 11 — Golden lightning begins appearing inside the storm, six golden-white bolts rapidly strike around and directly onto the player 80 each Strike 12 — A giant bolt splits into twelve branches before all branches converge on the player’s position 300 dmg Strike 13 — Lightning repeatedly strikes the player 50 each Strike 14 — A ring of lightning forms in the clouds and releases a rain of dozens of smaller lightning bolts 50 per 3 sec Strike 15 — Nine rapid strikes hit the player in succession 2/4/8/16/32/64/128/256/512 Strike 16 — Every lightning arc inside the clouds gathers into one enormous golden-white tribulation bolt 1000 dmg Easy Mode Acheivement “You Are Really Bad” Get this when you die 10 times in 20 mins Get a hat curio called “Noob Hat” All puzzle are easier by a level"}, {"post_id": 33331, "ts": "2026-07-23T04:32:21Z", "hours": 12.9683, "text": "Devlog #10 Ok so I have work on more than what is showed in the video but this feature is very big so the smaller thing can be talked about in the later devlog Restriction Enchantment Thingy Update 禁制 replaces normal enchantment levels for weapons and artifacts. Every artifact can contain multiple Restriction Layers: 1重禁制 2重禁制 3重禁制 …… 36重禁制 72重禁制 Each successfully engraved layer improves the weapon. Higher layers become progressively harder, more expensive, and more dangerous to refine. After reaching 72重禁制, the weapon can evolve into the next level Rules Controls Click a row to select its node. Click to the left or right of the bead, or use the < and > buttons, to move it. Use W/S or the Up/Down Arrow keys to change the selected node. Use A/D or the Left/Right Arrow keys to move the selected bead. Each bead has a Qi value ranging from 0 to 6 . The golden diamond shows the target value. When every node matches its target value at the same time, the formation is completed and all selected Restrictions are engraved onto the artifact. Moving one bead may also affect linked nodes. Nodes Types Normal Node A standard node that can be moved directly. The node turns gold when its value matches its target. Forward Golden Formation Line Linked beads move in the same direction. For example, moving one bead to the right also moves the connected bead to the right. Reversed Cyan Formation Line A cyan formation line marked with a “−” symbol. Linked beads move in opposite directions. For example, moving one bead to the right moves the connected bead to the left. Locked Node A gray node that cannot be moved directly. The player must move connected nodes to push it into the correct position. Locked nodes begin appearing from a total of 46 Restriction layers . Unstable Node A pulsating red-jade bead. It moves automatically after its displayed action interval and may also affect linked nodes. Unstable nodes begin appearing from Restriction layer 55 . Hidden Node Its target value is displayed as “?” The player must determine the correct target by observing the formation’s behavior or by using a hint. Hidden targets and move limits begin appearing from Restriction layer 73 ."}, {"post_id": 31014, "ts": "2026-07-19T02:14:35Z", "hours": 3.8225, "text": "Devlog #9 Ok so after some ratings and feedbacks I have decided to write better devlogs with more explaining and thoughts. Update: NPC I was working on npc on the last update and decided to further more finish this feature with adding a nice feature of … IDENTITY All Npc will all spawn with a random identity 散修 - Rogue Cultivator 剑修 - Sword Cultivator 刀修 - Saber Cultivator 魔修 - Demonic Cultivator 器修 - Artifact Cultivator 尸修 - Corpse Cultivator 世家子弟 - Noble Clan Disciple 皇族 - Royalty 通缉犯 - Wanted Criminal 体修 - Body Cultivator (Yes I actually added translation for chinese things now) This identity feature not only completes the Npc’s personality but for each identity they have there own special items (which really helps my mod’s survivability, adding a way to obtain items now) They also have their own personal dialogue based on their identity. Jindan Added a new breakthrough screen for zhuji to jindan, and a new dimension for your own personal jindan (like a new world you can channel 2000 qi in the center and you can build chunks in your own world) (see pics) Plans: I was going to further improve the Npcs but after adding a hole a lot of new items for each identity, I realized that I have a other system and features I didnt make (pill making system and more higher level spells)"}, {"post_id": 28609, "ts": "2026-07-14T23:19:52Z", "hours": 11.3969, "text": "New NPC Update The NPC system has been expanded into a full cultivation-style character system. NPCs now have random names, gender, identity, cultivation realm, attributes, spiritual roots, methods, spells, personality, inventory, relationship values, and persistent memory-style data. NPCs can now behave differently depending on personality, identity and relationship with the player. They can fight, flee, use spells, heal, trade, give quests, spar, and interact through a new dialogue screen. (PS the gui shown in the pic is only temporay) Major additions include: Talk, Interact, Trade, Quest, Teach/Learn, Inventory, About, Spar, Invite to Sect, Master/Disciple, and Dao Companion. Relationship stats: friendship, trust, affection, hatred Social actions like praise, joke, insult, threaten, and gifting NPCs can follow, stay, join sects, become master/disciple, or become Dao Companion if requirements are met. New NPC identities were added, with identity-based starting items and loot: 散修 剑修 刀修 魔修 器修 尸修 世家子弟 皇族 通缉犯 体修"}, {"post_id": 26263, "ts": "2026-07-10T23:12:53Z", "hours": 37.7453, "text": "Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure When real death occur spawn a corpse of the player containing all the data of the past player Added attribute 怨气 to all zombie and corpse The longer they exist in the world higher the 怨气 attribute (1000 tick is one 怨气) When right click a zombie with a 镇尸符 stop them from moving When right click a corpse the corpse will stand up with the arm straight up like a zombie add exact 镇尸符 sprite on the corpse face and the corpse stop moving Right click them with a empty hand to take the 镇尸符 off 镇魂铃 when right click will heal 5% of the max hp of your zombie a 5 block radius cooldown 2 seconds 引魂锣 when holding will have a red point only visible to the player and when right click on a block your zombie will jump to that block and if punch a entity the zombie will attack the entity The range of the red particle laser is based on the player’s block reach Added 控尸术 Types of zombie and corpse 怨气 = 100; 白僵 怨气 = 500; 黑僵 怨气 = 2,500; 跳僵 怨气 = 12,500; 飞僵 怨气 = 62,500; 游尸 怨气 = 312,500; 伏尸 怨气 = 1,562,500; 不化骨 怨气 = 7,812,500; 旱魃 When right clicking a zombie with blood they can drink it and give +1 怨气 After getting to 1000 怨气 cant consume anymore Shift right click to feed all of blood in the hand Different modes for zombies attack all hostile (in 5 block radius) defensive (attack all mob that attack owner) Added coffin item, shift right click to store a zombie Added 道服 Added a 血晶, crafted by 9 blood, can feed to all zombie and corpse in all levels, each one is +5 Added Curios slots hair, hair accessory, head accessory, neck accessory, inner clothes, cloak, back accessory, waist accessory Moved coffin to back accessory support, including Curios rendering Added blindfold, blindfold2, straw hat, jade pendant, zhenhun bell, and yinhun gong as wearable accessories Added inventory sprites for accessories and fixed missing textures/positioning Made waist tools cycle with V while held/equipped Added jade pendant meditation speed bonus and tooltip Added 道服 chestplate and worked through texture/model binding fixes Added 血晶 from 9 blood, with zombie/corpse feeding support Added custom spawn egg textures where needed Added/updated English and Chinese translations for missing content Added Jindan dimension entry from stat menu Added 金丹 entity in the Jindan world and normal-world player clone Added Jindan breakthrough screen Added particle effects during breakthrough Added shift-right-click 金丹 entity to spend qi and replicate overworld chunks into the Jindan world Reworked spell selection GUI Added spell wheel ordering and remembered toggles Added selected-spell + R cast flow with charging bar Added/updated several spell scaling effects and combo casting behavior Added flying sword weapon/entity logic Added release, recall, control, shoot, ride, and pickup behavior Added qi cost for controlling/shooting Added flying sword FX when shooting Added zombie/corpse grudge progression and ranks Added higher-rank zombie effects like 尸毒, flying, 阴气 area, drought/dry area Added 鼎 forging GUI with temperature bar, material slots, 玉简 slot, result slot, progress bar, and start button Added forging recipes through 玉简, including 飞剑玉简 and 精铁刀玉简 Added mold items: 剑胚, 刀胚, 枪胚, 武器胚 Added weapon materials Added material purity system and tooltip display Added forging temperature/quality logic, average temp/purity tracking, and failure still producing a mold Added tempering by dropping mold into water, with smoke particles Added 灵火 support from Ignite Flare and normal fire support Added blockgen fixes and custom geo block rendering fixes Added forging system: 玉简, materials, temperature GUI, molds, quality/purity/tooltips Added new crops/items like 糯米 seed/plant, 糯米粥, 墨斗线, 桃木剑, 铜钱剑"}, {"post_id": 12339, "ts": "2026-06-20T03:56:26Z", "hours": 0.4739, "text": "There was more than 4 pictures in the post below so here is the others After use a spell one time +1 proficiency Spell proficiency 入门:after learning the spell get to this level 小成:100 need to get to this level 大成: 500 need to get to this level 圆满:1000 need to get to this level 登峰造极:10000 need to get to this level"}, {"post_id": 12304, "ts": "2026-06-20T02:31:23Z", "hours": 5.2906, "text": "Custom combo system (Where you can make your own custom combo system) Add a zhuji level entity (with its own ai) zhuji1 logic when qi low and enemy 15 blocks away use qi gathering when hp low use regeneration when enemy 10 blocks away use fireball when enemy 5 or lower blocks away use lingbeng and punch them, if qi and hp are all 75 percent or higher then can choose to use lingbeng more time before punch when hp low use wind step to run away when enemy 11 block or higher away and hp high, use wind step to chase the enemy Add a jindan level entity (with its own ai) jidan1 logic same spells as zhuji1 but no lingbeng add a zhenshanplam spell inject qi into weapons keybind v to inject qi into any weapons including modded ones cost 1% of max qi after the injecting the amount of qi injected is add to the tooltip of the weapon amount of qi / 10 = the dmg dealt when attack with this weapon after attack use up amount of qi / 10 of the qi in the weapon base dmg of the weapon x 100 = x(the extra qi / 100 ) x 10 = y if the amount of qi in a weapon is bigger then x then weapon -y durability every sec until not overflow Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure"}, {"post_id": 9608, "ts": "2026-06-16T00:23:52Z", "hours": 3.5289, "text": "See the toggle spells list that you toggled In spell selection screen you can press the spell to see description Remake spiritual roots Remade ui"}, {"post_id": 8409, "ts": "2026-06-13T23:43:00Z", "hours": 5.0458, "text": "Added lightning effect for lingbeng Remade ZhenshanPalmEntity Added a passive spell 威压 Change the stats (Hp, Qi, Age, and Progress) Change spell’s cost and damage Added command to modified players stats Removed stat cap Fixed loot tables Added 轮回真决 Added 定身咒 Added 引雷诀 Added 五雷正法 Added 御风诀 Added 吞天魔功"}, {"post_id": 7205, "ts": "2026-06-12T01:03:44Z", "hours": 2.4225, "text": "Look at what your boy cooked up in the lab!!!"}, {"post_id": 6577, "ts": "2026-06-11T01:41:07Z", "hours": 12.0342, "text": "WOW SO MUCH STUFF (look at the pics!!!)"}]...
|
Title: Immortal Cultivation Mod (修仙) by @m3e660 | Title: Immortal Cultivation Mod (修仙) by @m3e660 | Stardance
Devlogs:
WOW SO MUCH STUFF (look at the pics!!!)
Look at what your boy cooked up in the lab!!!
Added lightning effect for lingbeng Remade ZhenshanPalmEntity Added a passive spell 威压 Change the stats (Hp, Qi, Age, and Progress) Change spell’s cost and damage Added command to modified players stats Removed stat cap Fixed loot tables Added 轮回真决 Added 定身咒 Added 引雷诀 Added 五雷正法 Added 御风诀 Added 吞天魔功
See the toggle spells list that you toggled In spell selection screen you can press the spell to see description Remake spiritual roots Remade ui
Custom combo system (Where you can make your own custom combo system) Add a zhuji level entity (with its own ai) zhuji1 logic when qi low and enemy 15 blocks away use qi gathering when hp low use regeneration when enemy 10 blocks away use fireball when enemy 5 or lower blocks away use lingbeng and punch them, if qi and hp are all 75 percent or higher then can choose to use lingbeng more time before punch when hp low use wind step to run away when enemy 11 block or higher away and hp high, use wind step to chase the enemy Add a jindan level entity (with its own ai) jidan1 logic same spells as zhuji1 but no lingbeng add a zhenshanplam spell inject qi into weapons keybind v to inject qi into any weapons including modded ones cost 1% of max qi after the injecting the amount of qi injected is add to the tooltip of the weapon amount of qi / 10 = the dmg dealt when attack with this weapon after attack use up amount of qi / 10 of the qi in the weapon base dmg of the weapon x 100 = x(the extra qi / 100 ) x 10 = y if the amount of qi in a weapon is bigger then x then weapon -y durability every sec until not overflow Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure
There was more than 4 pictures in the post below so here is the others After use a spell one time +1 proficiency Spell proficiency 入门:after learning the spell get to this level 小成:100 need to get to this level 大成: 500 need to get to this level 圆满:1000 need to get to this level 登峰造极:10000 need to get to this level
Added shield bar at the right of the hotbar Added 护体气 Added 迷尘障 Added 四方界 Added 固石盾 Added tomb1 structure Added ruined_ritual structure When real death occur spawn a corpse of the player containing all the data of the past player Added attribute 怨气 to all zombie and corpse The longer they exist in the world higher the 怨气 attribute (1000 tick is one 怨气) When right click a zombie with a 镇尸符 stop them from moving When right click a corpse the corpse will stand up with the arm straight up like a zombie add exact 镇尸符 sprite on the corpse face and the corpse stop moving Right click them with a empty hand to take the 镇尸符 off 镇魂铃 when right click will heal 5% of the max hp of your zombie a 5 block radius cooldown 2 seconds 引魂锣 when holding will have a red point only visible to the player and when right click on a block your zombie will jump to that block and if punch a entity the zombie will attack the entity The range of the red particle laser is based on the player’s block reach Added 控尸术 Types of zombie and corpse 怨气 = 100; 白僵 怨气 = 500; 黑僵 怨气 = 2,500; 跳僵 怨气 = 12,500; 飞僵 怨气 = 62,500; 游尸 怨气 = 312,500; 伏尸 怨气 = 1,562,500; 不化骨 怨气 = 7,812,500; 旱魃 When right clicking a zombie with blood they can drink it and give +1 怨气 After getting to 1000 怨气 cant consume anymore Shift right click to feed all of blood in the hand Different modes for zombies attack all hostile (in 5 block radius) defensive (attack all mob that attack owner) Added coffin item, shift right click to store a zombie Added 道服 Added a 血晶, crafted by 9 blood, can feed to all zombie and corpse in all levels, each one is +5 Added Curios slots hair, hair accessory, head accessory, neck accessory, inner clothes, cloak, back accessory, waist accessory Moved coffin to back accessory support, including Curios rendering Added blindfold, blindfold2, straw hat, jade pendant, zhenhun bell, and yinhun gong as wearable accessories Added inventory sprites for accessories and fixed missing textures/positioning Made waist tools cycle with V while held/equipped Added jade pendant meditation speed bonus and tooltip Added 道服 chestplate and worked through texture/model binding fixes Added 血晶 from 9 blood, with zombie/corpse feeding support Added custom spawn egg textures where needed Added/updated English and Chinese translations for missing content Added Jindan dimension entry from stat menu Added 金丹 entity in the Jindan world and normal-world player clone Added Jindan breakthrough screen Added particle effects during breakthrough Added shift-right-click 金丹 entity to spend qi and replicate overworld chunks into the Jindan world Reworked spell selection GUI Added spell wheel ordering and remembered toggles Added selected-spell + R cast flow with charging bar Added/updated several spell scaling effects and combo casting behavior Added flying sword weapon/entity logic Added release, recall, control, shoot, ride, and pickup behavior Added qi cost for controlling/shooting Added flying sword FX when shooting Added zombie/corpse grudge progression and ranks Added higher-rank zombie effects like 尸毒, flying, 阴气 area, drought/dry area Added 鼎 forging GUI with temperature bar, material slots, 玉简 slot, result slot, progress bar, and start button Added forging recipes through 玉简, including 飞剑玉简 and 精铁刀玉简 Added mold items: 剑胚, 刀胚, 枪胚, 武器胚 Added weapon materials Added material purity system and tooltip display Added forging temperature/quality logic, average temp/purity tracking, and failure still producing a mold Added tempering by dropping mold into water, with smoke particles Added 灵火 support from Ignite Flare and normal fire support Added blockgen fixes and custom geo block rendering fixes Added forging system: 玉简, materials, temperature GUI, molds, quality/purity/tooltips Added new crops/items like 糯米 seed/plant, 糯米粥, 墨斗线, 桃木剑, 铜钱剑
New NPC Update The NPC system has been expanded into a full cultivation-style character system. NPCs now have random names, gender, identity, cultivation realm, attributes, spiritual roots, methods, spells, personality, inventory, relationship values, and persistent memory-style data. NPCs can now behave differently depending on personality, identity and relationship with the player. They can fight, flee, use spells, heal, trade, give quests, spar, and interact through a new dialogue screen. (PS the gui shown in the pic is only temporay) Major additions include: Talk, Interact, Trade, Quest, Teach/Learn, Inventory, About, Spar, Invite to Sect, Master/Disciple, and Dao Companion. Relationship stats: friendship, trust, affection, hatred Social actions like praise, joke, insult, threaten, and gifting NPCs can follow, stay, join sects, become master/disciple, or become Dao Companion if requirements are met. New NPC identities were added, with identity-based starting items and loot: 散修 剑修 刀修 魔修 器修 尸修 世家子弟 皇族 通缉犯 体修
Devlog #9 Ok so after some ratings and feedbacks I have decided to write better devlogs with more explaining and thoughts. Update: NPC I was working on npc on the last update and decided to further more finish this feature with adding a nice feature of … IDENTITY All Npc will all spawn with a random identity 散修 - Rogue Cultivator 剑修 - Sword Cultivator 刀修 - Saber Cultivator 魔修 - Demonic Cultivator 器修 - Artifact Cultivator 尸修 - Corpse Cultivator 世家子弟 - Noble Clan Disciple 皇族 - Royalty 通缉犯 - Wanted Criminal 体修 - Body Cultivator (Yes I actually added translation for chinese things now) This identity feature not only completes the Npc’s personality but for each identity they have there own special items (which really helps my mod’s survivability, adding a way to obtain items now) They also have their own personal dialogue based on their identity. Jindan Added a new breakthrough screen for zhuji to jindan, and a new dimension for your own personal jindan (like a new world you can channel 2000 qi in the center and you can build chunks in your own world) (see pics) Plans: I was going to further improve the Npcs but after adding a hole a lot of new items for each identity, I realized that I have a other system and features I didnt make (pill making system and more higher level spells)
Devlog #10 Ok so I have work on more than what is showed in the video but this feature is very big so the smaller thing can be talked about in the later devlog Restriction Enchantment Thingy Update 禁制 replaces normal enchantment levels for weapons and artifacts. Every artifact can contain multiple Restriction Layers: 1重禁制 2重禁制 3重禁制 …… 36重禁制 72重禁制 Each successfully engraved layer improves the weapon. Higher layers become progressively harder, more expensive, and more dangerous to refine. After reaching 72重禁制, the weapon can evolve into the next level Rules Controls Click a row to select its node. Click to the left or right of the bead, or use the < and > buttons, to move it. Use W/S or the Up/Down Arrow keys to change the selected node. Use A/D or the Left/Right Arrow keys to move the selected bead. Each bead has a Qi value ranging from 0 to 6 . The golden diamond shows the target value. When every node matches its target value at the same time, the formation is completed and all selected Restrictions are engraved onto the artifact. Moving one bead may also affect linked nodes. Nodes Types Normal Node A standard node that can be moved directly. The node turns gold when its value matches its target. Forward Golden Formation Line Linked beads move in the same direction. For example, moving one bead to the right also moves the connected bead to the right. Reversed Cyan Formation Line A cyan formation line marked with a “−” symbol. Linked beads move in opposite directions. For example, moving one bead to the right moves the connected bead to the left. Locked Node A gray node that cannot be moved directly. The player must move connected nodes to push it into the correct position. Locked nodes begin appearing from a total of 46 Restriction layers . Unstable Node A pulsating red-jade bead. It moves automatically after its displayed action interval and may also affect linked nodes. Unstable nodes begin appearing from Restriction layer 55 . Hidden Node Its target value is displayed as “?” The player must determine the correct target by observing the formation’s behavior or by using a hint. Hidden targets and move limits begin appearing from Restriction layer 73 .
Devlog #11 Sorry for the quality of the video, the quality had to be sacrifice for the length I have formed a habit of writing random thoughts I had, so here is more: wow I kinda hate the 10 hours devlog maybe it is because I am working on a big update orrrr I am just too lazy Revamp Update (plus other stuff (it is more of a random update)): More quest for all of the identity Giving a use for the jindan quality Added 烬火心燎 (mental attack kinda) Added 碎轨星陨 (big boom) Added 洞天借灵 (restore alot of qi) Added 时序迟流 (time slow zone) Added a soul system (when npc or player die there are a soul) Added 炼神术 (increase thoughts stat) Added DunWu Stele (can be used to crave spells into it so for spells like 炼神术 that have no spell item you can learn it like this) Added 噬魂幡 (cool stuff too much so just watch the video) Added 怨魂瓶 (used to store soul) New identity 邪修 功法 improvement (when use qi there is new particle effects) Etc (gui update and others) Config There is a new config button: Auto inject qi into weapon Outside qi (when in new battle system when swing your weapon it shoot out qi slash breaking blocks and killing enemies) New battle system Jindan creative flight New Puzzle Update 灵枢算盘 (the minigame to crave 禁制) it is use to upgrade weapons and eventually evolving it 灵脉六角阵 (the minigame that the player encounters when breaking through jindan) 灵气轨迹 (the minigame when learning spells) 雷劫 (Heavenly Tribulation for jindan) Strike 1 — A thin white-blue bolt 50 dmg Strike 2 — Two branching bolts 100 dmg Strike 3 — Three quick lightning 50 each hit Strike 4 — A thicker blue-white bolt 100 and take 30 dmg per sec for 5 sec Strike 5 — Lightning strikes the ground in eight positions around the player 300 dmg Strike 6 — Several smaller bolts repeatedly strike the player for three seconds 30 each Strike 7 — A massive branching bolt 400 dmg Strike 8 — Purple heavenly lightning 50 dmg per sec for 5 sec Strike 9 — Four bolts strike the north, south, east, and west sides of the player, followed by one direct central strike 400 dmg Strike 10 — A continuous pillar of lightning 100 per 3 sec Strike 11 — Golden lightning begins appearing inside the storm, six golden-white bolts rapidly strike around and directly onto the player 80 each Strike 12 — A giant bolt splits into twelve branches before all branches converge on the player’s position 300 dmg Strike 13 — Lightning repeatedly strikes the player 50 each Strike 14 — A ring of lightning forms in the clouds and releases a rain of dozens of smaller lightning bolts 50 per 3 sec Strike 15 — Nine rapid strikes hit the player in succession 2/4/8/16/32/64/128/256/512 Strike 16 — Every lightning arc inside the clouds gathers into one enormous golden-white tribulation bolt 1000 dmg Easy Mode Acheivement “You Are Really Bad” Get this when you die 10 times in 20 mins Get a hat curio called “Noob Hat” All puzzle are easier by a level
Devlog #12 A bit in a rush so no video this time, but i added pics so it should be fine. Battle System 战斗状态/Battle Mode: activates when hitting something, or dmg from players, cultivators, or mobs counts too, normally lasts 15 seconds Manual mode: press Y to lock combat mode on until pressed again it can be disabled in settings Normal attacks (left click just normal attack) Heavy attacks (hold attack for 0.5 seconds, then release, normal heavy attacks deal 120% weapon dmg) Blocking (hold left and right click together you dont take dmg, but the weapon loses durability and the blocked dmg harms posture) 架势/Posture: maximum posture is 100 + Physical Attack × 100 + Max HP ÷ 2. It regenerates by 1% each second 破势/Zero Posture: at zero posture, the player is stunned for 1.5 seconds, cannot block, takes 25% more dmg, and loses their current spell charge 外放灵气/External qi: qi injected weapons can release long, straight qi slashes, with the dmg, width, and range scaling with injected qi amount Recent Weapons 精铁枪: A 14 dmg spear normal attacks is like normal, while heavy attacks use a thrust animation and forms a qi cone shaped thingy 铁骨扇: Shift right click switches forms: closed form deals 3 dmg and uses a cone heavy attack and open form deals 5 dmg and uses slash attacks 拂尘: Deals 7 dmg normal attacks is normal too, but its heavy attack spins five times in front of the player, damaging everything within 3 blocks. Right click binds a physically weaker target within 5 blocks for 3 seconds, with a 10 second cooldown 飞刀: Deals 4 dmg and you can stack 5 more all together into one. Right click throws normally and heavy attacks throw a faster knife that can break five blocks before exploding. 飞针 and 袖箭: 飞针 deals 4 dmg, has 1,000 durability, and consumes 10 durability per shot. 袖箭 can be held or equipped in a back accessory slot. Normal attacks fire ordinary needles but heavy attacks fire qi powered explosive needles Etc Added more English Remake some gui Remake some models
Devlog #13 Oops, I got the 8 hours warning and I forgot about it and not I have 12 hours…. sigh. So this update I mainly update the magic ritual mod I have before, and before you ask yes this is the right project, I merge the magic ritual mod with this mod and then revamped the whole thing. This devlog is kinda short because I am getting lazy. Magic Ritual Combo system The Ritual Dagger is your primary tool for creating and managing magic rituals. Right-click with the dagger to open the Magic Circle Selection screen, where you can choose a magic circle type to place at your feet. Shift + Right-click to open the Radius Selection screen, where you can place a Magic Center Block with a chosen radius Attack Red - Grants Strength I Defense Blue - Grants Resistance I Regeneration Green - Grants Regeneration I There are certain pattern for special effect after putting it in its pattern you can punch the center with the dagger and the new magic center is formed Combo visuals and glyph behavior Basic center have one image pattern Combo center have two image pattern If glyph mode is turned off, there is an entering animation
Devlog #13 Sooo, did a few entities and most important zhenpan and flags for the magic circle. Zhenpan When empty shift right click to store a magic center When full shift right click to place a magic center back down When store magic center the radius of the magic center is changed to 5 if higher When right click summon a temp magic center of the radius 5 that appear for 20 sec The cost is calculated based on the spirit stones in inventory first then player’s qi Flags Now in the magic center there is a new tab with a gui (in the pics) where you can put flags, they modified the effect of your magic circle. But each newly added flag will increase the cost of the magic center by 1.3x, so the cost can reach to 2693457 qi when using a maxed out zhenpan. Formation Flag Effects Blank Formation Flag — No active effect, used to forge specialized flags Duration Flag — Adds 3 seconds to a temporary Magic Center’s lifetime per flag Amplifier Flag — Adds 1 extra attack whenever an formation triggers Spirit Gathering Flag — Reduces formation fuel/energy consumption by 25% per flag, it does not add the normal ×1.5 flag cost Swift Formation Flag — Makes normal formation effects trigger 30% faster per flag and increases fuel consumption by 30% Qi Return Flag — Restores 10 Qi per flag when a player kills an enemy inside the formation
Devlog #14 Hmmm why does the picture devlog get more view than the videos, let this be a test then Added: Tutorial System Qi Sensing Thingy Remake Spatial Pouch and like 20 new spells and 4 new method Remake Spatial Pouch Replace the whole backpack like spatial pouch system to a pocket like dimension (in the in the picture) you can place all functionable block and still use it by left clicking it and double click to remove it. (oh and redstone work :) i know there is people that can do smth op with redstone) Tutorial System Full tutorial system that guide you through everything, because so much people said there is a big learning curve, so boom :) Qi Sensing Thingy You can sense entities, items and qi ahhhhh there is not too much stuff or maybe i am too lazy…. definitely not that trust
Devlog #15 Uhm a lot of update and unfinished things so it is more of a sneak peek so, there not going to be a long devlog, maybe i am just lazy :). Cosmic Void New dimension that is like space use for mostly travel and battles Talismans A lot I added a lot but it is for later show you guys some pics tho
Devlog #16 Did some structures, and there is the talisman data like I said Talismans Tier 1 清尘符 — Dust-Cleansing: Extinguishes fire and removes blindness and darkness 微光符 — Dim-Light: Creates light ball for 2–3 minutes, hold while aiming at a block to anchor it, you can use water extinguishes it 敛声符 — Sound-Gathering: For 25 seconds, nearby mobs lose you as their target when more than 2.5 blocks away 火球符 — Fireball: Fires 8 fireballs. Each deals 10 damage in a 2.4 block explosion 风刃符 — Wind-Blade: Fires 3 wind blades dealing 11 damage each and pushing targets backward Tier 2 星火符 — Sparkfire: Fires 5 flames dealing 30 damage each and igniting for 4 seconds 薄金护符 — Thin-Gold Protection: Give shield worth 200 + 1% maximum HP for 15 seconds 缠丝困符 — Spirit-Silk Binding: Fires 6 strands dealing 1 damage each. Strands stack slowness for 5 seconds and 4+ strands nearly immobilize the target 短途神行符 — Short-Journey Divine-Step: Give speed VIII and jump boost III for 30 seconds 传音符 — Voice-Transmission: Sends a written message to another player with in 100 blocks in the same dimension 修复符 — Repair: Repairs the damaged item held in the opposite hand Tier 3 避邪安魂符 — Evil-Warding Soul-Calming: Evil ward for 5 minutes, clears and prevents darkness/nausea, and restores 1% maximum Thoughts each second for 3 minutes 镇扰符 — Disturbance-Suppressing: Hostile mobs within a certain range get slowness II 爆风符 — Blast-Wind: Produces a blast dealing 50 damage, applying daze, and deflecting projectiles 火狱焚邪符 — Evil-Burning Fire-Prison: Creates a 10-block explosion, deals 50 area damage 五雷小伐符 — Lesser Five-Thunder: Deals 40 damage and give slowness III for 1.75 seconds 标记符 — Marking: Permanently marks a entity up to 300 blocks away for owner,and marked mobs are also prevented from naturally despawning 遁空符 — Void-Escape: Teleports in the direction you are looking, normally up to 20 blocks. Repeated uses within 5 seconds lower the maximum to 17, 14, then 12 blocks 化兵符 — Weapon-Manifestation: Creates an owner only temporary sword lasting 25 seconds Tier 4 金光护体符 — Golden-Light Body Protection: Adds a shield worth 600 + 1% maximum HP for 25 seconds 封灵符 — Spirit-Sealing: Seals everyone’s qi within 3 blocks of impact, interrupts casting 破障开山符 — Barrier-Breaking Mountain-Opening: Creates a massive 20-block explosion dealing 500 area damage Tier 5 千里传讯符 — Thousand-Li Message: Long range version of the Voice Transmission Talisman, but it is 1,000 blocks in the same dimension Tier 6 玄焰焚界符 — World-Scorching Black Flame: Creates a black-flame domain that grows from a 5 block radius and deals 100 damage per second. It destroys terrain, consumes dropped items and projectiles, and grows by consuming matter and victims, potentially reaching 48 blocks 五岳辟厄符 — Five-Mountains Calamity-Warding: Grants luck for 10 minutes and stacks three times: +15, then +7, then +3 Ancient 禁空符 — Forbidden-Air: Places a field 24-block radius lasts 8 seconds. It suppresses jumping and flight, and pulls flyingentities downward
Devlog #17 MORE STRUCTURES i got into the phase of building so more structres!
Devlog #18 Working on flying boat or valkyrie skies like things, I dont think that is copyright as it is not the main part of my mod, if it is tell me in the comments thanks Flying Boats Four core tiers control maximum capture size: Low: 100×100×100 Medium: 200×200×200 High: 400×400×400 Sect: 800×800×800 Existing ships can still be minimized into an item and placed again later The lingzhou core GUI is where you manage the ship. It shows the ship’s status, tier, size, fuel/灵气, current pilot, permissions, settings, movement mode, anchor controls, shutdown, and storage Fuel use is based on how many blocks the ship actually has and what it is doing. Hovering uses fuel, while an anchored ship does not The ship helm is used to pilot the lingzhou. While controlling it, the mouse wheel can be used to change the ship’s speed Autopilot lets you enter destination coordinates and have the ship travel toward them automatically Players and other entities move together with the ship. You can walk around the deck, jump, climb stairs, and move around normally while the ship is flying If part of the ship gets disconnected, that section is no longer supported by the lingzhou and falls back into the world as normal blocks Turning off the lingzhou core removes the ship’s magical lift. The ship keeps whatever momentum it already had and begins falling under gravity Etc Fix system prices Fix textures Fix names of items Added JEI compatibility for 鼎 forging Added recipes for a lot of weapons Removed combo system Added a fox beast
Devlog #19 Some mobs, yea that is really it
Devlog #20 School is starting and college stuff is like piling on so my brain is slowing down, so there isnt much stuff i did when you compare it to the hours in this devlog. Mirror Thingy It is like a shield can absorb some dmg Straw Doll Like a totem of undying Jei Compatibility You can see the forging recipes in Jei now!
Devlog #21 Added whip physics Added new item mechinacs Added straw doll Added a luck system
Devlog #22 Not much like I said school started, it was more planning and stuff, revised npc battle logic
Devlog #23 REVISE MOSTLY OF THE VFX AND ADD ALOTTTTT OF DRIP
Devlog #24 121 NEW SPELL ICONSSS MY SOULLLSLLSLSLLS I pick the best 20 icon i love
Devlog #25 Add a lot of new weapons A lot of new fire And more clothes
Devlog #26 I going to improve the overall survivability of the mod: So there is going to be like more guides book in coming And more item that were creative only now actually getting ways to get the items
Devlog #27 Improve overall guidance and improve existing model
Devlog #28 Added 8 guide books for different part of the mod Added new bear model
Devlog #29 Remake all the magic circle texture and automated it (tool here https://m3e66.github.io/xiuxian-circle-generator/ ) Optimize all the code Added new body types 赤炎灵体 — Crimson Flame Body +25% fire damage; burning enemies take 10% extra damage from you 玄冰灵体 — Profound Ice Body +25% ice damage; attacks build Frost, briefly freezing enemies after 5 stacks 紫霄雷体 — Violet Thunder Body +25% lightning damage; every fifth lightning attack summons an extra thunderbolt dealing 50% damage 青木长生体 — Evergreen Longevity Body +15% maximum HP; +25% natural HP regeneration; +10% healing effectiveness 厚土玄体 — Profound Earth Body +20% armor; standing still for 3s grants an additional 10% damage reduction until moving 庚金剑体 — Geng Metal Sword Body +20% sword damage; +10% sword attack speed; sword strikes ignore 10% armor 沧海灵体 — Vast Sea Body +20% water damage; +20% maximum Qi; water spells cost 15% less Qi 逐风灵体 — Windchaser Body +20% movement speed; +15% attack speed; dodging grants +10% damage for 3s 先天道体 — Innate Dao Body +15% cultivation gain; all spells cost 10% less Qi; +5% all elemental damage 无垢灵体 — Immaculate Spirit Body +30% negative-effect resistance; debuffs last 25% less time; +15% healing received 九窍玲珑体 — Nine-Orifice Exquisite Body +25% Qi regeneration; +10% maximum Qi; spell cooldowns reduced by 10% 万毒之体 — Myriad Poison Body Immune to poison; poison attacks deal +25% damage; poisoned enemies restore 1% max Qi when killed 血煞魔体 — Blood Fiend Body +20% melee damage; heal for 5% of melee damage dealt; healing from pills reduced by 20% 不灭金身 — Imperishable Golden Body +15% maximum HP; +15% damage reduction; when HP falls below 20%, gain 30% damage reduction for 5s 吞灵之体 — Spirit-Devouring Body Killing an enemy restores 5% max Qi; attacks against shields and Qi barriers deal +20% damage 荒古圣体 — Ancient Desolate Sacred Body +25% maximum HP; +20% physical damage; +15% armor; Qi regeneration reduced by 15% 太阴神体 — Supreme Yin Divine Body +30% dark and ice damage; +20% Qi regeneration at night; sunlight reduces Qi regeneration by 15% 太阳神体 — Solar Divine Body +30% fire and light damage; immune to burning; +20% HP regeneration in sunlight
Devlog #30 Remaking the whole life sim system adding new event (making them actually have somewhat of a story) added new battle system and more small thing to better help the experience And ton of bugs
Devlog #31 Added BLAST QI, where you can BLAST YOUR QI in your enemies face and be cool And fix the flying sword thing And fix a whole a lot of fix
Devlog #32 Added new effect in domain like abilities: Lilies, ice, big space warp (don’t yell at this devlog, I wrote it on the phone)
Devlog #33** A shentong ability:湮灭未尽之人 and a dummy for testing purposes A lot of bug fixing and small thing like better formatting of the gui etc
Ships:
Getting Started The first steps of cultivation. Enlightenment Pill Use an Enlightenment Pill to step from mortal life into Qi Refining. The stat menu shows qi, realm, max health, max age, luck, moral, soul, thoughts, spirit roots, and cultivation progress. Spells Fireball (Lianqi Early, Fire, 10 Qi) Shoots a fireball that deals damage and ignites targets. Lingbeng (Lianqi Late, Thunder, 50 Qi) Enter a breaking-force state. Punch a block or entity to release an explosion. Recasting stacks the explosion radius. Regeneration (Lianqi Middle, Wood, 20 Qi) Restores health with a short healing effect. Beam (Lianqi Early, Light, 30 Qi) Allows you to sense nearby entities. Earth Escape (Lianqi Late, Earth) Sink underground. Move faster while underground. Consumes Qi over time until you surface. Cleanse (Lianqi Early, Water, 10 Qi) Removes harmful effects from yourself. Qi Gathering (Lianqi Early, Wind, 0 Qi) Greatly increases Qi regeneration. You cannot attack or block while active. Damage taken is tripled. Ignite Flare (Lianqi Early, Fire, 10 Qi) Fires a straight flare. Ignites the block it hits. Spirit Sight (Lianqi Early, Light, 5 Qi/sec) Grants night vision while active. Zhenshan Palm (Foundation Establishment Middle, Earth, 130 Qi) Releases a giant hand-shaped earth wave for 3 seconds. Destroys blocks touched by the palm. Light Ball (Foundation Establishment Late, Light, 30 Qi summon, 10 Qi per shot) Summons 6 light balls in a hexagon behind you. Can stack up to 3 rings. Punch to fire one ball. Shift-punch to fire all balls. Each shot deals 50 damage. Each shot can break through up to 24 blocks.
This update adds a huge amount of new content! You can now explore newly added structures, use new spells, control and evolve zombies through the new 怨气 and 控尸 systems, and wear new design accessories. The 金丹 system has also been remade with its own pocket dimension, breakthrough system, and new mechanics. Spell casting has been reworked, flying swords are now fully usable, and a complete forging system lets you craft weapons using materials, molds, purity, and temperature. There are also plenty of new items, crops, effects, and fixes to improve the overall experience!
I want my VR ahaahahahahah plssss Nothing much to say here just look at the images and video in the previous logs
I WANT MY POLAROID GO GEN 3 PLSSSSS I AM JUST A TINY BIT AWAY...
|
1792817797.0497022
|
1792904197.0497022
|
|
1236
|
Fuddi AI by @unonown97 | Stardance
|
unonown97
|
1
|
64.0
|
1003
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T16:30:40Z", "hours": 64.0, "multiplier": 16.63, "payout": 1003, "blessing": "neutral", "text": "A sleek, privacy-first multi-model chat interface that runs entirely in your browser. Connects to dozens of AI models through a lightweight local proxy your API keys never leave your machine. so while deploying i encountered multiple issues and but the web helped me thankfully and also the costing doesnt work at all as of now and is something i will be fixing in the future :). g’day", "repo": "https://github.com/Miroredrpo/ai-chat-app", "demo": "https://fuddigai.vercel.app/"}]...
|
[{"post_id": 8139, "ts": "2026 [{"post_id": 8139, "ts": "2026-06-13T16:10:05Z", "hours": 0.7906, "text": "tried deploying to vercel but it didnt work tweaked some things in the server.js but reading online i foundout that i will need to make another folder for it to function properly so am doing that rn :)"}, {"post_id": 8102, "ts": "2026-06-13T14:58:43Z", "hours": 5.0, "text": "added an option to export and import all the things into a JSON, also an option to clear all the conversations, and remove all the API keys as now it has option to add multiple API keys, all the things are pretty much done so i think i will just do some finishing changes and ship it for the first time"}, {"post_id": 7843, "ts": "2026-06-13T02:35:10Z", "hours": 3.5333, "text": "added the prompting tab where specific instructions can be written and also completed the interface tab where one can toggle things like auto title generation and stuff am goging to add support for multiple api keys next and also an export/import chats and settings feutesrs that exports everthing, so when the local storage is full one can export and save there chat and import thhem later on"}, {"post_id": 6831, "ts": "2026-06-11T13:40:44Z", "hours": 5.4056, "text": "added option to pin the chat, edit the title manually, duplicate the chat and delete it also added fast delete which when shift is held while deletion it doesnt ask for conformation and directly deletes the chat, also added all the paraments accepted as far as i am aware of, added a default system prompt and i will also be making another tab specifically for prompts, also added dynamic size of the chat where the font size can be changed from the setting menu it self"}, {"post_id": 6076, "ts": "2026-06-10T06:43:41Z", "hours": 0.6, "text": "So… i tried using AI to do some visual changes only for it to completely messup the layout and populate the root directory with random js and css files saying these are the new ones and have the same logic and makes the app better but it did not do any of that, i reverted it to how it was i dont know if that counts to AI useage but i will still be putting the incident in the details of the project"}, {"post_id": 5753, "ts": "2026-06-09T17:31:13Z", "hours": 0.9672, "text": "when an API is enterd made a test endpoint so it tests if the API is correct or not and tells it also initialized the js logic for the thinking mode max tokens, temperature, max tokens (entire chat), and a default system prompt, also am thinking about adding a dedicated tab in the settings panel for prompts and all"}, {"post_id": 5606, "ts": "2026-06-09T13:51:25Z", "hours": 8.4333, "text": "completed the toasts, added web search functionality, added chat deletion, also populated the empty state with some prompts, added an option to choose if one wants to generate the title automatically or not in a new settings tab “interface” where the size of fonts, theme, etc can me changed, am goging to add things like temperature , maxtokens, thinking budget and all next"}, {"post_id": 5329, "ts": "2026-06-09T02:01:33Z", "hours": 1.2681, "text": "added a shortcuts tab that tells the users about the keybinds, also made the initial frame for toasts, also added a last refreshed time on the models tab and reload again button that again fetches it from the HCAI API"}, {"post_id": 4902, "ts": "2026-06-08T14:08:23Z", "hours": 10.1728, "text": "added empty state also added thinking mode where it sends the api with an extra parameter and enables the thinking mode if the model has the ability to do it, i also added some keybinds such as when ctrl + Shift + T is pressed thinkning mode is enabled, Ctrl+N opens new chat etc it is also confiured for mac instead of ctrl in mac we can use cmd, in the settings tab i have also added a dropdown menu to select a separate title generation model"}, {"post_id": 4073, "ts": "2026-06-07T08:25:09Z", "hours": 8.1322, "text": "i made it so that the model can be changed and accessed from the chat it self and change it as per the user intent, i also added a details panel showing thw models capabilities and its pricing and its abilities like if it can web search or not or if it has thinking mode etc. also now in the settings panel you can select the default model to be used when a new chant is opened and it is stored in the local storage similar to how the chat is stored"}, {"post_id": 3276, "ts": "2026-06-06T04:04:02Z", "hours": 12.3142, "text": "I have added a model selector now which pulls the models from https://ai.hackclub.com/proxy/v1/models although it has not been properly configures i will be making it so that there will be an option for a title generation model in the settings as well i have also added a side bar where previos chats can be accessed, up next: i will be adding a details panel that will allow one to veiw the context cost and provider, modelname, etc of the selected model, i will also be adding the feature to attach images and all, i have also made it responsive in this past time frame not entirely but i have made it fairly useable i will also be making it more mobile friendly"}, {"post_id": 1933, "ts": "2026-06-04T05:33:12Z", "hours": 2.745, "text": "implemented dark mode made layout cleaner added option to set base url, also made it so that the API gets saved in the local storage for future reload"}, {"post_id": 1603, "ts": "2026-06-03T18:49:52Z", "hours": 2.9808, "text": "made the layout better with buttons outlins and made a floating settings panel to input the HCAI API key into so that AI models can be accessed later, next changes: shift layout, figureout server calls and add more functionality also add dark mode :)"}, {"post_id": 269, "ts": "2026-06-01T14:20:29Z", "hours": 1.355, "text": "i am making an custom interface where one can bring their HCAI API key and talk to various LLM’s"}]...
|
Title: Fuddi AI by @unonown97 | Stardance
Devlogs Title: Fuddi AI by @unonown97 | Stardance
Devlogs:
i am making an custom interface where one can bring their HCAI API key and talk to various LLM’s
made the layout better with buttons outlins and made a floating settings panel to input the HCAI API key into so that AI models can be accessed later, next changes: shift layout, figureout server calls and add more functionality also add dark mode :)
implemented dark mode made layout cleaner added option to set base url, also made it so that the API gets saved in the local storage for future reload
I have added a model selector now which pulls the models from https://ai.hackclub.com/proxy/v1/models although it has not been properly configures i will be making it so that there will be an option for a title generation model in the settings as well i have also added a side bar where previos chats can be accessed, up next: i will be adding a details panel that will allow one to veiw the context cost and provider, modelname, etc of the selected model, i will also be adding the feature to attach images and all, i have also made it responsive in this past time frame not entirely but i have made it fairly useable i will also be making it more mobile friendly
i made it so that the model can be changed and accessed from the chat it self and change it as per the user intent, i also added a details panel showing thw models capabilities and its pricing and its abilities like if it can web search or not or if it has thinking mode etc. also now in the settings panel you can select the default model to be used when a new chant is opened and it is stored in the local storage similar to how the chat is stored
added empty state also added thinking mode where it sends the api with an extra parameter and enables the thinking mode if the model has the ability to do it, i also added some keybinds such as when ctrl + Shift + T is pressed thinkning mode is enabled, Ctrl+N opens new chat etc it is also confiured for mac instead of ctrl in mac we can use cmd, in the settings tab i have also added a dropdown menu to select a separate title generation model
added a shortcuts tab that tells the users about the keybinds, also made the initial frame for toasts, also added a last refreshed time on the models tab and reload again button that again fetches it from the HCAI API
completed the toasts, added web search functionality, added chat deletion, also populated the empty state with some prompts, added an option to choose if one wants to generate the title automatically or not in a new settings tab “interface” where the size of fonts, theme, etc can me changed, am goging to add things like temperature , maxtokens, thinking budget and all next
when an API is enterd made a test endpoint so it tests if the API is correct or not and tells it also initialized the js logic for the thinking mode max tokens, temperature, max tokens (entire chat), and a default system prompt, also am thinking about adding a dedicated tab in the settings panel for prompts and all
So… i tried using AI to do some visual changes only for it to completely messup the layout and populate the root directory with random js and css files saying these are the new ones and have the same logic and makes the app better but it did not do any of that, i reverted it to how it was i dont know if that counts to AI useage but i will still be putting the incident in the details of the project
added option to pin the chat, edit the title manually, duplicate the chat and delete it also added fast delete which when shift is held while deletion it doesnt ask for conformation and directly deletes the chat, also added all the paraments accepted as far as i am aware of, added a default system prompt and i will also be making another tab specifically for prompts, also added dynamic size of the chat where the font size can be changed from the setting menu it self
added the prompting tab where specific instructions can be written and also completed the interface tab where one can toggle things like auto title generation and stuff am goging to add support for multiple api keys next and also an export/import chats and settings feutesrs that exports everthing, so when the local storage is full one can export and save there chat and import thhem later on
added an option to export and import all the things into a JSON, also an option to clear all the conversations, and remove all the API keys as now it has option to add multiple API keys, all the things are pretty much done so i think i will just do some finishing changes and ship it for the first time
tried deploying to vercel but it didnt work tweaked some things in the server.js but reading online i foundout that i will need to make another folder for it to function properly so am doing that rn :)
Ships:
A sleek, privacy-first multi-model chat interface that runs entirely in your browser. Connects to dozens of AI models through a lightweight local proxy your API keys never leave your machine. so while deploying i encountered multiple issues and but the web helped me thankfully and also the costing doesnt work at all as of now and is something i will be fixing in the future :). g’day...
|
1792878545.9104006
|
1793742545.9104006
|
|
37455
|
MacForms by @tonymac129 | Stardance
|
tonymac129
|
1
|
38.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T03:17:27Z", "hours": 38.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I finally finished MacForms, an extensive, customizable, and feature-rich form creation tool for you to create surveys, forms, and quizzes with question options like multiple choice, multiple select, short answer, long answer, and more! To use it, simply sign in to a MacWeb account or select guest mode (which hopefully reduces voting friction). There are also a lot of different form settings for presentation, response management, quiz accuracy, visibility, and public/private forms, as well as options to invite collaborators to work on and manage the form together. You can browse other people’s forms and search your own forms as well. You can also visualize and view response statistics and individual responses with graphs and question response lists. The entire platform supports light/dark mode, smooth animations and transition effects, responsive design, accessibility, and SEO, as well as other quality of life improvements that hopefully make the website’s UI and UX more intuitive and user friendly. The codebase is surprisingly complex (and poorly organized :( , but I somehow managed to make everything work as expected. I really had a lot of fun working on and trying out this project myself, so hopefully yall will like it too :)", "repo": "https://github.com/Mac-Web/macforms", "demo": "https://macforms.macweb.app"}]...
|
[{"post_id": 81391, "ts": "202 [{"post_id": 81391, "ts": "2026-10-21T03:10:05Z", "hours": 0.9758, "text": "Quick final devlog before shipping!!! I finally finished all the features, customization, and everything else I planned to implement for MacForms after working (but mostly procrastinating) on it for more than 3 months ! I have no clue why this wasn’t done earlier, but I added a multiple select option for multiple choice questions to allow respondents to select multiple options (which also works with quizzes and other edge cases) Similarly, I also added an option to mark free response/text questions as having a long answer to render a textarea instead of the normal input field for more customization I already added most of these features while planning out the types and schemas, but somehow never implemented it, so it was kind of confusing but I was able to create them more quickly and easily that I’d expected Added guest mode so yall can actually try out the form engine without signing up (is that low enough friction for you guys ) Updated styling and readme Polished some other stuff for shipping! I’ve already wasted so much of Stardance’s extension not shipping any of my projects , so I panicked when I realized there was only 10 days left and forced myself to actually get to work and finish this project, hopefully you’ll enjoy and like it as much as I do :)"}, {"post_id": 78807, "ts": "2026-10-11T17:45:46Z", "hours": 2.6433, "text": "Individual responses and form options You can now also see, select, and manage each individual response to view in detail instead of only seeing summary graphs/tables of all the responses combined There’s a new dropdown on the form responses page where you can either view the summary stats/answers of all responses (default), or select every individual response to view its answer to each question, submission/edit date and time, accuracy (if the form is a quiz), as well as an option to delete the response after confirmation to make viewing responses easier and more useful If you make your form a quiz and designate certain questions as having correct answers, you can now finally select one or multiple options to all be correct for each question! This took a surprisingly long time since I had to fix a lot of bugs based on the old system Added sorting, filtering, and ordering dropdowns and options to the public form browse page to make finding and viewing different forms a lot easier I just realized there are a few bugs in prod while recording the video, so looks like more fun bug fixing in the next devlog Updated types and backend schemas to accept the new options Updated styling and colors I am now dedicating most of my time on (really amazing event btw), so I can only work on trying to finish and ship my Stardance projects on the little time I have on weekends, so hopefully I’ll be able to ship MacForms this weekend and finally finish my other Stardance projects before it ends"}, {"post_id": 76896, "ts": "2026-10-04T23:55:06Z", "hours": 3.3086, "text": "A bunch of small additions and changes! Added the Browse tab where you can see all the published public forms that other people made on MacForms! You can explore all the different forms easily with the search bar Finally added a nav search bar that actually works (instead of the old placeholder) by querying the new API endpoint for either your own forms or other people’s public forms so you can access everything faster and more easily Search results are matched by both title and description to be more useful, and your own forms take you directly to the edit page while others’ forms take you to the form filling page Added a bunch of smooth animations and transition effects for page loads, interactions, and search/filter results to improve user experience and interactivity Added responsive design on all the pages and components so MacForms is accessible and functional on all screen sizes Added feature description sections, icons, and buttons on the home landing page I have no idea why this was even a thing before, but now you can actually access the form pages and fill out the forms without being logged in Apparently my thought all get requests had to pass the auth gate or something, but now it’s fixed Removed the Settings tab (not form settings), because I couldn’t figure out anything to put there since I already have account settings on MacWeb, a separate form settings tab, and a dark/light mode toggle Updated styling and layout Fixed a few display bugs"}, {"post_id": 72023, "ts": "2026-09-22T00:50:01Z", "hours": 4.1978, "text": "MacForms is back: form settings and light mode! After taking a break from working on MacForms for 2 months to work on other projects, prepare for school, and do a lot of other stuff, I’m finally back to developing this project and getting it ready to ship before Stardance ends in 9 days! (plz extend the end date ) In this pretty massive devlog, I added a new settings tab to the form editing page where you can customize the published form’s presentation and many other options here are the settings I implemented, there might be other important stuff I forgot: whether to shuffle questions randomly whether to shuffle the multiple choice options for each question a custom background color for the top banner allow respondents to submit another response allow respondents to edit their submitted responses Because I couldn’t figure out a way (if there is one) to implement the last 2 without using accounts or cookies, if a form has either of the 2 enabled, you’ll need to sign in first to fill out the form Added a light/dark mode toggle option to the nav user dropdown menu for you to easily customize the site’s appearance and switch between light and dark modes Since I had to manually go through basically every component and page of the entire platform to modify the elements’ Tailwind classes for this, it also gave me a chance to refresh my memory of the project’s structure and how it works because I was gone for so long Going through all the files and testing the 2 modes was a long and tedious process, but the result turned out pretty well, both are consistent and visually appealing, and there’s also a smooth color transition Added a top loading indicator bar to improve the UX since some pages take a bit to load and the site may look unresponsive without the loading bar Fixed a few math bugs with 0s and NaNs and display bugs with the colors, layout, placeholder, and other styling Because Stardance is ending so soon and because of my procrastination and laziness, I’m going to have to cut a lot of the originally planned features before shipping since I have another big project to ship, so hopefully I can finish some last few features and polish MacForms and ship it soon!"}, {"post_id": 37716, "ts": "2026-07-30T16:54:37Z", "hours": 1.9336, "text": "Publish & share form You can now publish and share your forms for the rest of the world to see and fill out! Clicking on the publish button on the tool bar now opens a modal where you can either publish/unpublish the form or copy the link and send it to people If the form is already published, you can see its public link and an option to shorten it. Shortening it creates a unique 8-digit shortcut id for the form that redirects you to the main form (I’m planning on shortening it even more by buying a cool short domain or something, but that’s probably not gonna happen any time soon) You can also unpublish the form after a confirmation warning by clicking on the unpublish button If the form hasn’t been published yet, you can publish it by clicking on the publish button (in case this isn’t already obvious ) Updated some permissions so collaborators can also manage the form’s publication visibility status (instead of only the owner) Updated schema and types"}, {"post_id": 37141, "ts": "2026-07-29T17:06:56Z", "hours": 2.0547, "text": "Score distribution & autosave Added a quiz results summary section on the responses tab that shows some useful statistics about the scores as well as a histogram showing the score distribution if your form is a quiz It dynamically calculates scores based on the latest updated quiz, then organizes them and calculates their mean, median, min, and max in percentages It also renders a custom histogram with bins of 10 ranging from 0 to 100 so you can visualize how well your respondents did in one glance (server rendered + no Chart.js or external libraries = almost instantaneous load time) The histogram also shows the percentages of scores, and you can see how many responses are in each bin by hovering over the bar There’s also a view scores button that displays a modal showing each individual score Added autosave for editing forms that autosaves the entire form in the background every minute without revalidating the frontend to ensure smooth UX. The bar also shows the autosave status for a few seconds telling you it autosaved Added collaborator access so they can actually edit and manage the form and view responses without getting redirected. Updated some backend operations to ensure permissions are correct as well Fixed form editing so it actually updates the form and each question individually instead of creating a completely new set of it and neglecting the originally existing relations (~50 lines of code for one database transaction , but Prisma is actually so nice 🥹) Added filters and sort methods for shared forms vs forms you own (shared forms now display on the forms page)"}, {"post_id": 36789, "ts": "2026-07-29T02:03:54Z", "hours": 2.9133, "text": "Invite collaborators & update form You can now invite collaborators that will have access to edit the form, see its responses, and manage its settings! Only the form owner/creator can delete the form and invite and remove people, but invited people can basically do everything else On the invite modal page, you can search for MacWeb accounts by their name, email, or about through an API endpoint I added, and select multiple people to invite to the form at once Once you send out the invitation, you’ll see the users added to the form on the modal, and you can remove their access by clicking on the trash icon as well There isn’t real time form collaborative editing (at least not yet, though I don’t plan on overcomplicating a simple form app to be like Google Forms ), but changes you make to the form are revalidated the moment you click on save You can now actually edit and update your form by going to the edit tab and editing the form and its questions. This was actually fairly easy to implement since I just had to use the component used for the form creation page and update a few things Optimized database operations and API calls Updated schema and types Updated styling"}, {"post_id": 36475, "ts": "2026-07-28T16:42:14Z", "hours": 3.4131, "text": "Edit form & response pages Finally added the form editing page where you’ll be able to edit the entire form (title, description, questions, etc.), view response summaries and statistics, and configure its submission settings and other defaults When you click on one of your forms on the forms tab, you get redirected to the edit page that has a top utility bar with the form’s name displayed (you can rename the form by clicking on it) and 3 tabs for you to switch between edit, response, and settings modes On the right of the bar, there’s also an invite button, a preview form button, and a publish button (currently doesn’t work yet ) Clicking on the invite button opens a modal where you can either invite another MacWeb account to be a permanent collaborator (of course it doesn’t work yet), or generate a one-time single-use invite link/code that allows anyone (with or without an account) with the access code to edit the form using a custom access token cookie that expires after an hour Making this cookie access thing work was actually a bit more complicated than I thought, so I spent some time debugging the logic but it was pretty fun When you use the access code to edit a form, a page shows up confirming the access, and invalidates the code after confirming When you click on the responses tab, you can see all the responses and answers grouped by question to make visualizing and summarizing people’s responses a lot easier (definitely didn’t take inspo from Google Forms ) If the question is multiple choice, it shows how many responses each option got with percentages and presents it in sort of a bar graph If the question is free responses, it just lists each response Added placeholder tabs for editing and settings Added SEO for these tabs Updated types and schema Updated styling"}, {"post_id": 36034, "ts": "2026-07-27T21:08:54Z", "hours": 1.2928, "text": "Sorting & filtering Added sorting, filtering, and ordering dropdowns to the forms page so you can better browse and search through your forms! You can sort the forms by name, date created, type, starred, and more, and you can filter them by quiz, starred, private, and open. You can change the display order between descending and ascending as well Added form starring so you can now star/favorite/pin your most important forms directly by clicking on the star icon on the form card, or by clicking on the star option in the popup menu Added icons to form cards to better display the form’s information and attributes Added an access lock page for private forms that prompts for the access code, and it only shows the questions and allows you to fill out the form after verifying successfully Added a form not open page that shows if a form isn’t open (isn’t published), but if you’re the owner you can still see it with preview mode Updated schema and types Updated layout and styling"}, {"post_id": 35556, "ts": "2026-07-27T02:15:20Z", "hours": 2.9525, "text": "Form management & quizzes Added the Forms page where you can browse, search, view, and manage all the forms you created (you’ll be able to filter and sort them to browse and search through them more easily in the future) Each form is displayed as a card with a placeholder icon, title, shortened description preview, and creation date listed When you click on the 3 dots option button a menu shows up where you can edit the form (takes you to edit page), preview it (takes you to submission page but in preview mode), or delete it Preview mode only activates when you own the form, are logged in, and the link has the preview search param. In this mode, you can fill out the questions but can’t submit it, and you can go back to the edit page by clicking on the x icon When you click on delete, a confirmation modal shows up, and only deletes your form after confirmation so you don’t accidentally delete stuff Added quiz mode to forms so you can create quizzes with correct answers (for both multiple choice and free response questions) and see how your respondents do! On the quiz creation page, you can check the quiz checkbox to turn the form into a quiz, and you can customize each question individually to either accept a correct answer (multiselect coming soon) or to allow all choices If you fill out a form that’s a quiz, you will be able to see your score and accuracy (but not the correct answer) after submitting it Implementing the logic and types for quizzes was kind of a pain but I still managed to fix all the weird edge case bugs Added both static and dynamically generated SEO metadata across all pages on MacForms to make the site more accessible and user friendly Added a placeholder settings page You can now delete questions after a confirmation modal on the form creation page if you have multiple questions Updated styling and types Updated README This is a pretty big update that covers a ton of features, so the video is 3 minutes long and I had to compress it like 2 times…"}, {"post_id": 35426, "ts": "2026-07-26T20:31:56Z", "hours": 2.69, "text": "Form responses Added an actual public facing form submission page where anyone (regardless of whether or not they’re logged in) can fill out a form and submit their response On the response submission page, you can see the form’s title, description, creation date, all the questions and their choices/inputs rendered correctly, a submit button that submits your response, and a clear button that will clear everything you filled in after showing a confirmation modal If you haven’t filled out all the required fields before submitting, it shows a helpful warning message that tells you to fill out the options You can deselect your choice for a multiple choice question if it’s not required by clicking on the same choice again (but this isn’t allowed for required questions because duh ) Public/private forms aren’t implemented yet so the moment you create a form it’s respondable by anyone Once you submit your response, a response confirmation page will display confirming your submission, and it also shows an edit response option, as well as a submit another response option Response editing works by adding a search param with your response id after the form page path, so it dynamically fetches your response data and fills it in automatically The submit another response option just refreshes the page to create a new blank response state object Added a different layout for the form submission page (since nav and footer aren’t needed), so I had to reorganize the routes and folders into logical groups to make different layouts work Added schema and types for response data Updated styling and navigation"}, {"post_id": 34381, "ts": "2026-07-25T01:33:02Z", "hours": 3.0203, "text": "Form submission & auth Finally added backend form submission so when you click on save on the form creation page after filling in all the values, it gets created and added to the database When you click on save, MacForms validates all your new form’s values (title, description, etc.), as well as each question’s choices to make sure everything’s filled out properly If you’re missing fields or something isn’t validated, a helpful error message will appear telling you what to fix Once you successfully submit the new form, you get redirected to the form editing page where you will be able to edit it, change its settings, check the preview, and publish it (the page isn’t implemented yet) You can also delete options/choices for multiple choice questions, as long as there’s at least one available choice If you’re logged in, you can see your profile icon displayed on the right of the nav bar, and clicking on it opens a menu where you can view your account profile (redirects you back to MacWeb), toggle light/dark mode (doesn’t work yet), and log out I spent a ton of time trying to debug and make the log out thing work because of this entire cross subdomain auth thing that just makes everything super complicated and frustrating, but I figured it out and fixed it by changing a few auth configs Designed and added the MacForms logo (just a list icon on a green background) to the nav bar and the site favicon. The design is pretty terrible, hopefully I’ll come up with a better design Also spent a lot of time testing to ensure the app, especially auth, works both locally in dev environment and in production Added a helper function to fetch form data from Prisma, destructure and sanitize the data, and do some conditional typing to match the types and ensure type safety Updated README to be more informative on dev setup since there’s quite a few steps for setup and I don’t wanna forget them in the future Updated schema and types"}, {"post_id": 33842, "ts": "2026-07-24T02:42:42Z", "hours": 5.1803, "text": "Form creation & homepage I forgot to add devlogs for a couple days, so this devlog will be a bit long and cover a ton of changes Added a basic homepage with a hero that has a title, description, and some call to action buttons, and a few sections that are just placeholder text and images for now to fill the layout Added a navigation bar at the top with links to a few pages and an interactive search bar that doesn’t actually work yet (since there’s nothing to search) Copied the MacWeb footer and changed some links and styling to add the footer Auth isn’t completely set up yet, so a few things aren’t being displayed properly. Even if you’re not logged in, you can still access the form creation page, it just doesn’t do anything yet On the form creation page (that is a form itself), you can fill in the form’s name, description, visibility (making it private requires an access code, which you can generate or type in manually), and whether it’s accepting responses You can add new questions by clicking on the add question card, which shows a new question where you can select its type (only multiple and text are supported right now), set the question and description, set it as required/optional, and add answer choices or set the input placeholder depending on the question type The backend for making and publishing forms isn’t set up yet, so it’s only the frontend that doesn’t actually do anything Adding types for the form, questions, and answer choices was a huge pain because I had to set up a type map, extract its keys, and use them to dynamically construct type unions and some other advanced stuff for to dynamically infer option types based on the question type, and it was a huge headache to figure out Updated Prisma schema and added other types Updated styling and navigation"}, {"post_id": 31522, "ts": "2026-07-20T00:22:55Z", "hours": 1.3511, "text": "MacForms: simple but customizable form creation tool I’m building MacForms, an easy to use form creation tool with a lot of features and customization! This is actually a subapp of my online platform MacWeb with many different apps you can try out I started this app because I have to make a form for a few people to fill out, and instead of using Google Forms or Notion like a weirdo, I decided to make my own form tool and use it to make the form like a totally normal person Since this is a subapp of the main platform, it shares the same auth and database system with the other apps, so I had to update and migrate a ton of stuff on the root domain before I could start working on this app The auth system was also challenging to configure properly, but I figured out how to share cookie sessions across subdomains for my account system after a few hours of painful debugging After the root domain was migrated and updated properly, I could finally start working on MacForms and set up the project and its dependencies Currently there isn’t much since auth took so much time to work, but the hardest part is finished, so hopefully the rest of development will be smoother Also set up some DNS and Vercel records for the real domain to work"}]...
|
Title: MacForms by @tonymac129 | Stardance
Devlog Title: MacForms by @tonymac129 | Stardance
Devlogs:
MacForms: simple but customizable form creation tool I’m building MacForms, an easy to use form creation tool with a lot of features and customization! This is actually a subapp of my online platform MacWeb with many different apps you can try out I started this app because I have to make a form for a few people to fill out, and instead of using Google Forms or Notion like a weirdo, I decided to make my own form tool and use it to make the form like a totally normal person Since this is a subapp of the main platform, it shares the same auth and database system with the other apps, so I had to update and migrate a ton of stuff on the root domain before I could start working on this app The auth system was also challenging to configure properly, but I figured out how to share cookie sessions across subdomains for my account system after a few hours of painful debugging After the root domain was migrated and updated properly, I could finally start working on MacForms and set up the project and its dependencies Currently there isn’t much since auth took so much time to work, but the hardest part is finished, so hopefully the rest of development will be smoother Also set up some DNS and Vercel records for the real domain to work
Form creation & homepage I forgot to add devlogs for a couple days, so this devlog will be a bit long and cover a ton of changes Added a basic homepage with a hero that has a title, description, and some call to action buttons, and a few sections that are just placeholder text and images for now to fill the layout Added a navigation bar at the top with links to a few pages and an interactive search bar that doesn’t actually work yet (since there’s nothing to search) Copied the MacWeb footer and changed some links and styling to add the footer Auth isn’t completely set up yet, so a few things aren’t being displayed properly. Even if you’re not logged in, you can still access the form creation page, it just doesn’t do anything yet On the form creation page (that is a form itself), you can fill in the form’s name, description, visibility (making it private requires an access code, which you can generate or type in manually), and whether it’s accepting responses You can add new questions by clicking on the add question card, which shows a new question where you can select its type (only multiple and text are supported right now), set the question and description, set it as required/optional, and add answer choices or set the input placeholder depending on the question type The backend for making and publishing forms isn’t set up yet, so it’s only the frontend that doesn’t actually do anything Adding types for the form, questions, and answer choices was a huge pain because I had to set up a type map, extract its keys, and use them to dynamically construct type unions and some other advanced stuff for to dynamically infer option types based on the question type, and it was a huge headache to figure out Updated Prisma schema and added other types Updated styling and navigation
Form submission & auth Finally added backend form submission so when you click on save on the form creation page after filling in all the values, it gets created and added to the database When you click on save, MacForms validates all your new form’s values (title, description, etc.), as well as each question’s choices to make sure everything’s filled out properly If you’re missing fields or something isn’t validated, a helpful error message will appear telling you what to fix Once you successfully submit the new form, you get redirected to the form editing page where you will be able to edit it, change its settings, check the preview, and publish it (the page isn’t implemented yet) You can also delete options/choices for multiple choice questions, as long as there’s at least one available choice If you’re logged in, you can see your profile icon displayed on the right of the nav bar, and clicking on it opens a menu where you can view your account profile (redirects you back to MacWeb), toggle light/dark mode (doesn’t work yet), and log out I spent a ton of time trying to debug and make the log out thing work because of this entire cross subdomain auth thing that just makes everything super complicated and frustrating, but I figured it out and fixed it by changing a few auth configs Designed and added the MacForms logo (just a list icon on a green background) to the nav bar and the site favicon. The design is pretty terrible, hopefully I’ll come up with a better design Also spent a lot of time testing to ensure the app, especially auth, works both locally in dev environment and in production Added a helper function to fetch form data from Prisma, destructure and sanitize the data, and do some conditional typing to match the types and ensure type safety Updated README to be more informative on dev setup since there’s quite a few steps for setup and I don’t wanna forget them in the future Updated schema and types
Form responses Added an actual public facing form submission page where anyone (regardless of whether or not they’re logged in) can fill out a form and submit their response On the response submission page, you can see the form’s title, description, creation date, all the questions and their choices/inputs rendered correctly, a submit button that submits your response, and a clear button that will clear everything you filled in after showing a confirmation modal If you haven’t filled out all the required fields before submitting, it shows a helpful warning message that tells you to fill out the options You can deselect your choice for a multiple choice question if it’s not required by clicking on the same choice again (but this isn’t allowed for required questions because duh ) Public/private forms aren’t implemented yet so the moment you create a form it’s respondable by anyone Once you submit your response, a response confirmation page will display confirming your submission, and it also shows an edit response option, as well as a submit another response option Response editing works by adding a search param with your response id after the form page path, so it dynamically fetches your response data and fills it in automatically The submit another response option just refreshes the page to create a new blank response state object Added a different layout for the form submission page (since nav and footer aren’t needed), so I had to reorganize the routes and folders into logical groups to make different layouts work Added schema and types for response data Updated styling and navigation
Form management & quizzes Added the Forms page where you can browse, search, view, and manage all the forms you created (you’ll be able to filter and sort them to browse and search through them more easily in the future) Each form is displayed as a card with a placeholder icon, title, shortened description preview, and creation date listed When you click on the 3 dots option button a menu shows up where you can edit the form (takes you to edit page), preview it (takes you to submission page but in preview mode), or delete it Preview mode only activates when you own the form, are logged in, and the link has the preview search param. In this mode, you can fill out the questions but can’t submit it, and you can go back to the edit page by clicking on the x icon When you click on delete, a confirmation modal shows up, and only deletes your form after confirmation so you don’t accidentally delete stuff Added quiz mode to forms so you can create quizzes with correct answers (for both multiple choice and free response questions) and see how your respondents do! On the quiz creation page, you can check the quiz checkbox to turn the form into a quiz, and you can customize each question individually to either accept a correct answer (multiselect coming soon) or to allow all choices If you fill out a form that’s a quiz, you will be able to see your score and accuracy (but not the correct answer) after submitting it Implementing the logic and types for quizzes was kind of a pain but I still managed to fix all the weird edge case bugs Added both static and dynamically generated SEO metadata across all pages on MacForms to make the site more accessible and user friendly Added a placeholder settings page You can now delete questions after a confirmation modal on the form creation page if you have multiple questions Updated styling and types Updated README This is a pretty big update that covers a ton of features, so the video is 3 minutes long and I had to compress it like 2 times…
Sorting & filtering Added sorting, filtering, and ordering dropdowns to the forms page so you can better browse and search through your forms! You can sort the forms by name, date created, type, starred, and more, and you can filter them by quiz, starred, private, and open. You can change the display order between descending and ascending as well Added form starring so you can now star/favorite/pin your most important forms directly by clicking on the star icon on the form card, or by clicking on the star option in the popup menu Added icons to form cards to better display the form’s information and attributes Added an access lock page for private forms that prompts for the access code, and it only shows the questions and allows you to fill out the form after verifying successfully Added a form not open page that shows if a form isn’t open (isn’t published), but if you’re the owner you can still see it with preview mode Updated schema and types Updated layout and styling
Edit form & response pages Finally added the form editing page where you’ll be able to edit the entire form (title, description, questions, etc.), view response summaries and statistics, and configure its submission settings and other defaults When you click on one of your forms on the forms tab, you get redirected to the edit page that has a top utility bar with the form’s name displayed (you can rename the form by clicking on it) and 3 tabs for you to switch between edit, response, and settings modes On the right of the bar, there’s also an invite button, a preview form button, and a publish button (currently doesn’t work yet ) Clicking on the invite button opens a modal where you can either invite another MacWeb account to be a permanent collaborator (of course it doesn’t work yet), or generate a one-time single-use invite link/code that allows anyone (with or without an account) with the access code to edit the form using a custom access token cookie that expires after an hour Making this cookie access thing work was actually a bit more complicated than I thought, so I spent some time debugging the logic but it was pretty fun When you use the access code to edit a form, a page shows up confirming the access, and invalidates the code after confirming When you click on the responses tab, you can see all the responses and answers grouped by question to make visualizing and summarizing people’s responses a lot easier (definitely didn’t take inspo from Google Forms ) If the question is multiple choice, it shows how many responses each option got with percentages and presents it in sort of a bar graph If the question is free responses, it just lists each response Added placeholder tabs for editing and settings Added SEO for these tabs Updated types and schema Updated styling
Invite collaborators & update form You can now invite collaborators that will have access to edit the form, see its responses, and manage its settings! Only the form owner/creator can delete the form and invite and remove people, but invited people can basically do everything else On the invite modal page, you can search for MacWeb accounts by their name, email, or about through an API endpoint I added, and select multiple people to invite to the form at once Once you send out the invitation, you’ll see the users added to the form on the modal, and you can remove their access by clicking on the trash icon as well There isn’t real time form collaborative editing (at least not yet, though I don’t plan on overcomplicating a simple form app to be like Google Forms ), but changes you make to the form are revalidated the moment you click on save You can now actually edit and update your form by going to the edit tab and editing the form and its questions. This was actually fairly easy to implement since I just had to use the component used for the form creation page and update a few things Optimized database operations and API calls Updated schema and types Updated styling
Score distribution & autosave Added a quiz results summary section on the responses tab that shows some useful statistics about the scores as well as a histogram showing the score distribution if your form is a quiz It dynamically calculates scores based on the latest updated quiz, then organizes them and calculates their mean, median, min, and max in percentages It also renders a custom histogram with bins of 10 ranging from 0 to 100 so you can visualize how well your respondents did in one glance (server rendered + no Chart.js or external libraries = almost instantaneous load time) The histogram also shows the percentages of scores, and you can see how many responses are in each bin by hovering over the bar There’s also a view scores button that displays a modal showing each individual score Added autosave for editing forms that autosaves the entire form in the background every minute without revalidating the frontend to ensure smooth UX. The bar also shows the autosave status for a few seconds telling you it autosaved Added collaborator access so they can actually edit and manage the form and view responses without getting redirected. Updated some backend operations to ensure permissions are correct as well Fixed form editing so it actually updates the form and each question individually instead of creating a completely new set of it and neglecting the originally existing relations (~50 lines of code for one database transaction , but Prisma is actually so nice 🥹) Added filters and sort methods for shared forms vs forms you own (shared forms now display on the forms page)
Publish & share form You can now publish and share your forms for the rest of the world to see and fill out! Clicking on the publish button on the tool bar now opens a modal where you can either publish/unpublish the form or copy the link and send it to people If the form is already published, you can see its public link and an option to shorten it. Shortening it creates a unique 8-digit shortcut id for the form that redirects you to the main form (I’m planning on shortening it even more by buying a cool short domain or something, but that’s probably not gonna happen any time soon) You can also unpublish the form after a confirmation warning by clicking on the unpublish button If the form hasn’t been published yet, you can publish it by clicking on the publish button (in case this isn’t already obvious ) Updated some permissions so collaborators can also manage the form’s publication visibility status (instead of only the owner) Updated schema and types
MacForms is back: form settings and light mode! After taking a break from working on MacForms for 2 months to work on other projects, prepare for school, and do a lot of other stuff, I’m finally back to developing this project and getting it ready to ship before Stardance ends in 9 days! (plz extend the end date ) In this pretty massive devlog, I added a new settings tab to the form editing page where you can customize the published form’s presentation and many other options here are the settings I implemented, there might be other important stuff I forgot: whether to shuffle questions randomly whether to shuffle the multiple choice options for each question a custom background color for the top banner allow respondents to submit another response allow respondents to edit their submitted responses Because I couldn’t figure out a way (if there is one) to implement the last 2 without using accounts or cookies, if a form has either of the 2 enabled, you’ll need to sign in first to fill out the form Added a light/dark mode toggle option to the nav user dropdown menu for you to easily customize the site’s appearance and switch between light and dark modes Since I had to manually go through basically every component and page of the entire platform to modify the elements’ Tailwind classes for this, it also gave me a chance to refresh my memory of the project’s structure and how it works because I was gone for so long Going through all the files and testing the 2 modes was a long and tedious process, but the result turned out pretty well, both are consistent and visually appealing, and there’s also a smooth color transition Added a top loading indicator bar to improve the UX since some pages take a bit to load and the site may look unresponsive without the loading bar Fixed a few math bugs with 0s and NaNs and display bugs with the colors, layout, placeholder, and other styling Because Stardance is ending so soon and because of my procrastination and laziness, I’m going to have to cut a lot of the originally planned features before shipping since I have another big project to ship, so hopefully I can finish some last few features and polish MacForms and ship it soon!
A bunch of small additions and changes! Added the Browse tab where you can see all the published public forms that other people made on MacForms! You can explore all the different forms easily with the search bar Finally added a nav search bar that actually works (instead of the old placeholder) by querying the new API endpoint for either your own forms or other people’s public forms so you can access everything faster and more easily Search results are matched by both title and description to be more useful, and your own forms take you directly to the edit page while others’ forms take you to the form filling page Added a bunch of smooth animations and transition effects for page loads, interactions, and search/filter results to improve user experience and interactivity Added responsive design on all the pages and components so MacForms is accessible and functional on all screen sizes Added feature description sections, icons, and buttons on the home landing page I have no idea why this was even a thing before, but now you can actually access the form pages and fill out the forms without being logged in Apparently my thought all get requests had to pass the auth gate or something, but now it’s fixed Removed the Settings tab (not form settings), because I couldn’t figure out anything to put there since I already have account settings on MacWeb, a separate form settings tab, and a dark/light mode toggle Updated styling and layout Fixed a few display bugs
Individual responses and form options You can now also see, select, and manage each individual response to view in detail instead of only seeing summary graphs/tables of all the responses combined There’s a new dropdown on the form responses page where you can either view the summary stats/answers of all responses (default), or select every individual response to view its answer to each question, submission/edit date and time, accuracy (if the form is a quiz), as well as an option to delete the response after confirmation to make viewing responses easier and more useful If you make your form a quiz and designate certain questions as having correct answers, you can now finally select one or multiple options to all be correct for each question! This took a surprisingly long time since I had to fix a lot of bugs based on the old system Added sorting, filtering, and ordering dropdowns and options to the public form browse page to make finding and viewing different forms a lot easier I just realized there are a few bugs in prod while recording the video, so looks like more fun bug fixing in the next devlog Updated types and backend schemas to accept the new options Updated styling and colors I am now dedicating most of my time on (really amazing event btw), so I can only work on trying to finish and ship my Stardance projects on the little time I have on weekends, so hopefully I’ll be able to ship MacForms this weekend and finally finish my other Stardance projects before it ends
Quick final devlog before shipping!!! I finally finished all the features, customization, and everything else I planned to implement for MacForms after working (but mostly procrastinating) on it for more than 3 months ! I have no clue why this wasn’t done earlier, but I added a multiple select option for multiple choice questions to allow respondents to select multiple options (which also works with quizzes and other edge cases) Similarly, I also added an option to mark free response/text questions as having a long answer to render a textarea instead of the normal input field for more customization I already added most of these features while planning out the types and schemas, but somehow never implemented it, so it was kind of confusing but I was able to create them more quickly and easily that I’d expected Added guest mode so yall can actually try out the form engine without signing up (is that low enough friction for you guys ) Updated styling and readme Polished some other stuff for shipping! I’ve already wasted so much of Stardance’s extension not shipping any of my projects , so I panicked when I realized there was only 10 days left and forced myself to actually get to work and finish this project, hopefully you’ll enjoy and like it as much as I do :)
Ships:
I finally finished MacForms, an extensive, customizable, and feature-rich form creation tool for you to create surveys, forms, and quizzes with question options like multiple choice, multiple select, short answer, long answer, and more! To use it, simply sign in to a MacWeb account or select guest mode (which hopefully reduces voting friction). There are also a lot of different form settings for presentation, response management, quiz accuracy, visibility, and public/private forms, as well as options to invite collaborators to work on and manage the form together. You can browse other people’s forms and search your own forms as well. You can also visualize and view response statistics and individual responses with graphs and question response lists. The entire platform supports light/dark mode, smooth animations and transition effects, responsive design, accessibility, and SEO, as well as other quality of life improvements that hopefully make the website’s UI and UX more intuitive and user friendly. The codebase is surprisingly complex (and poorly organized :( , but I somehow managed to make everything work as expected. I really had a lot of fun working on and trying out this project myself, so hopefully yall will like it too :)...
|
1792860495.752206
|
1792946895.752206
|
|
58198
|
Space Tab by @saatvik_270211 | Stardance
|
saatvik_270211
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T03:34:40Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "#Space Tab A new space inspired tab #Features Live clock -Google Search : allow you to search anything inside it. -Github and Nasa News -Stardance , GitHub , Google and Youtube icon. -Blurry background Hope you like and enjoy it :D", "repo": "https://github.com/Kingplayer-eng/jjk-evaluator", "demo": "https://kingplayer-eng.github.io/jjk-evaluator/"}]...
|
[{"post_id": 81394, "ts": "202 [{"post_id": 81394, "ts": "2026-10-21T03:31:25Z", "hours": 0.7464, "text": "I updated the background and fixed some issues."}, {"post_id": 80349, "ts": "2026-10-17T10:58:58Z", "hours": 1.1706, "text": "Added this in intro but the major problem is it does not work with github it only works with edge . I even tried ai multiple time fixing it but it could be so i added if it doesnt play the main page will open."}, {"post_id": 80139, "ts": "2026-10-16T11:03:06Z", "hours": 0.8494, "text": "Ran into a issue i cant fetch nasa api now . I even tried using new api and in old project still its not working i guess due to recent nasa api changes."}, {"post_id": 79748, "ts": "2026-10-15T08:38:11Z", "hours": 1.7669, "text": "I have added direct link to github , nasa news and google search . Also added live clock . Will be adding nasa api key for background images."}]...
|
Title: Space Tab by @saatvik_270211 | Stardance
D Title: Space Tab by @saatvik_270211 | Stardance
Devlogs:
I have added direct link to github , nasa news and google search . Also added live clock . Will be adding nasa api key for background images.
Ran into a issue i cant fetch nasa api now . I even tried using new api and in old project still its not working i guess due to recent nasa api changes.
Added this in intro but the major problem is it does not work with github it only works with edge . I even tried ai multiple time fixing it but it could be so i added if it doesnt play the main page will open.
I updated the background and fixed some issues.
Ships:
#Space Tab A new space inspired tab #Features Live clock -Google Search : allow you to search anything inside it. -Github and Nasa News -Stardance , GitHub , Google and Youtube icon. -Blurry background Hope you like and enjoy it :D...
|
1792741757.8752136
|
1792828157.8752136
|
|
70714
|
priyanshu's site by @kpk22128 | Stardance
|
kpk22128
|
0
|
0.33
|
0
|
[]
|
[{"post_id": 81396, "ts": "202 [{"post_id": 81396, "ts": "2026-10-21T03:35:26Z", "hours": 0.3261, "text": "Made the homepage design using html and css and minimal js. Working on next sections."}]...
|
Title: priyanshu's site by @kpk22128 | Stardan Title: priyanshu's site by @kpk22128 | Stardance
Devlogs:
Made the homepage design using html and css and minimal js. Working on next sections....
|
1792554445.7592695
|
1793159245.7592695
|
|
69244
|
Fort-os by @mason_davies | Stardance
|
mason_davies
|
2
|
9.0
|
20
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-21T04:15:21Z", "hours": 4.0, "multiplier": 5.14, "payout": 20, "blessing": "neutral", "text": "For this ship I updated some of the apps so that they look a little better and then I also made: Search engine (Google) Tracker app Recent Apps Page Welcome page only opens on your first time Notes save between sessions", "repo": "https://github.com/MasonDavies/my-os", "demo": "https://masondavies.github.io/my-os/"}, {"ship_num": 2, "ts": "2026-10-12T06:47:17Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Fortnite Inspired Web OS that has 2 apps: An App for taking notes for strategy and an app that you can paint on and clear to plan your game out. It also displays the current date and time in the top right corner", "repo": "https://github.com/MasonDavies/my-os", "demo": "https://masondavies.github.io/my-os/"}]...
|
[{"post_id": 81399, "ts": "202 [{"post_id": 81399, "ts": "2026-10-21T04:10:42Z", "hours": 3.8092, "text": "I missed a couple devlogs so I’ll just put everything from the last few sessions here because Its ready to ship. What I worked on Killing Bugs Recent apps system in the Home window. Prevented duplicate apps in the recent apps list. Removed Top Bar and replaced it with a taskbar on the bottom Bottom Bar shows currently opened apps App that directly connects to Fortnite tracker Search engine app Button to full screen apps that are able to"}, {"post_id": 78960, "ts": "2026-10-12T06:02:42Z", "hours": 0.9631, "text": "Final touches: Made a paint app where you paint on the current season’s map Made Making new apps even easier by making it into 1 function Arranged the apps into rows"}, {"post_id": 78950, "ts": "2026-10-12T05:01:33Z", "hours": 1.2281, "text": "What I did this time around: Created First app: Strategy Notes Made new functions for making windows easier Top Bar always on top The window that you last interacted with will be on top of the other windows"}, {"post_id": 78945, "ts": "2026-10-12T03:39:35Z", "hours": 2.0761, "text": "After 2 hours of experimenting with styles and JavaScript, here’s what I got done this time: Added a top bar that has the OS name, date, and time Added welcome window Added new styling file to hold the styles for each class Made windows draggable and closable"}, {"post_id": 78905, "ts": "2026-10-12T00:15:15Z", "hours": 0.3942, "text": "I started creating the welcome screen for my operating system. I decided to make it Fortnite themed because It’s my favorite video game. What I did: Added Fortnite picture from chapter 2 Styled body text Changed the background color"}]...
|
Title: Fort-os by @mason_davies | Stardance
Devlo Title: Fort-os by @mason_davies | Stardance
Devlogs:
I started creating the welcome screen for my operating system. I decided to make it Fortnite themed because It’s my favorite video game. What I did: Added Fortnite picture from chapter 2 Styled body text Changed the background color
After 2 hours of experimenting with styles and JavaScript, here’s what I got done this time: Added a top bar that has the OS name, date, and time Added welcome window Added new styling file to hold the styles for each class Made windows draggable and closable
What I did this time around: Created First app: Strategy Notes Made new functions for making windows easier Top Bar always on top The window that you last interacted with will be on top of the other windows
Final touches: Made a paint app where you paint on the current season’s map Made Making new apps even easier by making it into 1 function Arranged the apps into rows
I missed a couple devlogs so I’ll just put everything from the last few sessions here because Its ready to ship. What I worked on Killing Bugs Recent apps system in the Home window. Prevented duplicate apps in the recent apps list. Removed Top Bar and replaced it with a taskbar on the bottom Bottom Bar shows currently opened apps App that directly connects to Fortnite tracker Search engine app Button to full screen apps that are able to
Ships:
I made a Fortnite Inspired Web OS that has 2 apps: An App for taking notes for strategy and an app that you can paint on and clear to plan your game out. It also displays the current date and time in the top right corner
For this ship I updated some of the apps so that they look a little better and then I also made: Search engine (Google) Tracker app Recent Apps Page Welcome page only opens on your first time Notes save between sessions...
|
1792817503.3165936
|
1792903903.3165936
|
|
5414
|
Penumbra by @NellowTCS | Stardance
|
NellowTCS
|
0
|
26.21
|
0
|
[]
|
[{"post_id": 81410, "ts": "202 [{"post_id": 81410, "ts": "2026-10-21T05:19:48Z", "hours": 2.3336, "text": "SO GUESS WHAT I made a PR to big Slint itself!!!! https://github.com/slint-ui/slint/pull/14292 Basically… the markdown editor that Penumbra uses… is bad cause it’s a block style editor, which itself is hard to implement, and it’s not designed for markdown WYSIWYG. Double whammy Solution? Uhhh use cosmic-text and MAKE IT MYSELF BABYEEEEE In all seriousness tho, COSMIC text is so peak, truly universe-breaking. Well what’s the PR then? “This PR lets a FocusScope act as an input method (IME) client. That way, custom editing surfaces like rich text editors or code editors drawn with custom code can get composition events directly.” Aka, I stabilized an internal API and exposed it so that Penumbra can get a really cool editor."}, {"post_id": 77678, "ts": "2026-10-07T20:22:32Z", "hours": 0.4192, "text": "Engine improvements ughhhhhhh i spent hours making “spikes” (is that what they’re called?) and it wasn’t counted cause slint live preview/editor = not hackatime-d sighhhh Oh well btw, hi, sorry for the random 1 month ish gap I come back, better at Slint, and with fresh motivation. okay so august 30 was my last commit and it is now october. in my defense i did not touch this once in that whole time which is either very bad or very healthy idk. but something clicked today and i opened it back up and immediately went “ew who wrote this” (me. it was me.) cough cough better engine so the editor had this whole situation in doc.rs where Document::new would parse the markdown into an ast, and then i had this convert_blocks function that walked through the blocks AND a second function called find_block_range that literally scanned the source bytes by hand looking for double newlines to guess where each block started and ended. like manually. byte by byte. offset += whatever. i genuinely cannot believe past me looked at that and went yeah ship it the thing is the parser already KNOWS where every block is. it has the offsets. it was just throwing them away and then i was reconstructing them with a worse, slower, buggier version downstream. so i added parse_blocks_offsets to the markdown parser so it just hands back (block, range) and now doc.rs is like. map over them, pull the range straight off, extract spans, collect. that’s it. find_block_range is gone. convert_blocks is gone. good riddance :3 also killed the edita-core dependency because it turns out i wasn’t actually using it for anything, it was just sitting in the Cargo.toml being decorative net result is like 1290 lines deleted vs 793 added which is my favorite kind of commit. deleting code that you wrote and were briefly proud of is so good for the soul hahaaaaa anyway the engine is better now (cough cough not)"}, {"post_id": 58558, "ts": "2026-08-31T00:22:35Z", "hours": 0.5133, "text": "Component library + live typing preview two things this commit first I pulled all the Slint components out of penumbra-ui into their own crate, penumbra-component. it’s a pure-markup library, no Rust logic, just .slint files: the Theme, all the block components (ProseBlock, HeadingBlock, QuoteBlock, CodeBlock, TableBlock, FootnoteBlock, HtmlBlock), the CanvasSurface, the TopBar, and PillButton (which used to be NewNotePill but I generalized it so it takes a text prop instead of hardcoding “New note”). there’s an index.slint that re-exports everything and now the app imports from @penumbra-component/index.slint like a real library. also why I did this: the live preview. I set up a slint library path in build.rs (and a .vscode/settings.json so the preview resolves @penumbra-component ), which means I can open any single component file and preview it in isolation instead of booting the whole app. given that basically all my UI work these days IS sitting in the preview nudging things, having the components be individually previewable is a massive quality-of-life win. also just cleaner, the editor-panel.slint used to have all seven block components copy-pasted inline at the top, like 200 lines of it, and now it just imports them. the VMs (BlockVM, NoteCardVM) moved to a data.slint too so the struct definitions aren’t tangled with the theme. second thing, and this is the fun one live preview while you type. before, the active block was just a raw text field, you’d type # Heading and see # Heading , and only once you clicked away did it render. now as you type, a little preview well under the input shows what the block WOULD render as, live. type # and it previews as a heading, type > and it’s a quote, type - and it’s a list. there’s a whole set of live_ functions (live_kind_name, live_display_text, live_heading_level, estimate_live_height) that route the currently-typed text through the same display logic the inactive blocks use, so you get instant feedback on your markdown without committing it. But it’s broken and weird and not working (see previous image) gosh might take a break from this and think about how to structure it again, Je n’aime pas ce désordre"}, {"post_id": 58501, "ts": "2026-08-30T22:41:02Z", "hours": 0.4378, "text": "Better editor the editor got a real display layer, and honestly most of the actual work here happened in the Slint live preview, just tweaking things until they looked right, so the hours logged don’t reflect it. same story for the last few commits, tbh, a lot of “sit in the preview and nudge” that Hackatime doesn’t see. oh well. anyway the thing that makes an editor feel like an editor is that the active block shows raw markdown but every other block renders nicely, and the piece that does that rendering is the new display module. it turns each block into the text you actually want to see. lists keep their markers because those go through the real markdown renderer. and tables, tables actually render as an aligned grid now, padded columns and a --- separator row, which looks so much better. there’s also scroll targeting given the active block, it works out where to scroll the editor so that block is comfortably in view. first block sits at zero, later blocks scroll proportionally, long bodies don’t leave you editing something off the bottom of the screen. wrote a chunk of tests for all of this the map got a zoom-to-card thing too click into a note and the camera zooms so the card fills the viewport width it’s great that’s what i wanted since the beginning tbh like that animation played in my head"}, {"post_id": 58472, "ts": "2026-08-30T21:47:00Z", "hours": 0.6044, "text": "Implement platform-specific modules approach like Saikuro okay so the ui/penumbra-ui/src/lib.rs had gotten GROSS. it was this soup of #[cfg(not(target_family = \"wasm\"))] and #[cfg(target_family = \"wasm\")] blocks sitting right next to each other, two versions of half the functions, the SharedState struct declared twice, the boot path forked inline. every time I added a thing I had to add it twice with the right cfg gate and it was exactly the kind of mess I swore off on day one. so I stole the pattern from Saikuro a platform module. now there’s src/platform/mod.rs that declares the shared interface, plus platform/native/mod.rs and platform/wasm/mod.rs behind one cfg switch at the top. the rest of the app just calls into platform:: and doesn’t care which one it got. all the two-versions-of-everything nonsense is now contained in exactly two files that never both compile at once, and lib.rs reads like a single coherent app again instead of a choose-your-own-adventure. it’s so much cleaner. while I was in the editor I also killed a dumb duplication: penumbra-editor had its OWN BlockKind enum that was just a lossy copy of the one in penumbra-markdown, with a whole block_kind() function to convert between them. why. they’re the same concept. so now the editor re-exports markdown’s BlockKind and clones it straight through, and that whole translation layer is gone."}, {"post_id": 57850, "ts": "2026-08-30T04:54:28Z", "hours": 0.5797, "text": "Broken but a working ish editor!!! you can WRITE in it now. like actually type words into a note and have them save. it’s janky but it works and I’m hyped. How the editor is block-based, which was the whole gamble. instead of one big textarea, a note is parsed into blocks (paragraphs, headings, code fences, etc) and you edit one block at a time. the active block shows its raw markdown so you can mess with the syntax, everything else renders. new session.rs in penumbra-editor holds all of it: EditorSession owns the list of BlockEdits, tracks which one’s active, and each block has a mode, Prose (renders as markdown, Enter splits into a new block), Heading (single line, Enter drops the tail into a paragraph below), and Raw (code, Enter is a literal newline). splitting a block at the cursor, merging, undo/redo with a 64-deep snapshot history. it’s a real little document editor. uhhh is it good? no! the commit message says “broken” and I mean it. the split logic has edge cases, the cursor does weird things, switching blocks is finicky. but you can open a note, type, and it round-trips to the markdown file on disk, which is the bar I set and it clears it. barely. hehe. yeah state is hard to make the editor and the layout worker both able to touch the graph, Universe’s graph is now an Arc<Mutex>. graph() hands back a guard, graph_handle() hands back the Arc for things that want to hold their own lock. had to sprinkle lock_graph() everywhere but it’s the honest cost of sharing state between the UI thread and the physics thread. oop forgot about this also implicit links persist now! the auto-associated links used to evaporate on restart because only explicit wikilinks got rebuilt from the files. now they save to their own file and get restored on open (skipping any whose notes are gone). so the constellations you didn’t draw by hand survive a relaunch too. eeh and the TODO… got GUTTED. so much got checked off I almost don’t believe it. Slint UI: done. map canvas v1 with pan/zoom/grid/edges/culling: done. spring animation so cards drift to their spots instead of teleporting: done. local neighborhood layout: done. pinned notes as fixed stars (pin via right-drag, right-tap to unpin, and left-dragging one nudges it back toward its pin): done. positions cached with throttled save + save-on-exit: done. physics running off the UI thread on the tokio runtime so the map doesn’t stutter while it’s solving: done. that whole “Slint” section of the roadmap is basically green now. new-note-pill.slint got added too, a little floating “new note” thing that’s partially broken. broken editor, but a broken editor that WORKS, which three months ago I could not have said about any part of the UI. we’re so back :3"}, {"post_id": 57602, "ts": "2026-08-29T20:07:38Z", "hours": 1.21, "text": "neighborhood steps actually mean something now so way back, I wrote step_neighborhood as a function that… just called step() . full graph. every time. with a little // Note: functionally equivalent to step() comment that was basically an “it’s fineeee” for now. it’s been sitting there mocking me… for months (no joke i had it at #1 on the mental todo after deleting Dioxus) not anymore! it does the real thing now. when you nudge one note, only the notes within ~400px of it recompute. everything past that radius stays frozen and acts as an anchor so the local cluster settles against the rest of the map instead of the whole universe re-jiggling every frame. this is the “atomic graph updates” idea from the original plan thing, finally real: touch one note, its neighborhood adjusts, the far-off constellations don’t even notice. Efficiency to make that not-slow I built a spatial hash. uniform grid, bucket nodes by cell, “give me everything within radius R” only checks the overlapping cells instead of all N nodes. the CPU layout uses it for the localized force pass (repulsion from local neighbors, springs to actual link partners even if they’re outside the neighborhood, gravity), and I also went back and ripped the O(n²) all-pairs loop out of the regular collision resolver and put it on the spatial hash too. that one was quietly quadratic this whole time and would’ve melted at a couple thousand notes. rebuild the hash each pass so pushed nodes land in their new cells. much better. Collisions? the collision resolver got a neighborhood-scoped twin as well, so a local step also only de-overlaps locally. nodes inside the neighborhood push each other apart normally; a node that’s an anchor outside it doesn’t move, so the inside node just gets shoved twice as hard away from it. felt like the right call. PERSISTENCE?! also taught storage about pins, separate workspace.pins.json file (refactored the workspace/pins file openers to share a state_file helper), and note cards carry a pinned flag now. Oh lines and there’s a whole new map module in the UI crate that generates the actual SVG-ish path strings: bezier edges between linked cards in screen coordinates, viewport culling so off-screen edges don’t get drawn, selected-neighborhood highlighting (the selected note’s edges render in the “selected” layer, everything else in “base”), and a grid path that anchors to the camera and clamps its own density so zooming way out doesn’t try to draw ten thousand grid lines. the map handling a lot of notes without choking was the thing I was VERY, VERY worried about. Not as much of a problem as I thought! :D"}, {"post_id": 55387, "ts": "2026-08-27T05:58:52Z", "hours": 0.3494, "text": "the map is alive You might wonder, why is bro devlogging so often? Wellll, i had this whole plan i wrote down a bit ago to commit when so that it’s not a 10000 line commit ( shudders in that happening before ) but I severely overestimated how long these things would take Most of the time not logged was testing, sigh i wish i could devlog that lolll hehe okay so the notes actually live on a map now. like they have positions, computed by the real layout engine, and you can drag the whole thing around and zoom. it’s a canvas!! a real one!! what and how so on boot (native), it spins up the LayoutEngine, drops every note in as a node, restores their saved positions if there are any, feeds in the links, and runs the layout to settle everything. then it builds two things for the UI: note cards (with x/y from the layout) and edges (lines between linked notes, computed from the endpoint positions). both get shoved into Slint models and the map renders them. add a new note and it gets added to the layout, re-stepped, and the cards + edges refresh. positions save back to storage when you close the app. the map-canvas. slint got the fun part: pan and zoom. a TouchArea catches pointer down/move to drag the camera around, scroll wheel zooms between 10% and 500%, and every card positions itself as (card.x - camera) * zoom. threw in viewport culling too so cards way off-screen just don’t render (visible: only if it’s within ~200px of the edges). and a little “N notes | zoom: X%” readout in the corner because I like knowing things. (it’s broken like most of this, we ignore that for now, polishing is later) my foolishness the whole thing is cfg-split for wasm because the GPU layout engine isn’t wired up on the browser side yet, so wasm gets a fallback that just lists the cards without real positions for now. desktop gets the full living map, browser gets the placeholder, both compile, nobody’s angry. (the wasm map is a TODO-shaped hole but it’s an silly one.) also had to expose universe.storage() so the UI can reach load_positions/save_positions, and added a small EdgeVM struct to carry line endpoints into Slint."}, {"post_id": 55282, "ts": "2026-08-27T00:34:04Z", "hours": 1.04, "text": "lock in (the UI exists now. for real this time.) hehe okay. LOCK IN. this is the one where Penumbra stops being a really nice backend with no face and becomes an actual app you can look at. Slint UI, real components, and I wrote my own text editor because of course I did.so the editor. new crate, penumbra-editor. I could’ve just shoved a <textarea> equivalent in and called it a day but nooo, I wanted a proper block-based editor like the good note apps have. so it’s a document model made of blocks, each block has styled spans, and you edit it through commands: InsertText, DeleteRange, SplitBlock, MergeBlocks, SetMark, MoveCursor. every command goes through a Journal that’s just a command list + a pointer, which means undo/redo falls out for free (truncate on new push, walk the pointer back and forth). there’s a cursor/selection model and a view_model that snapshots the doc into something the UI can render without touching the guts. it’s BROKEN AND WEIRD NOW BUT IT’LL GET BETTER I PROMISE the layout engine grew a CPU brain. it was originally GPU-only via that vibe-graph-layout-gpu crate, which is great until you’re in an environment with no WebGPU (like… a lot of places, including some wasm setups) and then it just returns zero displacement and everything sits in a sad pile. so now there’s cpu.rs, my own Barnes-Hut quadtree force layout in plain Rust, and the engine tries GPU first and falls back to CPU when there’s no backend or the GPU step fails. no more “works on my machine with a discrete GPU only.” graceful degradation, hehe. and then the actual Slint UI which is the thing. it’s great. it’s split into real components now: theme.slint for the tokens, top-bar.slint, map-canvas.slint for the graph, note-card.slint for the cards, editor-panel.slint for writing. app.slint wires it together. this is the part that broke my brain in Dioxus for literal months and in Slint it’s just… a file with a live preview and it looks how I tell it to. I keep waiting for the catch. haven’t hit it yet tests too NO JINXING ME (please) I don’t want to jinx it but. this feels like the first time Penumbra is actually the thing I pictured back in that architecture-day devlog. backend I’m proud of, a UI that doesn’t fight me, my own editor, works on GPU or CPU, desktop or browser. I locked in :3"}, {"post_id": 54855, "ts": "2026-08-26T01:08:02Z", "hours": 0.5314, "text": "working wasm version and candle it runs in the browser now!! like, actually. wasm target, Slint rendering to a canvas, the whole thing. I’ve been dreading the wasm build this whole project and it just… went. mostly. the big win here is model caching, because downloading a ~130MB embedding model every single page load is obviously insane. so there’s a model_cache module now that’s the same two functions (get/put) with two backends behind cfg: native writes the bytes to a temp dir, wasm shoves them into the browser’s Cache API. first launch downloads and stashes, every launch after just pulls from cache. same idea as before but now it works on both sides. to make that clean I split CandleEmbedder::load() into two pieces: from_bytes() that takes raw model/config/tokenizer bytes and builds the thing, and load() (native only) that downloads then calls from_bytes. so the wasm path can grab bytes from cache (or fetch them itself) and hand them straight to from_bytes without the reqwest download dance. Candle running on CPU in wasm, no GPU, producing the same 384-dim vectors. genuinely did not expect that to just work. the wasm caching code is… a lot of JsFuture and dyn_into and web_sys ceremony. open the cache, build a Request, match it, pull the arraybuffer, convert to a Uint8Array, to_vec. and the put side builds a fake 200 Response with the bytes as the body and stuffs it in. it’s verbose but it’s the standard, nothing clever. the UI crate is a cdylib now (plus rlib) so it can compile to wasm, tokio features got split per-target (no rt-multi-thread in the browser, obviously), and there’s a tiny index.html that just imports the generated js and calls init(). Slint paints onto a <canvas id=\"canvas\"> also wrote an inference benchmark test… all you need to know so yeah. desktop AND browser, same codebase, real ML embeddings on both. the “true cross-platformity” thing from the very first devlog is… actually real now? that rule I set on day one about no #[cfg] in the interfaces paid off HARD here, the only cfgs are tucked inside the cache and download internals where they belong."}, {"post_id": 54829, "ts": "2026-08-25T23:56:18Z", "hours": 0.775, "text": "Vault mode (aka I made it Obsidian now, basically) okay this is a big (foundational) one so up until now Penumbra stored notes as a big pile of JSON blobs plus a graph.json that held all the links. which works but it’s… a black box? you can’t open your notes in anything else, the links live in a separate file, it’s very “my app owns your data.” and that bugged me. so now it’s a vault with markdown files. one .md per note, filename = title, YAML frontmatter for the id/timestamps/tags/pinned/archived, and the body is just… markdown. you could point Obsidian at the folder and it’d basically work. that’s the goal. well. the other way around but still :P Also, links aren’t stored anymore, they’re derived. [[wikilinks]] in the body get resolved against filenames at scan time and become the explicit edges in the graph. no more graph.json. the files ARE the source of truth, and if the app crashes mid-write the next scan just repairs everything. I like that a lot. it means if you go edit a file in some other editor and add a [[link]] , Penumbra picks it up next time it scans. and then I fell down the rename rabbit hole. because if filename = title, renaming a note means renaming the file AND rewriting every [[old title]] across the whole vault to [[new title]] . so propagate_rename walks every note that linked to the old title and rewrites it. and the rewriter is suuuuuuper careful: it skips inline code, fenced code blocks, indented code, handles [[Old|alias]] , matches case-insensitively but keeps whatever case you typed. wikilinks inside `code` should NOT get rewritten and now they don’t, and I have a test that proves it (with the same link four times in different contexts, only the live one changes). very satisfying. filenames can have slashes and colons and emoji and whatever, so there’s a sanitizer that strips the illegal stuff, collapses whitespace, caps length, falls back to “Untitled” if you somehow title a note with just dots. and if two notes want the same filename you get “Same Name” and “Same Name 2” like every sane file manager. oh and frontmatter tags vs inline tags are kept separate on purpose. if you wrote #tag in the body, that stays inline, it doesn’t get hoisted up into the YAML just because Penumbra touched the file. only frontmatter tags round-trip through YAML. respecting the user’s file, basically. the parser also got some unicode love while I was in there. tags can be #Ünïcodé now and nested like #projects/penumbra , and the whole split_text_for_custom walk steps by char instead of byte so it stops potentially panicking on multi-byte stuff. should’ve been like that from the start but oh well. on the UI side: there’s a folder picker now! rfd native dialog, “Choose your Penumbra vault”, and it remembers your choice in a config file so it doesn’t nag you every launch. also reads a PENUMBRA_VAULT env var if you want to override. getting the macOS dialog to behave was its own thing because rfd has to run on the thread that owns NSApplication, so it marshals onto the Slint event loop and sends the result back over a channel. the browser build just uses OPFS for now, showDirectoryPicker slots in later (TODO left in the code, future me’s problem). wrote a whole pile of tests for all of it too, but that’s booooriinnnngggggggggggggggggg"}, {"post_id": 54252, "ts": "2026-08-25T04:29:47Z", "hours": 0.3686, "text": "Basic template so. Slint. I was gonna do the whole “design it in HTML first then port it” thing that I very wisely declared last time and then, naturally, did not do at all. instead I saw Slint had a live preview and its own markup language and yeah. here we are. and it’s actually fun?? like it has a real preview, you edit the .slint file and it just updates, no recompiling the entire universe to nudge one thing. after the Dioxus months this feels illegal. anyway before touching any actual UI I made penumbra-app, which is NOT the UI, it’s the brain. a Universe struct that holds the graph + storage + event bus and does all the note stuff: create, save, delete, restore on open, persist after every change. the whole point is it doesn’t know Slint exists. or Dioxus. or anything. it just… runs the app, and whatever draws on top pokes it and listens for events. so if I rage-quit Slint in three weeks (I won’t! probably.) the brain doesn’t care. the actual Slint crate (penumbra-ui) is barely anything yet. cargo.toml, a build.rs because Slint compiles the markup at build time, a main, one app.slint. it’s the hello-world stage. but it launches! natively! no webview! I cannot stress how nice it is to not have a webview. oh also storage stuff got nudged, everything lives under a Penumbra/ folder now instead of just yeeting files into the shared app-data dir like a menace. and added a with_dir() so tests stop writing to my real data. speaking of, wrote a pile of Universe tests: make a note, drop the whole universe, reopen from the same folder, is the note still there? yes. edit it, reopen, still edited? yes. delete it, reopen, gone? gone. persistence actually persists, turns out. months since the last commit lol. I saw the date and just sighed. but the backend was sitting there perfectly fine this whole time waiting for me to stop fighting UI frameworks, and now I’ve got a clean core library and a toolkit that doesn’t actively hate me! Gasp. good place to be back :3"}, {"post_id": 54168, "ts": "2026-08-25T01:00:31Z", "hours": 3.7617, "text": "Revert Dioxus That’s the sound of me… giving up Giving up on Dioxus cause it’s so SO difficult to use I’m using Slint now, maybe, we’ll see if i even remember what I was doing Sorry for the like bad devlog, but it needed to be done"}, {"post_id": 7671, "ts": "2026-06-12T20:22:40Z", "hours": 2.7214, "text": "the polish commit (that didn’t polish enough) okay so this commit looks massive and impressive on paper. I touched basically everything. and the code changes are real. but I need to be honest: the app still looks and feels terrible. like, genuinely bad. the UI is broken in ways that make me want to close the window and pretend I never opened it. but the changes are real so let me document them anyway. layout tuning repulsion went from 1000 to 8000, attraction from 0.01 to 0.004, ideal_length from 50 to 220. notes were clumping into an unreadable blob. the physics are better now even if you can’t tell because the rendering is fighting itself. theme overhaul flattened the entire theme system into one struct with semantic names. every hardcoded color replaced with CSS vars. dark and light themes. toggle in settings. this part actually works correctly and I’m proud of it even though nobody can see it because the layout is broken. TipTap editor replaced the textarea with TipTap via JS eval. StarterKit with bold/italic/strike/code/headings/lists. toolbar with format buttons. sends HTML back via dioxus.send(). this is genuinely nice when it works. which is actually most of the time wow. manual linking, note list, auto-linking on save, context menu, keyboard shortcuts, zoom controls, empty state all implemented. all technically functional. all look like they were designed by someone who has never seen a GUI before. (me. I’m that someone. i am not good at RSX, which is funny because it SHOULD just be a different form of HTML. you would think.) what I learned dioxus-desktop’s webview is not a browser with devtools. iterating on UI by recompiling a Rust binary every time you move a div 2 pixels is actual torture. I should have designed the UI in plain HTML first, gotten it looking right in a real browser with real devtools, and THEN ported it to rsx. I did not do that. I have been doing it backwards this entire time. smh my silly head. next step: HTML mockup first, then port. the backend is solid. the architecture is clean. the UI just needs to catch up. still broken but less broken than before. progress? maybe? onwards (to HTML mockups) :}"}, {"post_id": 7339, "ts": "2026-06-12T07:31:52Z", "hours": 1.2225, "text": "making it actually work (kind of) so remember how last commit I said “everything is broken”? I spent tonight fixing the worst of it. it’s not done but it’s a lot less broken. the big fix: drag + layout fighting the core problem was that when you drag a note, the layout engine keeps running and overwriting your drag position every 16ms. the note jitters back and forth between where you’re dragging it and where the physics wants it. fix: new SetNodePosition event. when you drag a note, the UI publishes it through the event bus. the layout worker drains these events at the top of each cycle and calls engine.set_position() before stepping. so the layout engine knows where you put the card and computes forces from there instead of fighting you. also: while any note is being dragged (tracked by dragged_set ), the layout event loop skips updating positions entirely. other notes stay still instead of jittering from stale force calculations. once you release, everything syncs up again. mouse events moved to root div pan/drag/mouseup handlers were on the canvas element, which meant releasing the mouse over a note card didn’t fire mouseup on the canvas. dragging would “stick.” moved all the move/up/leave handlers to the root div so they fire regardless of what’s under the cursor. canvas renderer simplified removed the node drawing code from WebCanvasRenderer entirely. nodes were being drawn twice: once on the canvas in Rust/web-sys, once as DOM cards in Dioxus. the canvas now only draws the dot grid and bezier edges. the DOM handles cards. no more double rendering. the inline JS RAF loop was also replaced with a standalone canvas-draw.js that gets called explicitly via window.__penumbra_draw() whenever render state changes. no more requestAnimationFrame spinning at 60fps when nothing changed. spring-animated card positions cards now spring-animate to their new positions instead of teleporting. each AnimatedCard tracks target x/y and animates via dioxus-motion springs when the target changes. so when the layout engine repositions notes, they glide smoothly. the spring from the ideas issue, basically. sidebar panels are real now the floating sidebar buttons actually do things now. four panels: Search : reactive search input that queries the hybrid search engine as you type. results show title, preview, and similarity score. click a result and the camera drifts to that note. Tags : shows all tags sorted by count. click a tag to filter the graph view to only notes with that tag. click again to clear the filter. below the tag list, shows the filtered notes. Pins : lists all pinned notes. click to pan to them. Settings : just shows note count and link count for now. placeholder. context menu on right-click right-click a note card and you get a context menu with “Open in editor,” “Pin to canvas” / “Unpin,” and “Delete note.” the pin toggle calls a new toggle_pin method on AppState that flips the meta flag, persists, and publishes an event. note cards render markdown NoteCard preview now runs through markdown_to_html() and uses dangerous_inner_html . (XSS? yes) the editor got a preview toggle button that switches between the textarea and rendered HTML. real embeddings on init switched from SimpleEmbedder to CandleEmbedder::load() at startup. downloads the real Snowflake model from HuggingFace on first launch. falls back to SimpleEmbedder if the download fails. position persistence the layout event loop now debounce-saves positions to storage every 2 seconds. on next launch, saved positions are fed into the layout engine before the first step so notes start where you left them instead of random positions. other stuff done as well but i’m eepyyyy"}, {"post_id": 7297, "ts": "2026-06-12T05:02:24Z", "hours": 3.4467, "text": "the Dioxus commit (it’s broken but it exists) okay so. it does not work properly. I want to be upfront about that. it compiles, it launches, things appear on screen, but the interaction is janky, the canvas rendering fights with the DOM cards, and the layout worker doesn’t sync positions correctly yet. it’s a WIP commit and I’m committing it anyway because there’s genuinely a lot of infrastructure here and I don’t want to lose it. three new crates penumbra-theme : dark and light themes defined as Rust structs. colors, radii, glass blur config. to_css_vars() generates the full CSS custom properties string so the theme can be injected into the DOM at runtime. purple accent because penumbra means shadow and shadows are purple, obviously. penumbra-canvas : a GraphCanvasRenderer trait with a WebCanvasRenderer that draws to an HTML canvas via web-sys. dot grid background, bezier curve edges between nodes, rounded-rect cards with titles. plus a NullCanvasRenderer for when there’s no canvas available. the RenderState struct holds the camera, nodes, edges, and selection state. penumbra-thread : cross-platform threading. std::thread on native, wasm_thread on WASM. one #[cfg] block (the only one in the project, and it’s in a platform abstraction crate where it belongs). Worker struct with atomic cancellation flag. spawn_worker() and spawn_detached() helpers. the app Build/ui/penumbra-app/ is a full Dioxus desktop app. the component count looks scary but most of it is from the dioxus-components library (badge, button, card, dialog, dropdown menu, separator, sheet, sidebar, skeleton, tabs, tooltip). I styled them but didn’t write them. the custom ones are: NoteCard : the little frosted-glass card that represents a note on the canvas. title, preview, positioned absolutely in world coordinates. GraphCards : renders all notes as AnimatedCards inside a CSS-transformed container. each card gets a spring animation on mount via dioxus-motion so it scales in from zero. cards are draggable. FloatingSidebar : the vertical icon bar on the left. grid, search, pin, tag, settings. just state toggles for now, no panels wired up yet. TopBar : centered pill bar with the app name and search area. Fab : “New note” button in the bottom right. NoteEditor : full-screen editor view with title, body, and tags fields. auto-saves on back. the bridge bridge/mod.rs connects the UI to the backend. load_graph() and load_positions() pull from storage. restore_state() inserts everything into the graph and index. create_layout_engine() builds the GPU layout engine with all current nodes. start_layout_worker() spawns a background thread that steps the layout at 60fps, syncs node additions/removals, and publishes position updates through the event bus. sleeps longer when the layout has converged. the interaction model pan: mousedown on canvas starts tracking, mousemove applies delta to camera, mouseup stops. zoom: wheel events on canvas adjust zoom level around the cursor position. drag: mousedown on a note card captures the offset, mousemove in drag mode updates the note’s position directly. note creation: click fab -> create empty note in graph -> wait for layout engine to assign position -> camera drifts to the new note (spring animation) -> switch to editor view. this is the flow from the ideas issue. it doesn’t work smoothly yet but the state machine is there. what’s broken everything, kind of. the canvas renderer and the DOM cards are two separate rendering paths that don’t coordinate well. the layout worker publishes positions but the signals don’t always pick them up in time. the camera drift animation triggers but sometimes snaps instead of drifting. the editor saves but doesn’t trigger re-embedding. the sidebar buttons toggle state but nothing happens. it’s a prototype. sigh."}, {"post_id": 7055, "ts": "2026-06-11T20:26:26Z", "hours": 0.7372, "text": "sync conflict detection + wiremock tests two changes in one commit: the sync worker now rejects stale pushes, and the Rust sync client has a real test suite. conflict detection if the client sends a snapshotId with its push, the worker checks it against the current server snapshot. if they don’t match, someone else pushed in between, and you get a 409 back with the current server snapshot ID and a message to pull first. the snapshotId used to be passed through from the client or generated fresh. now it’s always generated server-side. the client’s snapshotId is only used for the conflict check, never as the new snapshot. small change, but it means two clients can’t accidentally create the same snapshot ID. last_sync is now a Mutex WorkerSyncProvider.last_sync went from Option<DateTime> to Mutex<Option<DateTime>> . it gets updated after both push and pull succeed. this matters because SyncProvider is behind an Arc in the real app, and last_sync needs interior mutability. also added #[serde(rename_all = \"camelCase\")] on SyncSnapshot so the JSON fields match what the worker actually sends. wiremock tests 238 lines of new tests using wiremock to mock the HTTP worker. each test spins up a local mock server, registers response expectations, and exercises the WorkerSyncProvider against it. no real network, no real worker, fully deterministic. covers: connect (200 and 500), push (returns snapshot, forwards snapshot ID, handles 500, handles 409 conflict), pull (returns notes/embeddings/positions, sends since query param), status (parses all fields), last_sync (none initially, updated after push). the with_rt() helper builds a single-threaded tokio runtime with IO enabled for each test since wiremock needs async + network. the TODO “Cloud sync” is checked off. one item left: Dioxus UI. aaaaaaaaa"}, {"post_id": 7006, "ts": "2026-06-11T19:14:21Z", "hours": 0.9681, "text": "making Candle actually WASM-compatible so remember the “no #[cfg] in cross-cutting interfaces” rule? the CandleEmbedder was breaking it. not with #[cfg] exactly, but with hf-hub, which uses filesystem APIs (dirs, mmap) that don’t exist in WASM. the model loading was desktop-only and I was pretending that was fine. it was not fine. I fixed it. hf-hub is gone replaced with reqwest. instead of hf-hub’s sync filesystem API that downloads to a local cache directory, the embedder now does raw HTTP GETs to huggingface.co/{model}/resolve/main/{file} . three downloads: model.safetensors, config.json, tokenizer.json. the bytes stay in memory, no filesystem touch. reqwest is platform-conditional in Cargo.toml: rustls on native (no OpenSSL dependency), bare defaults on wasm32 (uses browser fetch under the hood). plus getrandom with the wasm_js feature so random number generation works in WASM. two feature flags instead of one candle now just gives you the model and tokenizer types. no download capability, no reqwest. you construct a CandleEmbedder from bytes you already have. candle-load adds reqwest and the CandleEmbedder::load() method that downloads from HuggingFace. this is the one that pulls in the network stack. the split matters because the WASM build might want to load model bytes from OPFS or a bundled asset instead of downloading every time. the download path is opt-in. mmap is gone too from_mmaped_safetensors (with its unsafe block) became from_buffered_safetensors . loads from a byte vec instead of memory-mapping a file path. works everywhere. no unsafe. the vocab_size is now read from config.json instead of hardcoded to 30522. Tokenizer::from_file became Tokenizer::from_bytes . same pattern. error handling cleanup every candle operation was using ? directly, which only works if PenumbraError implements From<candle_core::Error>. it doesn’t, and it shouldn’t, because candle errors are an implementation detail. added an e_msg helper that wraps any Display into PenumbraError::Embedding, and switched every candle call to .map_err(e_msg)? . verbose but correct. ArcticEmbedXS::new and forward now return candle’s own error type instead of PenumbraError. the boundary between “candle stuff” and “penumbra stuff” is cleaner. the CandleEmbedder wrapper handles the translation. tests New candle tests behind #[cfg(feature = \"candle\")] . the trick: building a synthetic safetensors file and a minimal WordLevel tokenizer entirely in memory. no model download needed for the test suite. test_safetensors() generates fake embedding weights and encoder weights with deterministic values, writes the safetensors header manually (much better than pulling it in) (length prefix + JSON metadata + raw f32 bytes), and hands it to VarBuilder. test_tokenizer_bytes() builds a 10-word vocabulary with a Whitespace pre-tokenizer. tests cover: forward pass output shape, L2 normalization, non-zero output, embedder dimensions, embed_text roundtrip. plus one candle-load gated test that actually downloads the real model from HuggingFace (only runs when you explicitly pass --features candle-load ). the “no #[cfg] in cross-cutting interfaces” rule now holds for real. the entire embed pipeline compiles on wasm32 without conditional compilation. reqwest handles the platform difference internally. candle handles the compute. the embedder trait doesn’t know or care. Quick note, sorry about there mostly being terminal or VSCode images lol, there’s no UI to demo rn…"}, {"post_id": 6950, "ts": "2026-06-11T17:37:50Z", "hours": 0.9322, "text": "the sync backend exists now so the TODO said “Cloud sync” and I was like “how hard can it be” it was not hard actually. which is suspicious. but it works. new directory: Backend/sync-worker/ . it’s a Cloudflare Worker backed by R2 for storage. the whole sync API is three JS files and a wrangler config. the API POST /sync/push - batch upload notes, embeddings, and positions POST /sync/pull - batch download everything (or since a snapshot) GET /sync/status - storage stats (note count, bytes used, 512MB limit) POST /sync/clear - nuke everything plus individual CRUD routes for single notes, embeddings, and positions notes are JSON. embeddings are raw f32 bytes (384 * 4 = 1,536 bytes per note). positions are JSON. everything lives in R2 under a clean key scheme: notes/{id}.json , embeddings/{id}.bin , positions/{id}.json . the storage layer storage.js is the R2 abstraction. getJson, putJson, getBinary, putBinary, del, listKeys. plus a manifest system that tracks note count, last modified time, and the current snapshot ID. snapshots are versioned so the client can eventually do “pull only what changed since X” (right now it just dumps everything, but the plumbing is there). push and pull push accepts a JSON body with notes, embeddings, and positions objects. writes them all to R2, updates the manifest, creates a snapshot record, returns the snapshot ID. pull lists all note keys, fetches each note plus its embedding and position, and returns the whole bundle. embeddings get round-tripped through Float32Array so the binary format is preserved correctly. CORS is wide open ( * ) because this is a personal sync worker, not a public API. the client will be the Penumbra app running in the browser or on desktop. I’ll probably change this tho the generated types file wrangler generated a 14,000-line TypeScript declaration file for the Cloudflare runtime. I committed it because it’s how wrangler works and I don’t want to fight it. it defines the R2Bucket binding and every other Workers API type. it’s big. it’s fine. this is the first non-Rust code in the repo. feels weird. but the sync layer is inherently a server-side thing and Cloudflare Workers with R2 is genuinely the simplest way to get object storage with an HTTP API. no server to manage, no database to provision, just a bucket and some routing. Also, had to kick out usearch since it wasn’t WASM compatible now everything but Candle is WASM compatible!"}, {"post_id": 6928, "ts": "2026-06-11T16:38:23Z", "hours": 0.3536, "text": "auto-linker + TODO overhaul new crate: penumbra-auto-link . 158 lines. this is the thing that makes the canvas feel fun. the pipeline is simple: embed the note, search the vector index for neighbours, create implicit links for anything above the similarity threshold. process_note() takes a Note, embeds its text via the EmbeddingProvider, inserts the embedding into the index (so it’s immediately discoverable by future saves), searches for the top-k closest neighbours, filters by score, checks for duplicates, and creates implicit links in the graph. explicit links are never touched. I don’t mess with your links. (why does that sound funny lol) configurable: top_k (default 10), min_score (default 0.75), max_links per pass (default 5). the AutoLinker holds Arc references to the embedder, index, graph, and event bus. every new link fires a LinkAdded event so the UI can animate the card drifting to its new neighbours. the duplicate check matters. between the search returning results and the link being created, another thread could have already linked the same pair. so it locks the graph, checks if the link exists, and only creates it if it doesn’t. two process_note() calls on the same note produce links on the first call and an empty vec on the second. Some tests in auto_link_matrix.rs : creates implicit links, skips self-links, obeys score threshold, respects max_links cap, handles empty index (no candidates), no duplicate links on re-process, empty body doesn’t panic, top_k=0 returns empty. also cleaned up some stray em-dashes and arrow symbols in comments across the codebase. vscode keeps auto-correcting -- to em-dashes and -> to the arrow symbol and I keep not noticing until I read the diff. idk if it’s a bug or a feature but it’s annoying. the TODO got a real overhaul. the old flat checklist is gone. everything that’s done is removed. what’s left is organized into sections: Dioxus UI plans (spring animations, camera lerp, pinned stars, cached positions), WASM worker threading, storage and sync (Google Drive, GitHub repo, offline mode, merge strategy), and future stuff (encrypted vault). it reads like a roadmap now instead of a grocery list. eleven crates. too much? no. modularity is never “too much,” rather it’s better to be more modular than less. (unless you have something insane like a file per function)"}, {"post_id": 6912, "ts": "2026-06-11T16:12:15Z", "hours": 0.3753, "text": "GPU layout engine + collision avoidance ripped out the entire hand-rolled ForceAtlas2 + Barnes-Hut implementation and replaced it with vibe-graph-layout-gpu. (OMG i do not like that name, you could have called it anything. LITERALLY ANYTHING else) 195 lines of quadtree code: deleted. RIP. the custom ForceAccumulator, NodeState, adaptive speed calculation: all gone. replaced by a wgpu-backed force-directed layout that runs on the GPU. (no it’s not that intensive, only if you have like a million notes, and then too, we be smart and only calculate the stuff for notes you can see (animation and gamedev tip #1) rather than everything! the engine now wraps GpuLayout with lazy initialization. the GPU doesn’t spin up until the first step() call, so construction stays synchronous. if the graph changes (node added, removed, links updated), it sets a dirty flag and re-inits on the next step. pinned nodes get their positions restored after each GPU step since the GPU doesn’t know about pinning. step_neighborhood() is now just step(). with GPU acceleration the full graph is always computed, so neighborhood-only updates don’t make sense anymore. the test got rewritten to match: step_moves_unpinned_nodes instead of the old neighborhood-specific assertions. collision avoidance the GPU handles forces and attraction but it doesn’t know about card sizes. nodes are points to it. so after the GPU step runs, there’s now a CPU-side collision resolution pass that pushes apart overlapping bounding boxes. each node can have a Bounds (width, height) set by the UI. after forces are applied and pinned nodes are restored, resolve_collisions() runs up to 5 iterative passes. each pass checks every overlapping pair, computes a center-to-center separation vector, and pushes both nodes apart by half the overlap distance (clamped to 20px per pass). pinned nodes never move from collision push. the fallback for coincident centers is fun: when two nodes land on the exact same pixel, there’s no center-to-center vector to push along. so it derives a deterministic angle from the node indices using big primes as hash seeds. deterministic because the same pair should always separate in the same direction. not random because randomness in layout makes things jitter. three new tests: overlapping nodes get separated, nodes without bounds are skipped (no crash), pinned nodes stay put during collision resolution. the Cargo.lock diff (image) is… yeah. wgpu pulls in the entire graphics stack. metal, vulkan (ash), naga (oooh fun fact! this is the Hindi name for a bunch of semi-divine half-snake beings!), glow, spirv (pov you try to type spin but absolutely FAIL). the dependency tree roughly tripled. but the layout runs on the GPU now so I’m not complaining. also deleted the test_events.rs example from penumbra-markdown that I forgot to clean up last commit. oops. and also made the LayoutEngine WASM-compatible by making it async. WHOOPS"}, {"post_id": 6897, "ts": "2026-06-11T15:45:08Z", "hours": 0.4114, "text": "penumbra-markdown: the parser arc so I was supposed to work on other stuff today. I did not work on other stuff today. instead I wrote an entire markdown pipeline from scratch. parser, AST, HTML renderer, plain text extractor, streaming layer for live editing, and 639 lines of tests. because apparently “notes app needs notes parsing” was more urgent than “notes app needs to save notes.” No I did not do this in 15 minutes. I spent much more time on it. I’m just, like I said, one commit behind (no longer!!!) the custom syntax the whole point of this crate is two custom inline types that make Penumbra’s markdown different from regular markdown: NoteEmbed : [[some-note-id]] . double-bracket references to other notes on the canvas. the parser tracks bracket depth so nested brackets don’t break things. TagRef : #tag-name . inline tags. the parser distinguishes #tag from # heading by checking if there’s a space after the hash and whether the preceding character is a word boundary. these get parsed as structured AST nodes, not raw text. when the HTML renderer hits them, they become custom elements: <pe-embed data-ref=\"id\"> and <pe-tag data-name=\"name\"> . the Dioxus UI will intercept these and make them interactive (click to pan, click to filter). I know they’re technically also Obsidian things, but smh my head, I did it too the parser 612 lines wrapping pulldown-cmark. every text chunk goes through split_text_for_custom() for embed/tag extraction before hitting the inline stack. uses a frame stack with saved positions for nesting (strong, emphasis, links, etc). tables required a state machine. tight list items needed special flush handling. the usual “markdown is simple until it isn’t” experience. The image shows my excellent idea for inline stuff, as remember how println!() works with vars? Okay, no this is a pretty common thing now that I think about it… sigh. It’s the thought that counts streaming wraps mdstream for live editing. instead of re-parsing the whole document on every keystroke, it tracks which blocks changed and only re-parses those. append() , finalize() , snapshot() , reset() . the common case (typing at the end) is fast. the quadtree fix also fixed a subtle bug in Barnes-Hut. the force calculation was clamping distance AFTER the sqrt but using unclamped dist_sq in the same formula. moved the .max(1.0) to dist_sq so both values stay consistent. the old version could produce weirdly large forces for very close nodes. Yeah this is why i’m ripping it out, and replacing it tests and sanitization boring stuff, just writing the same thing with some tiny changes a lot of times ten crates now. TEN CRATES??!?!!?"}, {"post_id": 6882, "ts": "2026-06-11T15:18:05Z", "hours": 1.2269, "text": "Oh wow I locked in so remember yesterday when I said “today was all architecture, all decisions, all research”? yeah. today I wrote the architecture. all of it. 27 files. 3,795 lines added (1,900 ish is just Cargo.lock btw). one commit. I sat down to “maybe scaffold the embed crate” and then I just… didn’t stop. the hyperfixation hit and I looked up and every single crate had real code in it. not stubs. not //! penumbra-whatever . actual implementations with actual tests. let me try to explain what happened. three embedders walked into a crate (no the title is NOT a punchline to a joke, however much it sounds like one) penumbra-embed went from a one-line comment to three full embedding providers: CandleEmbedder is the real one. it loads Snowflake-Arctic-Embed-XS from HuggingFace Hub, tokenizes input, runs it through a BERT-style forward pass (word embeddings, mean pooling, linear encoder), and L2-normalizes the output into a 384-dim vector. the model weights come from safetensors via candle_nn::VarBuilder::from_mmaped_safetensors . the whole Candle pipeline is behind a feature flag so you don’t pull in the ML universe if you don’t need it. SimpleEmbedder is the clever one. it slides character trigrams across the input, hashes each one, and accumulates them into buckets across a fixed-dimension vector. then L2-normalizes. it’s deterministic, fast, needs zero ML deps, and produces embeddings where similar text actually lands in similar regions of the vector space. not semantically meaningful in the way a transformer is, but way better than random for development and testing. (You know? Well actually probably you don’t know, most people didn’t spend all of yesterday doing a bunch of NLP and ML research lollll) NullEmbedder is the lazy one. returns a zero vector. exists for when you need the trait satisfied but don’t care about the output. sometimes you just need a stub and that’s fine. (aka a lot of tests, DO NOT USE THIS anywhere else… or maybeee hehe /j) all three implement EmbeddingProvider from core. swap them at construction time. the rest of the system doesn’t know or care which one is running. (i love doing that pattern. it’s just the best. Thanks, Saikuro) the vector index penumbra-index wraps USearch with a clean VectorIndex trait: insert, remove, search, len, is_empty. the USearchIndex backend handles all the HNSW configuration. SearchHit carries a NoteId and a score. the trait exists so I can mock the index in tests without spinning up the real HNSW structure every time. (learned that lesson from Honzo’s test suite.) the graph got a cleanup penumbra-graph didn’t get new features but it got a cargo fmt . NoteId lost its redundant to_string() method because… it already derives Display . why did I write that. past me, explain yourself. what were you planning. core got an Index error variant PenumbraError::Index(String) . three lines. because the index crate needed its own error type and I wasn’t going to abuse Embedding for it. the stuff I did but still isn’t fully done the layout engine with Barnes-Hut quadtree (i tried a simpler manual implementation, but it’s icky, i’m switching to a different crate), the hybrid search engine (i should probably switch this to a usearch method or different crate idk), and the storage layer (c’est mostly bon) all got real implementations in this commit too. plus a full test suite: core_matrix.rs , embed_matrix.rs , events_matrix.rs , graph_matrix.rs , index_matrix.rs , search_matrix.rs , storage_matrix.rs . seven test files. the naming convention carries over from Honzo because it works and I’m not fixing what isn’t broken. You might notice that I’m running one commit behind lol. Welllll I am, yeah Ooops Yeahhhh devlogging after every commit is the best way to do it, but sometimes you just wanna code"}, {"post_id": 6676, "ts": "2026-06-11T05:46:06Z", "hours": 0.8864, "text": "The Architecture Day (aka 0.4h on Hackatime but like 10h in reality) So uh. Hi. New project. Today was one of those days where I didn’t really code . Like, Hackatime says 0.4 hours. ZERO POINT FOUR. That’s nothing. But here’s the thing: I spent basically the entire day thinking. Researching. Drawing arrows between boxes in my head. Googling “is candle-core wasm compat” and “best wasm compatible tokio alternative, smol or futures” and going down rabbit holes about OPFS and #[cfg] gates and whether petgraph is pure Rust (it is, thank god). And I think I came out the other side with something actually good? the architecture so Penumbra is a spatial notes app. notes live on a canvas. related notes pull toward each other. unrelated notes drift apart. the whole thing is powered by embeddings and force-directed layout and it should feel like a living map of your thoughts. and the ENTIRE thing needs to work on web AND desktop without platform #[cfg] spaghetti. that’s the rule. no #[cfg(target_arch = \"wasm32\")] in any cross-cutting interface. if I have to write #[cfg] I’ve already lost. here’s what I landed on: penumbra-core # domain types + traits. zero deps beyond serde/uuid/thiserror penumbra-events # async-channel event bus penumbra-graph # petgraph-based graph store penumbra-layout # ForceAtlas2 + Barnes-Hut penumbra-embed # Candle embedding provider penumbra-index # USearch vector index penumbra-search # hybrid search (vector + text + tags + temporal) penumbra-storage # OPFS-backed persistence penumbra-sync # cloud sync abstraction nine crates. for a notes app. am I overengineering this? maybe. do I care? absolutely not. Saikuro taught me that clean crate boundaries make everything easier later. I’d rather have nine small crates with clear jobs than one megacrate that does everything and hates me. (learned never to entangle your code from HTMLPlayer v2 (yeah that still exists, but i kinda need to press the big Archive this Repo button, I’m making a better new one) the dependency flow this is the part I’m actually proud of: everything depends on core. core depends on nothing interesting. the graph feeds into layout. embed feeds into index feeds into search. storage and sync are siblings. events is the bridge to the UI. no cycles. no tangled imports. one-directional flow. I drew this like five times on paper before I was happy with it. (I should really learn to use Mermaid for everything but my paper and pen are faster for brainstorming, sue me) the WASM thing okay so this was the big research rabbit hole. the whole point of Penumbra is true cross-platform. not “it works on desktop and we have a janky web version.” ACTUAL cross-platform. same code. same behavior. same everything. the trick is picking libraries that just… work on both targets without needing platform gates: serde/serde_json : universal. obviously. uuid with the js feature: uses js-sys getRandomValues on wasm32. no #[cfg] . chrono with wasmbind : uses js-sys Date on wasm32. no #[cfg] . futures + async-trait : universal. no runtime dependency. petgraph : pure Rust. no system deps. just works. opfs : this crate is kind of magic. tokio::fs on native, browser OPFS on wasm. one API. the whole reason I don’t need a StorageProvider trait. candle : wasm32 with SIMD backend. Snowflake-Arctic-Embed-XS quantized to GGUF. usearch : wasm32 compatible. HNSW index with add/search/remove. async-channel : universal. no runtime coupling. I am unreasonably happy about this list."}]...
|
Title: Penumbra by @NellowTCS | Stardance
Devlogs Title: Penumbra by @NellowTCS | Stardance
Devlogs:
The Architecture Day (aka 0.4h on Hackatime but like 10h in reality) So uh. Hi. New project. Today was one of those days where I didn’t really code . Like, Hackatime says 0.4 hours. ZERO POINT FOUR. That’s nothing. But here’s the thing: I spent basically the entire day thinking. Researching. Drawing arrows between boxes in my head. Googling “is candle-core wasm compat” and “best wasm compatible tokio alternative, smol or futures” and going down rabbit holes about OPFS and #[cfg] gates and whether petgraph is pure Rust (it is, thank god). And I think I came out the other side with something actually good? the architecture so Penumbra is a spatial notes app. notes live on a canvas. related notes pull toward each other. unrelated notes drift apart. the whole thing is powered by embeddings and force-directed layout and it should feel like a living map of your thoughts. and the ENTIRE thing needs to work on web AND desktop without platform #[cfg] spaghetti. that’s the rule. no #[cfg(target_arch = "wasm32")] in any cross-cutting interface. if I have to write #[cfg] I’ve already lost. here’s what I landed on: penumbra-core # domain types + traits. zero deps beyond serde/uuid/thiserror penumbra-events # async-channel event bus penumbra-graph # petgraph-based graph store penumbra-layout # ForceAtlas2 + Barnes-Hut penumbra-embed # Candle embedding provider penumbra-index # USearch vector index penumbra-search # hybrid search (vector + text + tags + temporal) penumbra-storage # OPFS-backed persistence penumbra-sync # cloud sync abstraction nine crates. for a notes app. am I overengineering this? maybe. do I care? absolutely not. Saikuro taught me that clean crate boundaries make everything easier later. I’d rather have nine small crates with clear jobs than one megacrate that does everything and hates me. (learned never to entangle your code from HTMLPlayer v2 (yeah that still exists, but i kinda need to press the big Archive this Repo button, I’m making a better new one) the dependency flow this is the part I’m actually proud of: everything depends on core. core depends on nothing interesting. the graph feeds into layout. embed feeds into index feeds into search. storage and sync are siblings. events is the bridge to the UI. no cycles. no tangled imports. one-directional flow. I drew this like five times on paper before I was happy with it. (I should really learn to use Mermaid for everything but my paper and pen are faster for brainstorming, sue me) the WASM thing okay so this was the big research rabbit hole. the whole point of Penumbra is true cross-platform. not “it works on desktop and we have a janky web version.” ACTUAL cross-platform. same code. same behavior. same everything. the trick is picking libraries that just… work on both targets without needing platform gates: serde/serde_json : universal. obviously. uuid with the js feature: uses js-sys getRandomValues on wasm32. no #[cfg] . chrono with wasmbind : uses js-sys Date on wasm32. no #[cfg] . futures + async-trait : universal. no runtime dependency. petgraph : pure Rust. no system deps. just works. opfs : this crate is kind of magic. tokio::fs on native, browser OPFS on wasm. one API. the whole reason I don’t need a StorageProvider trait. candle : wasm32 with SIMD backend. Snowflake-Arctic-Embed-XS quantized to GGUF. usearch : wasm32 compatible. HNSW index with add/search/remove. async-channel : universal. no runtime coupling. I am unreasonably happy about this list.
Oh wow I locked in so remember yesterday when I said “today was all architecture, all decisions, all research”? yeah. today I wrote the architecture. all of it. 27 files. 3,795 lines added (1,900 ish is just Cargo.lock btw). one commit. I sat down to “maybe scaffold the embed crate” and then I just… didn’t stop. the hyperfixation hit and I looked up and every single crate had real code in it. not stubs. not //! penumbra-whatever . actual implementations with actual tests. let me try to explain what happened. three embedders walked into a crate (no the title is NOT a punchline to a joke, however much it sounds like one) penumbra-embed went from a one-line comment to three full embedding providers: CandleEmbedder is the real one. it loads Snowflake-Arctic-Embed-XS from HuggingFace Hub, tokenizes input, runs it through a BERT-style forward pass (word embeddings, mean pooling, linear encoder), and L2-normalizes the output into a 384-dim vector. the model weights come from safetensors via candle_nn::VarBuilder::from_mmaped_safetensors . the whole Candle pipeline is behind a feature flag so you don’t pull in the ML universe if you don’t need it. SimpleEmbedder is the clever one. it slides character trigrams across the input, hashes each one, and accumulates them into buckets across a fixed-dimension vector. then L2-normalizes. it’s deterministic, fast, needs zero ML deps, and produces embeddings where similar text actually lands in similar regions of the vector space. not semantically meaningful in the way a transformer is, but way better than random for development and testing. (You know? Well actually probably you don’t know, most people didn’t spend all of yesterday doing a bunch of NLP and ML research lollll) NullEmbedder is the lazy one. returns a zero vector. exists for when you need the trait satisfied but don’t care about the output. sometimes you just need a stub and that’s fine. (aka a lot of tests, DO NOT USE THIS anywhere else… or maybeee hehe /j) all three implement EmbeddingProvider from core. swap them at construction time. the rest of the system doesn’t know or care which one is running. (i love doing that pattern. it’s just the best. Thanks, Saikuro) the vector index penumbra-index wraps USearch with a clean VectorIndex trait: insert, remove, search, len, is_empty. the USearchIndex backend handles all the HNSW configuration. SearchHit carries a NoteId and a score. the trait exists so I can mock the index in tests without spinning up the real HNSW structure every time. (learned that lesson from Honzo’s test suite.) the graph got a cleanup penumbra-graph didn’t get new features but it got a cargo fmt . NoteId lost its redundant to_string() method because… it already derives Display . why did I write that. past me, explain yourself. what were you planning. core got an Index error variant PenumbraError::Index(String) . three lines. because the index crate needed its own error type and I wasn’t going to abuse Embedding for it. the stuff I did but still isn’t fully done the layout engine with Barnes-Hut quadtree (i tried a simpler manual implementation, but it’s icky, i’m switching to a different crate), the hybrid search engine (i should probably switch this to a usearch method or different crate idk), and the storage layer (c’est mostly bon) all got real implementations in this commit too. plus a full test suite: core_matrix.rs , embed_matrix.rs , events_matrix.rs , graph_matrix.rs , index_matrix.rs , search_matrix.rs , storage_matrix.rs . seven test files. the naming convention carries over from Honzo because it works and I’m not fixing what isn’t broken. You might notice that I’m running one commit behind lol. Welllll I am, yeah Ooops Yeahhhh devlogging after every commit is the best way to do it, but sometimes you just wanna code
penumbra-markdown: the parser arc so I was supposed to work on other stuff today. I did not work on other stuff today. instead I wrote an entire markdown pipeline from scratch. parser, AST, HTML renderer, plain text extractor, streaming layer for live editing, and 639 lines of tests. because apparently “notes app needs notes parsing” was more urgent than “notes app needs to save notes.” No I did not do this in 15 minutes. I spent much more time on it. I’m just, like I said, one commit behind (no longer!!!) the custom syntax the whole point of this crate is two custom inline types that make Penumbra’s markdown different from regular markdown: NoteEmbed : [[some-note-id]] . double-bracket references to other notes on the canvas. the parser tracks bracket depth so nested brackets don’t break things. TagRef : #tag-name . inline tags. the parser distinguishes #tag from # heading by checking if there’s a space after the hash and whether the preceding character is a word boundary. these get parsed as structured AST nodes, not raw text. when the HTML renderer hits them, they become custom elements: <pe-embed data-ref="id"> and <pe-tag data-name="name"> . the Dioxus UI will intercept these and make them interactive (click to pan, click to filter). I know they’re technically also Obsidian things, but smh my head, I did it too the parser 612 lines wrapping pulldown-cmark. every text chunk goes through split_text_for_custom() for embed/tag extraction before hitting the inline stack. uses a frame stack with saved positions for nesting (strong, emphasis, links, etc). tables required a state machine. tight list items needed special flush handling. the usual “markdown is simple until it isn’t” experience. The image shows my excellent idea for inline stuff, as remember how println!() works with vars? Okay, no this is a pretty common thing now that I think about it… sigh. It’s the thought that counts streaming wraps mdstream for live editing. instead of re-parsing the whole document on every keystroke, it tracks which blocks changed and only re-parses those. append() , finalize() , snapshot() , reset() . the common case (typing at the end) is fast. the quadtree fix also fixed a subtle bug in Barnes-Hut. the force calculation was clamping distance AFTER the sqrt but using unclamped dist_sq in the same formula. moved the .max(1.0) to dist_sq so both values stay consistent. the old version could produce weirdly large forces for very close nodes. Yeah this is why i’m ripping it out, and replacing it tests and sanitization boring stuff, just writing the same thing with some tiny changes a lot of times ten crates now. TEN CRATES??!?!!?
GPU layout engine + collision avoidance ripped out the entire hand-rolled ForceAtlas2 + Barnes-Hut implementation and replaced it with vibe-graph-layout-gpu. (OMG i do not like that name, you could have called it anything. LITERALLY ANYTHING else) 195 lines of quadtree code: deleted. RIP. the custom ForceAccumulator, NodeState, adaptive speed calculation: all gone. replaced by a wgpu-backed force-directed layout that runs on the GPU. (no it’s not that intensive, only if you have like a million notes, and then too, we be smart and only calculate the stuff for notes you can see (animation and gamedev tip #1) rather than everything! the engine now wraps GpuLayout with lazy initialization. the GPU doesn’t spin up until the first step() call, so construction stays synchronous. if the graph changes (node added, removed, links updated), it sets a dirty flag and re-inits on the next step. pinned nodes get their positions restored after each GPU step since the GPU doesn’t know about pinning. step_neighborhood() is now just step(). with GPU acceleration the full graph is always computed, so neighborhood-only updates don’t make sense anymore. the test got rewritten to match: step_moves_unpinned_nodes instead of the old neighborhood-specific assertions. collision avoidance the GPU handles forces and attraction but it doesn’t know about card sizes. nodes are points to it. so after the GPU step runs, there’s now a CPU-side collision resolution pass that pushes apart overlapping bounding boxes. each node can have a Bounds (width, height) set by the UI. after forces are applied and pinned nodes are restored, resolve_collisions() runs up to 5 iterative passes. each pass checks every overlapping pair, computes a center-to-center separation vector, and pushes both nodes apart by half the overlap distance (clamped to 20px per pass). pinned nodes never move from collision push. the fallback for coincident centers is fun: when two nodes land on the exact same pixel, there’s no center-to-center vector to push along. so it derives a deterministic angle from the node indices using big primes as hash seeds. deterministic because the same pair should always separate in the same direction. not random because randomness in layout makes things jitter. three new tests: overlapping nodes get separated, nodes without bounds are skipped (no crash), pinned nodes stay put during collision resolution. the Cargo.lock diff (image) is… yeah. wgpu pulls in the entire graphics stack. metal, vulkan (ash), naga (oooh fun fact! this is the Hindi name for a bunch of semi-divine half-snake beings!), glow, spirv (pov you try to type spin but absolutely FAIL). the dependency tree roughly tripled. but the layout runs on the GPU now so I’m not complaining. also deleted the test_events.rs example from penumbra-markdown that I forgot to clean up last commit. oops. and also made the LayoutEngine WASM-compatible by making it async. WHOOPS
auto-linker + TODO overhaul new crate: penumbra-auto-link . 158 lines. this is the thing that makes the canvas feel fun. the pipeline is simple: embed the note, search the vector index for neighbours, create implicit links for anything above the similarity threshold. process_note() takes a Note, embeds its text via the EmbeddingProvider, inserts the embedding into the index (so it’s immediately discoverable by future saves), searches for the top-k closest neighbours, filters by score, checks for duplicates, and creates implicit links in the graph. explicit links are never touched. I don’t mess with your links. (why does that sound funny lol) configurable: top_k (default 10), min_score (default 0.75), max_links per pass (default 5). the AutoLinker holds Arc references to the embedder, index, graph, and event bus. every new link fires a LinkAdded event so the UI can animate the card drifting to its new neighbours. the duplicate check matters. between the search returning results and the link being created, another thread could have already linked the same pair. so it locks the graph, checks if the link exists, and only creates it if it doesn’t. two process_note() calls on the same note produce links on the first call and an empty vec on the second. Some tests in auto_link_matrix.rs : creates implicit links, skips self-links, obeys score threshold, respects max_links cap, handles empty index (no candidates), no duplicate links on re-process, empty body doesn’t panic, top_k=0 returns empty. also cleaned up some stray em-dashes and arrow symbols in comments across the codebase. vscode keeps auto-correcting -- to em-dashes and -> to the arrow symbol and I keep not noticing until I read the diff. idk if it’s a bug or a feature but it’s annoying. the TODO got a real overhaul. the old flat checklist is gone. everything that’s done is removed. what’s left is organized into sections: Dioxus UI plans (spring animations, camera lerp, pinned stars, cached positions), WASM worker threading, storage and sync (Google Drive, GitHub repo, offline mode, merge strategy), and future stuff (encrypted vault). it reads like a roadmap now instead of a grocery list. eleven crates. too much? no. modularity is never “too much,” rather it’s better to be more modular than less. (unless you have something insane like a file per function)
the sync backend exists now so the TODO said “Cloud sync” and I was like “how hard can it be” it was not hard actually. which is suspicious. but it works. new directory: Backend/sync-worker/ . it’s a Cloudflare Worker backed by R2 for storage. the whole sync API is three JS files and a wrangler config. the API POST /sync/push - batch upload notes, embeddings, and positions POST /sync/pull - batch download everything (or since a snapshot) GET /sync/status - storage stats (note count, bytes used, 512MB limit) POST /sync/clear - nuke everything plus individual CRUD routes for single notes, embeddings, and positions notes are JSON. embeddings are raw f32 bytes (384 * 4 = 1,536 bytes per note). positions are JSON. everything lives in R2 under a clean key scheme: notes/{id}.json , embeddings/{id}.bin , positions/{id}.json . the storage layer storage.js is the R2 abstraction. getJson, putJson, getBinary, putBinary, del, listKeys. plus a manifest system that tracks note count, last modified time, and the current snapshot ID. snapshots are versioned so the client can eventually do “pull only what changed since X” (right now it just dumps everything, but the plumbing is there). push and pull push accepts a JSON body with notes, embeddings, and positions objects. writes them all to R2, updates the manifest, creates a snapshot record, returns the snapshot ID. pull lists all note keys, fetches each note plus its embedding and position, and returns the whole bundle. embeddings get round-tripped through Float32Array so the binary format is preserved correctly. CORS is wide open ( * ) because this is a personal sync worker, not a public API. the client will be the Penumbra app running in the browser or on desktop. I’ll probably change this tho the generated types file wrangler generated a 14,000-line TypeScript declaration file for the Cloudflare runtime. I committed it because it’s how wrangler works and I don’t want to fight it. it defines the R2Bucket binding and every other Workers API type. it’s big. it’s fine. this is the first non-Rust code in the repo. feels weird. but the sync layer is inherently a server-side thing and Cloudflare Workers with R2 is genuinely the simplest way to get object storage with an HTTP API. no server to manage, no database to provision, just a bucket and some routing. Also, had to kick out usearch since it wasn’t WASM compatible now everything but Candle is WASM compatible!
making Candle actually WASM-compatible so remember the “no #[cfg] in cross-cutting interfaces” rule? the CandleEmbedder was breaking it. not with #[cfg] exactly, but with hf-hub, which uses filesystem APIs (dirs, mmap) that don’t exist in WASM. the model loading was desktop-only and I was pretending that was fine. it was not fine. I fixed it. hf-hub is gone replaced with reqwest. instead of hf-hub’s sync filesystem API that downloads to a local cache directory, the embedder now does raw HTTP GETs to huggingface.co/{model}/resolve/main/{file} . three downloads: model.safetensors, config.json, tokenizer.json. the bytes stay in memory, no filesystem touch. reqwest is platform-conditional in Cargo.toml: rustls on native (no OpenSSL dependency), bare defaults on wasm32 (uses browser fetch under the hood). plus getrandom with the wasm_js feature so random number generation works in WASM. two feature flags instead of one candle now just gives you the model and tokenizer types. no download capability, no reqwest. you construct a CandleEmbedder from bytes you already have. candle-load adds reqwest and the CandleEmbedder::load() method that downloads from HuggingFace. this is the one that pulls in the network stack. the split matters because the WASM build might want to load model bytes from OPFS or a bundled asset instead of downloading every time. the download path is opt-in. mmap is gone too from_mmaped_safetensors (with its unsafe block) became from_buffered_safetensors . loads from a byte vec instead of memory-mapping a file path. works everywhere. no unsafe. the vocab_size is now read from config.json instead of hardcoded to 30522. Tokenizer::from_file became Tokenizer::from_bytes . same pattern. error handling cleanup every candle operation was using ? directly, which only works if PenumbraError implements From<candle_core::Error>. it doesn’t, and it shouldn’t, because candle errors are an implementation detail. added an e_msg helper that wraps any Display into PenumbraError::Embedding, and switched every candle call to .map_err(e_msg)? . verbose but correct. ArcticEmbedXS::new and forward now return candle’s own error type instead of PenumbraError. the boundary between “candle stuff” and “penumbra stuff” is cleaner. the CandleEmbedder wrapper handles the translation. tests New candle tests behind #[cfg(feature = "candle")] . the trick: building a synthetic safetensors file and a minimal WordLevel tokenizer entirely in memory. no model download needed for the test suite. test_safetensors() generates fake embedding weights and encoder weights with deterministic values, writes the safetensors header manually (much better than pulling it in) (length prefix + JSON metadata + raw f32 bytes), and hands it to VarBuilder. test_tokenizer_bytes() builds a 10-word vocabulary with a Whitespace pre-tokenizer. tests cover: forward pass output shape, L2 normalization, non-zero output, embedder dimensions, embed_text roundtrip. plus one candle-load gated test that actually downloads the real model from HuggingFace (only runs when you explicitly pass --features candle-load ). the “no #[cfg] in cross-cutting interfaces” rule now holds for real. the entire embed pipeline compiles on wasm32 without conditional compilation. reqwest handles the platform difference internally. candle handles the compute. the embedder trait doesn’t know or care. Quick note, sorry about there mostly being terminal or VSCode images lol, there’s no UI to demo rn…
sync conflict detection + wiremock tests two changes in one commit: the sync worker now rejects stale pushes, and the Rust sync client has a real test suite. conflict detection if the client sends a snapshotId with its push, the worker checks it against the current server snapshot. if they don’t match, someone else pushed in between, and you get a 409 back with the current server snapshot ID and a message to pull first. the snapshotId used to be passed through from the client or generated fresh. now it’s always generated server-side. the client’s snapshotId is only used for the conflict check, never as the new snapshot. small change, but it means two clients can’t accidentally create the same snapshot ID. last_sync is now a Mutex WorkerSyncProvider.last_sync went from Option<DateTime> to Mutex<Option<DateTime>> . it gets updated after both push and pull succeed. this matters because SyncProvider is behind an Arc in the real app, and last_sync needs interior mutability. also added #[serde(rename_all = "camelCase")] on SyncSnapshot so the JSON fields match what the worker actually sends. wiremock tests 238 lines of new tests using wiremock to mock the HTTP worker. each test spins up a local mock server, registers response expectations, and exercises the WorkerSyncProvider against it. no real network, no real worker, fully deterministic. covers: connect (200 and 500), push (returns snapshot, forwards snapshot ID, handles 500, handles 409 conflict), pull (returns notes/embeddings/positions, sends since query param), status (parses all fields), last_sync (none initially, updated after push). the with_rt() helper builds a single-threaded tokio runtime with IO enabled for each test since wiremock needs async + network. the TODO “Cloud sync” is checked off. one item left: Dioxus UI. aaaaaaaaa
the Dioxus commit (it’s broken but it exists) okay so. it does not work properly. I want to be upfront about that. it compiles, it launches, things appear on screen, but the interaction is janky, the canvas rendering fights with the DOM cards, and the layout worker doesn’t sync positions correctly yet. it’s a WIP commit and I’m committing it anyway because there’s genuinely a lot of infrastructure here and I don’t want to lose it. three new crates penumbra-theme : dark and light themes defined as Rust structs. colors, radii, glass blur config. to_css_vars() generates the full CSS custom properties string so the theme can be injected into the DOM at runtime. purple accent because penumbra means shadow and shadows are purple, obviously. penumbra-canvas : a GraphCanvasRenderer trait with a WebCanvasRenderer that draws to an HTML canvas via web-sys. dot grid background, bezier curve edges between nodes, rounded-rect cards with titles. plus a NullCanvasRenderer for when there’s no canvas available. the RenderState struct holds the camera, nodes, edges, and selection state. penumbra-thread : cross-platform threading. std::thread on native, wasm_thread on WASM. one #[cfg] block (the only one in the project, and it’s in a platform abstraction crate where it belongs). Worker struct with atomic cancellation flag. spawn_worker() and spawn_detached() helpers. the app Build/ui/penumbra-app/ is a full Dioxus desktop app. the component count looks scary but most of it is from the dioxus-components library (badge, button, card, dialog, dropdown menu, separator, sheet, sidebar, skeleton, tabs, tooltip). I styled them but didn’t write them. the custom ones are: NoteCard : the little frosted-glass card that represents a note on the canvas. title, preview, positioned absolutely in world coordinates. GraphCards : renders all notes as AnimatedCards inside a CSS-transformed container. each card gets a spring animation on mount via dioxus-motion so it scales in from zero. cards are draggable. FloatingSidebar : the vertical icon bar on the left. grid, search, pin, tag, settings. just state toggles for now, no panels wired up yet. TopBar : centered pill bar with the app name and search area. Fab : “New note” button in the bottom right. NoteEditor : full-screen editor view with title, body, and tags fields. auto-saves on back. the bridge bridge/mod.rs connects the UI to the backend. load_graph() and load_positions() pull from storage. restore_state() inserts everything into the graph and index. create_layout_engine() builds the GPU layout engine with all current nodes. start_layout_worker() spawns a background thread that steps the layout at 60fps, syncs node additions/removals, and publishes position updates through the event bus. sleeps longer when the layout has converged. the interaction model pan: mousedown on canvas starts tracking, mousemove applies delta to camera, mouseup stops. zoom: wheel events on canvas adjust zoom level around the cursor position. drag: mousedown on a note card captures the offset, mousemove in drag mode updates the note’s position directly. note creation: click fab -> create empty note in graph -> wait for layout engine to assign position -> camera drifts to the new note (spring animation) -> switch to editor view. this is the flow from the ideas issue. it doesn’t work smoothly yet but the state machine is there. what’s broken everything, kind of. the canvas renderer and the DOM cards are two separate rendering paths that don’t coordinate well. the layout worker publishes positions but the signals don’t always pick them up in time. the camera drift animation triggers but sometimes snaps instead of drifting. the editor saves but doesn’t trigger re-embedding. the sidebar buttons toggle state but nothing happens. it’s a prototype. sigh.
making it actually work (kind of) so remember how last commit I said “everything is broken”? I spent tonight fixing the worst of it. it’s not done but it’s a lot less broken. the big fix: drag + layout fighting the core problem was that when you drag a note, the layout engine keeps running and overwriting your drag position every 16ms. the note jitters back and forth between where you’re dragging it and where the physics wants it. fix: new SetNodePosition event. when you drag a note, the UI publishes it through the event bus. the layout worker drains these events at the top of each cycle and calls engine.set_position() before stepping. so the layout engine knows where you put the card and computes forces from there instead of fighting you. also: while any note is being dragged (tracked by dragged_set ), the layout event loop skips updating positions entirely. other notes stay still instead of jittering from stale force calculations. once you release, everything syncs up again. mouse events moved to root div pan/drag/mouseup handlers were on the canvas element, which meant releasing the mouse over a note card didn’t fire mouseup on the canvas. dragging would “stick.” moved all the move/up/leave handlers to the root div so they fire regardless of what’s under the cursor. canvas renderer simplified removed the node drawing code from WebCanvasRenderer entirely. nodes were being drawn twice: once on the canvas in Rust/web-sys, once as DOM cards in Dioxus. the canvas now only draws the dot grid and bezier edges. the DOM handles cards. no more double rendering. the inline JS RAF loop was also replaced with a standalone canvas-draw.js that gets called explicitly via window.__penumbra_draw() whenever render state changes. no more requestAnimationFrame spinning at 60fps when nothing changed. spring-animated card positions cards now spring-animate to their new positions instead of teleporting. each AnimatedCard tracks target x/y and animates via dioxus-motion springs when the target changes. so when the layout engine repositions notes, they glide smoothly. the spring from the ideas issue, basically. sidebar panels are real now the floating sidebar buttons actually do things now. four panels: Search : reactive search input that queries the hybrid search engine as you type. results show title, preview, and similarity score. click a result and the camera drifts to that note. Tags : shows all tags sorted by count. click a tag to filter the graph view to only notes with that tag. click again to clear the filter. below the tag list, shows the filtered notes. Pins : lists all pinned notes. click to pan to them. Settings : just shows note count and link count for now. placeholder. context menu on right-click right-click a note card and you get a context menu with “Open in editor,” “Pin to canvas” / “Unpin,” and “Delete note.” the pin toggle calls a new toggle_pin method on AppState that flips the meta flag, persists, and publishes an event. note cards render markdown NoteCard preview now runs through markdown_to_html() and uses dangerous_inner_html . (XSS? yes) the editor got a preview toggle button that switches between the textarea and rendered HTML. real embeddings on init switched from SimpleEmbedder to CandleEmbedder::load() at startup. downloads the real Snowflake model from HuggingFace on first launch. falls back to SimpleEmbedder if the download fails. position persistence the layout event loop now debounce-saves positions to storage every 2 seconds. on next launch, saved positions are fed into the layout engine before the first step so notes start where you left them instead of random positions. other stuff done as well but i’m eepyyyy
the polish commit (that didn’t polish enough) okay so this commit looks massive and impressive on paper. I touched basically everything. and the code changes are real. but I need to be honest: the app still looks and feels terrible. like, genuinely bad. the UI is broken in ways that make me want to close the window and pretend I never opened it. but the changes are real so let me document them anyway. layout tuning repulsion went from 1000 to 8000, attraction from 0.01 to 0.004, ideal_length from 50 to 220. notes were clumping into an unreadable blob. the physics are better now even if you can’t tell because the rendering is fighting itself. theme overhaul flattened the entire theme system into one struct with semantic names. every hardcoded color replaced with CSS vars. dark and light themes. toggle in settings. this part actually works correctly and I’m proud of it even though nobody can see it because the layout is broken. TipTap editor replaced the textarea with TipTap via JS eval. StarterKit with bold/italic/strike/code/headings/lists. toolbar with format buttons. sends HTML back via dioxus.send(). this is genuinely nice when it works. which is actually most of the time wow. manual linking, note list, auto-linking on save, context menu, keyboard shortcuts, zoom controls, empty state all implemented. all technically functional. all look like they were designed by someone who has never seen a GUI before. (me. I’m that someone. i am not good at RSX, which is funny because it SHOULD just be a different form of HTML. you would think.) what I learned dioxus-desktop’s webview is not a browser with devtools. iterating on UI by recompiling a Rust binary every time you move a div 2 pixels is actual torture. I should have designed the UI in plain HTML first, gotten it looking right in a real browser with real devtools, and THEN ported it to rsx. I did not do that. I have been doing it backwards this entire time. smh my silly head. next step: HTML mockup first, then port. the backend is solid. the architecture is clean. the UI just needs to catch up. still broken but less broken than before. progress? maybe? onwards (to HTML mockups) :}
Revert Dioxus That’s the sound of me… giving up Giving up on Dioxus cause it’s so SO difficult to use I’m using Slint now, maybe, we’ll see if i even remember what I was doing Sorry for the like bad devlog, but it needed to be done
Basic template so. Slint. I was gonna do the whole “design it in HTML first then port it” thing that I very wisely declared last time and then, naturally, did not do at all. instead I saw Slint had a live preview and its own markup language and yeah. here we are. and it’s actually fun?? like it has a real preview, you edit the .slint file and it just updates, no recompiling the entire universe to nudge one thing. after the Dioxus months this feels illegal. anyway before touching any actual UI I made penumbra-app, which is NOT the UI, it’s the brain. a Universe struct that holds the graph + storage + event bus and does all the note stuff: create, save, delete, restore on open, persist after every change. the whole point is it doesn’t know Slint exists. or Dioxus. or anything. it just… runs the app, and whatever draws on top pokes it and listens for events. so if I rage-quit Slint in three weeks (I won’t! probably.) the brain doesn’t care. the actual Slint crate (penumbra-ui) is barely anything yet. cargo.toml, a build.rs because Slint compiles the markup at build time, a main, one app.slint. it’s the hello-world stage. but it launches! natively! no webview! I cannot stress how nice it is to not have a webview. oh also storage stuff got nudged, everything lives under a Penumbra/ folder now instead of just yeeting files into the shared app-data dir like a menace. and added a with_dir() so tests stop writing to my real data. speaking of, wrote a pile of Universe tests: make a note, drop the whole universe, reopen from the same folder, is the note still there? yes. edit it, reopen, still edited? yes. delete it, reopen, gone? gone. persistence actually persists, turns out. months since the last commit lol. I saw the date and just sighed. but the backend was sitting there perfectly fine this whole time waiting for me to stop fighting UI frameworks, and now I’ve got a clean core library and a toolkit that doesn’t actively hate me! Gasp. good place to be back :3
Vault mode (aka I made it Obsidian now, basically) okay this is a big (foundational) one so up until now Penumbra stored notes as a big pile of JSON blobs plus a graph.json that held all the links. which works but it’s… a black box? you can’t open your notes in anything else, the links live in a separate file, it’s very “my app owns your data.” and that bugged me. so now it’s a vault with markdown files. one .md per note, filename = title, YAML frontmatter for the id/timestamps/tags/pinned/archived, and the body is just… markdown. you could point Obsidian at the folder and it’d basically work. that’s the goal. well. the other way around but still :P Also, links aren’t stored anymore, they’re derived. [[wikilinks]] in the body get resolved against filenames at scan time and become the explicit edges in the graph. no more graph.json. the files ARE the source of truth, and if the app crashes mid-write the next scan just repairs everything. I like that a lot. it means if you go edit a file in some other editor and add a [[link]] , Penumbra picks it up next time it scans. and then I fell down the rename rabbit hole. because if filename = title, renaming a note means renaming the file AND rewriting every [[old title]] across the whole vault to [[new title]] . so propagate_rename walks every note that linked to the old title and rewrites it. and the rewriter is suuuuuuper careful: it skips inline code, fenced code blocks, indented code, handles [[Old|alias]] , matches case-insensitively but keeps whatever case you typed. wikilinks inside `code` should NOT get rewritten and now they don’t, and I have a test that proves it (with the same link four times in different contexts, only the live one changes). very satisfying. filenames can have slashes and colons and emoji and whatever, so there’s a sanitizer that strips the illegal stuff, collapses whitespace, caps length, falls back to “Untitled” if you somehow title a note with just dots. and if two notes want the same filename you get “Same Name” and “Same Name 2” like every sane file manager. oh and frontmatter tags vs inline tags are kept separate on purpose. if you wrote #tag in the body, that stays inline, it doesn’t get hoisted up into the YAML just because Penumbra touched the file. only frontmatter tags round-trip through YAML. respecting the user’s file, basically. the parser also got some unicode love while I was in there. tags can be #Ünïcodé now and nested like #projects/penumbra , and the whole split_text_for_custom walk steps by char instead of byte so it stops potentially panicking on multi-byte stuff. should’ve been like that from the start but oh well. on the UI side: there’s a folder picker now! rfd native dialog, “Choose your Penumbra vault”, and it remembers your choice in a config file so it doesn’t nag you every launch. also reads a PENUMBRA_VAULT env var if you want to override. getting the macOS dialog to behave was its own thing because rfd has to run on the thread that owns NSApplication, so it marshals onto the Slint event loop and sends the result back over a channel. the browser build just uses OPFS for now, showDirectoryPicker slots in later (TODO left in the code, future me’s problem). wrote a whole pile of tests for all of it too, but that’s booooriinnnngggggggggggggggggg
working wasm version and candle it runs in the browser now!! like, actually. wasm target, Slint rendering to a canvas, the whole thing. I’ve been dreading the wasm build this whole project and it just… went. mostly. the big win here is model caching, because downloading a ~130MB embedding model every single page load is obviously insane. so there’s a model_cache module now that’s the same two functions (get/put) with two backends behind cfg: native writes the bytes to a temp dir, wasm shoves them into the browser’s Cache API. first launch downloads and stashes, every launch after just pulls from cache. same idea as before but now it works on both sides. to make that clean I split CandleEmbedder::load() into two pieces: from_bytes() that takes raw model/config/tokenizer bytes and builds the thing, and load() (native only) that downloads then calls from_bytes. so the wasm path can grab bytes from cache (or fetch them itself) and hand them straight to from_bytes without the reqwest download dance. Candle running on CPU in wasm, no GPU, producing the same 384-dim vectors. genuinely did not expect that to just work. the wasm caching code is… a lot of JsFuture and dyn_into and web_sys ceremony. open the cache, build a Request, match it, pull the arraybuffer, convert to a Uint8Array, to_vec. and the put side builds a fake 200 Response with the bytes as the body and stuffs it in. it’s verbose but it’s the standard, nothing clever. the UI crate is a cdylib now (plus rlib) so it can compile to wasm, tokio features got split per-target (no rt-multi-thread in the browser, obviously), and there’s a tiny index.html that just imports the generated js and calls init(). Slint paints onto a <canvas id="canvas"> also wrote an inference benchmark test… all you need to know so yeah. desktop AND browser, same codebase, real ML embeddings on both. the “true cross-platformity” thing from the very first devlog is… actually real now? that rule I set on day one about no #[cfg] in the interfaces paid off HARD here, the only cfgs are tucked inside the cache and download internals where they belong.
lock in (the UI exists now. for real this time.) hehe okay. LOCK IN. this is the one where Penumbra stops being a really nice backend with no face and becomes an actual app you can look at. Slint UI, real components, and I wrote my own text editor because of course I did.so the editor. new crate, penumbra-editor. I could’ve just shoved a <textarea> equivalent in and called it a day but nooo, I wanted a proper block-based editor like the good note apps have. so it’s a document model made of blocks, each block has styled spans, and you edit it through commands: InsertText, DeleteRange, SplitBlock, MergeBlocks, SetMark, MoveCursor. every command goes through a Journal that’s just a command list + a pointer, which means undo/redo falls out for free (truncate on new push, walk the pointer back and forth). there’s a cursor/selection model and a view_model that snapshots the doc into something the UI can render without touching the guts. it’s BROKEN AND WEIRD NOW BUT IT’LL GET BETTER I PROMISE the layout engine grew a CPU brain. it was originally GPU-only via that vibe-graph-layout-gpu crate, which is great until you’re in an environment with no WebGPU (like… a lot of places, including some wasm setups) and then it just returns zero displacement and everything sits in a sad pile. so now there’s cpu.rs, my own Barnes-Hut quadtree force layout in plain Rust, and the engine tries GPU first and falls back to CPU when there’s no backend or the GPU step fails. no more “works on my machine with a discrete GPU only.” graceful degradation, hehe. and then the actual Slint UI which is the thing. it’s great. it’s split into real components now: theme.slint for the tokens, top-bar.slint, map-canvas.slint for the graph, note-card.slint for the cards, editor-panel.slint for writing. app.slint wires it together. this is the part that broke my brain in Dioxus for literal months and in Slint it’s just… a file with a live preview and it looks how I tell it to. I keep waiting for the catch. haven’t hit it yet tests too NO JINXING ME (please) I don’t want to jinx it but. this feels like the first time Penumbra is actually the thing I pictured back in that architecture-day devlog. backend I’m proud of, a UI that doesn’t fight me, my own editor, works on GPU or CPU, desktop or browser. I locked in :3
the map is alive You might wonder, why is bro devlogging so often? Wellll, i had this whole plan i wrote down a bit ago to commit when so that it’s not a 10000 line commit ( shudders in that happening before ) but I severely overestimated how long these things would take Most of the time not logged was testing, sigh i wish i could devlog that lolll hehe okay so the notes actually live on a map now. like they have positions, computed by the real layout engine, and you can drag the whole thing around and zoom. it’s a canvas!! a real one!! what and how so on boot (native), it spins up the LayoutEngine, drops every note in as a node, restores their saved positions if there are any, feeds in the links, and runs the layout to settle everything. then it builds two things for the UI: note cards (with x/y from the layout) and edges (lines between linked notes, computed from the endpoint positions). both get shoved into Slint models and the map renders them. add a new note and it gets added to the layout, re-stepped, and the cards + edges refresh. positions save back to storage when you close the app. the map-canvas. slint got the fun part: pan and zoom. a TouchArea catches pointer down/move to drag the camera around, scroll wheel zooms between 10% and 500%, and every card positions itself as (card.x - camera) * zoom. threw in viewport culling too so cards way off-screen just don’t render (visible: only if it’s within ~200px of the edges). and a little “N notes | zoom: X%” readout in the corner because I like knowing things. (it’s broken like most of this, we ignore that for now, polishing is later) my foolishness the whole thing is cfg-split for wasm because the GPU layout engine isn’t wired up on the browser side yet, so wasm gets a fallback that just lists the cards without real positions for now. desktop gets the full living map, browser gets the placeholder, both compile, nobody’s angry. (the wasm map is a TODO-shaped hole but it’s an silly one.) also had to expose universe.storage() so the UI can reach load_positions/save_positions, and added a small EdgeVM struct to carry line endpoints into Slint.
neighborhood steps actually mean something now so way back, I wrote step_neighborhood as a function that… just called step() . full graph. every time. with a little // Note: functionally equivalent to step() comment that was basically an “it’s fineeee” for now. it’s been sitting there mocking me… for months (no joke i had it at #1 on the mental todo after deleting Dioxus) not anymore! it does the real thing now. when you nudge one note, only the notes within ~400px of it recompute. everything past that radius stays frozen and acts as an anchor so the local cluster settles against the rest of the map instead of the whole universe re-jiggling every frame. this is the “atomic graph updates” idea from the original plan thing, finally real: touch one note, its neighborhood adjusts, the far-off constellations don’t even notice. Efficiency to make that not-slow I built a spatial hash. uniform grid, bucket nodes by cell, “give me everything within radius R” only checks the overlapping cells instead of all N nodes. the CPU layout uses it for the localized force pass (repulsion from local neighbors, springs to actual link partners even if they’re outside the neighborhood, gravity), and I also went back and ripped the O(n²) all-pairs loop out of the regular collision resolver and put it on the spatial hash too. that one was quietly quadratic this whole time and would’ve melted at a couple thousand notes. rebuild the hash each pass so pushed nodes land in their new cells. much better. Collisions? the collision resolver got a neighborhood-scoped twin as well, so a local step also only de-overlaps locally. nodes inside the neighborhood push each other apart normally; a node that’s an anchor outside it doesn’t move, so the inside node just gets shoved twice as hard away from it. felt like the right call. PERSISTENCE?! also taught storage about pins, separate workspace.pins.json file (refactored the workspace/pins file openers to share a state_file helper), and note cards carry a pinned flag now. Oh lines and there’s a whole new map module in the UI crate that generates the actual SVG-ish path strings: bezier edges between linked cards in screen coordinates, viewport culling so off-screen edges don’t get drawn, selected-neighborhood highlighting (the selected note’s edges render in the “selected” layer, everything else in “base”), and a grid path that anchors to the camera and clamps its own density so zooming way out doesn’t try to draw ten thousand grid lines. the map handling a lot of notes without choking was the thing I was VERY, VERY worried about. Not as much of a problem as I thought! :D
Broken but a working ish editor!!! you can WRITE in it now. like actually type words into a note and have them save. it’s janky but it works and I’m hyped. How the editor is block-based, which was the whole gamble. instead of one big textarea, a note is parsed into blocks (paragraphs, headings, code fences, etc) and you edit one block at a time. the active block shows its raw markdown so you can mess with the syntax, everything else renders. new session.rs in penumbra-editor holds all of it: EditorSession owns the list of BlockEdits, tracks which one’s active, and each block has a mode, Prose (renders as markdown, Enter splits into a new block), Heading (single line, Enter drops the tail into a paragraph below), and Raw (code, Enter is a literal newline). splitting a block at the cursor, merging, undo/redo with a 64-deep snapshot history. it’s a real little document editor. uhhh is it good? no! the commit message says “broken” and I mean it. the split logic has edge cases, the cursor does weird things, switching blocks is finicky. but you can open a note, type, and it round-trips to the markdown file on disk, which is the bar I set and it clears it. barely. hehe. yeah state is hard to make the editor and the layout worker both able to touch the graph, Universe’s graph is now an Arc<Mutex>. graph() hands back a guard, graph_handle() hands back the Arc for things that want to hold their own lock. had to sprinkle lock_graph() everywhere but it’s the honest cost of sharing state between the UI thread and the physics thread. oop forgot about this also implicit links persist now! the auto-associated links used to evaporate on restart because only explicit wikilinks got rebuilt from the files. now they save to their own file and get restored on open (skipping any whose notes are gone). so the constellations you didn’t draw by hand survive a relaunch too. eeh and the TODO… got GUTTED. so much got checked off I almost don’t believe it. Slint UI: done. map canvas v1 with pan/zoom/grid/edges/culling: done. spring animation so cards drift to their spots instead of teleporting: done. local neighborhood layout: done. pinned notes as fixed stars (pin via right-drag, right-tap to unpin, and left-dragging one nudges it back toward its pin): done. positions cached with throttled save + save-on-exit: done. physics running off the UI thread on the tokio runtime so the map doesn’t stutter while it’s solving: done. that whole “Slint” section of the roadmap is basically green now. new-note-pill.slint got added too, a little floating “new note” thing that’s partially broken. broken editor, but a broken editor that WORKS, which three months ago I could not have said about any part of the UI. we’re so back :3
Implement platform-specific modules approach like Saikuro okay so the ui/penumbra-ui/src/lib.rs had gotten GROSS. it was this soup of #[cfg(not(target_family = "wasm"))] and #[cfg(target_family = "wasm")] blocks sitting right next to each other, two versions of half the functions, the SharedState struct declared twice, the boot path forked inline. every time I added a thing I had to add it twice with the right cfg gate and it was exactly the kind of mess I swore off on day one. so I stole the pattern from Saikuro a platform module. now there’s src/platform/mod.rs that declares the shared interface, plus platform/native/mod.rs and platform/wasm/mod.rs behind one cfg switch at the top. the rest of the app just calls into platform:: and doesn’t care which one it got. all the two-versions-of-everything nonsense is now contained in exactly two files that never both compile at once, and lib.rs reads like a single coherent app again instead of a choose-your-own-adventure. it’s so much cleaner. while I was in the editor I also killed a dumb duplication: penumbra-editor had its OWN BlockKind enum that was just a lossy copy of the one in penumbra-markdown, with a whole block_kind() function to convert between them. why. they’re the same concept. so now the editor re-exports markdown’s BlockKind and clones it straight through, and that whole translation layer is gone.
Better editor the editor got a real display layer, and honestly most of the actual work here happened in the Slint live preview, just tweaking things until they looked right, so the hours logged don’t reflect it. same story for the last few commits, tbh, a lot of “sit in the preview and nudge” that Hackatime doesn’t see. oh well. anyway the thing that makes an editor feel like an editor is that the active block shows raw markdown but every other block renders nicely, and the piece that does that rendering is the new display module. it turns each block into the text you actually want to see. lists keep their markers because those go through the real markdown renderer. and tables, tables actually render as an aligned grid now, padded columns and a --- separator row, which looks so much better. there’s also scroll targeting given the active block, it works out where to scroll the editor so that block is comfortably in view. first block sits at zero, later blocks scroll proportionally, long bodies don’t leave you editing something off the bottom of the screen. wrote a chunk of tests for all of this the map got a zoom-to-card thing too click into a note and the camera zooms so the card fills the viewport width it’s great that’s what i wanted since the beginning tbh like that animation played in my head
Component library + live typing preview two things this commit first I pulled all the Slint components out of penumbra-ui into their own crate, penumbra-component. it’s a pure-markup library, no Rust logic, just .slint files: the Theme, all the block components (ProseBlock, HeadingBlock, QuoteBlock, CodeBlock, TableBlock, FootnoteBlock, HtmlBlock), the CanvasSurface, the TopBar, and PillButton (which used to be NewNotePill but I generalized it so it takes a text prop instead of hardcoding “New note”). there’s an index.slint that re-exports everything and now the app imports from @penumbra-component/index.slint like a real library. also why I did this: the live preview. I set up a slint library path in build.rs (and a .vscode/settings.json so the preview resolves @penumbra-component ), which means I can open any single component file and preview it in isolation instead of booting the whole app. given that basically all my UI work these days IS sitting in the preview nudging things, having the components be individually previewable is a massive quality-of-life win. also just cleaner, the editor-panel.slint used to have all seven block components copy-pasted inline at the top, like 200 lines of it, and now it just imports them. the VMs (BlockVM, NoteCardVM) moved to a data.slint too so the struct definitions aren’t tangled with the theme. second thing, and this is the fun one live preview while you type. before, the active block was just a raw text field, you’d type # Heading and see # Heading , and only once you clicked away did it render. now as you type, a little preview well under the input shows what the block WOULD render as, live. type # and it previews as a heading, type > and it’s a quote, type - and it’s a list. there’s a whole set of live_ functions (live_kind_name, live_display_text, live_heading_level, estimate_live_height) that route the currently-typed text through the same display logic the inactive blocks use, so you get instant feedback on your markdown without committing it. But it’s broken and weird and not working (see previous image) gosh might take a break from this and think about how to structure it again, Je n’aime pas ce désordre
Engine improvements ughhhhhhh i spent hours making “spikes” (is that what they’re called?) and it wasn’t counted cause slint live preview/editor = not hackatime-d sighhhh Oh well btw, hi, sorry for the random 1 month ish gap I come back, better at Slint, and with fresh motivation. okay so august 30 was my last commit and it is now october. in my defense i did not touch this once in that whole time which is either very bad or very healthy idk. but something clicked today and i opened it back up and immediately went “ew who wrote this” (me. it was me.) cough cough better engine so the editor had this whole situation in doc.rs where Document::new would parse the markdown into an ast, and then i had this convert_blocks function that walked through the blocks AND a second function called find_block_range that literally scanned the source bytes by hand looking for double newlines to guess where each block started and ended. like manually. byte by byte. offset += whatever. i genuinely cannot believe past me looked at that and went yeah ship it the thing is the parser already KNOWS where every block is. it has the offsets. it was just throwing them away and then i was reconstructing them with a worse, slower, buggier version downstream. so i added parse_blocks_offsets to the markdown parser so it just hands back (block, range) and now doc.rs is like. map over them, pull the range straight off, extract spans, collect. that’s it. find_block_range is gone. convert_blocks is gone. good riddance :3 also killed the edita-core dependency because it turns out i wasn’t actually using it for anything, it was just sitting in the Cargo.toml being decorative net result is like 1290 lines deleted vs 793 added which is my favorite kind of commit. deleting code that you wrote and were briefly proud of is so good for the soul hahaaaaa anyway the engine is better now (cough cough not)
SO GUESS WHAT I made a PR to big Slint itself!!!! https://github.com/slint-ui/slint/pull/14292 Basically… the markdown editor that Penumbra uses… is bad cause it’s a block style editor, which itself is hard to implement, and it’s not designed for markdown WYSIWYG. Double whammy Solution? Uhhh use cosmic-text and MAKE IT MYSELF BABYEEEEE In all seriousness tho, COSMIC text is so peak, truly universe-breaking. Well what’s the PR then? “This PR lets a FocusScope act as an input method (IME) client. That way, custom editing surfaces like rich text editors or code editors drawn with custom code can get composition events directly.” Aka, I stabilized an internal API and exposed it so that Penumbra can get a really cool editor....
|
1792803048.487678
|
1793407848.487678
|
|
3134
|
AV Media Booking System by @rachell_aristo | Stard AV Media Booking System by @rachell_aristo | Stardance...
|
rachell_aristo
|
0
|
78.75
|
0
|
[]
|
[{"post_id": 81415, "ts": "202 [{"post_id": 81415, "ts": "2026-10-21T06:29:38Z", "hours": 6.6819, "text": "Added an equipment check out system that allows the media technician to check out a loan by typing in the barcodes of specific assets. Checks if scanned asset exists in catalog Checks if the same assets are scanned > once Checks if a scanned asset is not requested in this loan And then saves the scanned barcodes to db. to do: add error handling for this + add barcode scanner with cam function"}, {"post_id": 80887, "ts": "2026-10-19T05:22:58Z", "hours": 1.2214, "text": "Added/changed all email templates into HTML to allow more formatting options in the future"}, {"post_id": 76966, "ts": "2026-10-05T07:15:47Z", "hours": 1.9156, "text": "Added variables to approve emails (with Jinja) so it’s dynamic Also added a few util functions for converting int ids to the string value (for equipment ids, studio space ids, timeslot ids etc) I wonder if there is a built in method for doing this with sql alchemy?"}, {"post_id": 71065, "ts": "2026-09-20T08:06:15Z", "hours": 0.9994, "text": "Added fully booked (depending on avalibility from selected date) + not avali for year group messages"}, {"post_id": 71020, "ts": "2026-09-20T06:51:57Z", "hours": 8.2517, "text": "I added an equipment item column to the equipment bookings table so that admin can also filter search by equipment :) Also added error handling for Flask Mail functions + updating loan status to db, which sends an appropriate message to admin about whether data was updated, email was sent etc."}, {"post_id": 70474, "ts": "2026-09-19T08:08:45Z", "hours": 5.9058, "text": "Added functionality for studio booking table - modals, action buttons etc. Also added filters to all tables. This sounds simple cuz previously all worked on equipment table, but was actually a mess to refactor because now there’s equipment bookings and studio bookings not just one type 🫠"}, {"post_id": 68636, "ts": "2026-09-15T13:22:08Z", "hours": 7.0539, "text": "omg SO MANY UPDATES!! >:) Updated the equipment booking system to dynamically update quantity counts depending on the date range selected by user (JS fetch) My app now sends AUTO EMAILS WHATTT with Flask Mail. Legit so cool :)) When admin changes a booking, eg by approving/cancelling, it will trigger an email to the user Added a filter system to bookings table! Can filter by searching a value in any column"}, {"post_id": 67984, "ts": "2026-09-14T09:54:57Z", "hours": 6.0844, "text": "Added accept/reject/cancel button functions to admin page + table of bookings with color coded status. Clicking on rows brings up a modal with more info + action buttons"}, {"post_id": 67211, "ts": "2026-09-13T08:17:54Z", "hours": 4.5839, "text": "Added verification for equipment booking: equipment must be allowed for the user’s year group, user must not have overdue loans and each loan has a limit for # of items loaned per equipmen type Basic table record display for all bookings on admin_home.html Updated CSS color scheme to fit school colors + unrounded elements (cuz I think the round UI design is over hyped) + made records more space efficent AI use: used Gemini to help update CSS"}, {"post_id": 66564, "ts": "2026-09-12T12:22:51Z", "hours": 2.1478, "text": "Fixed a really serious problem I didn’t spot previously where the equipment loan record getting saved to db wasn’t saving the quantity properly when u book >1 of each equipment type…simply forgot to iterate through the quantity list I had made 🫠 Also added to student_home page so that equipment bookings also get shown :)"}, {"post_id": 66329, "ts": "2026-09-12T03:08:07Z", "hours": 5.2681, "text": "Finally have a working equipment booking page and system! Figuering out how to select the data of equipment type and quantity and send to py was low key a nightmare…"}, {"post_id": 63527, "ts": "2026-09-07T13:12:08Z", "hours": 1.1408, "text": "Basic tab system for sorting the equipment cards based on category :)"}, {"post_id": 63488, "ts": "2026-09-07T11:28:33Z", "hours": 4.1219, "text": "Created a CSV parser with pandas (first time using!) which I can incorperate into the admin interface later on. Sorted out a lot of logicial tough questions such as how do you iterate through a 2D array to create records?"}, {"post_id": 62852, "ts": "2026-09-06T11:53:40Z", "hours": 2.3272, "text": "Changed html + js so that the studio booking page allows for div cards w/ photos for each studio space instead of a boring form like structure (css not fixed yet!)"}, {"post_id": 62606, "ts": "2026-09-06T02:26:32Z", "hours": 5.0053, "text": "Added comments to all my code + implemented Flask-Login. POV u came back to coding after like a month and realized you don’t understand what you wrote…comments for future me now. As for Flask-login, I implemented it cuz it makes sense to use it instead of manualy building login functions (in screenshot - goodbye manual login functions woop)"}, {"post_id": 35684, "ts": "2026-07-27T08:55:43Z", "hours": 11.0956, "text": "Finally have a functioning studio booking system with an HTML form that submits data to my mySQL db (form has frontend + backend validation too)!! Also created a student_home.html page, linked it to successful booking page. asked AI for tempoary functional css styling so that my page is easier to read (will change css to something less AI later on!) Stuff I’ve learned for the first time to use: Flatpickr date picker understanding how blueprints & routes work HTML templates and Jinja2 syntax Querying from database with sqlalchemy select"}, {"post_id": 14074, "ts": "2026-06-23T01:52:11Z", "hours": 2.5953, "text": "Added Google OAuth login!"}, {"post_id": 6664, "ts": "2026-06-11T05:21:49Z", "hours": 2.3544, "text": "Created database tables with SQLAlchemy for the first time"}]...
|
Title: AV Media Booking System by @rachell_aristo Title: AV Media Booking System by @rachell_aristo | Stardance
Devlogs:
Created database tables with SQLAlchemy for the first time
Added Google OAuth login!
Finally have a functioning studio booking system with an HTML form that submits data to my mySQL db (form has frontend + backend validation too)!! Also created a student_home.html page, linked it to successful booking page. asked AI for tempoary functional css styling so that my page is easier to read (will change css to something less AI later on!) Stuff I’ve learned for the first time to use: Flatpickr date picker understanding how blueprints & routes work HTML templates and Jinja2 syntax Querying from database with sqlalchemy select
Added comments to all my code + implemented Flask-Login. POV u came back to coding after like a month and realized you don’t understand what you wrote…comments for future me now. As for Flask-login, I implemented it cuz it makes sense to use it instead of manualy building login functions (in screenshot - goodbye manual login functions woop)
Changed html + js so that the studio booking page allows for div cards w/ photos for each studio space instead of a boring form like structure (css not fixed yet!)
Created a CSV parser with pandas (first time using!) which I can incorperate into the admin interface later on. Sorted out a lot of logicial tough questions such as how do you iterate through a 2D array to create records?
Basic tab system for sorting the equipment cards based on category :)
Finally have a working equipment booking page and system! Figuering out how to select the data of equipment type and quantity and send to py was low key a nightmare…
Fixed a really serious problem I didn’t spot previously where the equipment loan record getting saved to db wasn’t saving the quantity properly when u book >1 of each equipment type…simply forgot to iterate through the quantity list I had made 🫠 Also added to student_home page so that equipment bookings also get shown :)
Added verification for equipment booking: equipment must be allowed for the user’s year group, user must not have overdue loans and each loan has a limit for # of items loaned per equipmen type Basic table record display for all bookings on admin_home.html Updated CSS color scheme to fit school colors + unrounded elements (cuz I think the round UI design is over hyped) + made records more space efficent AI use: used Gemini to help update CSS
Added accept/reject/cancel button functions to admin page + table of bookings with color coded status. Clicking on rows brings up a modal with more info + action buttons
omg SO MANY UPDATES!! >:) Updated the equipment booking system to dynamically update quantity counts depending on the date range selected by user (JS fetch) My app now sends AUTO EMAILS WHATTT with Flask Mail. Legit so cool :)) When admin changes a booking, eg by approving/cancelling, it will trigger an email to the user Added a filter system to bookings table! Can filter by searching a value in any column
Added functionality for studio booking table - modals, action buttons etc. Also added filters to all tables. This sounds simple cuz previously all worked on equipment table, but was actually a mess to refactor because now there’s equipment bookings and studio bookings not just one type 🫠
I added an equipment item column to the equipment bookings table so that admin can also filter search by equipment :) Also added error handling for Flask Mail functions + updating loan status to db, which sends an appropriate message to admin about whether data was updated, email was sent etc.
Added fully booked (depending on avalibility from selected date) + not avali for year group messages
Added variables to approve emails (with Jinja) so it’s dynamic Also added a few util functions for converting int ids to the string value (for equipment ids, studio space ids, timeslot ids etc) I wonder if there is a built in method for doing this with sql alchemy?
Added/changed all email templates into HTML to allow more formatting options in the future
Added an equipment check out system that allows the media technician to check out a loan by typing in the barcodes of specific assets. Checks if scanned asset exists in catalog Checks if the same assets are scanned > once Checks if a scanned asset is not requested in this loan And then saves the scanned barcodes to db. to do: add error handling for this + add barcode scanner with cam function...
|
1792587171.3745627
|
1793191971.3745627
|