|
18228
|
Lando Norris Fan OS by @F1_ms | Stardance
|
F1_ms
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T18:31:03Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? I built Lando Norris Fan WebOS, an interactive, simulated desktop operating system themed around F1 driver Lando Norris (LN4). Running entirely in the browser, it features a glassmorphic taskbar with a live real-time clock, draggable windows, and three core applications: Welcome Screen: A landing page with links to Lando’s social media. Race Weekends (F1 Calendar): An app showing upcoming/past 2026 races and active race reports. F1 Standings: A beautiful dashboard tracking the latest 2026 championship points for drivers and teams. What was challenging? One of the biggest hurdles was managing window layers (z-index) so that clicking any window automatically brings it to the top. I also struggled with JavaScript event listeners not firing correctly due to a script loading conflict (type=“module” vs standard scripts), which caused the close buttons to freeze. I resolved this by building a dedicated debugging script checker that automatically verifies button IDs and implements safety click fallbacks. What are you proud of? I am incredibly proud of building the F1 Standings App! I structured the tabs myself to let users toggle between Drivers and Constructors. I customized the styling using custom CSS so that championship leaders (like Kimi Antonelli) have a golden-shimmer highlight, podium positions look like gold, silver, and bronze, and Lando/McLaren have the iconic signature orange branding. What should people know so they can test your project? Double-click the desktop icons to launch apps! You can drag windows around by clicking and holding their headers. Click anywhere inside an open window to bring it to the foreground. Use the navigation buttons inside the apps to toggle between Calendar/Reports or Drivers/Teams. Click the ✕ button on the top right of any window to close it.", "repo": "https://github.com/F1ms-maker/Webos", "demo": "https://f1ms-maker.github.io/Webos/"}]...
|
[{"post_id": 13259, "ts": "202 [{"post_id": 13259, "ts": "2026-06-21T18:26:36Z", "hours": 0.3069, "text": "Finishing Last Infos"}, {"post_id": 8633, "ts": "2026-06-14T10:59:00Z", "hours": 1.5644, "text": "Some good Progress and the first App!!!"}, {"post_id": 8400, "ts": "2026-06-13T23:31:55Z", "hours": 1.0858, "text": "Finished for Today first steps done"}]...
|
Title: Lando Norris Fan OS by @F1_ms | Stardance
Title: Lando Norris Fan OS by @F1_ms | Stardance
Devlogs:
Finished for Today first steps done
Some good Progress and the first App!!!
Finishing Last Infos
Ships:
What did you make? I built Lando Norris Fan WebOS, an interactive, simulated desktop operating system themed around F1 driver Lando Norris (LN4). Running entirely in the browser, it features a glassmorphic taskbar with a live real-time clock, draggable windows, and three core applications: Welcome Screen: A landing page with links to Lando’s social media. Race Weekends (F1 Calendar): An app showing upcoming/past 2026 races and active race reports. F1 Standings: A beautiful dashboard tracking the latest 2026 championship points for drivers and teams. What was challenging? One of the biggest hurdles was managing window layers (z-index) so that clicking any window automatically brings it to the top. I also struggled with JavaScript event listeners not firing correctly due to a script loading conflict (type=“module” vs standard scripts), which caused the close buttons to freeze. I resolved this by building a dedicated debugging script checker that automatically verifies button IDs and implements safety click fallbacks. What are you proud of? I am incredibly proud of building the F1 Standings App! I structured the tabs myself to let users toggle between Drivers and Constructors. I customized the styling using custom CSS so that championship leaders (like Kimi Antonelli) have a golden-shimmer highlight, podium positions look like gold, silver, and bronze, and Lando/McLaren have the iconic signature orange branding. What should people know so they can test your project? Double-click the desktop icons to launch apps! You can drag windows around by clicking and holding their headers. Click anywhere inside an open window to bring it to the foreground. Use the navigation buttons inside the apps to toggle between Calendar/Reports or Drivers/Teams. Click the ✕ button on the top right of any window to close it....
|
1793127138.4402463
|
1793213538.4402463
|
|
18250
|
Powerblock Auth by @Powerblock | Stardance
|
Powerblock
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-22T16:46:12Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a Authentication frontend and Manager for the Godot game engine and Nakama. I built this because it’s REALLY annoying to set up good Nakama authentication. Right now it only supports Email and Device ID but as I use new libraries I will probably add it here :). Please report any issues. Thanks!", "repo": "https://github.com/Powerblock2000/PowerblockAuth", "demo": "https://powerblock2000.github.io/PowerblockAuth/WEBSITE/r2/index.html"}]...
|
[{"post_id": 8812, "ts": "2026 [{"post_id": 8812, "ts": "2026-06-14T17:18:24Z", "hours": 1.0456, "text": "Finished README and website Check it out at: https://powerblock2000.github.io/PowerblockAuth/ Ready to ship waiting on voting to open…"}, {"post_id": 8473, "ts": "2026-06-14T02:48:02Z", "hours": 1.2483, "text": "Finished Frontend and Backend, getting bugs now 👊🪲"}, {"post_id": 8414, "ts": "2026-06-13T23:56:09Z", "hours": 0.7017, "text": "Working on the Nakama session lifecycle"}]...
|
Title: Powerblock Auth by @Powerblock | Stardance
Title: Powerblock Auth by @Powerblock | Stardance
Devlogs:
Working on the Nakama session lifecycle
Finished Frontend and Backend, getting bugs now 👊🪲
Finished README and website Check it out at: https://powerblock2000.github.io/PowerblockAuth/ Ready to ship waiting on voting to open…
Ships:
This is a Authentication frontend and Manager for the Godot game engine and Nakama. I built this because it’s REALLY annoying to set up good Nakama authentication. Right now it only supports Email and Device ID but as I use new libraries I will probably add it here :). Please report any issues. Thanks!...
|
1793245972.0082202
|
1793332372.0082202
|
|
18257
|
FocusPulse by @reyansh | Stardance
|
reyansh
|
1
|
4.26
|
23
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T23:30:31Z", "hours": 3.0, "multiplier": 8.58, "payout": 23, "blessing": "neutral", "text": "I made FocusPulse, a screen-fatigue break assistant that helps students, gamers, and people working online know when to rest. It tracks session time, shows green/yellow/red focus warnings, and recommends quick recovery exercises like breathing, stretching, and the 20-20-20 eye rule. The hardest part was making the settings, demo mode, and break timers work smoothly. I’m proud that it feels useful, easy to understand, and ready to test in the browser.", "repo": "https://github.com/reyanshp0202/FocusPulseUltimate", "demo": "https://focus-pulse-ultimate.vercel.app/"}]...
|
[{"post_id": 11389, "ts": "202 [{"post_id": 11389, "ts": "2026-06-18T17:10:03Z", "hours": 1.0078, "text": "I updated the URL using Vercel because it stopped working. Vercel was very glitchy and it took me a while to fix"}, {"post_id": 8407, "ts": "2026-06-13T23:38:15Z", "hours": 0.2533, "text": "Reordered my info page to make it more sleek and easier to follow"}, {"post_id": 8391, "ts": "2026-06-13T23:14:20Z", "hours": 2.7231, "text": "I worked on adding an information page and finetuning the pulse page so that errors wouldn’t happen and it wouldn’t crash upon use."}]...
|
Title: FocusPulse by @reyansh | Stardance
Devlogs Title: FocusPulse by @reyansh | Stardance
Devlogs:
I worked on adding an information page and finetuning the pulse page so that errors wouldn’t happen and it wouldn’t crash upon use.
Reordered my info page to make it more sleek and easier to follow
I updated the URL using Vercel because it stopped working. Vercel was very glitchy and it took me a while to fix
Ships:
I made FocusPulse, a screen-fatigue break assistant that helps students, gamers, and people working online know when to rest. It tracks session time, shows green/yellow/red focus warnings, and recommends quick recovery exercises like breathing, stretching, and the 20-20-20 eye rule. The hardest part was making the settings, demo mode, and break timers work smoothly. I’m proud that it feels useful, easy to understand, and ready to test in the browser....
|
1793202694.343501
|
1793289094.343501
|
|
18263
|
AquaRead by @Mohamed_Ayadi | Stardance
|
Mohamed_Ayadi
|
1
|
5.0
|
51
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T13:53:22Z", "hours": 5.0, "multiplier": 9.65, "payout": 51, "blessing": "neutral", "text": "AquaRead — Irrigation Need Predictor Know before you water. Save what the soil already has. What did I make? I built AquaRead — a tiny, browser-based tool that helps farmers decide how much water their field actually needs. It’s not another dashboard with charts for the sake of charts. It’s a practical decision helper. You enter a handful of things you already know about your field — soil type, current moisture, crop, growth stage, recent rainfall, temperature — and the tool gives you back a clear prediction (Low, Medium, or High), a confidence breakdown, a plain-language explanation, and one practical thing you can do right now. No login. No installation. No data sent anywhere. Just open the page, adjust the sliders, click predict, and get an answer. It’s built to feel like a conversation with an agronomist friend — not a machine. What was challenging? The hardest part was resisting the urge to overcomplicate things. I had a full dataset with 14 columns — Electrical Conductivity, Organic Carbon, Wind Speed, Field Area, Mulching Used, Water Source, Region, Irrigation Type — all begging to be used. But irrigation need doesn’t come from 14 things. It comes from a handful of core drivers: soil moisture, rainfall, temperature, crop stage, and soil type. So I chose essentials over impressiveness. That meant leaving out data that didn’t move the needle, trusting that farmers know their fields better than any dashboard ever could. Another challenge: the dataset is unbalanced. About 59% show Low irrigation need, 38% show Medium, and only 3% show High. High need is genuinely rare — it only happens when moisture is low AND rainfall is low AND temperatures are high simultaneously. Getting the model to recognize that rarity without over-predicting High was a delicate balance. What am I proud of? The explanation layer. It would have been easy to just show “Low” and move on. But that’s not useful. What’s useful is telling someone WHY the model said Low — so they can trust it, disagree with it, or learn something about their field. The explanation reads like: “Based on adequate soil moisture, good recent rainfall, and moderate temperatures, the model suggests Low irrigation need.” That’s just connecting the dots in a way that makes sense to a human who’s been watching the sky and feeling the soil. I’m also proud of the confidence bars. They’re simple — three horizontal bars — but they tell a story. When you see “Low: 72%, Medium: 22%, High: 6%” you know the model isn’t guessing. It’s weighing evidence. And when you see a tight spread — say, 45% / 40% / 15% — you know the conditions are borderline, and maybe you should trust your own judgment more. What should people know to test my project? Here’s how to kick the tires: Open the page in any modern browser (Chrome, Firefox, Safari, Edge — they all work). Play with the sliders and dropdowns. Try extreme conditions: Dry scenario: Moisture = 10%, Rainfall = 0mm, Temperature = 40°C → should return High. Wet scenario: Moisture = 55%, Rainfall = 1200mm, Temperature = 18°C → should return Low. Borderline: Moisture = 30%, Rainfall = 200mm, Temperature = 28°C, Crop = Rice, Stage = Flowering → often returns Medium with narrow confidence. Read the explanation. Does it match what you’d expect? Does it feel like a real agronomist talking? Look at the confidence bars. Are they wide or narrow? That tells you how clear-cut the conditions are. The tool is trained on 10,000 records across four soil types, six crops, and three seasons. The model logic is rule-based — not a neural network, but a carefully weighted decision system that mimics how an agronomist thinks. It’s transparent, predictable, and easy to tweak. Know before you water. Save what the soil already has. — AquaRead", "repo": "https://github.com/medayedi123/AquaRead", "demo": "https://aquaread.netlify.app/"}]...
|
[{"post_id": 10372, "ts": "202 [{"post_id": 10372, "ts": "2026-06-17T01:43:19Z", "hours": 5.0, "text": "🌱 AquaRead — Devlog aka “I built a plant hydration therapist” The Origin Story My mom kept drowning her garden. Every. Single. Day. Even after rain. I was like “Mom, you’re watering the tomatoes to death” and she hit me with “Well how am I supposed to know??” So I built this instead of doing my math homework. Priorities, right? What It Does You punch in some numbers about your field — soil type, moisture, what you’re growing, weather stuff — and it spits out: Low/Medium/High irrigation need How confident it is (with a fancy bar chart) Why it thinks that One actually useful thing to do right now No PhD required. No manual. Just sliders and dropdowns. The Data 10,000 real farm records. Messy. Unbalanced. Perfect. 59% Low irrigation 38% Medium 3% High (because emergencies are rare IRL) The model had to learn that “High” actually matters, not just predict “Low” every time and call it a day. What I Kept (and What I Threw Out) Used: Soil_Type, Soil_Moisture, Temperature, Humidity, Rainfall Crop_Type, Growth_Stage, Season Trashed: Electrical_Conductivity, Organic_Carbon, Wind_Speed Field_Area, Mulching, Water_Source, Region, Irrigation_Type Why? Because irrigation need comes down to like 5 things. The rest is noise. Fight me. The Design (aka “I care about colors”) Forest green ( #2d5a3d ) — the serious backbone Straw gold ( #c9a84c ) — warmth so it’s not a hospital Sage for chill, terracotta for “OMG WATER YOUR CROPS” Fonts: Literata for headings (book vibes), Plus Jakarta Sans for UI (clean but friendly), DM Mono for numbers (because monospaced numbers make my brain happy). No charts-for-the-sake-of-charts. Just the confidence bar because “Low: 72%” is way more useful than just “Low.” The Proud Moment Mom tested it. Punched in her garden. Model said: “Medium irrigation need. Soil moisture is adequate but temperature is rising. Consider watering in the evening to reduce evaporation.” She looked at me like I hacked the Matrix. I was just like “yeah, JavaScript, whatever” but inside I was doing backflips. What’s Next (v2.0) GPS weather lookup — auto-fill temperature and rainfall from a weather API History log — track predictions over time, see patterns The Honest Part (AI helped) Yeah I used AI. For the boilerplate. For the JavaScript I always forget. For debugging that one stupid bug where the bars wouldn’t render. Not for the creative decisions. Not for the colors or the flow or the “vibe.” That’s all me. Think of it as a coding intern who knows everything but has zero taste. I tell it what to build, it spits out code, I fix it, break it, fix it again, and make it actually good."}]...
|
Title: AquaRead by @Mohamed_Ayadi | Stardance
Dev Title: AquaRead by @Mohamed_Ayadi | Stardance
Devlogs:
🌱 AquaRead — Devlog aka “I built a plant hydration therapist” The Origin Story My mom kept drowning her garden. Every. Single. Day. Even after rain. I was like “Mom, you’re watering the tomatoes to death” and she hit me with “Well how am I supposed to know??” So I built this instead of doing my math homework. Priorities, right? What It Does You punch in some numbers about your field — soil type, moisture, what you’re growing, weather stuff — and it spits out: Low/Medium/High irrigation need How confident it is (with a fancy bar chart) Why it thinks that One actually useful thing to do right now No PhD required. No manual. Just sliders and dropdowns. The Data 10,000 real farm records. Messy. Unbalanced. Perfect. 59% Low irrigation 38% Medium 3% High (because emergencies are rare IRL) The model had to learn that “High” actually matters, not just predict “Low” every time and call it a day. What I Kept (and What I Threw Out) Used: Soil_Type, Soil_Moisture, Temperature, Humidity, Rainfall Crop_Type, Growth_Stage, Season Trashed: Electrical_Conductivity, Organic_Carbon, Wind_Speed Field_Area, Mulching, Water_Source, Region, Irrigation_Type Why? Because irrigation need comes down to like 5 things. The rest is noise. Fight me. The Design (aka “I care about colors”) Forest green ( #2d5a3d ) — the serious backbone Straw gold ( #c9a84c ) — warmth so it’s not a hospital Sage for chill, terracotta for “OMG WATER YOUR CROPS” Fonts: Literata for headings (book vibes), Plus Jakarta Sans for UI (clean but friendly), DM Mono for numbers (because monospaced numbers make my brain happy). No charts-for-the-sake-of-charts. Just the confidence bar because “Low: 72%” is way more useful than just “Low.” The Proud Moment Mom tested it. Punched in her garden. Model said: “Medium irrigation need. Soil moisture is adequate but temperature is rising. Consider watering in the evening to reduce evaporation.” She looked at me like I hacked the Matrix. I was just like “yeah, JavaScript, whatever” but inside I was doing backflips. What’s Next (v2.0) GPS weather lookup — auto-fill temperature and rainfall from a weather API History log — track predictions over time, see patterns The Honest Part (AI helped) Yeah I used AI. For the boilerplate. For the JavaScript I always forget. For debugging that one stupid bug where the bars wouldn’t render. Not for the creative decisions. Not for the colors or the flow or the “vibe.” That’s all me. Think of it as a coding intern who knows everything but has zero taste. I tell it what to build, it spits out code, I fix it, break it, fix it again, and make it actually good.
Ships:
AquaRead — Irrigation Need Predictor Know before you water. Save what the soil already has. What did I make? I built AquaRead — a tiny, browser-based tool that helps farmers decide how much water their field actually needs. It’s not another dashboard with charts for the sake of charts. It’s a practical decision helper. You enter a handful of things you already know about your field — soil type, current moisture, crop, growth stage, recent rainfall, temperature — and the tool gives you back a clear prediction (Low, Medium, or High), a confidence breakdown, a plain-language explanation, and one practical thing you can do right now. No login. No installation. No data sent anywhere. Just open the page, adjust the sliders, click predict, and get an answer. It’s built to feel like a conversation with an agronomist friend — not a machine. What was challenging? The hardest part was resisting the urge to overcomplicate things. I had a full dataset with 14 columns — Electrical Conductivity, Organic Carbon, Wind Speed, Field Area, Mulching Used, Water Source, Region, Irrigation Type — all begging to be used. But irrigation need doesn’t come from 14 things. It comes from a handful of core drivers: soil moisture, rainfall, temperature, crop stage, and soil type. So I chose essentials over impressiveness. That meant leaving out data that didn’t move the needle, trusting that farmers know their fields better than any dashboard ever could. Another challenge: the dataset is unbalanced. About 59% show Low irrigation need, 38% show Medium, and only 3% show High. High need is genuinely rare — it only happens when moisture is low AND rainfall is low AND temperatures are high simultaneously. Getting the model to recognize that rarity without over-predicting High was a delicate balance. What am I proud of? The explanation layer. It would have been easy to just show “Low” and move on. But that’s not useful. What’s useful is telling someone WHY the model said Low — so they can trust it, disagree with it, or learn something about their field. The explanation reads like: “Based on adequate soil moisture, good recent rainfall, and moderate temperatures, the model suggests Low irrigation need.” That’s just connecting the dots in a way that makes sense to a human who’s been watching the sky and feeling the soil. I’m also proud of the confidence bars. They’re simple — three horizontal bars — but they tell a story. When you see “Low: 72%, Medium: 22%, High: 6%” you know the model isn’t guessing. It’s weighing evidence. And when you see a tight spread — say, 45% / 40% / 15% — you know the conditions are borderline, and maybe you should trust your own judgment more. What should people know to test my project? Here’s how to kick the tires: Open the page in any modern browser (Chrome, Firefox, Safari, Edge — they all work). Play with the sliders and dropdowns. Try extreme conditions: Dry scenario: Moisture = 10%, Rainfall = 0mm, Temperature = 40°C → should return High. Wet scenario: Moisture = 55%, Rainfall = 1200mm, Temperature = 18°C → should return Low. Borderline: Moisture = 30%, Rainfall = 200mm, Temperature = 28°C, Crop = Rice, Stage = Flowering → often returns Medium with narrow confidence. Read the explanation. Does it match what you’d expect? Does it feel like a real agronomist talking? Look at the confidence bars. Are they wide or narrow? That tells you how clear-cut the conditions are. The tool is trained on 10,000 records across four soil types, six crops, and three seasons. The model logic is rule-based — not a neural network, but a carefully weighted decision system that mimics how an agronomist thinks. It’s transparent, predictable, and easy to tweak. Know before you water. Save what the soil already has. — AquaRead...
|
1792878806.9196854
|
1793742806.9196854
|
|
18266
|
FileOrganiser9000 by @lando498 | Stardance
|
lando498
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T01:23:21Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My File is a simple file organizer that organizes files by file extension, detects new files and organises them and tracks how many files have been organised. This project may be short and simple but with just 2 clicks you can organise a whole directory.", "repo": "https://github.com/Lando498/FileOrganiser", "demo": "https://github.com/Lando498/FileOrganiser/releases"}]...
|
[{"post_id": 8442, "ts": "2026 [{"post_id": 8442, "ts": "2026-06-14T01:21:46Z", "hours": 0.25, "text": "icon added (made by gemini)"}, {"post_id": 8432, "ts": "2026-06-14T00:54:23Z", "hours": 0.3853, "text": "updated UI"}, {"post_id": 8423, "ts": "2026-06-14T00:16:00Z", "hours": 0.8781, "text": "i might add some cool ui no clue how to do it though all my programs look straight from 2008"}]...
|
Title: FileOrganiser9000 by @lando498 | Stardance
Title: FileOrganiser9000 by @lando498 | Stardance
Devlogs:
i might add some cool ui no clue how to do it though all my programs look straight from 2008
updated UI
icon added (made by gemini)
Ships:
My File is a simple file organizer that organizes files by file extension, detects new files and organises them and tracks how many files have been organised. This project may be short and simple but with just 2 clicks you can organise a whole directory....
|
1793141451.997526
|
1793227851.997526
|
|
18267
|
My very own WebOS by @zak_books1 | Stardance
|
zak_books1
|
1
|
2.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T18:03:20Z", "hours": 2.0, "multiplier": 1.64, "payout": 3, "blessing": "neutral", "text": "i made a os that can be run in the web", "repo": "https://github.com/zakbooks1/QWERTY-OS", "demo": "https://qwerty-os.vercel.app/"}]...
|
[{"post_id": 9342, "ts": "2026 [{"post_id": 9342, "ts": "2026-06-15T17:54:03Z", "hours": 0.4083, "text": "I’m finally done"}, {"post_id": 8926, "ts": "2026-06-14T20:55:47Z", "hours": 0.7894, "text": "changed the style from mac to windows xp"}, {"post_id": 8850, "ts": "2026-06-14T18:35:34Z", "hours": 0.8056, "text": "just got a start screen up"}]...
|
Title: My very own WebOS by @zak_books1 | Stardanc Title: My very own WebOS by @zak_books1 | Stardance
Devlogs:
just got a start screen up
changed the style from mac to windows xp
I’m finally done
Ships:
i made a os that can be run in the web...
|
1793141395.6198967
|
1793227795.6198967
|
|
18284
|
Self Watering Bot by @Harug | Stardance
|
Harug
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-20T07:06:50Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is a bot that waters your plants for you! You put the sensor into your potting soil, and either put a tube for your pump, or just put it facing at your pot, put in a 9v, and plug in the cable and you are good to go! This is my first project so I was very nervous, shorted the esp32 a couple of times (Whoops!), so it took much longer as well. A couple of hours were spent offline figuring out how the code and all worked but I was not allowed to put it in the final shipped time, so this took more around 7-8 hours. Either way, this was a great first project, that made me a lot more fond so I hope on doing better in the future and keep building. Thank you Stardance for making this opportunity possible!!", "repo": "https://github.com/Haru-10/Self-Watering-System", "demo": ""}]...
|
[{"post_id": 12385, "ts": "202 [{"post_id": 12385, "ts": "2026-06-20T06:54:11Z", "hours": 0.4356, "text": "Project completed! For some reason 1 hr was taken off of my time? Not sure why, however it has been completed. The only thing that would finish this up would be to use a tube instead of a bottle, however budget restraints stop that, and I am not really going to bother Stardance with a single pipe. This was my first project and I feel great. I learned all about esp mechanics, how to use a relat module, how to read analog and digital signals, and how to code. I am deeply appreciative at this time, and plan on pursuing other projects. It is quite simplistic, however very nice!"}, {"post_id": 9490, "ts": "2026-06-15T20:50:03Z", "hours": 3.3261, "text": "Very fun work so far, was able to get the pump to work well, almost fried my esp32, but was eventualy able to get my relay system working. I also got the code to work, so now I have to wire everything, and finish up the code. For a first project so far, it has been very fulfilling, however very challenging."}]...
|
Title: Self Watering Bot by @Harug | Stardance
De Title: Self Watering Bot by @Harug | Stardance
Devlogs:
Very fun work so far, was able to get the pump to work well, almost fried my esp32, but was eventualy able to get my relay system working. I also got the code to work, so now I have to wire everything, and finish up the code. For a first project so far, it has been very fulfilling, however very challenging.
Project completed! For some reason 1 hr was taken off of my time? Not sure why, however it has been completed. The only thing that would finish this up would be to use a tube instead of a bottle, however budget restraints stop that, and I am not really going to bother Stardance with a single pipe. This was my first project and I feel great. I learned all about esp mechanics, how to use a relat module, how to read analog and digital signals, and how to code. I am deeply appreciative at this time, and plan on pursuing other projects. It is quite simplistic, however very nice!
Ships:
This is a bot that waters your plants for you! You put the sensor into your potting soil, and either put a tube for your pump, or just put it facing at your pot, put in a 9v, and plug in the cable and you are good to go! This is my first project so I was very nervous, shorted the esp32 a couple of times (Whoops!), so it took much longer as well. A couple of hours were spent offline figuring out how the code and all worked but I was not allowed to put it in the final shipped time, so this took more around 7-8 hours. Either way, this was a great first project, that made me a lot more fond so I hope on doing better in the future and keep building. Thank you Stardance for making this opportunity possible!!...
|
1793138106.721296
|
1793224506.721296
|
|
18299
|
kiBoard by @Leah | Stardance
|
Leah
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-20T07:23:01Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a keyboard with one hundred and sixty keys! It definitely took a bit to make since I had to relearn a lot of things but I think it paid off! It features two function rows as well as a ton of extra keys available to remap to whatever youd like! (Actual time is closer to 10~ish hours but lapse didnt record the thing properly) I hope you all like it as much as I do!", "repo": "https://github.com/colorBanded/kiBoard/", "demo": ""}]...
|
[{"post_id": 12392, "ts": "202 [{"post_id": 12392, "ts": "2026-06-20T07:04:23Z", "hours": 0.2878, "text": "Now theres an enclosure! I think messing around with blender has helped me a little bit with fusion, its slanted a bit towards the user so it wont be as difficult to use"}, {"post_id": 11159, "ts": "2026-06-18T07:47:08Z", "hours": 0.3806, "text": "This is a bit of a long devlog as most of the project was recorded through lapse but was not notified of a systems interruption prior to recording so that time is unavailable (~8 hours). So Ive gotten most of the keyboard completed aside from some things like BOM and other things and I think its coming together pretty nicely. I started out by drafting a layout for something that I would feel comfortable using in an online keyboard editor that I had previously used for another hackpad project. After that I had to research the type of sbcs I could use as the XIAO RP2040 is a nice inexpensive board it did not have enough IO pins for the amount of keys I had used in the project, so I switched to a Pi Pico (Which unfortunately also did not have enough pins required to wire everything together) And I was trying to avoid using an IO expander; someone on a huddle introduced me to a technique where instead of wiring a key matrix of one row and column per row/columns, you double the rows and halve the columns to try to achieve a lower pinout count to hookup to the SBC you use, which worked to an extent but ultimately I had to learn how to use an IO expander which someone else had helped me with props to the people on the huddle. After this I had to get everything into kiCad and I tried out a couple different plugins to help with wiring since there was a LOT of keys but none of them completely helped so in the end I had to wire about half the board to clear the about ~1000 errors (something that half occured from the plugins, half from me using the wrong footprint in the final pcb. In total there is about 158 keys on this keyboard with the main standouts being an extra macropad on the left side as well as an extra function row (“Im gonna press the F25 key”) All I have left to do is make the case, set up the repository correctly and do the gerbers and this will be ready to ship!"}]...
|
Title: kiBoard by @Leah | Stardance
Devlogs:
This Title: kiBoard by @Leah | Stardance
Devlogs:
This is a bit of a long devlog as most of the project was recorded through lapse but was not notified of a systems interruption prior to recording so that time is unavailable (~8 hours). So Ive gotten most of the keyboard completed aside from some things like BOM and other things and I think its coming together pretty nicely. I started out by drafting a layout for something that I would feel comfortable using in an online keyboard editor that I had previously used for another hackpad project. After that I had to research the type of sbcs I could use as the XIAO RP2040 is a nice inexpensive board it did not have enough IO pins for the amount of keys I had used in the project, so I switched to a Pi Pico (Which unfortunately also did not have enough pins required to wire everything together) And I was trying to avoid using an IO expander; someone on a huddle introduced me to a technique where instead of wiring a key matrix of one row and column per row/columns, you double the rows and halve the columns to try to achieve a lower pinout count to hookup to the SBC you use, which worked to an extent but ultimately I had to learn how to use an IO expander which someone else had helped me with props to the people on the huddle. After this I had to get everything into kiCad and I tried out a couple different plugins to help with wiring since there was a LOT of keys but none of them completely helped so in the end I had to wire about half the board to clear the about ~1000 errors (something that half occured from the plugins, half from me using the wrong footprint in the final pcb. In total there is about 158 keys on this keyboard with the main standouts being an extra macropad on the left side as well as an extra function row (“Im gonna press the F25 key”) All I have left to do is make the case, set up the repository correctly and do the gerbers and this will be ready to ship!
Now theres an enclosure! I think messing around with blender has helped me a little bit with fusion, its slanted a bit towards the user so it wont be as difficult to use
Ships:
I created a keyboard with one hundred and sixty keys! It definitely took a bit to make since I had to relearn a lot of things but I think it paid off! It features two function rows as well as a ton of extra keys available to remap to whatever youd like! (Actual time is closer to 10~ish hours but lapse didnt record the thing properly) I hope you all like it as much as I do!...
|
1793134297.475971
|
1793220697.475971
|
|
18301
|
BMI Calculator by @7afezzz | Stardance
|
7afezzz
|
1
|
3.0
|
42
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T02:30:30Z", "hours": 3.0, "multiplier": 12.05, "payout": 42, "blessing": "neutral", "text": "The BMI Calculator app does a lot more than tell you if it’s okay to eat another cookie; it allows the user to calculate several aspects of health using just height and weight to calculate many health metrics including BMI, Body Fat %, Basal Metabolism Rate (BMR), Total Daily Energy Expenditure (TDEE), Lean Body Mass (LBM) and Ideal Weight. The biggest challenge I faced was ensuring that all of the formulas produced accurate results while maintaining ease of use. Nobody wants to take a math test to figure out their BMI! I am very proud of my ability to provide users with a simple, easy-to-use app that can calculate all these health metrics as accurately as possible, and provides instant feedback to users backed by real science. To use the app simply enter realistic values for height, weight, age and sex. Play around with different height, weight, age and sex inputs and see how the different health metrics change - it’s like an experiment you can perform on yourself without needing a lab coat!", "repo": "https://github.com/abdelrahman-mo7amd/BMI", "demo": "https://abdelrahman-mo7amd.github.io/BMI/"}]...
|
[{"post_id": 8468, "ts": "2026 [{"post_id": 8468, "ts": "2026-06-14T02:24:35Z", "hours": 3.4747, "text": "This week I developed a BMI Calculator Web Application designed to provide users with more than just a Body Mass Index score. Instead of showing a single number, the application delivers a comprehensive health overview including: Body Mass Index (BMI) Body Fat Percentage Estimate Basal Metabolic Rate (BMR) Total Daily Energy Expenditure (TDEE) Ideal Body Weight Lean Body Mass Interactive BMI Gauge Visualization Support for Metric and Imperial Units This BMI Calculator is based on internationally recognized health and nutrition formulas used by organizations such as the World Health Organization and Centers for Disease Control and Prevention. The app calculates Body Mass Index (BMI) by comparing a user’s weight to the square of their height, providing an indication of whether they are underweight, normal weight, overweight, or obese. To deliver deeper insights, the calculator also estimates Body Fat Percentage, Basal Metabolic Rate (BMR), Total Daily Energy Expenditure (TDEE), Ideal Body Weight, and Lean Body Mass using scientifically validated equations commonly applied in nutrition, fitness, and healthcare."}]...
|
Title: BMI Calculator by @7afezzz | Stardance
Dev Title: BMI Calculator by @7afezzz | Stardance
Devlogs:
This week I developed a BMI Calculator Web Application designed to provide users with more than just a Body Mass Index score. Instead of showing a single number, the application delivers a comprehensive health overview including: Body Mass Index (BMI) Body Fat Percentage Estimate Basal Metabolic Rate (BMR) Total Daily Energy Expenditure (TDEE) Ideal Body Weight Lean Body Mass Interactive BMI Gauge Visualization Support for Metric and Imperial Units This BMI Calculator is based on internationally recognized health and nutrition formulas used by organizations such as the World Health Organization and Centers for Disease Control and Prevention. The app calculates Body Mass Index (BMI) by comparing a user’s weight to the square of their height, providing an indication of whether they are underweight, normal weight, overweight, or obese. To deliver deeper insights, the calculator also estimates Body Fat Percentage, Basal Metabolic Rate (BMR), Total Daily Energy Expenditure (TDEE), Ideal Body Weight, and Lean Body Mass using scientifically validated equations commonly applied in nutrition, fitness, and healthcare.
Ships:
The BMI Calculator app does a lot more than tell you if it’s okay to eat another cookie; it allows the user to calculate several aspects of health using just height and weight to calculate many health metrics including BMI, Body Fat %, Basal Metabolism Rate (BMR), Total Daily Energy Expenditure (TDEE), Lean Body Mass (LBM) and Ideal Weight. The biggest challenge I faced was ensuring that all of the formulas produced accurate results while maintaining ease of use. Nobody wants to take a math test to figure out their BMI! I am very proud of my ability to provide users with a simple, easy-to-use app that can calculate all these health metrics as accurately as possible, and provides instant feedback to users backed by real science. To use the app simply enter realistic values for height, weight, age and sex. Play around with different height, weight, age and sex inputs and see how the different health metrics change - it’s like an experiment you can perform on yourself without needing a lab coat!...
|
1793123461.50477
|
1793209861.50477
|
|
18307
|
Nirvanna the Band the Show the Flappy Game by @You Nirvanna the Band the Show the Flappy Game by @YourLocalTransGoth | Stardance...
|
YourLocalTransGoth
|
1
|
2.27
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T08:26:36Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a flappy bird clone themed after Nirvanna the Band the Show", "repo": "https://github.com/YourLocalTransGoth/Nirvanna-the-Band-the-Show-the-Flappy-Game", "demo": "https://yourlocaltransgoth.github.io/Nirvanna-the-Band-the-Show-the-Flappy-Game/"}]...
|
[{"post_id": 8970, "ts": "2026 [{"post_id": 8970, "ts": "2026-06-14T22:41:37Z", "hours": 0.2683, "text": "Just cleaned up some things"}, {"post_id": 8577, "ts": "2026-06-14T08:15:54Z", "hours": 0.4169, "text": "Finished the game"}, {"post_id": 8491, "ts": "2026-06-14T03:38:57Z", "hours": 0.8656, "text": "The CN towers and Jay are moving"}, {"post_id": 8458, "ts": "2026-06-14T02:05:48Z", "hours": 0.4303, "text": "Jay is in"}]...
|
Title: Nirvanna the Band the Show the Flappy Game Title: Nirvanna the Band the Show the Flappy Game by @YourLocalTransGoth | Stardance
Devlogs:
Jay is in
The CN towers and Jay are moving
Finished the game
Just cleaned up some things
Ships:
I created a flappy bird clone themed after Nirvanna the Band the Show...
|
1793263855.1787076
|
1793350255.1787076
|
|
18323
|
Appick by @vrplays | Stardance
|
vrplays
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-23T16:05:13Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Appick is a four key macropad that can launch apps for you instantly. Currently, it can open Brave, Discord, Steam, and Spotify, but with some modifications it can open any app! This took a long time to create, but eventually I was able to finish this and created a good product.", "repo": "https://github.com/VR2011/Appick", "demo": ""}]...
|
[{"post_id": 14448, "ts": "202 [{"post_id": 14448, "ts": "2026-06-23T16:02:02Z", "hours": 0.3356, "text": "Devlog #3 - Firmware complete! With that done, my Hackpad is finally complete! I thought that I wouldn’t even be able to complete this, but with lots of perseverance (nasa reference lol) I was able to create full projects in applications I’ve NEVER used before. Seriously, I’ve never used Fusion 360 or KiCad before, but with help from a lot of resources (and a little bit of AI), I’ve created working projects. Hopefully this is everything I need to do, because this took a very long time."}, {"post_id": 13939, "ts": "2026-06-22T21:33:52Z", "hours": 2.5164, "text": "Devlog #2 - CAD and PCB FINISHED! This took way too long to complete. I had to remake the CAD project maybe 4 times because of random issues, and had to rewire my PCB many, many times thanks to the fact that the wires wouldn’t move with the objects. Anyway, I also added the components to my PCB and made a final, full CAD project. IF ANYONE IS SEEING THIS, PLEASE GIVE ME FEEDBACK!!!!!!"}, {"post_id": 13520, "ts": "2026-06-22T04:00:44Z", "hours": 0.9594, "text": "Devlog #1 - CAD and PCB Took a bit of time (unfortunately I didn’t log some of the time I spent on the CAD,) but I finished the base of the CAD, along with the PCB. What do you guys think?"}]...
|
Title: Appick by @vrplays | Stardance
Devlogs:
De Title: Appick by @vrplays | Stardance
Devlogs:
Devlog #1 - CAD and PCB Took a bit of time (unfortunately I didn’t log some of the time I spent on the CAD,) but I finished the base of the CAD, along with the PCB. What do you guys think?
Devlog #2 - CAD and PCB FINISHED! This took way too long to complete. I had to remake the CAD project maybe 4 times because of random issues, and had to rewire my PCB many, many times thanks to the fact that the wires wouldn’t move with the objects. Anyway, I also added the components to my PCB and made a final, full CAD project. IF ANYONE IS SEEING THIS, PLEASE GIVE ME FEEDBACK!!!!!!
Devlog #3 - Firmware complete! With that done, my Hackpad is finally complete! I thought that I wouldn’t even be able to complete this, but with lots of perseverance (nasa reference lol) I was able to create full projects in applications I’ve NEVER used before. Seriously, I’ve never used Fusion 360 or KiCad before, but with help from a lot of resources (and a little bit of AI), I’ve created working projects. Hopefully this is everything I need to do, because this took a very long time.
Ships:
Appick is a four key macropad that can launch apps for you instantly. Currently, it can open Brave, Discord, Steam, and Spotify, but with some modifications it can open any app! This took a long time to create, but eventually I was able to finish this and created a good product....
|
1793141474.8842356
|
1793227874.8842356
|
|
18359
|
rinoOS by @justrivaan | Stardance
|
justrivaan
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-26T07:19:07Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "the mission said build a personal website. i didn’t want to do the usual thing, a page with my name, a list of projects, some links. that’s boring and nobody actually reads it. i wanted something where you actually have to explore to find out who i am. so instead of a website about me, i made an OS that feels like mine. live like rino. you boot in, pick a wallpaper from 8 presets, then land on a full desktop with a dock, draggable and resizable windows, a top bar with a live clock, and a right click menu on the desktop. there’s a guide app that walks you through how to get around, a sticky notes app you can actually type in, and a jarvis terminal where you type commands like “hey jarvis, open projects” and it actually does it. the windows have all three buttons working, red closes, yellow minimizes the window into a tray tile next to the dock, green fullscreens it. everything is one single html file, no frameworks, no libraries, no backend. what was challenging: a lot of small things that looked easy and weren’t. getting window drag and resize to not fight each other took a while. the guide hint bubble was floating to the wrong spot because a css transform on the dock was silently breaking position fixed for anything inside it, took actual debugging to figure that one out. the boot bar looked smooth in code but felt jittery visually, ended up rewriting it with requestAnimationFrame timed against actual elapsed time instead of random setInterval increments. what i’m proud of: it actually feels like an OS. the boot sequence, the wallpaper picker before you even see the desktop, the tray for minimized windows, the way the guide hint pops up and points at the right icon. none of that was in the original mission brief, i just kept adding things because it didn’t feel done yet. to test it: wait for it to boot, pick any wallpaper, click around the dock. right click the empty desktop for shortcuts. open the terminal and try “hey jarvis, help” to see what it can do. if you want to see the projects window, click the folder icon or say “hey jarvis, open projects.”", "repo": "https://github.com/officiallyrivaan/rinoOS", "demo": "https://officiallyrivaan.github.io/rinoOS/"}]...
|
[{"post_id": 12906, "ts": "202 [{"post_id": 12906, "ts": "2026-06-21T04:09:06Z", "hours": 0.0, "text": "Last thing before this is finished. Added an actual learning guide for the OS, rather than having to figure it out by trial and error. There’s now a Guide app, with a teal icon located at the start of the dock. It launches into a window that takes you through all the basics, like opening applications, resizing and moving windows, what the three buttons for windows do, the context menu, talking to Jarvis in the terminal. When you first land on the desktop, a tooltip will pop up that shows you where the Guide icon is, and says “New here? Click Guide to get to know the OS.” Also, I added the context menu on the desktop. Just do a right-click on any empty space on your desktop and there will be quick access to such things as opening terminal, creating a sticky note, opening guides, changing wallpapers. However, you won’t see this menu when you perform the same action over an opened application, it is only visible on an empty desktop. I had to deal with some bugs that not many people are even going to notice, but which were crucial for my program. After I implemented the resizing functionality, the dragging became somewhat slow, which resulted from a css transition intended only for maximizing an application being applied to dragging and resizing as well. and there was another issue with the hint bubble being pointed to the guide icon. That one was a strange one, it turned out that a transform on the dock’s container element broke the position:fixed styling of everything within it, so the bubble was aligning itself to the center of the dock rather than the screen. Moved it outside of it and it now perfectly aligns with the icon, double checked on different screen sizes. Finally, the boot sequence needed some work too. The animation itself was smooth enough, but at the total duration of 2.6 seconds, it just felt like skipping through rather than loading 5 messages. Slowed it down to about 4 seconds and added a smooth crossfade in between each message instead of the abrupt change, and now it feels like an actual boot sequence, not just random colors. That is all I have for now for rinoOS. Boot up, choose a background, click around, talk to jarvis when bored. Live the rino life 🟣"}, {"post_id": 12450, "ts": "2026-06-20T09:50:01Z", "hours": 0.0, "text": "picking up from devlog #1. last time the three window buttons just sat there doing nothing, red worked but yellow and green were dead weight. fixed that.minimize now actually minimizes. click yellow and the window shrinks down and tucks itself into a little tray right next to the dock, like a real taskbar. click the tile and it pops back open exactly where it was.fullscreen works too. green button blows the window up to fill the whole desktop, click again and it snaps back to wherever it was sitting before. sticky notes is finally here. it’s its own app in the dock now, click the + tile and a new note shows up, type whatever, delete it with the x in the corner. they’re scattered at slight angles so it actually looks like sticky notes and not a grid.also made every window resizable from the bottom right corner, figured if you’re gonna explore my OS you should be able to make a window bigger to actually read stuff instead of squinting. ran into one annoying bug along the way: dragging windows around started feeling laggy and weird after i added resizing, turned out a css transition meant only for the maximize animation was quietly applying to every drag and resize too, so windows were animating toward your cursor instead of just following it. fixed by only turning that transition on for the maximize snap and keeping drag/resize completely instant. one more update coming next."}, {"post_id": 11220, "ts": "2026-06-18T11:24:52Z", "hours": 0.0, "text": "so the mission was basically: build a personal website, but make it actually interesting instead of the usual “hi, here’s my resume” page nobody reads. my first instinct was to do the safe thing, a simple portfolio site, projects listed top to bottom, done in an hour. but that felt like the laziest version of the mission. anyone can make a list of stuff they built.so instead i made rinoOS, (rino being my digital identity) live like rino. the idea: instead of reading about me, you boot into a whole fake OS and explore it like it’s actually mine. you start on a boot screen that fake loads stuff like “syncing f1 telemetry… brewing chai…” then you pick a wallpaper before you even see the desktop. after that you’re dropped into a real desktop with draggable windows, a dock, and a working clock, and you click around to find out who i am instead of scrolling a page.i built most of this outside the repo first, just working on the html locally and testing it as i went, then finally moved everything over once it actually worked.what’s in it so far: 8 wallpapers, pick your vibe before you boot in. windows for About, Projects, Skills, F1 Fan Zone, and Contact. a Jarvis terminal you can actually type commands into, like hey jarvis, open projects.the projects window has my real stuff: Jarvis, a voice assistant i built with whisper and ollama, a live F1 telemetry dashboard, and Time Debt, a roblox game where you’re racing the clock to collect as much as possible before time runs out. biggest issue so far: it looked perfect locally, then i pushed it to github pages and got a blank readme instead of my site. turns out pages only serves a file named exactly index.html. dumb mistake, learned it fast. next up: a sticky notes app and proper minimize to dock animations. live like rino 🟣"}]...
|
Title: rinoOS by @justrivaan | Stardance
Devlogs: Title: rinoOS by @justrivaan | Stardance
Devlogs:
so the mission was basically: build a personal website, but make it actually interesting instead of the usual “hi, here’s my resume” page nobody reads. my first instinct was to do the safe thing, a simple portfolio site, projects listed top to bottom, done in an hour. but that felt like the laziest version of the mission. anyone can make a list of stuff they built.so instead i made rinoOS, (rino being my digital identity) live like rino. the idea: instead of reading about me, you boot into a whole fake OS and explore it like it’s actually mine. you start on a boot screen that fake loads stuff like “syncing f1 telemetry… brewing chai…” then you pick a wallpaper before you even see the desktop. after that you’re dropped into a real desktop with draggable windows, a dock, and a working clock, and you click around to find out who i am instead of scrolling a page.i built most of this outside the repo first, just working on the html locally and testing it as i went, then finally moved everything over once it actually worked.what’s in it so far: 8 wallpapers, pick your vibe before you boot in. windows for About, Projects, Skills, F1 Fan Zone, and Contact. a Jarvis terminal you can actually type commands into, like hey jarvis, open projects.the projects window has my real stuff: Jarvis, a voice assistant i built with whisper and ollama, a live F1 telemetry dashboard, and Time Debt, a roblox game where you’re racing the clock to collect as much as possible before time runs out. biggest issue so far: it looked perfect locally, then i pushed it to github pages and got a blank readme instead of my site. turns out pages only serves a file named exactly index.html. dumb mistake, learned it fast. next up: a sticky notes app and proper minimize to dock animations. live like rino 🟣
picking up from devlog #1. last time the three window buttons just sat there doing nothing, red worked but yellow and green were dead weight. fixed that.minimize now actually minimizes. click yellow and the window shrinks down and tucks itself into a little tray right next to the dock, like a real taskbar. click the tile and it pops back open exactly where it was.fullscreen works too. green button blows the window up to fill the whole desktop, click again and it snaps back to wherever it was sitting before. sticky notes is finally here. it’s its own app in the dock now, click the + tile and a new note shows up, type whatever, delete it with the x in the corner. they’re scattered at slight angles so it actually looks like sticky notes and not a grid.also made every window resizable from the bottom right corner, figured if you’re gonna explore my OS you should be able to make a window bigger to actually read stuff instead of squinting. ran into one annoying bug along the way: dragging windows around started feeling laggy and weird after i added resizing, turned out a css transition meant only for the maximize animation was quietly applying to every drag and resize too, so windows were animating toward your cursor instead of just following it. fixed by only turning that transition on for the maximize snap and keeping drag/resize completely instant. one more update coming next.
Last thing before this is finished. Added an actual learning guide for the OS, rather than having to figure it out by trial and error. There’s now a Guide app, with a teal icon located at the start of the dock. It launches into a window that takes you through all the basics, like opening applications, resizing and moving windows, what the three buttons for windows do, the context menu, talking to Jarvis in the terminal. When you first land on the desktop, a tooltip will pop up that shows you where the Guide icon is, and says “New here? Click Guide to get to know the OS.” Also, I added the context menu on the desktop. Just do a right-click on any empty space on your desktop and there will be quick access to such things as opening terminal, creating a sticky note, opening guides, changing wallpapers. However, you won’t see this menu when you perform the same action over an opened application, it is only visible on an empty desktop. I had to deal with some bugs that not many people are even going to notice, but which were crucial for my program. After I implemented the resizing functionality, the dragging became somewhat slow, which resulted from a css transition intended only for maximizing an application being applied to dragging and resizing as well. and there was another issue with the hint bubble being pointed to the guide icon. That one was a strange one, it turned out that a transform on the dock’s container element broke the position:fixed styling of everything within it, so the bubble was aligning itself to the center of the dock rather than the screen. Moved it outside of it and it now perfectly aligns with the icon, double checked on different screen sizes. Finally, the boot sequence needed some work too. The animation itself was smooth enough, but at the total duration of 2.6 seconds, it just felt like skipping through rather than loading 5 messages. Slowed it down to about 4 seconds and added a smooth crossfade in between each message instead of the abrupt change, and now it feels like an actual boot sequence, not just random colors. That is all I have for now for rinoOS. Boot up, choose a background, click around, talk to jarvis when bored. Live the rino life 🟣
Ships:
the mission said build a personal website. i didn’t want to do the usual thing, a page with my name, a list of projects, some links. that’s boring and nobody actually reads it. i wanted something where you actually have to explore to find out who i am. so instead of a website about me, i made an OS that feels like mine. live like rino. you boot in, pick a wallpaper from 8 presets, then land on a full desktop with a dock, draggable and resizable windows, a top bar with a live clock, and a right click menu on the desktop. there’s a guide app that walks you through how to get around, a sticky notes app you can actually type in, and a jarvis terminal where you type commands like “hey jarvis, open projects” and it actually does it. the windows have all three buttons working, red closes, yellow minimizes the window into a tray tile next to the dock, green fullscreens it. everything is one single html file, no frameworks, no libraries, no backend. what was challenging: a lot of small things that looked easy and weren’t. getting window drag and resize to not fight each other took a while. the guide hint bubble was floating to the wrong spot because a css transform on the dock was silently breaking position fixed for anything inside it, took actual debugging to figure that one out. the boot bar looked smooth in code but felt jittery visually, ended up rewriting it with requestAnimationFrame timed against actual elapsed time instead of random setInterval increments. what i’m proud of: it actually feels like an OS. the boot sequence, the wallpaper picker before you even see the desktop, the tray for minimized windows, the way the guide hint pops up and points at the right icon. none of that was in the original mission brief, i just kept adding things because it didn’t feel done yet. to test it: wait for it to boot, pick any wallpaper, click around the dock. right click the empty desktop for shortcuts. open the terminal and try “hey jarvis, help” to see what it can do. if you want to see the projects window, click the folder icon or say “hey jarvis, open projects.”...
|
1792882038.465076
|
1793746038.465076
|
|
18400
|
The HackroPad by @aashvik | Stardance
|
aashvik
|
1
|
3.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T08:25:55Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I loved creating my first macropad! The hardest part was getting the 3D model to actually show up on the website because of file paths, GitHub Pages setup, and weird JavaScript/module errors, but I mainly built it to make coding faster and to learn how a full hardware project comes together end to end. I made it because i wanted to create an efficient way to type code faster to speed up production of code!", "repo": "https://github.com/koditra/hackropad", "demo": ""}]...
|
[{"post_id": 8568, "ts": "2026 [{"post_id": 8568, "ts": "2026-06-14T07:40:39Z", "hours": 3.4578, "text": "I wanted to make a macropod and thought that it might be a rlly cool idea if i can use it to speed up coding by adding pre build code that is frequently used by hack clubbers. I started with the KMK firmware and wrote the keymap for the Seeeduino XIAO. I set up three inputs on D10, D9, and D8, then assigned macros to each key: an if/else block, a for loop, and a debug print statement. The macros are designed to insert the full snippet and move the cursor into the correct position inside the code. After firmware, I moved to the PCB design in KiCad. I created a simple schematic (following the tutorial) using the XIAO and three push buttons, then routed the connections directly to the GPIO pins used in the firmware. Finally, I designed a basic 3D case with a top and bottom shell. The case was modeled around the PCB footprint, with cutouts for the switches and USB port, and basic tolerances for fit. It was annoying that the plate generator wouldn’t generate the correct size that would fit with the rest of my build, so I resized it and broke it into and extra piece for simplicity. At the end, I organized everything into the required repository structure, including firmware, PCB files, and CAD exports. I’m rlly proud of this project, and hope that I can use it to create other projects too! :)"}]...
|
Title: The HackroPad by @aashvik | Stardance
Devl Title: The HackroPad by @aashvik | Stardance
Devlogs:
I wanted to make a macropod and thought that it might be a rlly cool idea if i can use it to speed up coding by adding pre build code that is frequently used by hack clubbers. I started with the KMK firmware and wrote the keymap for the Seeeduino XIAO. I set up three inputs on D10, D9, and D8, then assigned macros to each key: an if/else block, a for loop, and a debug print statement. The macros are designed to insert the full snippet and move the cursor into the correct position inside the code. After firmware, I moved to the PCB design in KiCad. I created a simple schematic (following the tutorial) using the XIAO and three push buttons, then routed the connections directly to the GPIO pins used in the firmware. Finally, I designed a basic 3D case with a top and bottom shell. The case was modeled around the PCB footprint, with cutouts for the switches and USB port, and basic tolerances for fit. It was annoying that the plate generator wouldn’t generate the correct size that would fit with the rest of my build, so I resized it and broke it into and extra piece for simplicity. At the end, I organized everything into the required repository structure, including firmware, PCB files, and CAD exports. I’m rlly proud of this project, and hope that I can use it to create other projects too! :)
Ships:
I loved creating my first macropad! The hardest part was getting the 3D model to actually show up on the website because of file paths, GitHub Pages setup, and weird JavaScript/module errors, but I mainly built it to make coding faster and to learn how a full hardware project comes together end to end. I made it because i wanted to create an efficient way to type code faster to speed up production of code!...
|
1793278039.3091857
|
1793364439.3091857
|
|
18416
|
NEO_0S by @Amedo | Stardance
|
Amedo
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-22T17:28:07Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built Cosmic WebOS, a space-themed virtual desktop featuring custom glassmorphic layouts and a dark nebula palette that I designed and hand-coded entirely from scratch using HTML and CSS. To make it completely my own, I engineered a custom Smart Search Hub where typing commands like open calc or stardance launches system tools and portals dynamically. The OS includes a working Calculator, a Notepad app with localStorage persistence, and a live gradient theme-switcher in Settings. While I handled the creative direction, asset placement, and visual layout, I collaborated with an AI assistant to write the trickier background JavaScript logic for window-dragging coordinate physics and iframe sandboxing wrappers. One of my favorite challenges was troubleshooting an annoying encoding glitch (Mojibake) that scrambled my cosmic emojis until I fixed it by injecting strict mapping tags into my HTML head. There is no password required to log in—anyone can load the desktop instantly to slide the windows around, test out the custom search routing commands, or live-swap the background themes in real time!", "repo": "https://github.com/Anubublackop/NEO_0S", "demo": "https://anubublackop.github.io/NEO_0S/"}]...
|
[{"post_id": 13790, "ts": "202 [{"post_id": 13790, "ts": "2026-06-22T16:29:51Z", "hours": 0.0, "text": "Am done with the OS just remaing to be ship and getting the link."}, {"post_id": 13025, "ts": "2026-06-21T09:25:28Z", "hours": 1.0, "text": "Am Creating my own operating system here is how it look so far."}]...
|
Title: NEO_0S by @Amedo | Stardance
Devlogs:
Am C Title: NEO_0S by @Amedo | Stardance
Devlogs:
Am Creating my own operating system here is how it look so far.
Am done with the OS just remaing to be ship and getting the link.
Ships:
I built Cosmic WebOS, a space-themed virtual desktop featuring custom glassmorphic layouts and a dark nebula palette that I designed and hand-coded entirely from scratch using HTML and CSS. To make it completely my own, I engineered a custom Smart Search Hub where typing commands like open calc or stardance launches system tools and portals dynamically. The OS includes a working Calculator, a Notepad app with localStorage persistence, and a live gradient theme-switcher in Settings. While I handled the creative direction, asset placement, and visual layout, I collaborated with an AI assistant to write the trickier background JavaScript logic for window-dragging coordinate physics and iframe sandboxing wrappers. One of my favorite challenges was troubleshooting an annoying encoding glitch (Mojibake) that scrambled my cosmic emojis until I fixed it by injecting strict mapping tags into my HTML head. There is no password required to log in—anyone can load the desktop instantly to slide the windows around, test out the custom search routing commands, or live-swap the background themes in real time!...
|
1792878869.202147
|
1793742869.202147
|
|
18423
|
Study Planner by @juny62017 | Stardance
|
juny62017
|
1
|
6.0
|
45
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T09:15:00Z", "hours": 6.0, "multiplier": 7.23, "payout": 45, "blessing": "neutral", "text": "i made this for students who really wants to focus on their upcoming exam and wants to complete syllabus with the constant pace", "repo": "https://github.com/juny62017/Study-planner", "demo": "https://juny62017.github.io/Study-planner/"}]...
|
[{"post_id": 9831, "ts": "2026 [{"post_id": 9831, "ts": "2026-06-16T08:51:56Z", "hours": 0.3056, "text": "Devlog 10 - Subject Editing Feature I added a feature that allows users to edit existing subjects. Previously, once a subject was added, the only option was to remove it and create a new one. This was inconvenient if a user made a typing mistake or wanted to rename a subject. To improve usability, I added an Edit button to every subject card. When the button is clicked, the user can enter a new subject name and update the information directly from the planner. I tested the feature with different subject names and also added validation to prevent empty values from being saved. I also updated the local storage data after editing so the changes remain available even after refreshing the page."}, {"post_id": 9820, "ts": "2026-06-16T08:22:44Z", "hours": 0.3506, "text": "Devlog 9 - Clear All Subjects Feature I added a feature that allows users to remove all subjects at once. Previously, subjects could only be removed one by one. This worked fine for a small number of subjects, but it could become time consuming if a user wanted to start over with a new study plan. To solve this, I added a Clear All Subjects button. When the button is clicked, all subject cards are removed from the page and the default empty message is shown again. I also made sure that the saved data in local storage is cleared at the same time. This prevents old subjects from coming back after refreshing the page. After implementing the feature, I tested it with different numbers of subjects to make sure everything was removed correctly."}, {"post_id": 9811, "ts": "2026-06-16T07:50:07Z", "hours": 0.5736, "text": "Devlog 8 - Local Storage Support I worked on saving data in the browser. Before this update, all subjects disappeared whenever the page was refreshed. This meant users would lose their information every time they closed or reloaded the website. To improve this, I added local storage support. Now the planner saves subject information directly in the browser. When the page loads again, the saved subjects are displayed automatically. I spent some time learning how local storage works and testing different situations such as adding subjects, removing subjects, and refreshing the page. This helped me make sure the saved data stays updated."}, {"post_id": 9778, "ts": "2026-06-16T06:57:37Z", "hours": 0.5783, "text": "Devlog 7 - Exam Countdown Feature I added an exam countdown feature to the Study Planner. Each subject already had an exam date, but the date by itself was not very useful. To make the information easier to understand, I added a countdown that shows how many days are left until the exam. When a subject is created, the planner now calculates the difference between the current date and the selected exam date. The result is displayed directly below the exam date. I also handled a few different situations. If no exam date is selected, the planner shows a message to let the user know. If the exam date is today, a special message is displayed. If the date has already passed, the planner will show that as well. After adding the countdown feature, I tested it with different dates to make sure the calculation worked correctly."}, {"post_id": 9753, "ts": "2026-06-16T05:41:53Z", "hours": 0.7908, "text": "Devlog 6 - Progress Tracking Today I added a progress tracking feature to the Study Planner. The planner already allowed users to create subjects, add tasks, and mark tasks as completed. To make it easier to see overall progress, I added a progress bar for each subject. The progress bar updates automatically based on how many tasks have been completed. If no tasks are finished, the progress stays at 0%. As tasks are completed, the percentage increases and the progress bar grows. I spent some time testing different situations such as adding new tasks, completing tasks, and unchecking completed tasks. This helped make sure the progress always shows the correct value. I also added a small percentage display above the progress bar so users can quickly see their current progress without needing to count tasks."}, {"post_id": 9540, "ts": "2026-06-15T22:24:19Z", "hours": 0.5144, "text": "Devlog 5 - Task Completion Feature I improved the task system by adding a way to mark tasks as completed. Before this update, users could add study tasks, but there was no way to show which tasks had already been finished. To solve this, I added a checkbox next to every task. When a checkbox is selected, the task text gets a line through it. I also reduced the opacity a little so completed tasks look different from active ones."}, {"post_id": 9419, "ts": "2026-06-15T19:39:17Z", "hours": 0.705, "text": "Devlog 4 - Adding Study Tasks I added a task section to each subject. Until now, the planner could only store subject names and exam dates. I wanted users to be able to keep track of what they actually need to study, so I added a simple task system. Each subject now has its own task input box and an Add Task button. Users can type a study task and add it directly to that subject. The tasks are displayed in a list below the subject information. While working on this feature, I tested different subjects to make sure tasks stay inside the correct subject card. I also added a small check to stop empty tasks from being added. I made a few style changes so the task section fits nicely inside the existing layout and remains easy to read. The planner now feels more useful because subjects can contain actual study work instead of only basic information."}, {"post_id": 8676, "ts": "2026-06-14T12:35:41Z", "hours": 0.3919, "text": "Devlog 3 - Removing Subjects Now I worked on improving subject management in the Study Planner. In the previous version, users could add subjects, but there was no way to remove them if they made a mistake or no longer needed them. To solve this, I added a remove button to every subject Now each subject has its own button, and clicking it will remove that subject from the page. I spent some time testing different situations to make sure the correct subject is removed each time. I also noticed that when all subjects were deleted, the page looked a little empty. Because of this, I brought back the “No subjects added yet” message whenever there are no subject on the screen. This makes the page feel more complete I made a few small style changes as well This update makes the planner easier to use because users can now both add and remove subjects whenever they want."}, {"post_id": 8641, "ts": "2026-06-14T11:20:29Z", "hours": 0.7672, "text": "Devlog 2 - Adding Subjects NOW I started working on the first main feature of the Study Planner….. I used Java to connect the form with the page Now when a user enters a subject name and clicks the Add Subject button, the subject is shown in the subjects section. I also added the exam date to each subject card. If the user does not select an exam date, the boxwill show that no date has been set. At first, I tested the form with different inputs to make sure it was working correctly. I noticed that users could try to submit an empty subject name, so I added a simple check to prevent that. I also updated the design of the subjects section a little. Each subject now appears inside its own box, which makes the information easier to read and keeps the page organized. After testing everything a few times, I fixed some small spacing issues and made sure the form clears itself after a subject is added. Users can add subjects without refreshing the page, which is an important step before adding more features in future updates."}, {"post_id": 8616, "ts": "2026-06-14T10:02:22Z", "hours": 1.3111, "text": "Devlog 1 - Project Setup and Basic Layout Today I started working on my Study Planner project. First….I created the basic structure of the website using HTML and CSS. I added a header with the project title and a short description. After that, I made a form section where users will be able to add subjects and exam dates. I also created a section to display subjects in the future. Right now it only shows a message saying that no subjects have been added yet. For styling, I used simple colors and spacing to keep the website clean and easy to read. I also made sure the layout looks fine on smaller screens. At this stage…. the website is only a layout and does not have any functionality yet. The next step will be adding JavaScript so users can actually add subjects."}]...
|
Title: Study Planner by @juny62017 | Stardance
De Title: Study Planner by @juny62017 | Stardance
Devlogs:
Devlog 1 - Project Setup and Basic Layout Today I started working on my Study Planner project. First….I created the basic structure of the website using HTML and CSS. I added a header with the project title and a short description. After that, I made a form section where users will be able to add subjects and exam dates. I also created a section to display subjects in the future. Right now it only shows a message saying that no subjects have been added yet. For styling, I used simple colors and spacing to keep the website clean and easy to read. I also made sure the layout looks fine on smaller screens. At this stage…. the website is only a layout and does not have any functionality yet. The next step will be adding JavaScript so users can actually add subjects.
Devlog 2 - Adding Subjects NOW I started working on the first main feature of the Study Planner….. I used Java to connect the form with the page Now when a user enters a subject name and clicks the Add Subject button, the subject is shown in the subjects section. I also added the exam date to each subject card. If the user does not select an exam date, the boxwill show that no date has been set. At first, I tested the form with different inputs to make sure it was working correctly. I noticed that users could try to submit an empty subject name, so I added a simple check to prevent that. I also updated the design of the subjects section a little. Each subject now appears inside its own box, which makes the information easier to read and keeps the page organized. After testing everything a few times, I fixed some small spacing issues and made sure the form clears itself after a subject is added. Users can add subjects without refreshing the page, which is an important step before adding more features in future updates.
Devlog 3 - Removing Subjects Now I worked on improving subject management in the Study Planner. In the previous version, users could add subjects, but there was no way to remove them if they made a mistake or no longer needed them. To solve this, I added a remove button to every subject Now each subject has its own button, and clicking it will remove that subject from the page. I spent some time testing different situations to make sure the correct subject is removed each time. I also noticed that when all subjects were deleted, the page looked a little empty. Because of this, I brought back the “No subjects added yet” message whenever there are no subject on the screen. This makes the page feel more complete I made a few small style changes as well This update makes the planner easier to use because users can now both add and remove subjects whenever they want.
Devlog 4 - Adding Study Tasks I added a task section to each subject. Until now, the planner could only store subject names and exam dates. I wanted users to be able to keep track of what they actually need to study, so I added a simple task system. Each subject now has its own task input box and an Add Task button. Users can type a study task and add it directly to that subject. The tasks are displayed in a list below the subject information. While working on this feature, I tested different subjects to make sure tasks stay inside the correct subject card. I also added a small check to stop empty tasks from being added. I made a few style changes so the task section fits nicely inside the existing layout and remains easy to read. The planner now feels more useful because subjects can contain actual study work instead of only basic information.
Devlog 5 - Task Completion Feature I improved the task system by adding a way to mark tasks as completed. Before this update, users could add study tasks, but there was no way to show which tasks had already been finished. To solve this, I added a checkbox next to every task. When a checkbox is selected, the task text gets a line through it. I also reduced the opacity a little so completed tasks look different from active ones.
Devlog 6 - Progress Tracking Today I added a progress tracking feature to the Study Planner. The planner already allowed users to create subjects, add tasks, and mark tasks as completed. To make it easier to see overall progress, I added a progress bar for each subject. The progress bar updates automatically based on how many tasks have been completed. If no tasks are finished, the progress stays at 0%. As tasks are completed, the percentage increases and the progress bar grows. I spent some time testing different situations such as adding new tasks, completing tasks, and unchecking completed tasks. This helped make sure the progress always shows the correct value. I also added a small percentage display above the progress bar so users can quickly see their current progress without needing to count tasks.
Devlog 7 - Exam Countdown Feature I added an exam countdown feature to the Study Planner. Each subject already had an exam date, but the date by itself was not very useful. To make the information easier to understand, I added a countdown that shows how many days are left until the exam. When a subject is created, the planner now calculates the difference between the current date and the selected exam date. The result is displayed directly below the exam date. I also handled a few different situations. If no exam date is selected, the planner shows a message to let the user know. If the exam date is today, a special message is displayed. If the date has already passed, the planner will show that as well. After adding the countdown feature, I tested it with different dates to make sure the calculation worked correctly.
Devlog 8 - Local Storage Support I worked on saving data in the browser. Before this update, all subjects disappeared whenever the page was refreshed. This meant users would lose their information every time they closed or reloaded the website. To improve this, I added local storage support. Now the planner saves subject information directly in the browser. When the page loads again, the saved subjects are displayed automatically. I spent some time learning how local storage works and testing different situations such as adding subjects, removing subjects, and refreshing the page. This helped me make sure the saved data stays updated.
Devlog 9 - Clear All Subjects Feature I added a feature that allows users to remove all subjects at once. Previously, subjects could only be removed one by one. This worked fine for a small number of subjects, but it could become time consuming if a user wanted to start over with a new study plan. To solve this, I added a Clear All Subjects button. When the button is clicked, all subject cards are removed from the page and the default empty message is shown again. I also made sure that the saved data in local storage is cleared at the same time. This prevents old subjects from coming back after refreshing the page. After implementing the feature, I tested it with different numbers of subjects to make sure everything was removed correctly.
Devlog 10 - Subject Editing Feature I added a feature that allows users to edit existing subjects. Previously, once a subject was added, the only option was to remove it and create a new one. This was inconvenient if a user made a typing mistake or wanted to rename a subject. To improve usability, I added an Edit button to every subject card. When the button is clicked, the user can enter a new subject name and update the information directly from the planner. I tested the feature with different subject names and also added validation to prevent empty values from being saved. I also updated the local storage data after editing so the changes remain available even after refreshing the page.
Ships:
i made this for students who really wants to focus on their upcoming exam and wants to complete syllabus with the constant pace...
|
1792878664.5723848
|
1793742664.5723848
|
|
18429
|
ZeroNet: Local communication system by @Harinandan ZeroNet: Local communication system by @HarinandanJV | Stardance...
|
HarinandanJV
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T15:19:11Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did I make? I built ZeroNet, a completely decentralized, zero configuration Local Area Network messenger with a nostalgic Windows 95 Graphical Interface and a dark themed terminal interface. It automatically finds users on your WiFi and establishes direct, end to end encrypted connections. What was challenging? The hardest part was solving network race conditions without a central server. I had to design a deterministic tie breaking system using unique device IDs to prevent duplicate connections when two peers discover each other simultaneously. What am I proud of? I am most proud of the custom PyQt6 GUI. I spent hours customizing the stylesheets to perfectly recreate the classic Windows 95 and ICQ aesthetic with gray panels, sharp bevels, and pixel fonts. What should people know so they can test my project? ZeroNet requires zero configuration to use. Just run the app on two computers connected to the same WiFi network, and they will automatically discover each other and exchange cryptographic keys.", "repo": "https://github.com/AwesomeSno/ZeroNet", "demo": "https://awesomesno.github.io/ZeroNet/"}]...
|
[{"post_id": 10673, "ts": "202 [{"post_id": 10673, "ts": "2026-06-17T15:10:58Z", "hours": 1.1172, "text": "ZeroNet: The Final Update (Retro GUI + Production Ready!) In my last devlog, I introduced ZeroNet: a serverless, peer to peer, end to end encrypted LAN messenger that runs entirely in the terminal. Since then, I’ve taken the project to the next level and built out the promised GUI, but with a massive twist! Here is what’s new in the final release of ZeroNet: A stunning Retro Windows 95 / ICQ themed Graphical Interface! I bypassed modern, boring UI trends and built a fully customized PyQt6 interface that looks straight out of the 90s, complete with classic bevels, gray panels, and pixel fonts. Bulletproof Networking: Solved complex race conditions! If two peers discover each other and try to connect at the exact same millisecond, ZeroNet now uses deterministic device ID tie breaking to drop the duplicate connection and keep the network stable. Upgraded Cryptography: Every single peer connection now generates a fresh, unique ephemeral secp256r1 keypair. Interactive Web Demo: I built a static GitHub Pages website with a CRT scanline effect and a simulated interactive terminal that mimics the real software’s key exchange and encrypted chat. Cross platform Polish: Hunted down and fixed a nasty PyQt6 platform plugin bug on macOS (caused by experimental Python 3.14 environments) to ensure the app boots flawlessly everywhere. ZeroNet is now a complete, production ready tool. You can chat securely on your local network using either the beautiful dark themed TUI or the nostalgic Windows 95 GUI. No servers. No cloud brokers. Just raw, encrypted, peer to peer communication. Check out the interactive demo on the GitHub page!"}, {"post_id": 8735, "ts": "2026-06-14T15:09:30Z", "hours": 0.8358, "text": "ZeroNet is a tool which enables direct, secure communication between devices on a local area network (LAN) without relying on external servers, third-party databases, or cloud brokers. Some of the features that I have implemented here are: -Automatically finds nearby ZeroNet devices using mDNS, no IP addresses to configure! -ECDH key exchange + Fernet symmetric encryption, no one can read your messages (End to end encrypted) -Direct P2P messaging over persistent TCP connections -Full-mesh group conversations where each message is individually encrypted per member -Stream files of any size with live progress bars, which are encrypted in transit -Beautiful GitHub Dark-themed TUI built with Textual (GUI also exits, will put up in the next dev-log)"}]...
|
Title: ZeroNet: Local communication system by @Har Title: ZeroNet: Local communication system by @HarinandanJV | Stardance
Devlogs:
ZeroNet is a tool which enables direct, secure communication between devices on a local area network (LAN) without relying on external servers, third-party databases, or cloud brokers. Some of the features that I have implemented here are: -Automatically finds nearby ZeroNet devices using mDNS, no IP addresses to configure! -ECDH key exchange + Fernet symmetric encryption, no one can read your messages (End to end encrypted) -Direct P2P messaging over persistent TCP connections -Full-mesh group conversations where each message is individually encrypted per member -Stream files of any size with live progress bars, which are encrypted in transit -Beautiful GitHub Dark-themed TUI built with Textual (GUI also exits, will put up in the next dev-log)
ZeroNet: The Final Update (Retro GUI + Production Ready!) In my last devlog, I introduced ZeroNet: a serverless, peer to peer, end to end encrypted LAN messenger that runs entirely in the terminal. Since then, I’ve taken the project to the next level and built out the promised GUI, but with a massive twist! Here is what’s new in the final release of ZeroNet: A stunning Retro Windows 95 / ICQ themed Graphical Interface! I bypassed modern, boring UI trends and built a fully customized PyQt6 interface that looks straight out of the 90s, complete with classic bevels, gray panels, and pixel fonts. Bulletproof Networking: Solved complex race conditions! If two peers discover each other and try to connect at the exact same millisecond, ZeroNet now uses deterministic device ID tie breaking to drop the duplicate connection and keep the network stable. Upgraded Cryptography: Every single peer connection now generates a fresh, unique ephemeral secp256r1 keypair. Interactive Web Demo: I built a static GitHub Pages website with a CRT scanline effect and a simulated interactive terminal that mimics the real software’s key exchange and encrypted chat. Cross platform Polish: Hunted down and fixed a nasty PyQt6 platform plugin bug on macOS (caused by experimental Python 3.14 environments) to ensure the app boots flawlessly everywhere. ZeroNet is now a complete, production ready tool. You can chat securely on your local network using either the beautiful dark themed TUI or the nostalgic Windows 95 GUI. No servers. No cloud brokers. Just raw, encrypted, peer to peer communication. Check out the interactive demo on the GitHub page!
Ships:
What did I make? I built ZeroNet, a completely decentralized, zero configuration Local Area Network messenger with a nostalgic Windows 95 Graphical Interface and a dark themed terminal interface. It automatically finds users on your WiFi and establishes direct, end to end encrypted connections. What was challenging? The hardest part was solving network race conditions without a central server. I had to design a deterministic tie breaking system using unique device IDs to prevent duplicate connections when two peers discover each other simultaneously. What am I proud of? I am most proud of the custom PyQt6 GUI. I spent hours customizing the stylesheets to perfectly recreate the classic Windows 95 and ICQ aesthetic with gray panels, sharp bevels, and pixel fonts. What should people know so they can test my project? ZeroNet requires zero configuration to use. Just run the app on two computers connected to the same WiFi network, and they will automatically discover each other and exchange cryptographic keys....
|
1793127156.0250854
|
1793213556.0250854
|
|
18430
|
BaristaGPT by @lando498 | Stardance
|
lando498
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T14:58:38Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "My project has 5 commands /baristagpt-ping pings the bot /baristagpt-help gives a list of commands /baristagpt-catfact gives a fact about cats /baristagpt-joke tells a joke /baristagpt-coffee sends a random image of coffee it is hosted with hack club nest and is currently live", "repo": "https://github.com/Lando498/BaristaGPT", "demo": "https://hackclub.slack.com/archives/C0BBK5VG9JM"}]...
|
[{"post_id": 8703, "ts": "2026 [{"post_id": 8703, "ts": "2026-06-14T13:41:26Z", "hours": 1.1844, "text": "now works with nest :)"}]...
|
Title: BaristaGPT by @lando498 | Stardance
Devlog Title: BaristaGPT by @lando498 | Stardance
Devlogs:
now works with nest :)
Ships:
My project has 5 commands /baristagpt-ping pings the bot /baristagpt-help gives a list of commands /baristagpt-catfact gives a fact about cats /baristagpt-joke tells a joke /baristagpt-coffee sends a random image of coffee it is hosted with hack club nest and is currently live...
|
1793127288.6341264
|
1793213688.6341264
|
|
18435
|
HyprTools <\> by @THEbluefirestudios | Stard HyprTools <\> by @THEbluefirestudios | Stardance...
|
THEbluefirestudios
|
1
|
31.0
|
457
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T11:38:09Z", "hours": 31.0, "multiplier": 14.59, "payout": 457, "blessing": "neutral", "text": "WHAT DID I MAKE? I made HyprTools, an open source suite of tools made for the average Windows PC user, so they can get more done, in less time (Supports only windows 10/11) It contains a bunch of tools, including: One-click “Fix my PC Button” [SFC & DISM] PC Cache cleanser Wi-Fi Cache cleanser One-click “Update all apps and drivers” button Refresh Display Drivers PC stress test Startup app recommendations GUI for building and running terminal commands Folder organiser File converter Fast image editor Spotlight-search-style quick access bar Voice typing helper Image to text [OCR] Auto Typer Fast anywhere-on-screen color picker Web Apps Launcher Auto Clicker Image to ASCII art Webcam feed to ASCII art (you can use this in google meet, zoom, and while streaming!) Fake Windows update and error screen Each of them assists the user in some way WHAT WAS CHALLENGING? Well, a lot of stuff, firstly this app is made in tkinter, which is torture in itself but to make it look good, I needed ICONS, but that is so hard because then you need to download the icons, use Tk.Image and yk, actually place the icons in the final zip, which takes unnecessary space, eventually, I used EMOJIS TO ACCOMPLISH THIS, with the trade-off that now my code looks straight out of GPT-3 Also making the exes with pyinstaller is a hassle, you always forget smth small and have to change it all again. WHAT AM I PROUD OF? The thing I’m most proud of is HyprSearch. Its a spotlight seasrch like app and it is very impressive, I love how managed to handle the searching better than Windows search , because it dosen’t prioritise web search, and is really great when you need to locate something in a pinch. I spent a literal day in school, deciding how the fallback chain for a search string would be (I got punished for not paying attention in class, but WORTH IT). It is the largest tool outside of the launcher, and for good reason!, Also I think I did a good job with the GUI on this one. WHAT PREREQUISITES DO PEOPLE NEED TO KNOW BEFORE TESTING? Well, this suite is made for average windows users, who aren’t tech savvy, so almost all dependencies are bundled in the .zip file in releases. The only one you need to have is VLC Media Player, which most people have, and is only for the fake update screen. Thanks for reviewing my project, I spent a lot of thime on this, and i hope you like it! baiiiiiiiiiiiiiiiii", "repo": "https://github.com/THEbluefirestudios/hyprtools", "demo": "https://github.com/THEbluefirestudios/hyprtools/releases"}]...
|
[{"post_id": 64155, "ts": "202 [{"post_id": 64155, "ts": "2026-09-08T11:21:15Z", "hours": 1.0697, "text": "AAAAND ITS DONE the github is ready, I ahve committed all changes, you can download the releases, bugs fixed all done! Now i press ship! Hope it goes well"}, {"post_id": 62197, "ts": "2026-09-05T13:45:50Z", "hours": 0.8464, "text": "I just added a warning saying that you need vlc to use some tools. I need to add a log system. [image unrelated]"}, {"post_id": 62069, "ts": "2026-09-05T09:38:27Z", "hours": 5.2597, "text": "OH MY GOD I JUST SPENT 4 HOURS ON A LAUNCHER APP WTFFF"}, {"post_id": 56553, "ts": "2026-08-28T11:05:15Z", "hours": 0.9831, "text": "Ok I kinda feel ashamed yeah but…. I used AI In my defense it was for a bulk, tedious task - converting all tool.py files to .exes, and then because pyinstaller hates me, delete them and redo it with slightly diff settings for like an hour, so I installed opencode and made the AI go through the suffering, not me, But GLM did a good job with only like 3 prompts so I don,t care, but all works now! Now the only thing left is the main app that handles all tools, and like gives user easy toggle to turn on/turn off/ use all these tools baiiiiiiiiiiiiiii (avengers assemble! ahh screenshot)"}, {"post_id": 55449, "ts": "2026-08-27T09:17:22Z", "hours": 0.8467, "text": "Ok so I made the icons for Hyprtools and saved them, also for the tools that lived in the system tray, I replaced the temp icons with the actual thing, taking some help from my newly acquired github copilot for student! Also uhh, I forgot to down the icons as transparent images so i had to do that later. Lapse recording This is one of the icons, watch the timelapse for the full catalog!"}, {"post_id": 49625, "ts": "2026-08-18T14:46:20Z", "hours": 1.4628, "text": "YEAHH After quite the break, 1 hour, and 24 minutes, HyprOCR is ready! It just reads text from images (uses WindowsOCR engine in the background). There is not really anything special about it so well… baiiiiiiiiiii (image kinda unrelated)"}, {"post_id": 44538, "ts": "2026-08-10T11:26:29Z", "hours": 0.9542, "text": "Okie Hyprsearch is done! It can: Open apps and websites only with name Run commands Solve math Install apps Search for files Search engine query Wikipedia summary bangs for quick results In a very MacOS-like package! I have also started the startup time booster, which will list out all apps in your startup apps that you may or may not need and take action accordingly baiiiiiiiii"}, {"post_id": 43326, "ts": "2026-08-08T15:02:53Z", "hours": 1.1003, "text": "So I have started building the frontend for HyprSearch This is definitely the most largest hyprtool, as it needs the extra code for the titlebarless appearance, pystray integration, spawn on keyboard shortcut, settings, displaying of results, and the ROUNDED CORNERS (dont get me started, basically u need to chroma key out a specific color that is present on the edges of the screen Well, features: You can, via this tool, open websites with only name, search using search engine, fetch wiki summary, install apps, open apps, find files, tell the time, solve math, run commands from this little bar Each search can show multiple results in order of relevance, max five results, for example, searching “Minecraft” will pull up Open app: Minecraft, then open folder “.minecraft”, then open website “ minecraft.net “ then engine search “ minecraft “ Some basic keyboard shortcuts: Alt + Q for spawning the search bar, Esc for closing the search bar, Enter for well, yk (idk how to describe it), like entering the query? (also it automatically opens the top result), and Ctrl + <1 - 5 num row keys> for opening one of the results. It lives in ur system tray! (not a lot to say here) As of writing this devlog, I am just testing stuff, like UI jank, and stuff, ik the border is thick, I am working on it PS: IMPORTANT: im fucked. u see, i am using a python lib called AppOpener for opening apps, but it cannot detect UWP apps or apps in external drives, and I use a lot of UWP apps (yk, like minecraft) and apps on external drives, so I have to remake the entire app-opening part (also i am a responsible dev and i think abt other people’s setup while coding)"}, {"post_id": 39987, "ts": "2026-08-03T10:33:17Z", "hours": 2.8053, "text": "After 2 hours, and 44 minutes, HyprSearch’s backend logic is READYYYYYY!!! This did NOT need to take this less time, but I will briefly go over what it can do: Solve mathematical expressions Run terminal commands Open apps and websites by just their name (not even a URL domain like .com is required!) Install from winget (bang only) Tell the current time (bang only) Perform a file search Fetch a Wikipedia summary (largely bang only) Search on a search engine of your choice Then, there are !bangs - short keywords to put before your query to do a specific thing and a specific thing only: Current list of bangs include: bangs = [ ' !open ' , ' !app ' , ' !web ' , ' !websearch ' , ' !file ' , ' !wiki ' , ' !time ' , ' !install ' , ' !math ' , ' !cmd ' , ] This is kinda a massive shortcut library, disguised as a search bar! baiiiiiiiiiiiiii"}, {"post_id": 37546, "ts": "2026-07-30T10:59:53Z", "hours": 1.2281, "text": "Bruh, Idk what i have been doing lately, I have been sick lately sooo….. I was unable to code or even talk about my other project at the stardance AMA with Jared Isaacman (yes I was invited) The only thing I’ve really been doing, is aimlessly just make functions for a HyprSearch that I decided to revive, so far features are: File search App search Web search + open URL Quick install apps (uses winget ) The current time for some reason Math solver Run command !bangs as a cooler way to search, does the above functions but quicker a single covalent bond (inside joke) btw this is a spotlight search clone baiiiiiii"}, {"post_id": 34524, "ts": "2026-07-25T09:50:15Z", "hours": 1.3994, "text": "Did a BIG one today This is HyprPhotos, a basic, yet fast photo editor, crop images by just clicking on 2 points, rotate, sharpen, upscale, downscale and do so much more in a very short timespan! It just uses PIL s built in functions really, so it wasn’t hard to make the functioning for, and ik the UI looks bad ok baiiiiii"}, {"post_id": 32920, "ts": "2026-07-22T11:55:47Z", "hours": 0.5128, "text": "HyprPicker is done! Its yet again, an I had built before, just had to do some improvements like giving it system tray functionality via pystray , and giving it toast messages and a nice hovering tooltip ( the screenshot ) so that it dosent just give no feedback that it is working. If you are wondering how it works, I just take a screenshot of the full screen, make a tkinter fullscreen window that forces focus, use mouse coords and PIL to get the color at a particular coord, and the entire actual GUI the user sees is just 2 toasts, one spawned at the mouse previewing color and hex code, and a toast showing that the hex code was copied to clipboard As of now, I’m making basic icons with PIL again, but I will surely replace them! baiiiiiiiiiiiiiii"}, {"post_id": 32280, "ts": "2026-07-21T10:57:57Z", "hours": 0.3931, "text": "Hyprtools - Web apps is complete, alongside voice typing! The HyprVoice was almost done yesterday, I just needed to add a Tkinter GUI. As for web apps, it was a completely finished app I made a while ago, so I just had to rebrand it a little with the courier font and - HyprTools in the titlebar. Thats it for the day! baiiiiiiiiii"}, {"post_id": 31738, "ts": "2026-07-20T11:38:30Z", "hours": 1.3083, "text": "Today i made the backend for the voice typing ‘HyprVoice’ It just uses the python lib speech recognition so it wasnt that bad, but….. I spent SOOOOOOOOOOOO long debugging it because it couldn’t actually recognise….. and then I realised my microphone wire got pulled off. bye. (i feel ashamed) (The image is how I plan to make the GUI.)"}, {"post_id": 30751, "ts": "2026-07-18T16:08:50Z", "hours": 1.5092, "text": "Pretend to type is now TypeGhost! Its a better name tbh, as for its features, you can set a typing speed, and % change for a spelling error, when the ‘ghost’ accidentally presses an adjacent key, hits backspace, and corrects itself. There are 3 modes: Boilerplate : For repetitive paragraphs, or statements Code : For code snippets, it ‘thinks’ for a while after opening brackets or hitting enter. It also strips off tab-spaces as IDEs usually autoindent. Essay : For well… essays and large paras of English text, pauses after full stop, excalamation mark, question mark to ‘think’ and also after paragraphs (newlines) baiii for today!"}, {"post_id": 30055, "ts": "2026-07-17T10:29:08Z", "hours": 0.7131, "text": "YESS, vry usefule Today I made the Fileconverter, simple enough, as of now, it supports these filetypes cat_exts = { #cats such a cute shortform for 'category' ^owo^ ' image ' : [ ' jpg ' , ' jpeg ' , ' png ' , ' webp ' , ' bmp ' , ' gif ' , ' ico ' , ' tiff ' ], ' audio ' : [ ' mp3 ' , ' wav ' , ' flac ' , ' ogg ' , ' aac ' , ' m4a ' , ' wma ' ], ' video ' : [ ' mp4 ' , ' mkv ' , ' webm ' , ' avi ' , ' mov ' , ' flv ' , ' wmv ' ],} …and it just works, what can I say? baiiiiii"}, {"post_id": 29422, "ts": "2026-07-16T11:15:32Z", "hours": 0.6317, "text": "Its time i work on this again: Today I just spent some time making the terminal command generator, as of now, it supports 'shutdown', 'echo', 'cd', 'ping', 'mkdir', 'del', 'copy', 'ipconfig', 'dir', 'cls', 'tasklist', 'taskkill', 'netstat', 'systeminfo', 'whoami', 'tree', 'xcopy', 'timeout', 'start', 'attrib', commands, I should add more but this is it as of now! d=====( ̄▽ ̄*)b"}, {"post_id": 24770, "ts": "2026-07-08T15:50:11Z", "hours": 0.6406, "text": "Finally I started working on this again, I am currently working on other features like the Game prioritize, and made ASCII camera more customised and performant! Not a lot of coding as I distributed my time between Candela Shaders and Hyprtools (image unrelated)"}, {"post_id": 22598, "ts": "2026-07-05T04:12:41Z", "hours": 1.1097, "text": "So I am now working on the Pretend to Type autotyper (it needs a better name ik) and you don’t konow how much it escalated, just for some pretend typing, i made functions for calculating distance between keys on a keyboard, a function to do spelling mistakes/fat fingering on purpose, it detects the current window to strip chars like \\t if the curent window is an IDE, AND I decided to put a hard deadline of the 31st of July. I’m so cooked. Also due to copyright, bureaucracy, my incompetence in writing production-ready code, and my refusal to use AI, the features: Desktop Pet, HyprSearch, and ffmpeg GUI will not come in HyprTools. I’m sorry :((( (image unrelated)"}, {"post_id": 21419, "ts": "2026-07-03T11:01:29Z", "hours": 0.7481, "text": "Aaandd. I’m done with the ASCII Camera! Its really jank - you need to open the app, click start, the set the app as a window capture source in OBS, then turn on virtual camera, and then can you use the ASCII camera effect in your desired use case, its also fully local so very laggy, but this is the best I can do as pyvirtualcam refuses to work on my PC"}, {"post_id": 20831, "ts": "2026-07-02T15:15:41Z", "hours": 1.5925, "text": "I added the image to ASCII feature (sample below) and its really nice! Consequentially I am also working on the ASCII camera feature but thats going rough….. Hope I dont die from caffiene overdose…. and now I shall continue to work on it."}, {"post_id": 11885, "ts": "2026-06-19T11:26:34Z", "hours": 0.9511, "text": "I added the fake update and actually autosave for ms office! thats it… byeee…. (image unrelated)"}, {"post_id": 11189, "ts": "2026-06-18T09:37:53Z", "hours": 0.6556, "text": "As of now I have made the fake BSOD, VERY VERY CONVINCING. it has a counter that changes the percent text and it automatically locks your pc the moment it finishes, making it look like your pc just restarted. I am now working on the fake update screen"}, {"post_id": 10551, "ts": "2026-06-17T10:13:03Z", "hours": 0.5925, "text": "I shifted the architecture a little bit: tools that require to be GUIless and run in the background are now seperate .pyw files, so I have made edits to the wraparound feature and made it toggle on shortcut Ctrl (right) + Insert . I also added the fake error screen and it look really convincing! Other features i added include: update all apps, autoclicker, and the PC stress test (some of these were done before the previous devlog but I forgot to mention that). Sadly, my efforts on the Enable EU features and Reset PC are in vail so they may not be added."}, {"post_id": 9994, "ts": "2026-06-16T15:10:10Z", "hours": 0.7431, "text": "These are the features i have decided: Repair & Cleanup Fix my PC ⟵ done Reinstall Windows ⟵ use systemreset.exe or shutdown /r /o into WinRE Clear Cache & Temp Files Clean Registry Keys ⟵ scour Win11Debloat GitHub for safe list + reg files !! Memory Manager !! ⟵ use psutil Deep Uninstall !! Performance & Optimization Update Drivers & Apps ⟵ winget upgrade –all Startup Time Booster ⟵ winreg on Run keys + schtasks Gaming Mode !! ⟵ psutil process list matched against hardcoded game names, psutil.Process.nice() Refresh Display Drivers ⟵ done Stress Test (WinSat) ⟵ winsat subprocess call WiFi Reset ⟵ done Windows Customization Windows Debloat !! ⟵ Win11Debloat GitHub, ship their .reg files as toggles with undo pairs Remove All Windows AI Features ⟵ Win11Debloat GitHub, same .reg toggle approach Actually Autosave (Office) !! ⟵ interval mode: pyautogui.hotkey(‘ctrl’,‘s’) on timer, aggressive mode: watch ~$ temp file mtime with os.path.getmtime Find Similar Files !! ⟵ difflib.SequenceMatcher on filenames, group by similarity score File Management Downloads & Desktop Organizer !! ⟵ os/shutil + extension-to-folder mapping Bulk File Rename ⟵ regex pattern based os.rename loop Local File Converter ⟵ FFmpeg subprocess wrapper FFmpeg GUI ⟵ dropdown UI → FFmpeg subprocess HyprImage ⟵ Pillow wrapper with action picker Productivity Tools Voice Typing ⟵ speech_recognition + pyautogui to paste output OCR: Image to Text ⟵ pytesseract or easyocr Pretend to Type ⟵ pyautogui.typewrite() with interval, probably fold into Macro Creator Macro Creator ⟵ record: keyboard lib + pyautogui polling, playback: screen color check before each click HyprSearch !! ⟵ global hotkey via keyboard lib, fuzzy file search via os.walk + difflib Terminal Command Generator ⟵ dropdown UI → command string builder Colorpicker ⟵ pyautogui.pixel() grab + magnifier overlay Extras & Fun Hyprclicker ⟵ done (existing autoclicker) Mouse Wraparound ⟵ done Image to ASCII ⟵ same approach as Bad Apple project Camera to ASCII (Virtual Cam) ⟵ OpenCV capture → ASCII render → OBS virtual cam, hardest feature overall Desktop Pet !! ⟵ transparent tkinter window + sprite animation, WS_EX_LAYERED for click-through Fake Update Screen ⟵ fullscreen tkinter canvas + fake progress bar Fake Error Screen ⟵ same, BSOD-style overlay (raw list organised by Anything AI) I have finished the simpler features"}, {"post_id": 8654, "ts": "2026-06-14T11:37:44Z", "hours": 1.2525, "text": "Ok i have added the features: mouse wraparound, open Chris Titus Tools, Fix PC button and Reset WIFI button, will add more"}]...
|
Title: HyprTools <\> by @THEbluefirestudios Title: HyprTools <\> by @THEbluefirestudios | Stardance
Devlogs:
Ok i have added the features: mouse wraparound, open Chris Titus Tools, Fix PC button and Reset WIFI button, will add more
These are the features i have decided: Repair & Cleanup Fix my PC ⟵ done Reinstall Windows ⟵ use systemreset.exe or shutdown /r /o into WinRE Clear Cache & Temp Files Clean Registry Keys ⟵ scour Win11Debloat GitHub for safe list + reg files !! Memory Manager !! ⟵ use psutil Deep Uninstall !! Performance & Optimization Update Drivers & Apps ⟵ winget upgrade –all Startup Time Booster ⟵ winreg on Run keys + schtasks Gaming Mode !! ⟵ psutil process list matched against hardcoded game names, psutil.Process.nice() Refresh Display Drivers ⟵ done Stress Test (WinSat) ⟵ winsat subprocess call WiFi Reset ⟵ done Windows Customization Windows Debloat !! ⟵ Win11Debloat GitHub, ship their .reg files as toggles with undo pairs Remove All Windows AI Features ⟵ Win11Debloat GitHub, same .reg toggle approach Actually Autosave (Office) !! ⟵ interval mode: pyautogui.hotkey(‘ctrl’,‘s’) on timer, aggressive mode: watch ~$ temp file mtime with os.path.getmtime Find Similar Files !! ⟵ difflib.SequenceMatcher on filenames, group by similarity score File Management Downloads & Desktop Organizer !! ⟵ os/shutil + extension-to-folder mapping Bulk File Rename ⟵ regex pattern based os.rename loop Local File Converter ⟵ FFmpeg subprocess wrapper FFmpeg GUI ⟵ dropdown UI → FFmpeg subprocess HyprImage ⟵ Pillow wrapper with action picker Productivity Tools Voice Typing ⟵ speech_recognition + pyautogui to paste output OCR: Image to Text ⟵ pytesseract or easyocr Pretend to Type ⟵ pyautogui.typewrite() with interval, probably fold into Macro Creator Macro Creator ⟵ record: keyboard lib + pyautogui polling, playback: screen color check before each click HyprSearch !! ⟵ global hotkey via keyboard lib, fuzzy file search via os.walk + difflib Terminal Command Generator ⟵ dropdown UI → command string builder Colorpicker ⟵ pyautogui.pixel() grab + magnifier overlay Extras & Fun Hyprclicker ⟵ done (existing autoclicker) Mouse Wraparound ⟵ done Image to ASCII ⟵ same approach as Bad Apple project Camera to ASCII (Virtual Cam) ⟵ OpenCV capture → ASCII render → OBS virtual cam, hardest feature overall Desktop Pet !! ⟵ transparent tkinter window + sprite animation, WS_EX_LAYERED for click-through Fake Update Screen ⟵ fullscreen tkinter canvas + fake progress bar Fake Error Screen ⟵ same, BSOD-style overlay (raw list organised by Anything AI) I have finished the simpler features
I shifted the architecture a little bit: tools that require to be GUIless and run in the background are now seperate .pyw files, so I have made edits to the wraparound feature and made it toggle on shortcut Ctrl (right) + Insert . I also added the fake error screen and it look really convincing! Other features i added include: update all apps, autoclicker, and the PC stress test (some of these were done before the previous devlog but I forgot to mention that). Sadly, my efforts on the Enable EU features and Reset PC are in vail so they may not be added.
As of now I have made the fake BSOD, VERY VERY CONVINCING. it has a counter that changes the percent text and it automatically locks your pc the moment it finishes, making it look like your pc just restarted. I am now working on the fake update screen
I added the fake update and actually autosave for ms office! thats it… byeee…. (image unrelated)
I added the image to ASCII feature (sample below) and its really nice! Consequentially I am also working on the ASCII camera feature but thats going rough….. Hope I dont die from caffiene overdose…. and now I shall continue to work on it.
Aaandd. I’m done with the ASCII Camera! Its really jank - you need to open the app, click start, the set the app as a window capture source in OBS, then turn on virtual camera, and then can you use the ASCII camera effect in your desired use case, its also fully local so very laggy, but this is the best I can do as pyvirtualcam refuses to work on my PC
So I am now working on the Pretend to Type autotyper (it needs a better name ik) and you don’t konow how much it escalated, just for some pretend typing, i made functions for calculating distance between keys on a keyboard, a function to do spelling mistakes/fat fingering on purpose, it detects the current window to strip chars like \t if the curent window is an IDE, AND I decided to put a hard deadline of the 31st of July. I’m so cooked. Also due to copyright, bureaucracy, my incompetence in writing production-ready code, and my refusal to use AI, the features: Desktop Pet, HyprSearch, and ffmpeg GUI will not come in HyprTools. I’m sorry :((( (image unrelated)
Finally I started working on this again, I am currently working on other features like the Game prioritize, and made ASCII camera more customised and performant! Not a lot of coding as I distributed my time between Candela Shaders and Hyprtools (image unrelated)
Its time i work on this again: Today I just spent some time making the terminal command generator, as of now, it supports 'shutdown', 'echo', 'cd', 'ping', 'mkdir', 'del', 'copy', 'ipconfig', 'dir', 'cls', 'tasklist', 'taskkill', 'netstat', 'systeminfo', 'whoami', 'tree', 'xcopy', 'timeout', 'start', 'attrib', commands, I should add more but this is it as of now! d=====( ̄▽ ̄*)b
YESS, vry usefule Today I made the Fileconverter, simple enough, as of now, it supports these filetypes cat_exts = { #cats such a cute shortform for 'category' ^owo^ ' image ' : [ ' jpg ' , ' jpeg ' , ' png ' , ' webp ' , ' bmp ' , ' gif ' , ' ico ' , ' tiff ' ], ' audio ' : [ ' mp3 ' , ' wav ' , ' flac ' , ' ogg ' , ' aac ' , ' m4a ' , ' wma ' ], ' video ' : [ ' mp4 ' , ' mkv ' , ' webm ' , ' avi ' , ' mov ' , ' flv ' , ' wmv ' ],} …and it just works, what can I say? baiiiiii
Pretend to type is now TypeGhost! Its a better name tbh, as for its features, you can set a typing speed, and % change for a spelling error, when the ‘ghost’ accidentally presses an adjacent key, hits backspace, and corrects itself. There are 3 modes: Boilerplate : For repetitive paragraphs, or statements Code : For code snippets, it ‘thinks’ for a while after opening brackets or hitting enter. It also strips off tab-spaces as IDEs usually autoindent. Essay : For well… essays and large paras of English text, pauses after full stop, excalamation mark, question mark to ‘think’ and also after paragraphs (newlines) baiii for today!
Today i made the backend for the voice typing ‘HyprVoice’ It just uses the python lib speech recognition so it wasnt that bad, but….. I spent SOOOOOOOOOOOO long debugging it because it couldn’t actually recognise….. and then I realised my microphone wire got pulled off. bye. (i feel ashamed) (The image is how I plan to make the GUI.)
Hyprtools - Web apps is complete, alongside voice typing! The HyprVoice was almost done yesterday, I just needed to add a Tkinter GUI. As for web apps, it was a completely finished app I made a while ago, so I just had to rebrand it a little with the courier font and - HyprTools in the titlebar. Thats it for the day! baiiiiiiiiii
HyprPicker is done! Its yet again, an I had built before, just had to do some improvements like giving it system tray functionality via pystray , and giving it toast messages and a nice hovering tooltip ( the screenshot ) so that it dosent just give no feedback that it is working. If you are wondering how it works, I just take a screenshot of the full screen, make a tkinter fullscreen window that forces focus, use mouse coords and PIL to get the color at a particular coord, and the entire actual GUI the user sees is just 2 toasts, one spawned at the mouse previewing color and hex code, and a toast showing that the hex code was copied to clipboard As of now, I’m making basic icons with PIL again, but I will surely replace them! baiiiiiiiiiiiiiii
Did a BIG one today This is HyprPhotos, a basic, yet fast photo editor, crop images by just clicking on 2 points, rotate, sharpen, upscale, downscale and do so much more in a very short timespan! It just uses PIL s built in functions really, so it wasn’t hard to make the functioning for, and ik the UI looks bad ok baiiiiii
Bruh, Idk what i have been doing lately, I have been sick lately sooo….. I was unable to code or even talk about my other project at the stardance AMA with Jared Isaacman (yes I was invited) The only thing I’ve really been doing, is aimlessly just make functions for a HyprSearch that I decided to revive, so far features are: File search App search Web search + open URL Quick install apps (uses winget ) The current time for some reason Math solver Run command !bangs as a cooler way to search, does the above functions but quicker a single covalent bond (inside joke) btw this is a spotlight search clone baiiiiiii
After 2 hours, and 44 minutes, HyprSearch’s backend logic is READYYYYYY!!! This did NOT need to take this less time, but I will briefly go over what it can do: Solve mathematical expressions Run terminal commands Open apps and websites by just their name (not even a URL domain like .com is required!) Install from winget (bang only) Tell the current time (bang only) Perform a file search Fetch a Wikipedia summary (largely bang only) Search on a search engine of your choice Then, there are !bangs - short keywords to put before your query to do a specific thing and a specific thing only: Current list of bangs include: bangs = [ ' !open ' , ' !app ' , ' !web ' , ' !websearch ' , ' !file ' , ' !wiki ' , ' !time ' , ' !install ' , ' !math ' , ' !cmd ' , ] This is kinda a massive shortcut library, disguised as a search bar! baiiiiiiiiiiiiii
So I have started building the frontend for HyprSearch This is definitely the most largest hyprtool, as it needs the extra code for the titlebarless appearance, pystray integration, spawn on keyboard shortcut, settings, displaying of results, and the ROUNDED CORNERS (dont get me started, basically u need to chroma key out a specific color that is present on the edges of the screen Well, features: You can, via this tool, open websites with only name, search using search engine, fetch wiki summary, install apps, open apps, find files, tell the time, solve math, run commands from this little bar Each search can show multiple results in order of relevance, max five results, for example, searching “Minecraft” will pull up Open app: Minecraft, then open folder “.minecraft”, then open website “ minecraft.net “ then engine search “ minecraft “ Some basic keyboard shortcuts: Alt + Q for spawning the search bar, Esc for closing the search bar, Enter for well, yk (idk how to describe it), like entering the query? (also it automatically opens the top result), and Ctrl + <1 - 5 num row keys> for opening one of the results. It lives in ur system tray! (not a lot to say here) As of writing this devlog, I am just testing stuff, like UI jank, and stuff, ik the border is thick, I am working on it PS: IMPORTANT: im fucked. u see, i am using a python lib called AppOpener for opening apps, but it cannot detect UWP apps or apps in external drives, and I use a lot of UWP apps (yk, like minecraft) and apps on external drives, so I have to remake the entire app-opening part (also i am a responsible dev and i think abt other people’s setup while coding)
Okie Hyprsearch is done! It can: Open apps and websites only with name Run commands Solve math Install apps Search for files Search engine query Wikipedia summary bangs for quick results In a very MacOS-like package! I have also started the startup time booster, which will list out all apps in your startup apps that you may or may not need and take action accordingly baiiiiiiiii
YEAHH After quite the break, 1 hour, and 24 minutes, HyprOCR is ready! It just reads text from images (uses WindowsOCR engine in the background). There is not really anything special about it so well… baiiiiiiiiiii (image kinda unrelated)
Ok so I made the icons for Hyprtools and saved them, also for the tools that lived in the system tray, I replaced the temp icons with the actual thing, taking some help from my newly acquired github copilot for student! Also uhh, I forgot to down the icons as transparent images so i had to do that later. Lapse recording This is one of the icons, watch the timelapse for the full catalog!
Ok I kinda feel ashamed yeah but…. I used AI In my defense it was for a bulk, tedious task - converting all tool.py files to .exes, and then because pyinstaller hates me, delete them and redo it with slightly diff settings for like an hour, so I installed opencode and made the AI go through the suffering, not me, But GLM did a good job with only like 3 prompts so I don,t care, but all works now! Now the only thing left is the main app that handles all tools, and like gives user easy toggle to turn on/turn off/ use all these tools baiiiiiiiiiiiiiii (avengers assemble! ahh screenshot)
OH MY GOD I JUST SPENT 4 HOURS ON A LAUNCHER APP WTFFF
I just added a warning saying that you need vlc to use some tools. I need to add a log system. [image unrelated]
AAAAND ITS DONE the github is ready, I ahve committed all changes, you can download the releases, bugs fixed all done! Now i press ship! Hope it goes well
Ships:
WHAT DID I MAKE? I made HyprTools, an open source suite of tools made for the average Windows PC user, so they can get more done, in less time (Supports only windows 10/11) It contains a bunch of tools, including: One-click “Fix my PC Button” [SFC & DISM] PC Cache cleanser Wi-Fi Cache cleanser One-click “Update all apps and drivers” button Refresh Display Drivers PC stress test Startup app recommendations GUI for building and running terminal commands Folder organiser File converter Fast image editor Spotlight-search-style quick access bar Voice typing helper Image to text [OCR] Auto Typer Fast anywhere-on-screen color picker Web Apps Launcher Auto Clicker Image to ASCII art Webcam feed to ASCII art (you can use this in google meet, zoom, and while streaming!) Fake Windows update and error screen Each of them assists the user in some way WHAT WAS CHALLENGING? Well, a lot of stuff, firstly this app is made in tkinter, which is torture in itself but to make it look good, I needed ICONS, but that is so hard because then you need to download the icons, use Tk.Image and yk, actually place the icons in the final zip, which takes unnecessary space, eventually, I used EMOJIS TO ACCOMPLISH THIS, with the trade-off that now my code looks straight out of GPT-3 Also making the exes with pyinstaller is a hassle, you always forget smth small and have to change it all again. WHAT AM I PROUD OF? The thing I’m most proud of is HyprSearch. Its a spotlight seasrch like app and it is very impressive, I love how managed to handle the searching better than Windows search , because it dosen’t prioritise web search, and is really great when you need to locate something in a pinch. I spent a literal day in school, deciding how the fallback chain for a search string would be (I got punished for not paying attention in class, but WORTH IT). It is the largest tool outside of the launcher, and for good reason!, Also I think I did a good job with the GUI on this one. WHAT PREREQUISITES DO PEOPLE NEED TO KNOW BEFORE TESTING? Well, this suite is made for average windows users, who aren’t tech savvy, so almost all dependencies are bundled in the .zip file in releases. The only one you need to have is VLC Media Player, which most people have, and is only for the fake update screen. Thanks for reviewing my project, I spent a lot of thime on this, and i hope you like it! baiiiiiiiiiiiiiiiii...
|
1793252887.764978
|
1793339287.764978
|
|
18438
|
GTK Forms by @albu_adam | Stardance
|
albu_adam
|
1
|
10.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T18:11:38Z", "hours": 10.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a Rust crate for creating forms with GTK, mainly through a derive proc-macro. It was challenging to figure out how proc-macros actually worked at first, but I eventually got the hang of it and managed to get it to generate the code to create a GTK widget and pull data from it.", "repo": "https://github.com/adamalbu/gtk-forms-mirror", "demo": "https://vimeo.com/1202217294?share=copy&fl=sv&fe=ci"}]...
|
[{"post_id": 10769, "ts": "202 [{"post_id": 10769, "ts": "2026-06-17T18:00:42Z", "hours": 0.4139, "text": "I added content to the README.md and published the (two) crates to crates.io"}, {"post_id": 10731, "ts": "2026-06-17T16:45:52Z", "hours": 9.6678, "text": "It’s in a usable state right now with basic features. The derive proc-macro can add text input and number fields, allowing to create forms quickly and easily."}]...
|
Title: GTK Forms by @albu_adam | Stardance
Devlog Title: GTK Forms by @albu_adam | Stardance
Devlogs:
It’s in a usable state right now with basic features. The derive proc-macro can add text input and number fields, allowing to create forms quickly and easily.
I added content to the README.md and published the (two) crates to crates.io
Ships:
I made a Rust crate for creating forms with GTK, mainly through a derive proc-macro. It was challenging to figure out how proc-macros actually worked at first, but I eventually got the hang of it and managed to get it to generate the code to create a GTK widget and pull data from it....
|
1793137934.1108348
|
1793224334.1108348
|
|
18443
|
Linear regressor by @Kazamir | Stardance
|
Kazamir
|
1
|
14.0
|
69
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T00:37:12Z", "hours": 14.0, "multiplier": 4.96, "payout": 69, "blessing": "neutral", "text": "In my first ship, I created a linear regression simulator where you put points on a graph and can see the line of best fit being discovered. This was my first ship, and I have learnt a lot of things, from normalising values in pytorch to how to use create a pygame exe and how to use Github. I hope you can try out my simple project and see the fascinating power of machine learning.", "repo": "https://github.com/JapneetTalwar/Linear-Regression", "demo": "https://github.com/JapneetTalwar/Linear-Regression/releases/tag/v.1.0.0"}]...
|
[{"post_id": 12832, "ts": "202 [{"post_id": 12832, "ts": "2026-06-21T00:26:59Z", "hours": 2.6664, "text": "Finally finished my project. I expected this project to only take like 5 hours max, but it took more than double that! I have learnt a lot about pygame and pytorch in this project. My final additons were a databox that showed ML metrics like epochs, and added a formula to the line on the graph."}, {"post_id": 11822, "ts": "2026-06-19T07:45:03Z", "hours": 2.17, "text": "Made my program much smoother and added a stop button."}, {"post_id": 11144, "ts": "2026-06-18T07:10:33Z", "hours": 4.8642, "text": "Finally, After heaps of normalisation and code and bugfixing, I finally, have a working linear regressor!!!"}, {"post_id": 9160, "ts": "2026-06-15T10:41:28Z", "hours": 1.9003, "text": "Created a graph wher eyou can click nodes, delete them and clear the screen"}, {"post_id": 8592, "ts": "2026-06-14T09:10:11Z", "hours": 2.3519, "text": "Created a linear regressor"}]...
|
Title: Linear regressor by @Kazamir | Stardance
D Title: Linear regressor by @Kazamir | Stardance
Devlogs:
Created a linear regressor
Created a graph wher eyou can click nodes, delete them and clear the screen
Finally, After heaps of normalisation and code and bugfixing, I finally, have a working linear regressor!!!
Made my program much smoother and added a stop button.
Finally finished my project. I expected this project to only take like 5 hours max, but it took more than double that! I have learnt a lot about pygame and pytorch in this project. My final additons were a databox that showed ML metrics like epochs, and added a formula to the line on the graph.
Ships:
In my first ship, I created a linear regression simulator where you put points on a graph and can see the line of best fit being discovered. This was my first ship, and I have learnt a lot of things, from normalising values in pytorch to how to use create a pygame exe and how to use Github. I hope you can try out my simple project and see the fascinating power of machine learning....
|
1793123516.4679892
|
1793209916.4679892
|
|
18501
|
My own personal Web by @M-Ibrahim | Stardance
|
M-Ibrahim
|
1
|
1.17
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T18:26:56Z", "hours": 1.0, "multiplier": 1.46, "payout": 2, "blessing": "neutral", "text": "This project is about some of the Islamic scholars who worked hard tirelessly in order to revive Islam and Muslim Prestige during the Muslim decline in subcontinent. Their biographies, beliefs and works are referred in this project.", "repo": "https://github.com/Ibrahim-Khudadad/per", "demo": "https://ibrahim-khudadad.github.io/per/"}]...
|
[{"post_id": 42768, "ts": "202 [{"post_id": 42768, "ts": "2026-08-07T17:27:16Z", "hours": 0.1744, "text": "Making my own personal website"}, {"post_id": 13026, "ts": "2026-06-21T09:26:55Z", "hours": 1.0797, "text": "I am currently working to develop my html text and other things of web site"}]...
|
Title: My own personal Web by @M-Ibrahim | Stardan Title: My own personal Web by @M-Ibrahim | Stardance
Devlogs:
I am currently working to develop my html text and other things of web site
Making my own personal website
Ships:
This project is about some of the Islamic scholars who worked hard tirelessly in order to revive Islam and Muslim Prestige during the Muslim decline in subcontinent. Their biographies, beliefs and works are referred in this project....
|
1792882034.188007
|
1793746034.188007
|
|
18507
|
Daedapad by @Nauticos | Stardance
|
Nauticos
|
1
|
2.34
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T21:48:12Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A small macropad with VIA compatability (hopefully). This was my first time using KiCad, Fusion, AND QMK, so all of this has been quite confusing initially, but it was fun trying to learn all these new skills!", "repo": "https://github.com/Nauticos/Daedapad", "demo": ""}]...
|
[{"post_id": 15253, "ts": "202 [{"post_id": 15253, "ts": "2026-06-24T19:23:02Z", "hours": 0.3375, "text": "Did some tweaking to refine the ship (e.g. my demo link wasn’t working, so I had to ask for it to be returned so I could change it). Also very slightly changed the format of my README.md"}, {"post_id": 13358, "ts": "2026-06-21T21:39:42Z", "hours": 0.9164, "text": "After a few tweaks and adding stuff, I think it should be ready to ship!"}, {"post_id": 13257, "ts": "2026-06-21T18:26:08Z", "hours": 0.9722, "text": "Done a few more things, and I think I’ve figured out how to properly put the layouts bit 😀"}, {"post_id": 12224, "ts": "2026-06-19T23:02:54Z", "hours": 0.2975, "text": "Never really coded before and trying to wrap my head around this when I really should be sleeping"}]...
|
Title: Daedapad by @Nauticos | Stardance
Devlogs: Title: Daedapad by @Nauticos | Stardance
Devlogs:
Never really coded before and trying to wrap my head around this when I really should be sleeping
Done a few more things, and I think I’ve figured out how to properly put the layouts bit 😀
After a few tweaks and adding stuff, I think it should be ready to ship!
Did some tweaking to refine the ship (e.g. my demo link wasn’t working, so I had to ask for it to be returned so I could change it). Also very slightly changed the format of my README.md
Ships:
A small macropad with VIA compatability (hopefully). This was my first time using KiCad, Fusion, AND QMK, so all of this has been quite confusing initially, but it was fun trying to learn all these new skills!...
|
1793234848.9172254
|
1793321248.9172254
|
|
18514
|
Pokedex by @Ansh904 | Stardance
|
Ansh904
|
1
|
81.0
|
1342
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-09T15:48:59Z", "hours": 81.0, "multiplier": 19.17, "payout": 1342, "blessing": "neutral", "text": "Cosmidex!!!! A real life multi-platform Pokedex app that can identify a pokemon from a captured photo or uploaded image. The app started with making a scraper using selenium, that I used to scrape around 75,000 images of all 151 pokemon from Google images. The scraper was hard because I didnt knew selenium, but I learned it and made it. After scraping, I trained a yolov8-cls model on google colab using the scraped dataset. Then I converted the model to tflite and made the first android version of the app. Getting the app to work was really painful because it required me to manipulate the image and it’s raw pixel data to transform into the input tensor. After this everything went smoothly and I added a lot of new things like a list of all Pokemon and the fallback page when the model is not confident. I also made a web version of the app using the .web.js extensions, the web version used a tfjs model. After that i have another whole lot of things like a “Guess the Pokemon” game, shinies, a catch feature such that everytime you correctly predict a pokemon, it gets added to your caught pokemon list that is stored in local storage. The app also has shinies and you can toggle to hear pokemon cries. I am really proud of how the ui turned out, the space + pokemon theme really really looks very good, I used images from the nasa image library as backgrounds. On the Pokemon page, which displays the info for a specific pokemon including types, sprite, pokedex text (flavor text), base stats, evolutions and spawn info, the background changes dynamcally based on the type, I spent a lot of time finding those backgrounds, they perfectly match the pokemon typings. All other pages have specific backgrounds too. In the end I really like how the app started from a small side project to taking nearly 2 months to finish. I really want to add more features, but I lack the time cuz I have to study too for entrances, but I surely will add them in the future.", "repo": "https://github.com/Ansh9045/Cosmidex", "demo": "https://pokedex-murex-five-84.vercel.app/"}]...
|
[{"post_id": 44013, "ts": "202 [{"post_id": 44013, "ts": "2026-08-09T14:44:14Z", "hours": 5.5272, "text": "Cosmidex App is now finished !!!!! Finally, after 2 months, the app is finished and I am ready to ship!!! Here’s what I have added : Added Guess the Pokemon, It is addictive as hell, I used the imageTint property of the React native’s Image tag to make the whole silhouette of the pokemon black. After the user guesses it, it displays the orignal pokemon. Added cries, everytime you open the pokemon page for a pokemon, it’s latest or legacy cry plays once, you can toggle to not play it using the button on top right corner of the pokemon image. Added shiny, you can now toggle to show shiny or default sprites of the pokemon. That’s it, the project is finished :( I always want to add more, but I have to study for entrances."}, {"post_id": 42108, "ts": "2026-08-06T17:51:42Z", "hours": 10.1417, "text": "You can now get a Medal!!! Cosmidex Devlog #8 You will now get a medal everytime you catch all 151 pokemon in Generation 1!!! I have added the catch mechanishm Everytime you successfully predict a pokemon using your camera, gallery or from the Not Confident page, that pokemon would be added to your caught list. The caught list is stored in Local storage. Beside the catch mechanism here are other changes: Fixed the camera not closing issue on web by starting the Camera only when the Camera page is focused, otherwise closing it. Removed most of the unnecessay console.log() On android, the Tab was covering pokemon info on the Pokemon Page, to fix that, I made the tab shake toggled on that page, the user now needs to shake their Changed the Home page of android to match that of the web. Added a spawn tab that shows spawn locations along with methods to catch in the generation 1 games, ie- Pokemon Red, Blue and Yellow. Added the README file. Deployed the project on vercel properly, The project is now live on this link What’s next? I now want to add a daily Who’s that pokemon? Game, that would be so fun i guess. I also will add pokemon cries and show shiny versions of pokemons."}, {"post_id": 37136, "ts": "2026-07-29T16:53:18Z", "hours": 10.0683, "text": "Cosmidex Web app is complete !!! Devlog #7 The web version of the Cosmidex app is also finished, FINALLYYY!!! Here is what I have added: Converted the tflite model to TFJS, took a lot of time, many libraries were deprecated, so I had to manually remove imports for those. Created seperate web components using .web.js to upload/capture images -> preprocess -> predict, my codebase for both the android and the web version of the app is still the same. Created seperate page components for the web and changed the design for the Pokemon Page and the Home page. What’s left? The app is mostly ready for it’s first ship, I have hit the 10 hr mark thats why I am uploading a devlog early, but there’s not much left to do, I know I have been saying this for the last 2 devlogs. Here’s what is left: Remove all the console logs that still linger in components for debug. The camera doesn’t close in the web version after capturing and predicting so I have to fix that. Probably change the home page for the android version to match the web. Add some cool animations to it. At last I want to push this project one bit further and add a capturing feature, like you capture a photo of a pokemon and it gets added to your caught pokemon in the pokedex and after capturing all 151 pokemon, you get a medal."}, {"post_id": 31129, "ts": "2026-07-19T09:02:14Z", "hours": 10.1986, "text": "Pokedex Mobile app is finally finished Pokedex Devlog #6 The Pokedex mobile app is now finished and I am working on finishing the web version of the app too. Here is what I have added: A NotConfident page that is displayed when the model can’t give a solid prediction about the image. A ’AllPokemon` page that displays all 151 pokemons from generation 1 in a flatList. I was using a a very messy state based navigation so I updated it to a Stack navigation. I also add a tab at the bottom of the Pokemon, Not confident and All Pokemon pages, though it sometimes overlaps the page content like that of the mewtwo picture. Create a seperate AppContext for the web version to load the model in the web. What’s left in the project before the ship? The Mobile app is finished, I just have to make the Camera and Upload components for the web version of the app and then the project would officially be completed. I was having my exams so I wasn’t able to code for a while :("}, {"post_id": 18221, "ts": "2026-06-29T09:08:48Z", "hours": 15.4481, "text": "Pokedex App is finally complete (mostly) Devlog #5 The app is now mostly complete, this phase of the project went very smoothly. Here is what I have added: After predicting the pokemon, The app sends a request to PokeAPI at the https://pokeapi.co/api/v2/{pokemon_name} endpoint and gets the detailed information of the pokemon. The information is displayed on a pokemon page which includes basic stats, the type of the pokemon, height , wight et. I have also worked a lot of ui, majority of the time was spent in designing the ui. However the home page still looks empty, it is just a div with ImageBackground and a logo with two buttons and 1 scanner icon that I designed in canva. I have also added typed backgrounds, so that every pokemon type has a seperate space themed background, they are mostly nebula images that i found in the NASA Gallery but boyyyy do i like the themes, they look soooo gooood!!!. I am so proud of myself…. What’s left? While the app is mostly ready, there a few things that I still need/want to add: A page displaying all the 151 pokemons in generation 1 A page that is displayed when there is no confident prediction A web version of the app, which would be pretty easy, I just need to change the uploading and capturing logic for it to work on web So hopefully this is my second last devlog for this project, stay tuned !!!!"}, {"post_id": 14918, "ts": "2026-06-24T06:57:10Z", "hours": 14.8033, "text": "Pokedex Devlog #4 Heyyyyy Everyone!!! The training of the model is finally completed and I have made the first version of the Pokedex app , It captures an image using react-native-vision-camera , crops only the middle portion, resizes the image to match my model’s image size of 224*224 px , then gets the raw pixelbuffer, converts into rgb and normalises the values from 0-255 to 0-1.0 . This normalised pixel data is then fed to the model which predicts the class of the image. There were a lot of problems in making the app and there are still lot more to come , but here is everything I did: 1. An Ironical Training After collecting 75,000 images from my custom scraper, I zipped all of those images, and uploaded them directly to my colab notebook, uploading them took half an hour though😫 . I ran the training script at 50 epochs and training the model took another 8 hours . It was really ironical to see the model train in google colab on the same images that google was trying to hide from my little scraper. 2. A Successful Model After the training was completed, I had to test the model to see how it performed and whether I need to retrain it. The results shocked me, I gave the model 12 images from pintrest that it had never seen before and it predicted all of them correctly. The accuracy was way better than what I expect from a model trained on raw data. However, if needed I will clean the dataset and train again. 3. React native Camera Hell Everything was going very smoothly at this point, but I was never prepared for the next phase. I built a blank react native project, installed react-native-vision-camera and added a camera to the app.js, the camera was working, great, so I built a function to capture the photo and display it on the screen, that too worked. But the next step was to process the raw image pixel data into the format that my model required. I searched online, how to resize an image in react-native-vision-camera , the ai results told me to use the resizer package that comes with it. I spent three, three whole days!!! figuring why the resizer was not able to resize the image only to realise that it took a frame output not an image, so I rewrote the whole camera code again to use a live stream instead of capturing a photo. The resizer was working, I then normalized the pixel values while converting it into rgb format and fed the data to my model which outputed complete gibberish, all that work for nothing!!! 😭 I tried logging in the shape of input and output of the model, and the pixelformat of the bufffer and the raw pixel data. But all those were giving either undefined or 0. Nothing seemed to be working at this about, there was something seriously wrong with how I was processing the images. But then going through the docs of react-native-vision-camera , I saw that the image object that my previous capturing images code, that i had dumped, was outputting was a react-native-nitro-image object and it had an inbuilt resizeAsync function. I got frustrated again and rewrote the entire code again, this time with the previous capture photo logic. After cropping, resizing and getting the rgb data in to the required format, I tested the app with a photo of Gloom displayed on my laptop screen and it predicted it correctly. I was sooooo happyyy that it worked and is still working tho the accuracy is low due to pixel noises. What’s next? The hardest parts of the project are completed now, I just need to an api call, after the model predicts the pokemon to, get the details of the pokemon, like it’s type, pokedex entry and other things. The UI also sucks so I will work on that, I think I want to make it space theme, I don’t know how it would look but I will try. Till then… stay tuned!!!"}, {"post_id": 11166, "ts": "2026-06-18T08:01:40Z", "hours": 2.4978, "text": "ME Vs GOOGLE And I WON!!! Pokedex Devlog #3 Hey everyone I have been working on making a real life pokedex, one in which you just take the photo and get the stats of that pokemon on your screen. To achieve this I decided to train a yolov8n-cls model on images of pokemon. But getting those images were a nightmare due to GOOGLE!!! Fighting Google’s anti bot systems I built a custom scraper to scrape pokemon images from google images. But since the very start of the project, Google has been blocking me, it took a lot time for me, who had never touched selenium at that time, to bypass google’s anti bot systems. Since my laptop is very low end, I was using selenium in headless mode which triggered even more red flags for my bot. I switched from regular selenium to undetected_chromedriver , but still google’s system was flagging me with a big captcha that my little bot couldn’t solve. The main issue was that in headless mode, selenium runs a very small window size and it leaves clear machine tracks, I fixed that by using a larger window size and adding a user agent string that I chosen from a list of 10 different ua strings. Getting those Images Not being flagged by google was easy in comparison to this. Targetting the Images inside the search results was an absolute nightmare because instead of fixed static classes or ids google uses dynamic strings that change frequently, I wanted to write code that anyone can use anywhere and that is why couldn’t target those ever changing class names. I tried a lot things from targeting images inside nested divs to images inside divs with specific roles (eg: listitems ) or targeting images that have /imgres in their href attribute. But it took me an entire, with 6+ hours of coding and trying and a lot more researching and inspecting the elements of google images results but I found out that by targetting the images div with role of main with the images having a src or data-deffered attribute using the XPATH: //div[@role='main']//img[@data-deferred or @src] , I get the images which are inside the search results and I can then just use infinite scrolling to load them. The Results Knowing how to target those images, I absolutely destroyed google in the fight by making the scraper and using it to scrape a total of 74,718 images in one night without getting blocked a single time. My goal was was 500 images for each pokemon in generation 1, that is 75,500 total images, The scraper worked better than expected and I was just a 700 hundred images behind the goal. But even for those 700 images, the culprit was google not my little scraper, google didn’t have that many images for a few unpopular pokemon to fulfill my goals. What’s next? After winning the battle against google, I will use the images to train my model today, I already split those. Since my laptop is slow I will utilize google collab for training, using their own tool to train the model using the images they were trying so hard to hide XD….. and I really hope that scraping that many images is not illegal."}, {"post_id": 10545, "ts": "2026-06-17T09:57:17Z", "hours": 10.4703, "text": "Heyy Everyone Pokedex Devlog 2 !!! The selenium scraper is finally complete and it is working perfectly, except it hits a captcha some times, though it is rare. I started building this scraper without any knowledge of selenium. I started with a very basic bot that went to google and typed pokedex, I slowly added more features like using headless mode and WebDriverWait instead of hardcoded time delays. I once crashed my computer while printing the encrypted source code of the google result, XD. But I was also encountering captchas a lot so I switched to undetected_chromedriver and gave it a user agent string so that it won’t be flagged. My first bot was able to scrape the headers of the google search result. I then moved to an image scraping bot, The first version was very simple, It simply went to google images and downloaded every img tag that it could find. However, regardless of the target it scrapped only 21 images, the first being the google logo. This was because of lazy loading. To fix this I implemented an infinite scrolling loop that scrolled until it reached the end of the page or hit the target. But it still wasn’t near the target, after running the script without headless mode, I found out that the user agent string I gave it was of chrome 91, that was released in 2021, after switching to a newer version, chrome 135, it was able to complete it’s target but it was also downloading junk images like logos, icons or spacers that were present inside the search result. I spent 2 days fixing this problem, trying to point towards the image tags of the thubmnail images we see in google images. I wanted to write a code that would work everytime, that is why i couldn’t just point towards the ever changing classname of the img tag. I tried targeting imgs inside specific divs like img inside the div with role of listitems or img tags whose href attribute started with “/imgres” but it didnt worked. After a lot of tries I was able to get it right by targetting the img inside the div with role of main and whose dimensions are more that 100*100px. It worked like a charm. I then quickly made it in the form of a function and gave it 10 pokemons with target of 100 imgs each and boom I got 1000 images in total. I have also decided that labelling 15,100 images would take ridiculously long and the accuracy of the model would also be not accurate. So instead I am building a classification model and labelling it would be easy I am downloading the pokemon images inside the folder with their name. So now that I don’t have to worry about spending hours downloading or labelling them, I would use 500 images per pokemon and create a much accurate model. Currently I am running the script over all pokemons in gen 1, 151 in total, It has reached till Rattata, pokedex number - 19, that means images of 18 out of 151 pokemon are downloaded. I will keep the script running until all are complete and start training the classification model tomorrow."}, {"post_id": 8882, "ts": "2026-06-14T19:56:11Z", "hours": 1.9681, "text": "Heyy everyone I am currently building an android based pokedex app. The goal is simple point your phone’s camera towards a pokemon and it would use real time object detection to identify it and use pokeapi to fetch detailed stats about the pokemon. When I first thought of this project, I wanted to make a pokedex for all pokemon. However, some simple calculations gave me a reality check. To get a deceny accuracy, I aimed to train the object detection model at 100 images per pokemon, but there are 1,025 pokemon in total, that would mean more than 100k images to collect and label, it would take months if not years for me to do it alone, that’s why I narrowed down quickly to only generation 1 pokemons, around 151 pokemons and 15,100 images which still is a lot to collect and label manually. Instead of collecting images manually, I wanted to automate the process using the icrawler python framework. I initially tried using the built in google image crawler but it failed again and again, it returned no images, it wasnt able to detect the image tags, after some research I found out what was happening, google frequently changes their css class names to prevent bots from scraping and icrawler relied on hard coded class names. So I switched to the in built Bing image crawler and ran a test batch of 5 pokemons, it worked, I was happy to see images of pokemons being stored in my computer. But there was another roadblock, I had aimed at a total of 500 images (100 per pokemon) but it only managed to scrape around 30 images per pokemon. That’s only 30% of my target. To get past this I planning to build a better scraper using selenium and implement a dynamic scrolling loop to trigger lazy loaded images. I have attached today’s results, I got 156 images in total today and I hope for 500 tomorrow. Stay tuned for the next update"}]...
|
Title: Pokedex by @Ansh904 | Stardance
Devlogs:
H Title: Pokedex by @Ansh904 | Stardance
Devlogs:
Heyy everyone I am currently building an android based pokedex app. The goal is simple point your phone’s camera towards a pokemon and it would use real time object detection to identify it and use pokeapi to fetch detailed stats about the pokemon. When I first thought of this project, I wanted to make a pokedex for all pokemon. However, some simple calculations gave me a reality check. To get a deceny accuracy, I aimed to train the object detection model at 100 images per pokemon, but there are 1,025 pokemon in total, that would mean more than 100k images to collect and label, it would take months if not years for me to do it alone, that’s why I narrowed down quickly to only generation 1 pokemons, around 151 pokemons and 15,100 images which still is a lot to collect and label manually. Instead of collecting images manually, I wanted to automate the process using the icrawler python framework. I initially tried using the built in google image crawler but it failed again and again, it returned no images, it wasnt able to detect the image tags, after some research I found out what was happening, google frequently changes their css class names to prevent bots from scraping and icrawler relied on hard coded class names. So I switched to the in built Bing image crawler and ran a test batch of 5 pokemons, it worked, I was happy to see images of pokemons being stored in my computer. But there was another roadblock, I had aimed at a total of 500 images (100 per pokemon) but it only managed to scrape around 30 images per pokemon. That’s only 30% of my target. To get past this I planning to build a better scraper using selenium and implement a dynamic scrolling loop to trigger lazy loaded images. I have attached today’s results, I got 156 images in total today and I hope for 500 tomorrow. Stay tuned for the next update
Heyy Everyone Pokedex Devlog 2 !!! The selenium scraper is finally complete and it is working perfectly, except it hits a captcha some times, though it is rare. I started building this scraper without any knowledge of selenium. I started with a very basic bot that went to google and typed pokedex, I slowly added more features like using headless mode and WebDriverWait instead of hardcoded time delays. I once crashed my computer while printing the encrypted source code of the google result, XD. But I was also encountering captchas a lot so I switched to undetected_chromedriver and gave it a user agent string so that it won’t be flagged. My first bot was able to scrape the headers of the google search result. I then moved to an image scraping bot, The first version was very simple, It simply went to google images and downloaded every img tag that it could find. However, regardless of the target it scrapped only 21 images, the first being the google logo. This was because of lazy loading. To fix this I implemented an infinite scrolling loop that scrolled until it reached the end of the page or hit the target. But it still wasn’t near the target, after running the script without headless mode, I found out that the user agent string I gave it was of chrome 91, that was released in 2021, after switching to a newer version, chrome 135, it was able to complete it’s target but it was also downloading junk images like logos, icons or spacers that were present inside the search result. I spent 2 days fixing this problem, trying to point towards the image tags of the thubmnail images we see in google images. I wanted to write a code that would work everytime, that is why i couldn’t just point towards the ever changing classname of the img tag. I tried targeting imgs inside specific divs like img inside the div with role of listitems or img tags whose href attribute started with “/imgres” but it didnt worked. After a lot of tries I was able to get it right by targetting the img inside the div with role of main and whose dimensions are more that 100*100px. It worked like a charm. I then quickly made it in the form of a function and gave it 10 pokemons with target of 100 imgs each and boom I got 1000 images in total. I have also decided that labelling 15,100 images would take ridiculously long and the accuracy of the model would also be not accurate. So instead I am building a classification model and labelling it would be easy I am downloading the pokemon images inside the folder with their name. So now that I don’t have to worry about spending hours downloading or labelling them, I would use 500 images per pokemon and create a much accurate model. Currently I am running the script over all pokemons in gen 1, 151 in total, It has reached till Rattata, pokedex number - 19, that means images of 18 out of 151 pokemon are downloaded. I will keep the script running until all are complete and start training the classification model tomorrow.
ME Vs GOOGLE And I WON!!! Pokedex Devlog #3 Hey everyone I have been working on making a real life pokedex, one in which you just take the photo and get the stats of that pokemon on your screen. To achieve this I decided to train a yolov8n-cls model on images of pokemon. But getting those images were a nightmare due to GOOGLE!!! Fighting Google’s anti bot systems I built a custom scraper to scrape pokemon images from google images. But since the very start of the project, Google has been blocking me, it took a lot time for me, who had never touched selenium at that time, to bypass google’s anti bot systems. Since my laptop is very low end, I was using selenium in headless mode which triggered even more red flags for my bot. I switched from regular selenium to undetected_chromedriver , but still google’s system was flagging me with a big captcha that my little bot couldn’t solve. The main issue was that in headless mode, selenium runs a very small window size and it leaves clear machine tracks, I fixed that by using a larger window size and adding a user agent string that I chosen from a list of 10 different ua strings. Getting those Images Not being flagged by google was easy in comparison to this. Targetting the Images inside the search results was an absolute nightmare because instead of fixed static classes or ids google uses dynamic strings that change frequently, I wanted to write code that anyone can use anywhere and that is why couldn’t target those ever changing class names. I tried a lot things from targeting images inside nested divs to images inside divs with specific roles (eg: listitems ) or targeting images that have /imgres in their href attribute. But it took me an entire, with 6+ hours of coding and trying and a lot more researching and inspecting the elements of google images results but I found out that by targetting the images div with role of main with the images having a src or data-deffered attribute using the XPATH: //div[@role='main']//img[@data-deferred or @src] , I get the images which are inside the search results and I can then just use infinite scrolling to load them. The Results Knowing how to target those images, I absolutely destroyed google in the fight by making the scraper and using it to scrape a total of 74,718 images in one night without getting blocked a single time. My goal was was 500 images for each pokemon in generation 1, that is 75,500 total images, The scraper worked better than expected and I was just a 700 hundred images behind the goal. But even for those 700 images, the culprit was google not my little scraper, google didn’t have that many images for a few unpopular pokemon to fulfill my goals. What’s next? After winning the battle against google, I will use the images to train my model today, I already split those. Since my laptop is slow I will utilize google collab for training, using their own tool to train the model using the images they were trying so hard to hide XD….. and I really hope that scraping that many images is not illegal.
Pokedex Devlog #4 Heyyyyy Everyone!!! The training of the model is finally completed and I have made the first version of the Pokedex app , It captures an image using react-native-vision-camera , crops only the middle portion, resizes the image to match my model’s image size of 224*224 px , then gets the raw pixelbuffer, converts into rgb and normalises the values from 0-255 to 0-1.0 . This normalised pixel data is then fed to the model which predicts the class of the image. There were a lot of problems in making the app and there are still lot more to come , but here is everything I did: 1. An Ironical Training After collecting 75,000 images from my custom scraper, I zipped all of those images, and uploaded them directly to my colab notebook, uploading them took half an hour though😫 . I ran the training script at 50 epochs and training the model took another 8 hours . It was really ironical to see the model train in google colab on the same images that google was trying to hide from my little scraper. 2. A Successful Model After the training was completed, I had to test the model to see how it performed and whether I need to retrain it. The results shocked me, I gave the model 12 images from pintrest that it had never seen before and it predicted all of them correctly. The accuracy was way better than what I expect from a model trained on raw data. However, if needed I will clean the dataset and train again. 3. React native Camera Hell Everything was going very smoothly at this point, but I was never prepared for the next phase. I built a blank react native project, installed react-native-vision-camera and added a camera to the app.js, the camera was working, great, so I built a function to capture the photo and display it on the screen, that too worked. But the next step was to process the raw image pixel data into the format that my model required. I searched online, how to resize an image in react-native-vision-camera , the ai results told me to use the resizer package that comes with it. I spent three, three whole days!!! figuring why the resizer was not able to resize the image only to realise that it took a frame output not an image, so I rewrote the whole camera code again to use a live stream instead of capturing a photo. The resizer was working, I then normalized the pixel values while converting it into rgb format and fed the data to my model which outputed complete gibberish, all that work for nothing!!! 😭 I tried logging in the shape of input and output of the model, and the pixelformat of the bufffer and the raw pixel data. But all those were giving either undefined or 0. Nothing seemed to be working at this about, there was something seriously wrong with how I was processing the images. But then going through the docs of react-native-vision-camera , I saw that the image object that my previous capturing images code, that i had dumped, was outputting was a react-native-nitro-image object and it had an inbuilt resizeAsync function. I got frustrated again and rewrote the entire code again, this time with the previous capture photo logic. After cropping, resizing and getting the rgb data in to the required format, I tested the app with a photo of Gloom displayed on my laptop screen and it predicted it correctly. I was sooooo happyyy that it worked and is still working tho the accuracy is low due to pixel noises. What’s next? The hardest parts of the project are completed now, I just need to an api call, after the model predicts the pokemon to, get the details of the pokemon, like it’s type, pokedex entry and other things. The UI also sucks so I will work on that, I think I want to make it space theme, I don’t know how it would look but I will try. Till then… stay tuned!!!
Pokedex App is finally complete (mostly) Devlog #5 The app is now mostly complete, this phase of the project went very smoothly. Here is what I have added: After predicting the pokemon, The app sends a request to PokeAPI at the https://pokeapi.co/api/v2/{pokemon_name} endpoint and gets the detailed information of the pokemon. The information is displayed on a pokemon page which includes basic stats, the type of the pokemon, height , wight et. I have also worked a lot of ui, majority of the time was spent in designing the ui. However the home page still looks empty, it is just a div with ImageBackground and a logo with two buttons and 1 scanner icon that I designed in canva. I have also added typed backgrounds, so that every pokemon type has a seperate space themed background, they are mostly nebula images that i found in the NASA Gallery but boyyyy do i like the themes, they look soooo gooood!!!. I am so proud of myself…. What’s left? While the app is mostly ready, there a few things that I still need/want to add: A page displaying all the 151 pokemons in generation 1 A page that is displayed when there is no confident prediction A web version of the app, which would be pretty easy, I just need to change the uploading and capturing logic for it to work on web So hopefully this is my second last devlog for this project, stay tuned !!!!
Pokedex Mobile app is finally finished Pokedex Devlog #6 The Pokedex mobile app is now finished and I am working on finishing the web version of the app too. Here is what I have added: A NotConfident page that is displayed when the model can’t give a solid prediction about the image. A ’AllPokemon` page that displays all 151 pokemons from generation 1 in a flatList. I was using a a very messy state based navigation so I updated it to a Stack navigation. I also add a tab at the bottom of the Pokemon, Not confident and All Pokemon pages, though it sometimes overlaps the page content like that of the mewtwo picture. Create a seperate AppContext for the web version to load the model in the web. What’s left in the project before the ship? The Mobile app is finished, I just have to make the Camera and Upload components for the web version of the app and then the project would officially be completed. I was having my exams so I wasn’t able to code for a while :(
Cosmidex Web app is complete !!! Devlog #7 The web version of the Cosmidex app is also finished, FINALLYYY!!! Here is what I have added: Converted the tflite model to TFJS, took a lot of time, many libraries were deprecated, so I had to manually remove imports for those. Created seperate web components using .web.js to upload/capture images -> preprocess -> predict, my codebase for both the android and the web version of the app is still the same. Created seperate page components for the web and changed the design for the Pokemon Page and the Home page. What’s left? The app is mostly ready for it’s first ship, I have hit the 10 hr mark thats why I am uploading a devlog early, but there’s not much left to do, I know I have been saying this for the last 2 devlogs. Here’s what is left: Remove all the console logs that still linger in components for debug. The camera doesn’t close in the web version after capturing and predicting so I have to fix that. Probably change the home page for the android version to match the web. Add some cool animations to it. At last I want to push this project one bit further and add a capturing feature, like you capture a photo of a pokemon and it gets added to your caught pokemon in the pokedex and after capturing all 151 pokemon, you get a medal.
You can now get a Medal!!! Cosmidex Devlog #8 You will now get a medal everytime you catch all 151 pokemon in Generation 1!!! I have added the catch mechanishm Everytime you successfully predict a pokemon using your camera, gallery or from the Not Confident page, that pokemon would be added to your caught list. The caught list is stored in Local storage. Beside the catch mechanism here are other changes: Fixed the camera not closing issue on web by starting the Camera only when the Camera page is focused, otherwise closing it. Removed most of the unnecessay console.log() On android, the Tab was covering pokemon info on the Pokemon Page, to fix that, I made the tab shake toggled on that page, the user now needs to shake their Changed the Home page of android to match that of the web. Added a spawn tab that shows spawn locations along with methods to catch in the generation 1 games, ie- Pokemon Red, Blue and Yellow. Added the README file. Deployed the project on vercel properly, The project is now live on this link What’s next? I now want to add a daily Who’s that pokemon? Game, that would be so fun i guess. I also will add pokemon cries and show shiny versions of pokemons.
Cosmidex App is now finished !!!!! Finally, after 2 months, the app is finished and I am ready to ship!!! Here’s what I have added : Added Guess the Pokemon, It is addictive as hell, I used the imageTint property of the React native’s Image tag to make the whole silhouette of the pokemon black. After the user guesses it, it displays the orignal pokemon. Added cries, everytime you open the pokemon page for a pokemon, it’s latest or legacy cry plays once, you can toggle to not play it using the button on top right corner of the pokemon image. Added shiny, you can now toggle to show shiny or default sprites of the pokemon. That’s it, the project is finished :( I always want to add more, but I have to study for entrances.
Ships:
Cosmidex!!!! A real life multi-platform Pokedex app that can identify a pokemon from a captured photo or uploaded image. The app started with making a scraper using selenium, that I used to scrape around 75,000 images of all 151 pokemon from Google images. The scraper was hard because I didnt knew selenium, but I learned it and made it. After scraping, I trained a yolov8-cls model on google colab using the scraped dataset. Then I converted the model to tflite and made the first android version of the app. Getting the app to work was really painful because it required me to manipulate the image and it’s raw pixel data to transform into the input tensor. After this everything went smoothly and I added a lot of new things like a list of all Pokemon and the fallback page when the model is not confident. I also made a web version of the app using the .web.js extensions, the web version used a tfjs model. After that i have another whole lot of things like a “Guess the Pokemon” game, shinies, a catch feature such that everytime you correctly predict a pokemon, it gets added to your caught pokemon list that is stored in local storage. The app also has shinies and you can toggle to hear pokemon cries. I am really proud of how the ui turned out, the space + pokemon theme really really looks very good, I used images from the nasa image library as backgrounds. On the Pokemon page, which displays the info for a specific pokemon including types, sprite, pokedex text (flavor text), base stats, evolutions and spawn info, the background changes dynamcally based on the type, I spent a lot of time finding those backgrounds, they perfectly match the pokemon typings. All other pages have specific backgrounds too. In the end I really like how the app started from a small side project to taking nearly 2 months to finish. I really want to add more features, but I lack the time cuz I have to study too for entrances, but I surely will add them in the future....
|
1793246170.5023468
|
1793332570.5023468
|
|
18541
|
My own Programming Editor by @_MrLuki | Stardance
|
_MrLuki
|
1
|
9.3
|
89
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T18:16:54Z", "hours": 9.0, "multiplier": 9.65, "payout": 89, "blessing": "neutral", "text": "Have you ever had the problem that you couldn’t find an editor to code a simple version of BASIC in? Yeah, you won’t have that problem again because I created just the right tool for you! You can easily write code with color-highlighted syntax and full-on debug mode. How? Press F1 to enter debug and press any key to move one line further. During this, the editor will show the value of all assigned variables. You can also simply run the program when pressing TAB and the program will execute immediately. I have also added a menu to quickly save, edit the filename, or save & quit. For further info, please check out my readme.md. Thank you for reviewing this project and I would love a good rating.", "repo": "https://github.com/MrLuki2727/OwnLanguage", "demo": "https://github.com/MrLuki2727/OwnLanguage/releases/tag/v2.0"}]...
|
[{"post_id": 10818, "ts": "202 [{"post_id": 10818, "ts": "2026-06-17T19:14:50Z", "hours": 0.3042, "text": "Video Guide Here is a quick step-through video guide:"}, {"post_id": 10670, "ts": "2026-06-17T15:08:30Z", "hours": 0.7097, "text": "Just when I thought everything was going according to plan my code wanted to prove me wrong 💀💀🤣🤣 There seems to be a massive bug when using Debug mode when you have scrolled a bit so scroll_offset != 0 ; then this bug occurs even though I thought I have implemented scroll offset in the start_debug_mode(); . Now the good news. I have fixed annoying bugs with the writing in the editor now you can’t skip after a \\0 and can’t write mid editor which has broken everything previously. Here is the screenshot of the debug scroll bug:"}, {"post_id": 10540, "ts": "2026-06-17T09:45:50Z", "hours": 2.5069, "text": "this took way too long 💀 I added debug mode - press F1 and the interpreter steps through your program line by line. current line gets a < marker, all assigned variables are shown live on the right side. Errors are Highlighted Red and the end is highlighted Green. I am pretty proud of that I also spent an embarrassing amount of time chasing a bug where deleting a character would make the line number of the line below disappear. tried everything like textbackground resets, gotoxy fixes, cursor position saving, redraw order changes - none of it worked. turns out I just forgot to reset debugmode back to 0 after leaving debug mode. This simple Problem stole 1h of by life 💀 I have also updated the README with debug mode docs, config.txt explanation and swapped the install section for a direct link to the releases page."}, {"post_id": 10087, "ts": "2026-06-16T17:50:43Z", "hours": 1.2731, "text": "ran out of new features so I did what every developer does at this point - stared at the editor until things started bothering me 🤣. I refined the design and made it more colorful. then I noticed that scrolling was never truly implemented. scroll_offset existed, was passed around, just never actually updated anywhere 💀 int scroll_offset = 0; scrolling should work now. I sure hope so. then I took a look at the menu and decided to rewrite it completely because I didn’t like how you interacted with it. the new version has proper feedback when saving or changing the filename and a quick confirmation if you really want to quit or stay. feel free to test it in the new pre-release: github.com/MrLuki2727/OwnLanguage/releases/tag/v1.1"}, {"post_id": 9847, "ts": "2026-06-16T09:35:19Z", "hours": 0.9478, "text": "Previously the editor always opened Code.lu ( this was hardcodet with #define FILENAME ) Now the last opened filename gets written to config.txt on save and is loaded on startup. fgets pulls the name, strcspn strips the newline. (Revolutionary tech there 🔥🔥🔥) After running a program or opening the menu the cursor was landing somewhere random on screen. I fixed it by saving x and y with getxy() before switching modes, and restoring it with gotoxy() .Then everithing is redrawn. The cursor now comes back exactly where you left it. I thought this was implemented vom the start but it turns out it was not right 💀. Added a proper README with a platform support table (Windows only) , step by step build instructions for CLion."}, {"post_id": 9417, "ts": "2026-06-15T19:30:40Z", "hours": 0.8047, "text": "Syntax highlighting is here! Honestly thought this would take way longer than it did. The approach is simple: walk through the string character by character, check what type the next token is (keyword, variable, number, operator, bracket) and set the color before printing. The actual characters are printed 1:1 so if there are 17 spaces there will be printed 17. Color changes are handled by a prebuilt textColor(COLOUR); function that just sets the console color before the next print. Clean and simple. Known bugs I definitely know about and totally plan to fix (eventually): – Can’t write mid-line because of a \\0 at the start of the string 💀 – Pressing delete at the end of a line removes the entire line (is this a bug or a feature? I’m choosing to call it a feature for now) Next up: fixing the actual bugs. Probably."}, {"post_id": 9161, "ts": "2026-06-15T10:56:52Z", "hours": 1.0142, "text": "Added ELSE and WHILE - the language is getting dangerous 💀🤣 ELSE was actually pretty simple: after an IF, just check in the next line see if it says “ELSE”, skip the keyword and execute whatever comes after. Done. Took longer to think about than to code. WHILE was a completely different. After a bit of thinking I came up that WHILE is basically just IF + GOTO combined. If the condition is true, keep going. If false, i run through the program array for the matching ENDWHILE (counting WHILEs so you it works with more WHILES. ENDWHILE does the reverse - searches backwards for its WHILE and jumps back. Next goal : Synax highlighting"}, {"post_id": 9140, "ts": "2026-06-15T09:34:04Z", "hours": 1.4203, "text": "I completely rebuilt the drawing system for the editor, making it efficient enough for my next goal: syntax highlighting. Now only the line where code was changed gets refreshed, instead of redrawing the entire screen every keystroke. The whole refreshing should be working right know haven’t noticed any bugs. (yet 🤣)"}, {"post_id": 8862, "ts": "2026-06-14T19:11:26Z", "hours": 0.5647, "text": "I started working on the editor yesterday. I was so focused on the code that I didn’t notice the whole logging system wasn’t working because I forgot to include the plugin. I just noticed and fixed the problem. Right now, I am mostly working on syntax highlighting (I don’t really know how to do that yet 💀), but in the last 30 minutes, I finished a basic menu to save, quit, and edit the filename. The editor isn’t really based on the BASIC language. Instead, it’s a mix of commands from different languages that I found cool, which allowed me to create my own custom language mix. I have already finished a basic visual style for the editor (unfortunately, it still has some bugs 😂) as well as a simple syntax checker that somehow works. I also wrote a simple program with a print output, and everything seems to work perfectly.”"}]...
|
Title: My own Programming Editor by @_MrLuki | Sta Title: My own Programming Editor by @_MrLuki | Stardance
Devlogs:
I started working on the editor yesterday. I was so focused on the code that I didn’t notice the whole logging system wasn’t working because I forgot to include the plugin. I just noticed and fixed the problem. Right now, I am mostly working on syntax highlighting (I don’t really know how to do that yet 💀), but in the last 30 minutes, I finished a basic menu to save, quit, and edit the filename. The editor isn’t really based on the BASIC language. Instead, it’s a mix of commands from different languages that I found cool, which allowed me to create my own custom language mix. I have already finished a basic visual style for the editor (unfortunately, it still has some bugs 😂) as well as a simple syntax checker that somehow works. I also wrote a simple program with a print output, and everything seems to work perfectly.”
I completely rebuilt the drawing system for the editor, making it efficient enough for my next goal: syntax highlighting. Now only the line where code was changed gets refreshed, instead of redrawing the entire screen every keystroke. The whole refreshing should be working right know haven’t noticed any bugs. (yet 🤣)
Added ELSE and WHILE - the language is getting dangerous 💀🤣 ELSE was actually pretty simple: after an IF, just check in the next line see if it says “ELSE”, skip the keyword and execute whatever comes after. Done. Took longer to think about than to code. WHILE was a completely different. After a bit of thinking I came up that WHILE is basically just IF + GOTO combined. If the condition is true, keep going. If false, i run through the program array for the matching ENDWHILE (counting WHILEs so you it works with more WHILES. ENDWHILE does the reverse - searches backwards for its WHILE and jumps back. Next goal : Synax highlighting
Syntax highlighting is here! Honestly thought this would take way longer than it did. The approach is simple: walk through the string character by character, check what type the next token is (keyword, variable, number, operator, bracket) and set the color before printing. The actual characters are printed 1:1 so if there are 17 spaces there will be printed 17. Color changes are handled by a prebuilt textColor(COLOUR); function that just sets the console color before the next print. Clean and simple. Known bugs I definitely know about and totally plan to fix (eventually): – Can’t write mid-line because of a \0 at the start of the string 💀 – Pressing delete at the end of a line removes the entire line (is this a bug or a feature? I’m choosing to call it a feature for now) Next up: fixing the actual bugs. Probably.
Previously the editor always opened Code.lu ( this was hardcodet with #define FILENAME ) Now the last opened filename gets written to config.txt on save and is loaded on startup. fgets pulls the name, strcspn strips the newline. (Revolutionary tech there 🔥🔥🔥) After running a program or opening the menu the cursor was landing somewhere random on screen. I fixed it by saving x and y with getxy() before switching modes, and restoring it with gotoxy() .Then everithing is redrawn. The cursor now comes back exactly where you left it. I thought this was implemented vom the start but it turns out it was not right 💀. Added a proper README with a platform support table (Windows only) , step by step build instructions for CLion.
ran out of new features so I did what every developer does at this point - stared at the editor until things started bothering me 🤣. I refined the design and made it more colorful. then I noticed that scrolling was never truly implemented. scroll_offset existed, was passed around, just never actually updated anywhere 💀 int scroll_offset = 0; scrolling should work now. I sure hope so. then I took a look at the menu and decided to rewrite it completely because I didn’t like how you interacted with it. the new version has proper feedback when saving or changing the filename and a quick confirmation if you really want to quit or stay. feel free to test it in the new pre-release: github.com/MrLuki2727/OwnLanguage/releases/tag/v1.1
this took way too long 💀 I added debug mode - press F1 and the interpreter steps through your program line by line. current line gets a < marker, all assigned variables are shown live on the right side. Errors are Highlighted Red and the end is highlighted Green. I am pretty proud of that I also spent an embarrassing amount of time chasing a bug where deleting a character would make the line number of the line below disappear. tried everything like textbackground resets, gotoxy fixes, cursor position saving, redraw order changes - none of it worked. turns out I just forgot to reset debugmode back to 0 after leaving debug mode. This simple Problem stole 1h of by life 💀 I have also updated the README with debug mode docs, config.txt explanation and swapped the install section for a direct link to the releases page.
Just when I thought everything was going according to plan my code wanted to prove me wrong 💀💀🤣🤣 There seems to be a massive bug when using Debug mode when you have scrolled a bit so scroll_offset != 0 ; then this bug occurs even though I thought I have implemented scroll offset in the start_debug_mode(); . Now the good news. I have fixed annoying bugs with the writing in the editor now you can’t skip after a \0 and can’t write mid editor which has broken everything previously. Here is the screenshot of the debug scroll bug:
Video Guide Here is a quick step-through video guide:
Ships:
Have you ever had the problem that you couldn’t find an editor to code a simple version of BASIC in? Yeah, you won’t have that problem again because I created just the right tool for you! You can easily write code with color-highlighted syntax and full-on debug mode. How? Press F1 to enter debug and press any key to move one line further. During this, the editor will show the value of all assigned variables. You can also simply run the program when pressing TAB and the program will execute immediately. I have also added a menu to quickly save, edit the filename, or save & quit. For further info, please check out my readme.md. Thank you for reviewing this project and I would love a good rating....
|
1793260187.0287
|
1793346587.0287
|
|
18546
|
MINTS by @ArjunCodess | Stardance
|
ArjunCodess
|
1
|
3.76
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T07:42:01Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Built a reproducible mechanistic interpretability pipeline for genomic transformers. It extracts model circuits, runs activation patching, and tests biological motif detection. The biggest challenge was building reliable experiments without overclaiming results. I’m proud of the scientific rigor, reproducibility, and honest negative findings. Run python main.py to test everything.", "repo": "https://github.com/ArjunCodess/MINTS", "demo": "https://github.com/ArjunCodess/MINTS/blob/main/paper/main.pdf"}]...
|
[{"post_id": 11174, "ts": "202 [{"post_id": 11174, "ts": "2026-06-18T08:34:44Z", "hours": 0.7578, "text": "ran the full pipeline without any caps and regenerated all results. updated the interpretations based on the new results. updated the README and paper to match the final outputs. completed the project (for now) and verified that the code, results, and documentation are all consistent. image: source control image showing the main changes i did in the paper’s latex."}, {"post_id": 10103, "ts": "2026-06-16T18:14:10Z", "hours": 0.6686, "text": "added frozen DNABERT sequence-head evaluation with AUROC, AUPRC, and accuracy reporting. added real null calibration, GC-matched background calibration, and improved the threshold sensitivity analysis. regenerated the downstream task performance and threshold sensitivity results. image: source control image showing the main changes i did in the threshold sensitivity code."}, {"post_id": 9971, "ts": "2026-06-16T14:37:06Z", "hours": 0.3814, "text": "replaced the evidence summary with a clearer evidence table linking each claim to its supporting results and limitations. added a section explaining the main lessons for mechanistic interpretability. expanded the limitations section with clearer discussion of the study’s scope and assumptions. image: source control image showing the main changes i did in the paper."}, {"post_id": 9954, "ts": "2026-06-16T14:10:16Z", "hours": 0.3106, "text": "added a glossary for the main biology terms. explained why the selected motifs are biologically important. simplified the theory section. moved detailed proofs to the appendix. clearly defined how nucleotide motifs are mapped to tokens. added a simple workflow diagram for the full analysis pipeline. image: source control image showing changes that i made in the code."}, {"post_id": 9932, "ts": "2026-06-16T13:32:57Z", "hours": 0.335, "text": "made the entire pipeline fully reproducible, without any caps, including the threshold analysis and result generation. image: screenshot of the pipeline being run."}, {"post_id": 9886, "ts": "2026-06-16T11:20:00Z", "hours": 0.9978, "text": "showed model performance before the interpretability analysis. separated task performance from probe results. combined all interpretability analyses into one pipeline. made CTCF the main case study. made the overall framing clearer. explained every analysis threshold. validated thresholds with sensitivity tests and control experiments. showed that the main results stay consistent across different thresholds."}]...
|
Title: MINTS by @ArjunCodess | Stardance
Devlogs: Title: MINTS by @ArjunCodess | Stardance
Devlogs:
showed model performance before the interpretability analysis. separated task performance from probe results. combined all interpretability analyses into one pipeline. made CTCF the main case study. made the overall framing clearer. explained every analysis threshold. validated thresholds with sensitivity tests and control experiments. showed that the main results stay consistent across different thresholds.
made the entire pipeline fully reproducible, without any caps, including the threshold analysis and result generation. image: screenshot of the pipeline being run.
added a glossary for the main biology terms. explained why the selected motifs are biologically important. simplified the theory section. moved detailed proofs to the appendix. clearly defined how nucleotide motifs are mapped to tokens. added a simple workflow diagram for the full analysis pipeline. image: source control image showing changes that i made in the code.
replaced the evidence summary with a clearer evidence table linking each claim to its supporting results and limitations. added a section explaining the main lessons for mechanistic interpretability. expanded the limitations section with clearer discussion of the study’s scope and assumptions. image: source control image showing the main changes i did in the paper.
added frozen DNABERT sequence-head evaluation with AUROC, AUPRC, and accuracy reporting. added real null calibration, GC-matched background calibration, and improved the threshold sensitivity analysis. regenerated the downstream task performance and threshold sensitivity results. image: source control image showing the main changes i did in the threshold sensitivity code.
ran the full pipeline without any caps and regenerated all results. updated the interpretations based on the new results. updated the README and paper to match the final outputs. completed the project (for now) and verified that the code, results, and documentation are all consistent. image: source control image showing the main changes i did in the paper’s latex.
Ships:
Built a reproducible mechanistic interpretability pipeline for genomic transformers. It extracts model circuits, runs activation patching, and tests biological motif detection. The biggest challenge was building reliable experiments without overclaiming results. I’m proud of the scientific rigor, reproducibility, and honest negative findings. Run python main.py to test everything....
|
1793253317.8354933
|
1793339717.8354933
|
|
18570
|
Enigma by @reimunyancat | Stardance
|
reimunyancat
|
1
|
31.75
|
135
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-24T04:49:50Z", "hours": 7.0, "multiplier": 19.69, "payout": 135, "blessing": "neutral", "text": "Enigma I built a working Enigma machine you can use, take apart, and see the electricity move through — all in the browser. Not a diagram of one, not a gif: the real cipher engine, wired to a 3D model you can rotate, peel open, and rewire with your hands. What it is The brain is a historically correct Enigma engine written once in C++ and shared two ways — a CLI binary and a WASM module compiled with Emscripten — so the thing in your browser ciphers letter-for-letter the same as the command line. Double-stepping, ring settings, reflector, plugboard, all of it. It passes the standard test vector (rotors I·II·III / reflector B / rings TOU / start HOU / plugs ABCDXZ → TOUHOU encrypts to MQGGFI ). On top of that engine sits a Three.js machine you can actually operate: type on the keyboard, the rotors turn to their real angles and the matching lamp lights up. Flip on X-ray and the wooden case goes translucent, revealing all 26 wires inside — and the exact current path of the key you just pressed lights up and sparks along the wire, traced straight from the engine’s own answer. What was hard The engine was the easy part. Making it look like the real thing is what fought back. The case isn’t one lid — a real Enigma comes apart in three: the main hinged lid, a fold-down flap over the plugboard, and a separate rotor cover with little letter windows. Each one had to hinge and occlude correctly without clipping through the others. The plugboard cables kept poking through the closed front cover. I spent two rounds shrinking how far they sagged before realizing the problem was never depth — the cables sat in front of the closed cover on the z-axis, so they’d punch through the wood no matter how short I made them. Pull them back behind the cover face and it finally read right. Reflector and entry wheel looked like “a rotor with the letters erased.” Turns out on the real machine they’re fixed inside the housing and never visible from outside — so I hid them in normal view and only expose the contacts under X-ray. What I’m proud of The plugboard you wire with your hands. Grab a socket, drag to another, and a cable snaps in; the wire stretches under your cursor while you drag, the target socket highlights blue, and the patch feeds straight back into the engine so the encryption and the X-ray wiring update live. Pulling a cable out works the same way. It feels like handling the real hardware, not clicking a form. And the honesty of it: one engine, verified against a known test vector, with nothing faked between what you see and what actually ciphers. How to test it Type something. Watch the rotors step and the lamps light. Long messages show the rotors carrying over, double-step and all. Hit X-ray. The case turns to glass; press a key and follow the lit current path through plugboard → rotors → reflector → back out to the lamp. Wire the plugboard. Drag between two sockets to pair them, drag a cable out to remove it — the cipher changes immediately. Open it up. Toggle the lid, the rotor cover, and the front flap to see how the real case comes apart. Trust but verify. Set rotors I·II·III, reflector B, rings TOU, start HOU, plugs ABCDXZ, and type TOUHOU — you should get MQGGFI , the canonical Enigma test vector. ", "repo": "https://github.com/reimunyancat/enigma", "demo": "https://reimunyancat.github.io/enigma/"}]...
|
[{"post_id": 64094, "ts": "202 [{"post_id": 64094, "ts": "2026-09-08T08:48:35Z", "hours": 6.5314, "text": "Devlog #11 Last devlog ended with me calling statistics-only scoring the last fake thing in the cracker, and promising the real attack. This is that The actual attack A crib is a guessed fragment of plaintext — operators were creatures of habit, and words like “Meldung” (report) show up in everything. With a crib, the cracker stops scoring vibes entirely: every candidate setting decrypts the text, and the crib either appears in it letter-for-letter or it doesn’t. Six exact letters out of 17,576 start positions leaves one setting standing. The five short intercepts that statistics couldn’t touch now each carry a crib — FUNKEN, MORGEN, STEINECKE (the Germans really did sign Steinecke twice) — and all of them break in under a second. One historical filter made it in: a letter never encrypts to itself, so a crib can only sit where no letter collides with the ciphertext. Fixed-offset guesses get rejected on that rule before the search even runs. The answer that was wrong and right The fun started in testing. One intercept’s documented start position is SWV, but my cracker’s top hit came back RVV — and RVV decrypts the message perfectly. Letter for letter, not just the crib window. I was convinced my engine was broken, so I compiled the reference C++ natively and compared: identical output on both. It’s not a bug. This key’s middle rotor sits exactly on its notch, so the famous double-step kicks the left rotor forward on the very first keypress — (R,V,V) and (S,W,V) converge to the same machine state before a single letter is encrypted. Two daily keys, one message. The codebreakers knew this class of equivalent settings; I rediscovered it by being confused for an hour. Next up The guided demo — the machine types, X-rays its own wiring, and cracks its own message while a first-time visitor watches."}, {"post_id": 60827, "ts": "2026-09-03T13:34:28Z", "hours": 8.8478, "text": "Devlog #10 This one is two small things instead of one big thing — share links, and a challenge mode built from real 1941 intercepts — plus an embarrassing amount of time spent not writing code. Most of it still isn’t properly wired in, but the hours happened, so here’s the honest checkpoint. Share links The whole machine state — rotors, reflector, rings, start position, plugboard — plus a message now fits in the URL hash, like #I.II.III.B:TOU:HOU:ABCDXZ:HELLOWORLD . Opening the link configures the machine and runs the message through it, so the person on the other end watches their lampboard spell out the plaintext. “I encrypted this, try reading it” finally works as a link. My first version of the format forgot the reflector. Anyone opening those links would have gotten confident garbage, and I only noticed while writing the parser. It costs four characters in the URL. Real intercepts, verified I didn’t want to invent fake historical messages, so I went looking for real ones — and that hunt ate the first chunk of the day. Ended up at Ostwald and Weierud’s Cryptologia paper (2017)( https://cryptocellar.org ), which lists 13 authentic Wehrmacht messages from 1941, transcribed from the actual message forms, with keys recovered by modern cryptanalysis. I picked six — from a three-word “morning report canceled” up to an SS tank division complaining that two other divisions are blocking its road. Each form starts with a 5-letter group that looks like ciphertext but isn’t — it’s the Kenngruppe, a network discriminant. The paper warns you to skip it before decrypting, and for once I read the instructions first. All six decrypt on the site’s engine to exactly the plaintext on the forms. The cracker only spoke English The crack mode scored decryptions by English letter frequencies. These messages are German. Added a German frequency table and scored by whichever language fits better. Still not enough for the short ones. I ran a parameter sweep over the scoring weights and the 18-to-76-letter intercepts never rank first under any combination. That’s not a bug, it’s information theory — and it’s exactly why Bletchley Park needed cribs instead of brute force. So the panel is honest about it: only the 214-letter intercept gets a “Crack positions” button (it recovers the real start position, SDV, in about half a second), and the short ones say why they’re decrypt-only. Where the hours actually went Reading a cryptology paper instead of writing components. Rewriting the challenge card layout more than once. Re-running the sweep every time I changed my mind about the scoring. The code diff is small; the day was not. The remaining wiring is still in progress. Next up Crib-based cracking, the known-plaintext attack. That’s what actually breaks the short ones, and it’s the historically accurate method"}, {"post_id": 57387, "ts": "2026-08-29T15:02:55Z", "hours": 9.3711, "text": "Improvements made based on feedback English + Korean support has been applied. English is the default. There was a point raised in the feedback that the translator did not work properly, making it difficult to read. I apologize for not being considerate of you all. A guide panel has been added. It was added because feedback suggested that it would be helpful to have text explanations of how it works. A brief explanation of the Enigma and its principles has been added using a translator. A performance mode has been added. I received feedback that the browser was lagging, so I was struggling to figure out how to handle it. Depending on the mode, I lowered the pixel ratio or optimized the wiring calculations. The logo engraving has been changed. The black background plate has been removed, and a transparent texture with a dark groove and a bright rim has been created using a dual pass to make it look like it was carved into wood. To be honest, it still hasn’t reached the level I wanted, but I have wasted so much time here that I am honestly exhausted and plan to postpone it until next time. Rotation lock and camera presets have been added. I simply did exactly what was requested in the feedback, so there isn’t much to say about it. The crack mode was created simply because I was caught up in the strange idea that if there is an original cipher, there should also be a decryption function. It was the absolute hell; I will never do it again. Web workers use the same WASM engine as the simulator to [set] initial positions Scoring through brute force is difficult, involving the Interval of Concordance (IoC) as the primary axis plus the chi-square auxiliary for character frequency, plaintext previews for the top 5, and a button to apply directly to the machine… Trial and error: When I scored only the first 48 characters of each candidate in the full scope, a completely wrong rotor order happened to get a higher IoC and beat the correct answer (0.0677 vs 0.0651). However, when I selected the top 8 from a 64-character sample and re-scored and reordered the entire sentence, the correct answer won by a landslide (0.058 vs 0.012). Complete reconstruction of X-ray wiring. Honestly, I left the existing wiring as it was because it was a hassle, but it was tough working on it this time. I roughly standardized the thickness and connected the wires properly. Honestly, I still need to tidy it up a bit more, but I’m exhausted. Lastly, since some people claim my devlog was written by AI, I intentionally didn’t write a title or use Markdown this time. However, I’m not sure what the best approach would be. Please give me lots of feedback in the comments."}, {"post_id": 14774, "ts": "2026-06-24T00:17:32Z", "hours": 1.18, "text": "Devlog #6 I asked the question — “is this actually accurate?” — and the answer was no. A real Enigma’s case isn’t one big lid you flip up. It splits into three: the main hinged lid, a fold-down flap in front of the plugboard, and a separate cover over the rotors with little letter windows. So I rebuilt all three. What actually works now Plugboard front flap. On the real machine the plugboard sat behind a panel that folds down from a hinge at the bottom. I added that front panel and tied it to the lid state, so closing the lid folds the flap up over the front too — the way it would look packed away for transport. Rotor cover (Walzenabdeckung). Instead of leaving the rotors fully exposed, there’s now a cover that hides everything except three letter windows and the finger-wheel slits, with brass bezels around each window. It rides its own ▢ 로터 toggle — closed gives the authentic operating look, open shows the rotors. Lid interior. The inside of the lid used to be empty; the real one carried spare bulbs, red/green filters, and a metal plate. Added a bulb-holder strip, the two filters, and a nameplate — and kept them on independent materials so they stay solid in X-ray instead of going transparent along with the case. Stuff that tripped me up Fully sinking the rotors into a well — so only the finger wheel and a single letter peek out, like the real machine — tangles with the X-ray wiring coordinates I’d already placed. Rather than move all the internal geometry, I got the same read from the cover: close it and you only ever see the letter windows. Same look, none of the rework."}, {"post_id": 14017, "ts": "2026-06-23T00:16:51Z", "hours": 1.0214, "text": "Devlog #5 The engine has been correct for a while now — rotor stepping, ring settings, reflector, all of it. This session wasn’t about correctness, it was about feel : making the wooden lid open and shut for real, and making a keypress light up an actual path of current through the machine instead of just blinking a lamp at the end. Then I committed all three changes in one go and the build blew up in my face. Worth it. What actually works now The lid hinges open and closed. A ▣ 뚜껑 toggle drives a hinge pivot, and the render loop lerps it toward the target angle so it swings instead of snapping shut. Rebuilt the lid as a real box. My first lid was a single flat plank — it clipped straight through the rotors and only covered half the keyboard. Now it’s a hollow box (top + front + two side walls) with the hinge raised above the rotor tops, so it clears everything when it closes. Live current path. Until now, pressing a key did nothing to the cabling — the keyboard-to-plugboard route was never visualized at all. Now I take the trace the engine hands back and draw the whole route — keycap → plugboard → rotor contacts → lamp — as one glowing tube, with a spark running along it. Heavier materials pass. Nudged the wood/brass/steel roughness, metalness, and env-map strength a notch heavier to kill the last of the plastic look. Stuff that tripped me up I committed all three changes at once and the build died on boot — three TypeScript errors, all from one mistake. My new lid store collided with an existing lid mesh variable, so the compiler threw Property 'subscribe' does not exist... , an implicit- any fell out of that, and on top of it I’d pasted over and deleted a partnerOf helper. Aliasing the import to lidStore and restoring the helper cleared all three at once. Lesson, paid the usual way: when you add a store with the same name as an existing mesh variable, alias it at the import line first — before TypeScript makes you. Next up The case opens and the wiring lights up, but it isn’t historically right yet. The real Enigma’s case came apart in three pieces — the main lid, a fold-down flap in front of the plugboard, and a separate cover over the rotors — and mine is still one lid sitting over fully exposed rotors. Next session: make it match the real thing."}, {"post_id": 12366, "ts": "2026-06-20T05:50:39Z", "hours": 2.8122, "text": "X-ray mode This is the part I said I was actually here for. Flip a switch and the wooden case turns to glass so you can see what’s been sealed inside the whole time. Getting it to look right was the fun part. Getting it to stay working cost me the better part of an afternoon. What I built Case → glass. The casing shells (body, rotor housing, plugboard panel) drop to ~28% opacity with depth-writing turned off, so you can see straight through the wood. A lit interior. A warm point light kicks on inside the case the moment X-ray turns on — otherwise the guts just read as a dark smudge instead of actual hardware. The hidden hardware. Built everything that’s normally sealed away: a battery block with brass terminals, and thick orange cable looms routing down beneath the rotors. The wiring map. A 26-strand bundle draws the actual internal permutation for the current rotor / ring / position setup, so what you see under the glass matches what the engine is really doing. Then it went dark — on a fresh load only Everything looked perfect while I was building it. Then I cleared the cache, cold-booted the dev server to check it clean… and X-ray did nothing . Solid wood. The button highlighted, the wiring was clearly toggling on, the opacity was being set — and the case flat-out refused to turn transparent. I burned a good while convinced a git reset had eaten the fix. The one-line culprit It wasn’t git — the code was byte-for-byte the version I’d already signed off on. The real reason: in three.js (r137+), if you flip a material’s transparent flag at runtime, the change won’t take effect unless you also set material.needsUpdate = true . My toggle was setting transparent and opacity but never needsUpdate , so blending never actually switched on and opacity = 0.28 was silently ignored. It “worked” during development purely because hot-reload kept rebuilding the materials from scratch — a real cold load exposed it instantly. One line in the toggle loop and the glass came back. Next up: make the current actually flow — each keypress lighting up the live signal path through the rotors and off the reflector, with a real cable running from the key you pressed into the loom, so the glow starts where your finger does."}, {"post_id": 11108, "ts": "2026-06-18T05:15:28Z", "hours": 1.0419, "text": "Hardware fidelity pass — “wait, is this actually what the real Enigma looks like?” After the electrical signal path was rendering, I pulled up real Kriegsmarine M4 photos to compare — and the 3D model didn’t hold up. So before adding anything new, this one is a “make it historically accurate first” pass. What was wrong Floating letters. The rotor alphabet was hovering in mid-air beside each wheel instead of being on it. On the real machine the letters are engraved around the rotor’s circumference and you read one through a small window. The reflector and entry wheel looked fake. They were basically copy-pasted rotors with the letters wiped off. In reality the reflector (UKW) and entry wheel (ETW) are fixed and tucked inside the housing — there are no spinning lettered drums there at all. Lopsided UI. A huge dead zone under the input field was squashing the 3D view into a thin strip. Input/output drift. The I/O readout was center-aligned, so every keypress shoved the existing letters further left. Genuinely uncomfortable to type on. What I did Wrapped the alphabet onto the rotor circumference with engraved grooves, contact rings, and brass window bezels, so you read it through the top window like the real thing. Rebuilt the reflector and ETW as smaller dark drums seated in the housing, and set them to stay hidden in the normal view — they’ll surface later in X-ray mode, where the internal wiring belongs. Set the 3D viewport to flex: 1 so it fills the space, and re-framed the camera. Switched the I/O readout to a fixed-width, left-anchored layout, so input and output line up and grow rightward instead of sliding around. A lesson paid for in blood Squashed a stack of messy single-digit commits into one clean commit — then ran git reset --hard with an uncommitted layout fix still in the working tree and watched it evaporate. Re-did it in two minutes, but the takeaway stands: run git status before --hard . Always. Next up: the X-ray translucent mode that exposes the internal wiring and lights up the live signal path through the rotors. That’s the part I actually started this whole thing for."}, {"post_id": 9008, "ts": "2026-06-15T00:56:55Z", "hours": 0.5225, "text": "Electrical signal implementation"}, {"post_id": 8746, "ts": "2026-06-14T15:27:12Z", "hours": 0.3472, "text": "I created an initial version to beautifully implement the existing CLI Enigma on the web."}]...
|
Title: Enigma by @reimunyancat | Stardance
Devlog Title: Enigma by @reimunyancat | Stardance
Devlogs:
I created an initial version to beautifully implement the existing CLI Enigma on the web.
Electrical signal implementation
Hardware fidelity pass — “wait, is this actually what the real Enigma looks like?” After the electrical signal path was rendering, I pulled up real Kriegsmarine M4 photos to compare — and the 3D model didn’t hold up. So before adding anything new, this one is a “make it historically accurate first” pass. What was wrong Floating letters. The rotor alphabet was hovering in mid-air beside each wheel instead of being on it. On the real machine the letters are engraved around the rotor’s circumference and you read one through a small window. The reflector and entry wheel looked fake. They were basically copy-pasted rotors with the letters wiped off. In reality the reflector (UKW) and entry wheel (ETW) are fixed and tucked inside the housing — there are no spinning lettered drums there at all. Lopsided UI. A huge dead zone under the input field was squashing the 3D view into a thin strip. Input/output drift. The I/O readout was center-aligned, so every keypress shoved the existing letters further left. Genuinely uncomfortable to type on. What I did Wrapped the alphabet onto the rotor circumference with engraved grooves, contact rings, and brass window bezels, so you read it through the top window like the real thing. Rebuilt the reflector and ETW as smaller dark drums seated in the housing, and set them to stay hidden in the normal view — they’ll surface later in X-ray mode, where the internal wiring belongs. Set the 3D viewport to flex: 1 so it fills the space, and re-framed the camera. Switched the I/O readout to a fixed-width, left-anchored layout, so input and output line up and grow rightward instead of sliding around. A lesson paid for in blood Squashed a stack of messy single-digit commits into one clean commit — then ran git reset --hard with an uncommitted layout fix still in the working tree and watched it evaporate. Re-did it in two minutes, but the takeaway stands: run git status before --hard . Always. Next up: the X-ray translucent mode that exposes the internal wiring and lights up the live signal path through the rotors. That’s the part I actually started this whole thing for.
X-ray mode This is the part I said I was actually here for. Flip a switch and the wooden case turns to glass so you can see what’s been sealed inside the whole time. Getting it to look right was the fun part. Getting it to stay working cost me the better part of an afternoon. What I built Case → glass. The casing shells (body, rotor housing, plugboard panel) drop to ~28% opacity with depth-writing turned off, so you can see straight through the wood. A lit interior. A warm point light kicks on inside the case the moment X-ray turns on — otherwise the guts just read as a dark smudge instead of actual hardware. The hidden hardware. Built everything that’s normally sealed away: a battery block with brass terminals, and thick orange cable looms routing down beneath the rotors. The wiring map. A 26-strand bundle draws the actual internal permutation for the current rotor / ring / position setup, so what you see under the glass matches what the engine is really doing. Then it went dark — on a fresh load only Everything looked perfect while I was building it. Then I cleared the cache, cold-booted the dev server to check it clean… and X-ray did nothing . Solid wood. The button highlighted, the wiring was clearly toggling on, the opacity was being set — and the case flat-out refused to turn transparent. I burned a good while convinced a git reset had eaten the fix. The one-line culprit It wasn’t git — the code was byte-for-byte the version I’d already signed off on. The real reason: in three.js (r137+), if you flip a material’s transparent flag at runtime, the change won’t take effect unless you also set material.needsUpdate = true . My toggle was setting transparent and opacity but never needsUpdate , so blending never actually switched on and opacity = 0.28 was silently ignored. It “worked” during development purely because hot-reload kept rebuilding the materials from scratch — a real cold load exposed it instantly. One line in the toggle loop and the glass came back. Next up: make the current actually flow — each keypress lighting up the live signal path through the rotors and off the reflector, with a real cable running from the key you pressed into the loom, so the glow starts where your finger does.
Devlog #5 The engine has been correct for a while now — rotor stepping, ring settings, reflector, all of it. This session wasn’t about correctness, it was about feel : making the wooden lid open and shut for real, and making a keypress light up an actual path of current through the machine instead of just blinking a lamp at the end. Then I committed all three changes in one go and the build blew up in my face. Worth it. What actually works now The lid hinges open and closed. A ▣ 뚜껑 toggle drives a hinge pivot, and the render loop lerps it toward the target angle so it swings instead of snapping shut. Rebuilt the lid as a real box. My first lid was a single flat plank — it clipped straight through the rotors and only covered half the keyboard. Now it’s a hollow box (top + front + two side walls) with the hinge raised above the rotor tops, so it clears everything when it closes. Live current path. Until now, pressing a key did nothing to the cabling — the keyboard-to-plugboard route was never visualized at all. Now I take the trace the engine hands back and draw the whole route — keycap → plugboard → rotor contacts → lamp — as one glowing tube, with a spark running along it. Heavier materials pass. Nudged the wood/brass/steel roughness, metalness, and env-map strength a notch heavier to kill the last of the plastic look. Stuff that tripped me up I committed all three changes at once and the build died on boot — three TypeScript errors, all from one mistake. My new lid store collided with an existing lid mesh variable, so the compiler threw Property 'subscribe' does not exist... , an implicit- any fell out of that, and on top of it I’d pasted over and deleted a partnerOf helper. Aliasing the import to lidStore and restoring the helper cleared all three at once. Lesson, paid the usual way: when you add a store with the same name as an existing mesh variable, alias it at the import line first — before TypeScript makes you. Next up The case opens and the wiring lights up, but it isn’t historically right yet. The real Enigma’s case came apart in three pieces — the main lid, a fold-down flap in front of the plugboard, and a separate cover over the rotors — and mine is still one lid sitting over fully exposed rotors. Next session: make it match the real thing.
Devlog #6 I asked the question — “is this actually accurate?” — and the answer was no. A real Enigma’s case isn’t one big lid you flip up. It splits into three: the main hinged lid, a fold-down flap in front of the plugboard, and a separate cover over the rotors with little letter windows. So I rebuilt all three. What actually works now Plugboard front flap. On the real machine the plugboard sat behind a panel that folds down from a hinge at the bottom. I added that front panel and tied it to the lid state, so closing the lid folds the flap up over the front too — the way it would look packed away for transport. Rotor cover (Walzenabdeckung). Instead of leaving the rotors fully exposed, there’s now a cover that hides everything except three letter windows and the finger-wheel slits, with brass bezels around each window. It rides its own ▢ 로터 toggle — closed gives the authentic operating look, open shows the rotors. Lid interior. The inside of the lid used to be empty; the real one carried spare bulbs, red/green filters, and a metal plate. Added a bulb-holder strip, the two filters, and a nameplate — and kept them on independent materials so they stay solid in X-ray instead of going transparent along with the case. Stuff that tripped me up Fully sinking the rotors into a well — so only the finger wheel and a single letter peek out, like the real machine — tangles with the X-ray wiring coordinates I’d already placed. Rather than move all the internal geometry, I got the same read from the cover: close it and you only ever see the letter windows. Same look, none of the rework.
Improvements made based on feedback English + Korean support has been applied. English is the default. There was a point raised in the feedback that the translator did not work properly, making it difficult to read. I apologize for not being considerate of you all. A guide panel has been added. It was added because feedback suggested that it would be helpful to have text explanations of how it works. A brief explanation of the Enigma and its principles has been added using a translator. A performance mode has been added. I received feedback that the browser was lagging, so I was struggling to figure out how to handle it. Depending on the mode, I lowered the pixel ratio or optimized the wiring calculations. The logo engraving has been changed. The black background plate has been removed, and a transparent texture with a dark groove and a bright rim has been created using a dual pass to make it look like it was carved into wood. To be honest, it still hasn’t reached the level I wanted, but I have wasted so much time here that I am honestly exhausted and plan to postpone it until next time. Rotation lock and camera presets have been added. I simply did exactly what was requested in the feedback, so there isn’t much to say about it. The crack mode was created simply because I was caught up in the strange idea that if there is an original cipher, there should also be a decryption function. It was the absolute hell; I will never do it again. Web workers use the same WASM engine as the simulator to [set] initial positions Scoring through brute force is difficult, involving the Interval of Concordance (IoC) as the primary axis plus the chi-square auxiliary for character frequency, plaintext previews for the top 5, and a button to apply directly to the machine… Trial and error: When I scored only the first 48 characters of each candidate in the full scope, a completely wrong rotor order happened to get a higher IoC and beat the correct answer (0.0677 vs 0.0651). However, when I selected the top 8 from a 64-character sample and re-scored and reordered the entire sentence, the correct answer won by a landslide (0.058 vs 0.012). Complete reconstruction of X-ray wiring. Honestly, I left the existing wiring as it was because it was a hassle, but it was tough working on it this time. I roughly standardized the thickness and connected the wires properly. Honestly, I still need to tidy it up a bit more, but I’m exhausted. Lastly, since some people claim my devlog was written by AI, I intentionally didn’t write a title or use Markdown this time. However, I’m not sure what the best approach would be. Please give me lots of feedback in the comments.
Devlog #10 This one is two small things instead of one big thing — share links, and a challenge mode built from real 1941 intercepts — plus an embarrassing amount of time spent not writing code. Most of it still isn’t properly wired in, but the hours happened, so here’s the honest checkpoint. Share links The whole machine state — rotors, reflector, rings, start position, plugboard — plus a message now fits in the URL hash, like #I.II.III.B:TOU:HOU:ABCDXZ:HELLOWORLD . Opening the link configures the machine and runs the message through it, so the person on the other end watches their lampboard spell out the plaintext. “I encrypted this, try reading it” finally works as a link. My first version of the format forgot the reflector. Anyone opening those links would have gotten confident garbage, and I only noticed while writing the parser. It costs four characters in the URL. Real intercepts, verified I didn’t want to invent fake historical messages, so I went looking for real ones — and that hunt ate the first chunk of the day. Ended up at Ostwald and Weierud’s Cryptologia paper (2017)( https://cryptocellar.org ), which lists 13 authentic Wehrmacht messages from 1941, transcribed from the actual message forms, with keys recovered by modern cryptanalysis. I picked six — from a three-word “morning report canceled” up to an SS tank division complaining that two other divisions are blocking its road. Each form starts with a 5-letter group that looks like ciphertext but isn’t — it’s the Kenngruppe, a network discriminant. The paper warns you to skip it before decrypting, and for once I read the instructions first. All six decrypt on the site’s engine to exactly the plaintext on the forms. The cracker only spoke English The crack mode scored decryptions by English letter frequencies. These messages are German. Added a German frequency table and scored by whichever language fits better. Still not enough for the short ones. I ran a parameter sweep over the scoring weights and the 18-to-76-letter intercepts never rank first under any combination. That’s not a bug, it’s information theory — and it’s exactly why Bletchley Park needed cribs instead of brute force. So the panel is honest about it: only the 214-letter intercept gets a “Crack positions” button (it recovers the real start position, SDV, in about half a second), and the short ones say why they’re decrypt-only. Where the hours actually went Reading a cryptology paper instead of writing components. Rewriting the challenge card layout more than once. Re-running the sweep every time I changed my mind about the scoring. The code diff is small; the day was not. The remaining wiring is still in progress. Next up Crib-based cracking, the known-plaintext attack. That’s what actually breaks the short ones, and it’s the historically accurate method
Devlog #11 Last devlog ended with me calling statistics-only scoring the last fake thing in the cracker, and promising the real attack. This is that The actual attack A crib is a guessed fragment of plaintext — operators were creatures of habit, and words like “Meldung” (report) show up in everything. With a crib, the cracker stops scoring vibes entirely: every candidate setting decrypts the text, and the crib either appears in it letter-for-letter or it doesn’t. Six exact letters out of 17,576 start positions leaves one setting standing. The five short intercepts that statistics couldn’t touch now each carry a crib — FUNKEN, MORGEN, STEINECKE (the Germans really did sign Steinecke twice) — and all of them break in under a second. One historical filter made it in: a letter never encrypts to itself, so a crib can only sit where no letter collides with the ciphertext. Fixed-offset guesses get rejected on that rule before the search even runs. The answer that was wrong and right The fun started in testing. One intercept’s documented start position is SWV, but my cracker’s top hit came back RVV — and RVV decrypts the message perfectly. Letter for letter, not just the crib window. I was convinced my engine was broken, so I compiled the reference C++ natively and compared: identical output on both. It’s not a bug. This key’s middle rotor sits exactly on its notch, so the famous double-step kicks the left rotor forward on the very first keypress — (R,V,V) and (S,W,V) converge to the same machine state before a single letter is encrypted. Two daily keys, one message. The codebreakers knew this class of equivalent settings; I rediscovered it by being confused for an hour. Next up The guided demo — the machine types, X-rays its own wiring, and cracks its own message while a first-time visitor watches.
Ships:
Enigma I built a working Enigma machine you can use, take apart, and see the electricity move through — all in the browser. Not a diagram of one, not a gif: the real cipher engine, wired to a 3D model you can rotate, peel open, and rewire with your hands. What it is The brain is a historically correct Enigma engine written once in C++ and shared two ways — a CLI binary and a WASM module compiled with Emscripten — so the thing in your browser ciphers letter-for-letter the same as the command line. Double-stepping, ring settings, reflector, plugboard, all of it. It passes the standard test vector (rotors I·II·III / reflector B / rings TOU / start HOU / plugs ABCDXZ → TOUHOU encrypts to MQGGFI ). On top of that engine sits a Three.js machine you can actually operate: type on the keyboard, the rotors turn to their real angles and the matching lamp lights up. Flip on X-ray and the wooden case goes translucent, revealing all 26 wires inside — and the exact current path of the key you just pressed lights up and sparks along the wire, traced straight from the engine’s own answer. What was hard The engine was the easy part. Making it look like the real thing is what fought back. The case isn’t one lid — a real Enigma comes apart in three: the main hinged lid, a fold-down flap over the plugboard, and a separate rotor cover with little letter windows. Each one had to hinge and occlude correctly without clipping through the others. The plugboard cables kept poking through the closed front cover. I spent two rounds shrinking how far they sagged before realizing the problem was never depth — the cables sat in front of the closed cover on the z-axis, so they’d punch through the wood no matter how short I made them. Pull them back behind the cover face and it finally read right. Reflector and entry wheel looked like “a rotor with the letters erased.” Turns out on the real machine they’re fixed inside the housing and never visible from outside — so I hid them in normal view and only expose the contacts under X-ray. What I’m proud of The plugboard you wire with your hands. Grab a socket, drag to another, and a cable snaps in; the wire stretches under your cursor while you drag, the target socket highlights blue, and the patch feeds straight back into the engine so the encryption and the X-ray wiring update live. Pulling a cable out works the same way. It feels like handling the real hardware, not clicking a form. And the honesty of it: one engine, verified against a known test vector, with nothing faked between what you see and what actually ciphers. How to test it Type something. Watch the rotors step and the lamps light. Long messages show the rotors carrying over, double-step and all. Hit X-ray. The case turns to glass; press a key and follow the lit current path through plugboard → rotors → reflector → back out to the lamp. Wire the plugboard. Drag between two sockets to pair them, drag a cable out to remove it — the cipher changes immediately. Open it up. Toggle the lid, the rotor cover, and the front flap to see how the real case comes apart. Trust but verify. Set rotors I·II·III, reflector B, rings TOU, start HOU, plugs ABCDXZ, and type TOUHOU — you should get MQGGFI , the canonical Enigma test vector. ...
|
1792860520.874676
|
1793724520.874676
|
|
18571
|
Flit by @reimunyancat | Stardance
|
reimunyancat
|
1
|
18.0
|
344
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-14T16:35:56Z", "hours": 18.0, "multiplier": 17.73, "payout": 344, "blessing": "neutral", "text": "Flit is my answer to a problem I hit every single day: moving a link, a bit of text, or a file between my own devices. The normal fixes all have friction. You email yourself, message yourself, or upload to a cloud drive just to download it thirty seconds later on the machine sitting right next to it. Every one of those involves accounts, apps, and steps that have nothing to do with the actual job. Flit is a self-hosted drop inbox. One Rust binary, no accounts, no cloud. Open the URL on any device and everything you drop shows up on every other device in real time. What it actually improves day to day: Real-time sync over SSE. Paste on the desktop and it’s on your phone before you pick it up, no refresh button. QR pairing, because scanning a code beats typing an IP address and a token on a phone keyboard. Share links and drop links. Hand someone exactly one item (one-time or expiring if you want), or give them a post-only page where they can send files into your box without seeing what’s already in it. It installs as a PWA, so on Android “share to Flit” works from any app. Optional browser-side end-to-end encryption (PBKDF2 into AES-GCM), so a public box stores nothing the server can read. On top of that there’s dark mode, an English/Korean toggle, rate limiting, and an ephemeral mode that spins the box down after it sits idle. It’s live at the link, it survived me recording a demo (barely, devlog #5 has the carnage), and it’s built from scratch in Rust with axum.", "repo": "https://github.com/reimunyancat/Flit", "demo": "https://flit.reimunyancat.com"}]...
|
[{"post_id": 28379, "ts": "202 [{"post_id": 28379, "ts": "2026-07-14T16:31:03Z", "hours": 9.1375, "text": "Flit Devlog #5 Last time I ended on “it’s live, it’s public, anyone can hit the URL.” That felt great for about a day, until I thought about what “anyone can hit the URL” actually means. A public drop box where every visitor can read every drop isn’t a feature, it’s a liability. So this entry is me getting paranoid and cleaning up after myself. The public box problem I wanted encryption without a server that holds keys. If the box is public, the server should store gibberish. So it happens in the browser: type a passphrase and everything runs through PBKDF2 (150k rounds, SHA-256) into an AES-256-GCM key before it leaves the tab. The server only ever sees a FLITENC1: blob. Great, until I tested over the LAN and got TypeError: Cannot read properties of undefined (reading 'deriveKey') . crypto.subtle wasn’t there. Web Crypto only exists in a secure context, so localhost and HTTPS work, but http://192.168.x.x on another device is undefined. So I documented it (HTTPS or a VPN hostname for off-localhost encryption) instead of pretending. A status light that lied The “Live” dot is driven by the SSE onopen . Locally it fired instantly; on the deployed box it sat on “Connecting…” while drops streamed in fine. The proxy was buffering the first chunk, so onopen fired late. Fix: send one byte on connect (a ready event prepended to the stream) so the proxy flushes and the client knows it’s open. A server that wouldn’t die Added graceful shutdown; Ctrl+C then did nothing. with_graceful_shutdown waits for every connection to close, and the SSE stream never closes, that’s its whole point. So it waited forever. I stopped being clever: print, spawn a 500ms timer, std::process::exit(0) . Not elegant, but it actually turns off. Handing over one thing, not the keys Two mirrored features. Share links ( /s/{id} ) hand someone a single item, optionally one-time or expiring, without exposing the inbox. Drop links ( /d/{id} ) are post-only: a guest can send something into my box but can’t see what’s inside. Making it a real app A manifest and service worker so Flit installs to the home screen and loads offline. Web Share Target so Android’s “share” can target it. A server-rendered SVG QR ( qrcode , default-features = false ) so pairing a phone is a scan, not a typed IP. And then it all broke on camera Not proud of this. I’d rewritten the whole front-end in one sitting, shipped it, hit record for the demo, and watched it faceplant. Clicked “Share”: dead button, no request. Console: Uncaught ReferenceError: POST is not defined . I’d written method: POST instead of \"POST\" — a bare identifier that threw before fetch . The drop link “worked”: it copied the string undefined . The culprit was await r.json without the () , so j.url read off the function, not the body. One () fixed it. Once I actually read the file, the rest tumbled out: uploads sent fd.append(\"file\", blob.name) (the filename as text, not the file), download was a.href - URL.createObjectURL(...) (a minus sign, evaluates to NaN), files never rendered because the check was it.kind === \"kind\" , and the status indicator pointed at a #status element that no longer existed. The infuriating part: the Rust backend was innocent. I traced the whole request path expecting a bug in create_drop or the router and found nothing wrong. The crime scene was entirely the front-end, a pile of one-character typos I’d never have caught without reading it line by line. “It compiles / it loads” is not “it works,” and the front-end has no compiler to yell at you. You find out on camera. Where Flit stands Real-time public/private drop box: text, links, files Browser-side E2E encryption Share links and post-only guest drops Installable PWA: offline shell, share target, QR pairing Dark mode, EN/KO, rate limiting, ephemeral mode One binary, Docker image, on Render"}, {"post_id": 24756, "ts": "2026-07-08T15:20:28Z", "hours": 4.8031, "text": "Flit Devlog #4 Devlog #3 ended on software’s most dangerous sentence: it works great on my machine. This one’s about every other machine — a real flit command, a lock on the door, prebuilt binaries for three OSes, a copy on the open internet, and the devices with no terminal at all. Where Flit stops being my tool and becomes a tool. A CLI that respects the pipe The flit client is a thin wrapper around curl with opinions: flit \"text\" , flit -f file , cmd | flit , flit -l . The stdin branch is my favorite — if the script sees it’s on the end of a pipe, whatever flows in becomes a drop, no flags, no quoting. So git log --oneline -5 | flit lands on my iPad before I’ve switched windows. Then I wrote the PowerShell sibling and relearned it isn’t “bash with different keywords”: headers are a hashtable, multipart a whole other ritual, and one missing dash cost me embarrassing time. A lock for the door Flit was wide open — fine on localhost, horrifying anywhere else. The rule: no FLIT_TOKEN , nothing changes; set it, and everything except /health demands it. The interesting part wasn’t whether to check a token but how you hand it over . A CLI sends Authorization: Bearer ; but you can’t staple a header onto a QR code. So the middleware speaks three dialects — Bearer header, ?token= , or cookie — and when the token arrives by URL, the server upgrades it to a cookie so it doesn’t live in your address bar: if from_query { if let Ok ( v ) = format! ( \"flit_token={expected}; Path=/; HttpOnly; SameSite=Lax\" ) .parse () { res .headers_mut () .insert ( header :: SET_COOKIE , v ); } } Open the link once, authed from then on. I also turned the upload cap into a knob ( FLIT_MAX_MB ). Three OSes, one tag Push a v* tag and GitHub Actions builds on three native runners — ubuntu, macos, windows — while a fourth gathers the artifacts into one release. But three OSes means three sets of opinions: Windows insists on .exe , wants shell: bash spelled out, and each names its artifact differently so the release job merges them cleanly. None of it hard in hindsight; all of it a red X on the first try. v0.1.0 now ships Linux, macOS, and Windows binaries from one git tag . Finding a home (the actual hard part) Nobody says this: deploying was easy, finding where was the fight. My first pick ambushed me mid-signup with a credit-card wall on the “free” tier. Closed the tab, went to Render, which read the Dockerfile from the repo and worked first try — thanks to one patch: check PORT first, fall back to FLIT_ADDR , else 0.0.0.0:7777 . Every platform injects PORT and expects you to listen on it; respect that one variable and the container runs anywhere, ignore it and you stare at “deploy succeeded” beside a site that never answers. Flit’s public face: https://flit-xw2a.onrender.com — open on purpose, drops expire in 10 min, uploads cap at 5 MB. The free box dozes when idle, so the first hit yawns before it wakes. The last mile: devices with no terminal The piece it was born for. My laptop has a shell; my iPad and phone don’t. Same trick on both — hijack the system share sheet so “Share → Flit” fires an HTTP request. On iPad that’s Apple Shortcuts; Android uses the open-source HTTP Shortcuts app — identical job. One mental model: the share sheet is the send button. A screenshot goes thumb-to-laptop with no computer in the middle — the entire point. Where Flit stands Real-time receive — drops appear instantly (#2) Clipboard-direct — text/links hit your clipboard (#3) Auto-expiry — drops delete themselves on a TTL (#3) Send from anything — Linux/macOS/Windows CLI, any browser, iPad, Android One binary, downloadable for three OSes, curl -able like a caveman or token-locked if you’re not, plus a live demo at https://flit-xw2a.onrender.com . That’s the build. Flit is shipped."}, {"post_id": 16996, "ts": "2026-06-27T16:05:04Z", "hours": 2.9097, "text": "Flit Devlog #3 Flit has one job: move a thing from one device to another without making you think about it. After devlog #2 it could already do the hard part — receive in real time over SSE, no refresh. But there was still a dumb gap at the end: a link would land, and I’d reach for the mouse, click the card, hit copy. For a project whose whole personality is “frictionless,” that last inch was embarrassing. This entry kills it: paste-on-arrival, and drops that take themselves out when they’re done. Paste before you ask for it The plan felt trivial. The SSE stream already fires an item event whenever something new shows up, so: listen for it, grab the newest text, drop it on the clipboard. No button. You copy on your phone, tab to your laptop, and it’s already under Ctrl+V. source . addEventListener ( \" item \" , async () => { const items = await fetch ( \" /api/items \" ). then (( r ) => r . json ()); if ( items [ 0 ]?. text ) await navigator . clipboard . writeText ( items [ 0 ]. text ); }); Ship it, right? …except the browser quietly says no It didn’t work — and the cruel part is how . No crash, no console error, the text just never landed. The only tell was a buried NotAllowedError . Here’s what nobody warns you about: clipboard.writeText() needs transient user activation . The browser only allows a clipboard write in the short window right after a real gesture — a click, a keypress. A message arriving over SSE is not a gesture. To the browser, a background script grabbing your clipboard is exactly what it should block. Fair. This also explained a bug that was driving me up the wall: auto-copy “only worked after toggling it off and on.” Of course — the toggle click itself was the gesture. So the honest fix was to lean in: the auto-copy switch IS the gesture. You arm it with a click, and the browser trusts the page to keep copying. Not magic — just asking permission in the only language the browser accepts. Drops that clean up after themselves The other half of frictionless is never having to remember to delete things. A drop inbox that fills up forever is just a junk drawer with a URL. So every item gets an expires timestamp at creation, and a reaper task wakes up every 30 seconds to sweep anything past it: let mut tick = tokio :: time :: interval ( Duration :: from_secs ( 30 )); loop { tick .tick () .await ; let t = now (); state .items .lock () .unwrap () .retain (| _ , it | it .expires == 0 || it .expires > t ); } I chose an active reaper over lazy “check on read” expiry on purpose: lazy expiry lets stale items linger until someone looks, and the list can briefly lie about what’s still alive. A background sweep keeps memory and the UI honest. Default is one hour ( FLIT_TTL_SECS=3600 ); 0 means keep forever. Where Flit stands The three quality-of-life wins are all in: Real-time receive — drops appear instantly (devlog #2) Clipboard-direct — text and links land on your clipboard Auto-expiry — drops delete themselves on a TTL And it’s still one binary you can curl at like a caveman if you feel like it. Next up It works great on my machine — the most dangerous sentence in software. Step 5 makes it real for other machines: a proper flit CLI (plus a PowerShell sibling), an auth layer so it isn’t wide open the second it leaves localhost, and a release workflow that ships prebuilt binaries for all three platforms. See you in #4."}, {"post_id": 16063, "ts": "2026-06-26T03:13:29Z", "hours": 1.2758, "text": "Devlog #2 session Flit could swallow things — text, links, files — but the only way to see what was in there was to keep poking it with curl . Functional, sure, but it felt like checking a mailbox by reaching in with my eyes closed. This time I wanted the moment that actually makes Flit worth building: you drop something on one device and it just appears on another, no refresh, no waiting. So I built the inbox page, and then I taught the server how to tap you on the shoulder. The tap is the fun part. My first thought was to have the page ask “anything new?” every couple of seconds, which works but always feels a half-step behind, and it hammers the server for nothing most of the time. WebSockets would do it, but that’s a full two-way phone line when all I need is the server occasionally shouting “hey, look!” down a one-way hallway. That’s exactly what Server-Sent Events are — plain HTTP, the browser reconnects on its own, and I get to keep the whole thing stupidly simple. Under the hood there’s a little broadcast channel. Whenever something gets stored, the server drops the new item’s id into the channel, and every browser that’s currently watching /api/events hears it and re-pulls the list. I left a 15-second background poll in there too, just as a safety net for the one time a connection quietly dies — belt and suspenders, because the entire promise of this thing is “it just shows up,” and I’d rather it be boringly reliable than clever. The first time it worked I had two terminals open. One sitting on curl -N /api/events , the other posting a note — and the event popped out the instant I hit enter, while the browser tab in the corner of my eye updated in the same breath. I may have said “oh, nice” out loud to an empty room. Next I want the drop to land where my hands already are : auto-copy the newest text straight to the clipboard the second it arrives, and let old stuff quietly expire so there’s never anything to tidy up. That clipboard moment is the one I’m most excited about — it’s the whole difference between “a place I go to check” and “it’s already there.“"}, {"post_id": 13662, "ts": "2026-06-22T12:44:23Z", "hours": 0.0, "text": "Devlog #1 — From an empty folder to a working drop box So I finally started building Drop — the little “throw a file/link/note from one device and just grab it on another” thing I keep wishing existed pretty much every day. The whole pitch is no friction: no login, no app-store download, no database to babysit. You run one binary and suddenly there’s a shared inbox sitting on your network. What actually works now I started from literally nothing — cargo new drop –name drop-server — and by the end of the session the server accepts stuff and hands it back. Stood up an axum 0.8 + tokio server with / and /health just to confirm it was breathing. Designed one Item type and tossed everything into an in-memory Arc<Mutex>. No database, on purpose — the point is to be instant and disposable, not durable. POST /api/text takes raw text and is smart enough to tag it as a link when it looks like a URL, otherwise text. POST /api/file accepts a multipart upload and keeps the original filename + content type. GET /api/items returns everything newest-first as JSON. I deliberately strip the raw bytes out of the list so it stays light. GET /api/items/{id}/raw streams the original file back with Content-Disposition: inline. Stuff that tripped me up axum 0.8 changed route params from :id to {id}. I pasted a 0.7 example first and the server panicked on boot. Easy fix once I knew what I was looking at. Multipart is a stream you drain with next_field(), so it has to be mut multipart — the borrow checker kept yelling until I gave in. My first instinct was to shove file bytes straight into the JSON list. Terrible idea for anything big, so the bytes are now #[serde(skip_serializing)] and only ever come out of the /raw endpoint. Quick proof it works curl -d “ship it” localhost:7777/api/text # ok curl -F “ [email protected] ” localhost:7777/api/file # ok curl -s localhost:7777/api/items | jq ‘.[].kind’ # “file” “link” “text” Next up Right now it’s all curl, which is fine for me but not exactly the dream. Next session I’m building the actual inbox web page and wiring up SSE, so a new drop pops up on my other devices instantly — that real-time moment is the whole reason I’m making this."}]...
|
Title: Flit by @reimunyancat | Stardance
Devlogs: Title: Flit by @reimunyancat | Stardance
Devlogs:
Devlog #1 — From an empty folder to a working drop box So I finally started building Drop — the little “throw a file/link/note from one device and just grab it on another” thing I keep wishing existed pretty much every day. The whole pitch is no friction: no login, no app-store download, no database to babysit. You run one binary and suddenly there’s a shared inbox sitting on your network. What actually works now I started from literally nothing — cargo new drop –name drop-server — and by the end of the session the server accepts stuff and hands it back. Stood up an axum 0.8 + tokio server with / and /health just to confirm it was breathing. Designed one Item type and tossed everything into an in-memory Arc<Mutex>. No database, on purpose — the point is to be instant and disposable, not durable. POST /api/text takes raw text and is smart enough to tag it as a link when it looks like a URL, otherwise text. POST /api/file accepts a multipart upload and keeps the original filename + content type. GET /api/items returns everything newest-first as JSON. I deliberately strip the raw bytes out of the list so it stays light. GET /api/items/{id}/raw streams the original file back with Content-Disposition: inline. Stuff that tripped me up axum 0.8 changed route params from :id to {id}. I pasted a 0.7 example first and the server panicked on boot. Easy fix once I knew what I was looking at. Multipart is a stream you drain with next_field(), so it has to be mut multipart — the borrow checker kept yelling until I gave in. My first instinct was to shove file bytes straight into the JSON list. Terrible idea for anything big, so the bytes are now #[serde(skip_serializing)] and only ever come out of the /raw endpoint. Quick proof it works curl -d “ship it” localhost:7777/api/text # ok curl -F “ [email protected] ” localhost:7777/api/file # ok curl -s localhost:7777/api/items | jq ‘.[].kind’ # “file” “link” “text” Next up Right now it’s all curl, which is fine for me but not exactly the dream. Next session I’m building the actual inbox web page and wiring up SSE, so a new drop pops up on my other devices instantly — that real-time moment is the whole reason I’m making this.
Devlog #2 session Flit could swallow things — text, links, files — but the only way to see what was in there was to keep poking it with curl . Functional, sure, but it felt like checking a mailbox by reaching in with my eyes closed. This time I wanted the moment that actually makes Flit worth building: you drop something on one device and it just appears on another, no refresh, no waiting. So I built the inbox page, and then I taught the server how to tap you on the shoulder. The tap is the fun part. My first thought was to have the page ask “anything new?” every couple of seconds, which works but always feels a half-step behind, and it hammers the server for nothing most of the time. WebSockets would do it, but that’s a full two-way phone line when all I need is the server occasionally shouting “hey, look!” down a one-way hallway. That’s exactly what Server-Sent Events are — plain HTTP, the browser reconnects on its own, and I get to keep the whole thing stupidly simple. Under the hood there’s a little broadcast channel. Whenever something gets stored, the server drops the new item’s id into the channel, and every browser that’s currently watching /api/events hears it and re-pulls the list. I left a 15-second background poll in there too, just as a safety net for the one time a connection quietly dies — belt and suspenders, because the entire promise of this thing is “it just shows up,” and I’d rather it be boringly reliable than clever. The first time it worked I had two terminals open. One sitting on curl -N /api/events , the other posting a note — and the event popped out the instant I hit enter, while the browser tab in the corner of my eye updated in the same breath. I may have said “oh, nice” out loud to an empty room. Next I want the drop to land where my hands already are : auto-copy the newest text straight to the clipboard the second it arrives, and let old stuff quietly expire so there’s never anything to tidy up. That clipboard moment is the one I’m most excited about — it’s the whole difference between “a place I go to check” and “it’s already there.“
Flit Devlog #3 Flit has one job: move a thing from one device to another without making you think about it. After devlog #2 it could already do the hard part — receive in real time over SSE, no refresh. But there was still a dumb gap at the end: a link would land, and I’d reach for the mouse, click the card, hit copy. For a project whose whole personality is “frictionless,” that last inch was embarrassing. This entry kills it: paste-on-arrival, and drops that take themselves out when they’re done. Paste before you ask for it The plan felt trivial. The SSE stream already fires an item event whenever something new shows up, so: listen for it, grab the newest text, drop it on the clipboard. No button. You copy on your phone, tab to your laptop, and it’s already under Ctrl+V. source . addEventListener ( " item " , async () => { const items = await fetch ( " /api/items " ). then (( r ) => r . json ()); if ( items [ 0 ]?. text ) await navigator . clipboard . writeText ( items [ 0 ]. text ); }); Ship it, right? …except the browser quietly says no It didn’t work — and the cruel part is how . No crash, no console error, the text just never landed. The only tell was a buried NotAllowedError . Here’s what nobody warns you about: clipboard.writeText() needs transient user activation . The browser only allows a clipboard write in the short window right after a real gesture — a click, a keypress. A message arriving over SSE is not a gesture. To the browser, a background script grabbing your clipboard is exactly what it should block. Fair. This also explained a bug that was driving me up the wall: auto-copy “only worked after toggling it off and on.” Of course — the toggle click itself was the gesture. So the honest fix was to lean in: the auto-copy switch IS the gesture. You arm it with a click, and the browser trusts the page to keep copying. Not magic — just asking permission in the only language the browser accepts. Drops that clean up after themselves The other half of frictionless is never having to remember to delete things. A drop inbox that fills up forever is just a junk drawer with a URL. So every item gets an expires timestamp at creation, and a reaper task wakes up every 30 seconds to sweep anything past it: let mut tick = tokio :: time :: interval ( Duration :: from_secs ( 30 )); loop { tick .tick () .await ; let t = now (); state .items .lock () .unwrap () .retain (| _ , it | it .expires == 0 || it .expires > t ); } I chose an active reaper over lazy “check on read” expiry on purpose: lazy expiry lets stale items linger until someone looks, and the list can briefly lie about what’s still alive. A background sweep keeps memory and the UI honest. Default is one hour ( FLIT_TTL_SECS=3600 ); 0 means keep forever. Where Flit stands The three quality-of-life wins are all in: Real-time receive — drops appear instantly (devlog #2) Clipboard-direct — text and links land on your clipboard Auto-expiry — drops delete themselves on a TTL And it’s still one binary you can curl at like a caveman if you feel like it. Next up It works great on my machine — the most dangerous sentence in software. Step 5 makes it real for other machines: a proper flit CLI (plus a PowerShell sibling), an auth layer so it isn’t wide open the second it leaves localhost, and a release workflow that ships prebuilt binaries for all three platforms. See you in #4.
Flit Devlog #4 Devlog #3 ended on software’s most dangerous sentence: it works great on my machine. This one’s about every other machine — a real flit command, a lock on the door, prebuilt binaries for three OSes, a copy on the open internet, and the devices with no terminal at all. Where Flit stops being my tool and becomes a tool. A CLI that respects the pipe The flit client is a thin wrapper around curl with opinions: flit "text" , flit -f file , cmd | flit , flit -l . The stdin branch is my favorite — if the script sees it’s on the end of a pipe, whatever flows in becomes a drop, no flags, no quoting. So git log --oneline -5 | flit lands on my iPad before I’ve switched windows. Then I wrote the PowerShell sibling and relearned it isn’t “bash with different keywords”: headers are a hashtable, multipart a whole other ritual, and one missing dash cost me embarrassing time. A lock for the door Flit was wide open — fine on localhost, horrifying anywhere else. The rule: no FLIT_TOKEN , nothing changes; set it, and everything except /health demands it. The interesting part wasn’t whether to check a token but how you hand it over . A CLI sends Authorization: Bearer ; but you can’t staple a header onto a QR code. So the middleware speaks three dialects — Bearer header, ?token= , or cookie — and when the token arrives by URL, the server upgrades it to a cookie so it doesn’t live in your address bar: if from_query { if let Ok ( v ) = format! ( "flit_token={expected}; Path=/; HttpOnly; SameSite=Lax" ) .parse () { res .headers_mut () .insert ( header :: SET_COOKIE , v ); } } Open the link once, authed from then on. I also turned the upload cap into a knob ( FLIT_MAX_MB ). Three OSes, one tag Push a v* tag and GitHub Actions builds on three native runners — ubuntu, macos, windows — while a fourth gathers the artifacts into one release. But three OSes means three sets of opinions: Windows insists on .exe , wants shell: bash spelled out, and each names its artifact differently so the release job merges them cleanly. None of it hard in hindsight; all of it a red X on the first try. v0.1.0 now ships Linux, macOS, and Windows binaries from one git tag . Finding a home (the actual hard part) Nobody says this: deploying was easy, finding where was the fight. My first pick ambushed me mid-signup with a credit-card wall on the “free” tier. Closed the tab, went to Render, which read the Dockerfile from the repo and worked first try — thanks to one patch: check PORT first, fall back to FLIT_ADDR , else 0.0.0.0:7777 . Every platform injects PORT and expects you to listen on it; respect that one variable and the container runs anywhere, ignore it and you stare at “deploy succeeded” beside a site that never answers. Flit’s public face: https://flit-xw2a.onrender.com — open on purpose, drops expire in 10 min, uploads cap at 5 MB. The free box dozes when idle, so the first hit yawns before it wakes. The last mile: devices with no terminal The piece it was born for. My laptop has a shell; my iPad and phone don’t. Same trick on both — hijack the system share sheet so “Share → Flit” fires an HTTP request. On iPad that’s Apple Shortcuts; Android uses the open-source HTTP Shortcuts app — identical job. One mental model: the share sheet is the send button. A screenshot goes thumb-to-laptop with no computer in the middle — the entire point. Where Flit stands Real-time receive — drops appear instantly (#2) Clipboard-direct — text/links hit your clipboard (#3) Auto-expiry — drops delete themselves on a TTL (#3) Send from anything — Linux/macOS/Windows CLI, any browser, iPad, Android One binary, downloadable for three OSes, curl -able like a caveman or token-locked if you’re not, plus a live demo at https://flit-xw2a.onrender.com . That’s the build. Flit is shipped.
Flit Devlog #5 Last time I ended on “it’s live, it’s public, anyone can hit the URL.” That felt great for about a day, until I thought about what “anyone can hit the URL” actually means. A public drop box where every visitor can read every drop isn’t a feature, it’s a liability. So this entry is me getting paranoid and cleaning up after myself. The public box problem I wanted encryption without a server that holds keys. If the box is public, the server should store gibberish. So it happens in the browser: type a passphrase and everything runs through PBKDF2 (150k rounds, SHA-256) into an AES-256-GCM key before it leaves the tab. The server only ever sees a FLITENC1: blob. Great, until I tested over the LAN and got TypeError: Cannot read properties of undefined (reading 'deriveKey') . crypto.subtle wasn’t there. Web Crypto only exists in a secure context, so localhost and HTTPS work, but http://192.168.x.x on another device is undefined. So I documented it (HTTPS or a VPN hostname for off-localhost encryption) instead of pretending. A status light that lied The “Live” dot is driven by the SSE onopen . Locally it fired instantly; on the deployed box it sat on “Connecting…” while drops streamed in fine. The proxy was buffering the first chunk, so onopen fired late. Fix: send one byte on connect (a ready event prepended to the stream) so the proxy flushes and the client knows it’s open. A server that wouldn’t die Added graceful shutdown; Ctrl+C then did nothing. with_graceful_shutdown waits for every connection to close, and the SSE stream never closes, that’s its whole point. So it waited forever. I stopped being clever: print, spawn a 500ms timer, std::process::exit(0) . Not elegant, but it actually turns off. Handing over one thing, not the keys Two mirrored features. Share links ( /s/{id} ) hand someone a single item, optionally one-time or expiring, without exposing the inbox. Drop links ( /d/{id} ) are post-only: a guest can send something into my box but can’t see what’s inside. Making it a real app A manifest and service worker so Flit installs to the home screen and loads offline. Web Share Target so Android’s “share” can target it. A server-rendered SVG QR ( qrcode , default-features = false ) so pairing a phone is a scan, not a typed IP. And then it all broke on camera Not proud of this. I’d rewritten the whole front-end in one sitting, shipped it, hit record for the demo, and watched it faceplant. Clicked “Share”: dead button, no request. Console: Uncaught ReferenceError: POST is not defined . I’d written method: POST instead of "POST" — a bare identifier that threw before fetch . The drop link “worked”: it copied the string undefined . The culprit was await r.json without the () , so j.url read off the function, not the body. One () fixed it. Once I actually read the file, the rest tumbled out: uploads sent fd.append("file", blob.name) (the filename as text, not the file), download was a.href - URL.createObjectURL(...) (a minus sign, evaluates to NaN), files never rendered because the check was it.kind === "kind" , and the status indicator pointed at a #status element that no longer existed. The infuriating part: the Rust backend was innocent. I traced the whole request path expecting a bug in create_drop or the router and found nothing wrong. The crime scene was entirely the front-end, a pile of one-character typos I’d never have caught without reading it line by line. “It compiles / it loads” is not “it works,” and the front-end has no compiler to yell at you. You find out on camera. Where Flit stands Real-time public/private drop box: text, links, files Browser-side E2E encryption Share links and post-only guest drops Installable PWA: offline shell, share target, QR pairing Dark mode, EN/KO, rate limiting, ephemeral mode One binary, Docker image, on Render
Ships:
Flit is my answer to a problem I hit every single day: moving a link, a bit of text, or a file between my own devices. The normal fixes all have friction. You email yourself, message yourself, or upload to a cloud drive just to download it thirty seconds later on the machine sitting right next to it. Every one of those involves accounts, apps, and steps that have nothing to do with the actual job. Flit is a self-hosted drop inbox. One Rust binary, no accounts, no cloud. Open the URL on any device and everything you drop shows up on every other device in real time. What it actually improves day to day: Real-time sync over SSE. Paste on the desktop and it’s on your phone before you pick it up, no refresh button. QR pairing, because scanning a code beats typing an IP address and a token on a phone keyboard. Share links and drop links. Hand someone exactly one item (one-time or expiring if you want), or give them a post-only page where they can send files into your box without seeing what’s already in it. It installs as a PWA, so on Android “share to Flit” works from any app. Optional browser-side end-to-end encryption (PBKDF2 into AES-GCM), so a public box stores nothing the server can read. On top of that there’s dark mode, an English/Korean toggle, rate limiting, and an ephemeral mode that spins the box down after it sits idle. It’s live at the link, it survived me recording a demo (barely, devlog #5 has the carnage), and it’s built from scratch in Rust with axum....
|
1792875243.9963224
|
1793739243.9963224
|
|
18592
|
Game by @carol | Stardance
|
carol
|
1
|
13.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T12:40:42Z", "hours": 13.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Silly Monkey Scroller Game", "repo": "https://github.com/carolllltent/Gr-11", "demo": "https://drive.google.com/file/d/17--oe243K-rmj2cl-zDiEzytGUyeo-Ey/view?usp=sharing"}]...
|
[{"post_id": 10384, "ts": "202 [{"post_id": 10384, "ts": "2026-06-17T02:08:35Z", "hours": 13.2592, "text": "Game that develops motor skills of user by imitating dadish game"}]...
|
Title: Game by @carol | Stardance
Devlogs:
Game t Title: Game by @carol | Stardance
Devlogs:
Game that develops motor skills of user by imitating dadish game
Ships:
Silly Monkey Scroller Game...
|
1793120052.86757
|
1793206452.86757
|
|
18614
|
Trackify by @JasonC9 | Stardance
|
JasonC9
|
1
|
2.0
|
33
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T18:44:10Z", "hours": 2.0, "multiplier": 14.26, "payout": 33, "blessing": "neutral", "text": "A lightweight Windows desktop overlay that shows what music is currently playing, including song info and genre how to use at the bottom of the readme", "repo": "https://github.com/anadskman/Trackify", "demo": "https://github.com/anadskman/Trackify/releases"}]...
|
[{"post_id": 8929, "ts": "2026 [{"post_id": 8929, "ts": "2026-06-14T20:58:16Z", "hours": 1.3014, "text": "I made the Overlay Popup Made it semi transparent added pause, skip, prev buttons styled it to look a lot better added fades added to system tray added icon.ico for tray I also uploaded everything to github and made the readme"}, {"post_id": 8814, "ts": "2026-06-14T17:22:11Z", "hours": 0.9836, "text": "Goal Build a desktop app to show what music is playing and detect its genre in real time, in a clean overlay-style UI. Setup Created a WPF app using .NET Confirmed blank window worked UI Added basic dark UI in XAML Showed song title, artist, and genre Started with fake test data Song Detection Used Windows media session API App now detects Spotify, YouTube, etc. Updates when song changes Genre System Integrated Last.fm API Fetches genre from artist name Returns “Unknown” if no data Current State Working MVP : Live song detection Artist + title display Genre lookup working Auto-updates on song change To Do Overlay popup UI (FluentFlyouts style) Album art( maybe ) Skip, back, pause buttons Caching + performance improvements"}]...
|
Title: Trackify by @JasonC9 | Stardance
Devlogs:
Title: Trackify by @JasonC9 | Stardance
Devlogs:
Goal Build a desktop app to show what music is playing and detect its genre in real time, in a clean overlay-style UI. Setup Created a WPF app using .NET Confirmed blank window worked UI Added basic dark UI in XAML Showed song title, artist, and genre Started with fake test data Song Detection Used Windows media session API App now detects Spotify, YouTube, etc. Updates when song changes Genre System Integrated Last.fm API Fetches genre from artist name Returns “Unknown” if no data Current State Working MVP : Live song detection Artist + title display Genre lookup working Auto-updates on song change To Do Overlay popup UI (FluentFlyouts style) Album art( maybe ) Skip, back, pause buttons Caching + performance improvements
I made the Overlay Popup Made it semi transparent added pause, skip, prev buttons styled it to look a lot better added fades added to system tray added icon.ico for tray I also uploaded everything to github and made the readme
Ships:
A lightweight Windows desktop overlay that shows what music is currently playing, including song info and genre how to use at the bottom of the readme...
|
1793134280.8745568
|
1793220680.8745568
|
|
18618
|
My very own WebOS by @hazikkhalid | Stardance
|
hazikkhalid
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T16:00:36Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So this is a web-version of a OS i made in html css js and i made it for the WebOS mission, it was really great, i always wanted to make an os , i once tried in c but had to stop in between because of my exams. i am planning to take this as a inspiration and make a real linux distro out of this soon", "repo": "https://github.com/gitHazik/Myveryownos", "demo": "https://myveryownos.netlify.app/"}]...
|
[{"post_id": 10706, "ts": "202 [{"post_id": 10706, "ts": "2026-06-17T15:56:30Z", "hours": 1.1856, "text": "Finally done with adding the notepad app, and its functions"}, {"post_id": 10651, "ts": "2026-06-17T14:45:02Z", "hours": 1.3594, "text": "I added functions like opening apps and dragging them, now will work on notepad"}, {"post_id": 10592, "ts": "2026-06-17T12:34:52Z", "hours": 0.4167, "text": "So i changed the Desktop, its better now and i like it more, i am still using simple css to style it"}, {"post_id": 9912, "ts": "2026-06-16T12:47:14Z", "hours": 1.5603, "text": "Made my own custom os, did javascrit after a long time and was really fun"}]...
|
Title: My very own WebOS by @hazikkhalid | Stardan Title: My very own WebOS by @hazikkhalid | Stardance
Devlogs:
Made my own custom os, did javascrit after a long time and was really fun
So i changed the Desktop, its better now and i like it more, i am still using simple css to style it
I added functions like opening apps and dragging them, now will work on notepad
Finally done with adding the notepad app, and its functions
Ships:
So this is a web-version of a OS i made in html css js and i made it for the WebOS mission, it was really great, i always wanted to make an os , i once tried in c but had to stop in between because of my exams. i am planning to take this as a inspiration and make a real linux distro out of this soon...
|
1792878593.1957066
|
1793742593.1957066
|
|
18624
|
Format by @franco | Stardance
|
franco
|
1
|
7.0
|
73
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T00:36:44Z", "hours": 7.0, "multiplier": 11.76, "payout": 73, "blessing": "neutral", "text": "What I made I built Format , a Chrome extension that upgrades how you manage tabs. It gives you a fast, OS-style tab switcher inside the browser (press Ctrl+Shift+Space to cycle active tabs) and integrates Google’s Gemini API to automatically group open tabs into clean, colored categories. What was challenging Injecting the tab switcher overlay dynamically into arbitrary web pages without breaking their original layouts or CSS styling. Getting the background worker to reliably track the tab history (Most Recently Used order) and sync it to the UI in real-time was also a fun state-management puzzle. What I’m proud of The UI/UX feels incredibly fluid and premium. It follows Material 3 design principles with dynamic accent themes that automatically adjust to light/dark modes, and the AI grouping works surprisingly fast and accurately. How to test it Load the extension folder in Chrome Developer Mode ( chrome://extensions/ ). Open the extension popup, go to settings, and enter your Gemini API key. Click Organize with AI to see your tabs grouped automatically, or use Ctrl+Shift+Space to instantly toggle and cycle through your tabs!", "repo": "https://github.com/Franco-Senes/Format", "demo": "https://github.com/Franco-Senes/Format/releases/tag/1.1"}]...
|
[{"post_id": 10971, "ts": "202 [{"post_id": 10971, "ts": "2026-06-18T00:02:46Z", "hours": 4.2919, "text": "I’ve finished the project also make some ui and logic fixes i am so proud of what i made"}, {"post_id": 8969, "ts": "2026-06-14T22:40:43Z", "hours": 0.3333, "text": "guess what now i need to code the ui again……… so yeah also need to code the backend acording to the new ui so lets get on coding also erased the manifiest for some reason…"}, {"post_id": 8843, "ts": "2026-06-14T18:21:16Z", "hours": 1.2311, "text": "Made the ui into actual code https://streamable.com/zx4o3b"}, {"post_id": 8796, "ts": "2026-06-14T16:36:20Z", "hours": 0.6625, "text": "Finished making a ui in Figma now its time to recreate it"}]...
|
Title: Format by @franco | Stardance
Devlogs:
Fin Title: Format by @franco | Stardance
Devlogs:
Finished making a ui in Figma now its time to recreate it
Made the ui into actual code https://streamable.com/zx4o3b
guess what now i need to code the ui again……… so yeah also need to code the backend acording to the new ui so lets get on coding also erased the manifiest for some reason…
I’ve finished the project also make some ui and logic fixes i am so proud of what i made
Ships:
What I made I built Format , a Chrome extension that upgrades how you manage tabs. It gives you a fast, OS-style tab switcher inside the browser (press Ctrl+Shift+Space to cycle active tabs) and integrates Google’s Gemini API to automatically group open tabs into clean, colored categories. What was challenging Injecting the tab switcher overlay dynamically into arbitrary web pages without breaking their original layouts or CSS styling. Getting the background worker to reliably track the tab history (Most Recently Used order) and sync it to the UI in real-time was also a fun state-management puzzle. What I’m proud of The UI/UX feels incredibly fluid and premium. It follows Material 3 design principles with dynamic accent themes that automatically adjust to light/dark modes, and the AI grouping works surprisingly fast and accurately. How to test it Load the extension folder in Chrome Developer Mode ( chrome://extensions/ ). Open the extension popup, go to settings, and enter your Gemini API key. Click Organize with AI to see your tabs grouped automatically, or use Ctrl+Shift+Space to instantly toggle and cycle through your tabs!...
|
1793274631.571777
|
1793361031.571777
|
|
18640
|
SmurfCatOS by @julianvito908 | Stardance
|
julianvito908
|
1
|
15.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-22T23:43:14Z", "hours": 15.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a OS system based of smurfcat, it was really hard to do the entire project in general, and i’m proud of how it works really well and i’m happy I was able to add a feature that the guide didn’t have like making the window come to the front if tapped on or the app icon or open button is tapped on", "repo": "https://github.com/JV10001/SmurfCatOS", "demo": "https://jv10001.github.io/SmurfCatOS/"}]...
|
[{"post_id": 13994, "ts": "202 [{"post_id": 13994, "ts": "2026-06-22T23:26:35Z", "hours": 2.0539, "text": "Final devlog added a clicker app so yeah enjoy SmurfCatOS!!!"}, {"post_id": 13350, "ts": "2026-06-21T21:22:45Z", "hours": 5.5186, "text": "my OS system is nearing completion!!! Right now I added a notebook and made it be able to tell you when it was last updated. I also added a feature where when the window isn’t closed and you clicked on the open button for the welcome screen or icon when the app is selected it will bring the window to the middle to prevent a bug where you can make the window close button and drag button go off screen causing you to not be able to drag it same goes for if its closed and you opened it the window will go to the middle. You can write where the text says we live, We love, We lie which was what Smurf Cat would say, so I decided to add it because why not. I also got the notes to save to. The final feature is I got it when I click on the open button or app icon for the notebook app or welcome screen it brings the window to the front same goes for tapping on the window, also if you want you can comment on if it looks good. That is all!!!"}, {"post_id": 10718, "ts": "2026-06-17T16:09:08Z", "hours": 4.5467, "text": "I finally fixed most of the major bugs like open button and now I’m finally free so I’m happy until I have to start on adding the apps😭"}, {"post_id": 9301, "ts": "2026-06-15T16:50:10Z", "hours": 1.0072, "text": "movable windows they aren’t working right now sadly"}, {"post_id": 9062, "ts": "2026-06-15T04:10:32Z", "hours": 1.5164, "text": "Added a top bar the tab bar an tell the time and it also includes the name of the operating system and just chilling!"}, {"post_id": 8974, "ts": "2026-06-14T22:49:36Z", "hours": 0.5514, "text": "I am working on my own OS system which is very basic right now and isn’t really an OS but I still thinks its cool. It is also inspired by Smurf Cat"}]...
|
Title: SmurfCatOS by @julianvito908 | Stardance
D Title: SmurfCatOS by @julianvito908 | Stardance
Devlogs:
I am working on my own OS system which is very basic right now and isn’t really an OS but I still thinks its cool. It is also inspired by Smurf Cat
Added a top bar the tab bar an tell the time and it also includes the name of the operating system and just chilling!
movable windows they aren’t working right now sadly
I finally fixed most of the major bugs like open button and now I’m finally free so I’m happy until I have to start on adding the apps😭
my OS system is nearing completion!!! Right now I added a notebook and made it be able to tell you when it was last updated. I also added a feature where when the window isn’t closed and you clicked on the open button for the welcome screen or icon when the app is selected it will bring the window to the middle to prevent a bug where you can make the window close button and drag button go off screen causing you to not be able to drag it same goes for if its closed and you opened it the window will go to the middle. You can write where the text says we live, We love, We lie which was what Smurf Cat would say, so I decided to add it because why not. I also got the notes to save to. The final feature is I got it when I click on the open button or app icon for the notebook app or welcome screen it brings the window to the front same goes for tapping on the window, also if you want you can comment on if it looks good. That is all!!!
Final devlog added a clicker app so yeah enjoy SmurfCatOS!!!
Ships:
I made a OS system based of smurfcat, it was really hard to do the entire project in general, and i’m proud of how it works really well and i’m happy I was able to add a feature that the guide didn’t have like making the window come to the front if tapped on or the app icon or open button is tapped on...
|
1793260263.592036
|
1793346663.592036
|
|
18646
|
Shoggy by @Eraxty | Stardance
|
Eraxty
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T17:25:52Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Shoggy Shader is a lightweight Minecraft shader designed specifically for low-end PCs, delivering enhanced visuals without sacrificing performance. It features atmospheric fog, dynamic lighting, colored light effects, and a semi-realistic visual style that makes the world feel more immersive while maintaining smooth gameplay", "repo": "https://github.com/Eraxty/Shoggy", "demo": "https://modrinth.com/shader/shoggy-shader"}]...
|
[{"post_id": 8806, "ts": "2026 [{"post_id": 8806, "ts": "2026-06-14T17:08:30Z", "hours": 0.5744, "text": "better lighting"}, {"post_id": 8782, "ts": "2026-06-14T16:21:13Z", "hours": 6.4778, "text": "Made my shader forgot to post devlogs"}]...
|
Title: Shoggy by @Eraxty | Stardance
Devlogs:
Mad Title: Shoggy by @Eraxty | Stardance
Devlogs:
Made my shader forgot to post devlogs
better lighting
Ships:
Shoggy Shader is a lightweight Minecraft shader designed specifically for low-end PCs, delivering enhanced visuals without sacrificing performance. It features atmospheric fog, dynamic lighting, colored light effects, and a semi-realistic visual style that makes the world feel more immersive while maintaining smooth gameplay...
|
1793271102.24517
|
1793357502.24517
|
|
18665
|
Covertfily by @jagathram | Stardance
|
jagathram
|
1
|
63.35
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T03:33:49Z", "hours": 61.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Covertfily is a privacy-first file toolkit that runs entirely in your browser. Drop a file, pick a format, download the result What you can do: • Convert 150+ format pairs — PNG→JPG, PDF→Word, MP4→MP3, Excel→CSV, and more • PDF tools — merge, compress, watermark, protect, reorder pages • Media tools — trim video, compress, change speed, extract frames (FFmpeg.wasm in the browser) • Image utilities — OCR, resize, EXIF reader, collage maker, pixel art, and more • NASA tools — pull Landsat satellite imagery by lat/long/date, and download Astronomy Picture of the Day in JPG/PNG/WebP Why it’s a real build, not a landing page: • Static site with 200+ HTML pages, zero backend • Custom generator pipeline — one template spawns every converter page • Heavy client-side libs: PDF.js, FFmpeg.wasm, Tesseract.js, SheetJS • Open source: github.com/jagathram-tech/covertfily ( https://github.com/jagathram-tech/covertfily ) • Live: covertfily.com ( https://covertfily.com )", "repo": "", "demo": ""}]...
|
[{"post_id": 43941, "ts": "202 [{"post_id": 43941, "ts": "2026-08-09T12:12:14Z", "hours": 2.3458, "text": "This week I cleaned up and improved Covertfily’s video tools. • Removed the Protect/Unlock PDF tool and all site-wide links • Fixed video compression so files actually get smaller (not larger) by switching from fixed bitrates to smarter, source-aware encoding • Fixed the progress bar on Video Compressor, Video Speed, and Video Trimmer so users can clearly see status during processing Small product polish, better UX, more trustworthy results — all still 100% private and browser-based."}, {"post_id": 19153, "ts": "2026-06-30T12:16:36Z", "hours": 10.7383, "text": "Upgrading the capacity and usability"}, {"post_id": 16663, "ts": "2026-06-27T02:50:44Z", "hours": 17.1214, "text": "the UI Looks much much better"}, {"post_id": 14036, "ts": "2026-06-23T00:37:28Z", "hours": 8.5031, "text": "Making The music trimmer working"}, {"post_id": 13438, "ts": "2026-06-22T00:39:37Z", "hours": 10.9403, "text": "Just rectifying the conversion issues"}, {"post_id": 12525, "ts": "2026-06-20T13:28:47Z", "hours": 3.2233, "text": "improving the site ui"}, {"post_id": 11671, "ts": "2026-06-19T00:41:40Z", "hours": 9.9317, "text": "Just improving the ui and experience"}, {"post_id": 10691, "ts": "2026-06-17T15:39:26Z", "hours": 0.3292, "text": "Spent some time today making Covertfily’s SEO actually solid instead of just “good enough.“The big stuff: every page now ships proper Open Graph image tags (dimensions, type, the works) so when someone drops a link in Discord or Twitter it doesn’t render as a sad cropped mess. Also wired up datePublished/dateModified on all the articles and blog posts — turns out Google straight-up won’t show article rich results without those, and we had none. Oops.Fixed a sneaky one too: the sitemap was stamping today’s date on all 203 pages every time it ran, basically telling Google “yeah everything changed at once” — which is a garbage signal. Now each page reports its real last-modified date.Threw in some cleanup while I was in there — tightened the attribute escaping so weird characters can’t break the HTML, and killed a copy-pasted homepage meta block that had quietly drifted out of sync with everything else.All 203 pages regenerated, validation passing, committed on its own branch.Couple things still on the list: the share image is a wide skinny logo right now, needs a proper 1200×630 one. And heads up — Google killed FAQ/HowTo rich results back in 2023, so that markup’s just along for the ride now."}]...
|
Title: Covertfily by @jagathram | Stardance
Devlo Title: Covertfily by @jagathram | Stardance
Devlogs:
Spent some time today making Covertfily’s SEO actually solid instead of just “good enough.“The big stuff: every page now ships proper Open Graph image tags (dimensions, type, the works) so when someone drops a link in Discord or Twitter it doesn’t render as a sad cropped mess. Also wired up datePublished/dateModified on all the articles and blog posts — turns out Google straight-up won’t show article rich results without those, and we had none. Oops.Fixed a sneaky one too: the sitemap was stamping today’s date on all 203 pages every time it ran, basically telling Google “yeah everything changed at once” — which is a garbage signal. Now each page reports its real last-modified date.Threw in some cleanup while I was in there — tightened the attribute escaping so weird characters can’t break the HTML, and killed a copy-pasted homepage meta block that had quietly drifted out of sync with everything else.All 203 pages regenerated, validation passing, committed on its own branch.Couple things still on the list: the share image is a wide skinny logo right now, needs a proper 1200×630 one. And heads up — Google killed FAQ/HowTo rich results back in 2023, so that markup’s just along for the ride now.
Just improving the ui and experience
improving the site ui
Just rectifying the conversion issues
Making The music trimmer working
the UI Looks much much better
Upgrading the capacity and usability
This week I cleaned up and improved Covertfily’s video tools. • Removed the Protect/Unlock PDF tool and all site-wide links • Fixed video compression so files actually get smaller (not larger) by switching from fixed bitrates to smarter, source-aware encoding • Fixed the progress bar on Video Compressor, Video Speed, and Video Trimmer so users can clearly see status during processing Small product polish, better UX, more trustworthy results — all still 100% private and browser-based.
Ships:
Covertfily is a privacy-first file toolkit that runs entirely in your browser. Drop a file, pick a format, download the result What you can do: • Convert 150+ format pairs — PNG→JPG, PDF→Word, MP4→MP3, Excel→CSV, and more • PDF tools — merge, compress, watermark, protect, reorder pages • Media tools — trim video, compress, change speed, extract frames (FFmpeg.wasm in the browser) • Image utilities — OCR, resize, EXIF reader, collage maker, pixel art, and more • NASA tools — pull Landsat satellite imagery by lat/long/date, and download Astronomy Picture of the Day in JPG/PNG/WebP Why it’s a real build, not a landing page: • Static site with 200+ HTML pages, zero backend • Custom generator pipeline — one template spawns every converter page • Heavy client-side libs: PDF.js, FFmpeg.wasm, Tesseract.js, SheetJS • Open source: github.com/jagathram-tech/covertfily ( https://github.com/jagathram-tech/covertfily ) • Live: covertfily.com ( https://covertfily.com )...
|
1792882075.334546
|
1793746075.334546
|
|
18670
|
TRIVA Night Game by @vatsamalakar | Stardance
|
vatsamalakar
|
1
|
2.34
|
8
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-21T20:02:45Z", "hours": 2.0, "multiplier": 5.24, "payout": 8, "blessing": "neutral", "text": "I created TRIVA Night, an interactive trivia game designed to make answering questions feel like a fun game show experience. Players can test their knowledge across different categories, answer questions, track their score, and compete against themselves to get the highest score possible. The app focuses on creating an engaging experience with a clean interface, smooth interactions, and an enjoyable way to learn new facts. What was challenging? One of the biggest challenges was making the game logic work correctly, including checking answers, updating scores, moving between questions, and making sure the user experience felt smooth. I also spent time improving the design, organizing the code, and making sure the app worked reliably in the browser. What are you proud of? I am most proud of turning a simple trivia idea into a complete interactive game. I improved the UI, added working features, and created an experience that feels more like a real trivia night rather than just a webpage with questions. What should people know so they can test your project? To test the project, start the game and answer the trivia questions. Try to get the highest score possible! The game is designed to be easy to use, so anyone can jump in and play without needing instructions.", "repo": "https://github.com/vatsamalakar/Trivia-Night-Showdown/tree/master", "demo": "https://trivia-night-showdown.vercel.app/"}]...
|
[{"post_id": 32746, "ts": "202 [{"post_id": 32746, "ts": "2026-07-22T02:54:13Z", "hours": 0.3389, "text": "One of the biggest improvements I made during this development phase was fixing numerous bugs that affected the overall experience. I carefully went through the application, identified issues that caused unexpected behavior, and resolved them to make everything work more reliably. These fixes helped eliminate glitches, improved stability, and made the application feel much more polished from the user’s perspective.In addition to bug fixes, I spent a significant amount of time refining the user interface and overall responsiveness of the website. I improved transitions, interactions, and navigation so that every feature feels smoother and more natural to use. Buttons, menus, and interactive elements now respond more consistently, creating a cleaner and more enjoyable experience for anyone exploring the project.I also focused on optimizing performance behind the scenes. By cleaning up unnecessary code, improving the structure of the application, and making small optimizations throughout the project, pages load faster and interactions feel more fluid. These changes may not always be immediately visible, but they make a noticeable difference in how the website performs during everyday use.Of course… fixing bugs wasn’t exactly a “find one problem and you’re done” kind of task. Every time I solved one issue, another tiny one seemed to appear somewhere else (the classic developer experience 😅). It took plenty of testing, debugging, and experimenting to track everything down, but each fix made the project stronger and more reliable.Overall, this update transformed the website from a functional prototype into a far more polished, stable, and user-friendly experience. The application is now easier to interact with, feels significantly smoother, and provides a much more enjoyable experience for users while also giving me a stronger foundation for adding even more features in future updates."}, {"post_id": 32536, "ts": "2026-07-21T19:36:40Z", "hours": 1.5686, "text": "The application has evolved into a polished, fully interactive trivia experience that runs seamlessly in any modern web browser without requiring a backend server. Players can answer multiple-choice questions, receive instant feedback on whether their answers are correct or incorrect, and watch their score update in real time as they progress through the game. At the end of each session, the application displays the player’s final score and provides the option to restart the quiz for another playthrough. The interface is designed to be clean, responsive, and intuitive, ensuring a smooth experience across desktop and mobile devices. Beyond the core gameplay, the project has been structured with maintainability and performance in mind. The codebase is organized into separate HTML, CSS, and JavaScript files, making it easy to expand with additional questions, categories, animations, sound effects, or new game modes in the future. As a lightweight static website, the application loads quickly, requires minimal resources, and can be opened locally in any browser for development and testing. It is also fully prepared for deployment to platforms such as Vercel, allowing it to be hosted online with fast load times, excellent accessibility, and no server-side configuration required. This architecture makes the project simple to maintain, easy to share, and scalable for future feature enhancements while providing an engaging and enjoyable trivia experience for users."}]...
|
Title: TRIVA Night Game by @vatsamalakar | Stardan Title: TRIVA Night Game by @vatsamalakar | Stardance
Devlogs:
The application has evolved into a polished, fully interactive trivia experience that runs seamlessly in any modern web browser without requiring a backend server. Players can answer multiple-choice questions, receive instant feedback on whether their answers are correct or incorrect, and watch their score update in real time as they progress through the game. At the end of each session, the application displays the player’s final score and provides the option to restart the quiz for another playthrough. The interface is designed to be clean, responsive, and intuitive, ensuring a smooth experience across desktop and mobile devices. Beyond the core gameplay, the project has been structured with maintainability and performance in mind. The codebase is organized into separate HTML, CSS, and JavaScript files, making it easy to expand with additional questions, categories, animations, sound effects, or new game modes in the future. As a lightweight static website, the application loads quickly, requires minimal resources, and can be opened locally in any browser for development and testing. It is also fully prepared for deployment to platforms such as Vercel, allowing it to be hosted online with fast load times, excellent accessibility, and no server-side configuration required. This architecture makes the project simple to maintain, easy to share, and scalable for future feature enhancements while providing an engaging and enjoyable trivia experience for users.
One of the biggest improvements I made during this development phase was fixing numerous bugs that affected the overall experience. I carefully went through the application, identified issues that caused unexpected behavior, and resolved them to make everything work more reliably. These fixes helped eliminate glitches, improved stability, and made the application feel much more polished from the user’s perspective.In addition to bug fixes, I spent a significant amount of time refining the user interface and overall responsiveness of the website. I improved transitions, interactions, and navigation so that every feature feels smoother and more natural to use. Buttons, menus, and interactive elements now respond more consistently, creating a cleaner and more enjoyable experience for anyone exploring the project.I also focused on optimizing performance behind the scenes. By cleaning up unnecessary code, improving the structure of the application, and making small optimizations throughout the project, pages load faster and interactions feel more fluid. These changes may not always be immediately visible, but they make a noticeable difference in how the website performs during everyday use.Of course… fixing bugs wasn’t exactly a “find one problem and you’re done” kind of task. Every time I solved one issue, another tiny one seemed to appear somewhere else (the classic developer experience 😅). It took plenty of testing, debugging, and experimenting to track everything down, but each fix made the project stronger and more reliable.Overall, this update transformed the website from a functional prototype into a far more polished, stable, and user-friendly experience. The application is now easier to interact with, feels significantly smoother, and provides a much more enjoyable experience for users while also giving me a stronger foundation for adding even more features in future updates.
Ships:
I created TRIVA Night, an interactive trivia game designed to make answering questions feel like a fun game show experience. Players can test their knowledge across different categories, answer questions, track their score, and compete against themselves to get the highest score possible. The app focuses on creating an engaging experience with a clean interface, smooth interactions, and an enjoyable way to learn new facts. What was challenging? One of the biggest challenges was making the game logic work correctly, including checking answers, updating scores, moving between questions, and making sure the user experience felt smooth. I also spent time improving the design, organizing the code, and making sure the app worked reliably in the browser. What are you proud of? I am most proud of turning a simple trivia idea into a complete interactive game. I improved the UI, added working features, and created an experience that feels more like a real trivia night rather than just a webpage with questions. What should people know so they can test your project? To test the project, start the game and answer the trivia questions. Try to get the highest score possible! The game is designed to be easy to use, so anyone can jump in and play without needing instructions....
|
1792882094.0997968
|
1793746094.0997968
|
|
18697
|
My first slack bot! by @hardeek | Stardance
|
hardeek
|
1
|
1.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-21T02:55:07Z", "hours": 1.0, "multiplier": 1.02, "payout": 1, "blessing": "neutral", "text": "I made a slack bot, that only works in the hackclub workspace. I had problems with the code as I was unfamiliar with it and didn’t know that the code to make a new app needed to go before all of the command declarations. To use the bot type in deeks-bot and then either -joke, -ping, or -catfact", "repo": "https://github.com/hardeek-sharma/hackclubbot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354"}]...
|
[{"post_id": 11409, "ts": "202 [{"post_id": 11409, "ts": "2026-06-18T17:52:43Z", "hours": 0.7225, "text": "My first slack bot!"}]...
|
Title: My first slack bot! by @hardeek | Stardance Title: My first slack bot! by @hardeek | Stardance
Devlogs:
My first slack bot!
Ships:
I made a slack bot, that only works in the hackclub workspace. I had problems with the code as I was unfamiliar with it and didn’t know that the code to make a new app needed to go before all of the command declarations. To use the bot type in deeks-bot and then either -joke, -ping, or -catfact...
|
1793249686.1437876
|
1793336086.1437876
|
|
18703
|
STARPHEUS by @ANNAHAKI | Stardance
|
ANNAHAKI
|
1
|
72.1
|
175
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-28T07:15:25Z", "hours": 71.0, "multiplier": 5.0, "payout": 175, "blessing": "neutral", "text": "I made a robot inpired by orpheus, STARPHEUS Its a robot eith emotions, u can controll it with a logutech control, and it reacts to the enviroment.", "repo": "https://github.com/annaastrs-svg/Orpheus-Bot-", "demo": ""}]...
|
[{"post_id": 17562, "ts": "202 [{"post_id": 17562, "ts": "2026-06-28T12:09:26Z", "hours": 1.1003, "text": "Im on a trip rn but i made some changes in the code, I added some photos to the journal and did a better readme :B"}, {"post_id": 17405, "ts": "2026-06-28T05:24:27Z", "hours": 4.4239, "text": "STARPHEUS IS FINISHED! last details. i just paint all at 3 am, trying to make it look cool :B"}, {"post_id": 16714, "ts": "2026-06-27T04:43:57Z", "hours": 5.3672, "text": "I made this beautull page ! its about the project. now i just need to finish the project… is made with HTML, css and javaSS :B a bit of gemini help jsjsjsj"}, {"post_id": 16091, "ts": "2026-06-26T04:54:38Z", "hours": 10.6083, "text": "Today I finished the CAD jejeje , I realized that the problem with my motors not working was the amps, not the voltage. I spent like an hour trying to see if it was a coding issue, and it turns out I was using a 9V alkaline battery, and it doesn’t provide enough amps :C. I made some battery holders that didn’t work that well. I’m going to work on the journal, the readme, and the website today (if I survive), and I couldn’t make a battery holder that actually works… I don’t recommend wasting an hour of your life doing it."}, {"post_id": 15455, "ts": "2026-06-25T03:53:16Z", "hours": 6.4631, "text": "mental breakdance with KiCAD"}, {"post_id": 14876, "ts": "2026-06-24T04:44:22Z", "hours": 6.0456, "text": "this is how is it going hehehe, not finished yet, i added another oled for the eyes, im having some trubbles with batterys and code but its going to be functional"}, {"post_id": 14140, "ts": "2026-06-23T03:52:32Z", "hours": 4.2636, "text": "Since the code already worked, I was building the robot physically, out of cardboard because I don’t have money for 3D printing. I spent so much time on mistakes and I might have to redo it. I measured each component and its dead space (the space for the wires and stuff). I think it looks really weird, but I know it will work because I spent way too much time thinking about making it functional. So far it measures about 25 cm and is a little bigger than my computer (huge btw), but I’m happy that soon it will have life and a body."}, {"post_id": 13932, "ts": "2026-06-22T21:08:08Z", "hours": 4.345, "text": "I finally managed to get the servo motor to work along with the OLEDs, the DRV, the two motors, and the IR, FINALLY. I’ve implemented all the components except for the ESP32 camera, which I spent 5 hours of my life on or more. I’m thinking of adding a USB controller and controlling it like I’m playing Xbox. There was a problem in the code, mostly with the servo libraries. I also added 3 resistors in series and in a ladder for the ultrasonic sensor. Right now I’m still struggling with the voltage spikes from the servo motor, even though I already put in a 470uF capacitor. … btw look at the disaster"}, {"post_id": 13730, "ts": "2026-06-22T14:40:14Z", "hours": 0.9722, "text": "I’ve been having problems with the code, the I2C either starts on the OLEDs or tries to start with the servo, but they don’t work together. It’s a problem because I still need to implement the motors, the H-bridge, the ultrasonic sensor, the camera, and another buck converter. and i habe 29 hour working on this … :C"}, {"post_id": 13504, "ts": "2026-06-22T03:04:51Z", "hours": 5.9153, "text": "I’m worried about the fact that I worked 5 hours and a bit on Sunday, the camera isn’t working right now, the OLED and the IR work but when I implement the servomotor it doesn’t work, the DRV8833 doesn’t turn on, the motors don’t respond either… I cried for half an hour so the time-lapse is probably inflated I guess… umm I don’t know if I should keep trying to implement the camera or dismiss it, tomorrow I’ll see what happened because the components work but there’s something in the code, I also measured each and every one of the component voltages."}, {"post_id": 12938, "ts": "2026-06-21T05:35:12Z", "hours": 3.0867, "text": "I did a excel with all wires , a sketch , and iv been struggling so much with the esp32 cam and the estp s3 , idk if is the tx interferring with the code :C"}, {"post_id": 12305, "ts": "2026-06-20T02:32:35Z", "hours": 2.3925, "text": "this is today rat nest AND THE CAM IS DETECTING MY FACE WITH CORDENATES, it was really dificult cus my cam is not esp oficial, is a clone… so all code is functional with the esp 32 version 3.0.7 , an old version , but its functional yeyyyy , the power distribution is with the protoboard, a lil unecessary big"}, {"post_id": 11057, "ts": "2026-06-18T02:53:04Z", "hours": 1.5494, "text": "I noticed that the servos weren’t working and I bought capacitors, I blew up 2 :,c but now it works. Today was mostly soldering everything, ordering materials (resistors for the ultrasonic and 4 DC motors because the CC ones don’t work, and OLEDs because mine is broken). I also studied how I’ll use the Camesp32 because it uses the ESP32 3.0.7 library and the OLEDs use others, so I had to struggle a bit with the configurations."}, {"post_id": 10252, "ts": "2026-06-16T21:48:01Z", "hours": 1.6722, "text": "MY BABY ORPHEUS BOT NOW HAVE EMOTIONS ! i use a IR to orpheus know when u are petting him, he have 4 emotios rn (sleepy when u dont pet him 7 sec ) (idle when u pet him 1 sec to say hi) (love when u pet him more than 1 sec ) (engry when u pet him to much) the other pic is the serial monitor is in spanish lol but it says the emotions"}, {"post_id": 10141, "ts": "2026-06-16T19:01:23Z", "hours": 2.1303, "text": "TE CAMARA IS FUNCTIONAL !! now the eyes of orpheus can see, ill start with the face tracking. Arduino have a code for esp32 cam , the only thing u have to do is put ur info , change some stuff acording to you and make it part of ur project :B"}, {"post_id": 9654, "ts": "2026-06-16T02:00:12Z", "hours": 3.4231, "text": "I have to buy capacitors and resistors because Orpheus’s neck has voltage spikes… the eyes of Orpheus are already working, the infrared for detection, and soon I’ll implement the camera for computer vision"}, {"post_id": 9057, "ts": "2026-06-15T03:44:07Z", "hours": 4.1125, "text": "i have mi pitch nowww abd the cuello the neck or idk how to say it in english of my orheus bot jejejje the espcam is getting here tmrw soo it will detect ur face and like move with u , it have expresions and u wan pet it ! the buck converter is functional ! also i changed cus i was going to use an orpheus pico w from stasis but it isnt functional and i spend 1 hour or 2 trying to make it but ill use a esp32 wroom 1 this is the scratch of my orpheus bot kinda wall-e."}, {"post_id": 8863, "ts": "2026-06-14T19:11:44Z", "hours": 0.8333, "text": "i did the face of my orpheus and im making a diagram of the conections. im going to buy esp32 CAM , buck converters , a battery 7.4 V , and a driver look how cute is going to be orpheus face , ill add the HC .sro4 and the IR"}, {"post_id": 8837, "ts": "2026-06-14T18:12:46Z", "hours": 2.9553, "text": "today i decided to start building an orpheus bot jejeje, i did the bom and the stuff is getting to my house in days so i dont need the grant. I started the how im going to do it fusion, bom, cad, pcb and construction etc etc …"}]...
|
Title: STARPHEUS by @ANNAHAKI | Stardance
Devlogs Title: STARPHEUS by @ANNAHAKI | Stardance
Devlogs:
today i decided to start building an orpheus bot jejeje, i did the bom and the stuff is getting to my house in days so i dont need the grant. I started the how im going to do it fusion, bom, cad, pcb and construction etc etc …
i did the face of my orpheus and im making a diagram of the conections. im going to buy esp32 CAM , buck converters , a battery 7.4 V , and a driver look how cute is going to be orpheus face , ill add the HC .sro4 and the IR
i have mi pitch nowww abd the cuello the neck or idk how to say it in english of my orheus bot jejejje the espcam is getting here tmrw soo it will detect ur face and like move with u , it have expresions and u wan pet it ! the buck converter is functional ! also i changed cus i was going to use an orpheus pico w from stasis but it isnt functional and i spend 1 hour or 2 trying to make it but ill use a esp32 wroom 1 this is the scratch of my orpheus bot kinda wall-e.
I have to buy capacitors and resistors because Orpheus’s neck has voltage spikes… the eyes of Orpheus are already working, the infrared for detection, and soon I’ll implement the camera for computer vision
TE CAMARA IS FUNCTIONAL !! now the eyes of orpheus can see, ill start with the face tracking. Arduino have a code for esp32 cam , the only thing u have to do is put ur info , change some stuff acording to you and make it part of ur project :B
MY BABY ORPHEUS BOT NOW HAVE EMOTIONS ! i use a IR to orpheus know when u are petting him, he have 4 emotios rn (sleepy when u dont pet him 7 sec ) (idle when u pet him 1 sec to say hi) (love when u pet him more than 1 sec ) (engry when u pet him to much) the other pic is the serial monitor is in spanish lol but it says the emotions
I noticed that the servos weren’t working and I bought capacitors, I blew up 2 :,c but now it works. Today was mostly soldering everything, ordering materials (resistors for the ultrasonic and 4 DC motors because the CC ones don’t work, and OLEDs because mine is broken). I also studied how I’ll use the Camesp32 because it uses the ESP32 3.0.7 library and the OLEDs use others, so I had to struggle a bit with the configurations.
this is today rat nest AND THE CAM IS DETECTING MY FACE WITH CORDENATES, it was really dificult cus my cam is not esp oficial, is a clone… so all code is functional with the esp 32 version 3.0.7 , an old version , but its functional yeyyyy , the power distribution is with the protoboard, a lil unecessary big
I did a excel with all wires , a sketch , and iv been struggling so much with the esp32 cam and the estp s3 , idk if is the tx interferring with the code :C
I’m worried about the fact that I worked 5 hours and a bit on Sunday, the camera isn’t working right now, the OLED and the IR work but when I implement the servomotor it doesn’t work, the DRV8833 doesn’t turn on, the motors don’t respond either… I cried for half an hour so the time-lapse is probably inflated I guess… umm I don’t know if I should keep trying to implement the camera or dismiss it, tomorrow I’ll see what happened because the components work but there’s something in the code, I also measured each and every one of the component voltages.
I’ve been having problems with the code, the I2C either starts on the OLEDs or tries to start with the servo, but they don’t work together. It’s a problem because I still need to implement the motors, the H-bridge, the ultrasonic sensor, the camera, and another buck converter. and i habe 29 hour working on this … :C
I finally managed to get the servo motor to work along with the OLEDs, the DRV, the two motors, and the IR, FINALLY. I’ve implemented all the components except for the ESP32 camera, which I spent 5 hours of my life on or more. I’m thinking of adding a USB controller and controlling it like I’m playing Xbox. There was a problem in the code, mostly with the servo libraries. I also added 3 resistors in series and in a ladder for the ultrasonic sensor. Right now I’m still struggling with the voltage spikes from the servo motor, even though I already put in a 470uF capacitor. … btw look at the disaster
Since the code already worked, I was building the robot physically, out of cardboard because I don’t have money for 3D printing. I spent so much time on mistakes and I might have to redo it. I measured each component and its dead space (the space for the wires and stuff). I think it looks really weird, but I know it will work because I spent way too much time thinking about making it functional. So far it measures about 25 cm and is a little bigger than my computer (huge btw), but I’m happy that soon it will have life and a body.
this is how is it going hehehe, not finished yet, i added another oled for the eyes, im having some trubbles with batterys and code but its going to be functional
mental breakdance with KiCAD
Today I finished the CAD jejeje , I realized that the problem with my motors not working was the amps, not the voltage. I spent like an hour trying to see if it was a coding issue, and it turns out I was using a 9V alkaline battery, and it doesn’t provide enough amps :C. I made some battery holders that didn’t work that well. I’m going to work on the journal, the readme, and the website today (if I survive), and I couldn’t make a battery holder that actually works… I don’t recommend wasting an hour of your life doing it.
I made this beautull page ! its about the project. now i just need to finish the project… is made with HTML, css and javaSS :B a bit of gemini help jsjsjsj
STARPHEUS IS FINISHED! last details. i just paint all at 3 am, trying to make it look cool :B
Im on a trip rn but i made some changes in the code, I added some photos to the journal and did a better readme :B
Ships:
I made a robot inpired by orpheus, STARPHEUS Its a robot eith emotions, u can controll it with a logutech control, and it reacts to the enviroment....
|
1793278490.272096
|
1793364890.272096
|
|
18709
|
Easy Pad by @coolRitvik | Stardance
|
coolRitvik
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-20T00:25:15Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a macropad, called the easypad which has 3*4 keyboard matrix, a rotary encoder, and an oled screen. I made it to function as a secondary little mini keybaord that can help make your life easier (and look a little cool on your desk as well). The hardest parts of making this where schematic & PCB design since it was my first time, along with the firmware since the code and the dev pages were very confusing. The case design was a little easier since I have experience with CAD. Anyways, this is the easypad a little keybaord that will hopefully help you do stuff!", "repo": "https://github.com/A-Ritvik/easypad", "demo": ""}]...
|
[{"post_id": 12245, "ts": "202 [{"post_id": 12245, "ts": "2026-06-20T00:18:49Z", "hours": 0.0, "text": "Final Devlog on Designing the EasyPad ——————————————————— I have now finalized all my firmware, cad, and pcb design which you can find (along with a README) on the github at: https://github.com/A-Ritvik/easypad . I also had to spend some time debugging the qmk firmware because I didn’t know the syntax of the how you tell it which pin is connected where (you’re supposed to use GPX)."}, {"post_id": 12201, "ts": "2026-06-19T22:18:47Z", "hours": 1.0, "text": "Finished Case Design with minor tweaks, Added 3d Models & Made a full Easypad CAD –––––––––––––––– —————— —————————————— The case design is now finished with a usb cutout on the side, and I added the pcb (along with all the other components) onto the cad so there is now a full cad of the easypad. I also attached the 3d models to the footprints in kicad to get a full render of the pcb with all the components. I also took a while to work on the code for the easypad, for which I used qmk firmware. I currently have it set in the code for wasd, 1, 2, 3, escape, enter, put the pc in sleep, power, and shut it down. Once I have it built I also want to try and get a button that launches straight into steam big picture mode. The encoder is set to control volume, and the OLED displays the status of cap, numlock, and the current layout. After building it, I also want to change this to do something cooler but this code was pretty hard to understand for me so I’m going to keep this code for now. As for the easypad, once I’ve setup a github I think this should be ready to ship!"}, {"post_id": 10932, "ts": "2026-06-17T22:18:47Z", "hours": 1.0, "text": "Updated Case Design, Updated PCB, & A Start on the Firmware I added some decals to the PCB (which was more annoying than I thought it would be), cleaned up some of the wiring by utilizing vias, and I shifted the microcontroller closer to the edge of the PCB so the USB port is easier to access. As for the case, I added the proper mounting holes (and have decided to go with a sandwich style case), along with some decals including a hack club flag and a coolish looking vent. I still need to add a cutout for the USB on the microcontroller, but after that I think the case will be basically done. Now, I have moved on to the firmware side and am using QMK to make it. Hopefully it goes well :)"}, {"post_id": 10164, "ts": "2026-06-16T19:35:37Z", "hours": 2.0, "text": "Finished the PCB Design + Starting Case Design Managing the PCB’s wires took a while and after doing it the first time I realized the white boxes around the key, or switches, weren’t supposed to overlap, but they were on my PCB. I ended up having to redo the wiring but it was definitely easier having done it once already. You can see my PCB design attached below. I also started working on the case for the macropad using Onshape and making the top plate ended up being a bit harder than I thought it would because I had to measure the distances and manually position all the holes (although for the keyboard matrix I just used a linear pattern). You can see my so far very basic and incomplete case below. I plan on adding more flair, screw holes, and a cutout for the usb, but I’ve been mostly focused on finishing the top plate so far (which I did :) )."}, {"post_id": 9298, "ts": "2026-06-15T16:49:02Z", "hours": 0.0, "text": "Finished the Schematic Design! After a bit of research on which pins connect where, I have finally finished schematic for my custom macropad featuring an OLED display, a 3*4 keyboard matrix, and one rotary encoder. I think this has no errors but if you do spot any please let me know. I am also currently working on finishing the PCB design now, given that the schematic is done."}]...
|
Title: Easy Pad by @coolRitvik | Stardance
Devlog Title: Easy Pad by @coolRitvik | Stardance
Devlogs:
Finished the Schematic Design! After a bit of research on which pins connect where, I have finally finished schematic for my custom macropad featuring an OLED display, a 3*4 keyboard matrix, and one rotary encoder. I think this has no errors but if you do spot any please let me know. I am also currently working on finishing the PCB design now, given that the schematic is done.
Finished the PCB Design + Starting Case Design Managing the PCB’s wires took a while and after doing it the first time I realized the white boxes around the key, or switches, weren’t supposed to overlap, but they were on my PCB. I ended up having to redo the wiring but it was definitely easier having done it once already. You can see my PCB design attached below. I also started working on the case for the macropad using Onshape and making the top plate ended up being a bit harder than I thought it would because I had to measure the distances and manually position all the holes (although for the keyboard matrix I just used a linear pattern). You can see my so far very basic and incomplete case below. I plan on adding more flair, screw holes, and a cutout for the usb, but I’ve been mostly focused on finishing the top plate so far (which I did :) ).
Updated Case Design, Updated PCB, & A Start on the Firmware I added some decals to the PCB (which was more annoying than I thought it would be), cleaned up some of the wiring by utilizing vias, and I shifted the microcontroller closer to the edge of the PCB so the USB port is easier to access. As for the case, I added the proper mounting holes (and have decided to go with a sandwich style case), along with some decals including a hack club flag and a coolish looking vent. I still need to add a cutout for the USB on the microcontroller, but after that I think the case will be basically done. Now, I have moved on to the firmware side and am using QMK to make it. Hopefully it goes well :)
Finished Case Design with minor tweaks, Added 3d Models & Made a full Easypad CAD –––––––––––––––– —————— —————————————— The case design is now finished with a usb cutout on the side, and I added the pcb (along with all the other components) onto the cad so there is now a full cad of the easypad. I also attached the 3d models to the footprints in kicad to get a full render of the pcb with all the components. I also took a while to work on the code for the easypad, for which I used qmk firmware. I currently have it set in the code for wasd, 1, 2, 3, escape, enter, put the pc in sleep, power, and shut it down. Once I have it built I also want to try and get a button that launches straight into steam big picture mode. The encoder is set to control volume, and the OLED displays the status of cap, numlock, and the current layout. After building it, I also want to change this to do something cooler but this code was pretty hard to understand for me so I’m going to keep this code for now. As for the easypad, once I’ve setup a github I think this should be ready to ship!
Final Devlog on Designing the EasyPad ——————————————————— I have now finalized all my firmware, cad, and pcb design which you can find (along with a README) on the github at: https://github.com/A-Ritvik/easypad . I also had to spend some time debugging the qmk firmware because I didn’t know the syntax of the how you tell it which pin is connected where (you’re supposed to use GPX).
Ships:
I made a macropad, called the easypad which has 3*4 keyboard matrix, a rotary encoder, and an oled screen. I made it to function as a secondary little mini keybaord that can help make your life easier (and look a little cool on your desk as well). The hardest parts of making this where schematic & PCB design since it was my first time, along with the firmware since the code and the dev pages were very confusing. The case design was a little easier since I have experience with CAD. Anyways, this is the easypad a little keybaord that will hopefully help you do stuff!...
|
1793220616.356342
|
1793307016.356342
|
|
18716
|
My first slack bot! by @ahtishamulhaq | Stardance
|
ahtishamulhaq
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T09:43:16Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I built StudyBuddy Bot using Node.js and Slack Bolt. It includes three slash commands: /studybuddy-ping, /studybuddy-hello, and /studybuddy-fact. The most challenging part was setting up Slack, GitHub, and connecting everything correctly. I’m proud that I got the bot working and responding to commands. To test the project, use the slash commands in Slack and the bot will respond automatically.", "repo": "https://github.com/ahtishamulhaqcontact-tech/studybuddy-bot", "demo": "https://youtu.be/NuKAw4AQVnA?si=35KP37hBK-mbsgCy"}]...
|
[{"post_id": 8885, "ts": "2026 [{"post_id": 8885, "ts": "2026-06-14T19:57:50Z", "hours": 0.5331, "text": "Today I built my first Slack bot called StudyBuddy using Node.js and Slack Bolt. I configured the Slack app, connected it to my workspace, and created slash commands including: /studybuddy-ping /studybuddy-hello /studybuddy-fact I also learned how to troubleshoot errors, manage environment variables, restart the bot, and test commands in Slack. I improved the responses of the bot and successfully got it running."}]...
|
Title: My first slack bot! by @ahtishamulhaq | Sta Title: My first slack bot! by @ahtishamulhaq | Stardance
Devlogs:
Today I built my first Slack bot called StudyBuddy using Node.js and Slack Bolt. I configured the Slack app, connected it to my workspace, and created slash commands including: /studybuddy-ping /studybuddy-hello /studybuddy-fact I also learned how to troubleshoot errors, manage environment variables, restart the bot, and test commands in Slack. I improved the responses of the bot and successfully got it running.
Ships:
I built StudyBuddy Bot using Node.js and Slack Bolt. It includes three slash commands: /studybuddy-ping, /studybuddy-hello, and /studybuddy-fact. The most challenging part was setting up Slack, GitHub, and connecting everything correctly. I’m proud that I got the bot working and responding to commands. To test the project, use the slash commands in Slack and the bot will respond automatically....
|
1793278592.1769881
|
1793364992.1769881
|
|
18723
|
CHAIR GAURDIAN by @wiiuavi | Stardance
|
wiiuavi
|
1
|
2.56
|
5
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T08:15:42Z", "hours": 2.0, "multiplier": 3.36, "payout": 5, "blessing": "neutral", "text": "Made a basic motion detection python script that will ensure you catch the culprit who steals your office chair (or just to see who is snooping around your desk :| )", "repo": "https://github.com/wiiuavi/NotSoIntelligentCCTV", "demo": "https://github.com/wiiuavi/NotSoIntelligentCCTV/releases/tag/v.0.3.0"}]...
|
[{"post_id": 17575, "ts": "202 [{"post_id": 17575, "ts": "2026-06-28T12:51:10Z", "hours": 0.5589, "text": "Added DSHOW backend support, this will allow the use of virtual cameras and very old webcams. Once verified that this worked, added MSMF backend as a fallback if DSHOW fails. cameras should open up way faster, and program will support way more cameras."}, {"post_id": 8880, "ts": "2026-06-14T19:55:13Z", "hours": 1.63, "text": "🪑added a toggle camera button to my basic motion detection software (use case was to find out who steals your chair but you can use it for other things too :| ) and fixed some bugs - program crashing when no cameras detected, clear media button ran another script (which would break when running python program as .exe, so imported the other script instead)"}]...
|
Title: CHAIR GAURDIAN by @wiiuavi | Stardance
Dev Title: CHAIR GAURDIAN by @wiiuavi | Stardance
Devlogs:
🪑added a toggle camera button to my basic motion detection software (use case was to find out who steals your chair but you can use it for other things too :| ) and fixed some bugs - program crashing when no cameras detected, clear media button ran another script (which would break when running python program as .exe, so imported the other script instead)
Added DSHOW backend support, this will allow the use of virtual cameras and very old webcams. Once verified that this worked, added MSMF backend as a fallback if DSHOW fails. cameras should open up way faster, and program will support way more cameras.
Ships:
Made a basic motion detection python script that will ensure you catch the culprit who steals your office chair (or just to see who is snooping around your desk :| )...
|
1792878723.3868132
|
1793742723.3868132
|
|
18731
|
The ISS-WebOS! by @zazzie | Stardance
|
zazzie
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-1 [{"ship_num": 1, "ts": "2026-10-29T00:40:43Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Hi, so my project doesn’t work… particularly well. And yes, the last time I worked on it was four months ago- BUT! Stardance finishes soon. And while I was never able to wrap my head around what I did wrong, or make my project look as cool as I wanted it to be, I made it. I had no coding experience going into Stardance, and now I know something. I’ve just started at uni, so my life right now is really just a whirlwind of assigned readings, lectures, job applications, laundry… (you get the gist). But eventually when everything settles down I’ll be able to come back to projects like this. So, for now, that’s all for the ISS-WebOS. And I hope that if the other young people reading this get anything whatsoever from this reeeealllly long monologue I just went on, its to try and enjoy this chapter in your life - because it’ll change all too soon. Yours, Zazzie :)", "repo": "https://github.com/zazzie-star/Web0S-project", "demo": "https://zazzie-star.github.io/Web0S-project/"}]...
|
[{"post_id": 26231, "ts": "202 [{"post_id": 26231, "ts": "2026-07-10T21:59:23Z", "hours": 1.9908, "text": "project updates: things are not going well. i went on a tangent trying to figure out how to make it so that my windows don’t go off screen, only to realise that my background image wouldn’t work as a good frame of reference (as part of its off-screen) and that i just simply don’t know what i’m doing enough to figure it out, even with explanations online there was, at one point in time, a sweet, sweet window where my first app icon worked as did the windows. that point in time died immediately. I have no clue what I’m doing wrong because I don’t know what I’m doing and I’m trying to piece it together as best as I can. for now, i’ve managed to get my icon to appear on-screen but it no longer brings up a window so…. these updates are more issues and aims so apologies for that also GOOD NEWS: yayy, the bright side! yay! the window now drags reaaaaal smooth and not every time you move your mouse mistakes are a learning opportunity?"}, {"post_id": 25022, "ts": "2026-07-08T23:03:48Z", "hours": 1.1439, "text": "project updates: added open and close buttons (that work!!) the welcome window now fits totally and appears in the same orientation always (no warping when dragging or appearing in a different layout) issues & aims: the window appears almost off the side of the screen when you load it in… dragging not SUPER smooth hoping to make more and potentially ‘apps’!"}, {"post_id": 24980, "ts": "2026-07-08T21:25:37Z", "hours": 1.3542, "text": "made the iss-os a draggable welcome window! hoping to add a typical bar/x to leave. struggling to wrap my head around js, but I think I have some idea how i’ve managed this! hoping that i can make it drag smoother, plust not go off the sides of the website or distort in shape…"}, {"post_id": 24920, "ts": "2026-07-08T19:52:05Z", "hours": 1.4161, "text": "continuing to slog on with the Web0S, added a custom background I drew & made a bottom bar with an updating time. I’ve also (mostly) fixed the sizing’s so that the background fits. still working on the window & bottom bar, hoping I can add icons soon :D"}, {"post_id": 21043, "ts": "2026-07-02T20:19:32Z", "hours": 1.3758, "text": "Just started work on my Web0S for this mission (and have unfortunately only just realised by looking at other people’s projects that it is not supposed to look like a personal website, so it’ll need a lot of tweaks!) Thus far I’ve added some basic info on the ISS in the hopes that my WebOS will be customised to this (i.e. you can have a window up showing a picture of the ISS/space facts - though I’m really hoping I can put in my own tracker and/or expedition countdowns). I’ve got very little so far, but big plans up ahead- so stay tuned! :D"}]...
|
Title: The ISS-WebOS! by @zazzie | Stardance
Devl Title: The ISS-WebOS! by @zazzie | Stardance
Devlogs:
Just started work on my Web0S for this mission (and have unfortunately only just realised by looking at other people’s projects that it is not supposed to look like a personal website, so it’ll need a lot of tweaks!) Thus far I’ve added some basic info on the ISS in the hopes that my WebOS will be customised to this (i.e. you can have a window up showing a picture of the ISS/space facts - though I’m really hoping I can put in my own tracker and/or expedition countdowns). I’ve got very little so far, but big plans up ahead- so stay tuned! :D
continuing to slog on with the Web0S, added a custom background I drew & made a bottom bar with an updating time. I’ve also (mostly) fixed the sizing’s so that the background fits. still working on the window & bottom bar, hoping I can add icons soon :D
made the iss-os a draggable welcome window! hoping to add a typical bar/x to leave. struggling to wrap my head around js, but I think I have some idea how i’ve managed this! hoping that i can make it drag smoother, plust not go off the sides of the website or distort in shape…
project updates: added open and close buttons (that work!!) the welcome window now fits totally and appears in the same orientation always (no warping when dragging or appearing in a different layout) issues & aims: the window appears almost off the side of the screen when you load it in… dragging not SUPER smooth hoping to make more and potentially ‘apps’!
project updates: things are not going well. i went on a tangent trying to figure out how to make it so that my windows don’t go off screen, only to realise that my background image wouldn’t work as a good frame of reference (as part of its off-screen) and that i just simply don’t know what i’m doing enough to figure it out, even with explanations online there was, at one point in time, a sweet, sweet window where my first app icon worked as did the windows. that point in time died immediately. I have no clue what I’m doing wrong because I don’t know what I’m doing and I’m trying to piece it together as best as I can. for now, i’ve managed to get my icon to appear on-screen but it no longer brings up a window so…. these updates are more issues and aims so apologies for that also GOOD NEWS: yayy, the bright side! yay! the window now drags reaaaaal smooth and not every time you move your mouse mistakes are a learning opportunity?
Ships:
Hi, so my project doesn’t work… particularly well. And yes, the last time I worked on it was four months ago- BUT! Stardance finishes soon. And while I was never able to wrap my head around what I did wrong, or make my project look as cool as I wanted it to be, I made it. I had no coding experience going into Stardance, and now I know something. I’ve just started at uni, so my life right now is really just a whirlwind of assigned readings, lectures, job applications, laundry… (you get the gist). But eventually when everything settles down I’ll be able to come back to projects like this. So, for now, that’s all for the ISS-WebOS. And I hope that if the other young people reading this get anything whatsoever from this reeeealllly long monologue I just went on, its to try and enjoy this chapter in your life - because it’ll change all too soon. Yours, Zazzie :)...
|
1793242081.7368274
|
1793328481.7368274
|
|
18738
|
Projectile Motion Project by @joebracken | Stardan Projectile Motion Project by @joebracken | Stardance...
|
joebracken
|
1
|
13.0
|
112
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-06T22:21:14Z", "hours": 13.0, "multiplier": 9.02, "payout": 112, "blessing": "neutral", "text": "I made a projectile motion game in Python using Pygame. The player can change the launch angle, velocity, and gravity before firing a projectile at a moving target. The game uses real projectile motion equations and shows values like distance, height, speed, and flight time while the projectile is moving. I also added a scoring system, limited shots, an aim assist option, and a game over screen. This project helped improve my Python skills and my understanding of projectile motion.", "repo": "https://github.com/madmanmr/ProjectileMotion", "demo": "https://madmanmr.github.io/madmanmr-ProjectileMotion-build-web/"}]...
|
[{"post_id": 23778, "ts": "202 [{"post_id": 23778, "ts": "2026-07-06T22:18:17Z", "hours": 0.6636, "text": "Completed game fixed a few minor issues and made code compatable with the web."}, {"post_id": 12104, "ts": "2026-06-19T19:14:15Z", "hours": 2.1161, "text": "Added a game over screen. Neatened code, fixed a few bugs. Game is now done"}, {"post_id": 11664, "ts": "2026-06-19T00:25:11Z", "hours": 0.8572, "text": "Made UI better and there are no ways around half points after using assist button"}, {"post_id": 11458, "ts": "2026-06-18T18:48:37Z", "hours": 0.9217, "text": "Improved layout of screen. Added a parabola trajectory to hit target easier but halves points earned if it is on. Game is basically done now might add some more things later."}, {"post_id": 11379, "ts": "2026-06-18T16:55:11Z", "hours": 0.92, "text": "Made a simple points system for where you hit the target. Improved the start and restart buttons, included a line to aim the projectile."}, {"post_id": 10814, "ts": "2026-06-17T19:03:04Z", "hours": 0.6883, "text": "Have now made the target go to a random position on the x axis. the projectile now has a splash effect and I have made collision for if the projectile hits target."}, {"post_id": 10787, "ts": "2026-06-17T18:16:41Z", "hours": 0.6972, "text": "Made a running loop so I can have a reset button. Fixed distance a time var displaying wrong values and they know change while inputting variables."}, {"post_id": 10342, "ts": "2026-06-17T00:49:04Z", "hours": 1.5678, "text": "Improved layout of code and fixed a few minor errors but need to get the collision timing right otherwise variables arent accurate."}, {"post_id": 10303, "ts": "2026-06-16T23:08:35Z", "hours": 2.1497, "text": "Just realised I started coding on a different file and I didnt link it so I couldnt post devlog. Heres my second one anyways. I finished the physics and made a load of buttons and text so for the inputs. I then fixed the timing so it moves close to real speed. Started making another end loops to display final vars and make a restart button. May make it into a game soon"}, {"post_id": 9570, "ts": "2026-06-15T22:53:40Z", "hours": 2.2844, "text": "I didn’t realise I had two files named very similar things so I couldnt post a devlog for while. Here’s my first one anyways. I spent all of yesterday re-learning 2d Porjectile motion and setting up equations for each variable. Then I set up the basic layout for pygame and system."}]...
|
Title: Projectile Motion Project by @joebracken | Title: Projectile Motion Project by @joebracken | Stardance
Devlogs:
I didn’t realise I had two files named very similar things so I couldnt post a devlog for while. Here’s my first one anyways. I spent all of yesterday re-learning 2d Porjectile motion and setting up equations for each variable. Then I set up the basic layout for pygame and system.
Just realised I started coding on a different file and I didnt link it so I couldnt post devlog. Heres my second one anyways. I finished the physics and made a load of buttons and text so for the inputs. I then fixed the timing so it moves close to real speed. Started making another end loops to display final vars and make a restart button. May make it into a game soon
Improved layout of code and fixed a few minor errors but need to get the collision timing right otherwise variables arent accurate.
Made a running loop so I can have a reset button. Fixed distance a time var displaying wrong values and they know change while inputting variables.
Have now made the target go to a random position on the x axis. the projectile now has a splash effect and I have made collision for if the projectile hits target.
Made a simple points system for where you hit the target. Improved the start and restart buttons, included a line to aim the projectile.
Improved layout of screen. Added a parabola trajectory to hit target easier but halves points earned if it is on. Game is basically done now might add some more things later.
Made UI better and there are no ways around half points after using assist button
Added a game over screen. Neatened code, fixed a few bugs. Game is now done
Completed game fixed a few minor issues and made code compatable with the web.
Ships:
I made a projectile motion game in Python using Pygame. The player can change the launch angle, velocity, and gravity before firing a projectile at a moving target. The game uses real projectile motion equations and shows values like distance, height, speed, and flight time while the projectile is moving. I also added a scoring system, limited shots, an aim assist option, and a game over screen. This project helped improve my Python skills and my understanding of projectile motion....
|
1793256916.2659097
|
1793343316.2659097
|
|
18768
|
My very own WebOS by @jaigopaldas6 | Stardance
|
jaigopaldas6
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T22:01:47Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a WebOS which has a native AI assistant. The primary challenge was the iframe limitations that google has, because i wanted to use google workspace apps such as google drive or google docs, these limitations prevented me from doing so, so I had to make my own customs apps to replace them. What users should know: - the AI assistant needs your own API key, you can use either a anthropic or a openAI key, if you don’t have access to one, no worries as the AI assistant is the primary focus of the OS, it’s just a cool edition. another thing is that the app does have a password setting, but you can add your own custom password, so when you first login, it will be without a password until you set one", "repo": "https://github.com/X452fire/star-dance-challenge", "demo": "https://clinquant-crostata-7d6e7b.netlify.app/"}]...
|
[{"post_id": 10253, "ts": "202 [{"post_id": 10253, "ts": "2026-06-16T21:52:22Z", "hours": 0.9097, "text": "changed up the features and added a lock screen and the top bar, removed the google OAuth and workspace app’s as they weren’t functional due to iframe limitations, made custom replacement apps for the google workspace apps."}, {"post_id": 9709, "ts": "2026-06-16T03:51:17Z", "hours": 0.5106, "text": "working on the account settings and user login with the google OAuth"}, {"post_id": 9349, "ts": "2026-06-15T18:05:09Z", "hours": 0.8639, "text": "I’m working on the OS front and backend, that runs in the users local browser, coded in html"}]...
|
Title: My very own WebOS by @jaigopaldas6 | Starda Title: My very own WebOS by @jaigopaldas6 | Stardance
Devlogs:
I’m working on the OS front and backend, that runs in the users local browser, coded in html
working on the account settings and user login with the google OAuth
changed up the features and added a lock screen and the top bar, removed the google OAuth and workspace app’s as they weren’t functional due to iframe limitations, made custom replacement apps for the google workspace apps.
Ships:
I made a WebOS which has a native AI assistant. The primary challenge was the iframe limitations that google has, because i wanted to use google workspace apps such as google drive or google docs, these limitations prevented me from doing so, so I had to make my own customs apps to replace them. What users should know: - the AI assistant needs your own API key, you can use either a anthropic or a openAI key, if you don’t have access to one, no worries as the AI assistant is the primary focus of the OS, it’s just a cool edition. another thing is that the app does have a password setting, but you can add your own custom password, so when you first login, it will be without a password until you set one...
|
1793202805.7508776
|
1793289205.7508776
|
|
18769
|
Dungeon Python game by @jshrihankumar | Stardance
|
jshrihankumar
|
1
|
11.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-20T15:19:34Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a 2D dungeon crawler game using Python and Pygame. In the game, the player moves through a randomly generated dungeon made of rooms and corridors. The goal is to reach the exit while avoiding enemies and collecting healing items. The dungeon changes every time you play, so each run feels different. The game also includes basic enemy AI, where enemies either wander around or chase the player if they get close. The hardest part of making this game was the dungeon generation system. At first, a lot of the maps I made had problems like rooms not connecting or the exit being unreachable. It took a lot of testing and fixing to make sure every dungeon is actually playable. Another challenge was the enemy AI because I didn’t use advanced pathfinding, so I had to make a simpler system that still feels like the enemies are chasing you. Balancing the game was also tricky because changing small things like damage or enemy count could make the game too easy or too hard. I’m proud that I was able to build a full working game that actually feels different every time you play. The dungeon generation works, the enemies behave in a somewhat smart way, and there are clear win and lose conditions. I also like that I kept everything in one Python file but still made it work as a complete game. To test the game, use W, A, S, D to move around. Try to avoid the red enemies because they will damage you if they touch you. Pick up green items to heal yourself. The goal is to reach the yellow/gold exit tile to win. If your health drops to zero, you lose and can restart the game.", "repo": "https://github.com/jshrihankumar-dev/dungeon", "demo": "https://dungeon-crawler-master--shrihanjadigam.replit.app/"}]...
|
[{"post_id": 8870, "ts": "2026 [{"post_id": 8870, "ts": "2026-06-14T19:26:48Z", "hours": 11.4539, "text": "Devlog: Building a Roguelike RPG in Pure Python The original goal was pretty simple: build a fully playable terminal roguelike from scratch in one Python file. No game engine, no outside frameworks, just the standard library and a lot of free time. Most of the systems worked fine on their own for a while. Combat felt decent, dungeon generation was working, and items loaded correctly. But getting everything to actually work together was way harder than expected. FOV, enemy AI, status effects, and saving all needed to talk to each other and there were a lot of moments where killing an enemy would crash the save, or a spell would try to hit something that didn’t exist anymore. That couldn’t stay broken once boss fights and multi-floor progression needed to actually function. So most of the work became just making all the pieces cooperate reliably. The Goal For the game to actually feel good: Procedural dungeons should feel different every single run Combat should have real depth, resistances, crits, status effects and all that Enemies should do more than just walk straight at you The save system should handle any game state without breaking Bosses should actually feel scary, not just be big HP sponges For the code side: Everything needs to serialize to and from JSON cleanly No weird dependency loops between the combat engine, dungeon, and player What Changed The dungeon generator now uses BSP room placement instead of just scattering rooms randomly. Enemy AI got split into 9 different behavior types including chase, patrol, ranged, ambush, support, berserk, flee, guard, and idle, instead of one giant mess of if statements. Status effects now tick on both the player and enemies every turn separately. I also completely rewrote the FOV using shadowcasting across all 8 octants which honestly took way longer than it should have. What Actually Broke Pretty much everything had issues at some point. The shadowcasting FOV has a bug on the northeast octant where some walls stay invisible when they should be visible. Still figuring that one out. Saving in the middle of combat sometimes drops enemy status effect potency on reload. The duration saves fine but potency resets to 1 for some reason. The floor 6 shop occasionally spawns completely empty if the floor RNG hits a certain seed. No idea why yet. Boss loot is guaranteed to drop but sometimes lands on a wall tile if the boss dies in a bad spot. What’s Next Fixing the FOV bug, patching the save and load status issue, and adding actual targeting for spells so they stop just auto hitting the nearest visible enemy. After that probably more boss phases and a high score system. It’s playable and honestly pretty fun. Just not finished yet."}]...
|
Title: Dungeon Python game by @jshrihankumar | Sta Title: Dungeon Python game by @jshrihankumar | Stardance
Devlogs:
Devlog: Building a Roguelike RPG in Pure Python The original goal was pretty simple: build a fully playable terminal roguelike from scratch in one Python file. No game engine, no outside frameworks, just the standard library and a lot of free time. Most of the systems worked fine on their own for a while. Combat felt decent, dungeon generation was working, and items loaded correctly. But getting everything to actually work together was way harder than expected. FOV, enemy AI, status effects, and saving all needed to talk to each other and there were a lot of moments where killing an enemy would crash the save, or a spell would try to hit something that didn’t exist anymore. That couldn’t stay broken once boss fights and multi-floor progression needed to actually function. So most of the work became just making all the pieces cooperate reliably. The Goal For the game to actually feel good: Procedural dungeons should feel different every single run Combat should have real depth, resistances, crits, status effects and all that Enemies should do more than just walk straight at you The save system should handle any game state without breaking Bosses should actually feel scary, not just be big HP sponges For the code side: Everything needs to serialize to and from JSON cleanly No weird dependency loops between the combat engine, dungeon, and player What Changed The dungeon generator now uses BSP room placement instead of just scattering rooms randomly. Enemy AI got split into 9 different behavior types including chase, patrol, ranged, ambush, support, berserk, flee, guard, and idle, instead of one giant mess of if statements. Status effects now tick on both the player and enemies every turn separately. I also completely rewrote the FOV using shadowcasting across all 8 octants which honestly took way longer than it should have. What Actually Broke Pretty much everything had issues at some point. The shadowcasting FOV has a bug on the northeast octant where some walls stay invisible when they should be visible. Still figuring that one out. Saving in the middle of combat sometimes drops enemy status effect potency on reload. The duration saves fine but potency resets to 1 for some reason. The floor 6 shop occasionally spawns completely empty if the floor RNG hits a certain seed. No idea why yet. Boss loot is guaranteed to drop but sometimes lands on a wall tile if the boss dies in a bad spot. What’s Next Fixing the FOV bug, patching the save and load status issue, and adding actual targeting for spells so they stop just auto hitting the nearest visible enemy. After that probably more boss phases and a high score system. It’s playable and honestly pretty fun. Just not finished yet.
Ships:
I made a 2D dungeon crawler game using Python and Pygame. In the game, the player moves through a randomly generated dungeon made of rooms and corridors. The goal is to reach the exit while avoiding enemies and collecting healing items. The dungeon changes every time you play, so each run feels different. The game also includes basic enemy AI, where enemies either wander around or chase the player if they get close. The hardest part of making this game was the dungeon generation system. At first, a lot of the maps I made had problems like rooms not connecting or the exit being unreachable. It took a lot of testing and fixing to make sure every dungeon is actually playable. Another challenge was the enemy AI because I didn’t use advanced pathfinding, so I had to make a simpler system that still feels like the enemies are chasing you. Balancing the game was also tricky because changing small things like damage or enemy count could make the game too easy or too hard. I’m proud that I was able to build a full working game that actually feels different every time you play. The dungeon generation works, the enemies behave in a somewhat smart way, and there are clear win and lose conditions. I also like that I kept everything in one Python file but still made it work as a complete game. To test the game, use W, A, S, D to move around. Try to avoid the red enemies because they will damage you if they touch you. Pick up green items to heal yourself. The goal is to reach the yellow/gold exit tile to win. If your health drops to zero, you lose and can restart the game....
|
1793119804.0889285
|
1793206204.0889285
|
|
18771
|
BigBrother Bot by @jachym_fukal | Stardance
|
jachym_fukal
|
1
|
25.0
|
395
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-05T11:15:10Z", "hours": 25.0, "multiplier": 15.87, "payout": 395, "blessing": "neutral", "text": "BigBrother is a 1984-themed Slack bot that turns your workspace into Oceania. It runs five modules: Surveillance tracks message activity across channels and maintains a leaderboard of who’s been most “active” (watched). Telescreen broadcasts Orwellian announcements to the workspace. Police runs sentiment analysis on messages and flags thoughtcrime — positivity is suspicious. Truth rewrites real news headlines in Party-approved doublespeak using NewsAPI + Groq. DM lets you talk directly to Big Brother, who responds in full authoritarian character via LLM. Built with Node.js + Bolt.js over Hack Club Stardance. Big Brother is always watching — especially in #1984.", "repo": "https://github.com/Projachmann/Slack_Bot", "demo": "https://hackclub.enterprise.slack.com/archives/C09F6AAP1PF"}]...
|
[{"post_id": 22745, "ts": "202 [{"post_id": 22745, "ts": "2026-07-05T10:14:25Z", "hours": 0.5808, "text": "Wrote the README and stopped the prerequisites file from lying about itself The repo had no README and prerequisites.md was three stray lines ( axios , node-cron , fs ) that didn’t actually match what package.json declared or what main.js fails fast on at boot. Rewrote prerequisites.md as a pure library install reference — packages, versions, and one npm install command — then wrote a README that follows the structure the Stardance judges actually want: one-sentence description, hero image slot, a try-it link, quick start, features, local setup, and a “how it works” section that earns its keep by naming real decisions (Socket Mode over HTTP so it runs behind any network, self-rescheduling crons with re-rolling fire times, file-locked JSON as a tiny DB instead of SQLite, sequential Groq calls to dodge rate limits). The friction was the Node version. There’s no engines field in package.json and no .nvmrc , so I didn’t want to just assert “Node 18+” without evidence. Grepping package-lock.json for \"engines\" turned up ~100 matches and the binding constraint is @slack/bolt ‘s transitive deps all declaring \"node\": \">=18\" — so that’s the honest floor, stated as such. Also swapped the watched channel ID in Code/main.js from C0BBBCER55W to C09F6AAP1PF to match the workspace in the invite link I was handed. Caught one real issue while reviewing: the “Try it” link was a channel permalink ( /archives/C09F6... ), which a non-member hits a sign-in wall on, flagged it, left it in since it’s an internal members link."}, {"post_id": 22442, "ts": "2026-07-04T22:13:14Z", "hours": 2.0994, "text": "Made Big Brother stop lying about your loyalty score The /bigbrother-loyalty command was silently corrupting its own scoreboard. Every call overwrote the user’s stored score with whatever the current calculation produced — which meant a citizen who hit 200 points last week would see their displayed rank drop to 50 after a quiet few days. The scoreboard was a ledger of “most recent” instead of “best ever”, which is the opposite of how a loyalty panopticon should work. The fix in Code/Surveillance.js was small but mattered: scoreboard() now only writes when the new score strictly beats the stored high, and stamps an achievedAt ISO timestamp on each new record. While in there, I also wired /bigbrother-scoreboard to refresh the caller’s score before displaying, so running it actually updates your entry — previously it just read stale data. The refresh is wrapped in try/catch so a transient Slack or HuggingFace failure doesn’t break the leaderboard read. That scoreboard bug was the tip of a much longer audit. The same session surfaced and fixed ~50 defects across the codebase: Surveillance.presenceCheck was returning undefined (not 0 ) on unknown presence values, producing NaN loyalty scores that then broke the sort; Telescreen.propaganda() would crash with TypeError if broadcasts.json was empty; Truth.getNews() called .map() on a potentially-missing articles array; concurrent readFile / writeFile pairs on the same JSON file were last-writer-wins. Added a 12-line per-file async mutex in Code/lock.js and wrapped every read-merge-write critical section. Also added .env validation at boot — previously a missing HF_TOKEN would surface as an undefined auth header 45 minutes into a Slack session instead of failing at startup."}, {"post_id": 22127, "ts": "2026-07-04T12:55:36Z", "hours": 1.0925, "text": "Added DM support: BigBrother can now talk back Users can now DM the bot and get a response in character as BigBrother, powered by Llama 3.3 on Groq. The bot keeps a per-user conversation history (capped at 30 messages) so it actually remembers what you said earlier in the conversation. History lives in memory, so it resets on restart, intentional, didn’t feel worth the complexity of persisting it. The interesting part was Slack’s permission system. Adding the im:history , im:read , and im:write scopes wasn’t enough on its own, you also need to separately subscribe to the message.im event under Event Subscriptions. The scopes let the bot act on DMs, the event subscription is what actually delivers them. Spent a while staring at logs with no “DM received” entries before finding that."}, {"post_id": 19901, "ts": "2026-07-01T10:23:39Z", "hours": 0.3794, "text": "Replaced every console.log in the bot with a leveled logger. The old setup was five files each printing things like “Message received!”, “Responding…”, and “Messages saved!” with no way to tell which file was talking or which run produced which line. Replaced it all with a single Code/Logger.js that adds timestamps, severity ( debug / info / warn / error ), a subsystem tag per file, and structured metadata. Errors now print a full stack trace on a second dimmed line instead of [object Object] . The visual difference is the whole point. Before, /bigbrother-loyalty produced four console.log lines with no correlation. After, it produces one timestamped line per stage — fetch, score, scoreboard write — and you can grep by subsystem or level. The interesting bug: my first Logger.js had a guard that re-checked whether meta was undefined, but I also had a fallback that promoted a non- Error second argument into meta . The two branches collided and swallowed the error stack entirely. Caught it in a two-line test snippet before staging, would have been invisible until the first real API failure. Also stopped logging the full Hugging Face response on every sentiment check. Now it only prints the per-label scores rounded to three decimals, same diagnostic value, way less noise."}, {"post_id": 19331, "ts": "2026-06-30T16:42:16Z", "hours": 3.2917, "text": "Two Minute Hate, now interactive Built a /bigbrother-hate command for the Slack bot that escalates the existing 11:00 Two Minute Hate through 3 stages (Whisper → Roar → Frenzy) based on call count, with in-character stage-transition announcements and increasing-intensity bot posts. The interesting part was the difficulty curve. Base thresholds are 5 and 15 calls, but they get multiplied each day by yesterday / 7-day-mean, clamped 0.5–2.0. So if Monday had 20 calls and Tuesday only 15, Wednesday’s threshold drops to ~62% of the base — easier to escalate on quiet days. First pass forgot to reset usageCount and stage on the daily recompute, so the bot stayed pinned at Frenzy forever after one good session. Caught it on the second test run. Wired it to the existing 11:00–11:02 cron window so calls outside it get an in-character refusal. Also added hateLevel.json to .gitignore since it’s pure runtime state. Next: DMing the bot, probably tackling that before adding more interactive bits."}, {"post_id": 15891, "ts": "2026-06-25T20:30:07Z", "hours": 1.0044, "text": "The /bigbrother-loyalty command now doubles as a live leaderboard, every call re-ranks and displays the top 10 most loyal Party members. Plugging into the existing loyalty score pipeline meant the scoreboard itself was straightforward to build, but getting the Slack Block Kit formatting right for a clean ranked list took longer than expected. Ended up iterating through a few layouts before settling on one that doesn’t look terrible."}, {"post_id": 15796, "ts": "2026-06-25T17:55:42Z", "hours": 1.48, "text": "Loyalty scoring now factors in message sentiment. I added positive/negative sentiment saving by reusing the existing 7-day message cache logic, then wired the Surveillance module to read those sentiment files the same way it already reads other JSON, no new infrastructure needed. The score itself now reflects not just how active a user is, but whether they’re saying good or bad things about the Party."}, {"post_id": 15297, "ts": "2026-06-24T20:53:30Z", "hours": 1.2728, "text": "Stopped reloading 10 channels every time someone checks their loyalty score The surveillance system was fetching all messages from all 10 channels on every single /bigbrother-loyalty call. That meant a ~ 50 second wait every time. Not great when Big Brother is supposed to feel instant and omniscient. The fix: the bot now keeps a local JSON file of all messages. When someone requests their score, it only fetches messages newer than the newest one already saved, then deletes anything older than 7 days to keep the file lean. On top of that, a cron job rewrites the whole file once a day so it never drifts out of sync. Score lookups that took a minute now finish in a couple seconds. The panopticon is finally fast enough to be scary."}, {"post_id": 15241, "ts": "2026-06-24T19:04:42Z", "hours": 1.0067, "text": "Get more than one 1984 themed headline The /bigbrother-news command could technically accept a count, but it always returned exactly one rewrite no matter what you passed. First, rewriteHeadline was looping over the headlines array but always sending headline[0] to Groq, so it was rewriting the same headline count times. Second, the function returned an array but respond() was getting that array passed directly as text, which Slack rejects with a 500 because it expects a string. Fixed both, headline[i] in the loop, .join(\"\\n\") before responding. Also added a .replace(/^[\"\"]|[\"\"]$/g, \"\") strip because the model randomly decides whether to wrap its output in quotes or not and I’d rather it just didn’t. The original code also only ever called rewriteHeadline with a single headline and had no loop at all, scaling it up to handle multiple rewrites sequentially meant restructuring the whole function."}, {"post_id": 14697, "ts": "2026-06-23T21:56:43Z", "hours": 1.3711, "text": "Added the Ministry of Truth module Fetches real news headlines via NewsAPI, pipes them through Llama 3.3 on Groq, and rewrites them as state propaganda. The results are genuinely unsettling because they’re based on actual news. A Tesla autopilot crash became “Citizen Misalignment with Vehicle Guidance Systems Results in Regrettable Isolated Incident in Texas Residential Sector” which I think is funnier than anything I could have written myself. The bug that got me: I passed the respond function itself as the text value instead of the actual result. Slack received an empty object, returned invalid_payload , and I spent way too long staring at the Groq response before noticing the slash command handler was the problem, not the API call."}, {"post_id": 13886, "ts": "2026-06-22T19:11:41Z", "hours": 1.8572, "text": "Built the Thought Police module for my 1984 themed Slack bot Added a Thought Police module that watches messages in a specific channel, scores their sentiment using HuggingFace’s RoBERTa model, and fires a Big Brother-themed response if the message is negative or positive enough. The bot replies in-thread which feels way more unsettling than posting standalone, like it’s whispering directly at you. Hit a bunch of friction getting here though. The Perspective API I originally planned to use got sunset, then the HuggingFace inference endpoint URL changed mid-build and started returning ENOTFOUND , turned out the old api-inference.huggingface.co domain was dead and needed to be swapped to router.huggingface.co . Then the response labels came back lowercase ( negative instead of Negative ) which broke the score parsing silently, the bot was running but returning undefined for everything."}, {"post_id": 13233, "ts": "2026-06-21T17:45:42Z", "hours": 1.8667, "text": "Automated propaganda broadcasts for my 1984-themed Slack bot, random timing every day, plus a daily Two Minutes Hate at 11:00. Imagine you are the head of Propaganda of an authoritarian state and you need to automate propaganda releases. Well, this is how I felt today after trying to automate this exact process. In the book 1984 propaganda is everywhere, so I replicated that. The hardest part for me was the writing of the propaganda. This is because I, as unexpected as it sounds, am not the head of Propaganda in an authoritarian state, so after around 10 minutes I asked my good friend Claude if he could write me some propaganda. Claude generated 50 different messages. If anybody has some propaganda messages I could use just DM me on Slack or write it in the comments! The next step for me is to become the head of police and automate the flagging of negative sentiments."}, {"post_id": 13042, "ts": "2026-06-21T10:16:59Z", "hours": 1.3825, "text": "Slash commands in Slack don’t convert @mentions to user IDs and I learned that the hard way. My /bigbrother-loyalty command was getting @jachym.fukal as plain text instead of <@U09L3LVPJ82> , so the regex I wrote was completely useless. The workspace also has 30k+ users so just fetching the whole user list isn’t an option either. For now the command just takes a raw user ID, which isn’t pretty but works. Next step is figuring out a cleaner way to handle this."}, {"post_id": 12760, "ts": "2026-06-20T21:25:02Z", "hours": 1.5308, "text": "Sieving through all channels would have taken hours. Now I am only using 10, which are the most used ones on the Hackclub workspace. So I wrote a code that scans these 10 channels for messages of a specific user, which I want to use for a loyalty score in the future. But the problem isn’t completely solved, because the script needs around 50 seconds to look through these 10 channels. So now I am in a bit of a pickle. I am thinking about saving the data from the last scan and then only retrieving new data from the channels."}, {"post_id": 12445, "ts": "2026-06-20T09:39:50Z", "hours": 4.9919, "text": "Added the first version of the bot’s surveillance system. My original plan was to scan every channel in the Hack Club workspace weekly and fetch message history from all channels whenever a slash command was used. After looking into it, I realized the workspace has so many channels that a single command could take hours to finish, making the approach impractical. For now, I switched to a manually curated list of channels that the bot will monitor while I investigate a more scalable solution."}]...
|
Title: BigBrother Bot by @jachym_fukal | Stardance Title: BigBrother Bot by @jachym_fukal | Stardance
Devlogs:
Added the first version of the bot’s surveillance system. My original plan was to scan every channel in the Hack Club workspace weekly and fetch message history from all channels whenever a slash command was used. After looking into it, I realized the workspace has so many channels that a single command could take hours to finish, making the approach impractical. For now, I switched to a manually curated list of channels that the bot will monitor while I investigate a more scalable solution.
Sieving through all channels would have taken hours. Now I am only using 10, which are the most used ones on the Hackclub workspace. So I wrote a code that scans these 10 channels for messages of a specific user, which I want to use for a loyalty score in the future. But the problem isn’t completely solved, because the script needs around 50 seconds to look through these 10 channels. So now I am in a bit of a pickle. I am thinking about saving the data from the last scan and then only retrieving new data from the channels.
Slash commands in Slack don’t convert @mentions to user IDs and I learned that the hard way. My /bigbrother-loyalty command was getting @jachym.fukal as plain text instead of <@U09L3LVPJ82> , so the regex I wrote was completely useless. The workspace also has 30k+ users so just fetching the whole user list isn’t an option either. For now the command just takes a raw user ID, which isn’t pretty but works. Next step is figuring out a cleaner way to handle this.
Automated propaganda broadcasts for my 1984-themed Slack bot, random timing every day, plus a daily Two Minutes Hate at 11:00. Imagine you are the head of Propaganda of an authoritarian state and you need to automate propaganda releases. Well, this is how I felt today after trying to automate this exact process. In the book 1984 propaganda is everywhere, so I replicated that. The hardest part for me was the writing of the propaganda. This is because I, as unexpected as it sounds, am not the head of Propaganda in an authoritarian state, so after around 10 minutes I asked my good friend Claude if he could write me some propaganda. Claude generated 50 different messages. If anybody has some propaganda messages I could use just DM me on Slack or write it in the comments! The next step for me is to become the head of police and automate the flagging of negative sentiments.
Built the Thought Police module for my 1984 themed Slack bot Added a Thought Police module that watches messages in a specific channel, scores their sentiment using HuggingFace’s RoBERTa model, and fires a Big Brother-themed response if the message is negative or positive enough. The bot replies in-thread which feels way more unsettling than posting standalone, like it’s whispering directly at you. Hit a bunch of friction getting here though. The Perspective API I originally planned to use got sunset, then the HuggingFace inference endpoint URL changed mid-build and started returning ENOTFOUND , turned out the old api-inference.huggingface.co domain was dead and needed to be swapped to router.huggingface.co . Then the response labels came back lowercase ( negative instead of Negative ) which broke the score parsing silently, the bot was running but returning undefined for everything.
Added the Ministry of Truth module Fetches real news headlines via NewsAPI, pipes them through Llama 3.3 on Groq, and rewrites them as state propaganda. The results are genuinely unsettling because they’re based on actual news. A Tesla autopilot crash became “Citizen Misalignment with Vehicle Guidance Systems Results in Regrettable Isolated Incident in Texas Residential Sector” which I think is funnier than anything I could have written myself. The bug that got me: I passed the respond function itself as the text value instead of the actual result. Slack received an empty object, returned invalid_payload , and I spent way too long staring at the Groq response before noticing the slash command handler was the problem, not the API call.
Get more than one 1984 themed headline The /bigbrother-news command could technically accept a count, but it always returned exactly one rewrite no matter what you passed. First, rewriteHeadline was looping over the headlines array but always sending headline[0] to Groq, so it was rewriting the same headline count times. Second, the function returned an array but respond() was getting that array passed directly as text, which Slack rejects with a 500 because it expects a string. Fixed both, headline[i] in the loop, .join("\n") before responding. Also added a .replace(/^[""]|[""]$/g, "") strip because the model randomly decides whether to wrap its output in quotes or not and I’d rather it just didn’t. The original code also only ever called rewriteHeadline with a single headline and had no loop at all, scaling it up to handle multiple rewrites sequentially meant restructuring the whole function.
Stopped reloading 10 channels every time someone checks their loyalty score The surveillance system was fetching all messages from all 10 channels on every single /bigbrother-loyalty call. That meant a ~ 50 second wait every time. Not great when Big Brother is supposed to feel instant and omniscient. The fix: the bot now keeps a local JSON file of all messages. When someone requests their score, it only fetches messages newer than the newest one already saved, then deletes anything older than 7 days to keep the file lean. On top of that, a cron job rewrites the whole file once a day so it never drifts out of sync. Score lookups that took a minute now finish in a couple seconds. The panopticon is finally fast enough to be scary.
Loyalty scoring now factors in message sentiment. I added positive/negative sentiment saving by reusing the existing 7-day message cache logic, then wired the Surveillance module to read those sentiment files the same way it already reads other JSON, no new infrastructure needed. The score itself now reflects not just how active a user is, but whether they’re saying good or bad things about the Party.
The /bigbrother-loyalty command now doubles as a live leaderboard, every call re-ranks and displays the top 10 most loyal Party members. Plugging into the existing loyalty score pipeline meant the scoreboard itself was straightforward to build, but getting the Slack Block Kit formatting right for a clean ranked list took longer than expected. Ended up iterating through a few layouts before settling on one that doesn’t look terrible.
Two Minute Hate, now interactive Built a /bigbrother-hate command for the Slack bot that escalates the existing 11:00 Two Minute Hate through 3 stages (Whisper → Roar → Frenzy) based on call count, with in-character stage-transition announcements and increasing-intensity bot posts. The interesting part was the difficulty curve. Base thresholds are 5 and 15 calls, but they get multiplied each day by yesterday / 7-day-mean, clamped 0.5–2.0. So if Monday had 20 calls and Tuesday only 15, Wednesday’s threshold drops to ~62% of the base — easier to escalate on quiet days. First pass forgot to reset usageCount and stage on the daily recompute, so the bot stayed pinned at Frenzy forever after one good session. Caught it on the second test run. Wired it to the existing 11:00–11:02 cron window so calls outside it get an in-character refusal. Also added hateLevel.json to .gitignore since it’s pure runtime state. Next: DMing the bot, probably tackling that before adding more interactive bits.
Replaced every console.log in the bot with a leveled logger. The old setup was five files each printing things like “Message received!”, “Responding…”, and “Messages saved!” with no way to tell which file was talking or which run produced which line. Replaced it all with a single Code/Logger.js that adds timestamps, severity ( debug / info / warn / error ), a subsystem tag per file, and structured metadata. Errors now print a full stack trace on a second dimmed line instead of [object Object] . The visual difference is the whole point. Before, /bigbrother-loyalty produced four console.log lines with no correlation. After, it produces one timestamped line per stage — fetch, score, scoreboard write — and you can grep by subsystem or level. The interesting bug: my first Logger.js had a guard that re-checked whether meta was undefined, but I also had a fallback that promoted a non- Error second argument into meta . The two branches collided and swallowed the error stack entirely. Caught it in a two-line test snippet before staging, would have been invisible until the first real API failure. Also stopped logging the full Hugging Face response on every sentiment check. Now it only prints the per-label scores rounded to three decimals, same diagnostic value, way less noise.
Added DM support: BigBrother can now talk back Users can now DM the bot and get a response in character as BigBrother, powered by Llama 3.3 on Groq. The bot keeps a per-user conversation history (capped at 30 messages) so it actually remembers what you said earlier in the conversation. History lives in memory, so it resets on restart, intentional, didn’t feel worth the complexity of persisting it. The interesting part was Slack’s permission system. Adding the im:history , im:read , and im:write scopes wasn’t enough on its own, you also need to separately subscribe to the message.im event under Event Subscriptions. The scopes let the bot act on DMs, the event subscription is what actually delivers them. Spent a while staring at logs with no “DM received” entries before finding that.
Made Big Brother stop lying about your loyalty score The /bigbrother-loyalty command was silently corrupting its own scoreboard. Every call overwrote the user’s stored score with whatever the current calculation produced — which meant a citizen who hit 200 points last week would see their displayed rank drop to 50 after a quiet few days. The scoreboard was a ledger of “most recent” instead of “best ever”, which is the opposite of how a loyalty panopticon should work. The fix in Code/Surveillance.js was small but mattered: scoreboard() now only writes when the new score strictly beats the stored high, and stamps an achievedAt ISO timestamp on each new record. While in there, I also wired /bigbrother-scoreboard to refresh the caller’s score before displaying, so running it actually updates your entry — previously it just read stale data. The refresh is wrapped in try/catch so a transient Slack or HuggingFace failure doesn’t break the leaderboard read. That scoreboard bug was the tip of a much longer audit. The same session surfaced and fixed ~50 defects across the codebase: Surveillance.presenceCheck was returning undefined (not 0 ) on unknown presence values, producing NaN loyalty scores that then broke the sort; Telescreen.propaganda() would crash with TypeError if broadcasts.json was empty; Truth.getNews() called .map() on a potentially-missing articles array; concurrent readFile / writeFile pairs on the same JSON file were last-writer-wins. Added a 12-line per-file async mutex in Code/lock.js and wrapped every read-merge-write critical section. Also added .env validation at boot — previously a missing HF_TOKEN would surface as an undefined auth header 45 minutes into a Slack session instead of failing at startup.
Wrote the README and stopped the prerequisites file from lying about itself The repo had no README and prerequisites.md was three stray lines ( axios , node-cron , fs ) that didn’t actually match what package.json declared or what main.js fails fast on at boot. Rewrote prerequisites.md as a pure library install reference — packages, versions, and one npm install command — then wrote a README that follows the structure the Stardance judges actually want: one-sentence description, hero image slot, a try-it link, quick start, features, local setup, and a “how it works” section that earns its keep by naming real decisions (Socket Mode over HTTP so it runs behind any network, self-rescheduling crons with re-rolling fire times, file-locked JSON as a tiny DB instead of SQLite, sequential Groq calls to dodge rate limits). The friction was the Node version. There’s no engines field in package.json and no .nvmrc , so I didn’t want to just assert “Node 18+” without evidence. Grepping package-lock.json for "engines" turned up ~100 matches and the binding constraint is @slack/bolt ‘s transitive deps all declaring "node": ">=18" — so that’s the honest floor, stated as such. Also swapped the watched channel ID in Code/main.js from C0BBBCER55W to C09F6AAP1PF to match the workspace in the invite link I was handed. Caught one real issue while reviewing: the “Try it” link was a channel permalink ( /archives/C09F6... ), which a non-member hits a sign-in wall on, flagged it, left it in since it’s an internal members link.
Ships:
BigBrother is a 1984-themed Slack bot that turns your workspace into Oceania. It runs five modules: Surveillance tracks message activity across channels and maintains a leaderboard of who’s been most “active” (watched). Telescreen broadcasts Orwellian announcements to the workspace. Police runs sentiment analysis on messages and flags thoughtcrime — positivity is suspicious. Truth rewrites real news headlines in Party-approved doublespeak using NewsAPI + Groq. DM lets you talk directly to Big Brother, who responds in full authoritarian character via LLM. Built with Node.js + Bolt.js over Hack Club Stardance. Big Brother is always watching — especially in #1984....
|
1793242555.3984308
|
1793328955.3984308
|
|
18791
|
NemOS (ARG) by @Nemo_Donut | Stardance
|
Nemo_Donut
|
1
|
23.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-19T21:59:50Z", "hours": 23.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? I made NemOS , a browser-based operating system experience built with HTML, CSS, and JavaScript. It starts as a retro desktop environment with draggable windows, a boot sequence, desktop icons, and a file explorer, but it’s also the beginning of a narrative horror project. Players explore recovered files belonging to a person known as Nemo and slowly uncover the story behind Project NULL, a mysterious subject called 13, and a corrupted archive full of missing memories. Lore incomplete right now will come back in webOS part 2! What was challenging? The most challenging part was creating a desktop environment from scratch without using any frameworks. I had to build window dragging, resizing, focus management, icon selection, application launching, file viewing, and the boot sequence myself. I also spent a lot of time making the UI behave like a real operating system while keeping everything inside a web browser. Designing a system that could later support a branching story and unlockable files was another challenge. What are you proud of? I’m proud that I turned a simple webOS project into something with its own identity and story. Instead of making only a desktop simulator, I built a frikin lore lmao this for an interactive archive where the operating system itself becomes part of the narrative. I’m also proud that most of the functionality was built from scratch, including the window system, archive explorer, boot loader, and lore-driven interface. What should people know so they can test your project? When the website loads, wait for the boot sequence to finish and respond to the access prompt. After entering the desktop, open README_FIRST.txt by double-clicking it. Reading and closing that file unlocks ARCHIVE_EXPLORER.exe , which contains the recovered archive records. The current build is Part 1 of a larger project, so it focuses on the desktop environment, archive system, and the beginning of the story rather than the complete narrative.", "repo": "https://github.com/adonutartist/NemOS", "demo": "https://nemos-rose.vercel.app/"}]...
|
[{"post_id": 12167, "ts": "202 [{"post_id": 12167, "ts": "2026-06-19T21:33:05Z", "hours": 4.4411, "text": "DEVLOG #5 Hello ya’ll I am back with good new and well a smol bad news ;-; So first good news is that i am done with part 1 of the webOS so I will ship this project today! Bad news is that the lore is very incomplete right now ;-; I plan to continue this in the webOS part 2!! Today i polished the file explorer kind of app added all necessary functions too… edited the not files too for more lore immersion… I hope it gets reviewed soon so that I can start working on part 2 of this project! Cyaaa Goooodnight!"}, {"post_id": 11608, "ts": "2026-06-18T22:02:56Z", "hours": 4.6942, "text": "DEVLOG #4 Hello everyone!! I am back again with a crazy idea!!!! So I saw so many people creating webOS its just sooo common so I added a twisterrrr to my one!! I added a lore to the webOS yep yep you heard that right a frikin lore to a WebOS!!!! So I have this oc of mine I created he has a pretty disturbing backstory and so I am gonna integrate that into the webOS not gonna spoil any story elements here so that you try it out yourself when I release it! I added bootscreen too to make it looks so daaammmm cooolio! I changed the welcome message and also added new app which is a file explorer still needs more work but yeh its in development!! I am thinking to ship it as my submission for webOS 1 with like half of the lore and then in webOS 2 imma ship it with the other half combined! Pretty excited with this idea lmao!!!! Cyaaaa! Goooodnight!!!"}, {"post_id": 10920, "ts": "2026-06-17T21:53:42Z", "hours": 4.8289, "text": "DEVLOG #3 Hello y’all! I am back again with yet another devlog and again laaaaats of progress which included first app making and some quality of life feature :3! So firstly I have completed part 4 of the WebOS 1 guide and hence tomorrow I may ship this project lmao xD I feel like I am speedrunning this xDDD I created a note taking app called txt.nemo it has a icon which u can single click to select and double click to open, it also has local storage so if u close the app or refresh browser or reopen browser then it will still save your notes. I also made a selection box for single click. I added dragging boundaries so that the windows can’t be dragged out of the screen, this also solves the bug of window being stuck if under top bar. I added resize feature to the windows too and also min height and width for each window! I am really happy with what i have till now xD I never knew I could HTML and css and javascript stuff so easily lol xD its so fun!!!! Cyaaaaa!! Gooooodnight!!"}, {"post_id": 10237, "ts": "2026-06-16T21:21:57Z", "hours": 4.2569, "text": "DEVLOG #2 Hello y’all! I am back with yet another devlog and lots of progress which included bug fixing some pixel art making etc etc! So first I downloaded VS code for windows then I cloned the NemOS repo to my computer and started working on it through VS code because this feels much easier! I can easily see preview of my webOS anytime I want and I don’t need to bash my brain over a silly lil bug of codespace lol xD I completed part 3 of the WebOS 1 guide! Now i have a draggable window, close and open buttons and both have cool pixel art I made for them on piskel :3 I am trying to figure out how to add minimize and resize features as they’re not given on the guide… hopefully I am able to implement those features tomorrow :p Now enjoy this screenshot of my webOS it features my best background art!!! Cyaaaa!! Gooooodnight!!!!"}, {"post_id": 9509, "ts": "2026-06-15T21:29:07Z", "hours": 4.4247, "text": "DEVLOG #1 Hello y’all!! I am back lol yeh I didn’t take even a single day of break after shipping DONUT PAD and started working on this new project called the NemOS :] I am following the WebOS 1 guide and I am done with the first 2 sections but sadly had to stop there because of this frikin big error which didn’t come from the code but the extension itself ;-; So basically I was using github codespace to make this and if you know about it even a lil bit then you would know that you need to preview your website after every smoool change. For this I was using the live preview extension made by microsoft but after like using it for like 3 hours it crashed or whatever you wanna call it ;-; it kept showing me some typo error and IP address when i tried to preview my website which was so dayummm annoying I searched google reddit etc etc no cure people have reported such problems before but no cure available ;-; I don’t know what to do now I really wanted to show y’all my cool art pieces I added as wallpaper and stuff but this frikin errror ruined my day xd Imma try to come back to this tomorrow with a fresh mind ;-; so cya for now ;-; Gudnight!"}]...
|
Title: NemOS (ARG) by @Nemo_Donut | Stardance
Dev Title: NemOS (ARG) by @Nemo_Donut | Stardance
Devlogs:
DEVLOG #1 Hello y’all!! I am back lol yeh I didn’t take even a single day of break after shipping DONUT PAD and started working on this new project called the NemOS :] I am following the WebOS 1 guide and I am done with the first 2 sections but sadly had to stop there because of this frikin big error which didn’t come from the code but the extension itself ;-; So basically I was using github codespace to make this and if you know about it even a lil bit then you would know that you need to preview your website after every smoool change. For this I was using the live preview extension made by microsoft but after like using it for like 3 hours it crashed or whatever you wanna call it ;-; it kept showing me some typo error and IP address when i tried to preview my website which was so dayummm annoying I searched google reddit etc etc no cure people have reported such problems before but no cure available ;-; I don’t know what to do now I really wanted to show y’all my cool art pieces I added as wallpaper and stuff but this frikin errror ruined my day xd Imma try to come back to this tomorrow with a fresh mind ;-; so cya for now ;-; Gudnight!
DEVLOG #2 Hello y’all! I am back with yet another devlog and lots of progress which included bug fixing some pixel art making etc etc! So first I downloaded VS code for windows then I cloned the NemOS repo to my computer and started working on it through VS code because this feels much easier! I can easily see preview of my webOS anytime I want and I don’t need to bash my brain over a silly lil bug of codespace lol xD I completed part 3 of the WebOS 1 guide! Now i have a draggable window, close and open buttons and both have cool pixel art I made for them on piskel :3 I am trying to figure out how to add minimize and resize features as they’re not given on the guide… hopefully I am able to implement those features tomorrow :p Now enjoy this screenshot of my webOS it features my best background art!!! Cyaaaa!! Gooooodnight!!!!
DEVLOG #3 Hello y’all! I am back again with yet another devlog and again laaaaats of progress which included first app making and some quality of life feature :3! So firstly I have completed part 4 of the WebOS 1 guide and hence tomorrow I may ship this project lmao xD I feel like I am speedrunning this xDDD I created a note taking app called txt.nemo it has a icon which u can single click to select and double click to open, it also has local storage so if u close the app or refresh browser or reopen browser then it will still save your notes. I also made a selection box for single click. I added dragging boundaries so that the windows can’t be dragged out of the screen, this also solves the bug of window being stuck if under top bar. I added resize feature to the windows too and also min height and width for each window! I am really happy with what i have till now xD I never knew I could HTML and css and javascript stuff so easily lol xD its so fun!!!! Cyaaaaa!! Gooooodnight!!
DEVLOG #4 Hello everyone!! I am back again with a crazy idea!!!! So I saw so many people creating webOS its just sooo common so I added a twisterrrr to my one!! I added a lore to the webOS yep yep you heard that right a frikin lore to a WebOS!!!! So I have this oc of mine I created he has a pretty disturbing backstory and so I am gonna integrate that into the webOS not gonna spoil any story elements here so that you try it out yourself when I release it! I added bootscreen too to make it looks so daaammmm cooolio! I changed the welcome message and also added new app which is a file explorer still needs more work but yeh its in development!! I am thinking to ship it as my submission for webOS 1 with like half of the lore and then in webOS 2 imma ship it with the other half combined! Pretty excited with this idea lmao!!!! Cyaaaa! Goooodnight!!!
DEVLOG #5 Hello ya’ll I am back with good new and well a smol bad news ;-; So first good news is that i am done with part 1 of the webOS so I will ship this project today! Bad news is that the lore is very incomplete right now ;-; I plan to continue this in the webOS part 2!! Today i polished the file explorer kind of app added all necessary functions too… edited the not files too for more lore immersion… I hope it gets reviewed soon so that I can start working on part 2 of this project! Cyaaa Goooodnight!
Ships:
What did you make? I made NemOS , a browser-based operating system experience built with HTML, CSS, and JavaScript. It starts as a retro desktop environment with draggable windows, a boot sequence, desktop icons, and a file explorer, but it’s also the beginning of a narrative horror project. Players explore recovered files belonging to a person known as Nemo and slowly uncover the story behind Project NULL, a mysterious subject called 13, and a corrupted archive full of missing memories. Lore incomplete right now will come back in webOS part 2! What was challenging? The most challenging part was creating a desktop environment from scratch without using any frameworks. I had to build window dragging, resizing, focus management, icon selection, application launching, file viewing, and the boot sequence myself. I also spent a lot of time making the UI behave like a real operating system while keeping everything inside a web browser. Designing a system that could later support a branching story and unlockable files was another challenge. What are you proud of? I’m proud that I turned a simple webOS project into something with its own identity and story. Instead of making only a desktop simulator, I built a frikin lore lmao this for an interactive archive where the operating system itself becomes part of the narrative. I’m also proud that most of the functionality was built from scratch, including the window system, archive explorer, boot loader, and lore-driven interface. What should people know so they can test your project? When the website loads, wait for the boot sequence to finish and respond to the access prompt. After entering the desktop, open README_FIRST.txt by double-clicking it. Reading and closing that file unlocks ARCHIVE_EXPLORER.exe , which contains the recovered archive records. The current build is Part 1 of a larger project, so it focuses on the desktop environment, archive system, and the beginning of the story rather than the complete narrative....
|
1793224276.4774845
|
1793310676.4774845
|
|
18799
|
LitePad by @chiron_dev8 | Stardance
|
chiron_dev8
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-14T20:15:58Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "LitePad! LitePad is a 6 key, 2x3 keypad with a rotary encoder, OLED display and an RGB LED using QMK firmware. The aim for this project is to create a simple macropad to control govee smart LED bulbs via a host PC! Features: Awesome case! 128x32 OLED Display EC11 Rotary Encoder 1 WS2812B RGB LED 6 Keys CAD Model: Uses 4 M3 Screws to hold the two parts of the case together. The PCB is placed inside the case with a cutout for every component and USB port. Designed in Autodesk Fusion in a Windows 11 VM (I use gentoo linux but I hate FreeCAD) Firmware: Currently unfinished as I am new to QMK. I will soon add features to communicate with a host PC with serial which will then control the govee lights. Currently it sits around and does nothing. What you need to make this keypad thingy: 6x Cherry MX switches 6x DSA Keycaps 4x M3 16mm bolts 6x 1N4148 Diodes 1x WS2812B LED 1x 0.91\" 128x32 OLED Display 1x EC11 Rotary Encoder 1x XIAO RP2040 1x Case (1x Bottom part, 1x Top part) Some love <3 Extras: Thank you to Hack Club for being awesome and supporting me :) (Also I need work experience…)", "repo": "https://github.com/Chiron8/LitePad", "demo": ""}]...
|
[{"post_id": 8896, "ts": "2026 [{"post_id": 8896, "ts": "2026-06-14T20:12:00Z", "hours": 0.5736, "text": "I have finished version 1 of LitePad! When I have built it, I will start working on the Govee integration!"}]...
|
Title: LitePad by @chiron_dev8 | Stardance
Devlog Title: LitePad by @chiron_dev8 | Stardance
Devlogs:
I have finished version 1 of LitePad! When I have built it, I will start working on the Govee integration!
Ships:
LitePad! LitePad is a 6 key, 2x3 keypad with a rotary encoder, OLED display and an RGB LED using QMK firmware. The aim for this project is to create a simple macropad to control govee smart LED bulbs via a host PC! Features: Awesome case! 128x32 OLED Display EC11 Rotary Encoder 1 WS2812B RGB LED 6 Keys CAD Model: Uses 4 M3 Screws to hold the two parts of the case together. The PCB is placed inside the case with a cutout for every component and USB port. Designed in Autodesk Fusion in a Windows 11 VM (I use gentoo linux but I hate FreeCAD) Firmware: Currently unfinished as I am new to QMK. I will soon add features to communicate with a host PC with serial which will then control the govee lights. Currently it sits around and does nothing. What you need to make this keypad thingy: 6x Cherry MX switches 6x DSA Keycaps 4x M3 16mm bolts 6x 1N4148 Diodes 1x WS2812B LED 1x 0.91" 128x32 OLED Display 1x EC11 Rotary Encoder 1x XIAO RP2040 1x Case (1x Bottom part, 1x Top part) Some love <3 Extras: Thank you to Hack Club for being awesome and supporting me :) (Also I need work experience…)...
|
1793292603.7663279
|
1793379003.7663279
|
|
18808
|
My very own WebOS by @rushilw07 | Stardance
|
rushilw07
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-30T01:46:04Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made my very first Web OS browser called Shrek OS. It is named and created after the movie character Shrek. Hence, the browser is Shrek themed, with a green background and specifically themed applications. Inside the OS, I have created three apps: “characters”, “notes”, and “calculator”. Each app serves its own specific purpose. What was challenging during this exciting process was the time section on the top right corner of the top window bar. Additionally, making my own apps without guidance seemed challenging at first; however, after creating a “notes” app with guidance from the guide, the personally created apps did not put up much of a challenge. I am most proud of learning new concepts in HTML and CSS, since I already had a strong understanding of JavaScript. Furthermore, I did not think I would be able to make three apps by myself and I still did. So I am very proud of that as well. ShrekOS includes three draggable apps that open into windows, with the main page opening by clicking on the top left bar which reads “Shrek OS”.", "repo": "https://github.com/rushil070/StarDance-WebOs", "demo": "https://rushil070.github.io/StarDance-WebOs/"}]...
|
[{"post_id": 18844, "ts": "202 [{"post_id": 18844, "ts": "2026-06-30T01:27:45Z", "hours": 0.3883, "text": "I finally finished my third app for ShrekOS . I added to Javascript and HTML. I used event handlers and arithmetic operators to create a simple working calculator. I also used DOM manipulation through javascript in order to update the calculator’s display. This is similar to the clock I made earlier for ShrekOS. I am going to continue fixing any bugs and change the layout/style to my liking. Other than that, ShrekOS has officially been completed ."}, {"post_id": 18452, "ts": "2026-06-29T16:48:16Z", "hours": 0.2942, "text": "I have currently been fixing bugs in ShrekOS . I changed the “Characters” app’s background to white so the background of the OS does not overlap. It looks way better now. I am going to make a similar change to my welcome page next."}, {"post_id": 17399, "ts": "2026-06-28T05:01:53Z", "hours": 3.3142, "text": "ShrekOS This is my first dev log. This is my personal OS created after the amazing Shrek. I have added two apps so far to make the desktop experience better. The top left part of the bar which reads “Shrek OS” can be clicked to open the main draggable window with two Shrek images and a description of him. The “Characters” app has specific information of different characters from the Shrek movie. The notes app has blog posts and notes for the user."}]...
|
Title: My very own WebOS by @rushilw07 | Stardance Title: My very own WebOS by @rushilw07 | Stardance
Devlogs:
ShrekOS This is my first dev log. This is my personal OS created after the amazing Shrek. I have added two apps so far to make the desktop experience better. The top left part of the bar which reads “Shrek OS” can be clicked to open the main draggable window with two Shrek images and a description of him. The “Characters” app has specific information of different characters from the Shrek movie. The notes app has blog posts and notes for the user.
I have currently been fixing bugs in ShrekOS . I changed the “Characters” app’s background to white so the background of the OS does not overlap. It looks way better now. I am going to make a similar change to my welcome page next.
I finally finished my third app for ShrekOS . I added to Javascript and HTML. I used event handlers and arithmetic operators to create a simple working calculator. I also used DOM manipulation through javascript in order to update the calculator’s display. This is similar to the clock I made earlier for ShrekOS. I am going to continue fixing any bugs and change the layout/style to my liking. Other than that, ShrekOS has officially been completed .
Ships:
I made my very first Web OS browser called Shrek OS. It is named and created after the movie character Shrek. Hence, the browser is Shrek themed, with a green background and specifically themed applications. Inside the OS, I have created three apps: “characters”, “notes”, and “calculator”. Each app serves its own specific purpose. What was challenging during this exciting process was the time section on the top right corner of the top window bar. Additionally, making my own apps without guidance seemed challenging at first; however, after creating a “notes” app with guidance from the guide, the personally created apps did not put up much of a challenge. I am most proud of learning new concepts in HTML and CSS, since I already had a strong understanding of JavaScript. Furthermore, I did not think I would be able to make three apps by myself and I still did. So I am very proud of that as well. ShrekOS includes three draggable apps that open into windows, with the main page opening by clicking on the top left bar which reads “Shrek OS”....
|
1793285634.1186845
|
1793372034.1186845
|
|
18825
|
LLM Text Compression by @Sabrina | Stardance
|
Sabrina
|
1
|
20.0
|
360
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T20:35:23Z", "hours": 20.0, "multiplier": 18.19, "payout": 360, "blessing": "neutral", "text": "I created a lossless text compression algorithm that uses an AI to guess which letter should come next! My project works best on the latin alphabet, and specifically english text! Even better with minimal punctuation! It works best with this set of characters: a-z, A-Z, 0-9, and the space Two things were challenging. First was getting even getting a model to train, I had to followed a tutorial on tensorflow, but after that google colab trained like there was no tomorrow. The second thing was making the AI deterministic and finding an optimal way to compress it. Initially, I had the ability to set seeds and then i would compress it many many many times over again with different seeds to see which one was optimal. I eventually changed the entire format and how it worked. I made it 100% deterministic and then stored the top 11 results instead of just the top result. I’m proud that in certain cases my compression beat huffman coding by a few bytes. in like 90% of the cases though I am consistently like 1-10 bytes more inflated than huffman coding. But my decoder works on all strings, but for huffman coding you need the table as well, and the optimal one changes.", "repo": "https://github.com/BoomBoomMushroom/llm-text-compression", "demo": "https://llm-text-compression.netlify.app/"}]...
|
[{"post_id": 10198, "ts": "202 [{"post_id": 10198, "ts": "2026-06-16T20:18:12Z", "hours": 0.2714, "text": "Created the readme"}, {"post_id": 10188, "ts": "2026-06-16T20:01:14Z", "hours": 2.0767, "text": "I finished the website and the API! I added a mode to stream the output of the decompression so you can watch it happen in real time. I also made a bit writer class to clean up the compress function. I was also gonan stream that but it was gonna be a little weird since i reverse all the bytes at the end and modify the head which wouldve been in the start byte. But I have deployed the website to “ https://llm-text-compression.netlify.app/ ” and I have deployed the API to nest @ “ https://aicompressapi.sabrina.hackclub.app//compress ” I shall now ship it <3 well i need a readme.md also so in like 10 mins"}, {"post_id": 9691, "ts": "2026-06-16T03:14:36Z", "hours": 5.1972, "text": "I added support for longer utf-8 characters which had me rewrite a little bit of the compression and decompression parts. It inflated the size a little bit but i’d say its manageable right now. I also started working on an API and website so its easy for people to vote. You can input hex bytes or text to compress or decompress. I also wrote a lot about how the compression and decompression algorithm works!"}, {"post_id": 9493, "ts": "2026-06-15T20:53:36Z", "hours": 1.4828, "text": "Okay I got it working!!! I huffman encoded the top 12 predicted next characters and got the size down to 57 Bytes! the huffman coding on the same string is about 56 bytes! I havent crossed the threshold of beating huffman coding but thats okay. I may experiment with arithmetic coding for the index to possibly reduce it further but im happy with this result so far"}, {"post_id": 9393, "ts": "2026-06-15T18:53:35Z", "hours": 1.37, "text": "I increased the return amount to the top 7 results because in the worse case where the correct character is at index 6, the encoded data for it would use 8 bits, which is the same as just encoding the character, and we already used the llm to generate the character i want to work on better huffman coding for the top results as currently it just encodes it by the number of 1s prefixing a 0"}, {"post_id": 9323, "ts": "2026-06-15T17:16:52Z", "hours": 0.4619, "text": "I fixed the varint4 reading and writing but as it seems right now it increases the size of the bit mask. but i think i mightve found a way to do without the bit mask. the vocab is encoded in utf-8 and so for all my characters (a-z, A-Z, 0-9, and a space), only the lowder 7 bits are used, the 8th bit is ALWAYS 0 because of this, a character will NEVER start with a 1, meaning i can see if the next bit in the compress data is a 1 and if so we read an index for the llm’s prediction!"}, {"post_id": 9081, "ts": "2026-06-15T05:35:42Z", "hours": 0.9706, "text": "I got compression and decompression w/ the top 4 predictions working!! I encoded the indexes and then just slapped them in there. i had to pad the ending of the bit stream with 0s to align it to a byte but thats fine. I had to make a bit reader class to read it back and change up my decompresser code to read a byte and keep reading until we finish reading our index, but it was quite simple. Now ive got my message being compressed to about 66 bytes, much better than the ~100 bytes from earlier with just raw prediction. For reference the input text is 110 bytes. The huffman encoding website says it compresses it down to 441 bits or ~56 bytes. Right now im working on run length encoding to compress the llm prediction bitmask down. for my example message it is 16 bytes. but since it is a bit mask there are lots of 0s and 1s in a row, so RLE should work wonders here. Hopefully i can reduce those 16 bytes donn to 6 and then i’d be tied with the huffman compression! That would be cool,,, it is a 40% reduction in bytes so not impossible but we’ll see how it goes."}, {"post_id": 9071, "ts": "2026-06-15T04:32:33Z", "hours": 3.0442, "text": "I have been working on trying to get the LLM to compress more. I tried to brute force a bunch of seeds and they only kinda worked I tried a few other leads but no cigar Now im planning on having my predict next character return the top 5 characters, check if the correct character is in there, and if so then we use entropy/huffman coding to write which one it is. the lower on the list the less example for 5 characters 11 -> 1st result 10 -> 2nd 01 -> 3rd 001 -> 4th 000 -> 5th if i return 4 characters then my tree looks like this: 0 -> 1st 10 -> 2nd 110 -> 3rd 1110 -> 4th the less probable characters have longer codes! this does have the added complexity of throwing off the bit count, but i can either just pop off bits or i can pad the current byte to 8 bits before i encode a character"}, {"post_id": 8987, "ts": "2026-06-14T23:37:23Z", "hours": 1.1539, "text": "I created utilized a wikipedia scraper via getting featured articles from a toolforge.org and then downloaded some articles using wikitext.eluni.co I then added the training support for it by reading all the wikipedia text files and loading them into an array I will now run some training on them to hopefully achieve better compression results!"}, {"post_id": 8949, "ts": "2026-06-14T21:32:40Z", "hours": 3.8536, "text": "I created a way to train a model based on text files. But more importantly i used that model to compress and decompress text. To compress text it takes the input and seed and goes letter by letter and has the ai try and predict the next letter. if it gets it correct it will mark that letter as correct and move on. if it was wrong it will mark it as needing to be remembered and then it’s memory will think it predicted it. It uses that list to make a bit mask of which letters to predict or not, and will end the file with all the letters it marked to remember. To decompress it’s pretty much the same. it’ll take a seed and set the rng to it. it will traverse the bit mask. if it reads a 1, meaning to read a remembered letter, it will read the first letter it can, add it to the output and ai memory and move on. If it reads a 0 then it will use the previous letter and states to predict the next letter. and since we have the same seeds and states the ai is deterministic so we will generate the same letter the ai though of. What do i need to do now? I need to increase it’s training data. Right now it only uses “Alice in Wonderland” by Lewis Carroll, taken from Project Gutenberg. I need to find some way to ethnically source all of the data so if you know where let me know! I’m think rn about using wikipedia, but i have to look into it first."}]...
|
Title: LLM Text Compression by @Sabrina | Stardanc Title: LLM Text Compression by @Sabrina | Stardance
Devlogs:
I created a way to train a model based on text files. But more importantly i used that model to compress and decompress text. To compress text it takes the input and seed and goes letter by letter and has the ai try and predict the next letter. if it gets it correct it will mark that letter as correct and move on. if it was wrong it will mark it as needing to be remembered and then it’s memory will think it predicted it. It uses that list to make a bit mask of which letters to predict or not, and will end the file with all the letters it marked to remember. To decompress it’s pretty much the same. it’ll take a seed and set the rng to it. it will traverse the bit mask. if it reads a 1, meaning to read a remembered letter, it will read the first letter it can, add it to the output and ai memory and move on. If it reads a 0 then it will use the previous letter and states to predict the next letter. and since we have the same seeds and states the ai is deterministic so we will generate the same letter the ai though of. What do i need to do now? I need to increase it’s training data. Right now it only uses “Alice in Wonderland” by Lewis Carroll, taken from Project Gutenberg. I need to find some way to ethnically source all of the data so if you know where let me know! I’m think rn about using wikipedia, but i have to look into it first.
I created utilized a wikipedia scraper via getting featured articles from a toolforge.org and then downloaded some articles using wikitext.eluni.co I then added the training support for it by reading all the wikipedia text files and loading them into an array I will now run some training on them to hopefully achieve better compression results!
I have been working on trying to get the LLM to compress more. I tried to brute force a bunch of seeds and they only kinda worked I tried a few other leads but no cigar Now im planning on having my predict next character return the top 5 characters, check if the correct character is in there, and if so then we use entropy/huffman coding to write which one it is. the lower on the list the less example for 5 characters 11 -> 1st result 10 -> 2nd 01 -> 3rd 001 -> 4th 000 -> 5th if i return 4 characters then my tree looks like this: 0 -> 1st 10 -> 2nd 110 -> 3rd 1110 -> 4th the less probable characters have longer codes! this does have the added complexity of throwing off the bit count, but i can either just pop off bits or i can pad the current byte to 8 bits before i encode a character
I got compression and decompression w/ the top 4 predictions working!! I encoded the indexes and then just slapped them in there. i had to pad the ending of the bit stream with 0s to align it to a byte but thats fine. I had to make a bit reader class to read it back and change up my decompresser code to read a byte and keep reading until we finish reading our index, but it was quite simple. Now ive got my message being compressed to about 66 bytes, much better than the ~100 bytes from earlier with just raw prediction. For reference the input text is 110 bytes. The huffman encoding website says it compresses it down to 441 bits or ~56 bytes. Right now im working on run length encoding to compress the llm prediction bitmask down. for my example message it is 16 bytes. but since it is a bit mask there are lots of 0s and 1s in a row, so RLE should work wonders here. Hopefully i can reduce those 16 bytes donn to 6 and then i’d be tied with the huffman compression! That would be cool,,, it is a 40% reduction in bytes so not impossible but we’ll see how it goes.
I fixed the varint4 reading and writing but as it seems right now it increases the size of the bit mask. but i think i mightve found a way to do without the bit mask. the vocab is encoded in utf-8 and so for all my characters (a-z, A-Z, 0-9, and a space), only the lowder 7 bits are used, the 8th bit is ALWAYS 0 because of this, a character will NEVER start with a 1, meaning i can see if the next bit in the compress data is a 1 and if so we read an index for the llm’s prediction!
I increased the return amount to the top 7 results because in the worse case where the correct character is at index 6, the encoded data for it would use 8 bits, which is the same as just encoding the character, and we already used the llm to generate the character i want to work on better huffman coding for the top results as currently it just encodes it by the number of 1s prefixing a 0
Okay I got it working!!! I huffman encoded the top 12 predicted next characters and got the size down to 57 Bytes! the huffman coding on the same string is about 56 bytes! I havent crossed the threshold of beating huffman coding but thats okay. I may experiment with arithmetic coding for the index to possibly reduce it further but im happy with this result so far
I added support for longer utf-8 characters which had me rewrite a little bit of the compression and decompression parts. It inflated the size a little bit but i’d say its manageable right now. I also started working on an API and website so its easy for people to vote. You can input hex bytes or text to compress or decompress. I also wrote a lot about how the compression and decompression algorithm works!
I finished the website and the API! I added a mode to stream the output of the decompression so you can watch it happen in real time. I also made a bit writer class to clean up the compress function. I was also gonan stream that but it was gonna be a little weird since i reverse all the bytes at the end and modify the head which wouldve been in the start byte. But I have deployed the website to “ https://llm-text-compression.netlify.app/ ” and I have deployed the API to nest @ “ https://aicompressapi.sabrina.hackclub.app//compress ” I shall now ship it <3 well i need a readme.md also so in like 10 mins
Created the readme
Ships:
I created a lossless text compression algorithm that uses an AI to guess which letter should come next! My project works best on the latin alphabet, and specifically english text! Even better with minimal punctuation! It works best with this set of characters: a-z, A-Z, 0-9, and the space Two things were challenging. First was getting even getting a model to train, I had to followed a tutorial on tensorflow, but after that google colab trained like there was no tomorrow. The second thing was making the AI deterministic and finding an optimal way to compress it. Initially, I had the ability to set seeds and then i would compress it many many many times over again with different seeds to see which one was optimal. I eventually changed the entire format and how it worked. I made it 100% deterministic and then stored the top 11 results instead of just the top result. I’m proud that in certain cases my compression beat huffman coding by a few bytes. in like 90% of the cases though I am consistently like 1-10 bytes more inflated than huffman coding. But my decoder works on all strings, but for huffman coding you need the table as well, and the optimal one changes....
|
1793292560.4190366
|
1793378960.4190366
|
|
18831
|
Taxicab by @aesincs | Stardance
|
aesincs
|
1
|
6.48
|
22
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T02:39:57Z", "hours": 2.0, "multiplier": 9.65, "payout": 22, "blessing": "neutral", "text": "A friend and I recently became interested the 15-puzzle. It’s simple to solve, but there’s surprising depth to solving it efficiently and quickly. Unfortunately, existing apps for the 15-puzzle are slow and filled with advertisements. Taxicab on the other hand is a 15-puzzle for speedrunners. In addition to a stopwatch and color-coded design, it uses hovering and dragging as input methods as opposed to clicking or tapping, which is significantly faster. This first ship is the base experience needed for speedrunners. Future versions will incorporate history, statistics, multiplayer, and more.", "repo": "https://github.com/aesincs/taxicab", "demo": "https://taxicab.surge.sh"}]...
|
[{"post_id": 12113, "ts": "202 [{"post_id": 12113, "ts": "2026-06-19T19:44:20Z", "hours": 0.4014, "text": "Fixed a particularly nasty bug where dragging the blank over the drag handle would send it to the first (top left) square. Even though the drag handle isn’t a tile, it was considered part of the board as it overlayed the tiles. The function responsible for identifying the tile to swap correctly returned undefined when dragging over the handle, but JavaScript’s type coercion converted this to 0 , resulting in the blank moving to the 0th (top left) position. The fix is rejecting the swap when the identification function returns undefined ."}, {"post_id": 12010, "ts": "2026-06-19T16:24:37Z", "hours": 0.4767, "text": "Replaced the pinch and scroll controls for resizing with a drag handle. It’s more conventional and precise."}, {"post_id": 11353, "ts": "2026-06-18T15:48:40Z", "hours": 1.0558, "text": "Wrote resizing between an 8-puzzle and a 35-puzzle. Resizing is wired to scrolling and pinch-to-zoom. The tiles attempt to remain consistent in size but shrink to avoid overflowing off the page. The positioning of the word mark and indicators updates correspondingly. More colors were added for increased groups at larger sizes. The solvability check now works for even and odd sizes. Records are stored per-size."}, {"post_id": 11115, "ts": "2026-06-18T05:44:27Z", "hours": 0.2831, "text": "Wrote walk support, which automatically slides tiles to support swapping from any tile rather than just those adjacent to the blank."}, {"post_id": 11028, "ts": "2026-06-18T01:49:55Z", "hours": 0.5811, "text": "Rewrote the rendering system for performance. Previously, tiles were arranged in a grid and moved synchronously. Now, tiles are positioned absolutely and updated within an animation frame loop."}, {"post_id": 10931, "ts": "2026-06-17T22:17:36Z", "hours": 0.7322, "text": "Wrote records for the shortest time and lowest amount of moves taken to solve. Records are positioned below the tiles and persist across sessions. When a new record is achieved, the corresponding indicator flashes."}, {"post_id": 10350, "ts": "2026-06-17T01:07:47Z", "hours": 0.585, "text": "Wrote a manifest for web application installation."}, {"post_id": 9926, "ts": "2026-06-16T13:18:05Z", "hours": 0.3667, "text": "Lots of polishing for the README . Also adjusted the deployment configuration for lighter payloads."}, {"post_id": 9666, "ts": "2026-06-16T02:26:30Z", "hours": 0.2586, "text": "Wired the shuffle function to the screen when solved, so it’s easy to continue. Also wrote the watch and move counter."}, {"post_id": 9610, "ts": "2026-06-16T00:29:11Z", "hours": 0.3667, "text": "Wired the shuffle function to the wordmark. Input now freezes on solve."}, {"post_id": 9587, "ts": "2026-06-15T23:38:32Z", "hours": 0.4, "text": "Wrote the swap function and wired it to the pointer. Hovering over a tile adjacent to the blank swaps it with the blank."}, {"post_id": 9237, "ts": "2026-06-15T14:45:53Z", "hours": 0.2667, "text": "Wrote the wordmark for personality. The 15-puzzle’s called “Taxicab” since: Algorithms used to solve the 15-puzzle optimally involve the Taxicab (or Manhattan) distance. The 15-puzzle was invented by Noyes Palmer Chapman, who served as the mailman for the town of Canastota in New York."}, {"post_id": 9070, "ts": "2026-06-15T04:30:50Z", "hours": 0.3, "text": "Wrote the shuffle() . It’s random and checked for solvability using inversions. The number of inversions must be even since this is a 15-puzzle as opposed to a 8-puzzle or 24-puzzle."}, {"post_id": 9040, "ts": "2026-06-15T02:51:18Z", "hours": 0.4333, "text": "Wrote the favicon.svg and colored and numbered tiles. The favicon is a taxicab symbol made up of squares and matches the tiles’ colors."}, {"post_id": 8982, "ts": "2026-06-14T23:22:13Z", "hours": 0.2667, "text": "Wrote the README , LICENSE , and an initial index.html ."}]...
|
Title: Taxicab by @aesincs | Stardance
Devlogs:
W Title: Taxicab by @aesincs | Stardance
Devlogs:
Wrote the README , LICENSE , and an initial index.html .
Wrote the favicon.svg and colored and numbered tiles. The favicon is a taxicab symbol made up of squares and matches the tiles’ colors.
Wrote the shuffle() . It’s random and checked for solvability using inversions. The number of inversions must be even since this is a 15-puzzle as opposed to a 8-puzzle or 24-puzzle.
Wrote the wordmark for personality. The 15-puzzle’s called “Taxicab” since: Algorithms used to solve the 15-puzzle optimally involve the Taxicab (or Manhattan) distance. The 15-puzzle was invented by Noyes Palmer Chapman, who served as the mailman for the town of Canastota in New York.
Wrote the swap function and wired it to the pointer. Hovering over a tile adjacent to the blank swaps it with the blank.
Wired the shuffle function to the wordmark. Input now freezes on solve.
Wired the shuffle function to the screen when solved, so it’s easy to continue. Also wrote the watch and move counter.
Lots of polishing for the README . Also adjusted the deployment configuration for lighter payloads.
Wrote a manifest for web application installation.
Wrote records for the shortest time and lowest amount of moves taken to solve. Records are positioned below the tiles and persist across sessions. When a new record is achieved, the corresponding indicator flashes.
Rewrote the rendering system for performance. Previously, tiles were arranged in a grid and moved synchronously. Now, tiles are positioned absolutely and updated within an animation frame loop.
Wrote walk support, which automatically slides tiles to support swapping from any tile rather than just those adjacent to the blank.
Wrote resizing between an 8-puzzle and a 35-puzzle. Resizing is wired to scrolling and pinch-to-zoom. The tiles attempt to remain consistent in size but shrink to avoid overflowing off the page. The positioning of the word mark and indicators updates correspondingly. More colors were added for increased groups at larger sizes. The solvability check now works for even and odd sizes. Records are stored per-size.
Replaced the pinch and scroll controls for resizing with a drag handle. It’s more conventional and precise.
Fixed a particularly nasty bug where dragging the blank over the drag handle would send it to the first (top left) square. Even though the drag handle isn’t a tile, it was considered part of the board as it overlayed the tiles. The function responsible for identifying the tile to swap correctly returned undefined when dragging over the handle, but JavaScript’s type coercion converted this to 0 , resulting in the blank moving to the 0th (top left) position. The fix is rejecting the swap when the identification function returns undefined .
Ships:
A friend and I recently became interested the 15-puzzle. It’s simple to solve, but there’s surprising depth to solving it efficiently and quickly. Unfortunately, existing apps for the 15-puzzle are slow and filled with advertisements. Taxicab on the other hand is a 15-puzzle for speedrunners. In addition to a stopwatch and color-coded design, it uses hovering and dragging as input methods as opposed to clicking or tapping, which is significantly faster. This first ship is the base experience needed for speedrunners. Future versions will incorporate history, statistics, multiplayer, and more....
|
1793288872.294385
|
1793375272.294385
|