|
30860
|
My own site! by @udesh | Stardance
|
udesh
|
1
|
4.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T13:02:57Z", "hours": 4.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "i made my own personal site , it has 3 sections , i didn’t use ai in any means and the animation of my name was most difficult and fun", "repo": "https://github.com/be-the-root/be-the-root-web", "demo": "https://be-the-root.github.io/be-the-root-web/"}]...
|
[{"post_id": 24071, "ts": "202 [{"post_id": 24071, "ts": "2026-07-07T11:55:48Z", "hours": 0.3647, "text": "finaly added some sections now my website is ready to ship"}, {"post_id": 23445, "ts": "2026-07-06T13:01:14Z", "hours": 0.4186, "text": "finaly created the repo"}, {"post_id": 23430, "ts": "2026-07-06T12:10:14Z", "hours": 1.5192, "text": "i completly changed the website and now it looks good,if you have any suggetions drop it in comt"}, {"post_id": 22683, "ts": "2026-07-05T07:34:22Z", "hours": 0.6158, "text": "added some style"}, {"post_id": 22664, "ts": "2026-07-05T06:47:35Z", "hours": 0.7467, "text": "i am making my own personal website"}]...
|
Title: My own site! by @udesh | Stardance
Devlogs Title: My own site! by @udesh | Stardance
Devlogs:
i am making my own personal website
added some style
i completly changed the website and now it looks good,if you have any suggetions drop it in comt
finaly created the repo
finaly added some sections now my website is ready to ship
Ships:
i made my own personal site , it has 3 sections , i didn’t use ai in any means and the animation of my name was most difficult and fun...
|
1793768135.0684178
|
1794632135.0684178
|
|
26008
|
My own P2P protocol by @wiiuavi | Stardance
|
wiiuavi
|
1
|
4.0
|
40
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-29T21:50:26Z", "hours": 4.0, "multiplier": 7.4, "payout": 40, "blessing": "neutral", "text": "I made a cryptographically secured peer-to-peer protocol. Behind the chatbox, the diffe hellman key exchange ensures that only you and the connected peer can understand data exchanged. Communicate with anyone in your network (for now) securely with ease. run the program twice and connect to the given IP to try it by yourself! (Dont worry, the IP shown and the one the program uses is your network’s private internal IP, not one exposed to the internet!)", "repo": "https://github.com/wiiuavi/hopefully-secure-P2P", "demo": "https://github.com/wiiuavi/hopefully-secure-P2P/releases/tag/v0.1.0"}]...
|
[{"post_id": 18650, "ts": "202 [{"post_id": 18650, "ts": "2026-06-29T20:44:35Z", "hours": 0.8411, "text": "Added a “servant”, this can act as both the client and server, allowing 2 servants to send messages back and fourth and recieve, with a simple GUI that lets you connect and talk to a given IP"}, {"post_id": 17165, "ts": "2026-06-27T21:20:19Z", "hours": 0.5511, "text": "lots of bugs fixed (client and server both listing for packets, aka deadlock) functions were encoded when they should’nt have been (and vice versa) endian across client and server were not always consistent and added a small text prompt to ensure it was actually working (not just the encryption engine)"}, {"post_id": 16919, "ts": "2026-06-27T14:11:07Z", "hours": 2.3056, "text": "Finished Encryption engine (applying a XOR mask, this way decryption is using the same function, like a “toggle”), trauncated/repeated the key where plaintext was not the same size, and finsished handshake between a client running the script and server (will make them both the same next, so both are listening and either can send the first request). All that is left after that is a GUI Image shows the word “hello”, then the word being encrypted by a random priv key, then the result after reusing the encryption function (which returns the original message here)"}, {"post_id": 15914, "ts": "2026-06-25T21:18:57Z", "hours": 0.7261, "text": "Learnt the maths behind the diffe hellman key exchange, created a working private key generator from a safe large prime, common generator number and {someone’s public key}, created a template for establishing a connection to a peer. TODO (next): add functionality to send and recieve public keys (currently am able to send encoded text)"}]...
|
Title: My own P2P protocol by @wiiuavi | Stardance Title: My own P2P protocol by @wiiuavi | Stardance
Devlogs:
Learnt the maths behind the diffe hellman key exchange, created a working private key generator from a safe large prime, common generator number and {someone’s public key}, created a template for establishing a connection to a peer. TODO (next): add functionality to send and recieve public keys (currently am able to send encoded text)
Finished Encryption engine (applying a XOR mask, this way decryption is using the same function, like a “toggle”), trauncated/repeated the key where plaintext was not the same size, and finsished handshake between a client running the script and server (will make them both the same next, so both are listening and either can send the first request). All that is left after that is a GUI Image shows the word “hello”, then the word being encrypted by a random priv key, then the result after reusing the encryption function (which returns the original message here)
lots of bugs fixed (client and server both listing for packets, aka deadlock) functions were encoded when they should’nt have been (and vice versa) endian across client and server were not always consistent and added a small text prompt to ensure it was actually working (not just the encryption engine)
Added a “servant”, this can act as both the client and server, allowing 2 servants to send messages back and fourth and recieve, with a simple GUI that lets you connect and talk to a given IP
Ships:
I made a cryptographically secured peer-to-peer protocol. Behind the chatbox, the diffe hellman key exchange ensures that only you and the connected peer can understand data exchanged. Communicate with anyone in your network (for now) securely with ease. run the program twice and connect to the given IP to try it by yourself! (Dont worry, the IP shown and the one the program uses is your network’s private internal IP, not one exposed to the internet!)...
|
1793768134.2036757
|
1794632134.2036757
|
|
20163
|
ujwalOS by @UjwalTejo | Stardance
|
UjwalTejo
|
0
|
32.76
|
0
|
[]
|
[{"post_id": 40122, "ts": "202 [{"post_id": 40122, "ts": "2026-08-03T14:54:55Z", "hours": 12.1914, "text": "VortexOS Devlog #06 I have been working on VortexOS Study Hub and added features that are really helpful while studying. A pomodoro timer which helps you stay focused while studying. Added a to-do list where the user can add tasks to do throughout the day. If they complete the task, they can click on the complete button. Then the task will reappear in the Completed Tasks box. There is also a delete button to completely delete the task added. There is also button which is the fast forward button, which makes you move the task to the next day, that means you can use it when you are not able to complete it today so you want to postpone it."}, {"post_id": 33126, "ts": "2026-07-22T19:03:40Z", "hours": 9.2289, "text": "VortexOS Devlog #05 I have been working on VortexOS for a while now and I added another app to the taskbar as you can see and it is the clock app. The clock app has two features: Timer and the Stopwatch. And both the calculator app and the clock app have a feature that when the cursor clicks somewhere else out of the app it minimized automatically and the app icon is still hovering to show the user that the app is still open. And I added a new page to VortexOS called the Study Hub which is totally dedicated for studying and nothing else. I added a link to Study Hub on top VortexOS page. And in the Study Hub page I added a link back to VortexOS and added the logo of VortexOS for the user to know about me. As you can see I added a pomodoro timer too and there will be more features like a To-Do list and Timetable and many more."}, {"post_id": 29548, "ts": "2026-07-16T15:35:59Z", "hours": 5.7753, "text": "I have been working on VortexOS and finally made a calculator app. To use the calculator app you just have to click on the app icon to open it. It has a closing button and a minimize button. The calculator app is also draggable wherever you want it to be. And you can use the numbers on your computers keyboard to type on the calculator and whenever your cursor hovers over the app icon of calculator app, the app icon elevates up and also having the box-shadow effect gives the app a high-tech glow and feel. I have to add more apps like a clock app with a stopwatch and timer feature. Background color or image choosing option which makes it similar to you choosing a wallpaper for your laptop screen."}, {"post_id": 27222, "ts": "2026-07-12T16:29:27Z", "hours": 1.685, "text": "Vortex OS Devlog #3 Added a sidebar and coded it so that a motivational quote appears whenever you change the tab or refresh the page. Made a logo for VortexOS, and when clicked on the logo, a bar pops up with the information of the creator and also the information of the project. I added box-shadowing to give the side bar and the logo a high tech look. Whenever hovered over the quote-box, the quote-box looks like it is elevating a bit and it is the same case when you hover your cursor over the logo of Vortex OS."}, {"post_id": 26721, "ts": "2026-07-11T17:55:42Z", "hours": 2.2119, "text": "I have been working on VortexOS and so far my progress is that I created a new main page to VortexOS and added suitable colors to make my project look high-tech. I added a boot-screen to make it look like the computer is processing to make the webOS work and the text on the boot-screen will have an effect that it just getting typed letter by letter to give it a cool transition. But my code had a bug in it which made my whole background go white it took me some time fix it when it finally came back to it normal form."}, {"post_id": 22299, "ts": "2026-07-04T18:06:30Z", "hours": 1.6669, "text": "I have been working on VortexOS as my first project on Stardance. I made the front page and the top bar of VortexOS v1.0."}]...
|
Title: ujwalOS by @UjwalTejo | Stardance
Devlogs: Title: ujwalOS by @UjwalTejo | Stardance
Devlogs:
I have been working on VortexOS as my first project on Stardance. I made the front page and the top bar of VortexOS v1.0.
I have been working on VortexOS and so far my progress is that I created a new main page to VortexOS and added suitable colors to make my project look high-tech. I added a boot-screen to make it look like the computer is processing to make the webOS work and the text on the boot-screen will have an effect that it just getting typed letter by letter to give it a cool transition. But my code had a bug in it which made my whole background go white it took me some time fix it when it finally came back to it normal form.
Vortex OS Devlog #3 Added a sidebar and coded it so that a motivational quote appears whenever you change the tab or refresh the page. Made a logo for VortexOS, and when clicked on the logo, a bar pops up with the information of the creator and also the information of the project. I added box-shadowing to give the side bar and the logo a high tech look. Whenever hovered over the quote-box, the quote-box looks like it is elevating a bit and it is the same case when you hover your cursor over the logo of Vortex OS.
I have been working on VortexOS and finally made a calculator app. To use the calculator app you just have to click on the app icon to open it. It has a closing button and a minimize button. The calculator app is also draggable wherever you want it to be. And you can use the numbers on your computers keyboard to type on the calculator and whenever your cursor hovers over the app icon of calculator app, the app icon elevates up and also having the box-shadow effect gives the app a high-tech glow and feel. I have to add more apps like a clock app with a stopwatch and timer feature. Background color or image choosing option which makes it similar to you choosing a wallpaper for your laptop screen.
VortexOS Devlog #05 I have been working on VortexOS for a while now and I added another app to the taskbar as you can see and it is the clock app. The clock app has two features: Timer and the Stopwatch. And both the calculator app and the clock app have a feature that when the cursor clicks somewhere else out of the app it minimized automatically and the app icon is still hovering to show the user that the app is still open. And I added a new page to VortexOS called the Study Hub which is totally dedicated for studying and nothing else. I added a link to Study Hub on top VortexOS page. And in the Study Hub page I added a link back to VortexOS and added the logo of VortexOS for the user to know about me. As you can see I added a pomodoro timer too and there will be more features like a To-Do list and Timetable and many more.
VortexOS Devlog #06 I have been working on VortexOS Study Hub and added features that are really helpful while studying. A pomodoro timer which helps you stay focused while studying. Added a to-do list where the user can add tasks to do throughout the day. If they complete the task, they can click on the complete button. Then the task will reappear in the Completed Tasks box. There is also a delete button to completely delete the task added. There is also button which is the fast forward button, which makes you move the task to the next day, that means you can use it when you are not able to complete it today so you want to postpone it....
|
1793768132.9385464
|
1794372932.9385464
|
|
50380
|
scam-buzzer by @itzanhzz | Stardance
|
itzanhzz
|
1
|
17.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-26T13:12:25Z", "hours": 17.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Scam buzzer is a Chrome extension that checks the pages you visit against a small ML model running on your own machine, then it warns you when a URL looks like a scam or phishing attempt. The whole thing here runs locally! To check this out, read the README and run it yourself!", "repo": "https://github.com/anhpham-dev/scam-detection", "demo": "https://github.com/anhpham-dev/scam-detection/releases/tag/v1.0.0"}]...
|
[{"post_id": 55006, "ts": "202 [{"post_id": 55006, "ts": "2026-08-26T13:08:50Z", "hours": 0.5994, "text": "Devlog 9 This would be my last devlog. I’ve cleaned up the codebase and write the README. shipping it now"}, {"post_id": 54850, "ts": "2026-08-26T00:59:41Z", "hours": 0.6133, "text": "Devlog 8 Ive finally done with the extension design!!! Now im just cleaning up the codebase and write README"}, {"post_id": 54477, "ts": "2026-08-25T14:28:01Z", "hours": 3.0161, "text": "Devlog 7 This project is about to be completedddd!!! im so excited and btw, after running some tests on the model in ver 4, it usually predict every websites as “phishing”. Even though the overall acurracy is about 0.95. I found this very concerning because it shouldn’t have happened. After I dig deeper, I found that “has_https” caused a lot of bias in the model (its scale was about 6 or smt) but bascially it contributes a lot toward the final prediction. Then i’ve removed it and then the phishing biased percentages reduced by a bit. I’d figured that training a new model would be better rather than going around fixing some parameters in the predictor script. In the v5, I’ve tried to add a threshold testing. Basically instead the model immediately saying phishing prob = .7 => phishing, I experimented with <.6 -> not high-risk, .6-.9 -> suspicious and >.9 -> malicious. This pretty much didn’t do nothing much cuz I traded of some accuracy for nothing and google.com was still being predicted as .99 phishing. After that, I retrained the model while removing the URL scheme from the TF-IDF input. So instead of the tf-idf seeing: https://google.com , it sees approx google.com . The idea here was to prevent the TF-IDF from learning: https:// , :// , s:// , ttps as phishing indicator. Running all those tests for about 2 hours and the results aren’t significant. I’ve decided to add a trusted domain list and then moving toward designing the extension and the local API. 💀💀💀💀"}, {"post_id": 54156, "ts": "2026-08-25T00:23:58Z", "hours": 3.1178, "text": "Devlog 6 Meaning running testing and refactoring some of the training python scripts, I’ve used FastAPI to create the api for the ML model. There was a schemas that the api expect and also predict (on /predict POST endpoint)"}, {"post_id": 53072, "ts": "2026-08-23T14:04:46Z", "hours": 0.4936, "text": "Devlog 5 Quick one here, TF-IDF and the lexical feature classifier achieve the highest accuracy here. I’ll be using that for the chrome extension."}, {"post_id": 52947, "ts": "2026-08-23T10:11:25Z", "hours": 3.6544, "text": "Devlog 4 I’ve grouped some of the domain features into 3 main groups: Identity: How long the domain is, how many subdomain labels there are, etc… it’d help us to distinguish from google.com and secure-login-account-verification.example.com Composition: digits, hyphens or special characters in the domain, as well as ratio and Shannon entropy. The entropy calculation was written from scratch rather than pulling from scipy => it kept the dependencies light. High entropy like x7Qhd6agz1 look very different from low entropy one like google Suspicion indicator: binary flags for punycode, numeric TLDs, long subdomains, and high-entropy domains. I’ve also updated the hybrid model training script to compare TF-IDF alone, TF-IDF plus some lexical features, TF-IDF with new 3 grouped domain features, and TF-IDF with both."}, {"post_id": 50355, "ts": "2026-08-19T15:09:01Z", "hours": 0.7725, "text": "Quick devlog After combining the TF-IDF and handcrafted features, the model seems to performs worse… I might need to check some scaling problem or something? The teacher says to me that my hand-crafted features are highly correlated or like they are having redundant signals…"}, {"post_id": 50199, "ts": "2026-08-19T10:27:32Z", "hours": 1.565, "text": "Devlog 3 I’m finally done with researching and implementing character TF-IDF for this classifier. I’m trying to combine 2 of the classifier method into a hybrid to see if the model still predict that google.com is phishing or not. (hopefully not)"}, {"post_id": 49951, "ts": "2026-08-18T22:58:39Z", "hours": 1.3886, "text": "Devlog 2: I’ve just doen with working on the TF-IDF model. Tho, the training time is still long (like whole 5 minutes or something for the entire pipeline). But the accuracy is great (96.95%)!!"}, {"post_id": 49515, "ts": "2026-08-18T12:03:54Z", "hours": 0.5033, "text": "Finally done with the first ml classifier. What it does: basically, it takes an url, extract characteristics from it and and predict wether it belongs to 4 of the classes. Dataset used: here Pipeline: raw csv -> keep url + type -> normalize url -> remove duplicate url (if there are any) -> stratified sampling. Next, I’m going to add character-level TF-IDF so that the model doesnt happens to predict google.com as 99.05% phishing 💀💀"}, {"post_id": 49495, "ts": "2026-08-18T11:19:17Z", "hours": 1.4431, "text": "Just writing the training script took me 1h13 of researching …. First time writing ml model 💀🔥"}]...
|
Title: scam-buzzer by @itzanhzz | Stardance
Devlo Title: scam-buzzer by @itzanhzz | Stardance
Devlogs:
Just writing the training script took me 1h13 of researching …. First time writing ml model 💀🔥
Finally done with the first ml classifier. What it does: basically, it takes an url, extract characteristics from it and and predict wether it belongs to 4 of the classes. Dataset used: here Pipeline: raw csv -> keep url + type -> normalize url -> remove duplicate url (if there are any) -> stratified sampling. Next, I’m going to add character-level TF-IDF so that the model doesnt happens to predict google.com as 99.05% phishing 💀💀
Devlog 2: I’ve just doen with working on the TF-IDF model. Tho, the training time is still long (like whole 5 minutes or something for the entire pipeline). But the accuracy is great (96.95%)!!
Devlog 3 I’m finally done with researching and implementing character TF-IDF for this classifier. I’m trying to combine 2 of the classifier method into a hybrid to see if the model still predict that google.com is phishing or not. (hopefully not)
Quick devlog After combining the TF-IDF and handcrafted features, the model seems to performs worse… I might need to check some scaling problem or something? The teacher says to me that my hand-crafted features are highly correlated or like they are having redundant signals…
Devlog 4 I’ve grouped some of the domain features into 3 main groups: Identity: How long the domain is, how many subdomain labels there are, etc… it’d help us to distinguish from google.com and secure-login-account-verification.example.com Composition: digits, hyphens or special characters in the domain, as well as ratio and Shannon entropy. The entropy calculation was written from scratch rather than pulling from scipy => it kept the dependencies light. High entropy like x7Qhd6agz1 look very different from low entropy one like google Suspicion indicator: binary flags for punycode, numeric TLDs, long subdomains, and high-entropy domains. I’ve also updated the hybrid model training script to compare TF-IDF alone, TF-IDF plus some lexical features, TF-IDF with new 3 grouped domain features, and TF-IDF with both.
Devlog 5 Quick one here, TF-IDF and the lexical feature classifier achieve the highest accuracy here. I’ll be using that for the chrome extension.
Devlog 6 Meaning running testing and refactoring some of the training python scripts, I’ve used FastAPI to create the api for the ML model. There was a schemas that the api expect and also predict (on /predict POST endpoint)
Devlog 7 This project is about to be completedddd!!! im so excited and btw, after running some tests on the model in ver 4, it usually predict every websites as “phishing”. Even though the overall acurracy is about 0.95. I found this very concerning because it shouldn’t have happened. After I dig deeper, I found that “has_https” caused a lot of bias in the model (its scale was about 6 or smt) but bascially it contributes a lot toward the final prediction. Then i’ve removed it and then the phishing biased percentages reduced by a bit. I’d figured that training a new model would be better rather than going around fixing some parameters in the predictor script. In the v5, I’ve tried to add a threshold testing. Basically instead the model immediately saying phishing prob = .7 => phishing, I experimented with <.6 -> not high-risk, .6-.9 -> suspicious and >.9 -> malicious. This pretty much didn’t do nothing much cuz I traded of some accuracy for nothing and google.com was still being predicted as .99 phishing. After that, I retrained the model while removing the URL scheme from the TF-IDF input. So instead of the tf-idf seeing: https://google.com , it sees approx google.com . The idea here was to prevent the TF-IDF from learning: https:// , :// , s:// , ttps as phishing indicator. Running all those tests for about 2 hours and the results aren’t significant. I’ve decided to add a trusted domain list and then moving toward designing the extension and the local API. 💀💀💀💀
Devlog 8 Ive finally done with the extension design!!! Now im just cleaning up the codebase and write README
Devlog 9 This would be my last devlog. I’ve cleaned up the codebase and write the README. shipping it now
Ships:
Scam buzzer is a Chrome extension that checks the pages you visit against a small ML model running on your own machine, then it warns you when a URL looks like a scam or phishing attempt. The whole thing here runs locally! To check this out, read the README and run it yourself!...
|
1793768131.7156124
|
1793854531.7156124
|
|
16179
|
Robotics RoboLens by @mira_j_maroni | Stardance
|
mira_j_maroni
|
2
|
140.27
|
26
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-07T22:22:22Z", "hours": 124.0, "multiplier": 16.83, "payout": 0, "blessing": "neutral", "text": "What did I make? Since Ship #1, RoboLens grew from one AI scanner into four connected tools. I added a rules checker that reads the actual FRC game manual (2024–2026) alongside your robot photo so it’s grounded in real rules instead of guessing. I built out a full shared battery tracker. I added a guided camera that walks you through lighting/tilt/framing and auto-captures once the angle looks right. And the biggest addition: a Team Stats & Match Center with four tabs (My Team, Stats, Events, Sim) pulling live data from The Blue Alliance and the FRC Events API, including a season-wide “World Rating,” a matchup simulator with win probabilities, and bookmarking teams to get real push notifications before their matches. I also spent a lot of time on stuff that doesn’t show up as a “feature” but makes the app actually usable: a queue + exponential backoff + retry system so the shared free-tier Gemini key doesn’t randomly fail scans under load, a report button that feeds recurring AI mistakes back into future scans, offline detection so scans fail fast instead of hanging, and a new instant-loading splash screen. What was challenging for me? The AI usage limits were the most persistent problem. Everyone shares one free-tier Gemini key, so scans would fail with no clear pattern whenever enough people hit it at once. I fixed it in stages: first a queue limiting in-flight requests, then automatic retries with backoff (and respecting the retry-after header when Gemini gave one), then finally surfacing that retry status to the user (“High demand. Retrying (2/3)…”) instead of just showing a dead spinner. The guided camera and push notifications both turned into whole rabbit holes of browser-specific pain (iOS Safari blocking camera/notification permissions unless triggered by a direct tap, no live frame streaming on web so I had to build a custom JS-interop layer from scratch, and push not working on iOS at all unless the site’s added to the home screen firs)t. My favorite bug story: the Match Center’s Events tab would spin forever with zero errors. I burned time adding timeouts and retries that did nothing before realizing the real issue. The spinner wasn’t stuck waiting on the network, it was stuck because nothing ever tried. What am I the most proud of? Going from a single-purpose AI scanner to four genuinely useful, connected tools without the codebase turning into spaghetti. I’m also proud that scans now degrade gracefully under load instead of just failing, and that notifications work reliably even though I had zero experience with service workers or VAPID keys before this. And honestly, just sticking with it. 21 devlogs and three months of real iteration based on actual user feedback instead of giving up. What should people know so they can test your project? Live app: https://mirage54321.github.io/RoboLens/ You can log in as a guest for team 4388 to browse batteries without needing an account. Push notifications currently work reliably on desktop browsers and Android (iOS Safari requires the site to be added to your home screen as a bookmark). You can test this by logging into -4388 (Yes, a negative. I needed a number that wouldn’t have a real team). The AI scan/rules tools need a robot photo to test against; if you don’t have one handy, any well-lit photo of mechanical/electrical components will still show you how the flow works.", "repo": "https://github.com/mirage54321/RoboLens", "demo": "https://mirage54321.github.io/RoboLens/"}, {"ship_num": 2, "ts": "2026-06-22T18:39:59Z", "hours": 5.0, "multiplier": 5.73, "payout": 26, "blessing": "neutral", "text": "I made an app for specifically robotics teams (although this could be used for other things too). This is still a work in progress because there is so much more I want to add. I did this project so that I could make something with an AI model and I’m really proud of myself because Flutter was really hard to work with!", "repo": "https://github.com/mirage54321/RoboLens", "demo": "https://mirage54321.github.io/RoboLens/"}]...
|
[{"post_id": 65393, "ts": "202 [{"post_id": 65393, "ts": "2026-09-10T14:37:50Z", "hours": 6.5575, "text": "Devlog #23 -> Fixed the camera disconnect crash from the feedback. Turns out the camera plugin doesn’t actually throw an error when the hardware gets yanked mid-session, it just quietly flips an internal hasError flag and keeps going. Which is why the app was crashing somewhere random instead of failing cleanly. Nothing in my code was listening for that flag, so it just kept trying to read frames and capture photos off a dead controller. Fixed it by adding a listener that actually watches for that error state, cleans everything up, and drops the user onto a proper “Camera disconnected, try again” screen instead of freezing or throwing. Also fixed the retry logic after a failed capture so it doesn’t try to restart a stream on a controller that’s already dead. Next up: the cursor. Someone pointed that out, because every button on web just shows the default arrow. Live app: https://mirage54321.github.io/RoboLens/a"}, {"post_id": 64602, "ts": "2026-09-09T03:43:12Z", "hours": 4.7133, "text": "Devlog #22 -> I was looking at the comments people left me from my ship and the first thing I noticed that I should work on is the load-in page. It is definitely kind of plain. To be honest, I used Claude to help a lot with this one. Making the spinning circle was pretty easy but I had some complex ideas I wanted to put to work and I just didn’t know how to do it. It has a huge radar that has the colors pop up and says “scounting __ teams”. Overall, I am so happy about this new design! Let me know what you guys think! I also added a folder for the photos so it looks more organized! The next thing I plan to work on “loop crashes if the camera disconnects” comment. Live app: https://mirage54321.github.io/RoboLens/"}, {"post_id": 63881, "ts": "2026-09-07T21:41:15Z", "hours": 2.065, "text": "Updates!!! Basically, I’ve been checking to see how many users and views I have. I have google analytics on my project to keep an eye on it. Right now I have 52 users and 163 views. Which honestly, I am pretty dang happy about. (1) I haven’t really been advertising (2) I literally thought it was gonna be like 20 views Woop woop! Okay, now on these past few days I have been working on getting as many hours as possible. I don’t have a personal computer so I am really aiming for literally any of the laptops. Now, programatically I have been working on removing the 3 burst messages for iPhone (it wouldn’t compact itself on the Apple homescreen). FYI: 90% of the time for this was spent removing the 3 burst messages for iPhone and writing Ship #2… so you better be ready for Ship 2! View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 63811, "ts": "2026-09-07T19:35:43Z", "hours": 0.7911, "text": "Notifications are working again! Basically, the rebuilding of Render helped fix the issue which is kind of ragebait. I’m getting a little nervous though because I wonder what happens if someone doesn’t reopen the bookmark (because that is how it resets). Would they still get the messages? Will it update automatically? Overall, it works great. I just worry there may be an error that arises (that is a risk with any project honestly). View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 63771, "ts": "2026-09-07T18:47:23Z", "hours": 5.1583, "text": "Devlog #19 -> I know I just committed a bunch the last few days. I guess I realized there is only a few days left and I found how to be way more efficent in getting hours. If I just keep this open and something else on another computer and work with them kinda being different windows then I get a lot more time because the switching of windows in the same computer made me keep forgetting to come back and work on the project (and I’m guessing was cutting the time too). Anywho! The most recent changes I have made is removing the ? mark button. I think I was going for a like “about me” thing but I think it was a little redundant and kind of unneccessary to say the least. I added a report button instead (it’s just in the home page). I got this idea from lovable which was something I worked with during my internship. I highkey have been working so much on this project (you can see by all my hours) that I didn’t want to connect it to the backend. It is just a popout that takes you to an gmail link and you can click send. Maybe if I run out of ideas I can add it as a backend. Now, if I am going to be so honest. I have worked a lot on this project and I want to ship but I also want to just crank out some more hours. I’m extremely proud of this project and I need to get it out to the world so that I can get some users! My issues to work on are: Low MongoDB storage for free account Professionalizing (now just looking back over and seeing if there is anything I wanna fix before putting on chief delphi) View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 63405, "ts": "2026-09-07T07:05:48Z", "hours": 8.2653, "text": "Devlog #18 -> Okay, super short devlog just to explain what I am doing. Basically all my hours are spent on fixing the notifications. It is super annoying right now because I am trying to finalize my project and the notifications randomly stop working. I tried clearing out mongoDB and checking on my cron-job and those seem to be working just fine. I’m not sure what to do. I pushed the hours up (for the practice day so I can check it earlier) and redeployed with Render. I shall see tomorrow if it works. View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 62347, "ts": "2026-09-05T17:45:39Z", "hours": 8.4539, "text": "Devlog #17 -> Part 3, wrapping this one up Last piece was making the retrying actually visible instead of just quietly happening in the background. Before, if a scan was retrying you’d just stare at a spinner with no idea what was going on. Now the loading screen updates to say something like “High demand. Retrying (2/3)…” so people know the app hasn’t frozen, it’s just waiting its turn. Between the queueing, the backoff retries on both ends, and this messaging, this should turn a lot of what used to be “scan failed, try again” moments into just a few extra seconds of waiting instead. Doesn’t make the free tier limit go away entirely, but it’s a big improvement over what I had. Current problems / what’s next: Low MongoDB storage for free account Professionalizing (before putting on Chief Delphi)"}, {"post_id": 61646, "ts": "2026-09-04T17:29:48Z", "hours": 9.4403, "text": "Devlog #16 -> Part 2, continuing from #15 Got retries working on top of the queue from last time. If Gemini comes back with a 429 (rate limited) or 503 (overloaded) instead of an actual answer, the backend now waits and tries again automatically, using exponential backoff (2s, then 4s, then 8s) instead of hammering it again right away, up to a few attempts before it actually gives up and reports failure. It also checks for a retry-after header first and uses that instead of the backoff timer if Gemini actually tells us how long to wait. Then I mirrored the same idea on the Flutter side, so if the backend’s retries still aren’t enough, the app itself will retry the whole request a couple more times before showing the user an error."}, {"post_id": 60875, "ts": "2026-09-03T14:59:25Z", "hours": 12.3994, "text": "Devlog #15 -> Part 1 (still working on this one!) Finally started actually tackling the AI usage limit problem from devlog #2. Since everyone using the app shares the same free-tier Gemini key, scans would just randomly fail with no real pattern whenever enough people were hitting it at once. Started on the backend side first: instead of letting every incoming scan hit Gemini immediately, I added a little queue that only lets 2 requests be in-flight to Gemini at a time, and everything else waits its turn. Next step is getting it to actually retry instead of just failing after the wait, but that’s for the next devlog."}, {"post_id": 60344, "ts": "2026-09-02T16:57:27Z", "hours": 7.4197, "text": "Devlog #14 -> Part 5 of 5 Finally! This final devlog is about the small tweaks I made in the app. I made it have a new photo Small one, just swapped out one of the app’s images for something more current since the old one was from way back in devlog #1 and didn’t really represent what the app looks like anymore. Nothing technical here, just housekeeping. It kinda works offline I say “kinda” because this isn’t a real offline mode where you can browse cached data with no internet, it’s more like the app now knows when it’s offline and fails fast instead of just hanging. Basically, I added a ConnectivityCheck helper that on web reads navigator.onLine (a free, instant, synchronous browser check for whether the device has a network interface up) so if you’re in airplane mode or your wifi is off, the AI scan screens can immediately say “can’t use this when offline” instead of sitting there for a full request timeout before failing. On native platforms there’s no real equivalent without pulling in a whole new plugin like connectivity_plus, so I just made the stub always report “online” there — an actually-offline phone still gets caught by the AI request’s own timeout/retry handling, just without the instant fail I get on web. One thing worth noting: this only checks if the device thinks it has a network connection, not whether that network actually has working internet behind it. So a wifi network that’s connected but dead will still say “online” here. That case still gets caught eventually, just the slower way through the request timeout instead of instantly. Good enough for now though, this was mostly about killing the most common case of someone trying to scan with their phone in airplane mode and just watching the app hang. I changed the load in screen Went back and reworked the loading screen from devlog #5. It’s now a plain CSS screen sitting directly in index.html instead of living inside the Flutter app itself, which means it can actually paint the instant the page loads, before Flutter has even finished downloading and booting up. That was the whole point: the old version technically only appeared once Flutter itself was far enough along to render it, so there was still a blank/white flash before it. Now there’s a little animated wordmark and spinner (the spinner’s colored arc cycles through the same colors as the logo letters) that fades out and removes itself once Flutter fires its first real frame. While I was in there I also fixed something unrelated but annoying: Flutter’s web service worker by default waits to activate a new version until every open instance of the app is fully closed, which for something people add to their home screen basically never happens naturally. So people could keep opening an old cached version of the app for a long time after I’d pushed updates. Added a bit of JS to force any newly installed service worker to skip that wait and take over immediately (reloading the page once it does), so the next time someone opens the app after I ship something, they actually get it. And that’s it, I’m all caught up! Five devlogs in one sitting was a lot, but future updates should go back to being posted as I actually build them instead of in one giant backlog dump. Current problems / what’s next: Low MongoDB storage for free account Releasing the app (onto chief delphi to get feedback)!! Making it ready to release (working on the ? and report button) Future ideas: team tracker, public chat for teams, judging/interview prep tool, callout tool, round robin generator View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 59335, "ts": "2026-09-01T02:11:53Z", "hours": 9.7772, "text": "Devlog #13 -> Part 4 of 5 Continuing from #12: more on the match center, mostly the stuff that actually broke on me. Biggest bug of the bunch: on the Events tab, tapping into an event was supposed to show “scheduled to attend” info and the competing teams list, but both of those sections would just spin forever, no error, nothing. I assumed it was a network timing issue at first and went down a whole rabbit hole adding timeouts and retry logic that did absolutely nothing. Turns out the actual problem was way dumber: when I pushed the EventDetailScreen with Navigator.push, that screen gets placed in the Overlay as a sibling of the tab tree, not a child of it, meaning it’s NOT under my MatchScope anymore. So the second that screen tried to call MatchScope.of(context), it threw an assertion error immediately, before initState even got the chance to call setState and load anything. The spinner wasn’t stuck because of a slow network, it was stuck because the load call never even ran. Fixed it by just re-wrapping the pushed route in its own MatchScope using the same controller instance. Felt very silly once I found it, but also weirdly satisfying to finally understand. Next was the matchup simulator and win probabilities. On the schedule screen I show a rough “Red 45% / Blue 55%” prediction for each match. My first instinct was to use each event’s own OPR for this, but that falls apart for upcoming events since OPR doesn’t exist until a team has actually played a match there. So instead I based predictions on the season-wide World Rating from the Stats tab (average points across every event a team’s played all season), which actually gives predictions even for a event that hasn’t started yet. Also went back and hooked the push notification bell (from devlog #11) directly into the match center’s top bar now that there’s finally a “your team” + “your event” to actually attach a subscription to. There’s a little pulsing glow animation on the bell the first time you land on a screen where you could enable alerts, just so people notice it’s there instead of it blending into the top bar. Took way too many attempts to get the glow animation timing feeling smooth and not epileptic-seizure-inducing, but I think I landed on something decent. Genuinely didn’t expect the 4th app to take this many devlogs but here we are. One more to wrap up some small stuff and then I think I’m caught up! View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 58655, "ts": "2026-08-31T04:34:12Z", "hours": 9.4486, "text": "Devlog #12 -> Part 3 of 5 Okay, actual 4th app time: Team Stats & Match Center (internally I’ve just been calling it “match” in the code, so if you dig around the file names that’s why). I started by mocking everything out before touching any real API, just so I could get the UI feeling right first. Made an intro screen (basically pitching the three features: match alerts, team stats, matchup simulator) and a fake mockTeams list with made-up EPA numbers just so I had something to look at while building. Once the layout felt right, I started swapping the fake data for real stuff from The Blue Alliance’s API, proxied through my backend the same way I already had set up for the FRC Events API (so I’m not spamming TBA directly from a bunch of client apps and to keep my API key private). Architecture-wise, I did something different from my other three apps: instead of passing state down through a million constructor params, I made a MatchDataController (basically one class holding all the team/event/match data + loading state) and wrapped the whole feature in a MatchScope, which is just an InheritedNotifier. So anywhere in the match center I can just call MatchScope.of(context) and get the controller without threading it through every single widget. Probably overkill for how big this feature ended up being, but once I had 4 tabs and a handful of sub-screens all needing the same data, I was really glad I did it this way instead of my usual pass-everything-into-the-constructor approach. Speaking of tabs, I split it into 4: My Team -> your team’s own info/next match Stats -> a season-wide “World Rating” I calculate from aggregating TBA’s OPR data across events (this was its own whole thing, might do a separate devlog on it someday) Events -> browse every FRC event, filter by time or location, see who’s live right now Sim -> the matchup simulator I keep promising Getting match data to actually parse right from TBA’s JSON took a minute (comp levels like qm/qf/sf/f needed their own label logic, predicted_time vs actual_time needed fallback logic since actual_time barely ever gets posted until after the match is already over, that kind of thing) but nothing too crazy, just tedious model-writing. Devlog #13 is basically a straight continuation of this one, mostly bug stories and the simulator, so be ready for that. View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 55760, "ts": "2026-08-27T19:05:53Z", "hours": 4.8611, "text": "Devlog #11 -> Part 2 of 5 Now for the second devlog, I am going to talk about how I got notifications to work. This is the one that ate my week. So the goal: when a match is coming up for a team you bookmarked, get a push notification even if the app/tab isn’t open. That last part is the whole problem, because it means I can’t just pop a normal in-app alert, I actually need real browser push notifications, which meant learning a whole new stack: service workers, VAPID keys, and the Push API. Here’s roughly how it works now ->Subscribe -> user picks a team number + event key, the app asks the browser for notification permission, and if granted it registers a push subscription through the service worker using my VAPID public key. Send to backend -> that subscription (plus team number/event key) gets sent to my Express backend and stored in MongoDB. Actually sending them -> the backend uses the web-push npm package to send the push whenever it detects a match coming up for that team. Getting the Flutter side to talk to any of this was its own adventure, since none of this exists as a nice Dart package, so I had to write a JS interop layer (basically a matchPush object in plain JS that Dart calls into) and wire it up through the same conditional-export trick I used for the guided camera: one file for web, one stub file that just says “unsupported” for native, so the app doesn’t explode on phone builds while I haven’t built native push yet. Problems I ran into (there were many) ->iOS Safari straight up does not support web push at all unless the site has been added to the home screen first. So right now notifications basically only work reliably on desktop browsers and Android, and I have to eventually explain that to iOS users somehow. Permission requests have the same “must be triggered by a direct tap” rule I fought with on the guided camera, so subscribing has to happen from an actual button press, no auto-subscribing on load. Debugging this was rough because half the errors happen silently in the service worker, not in the normal Flutter console, so I was stuck adding console.logs into push.js and checking devtools like a caveman for a while.It works now though! Bookmark a team, subscribe, and you’ll get pinged. Native (phone-installed) push notifications are still a “later” problem since that needs a totally different setup (probably Firebase Cloud Messaging), so for now the stub just returns unsupported on native and I’m keeping my scope to web. Two devlogs about the 4th app itself coming up next, promise. View it here: https://mirage54321.github.io/RoboLens/ P.S. For right now there are 3 notifications that send for iOS I plan to change that though!"}, {"post_id": 54198, "ts": "2026-08-25T02:42:40Z", "hours": 8.6025, "text": "Devlog #10 -> Part 1 of 5 Please don’t hurt me, but I have to post multiple devlogs because I worked on so many things in all this time. It’s a lot of stuff to talk about and I don’t want to write it all into one because it will be super unorganized and hard for me to find in the future. In this first devlog, I am going to talk about how I got bookmarks to work. The idea came from thinking ahead to the match notifier. If someone wants alerts for a match, they need a way to say “these are the teams I care about” without having to retype a team number every single time. So I added a bookmark system using shared_preferences (just storing a list of team numbers locally on the device/browser). You can now star a team from a few places in the app and it’ll save to your bookmarks list, which I’m planning to hook the notifier into so it can just loop through your saved teams instead of asking you every time. This one was honestly pretty painless compared to my usual chaos. The only annoying part was making sure the bookmarked list actually persisted correctly on web (learned my lesson from the MongoDB flutter-web thing, so I tested this one on both platforms before moving on lol). Turns out shared_preferences just works with local storage under the hood on web, so no weird surprises this time. Short devlog, I know, but wait till you see what devlog #11 turned into. View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 49268, "ts": "2026-08-17T23:33:09Z", "hours": 6.1139, "text": "Devlog #9 -> Okay, so getting the report button to work was a little finicky. I wasn’t sure what approach to take: I could make it easy by just sending me the reported things and I could look at them and just change the prompt, or I could make it difficult by just feeding every single reported issue back into the AI model so that the AI tries to not make the same mistake (which might be a problem because someone could report something that was actually right), or make it VERY difficult make it feed back into the AI if a similar issues were coming up again and again. Guess which one I chose? Yup, the third. Basically, I decided to store the reports in MongoDB and look for recurring mistakes instead of letting a single report change the AI. That way, if one person reports something incorrectly, it doesn’t immediately affect everyone else’s scans. If the same type of mistake keeps getting reported, I can investigate it and use those reports to improve the AI.This seems really complex, and it was. It took me 4 hours (it says 6 on the devlog but 2 of them was working on the 4th app). Alright, ready for my fourth widget idea………. a match notifier!! Now don’t get too excited. I have more to tell. So, every FRC kid knows that there’s a website called Nexus that sends messages for when your game is going to start so you can get in queue, and it works really well. There’s also this thing I came across called statbotics, and it calculates many things like EPA, and more (I didn’t really stay on that website for too long). So, what I plan to do is combine them. Hopefully, I’m not getting myself into too much of a challenge. This will most definitely be the hardest thing I have ever done on this app. Wish me luck! P.S. I started making the fourth widget before the report button then switched to finish the report button halfway so if you see my commits in a confusing order that’s why. View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 43541, "ts": "2026-08-08T21:26:06Z", "hours": 0.3608, "text": "Devlog #8 -> Part 2/2 (part 2 of this devlog) I also posted my app onto reddit (r/FRC) and got some feedback. From the feedback, I got the message that an AI scanner can’t be all that reliable/useful without a user-end customization. I totally agree with this. The problem is that I’m not sure if it is worth it to spend time on adding in customization tools for the AI as there is not a lot of return from it. Therefore, I think that right now the AI’s are at the best product they can be as of now (besides adding functionality to the report button). So, my time would be better spent adding in more apps into the app. On the bright side, there were lots of positive reviews about the battery section! I am now going to work on the report button for the UI because I think it will take less time to add than adding a fourth app. In my next post, I will have a confirmed idea for the fourth app! Things to work on: Low MongoDB storage for free account Report button on the UI needs to feed into the AI ⭐ (Going to do this first because it is easier) Find solution for Render (takes a long time to power on and first time you try to do anything it always fails) Adding fourth ‘app’ ⭐⭐ View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 43529, "ts": "2026-08-08T21:02:52Z", "hours": 6.3211, "text": "Devlog #7 -> Part 2/2 (but part 1 of this devlog) Okay. This was very annoying to work on because every single time I would edit the code, I would have to recommit in order to see it on the github pages (because the permissions wouldn’t work on the flutter web-server). So, getting the guided camera working on web brought a whole lot of browser-specific issues that don’t show up on native mobile. First, the app would hang on a black loading screen because permission_handler and frame streaming aren’t supported in browsers. I then fixed that by branching on kIsWeb to skip those native-only calls and let the browser’s own getUserMedia prompt handle camera access instead.Next, iOS Safari blocked the camera request outright because it requires permission calls to fire directly from a user tap with no delay -> solved by gating the whole flow behind an explicit “Enable Camera” button instead of auto-starting on page load. Since camera_web doesn’t support live frame streaming and sensors_plus doesn’t handle iOS’s motion permission prompt, live guidance (tilt, brightness, sharpness) had to be rebuilt from scratch for web: a custom JS-interop layer (WebProbe) draws each video frame onto a hidden canvas to sample brightness/sharpness, and separately requests iOS’s DeviceMotionEvent permission to read tilt.That introduced two more subtle bugs (a Dart generics issue causing a null-cast crash in the interop code, and a timing issue where the element wasn’t in the DOM yet when we went looking for it) both fixed with explicit type arguments and a retry loop. With all of that sorted, the guided camera now works consistently across native and web, with live tilt/lighting/sharpness feedback and autocapture. View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 37868, "ts": "2026-07-30T20:50:16Z", "hours": 4.4522, "text": "Devlog #6 -> Part 1/2 Hey! I know it has been awhile since I worked on my project (adding the guided camera has been taking a lot of will power), but I have a new update. I have added the guided camera to the scan screen (which I will add to the rules screen too after it is finished). The process that the guided camera uses is: Startup -> requests camera permission immediately for phone usage (permission_handler) or waits for a tap on “Enable Camera” first for browser usage. Camera setup -> fetches available cameras (from Flutter’s camera plugin), picks the back-facing one (falls back to the first available camera on the device if no back camera is found), sets resolution to high on phone or medium on browser (since browsers often reject high-res requests), then calls initialize() to start the live preview. Manual fallback for taking photos -> the shutter button is always available to captures the photo; this is the primary method right now. Capture -> stops the frame stream (phone only), takes the picture, reads the bytes, then returns them to the previous screen via Navigator.pop(context, bytes). An issue I ran into was camera permissions on iPhone Safari. It worked fine on my laptop but wouldn’t work on my phone. I eventually figured out that iPhones are notorious for always requiring explicit permission prompts, so I solved it by requiring the camera request to be triggered by a direct user tap. Basically, I added an “Enable Camera” button on web that only calls the camera setup when tapped, since iOS Safari silently blocks getUserMedia (instead of showing an error) if there’s any delay between the tap and the request. Now I am working on the flutter comments (“too dark”, “focus”, etc.) because right now those aren’t working. Once I get the live guidance to work, then I will be able to implement an auto-capture (that way the photo is taken when at a good angle). View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 29717, "ts": "2026-07-16T20:11:47Z", "hours": 4.3139, "text": "Devlog #5 -> My app now has a load in screen! Yay! I figured it was necessary just to make my whole app look more professional. It was pretty easy (took lots of time though) to add and I didn’t fall into any huge difficulties. Only a mini one because I tried to make the animation in the home screen class and it got chaotic. Once it was its own file it was quite easy because then I just needed to fix up the UI. Look here if you want to learn more about how to do animations in your own project (if using Flutter): https://docs.flutter.dev/ui/animations I also added a very tiny change to the error message for logging in. Instead of saying “Team already registered”, it tells you to contact my email if you cannot access your team. I guess I got really nervous that someone would try to access their team, and if they couldn’t, they would go and put another team’s number and so on indefinitely. Right now, I think this is a good way to fix the issue, but I’ll add a way to report it in the app; that way, the issue can be solved quicker, and you won’t have to send an email to someone. I did have the idea to make it so there is identification of some sort for each team; however, that would just make the app complex, and my whole goal was to have a simple solution to problems. So, if this app actually does really well in the FRC world, I will add some sort of verification; that way lost accounts can be found, and it would just give all-around easier access. Next, I am going to focus on my long put off task: photo to video. I am not sure how I am going to do this, if I am going to be so honest. My idea for it came fom the Smile Doctors invisalign app where it opens up your camera and tells you things like “go to better lighting” or “move to the left”. However, I think that will be super complex and difficult to implement so I might have to start a lot smaller. Best of luck to myself, I guess! List of current tasks: Low MongoDB storage for free account Report button on the UI needs to feed into the AI ⭐ Find solution for Render (takes a long time to power on and first time you try to do anything it always fails) Photo to video (that way it can help you find the right orientation for the AI to scan with the best feedback possible) ⭐⭐ View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 28023, "ts": "2026-07-14T00:50:11Z", "hours": 4.6822, "text": "Devlog #4 -> Hey! I have been working on the issues I talked about in my last devlog. So far I have successfully solved one: How I solved “Connenction to MongoDB working for flutter web but not github?” -> The issue was that GitHub Pages is a static hosting service and couldn’t connect directly to MongoDB. Therefore I had to update the application so the GitHub Pages frontend communicates with the Express backend on Render. Basically, I just modified some of the backend configuration like changing (in very very simple terms): fetch(‘/battery’) to something like fetch(‘ https://ridgeboticsapp.onrender.com/battery ’). I also added a ? mark button so that if clicked on it can tell you a little more about the app. Right now, it is just saying some basic things but I plan to show this app to my friends and see what they think I should add to that text in order to help people figure out what is going on if they just found my app. Finally, I fixed an error I wasn’t even aware of: the name finder for each teams batteries. I made it so when you sign up your team, it will try to search up the team name with that FRC number. However, there would be times where I would sign in as my team and it would show up with some random name like “Robo-Knights” or something weird. I think this was related to the Gemini model because I had used it while testing, soincorrect team names could have been stored and reused instead of being verified. To fix this, I connected my backend to the official FRC Events API. Now, the app sends the team’s FRC number to FIRST to retrieve the official team information to then save the verified team name. This prevents teams from accidentally being assigned another team’s name and makes sure the battery data is connected to the correct FRC team. It was never too big of an issue because I could always just edit the names in MongoDB but having it so it says the name right 100% of the time is just much easier for me. Now my new top things to work on are: If team is signed up but you don’t have access to your team Photo to video (that way it can help you find the right orientation for the AI to scan with the best feedback possible) Report button working better to fix the AI’s findings View it here: https://mirage54321.github.io/RoboLens/ P.S. If you are trying things out you can sign in as a guest for 4388 and see my teams batteries"}, {"post_id": 24928, "ts": "2026-07-08T20:05:31Z", "hours": 1.5633, "text": "Devlog #3 -> In the past few days I have been working on adding a battery tracker because I believe that it has the potential to be very helpful to FRC teams. Tracking batteries is always a pain for my team, and other teams I’ve connected with can probably agree with that statement. Batteries can randomly fail by not charging or just full-on dying in two minutes. Although one might assume that keeping track of all this is easy, it truly is not. Having a system to hold records and data, I believe, can be very helpful to teams! I’ve added the third tool to the app: a shared battery tracker where a team can log in with a team number and passcode, add batteries, and mark each one as charging, in use, or available. It also lets you flag a battery as weak or unreliable with a note, so if a battery dies mid-match, the whole team can see that history the next time they’re deciding which one to grab. I even added an option for the AI to recommend which battery to use next based on how long it’s been charged and whether it’s been flagged before. My new challenge for this tool has been working with MongoDB. It stores the data fine, but it wasn’t letting me log in (it kept throwing an error). What confused me more is that when I ran it in Flutter web, it worked just fine. This is what I plan to work on for the next few days. To fix my last problem, which was with the AI saying it had spikes in usage, I changed the message to ask the user to try again because it usually works on the try right after. Right now, this is just a temporary solution until I can find a new AI model. List of things to work on: Low MongoDB storage for free account Report button on the UI needs to feed into the AI Find permanant solution for the AI usage Connenction to MongoDB working for flutter web but not github? Photo to video (that way it can help you find the right orientation for the AI to scan with the best feedback possible) View it here: https://mirage54321.github.io/RoboLens/ Log in as guest for team 4388 if you just want to view it. P.S. My logged time is glitching out a bunch and I would love if someone could help me in the #stardance-help on slack."}, {"post_id": 23707, "ts": "2026-07-06T20:19:01Z", "hours": 9.0781, "text": "Devlog #2-> Now that I’ve finished the foundation of my project, I can keep adding tools! On my last ship, I realized I should keep more documentation. So be ready for more devlogs going forward! To get a little more comfortable with what I’m doing, I decided to add another AI scanning tool that I have been thinking about: a rules checker. The general scanner already looked for physical problems like wiring and cracks, but I wanted something that could actually check a robot against the official FRC rulebook. So I added the actual PDFs of past FRC game manuals (2024, 2025, and 2026) and let the user pick which season’s rules to check against. That PDF gets fed into the AI alongside the photo, so instead of relying on whatever general FRC knowledge the model already has (which could be outdated or made up), it’s reading the exact rulebook for that year while it looks at the image. Getting the PDF into the AI request in the first place took some figuring out. I had to load it from the app’s assets, converting it into a format the API would actually accept, and making sure it got sent alongside the image without breaking anything. Once it worked though, the difference was noticeable (the AI’s answers started actually referencing real rules instead of guesses). The bigger challenge was AI usage limits. Not “too many messages” though. Instead, it was more that other people using the same free model at the same time meant my requests were competing with everyone else’s. Half the time a scan would go through fine, and the other half it just wouldn’t, with no real pattern I could find. To fix this I… haven’t yet, honestly. Still an open problem :(. Hoping to hear from you guys for some ideas! I’m a little nervous because AI kind of has a negative connotation in FRC. To address that issue, I’m planning to make the whole app not centered around AI so I’ll be adding more tools. Excited to keep going though, because I just started programming my new idea: adding a battery tracker! View it here: https://mirage54321.github.io/RoboLens/"}, {"post_id": 13860, "ts": "2026-06-22T18:21:53Z", "hours": 4.63, "text": "Devlog #1-> I’ve finished the foundation of my project! The app currently has a simple UI and one AI tool that takes in a photo and tells you what’s wrong with it — whether it’s frayed wiring, loose screws, cracked/bent frames, or corrosion. Goal of my project: cut down the time it takes to find an issue so an FRC team has more time to actually fix the problem, and flag problems a human might miss during a rushed pit-stop check. Working with Flutter to program the UI wasn’t too bad. I’ve always been used to Java and JavaScript, so although Dart isn’t exactly the same, I picked it up pretty fast. I had the most difficulty implementing the AI. I started with an Ollama model, but it was way too slow — it would time out before it ever finished telling me what it noticed in the photo. I then found out Google lets you use a free Gemini model, so I got an API key for that and added it in. The new problem: every time I published my app as a GitHub Page, the API key would get disabled because it wasn’t safe sitting in client-side code. I finally learned the key needs to live on a backend to actually be secure, so I set one up using Render. I’m so proud of how my project is looking so far! Next up, I plan to add more tools, like a rules scanner."}]...
|
Title: Robotics RoboLens by @mira_j_maroni | Stard Title: Robotics RoboLens by @mira_j_maroni | Stardance
Devlogs:
Devlog #1-> I’ve finished the foundation of my project! The app currently has a simple UI and one AI tool that takes in a photo and tells you what’s wrong with it — whether it’s frayed wiring, loose screws, cracked/bent frames, or corrosion. Goal of my project: cut down the time it takes to find an issue so an FRC team has more time to actually fix the problem, and flag problems a human might miss during a rushed pit-stop check. Working with Flutter to program the UI wasn’t too bad. I’ve always been used to Java and JavaScript, so although Dart isn’t exactly the same, I picked it up pretty fast. I had the most difficulty implementing the AI. I started with an Ollama model, but it was way too slow — it would time out before it ever finished telling me what it noticed in the photo. I then found out Google lets you use a free Gemini model, so I got an API key for that and added it in. The new problem: every time I published my app as a GitHub Page, the API key would get disabled because it wasn’t safe sitting in client-side code. I finally learned the key needs to live on a backend to actually be secure, so I set one up using Render. I’m so proud of how my project is looking so far! Next up, I plan to add more tools, like a rules scanner.
Devlog #2-> Now that I’ve finished the foundation of my project, I can keep adding tools! On my last ship, I realized I should keep more documentation. So be ready for more devlogs going forward! To get a little more comfortable with what I’m doing, I decided to add another AI scanning tool that I have been thinking about: a rules checker. The general scanner already looked for physical problems like wiring and cracks, but I wanted something that could actually check a robot against the official FRC rulebook. So I added the actual PDFs of past FRC game manuals (2024, 2025, and 2026) and let the user pick which season’s rules to check against. That PDF gets fed into the AI alongside the photo, so instead of relying on whatever general FRC knowledge the model already has (which could be outdated or made up), it’s reading the exact rulebook for that year while it looks at the image. Getting the PDF into the AI request in the first place took some figuring out. I had to load it from the app’s assets, converting it into a format the API would actually accept, and making sure it got sent alongside the image without breaking anything. Once it worked though, the difference was noticeable (the AI’s answers started actually referencing real rules instead of guesses). The bigger challenge was AI usage limits. Not “too many messages” though. Instead, it was more that other people using the same free model at the same time meant my requests were competing with everyone else’s. Half the time a scan would go through fine, and the other half it just wouldn’t, with no real pattern I could find. To fix this I… haven’t yet, honestly. Still an open problem :(. Hoping to hear from you guys for some ideas! I’m a little nervous because AI kind of has a negative connotation in FRC. To address that issue, I’m planning to make the whole app not centered around AI so I’ll be adding more tools. Excited to keep going though, because I just started programming my new idea: adding a battery tracker! View it here: https://mirage54321.github.io/RoboLens/
Devlog #3 -> In the past few days I have been working on adding a battery tracker because I believe that it has the potential to be very helpful to FRC teams. Tracking batteries is always a pain for my team, and other teams I’ve connected with can probably agree with that statement. Batteries can randomly fail by not charging or just full-on dying in two minutes. Although one might assume that keeping track of all this is easy, it truly is not. Having a system to hold records and data, I believe, can be very helpful to teams! I’ve added the third tool to the app: a shared battery tracker where a team can log in with a team number and passcode, add batteries, and mark each one as charging, in use, or available. It also lets you flag a battery as weak or unreliable with a note, so if a battery dies mid-match, the whole team can see that history the next time they’re deciding which one to grab. I even added an option for the AI to recommend which battery to use next based on how long it’s been charged and whether it’s been flagged before. My new challenge for this tool has been working with MongoDB. It stores the data fine, but it wasn’t letting me log in (it kept throwing an error). What confused me more is that when I ran it in Flutter web, it worked just fine. This is what I plan to work on for the next few days. To fix my last problem, which was with the AI saying it had spikes in usage, I changed the message to ask the user to try again because it usually works on the try right after. Right now, this is just a temporary solution until I can find a new AI model. List of things to work on: Low MongoDB storage for free account Report button on the UI needs to feed into the AI Find permanant solution for the AI usage Connenction to MongoDB working for flutter web but not github? Photo to video (that way it can help you find the right orientation for the AI to scan with the best feedback possible) View it here: https://mirage54321.github.io/RoboLens/ Log in as guest for team 4388 if you just want to view it. P.S. My logged time is glitching out a bunch and I would love if someone could help me in the #stardance-help on slack.
Devlog #4 -> Hey! I have been working on the issues I talked about in my last devlog. So far I have successfully solved one: How I solved “Connenction to MongoDB working for flutter web but not github?” -> The issue was that GitHub Pages is a static hosting service and couldn’t connect directly to MongoDB. Therefore I had to update the application so the GitHub Pages frontend communicates with the Express backend on Render. Basically, I just modified some of the backend configuration like changing (in very very simple terms): fetch(‘/battery’) to something like fetch(‘ https://ridgeboticsapp.onrender.com/battery ’). I also added a ? mark button so that if clicked on it can tell you a little more about the app. Right now, it is just saying some basic things but I plan to show this app to my friends and see what they think I should add to that text in order to help people figure out what is going on if they just found my app. Finally, I fixed an error I wasn’t even aware of: the name finder for each teams batteries. I made it so when you sign up your team, it will try to search up the team name with that FRC number. However, there would be times where I would sign in as my team and it would show up with some random name like “Robo-Knights” or something weird. I think this was related to the Gemini model because I had used it while testing, soincorrect team names could have been stored and reused instead of being verified. To fix this, I connected my backend to the official FRC Events API. Now, the app sends the team’s FRC number to FIRST to retrieve the official team information to then save the verified team name. This prevents teams from accidentally being assigned another team’s name and makes sure the battery data is connected to the correct FRC team. It was never too big of an issue because I could always just edit the names in MongoDB but having it so it says the name right 100% of the time is just much easier for me. Now my new top things to work on are: If team is signed up but you don’t have access to your team Photo to video (that way it can help you find the right orientation for the AI to scan with the best feedback possible) Report button working better to fix the AI’s findings View it here: https://mirage54321.github.io/RoboLens/ P.S. If you are trying things out you can sign in as a guest for 4388 and see my teams batteries
Devlog #5 -> My app now has a load in screen! Yay! I figured it was necessary just to make my whole app look more professional. It was pretty easy (took lots of time though) to add and I didn’t fall into any huge difficulties. Only a mini one because I tried to make the animation in the home screen class and it got chaotic. Once it was its own file it was quite easy because then I just needed to fix up the UI. Look here if you want to learn more about how to do animations in your own project (if using Flutter): https://docs.flutter.dev/ui/animations I also added a very tiny change to the error message for logging in. Instead of saying “Team already registered”, it tells you to contact my email if you cannot access your team. I guess I got really nervous that someone would try to access their team, and if they couldn’t, they would go and put another team’s number and so on indefinitely. Right now, I think this is a good way to fix the issue, but I’ll add a way to report it in the app; that way, the issue can be solved quicker, and you won’t have to send an email to someone. I did have the idea to make it so there is identification of some sort for each team; however, that would just make the app complex, and my whole goal was to have a simple solution to problems. So, if this app actually does really well in the FRC world, I will add some sort of verification; that way lost accounts can be found, and it would just give all-around easier access. Next, I am going to focus on my long put off task: photo to video. I am not sure how I am going to do this, if I am going to be so honest. My idea for it came fom the Smile Doctors invisalign app where it opens up your camera and tells you things like “go to better lighting” or “move to the left”. However, I think that will be super complex and difficult to implement so I might have to start a lot smaller. Best of luck to myself, I guess! List of current tasks: Low MongoDB storage for free account Report button on the UI needs to feed into the AI ⭐ Find solution for Render (takes a long time to power on and first time you try to do anything it always fails) Photo to video (that way it can help you find the right orientation for the AI to scan with the best feedback possible) ⭐⭐ View it here: https://mirage54321.github.io/RoboLens/
Devlog #6 -> Part 1/2 Hey! I know it has been awhile since I worked on my project (adding the guided camera has been taking a lot of will power), but I have a new update. I have added the guided camera to the scan screen (which I will add to the rules screen too after it is finished). The process that the guided camera uses is: Startup -> requests camera permission immediately for phone usage (permission_handler) or waits for a tap on “Enable Camera” first for browser usage. Camera setup -> fetches available cameras (from Flutter’s camera plugin), picks the back-facing one (falls back to the first available camera on the device if no back camera is found), sets resolution to high on phone or medium on browser (since browsers often reject high-res requests), then calls initialize() to start the live preview. Manual fallback for taking photos -> the shutter button is always available to captures the photo; this is the primary method right now. Capture -> stops the frame stream (phone only), takes the picture, reads the bytes, then returns them to the previous screen via Navigator.pop(context, bytes). An issue I ran into was camera permissions on iPhone Safari. It worked fine on my laptop but wouldn’t work on my phone. I eventually figured out that iPhones are notorious for always requiring explicit permission prompts, so I solved it by requiring the camera request to be triggered by a direct user tap. Basically, I added an “Enable Camera” button on web that only calls the camera setup when tapped, since iOS Safari silently blocks getUserMedia (instead of showing an error) if there’s any delay between the tap and the request. Now I am working on the flutter comments (“too dark”, “focus”, etc.) because right now those aren’t working. Once I get the live guidance to work, then I will be able to implement an auto-capture (that way the photo is taken when at a good angle). View it here: https://mirage54321.github.io/RoboLens/
Devlog #7 -> Part 2/2 (but part 1 of this devlog) Okay. This was very annoying to work on because every single time I would edit the code, I would have to recommit in order to see it on the github pages (because the permissions wouldn’t work on the flutter web-server). So, getting the guided camera working on web brought a whole lot of browser-specific issues that don’t show up on native mobile. First, the app would hang on a black loading screen because permission_handler and frame streaming aren’t supported in browsers. I then fixed that by branching on kIsWeb to skip those native-only calls and let the browser’s own getUserMedia prompt handle camera access instead.Next, iOS Safari blocked the camera request outright because it requires permission calls to fire directly from a user tap with no delay -> solved by gating the whole flow behind an explicit “Enable Camera” button instead of auto-starting on page load. Since camera_web doesn’t support live frame streaming and sensors_plus doesn’t handle iOS’s motion permission prompt, live guidance (tilt, brightness, sharpness) had to be rebuilt from scratch for web: a custom JS-interop layer (WebProbe) draws each video frame onto a hidden canvas to sample brightness/sharpness, and separately requests iOS’s DeviceMotionEvent permission to read tilt.That introduced two more subtle bugs (a Dart generics issue causing a null-cast crash in the interop code, and a timing issue where the element wasn’t in the DOM yet when we went looking for it) both fixed with explicit type arguments and a retry loop. With all of that sorted, the guided camera now works consistently across native and web, with live tilt/lighting/sharpness feedback and autocapture. View it here: https://mirage54321.github.io/RoboLens/
Devlog #8 -> Part 2/2 (part 2 of this devlog) I also posted my app onto reddit (r/FRC) and got some feedback. From the feedback, I got the message that an AI scanner can’t be all that reliable/useful without a user-end customization. I totally agree with this. The problem is that I’m not sure if it is worth it to spend time on adding in customization tools for the AI as there is not a lot of return from it. Therefore, I think that right now the AI’s are at the best product they can be as of now (besides adding functionality to the report button). So, my time would be better spent adding in more apps into the app. On the bright side, there were lots of positive reviews about the battery section! I am now going to work on the report button for the UI because I think it will take less time to add than adding a fourth app. In my next post, I will have a confirmed idea for the fourth app! Things to work on: Low MongoDB storage for free account Report button on the UI needs to feed into the AI ⭐ (Going to do this first because it is easier) Find solution for Render (takes a long time to power on and first time you try to do anything it always fails) Adding fourth ‘app’ ⭐⭐ View it here: https://mirage54321.github.io/RoboLens/
Devlog #9 -> Okay, so getting the report button to work was a little finicky. I wasn’t sure what approach to take: I could make it easy by just sending me the reported things and I could look at them and just change the prompt, or I could make it difficult by just feeding every single reported issue back into the AI model so that the AI tries to not make the same mistake (which might be a problem because someone could report something that was actually right), or make it VERY difficult make it feed back into the AI if a similar issues were coming up again and again. Guess which one I chose? Yup, the third. Basically, I decided to store the reports in MongoDB and look for recurring mistakes instead of letting a single report change the AI. That way, if one person reports something incorrectly, it doesn’t immediately affect everyone else’s scans. If the same type of mistake keeps getting reported, I can investigate it and use those reports to improve the AI.This seems really complex, and it was. It took me 4 hours (it says 6 on the devlog but 2 of them was working on the 4th app). Alright, ready for my fourth widget idea………. a match notifier!! Now don’t get too excited. I have more to tell. So, every FRC kid knows that there’s a website called Nexus that sends messages for when your game is going to start so you can get in queue, and it works really well. There’s also this thing I came across called statbotics, and it calculates many things like EPA, and more (I didn’t really stay on that website for too long). So, what I plan to do is combine them. Hopefully, I’m not getting myself into too much of a challenge. This will most definitely be the hardest thing I have ever done on this app. Wish me luck! P.S. I started making the fourth widget before the report button then switched to finish the report button halfway so if you see my commits in a confusing order that’s why. View it here: https://mirage54321.github.io/RoboLens/
Devlog #10 -> Part 1 of 5 Please don’t hurt me, but I have to post multiple devlogs because I worked on so many things in all this time. It’s a lot of stuff to talk about and I don’t want to write it all into one because it will be super unorganized and hard for me to find in the future. In this first devlog, I am going to talk about how I got bookmarks to work. The idea came from thinking ahead to the match notifier. If someone wants alerts for a match, they need a way to say “these are the teams I care about” without having to retype a team number every single time. So I added a bookmark system using shared_preferences (just storing a list of team numbers locally on the device/browser). You can now star a team from a few places in the app and it’ll save to your bookmarks list, which I’m planning to hook the notifier into so it can just loop through your saved teams instead of asking you every time. This one was honestly pretty painless compared to my usual chaos. The only annoying part was making sure the bookmarked list actually persisted correctly on web (learned my lesson from the MongoDB flutter-web thing, so I tested this one on both platforms before moving on lol). Turns out shared_preferences just works with local storage under the hood on web, so no weird surprises this time. Short devlog, I know, but wait till you see what devlog #11 turned into. View it here: https://mirage54321.github.io/RoboLens/
Devlog #11 -> Part 2 of 5 Now for the second devlog, I am going to talk about how I got notifications to work. This is the one that ate my week. So the goal: when a match is coming up for a team you bookmarked, get a push notification even if the app/tab isn’t open. That last part is the whole problem, because it means I can’t just pop a normal in-app alert, I actually need real browser push notifications, which meant learning a whole new stack: service workers, VAPID keys, and the Push API. Here’s roughly how it works now ->Subscribe -> user picks a team number + event key, the app asks the browser for notification permission, and if granted it registers a push subscription through the service worker using my VAPID public key. Send to backend -> that subscription (plus team number/event key) gets sent to my Express backend and stored in MongoDB. Actually sending them -> the backend uses the web-push npm package to send the push whenever it detects a match coming up for that team. Getting the Flutter side to talk to any of this was its own adventure, since none of this exists as a nice Dart package, so I had to write a JS interop layer (basically a matchPush object in plain JS that Dart calls into) and wire it up through the same conditional-export trick I used for the guided camera: one file for web, one stub file that just says “unsupported” for native, so the app doesn’t explode on phone builds while I haven’t built native push yet. Problems I ran into (there were many) ->iOS Safari straight up does not support web push at all unless the site has been added to the home screen first. So right now notifications basically only work reliably on desktop browsers and Android, and I have to eventually explain that to iOS users somehow. Permission requests have the same “must be triggered by a direct tap” rule I fought with on the guided camera, so subscribing has to happen from an actual button press, no auto-subscribing on load. Debugging this was rough because half the errors happen silently in the service worker, not in the normal Flutter console, so I was stuck adding console.logs into push.js and checking devtools like a caveman for a while.It works now though! Bookmark a team, subscribe, and you’ll get pinged. Native (phone-installed) push notifications are still a “later” problem since that needs a totally different setup (probably Firebase Cloud Messaging), so for now the stub just returns unsupported on native and I’m keeping my scope to web. Two devlogs about the 4th app itself coming up next, promise. View it here: https://mirage54321.github.io/RoboLens/ P.S. For right now there are 3 notifications that send for iOS I plan to change that though!
Devlog #12 -> Part 3 of 5 Okay, actual 4th app time: Team Stats & Match Center (internally I’ve just been calling it “match” in the code, so if you dig around the file names that’s why). I started by mocking everything out before touching any real API, just so I could get the UI feeling right first. Made an intro screen (basically pitching the three features: match alerts, team stats, matchup simulator) and a fake mockTeams list with made-up EPA numbers just so I had something to look at while building. Once the layout felt right, I started swapping the fake data for real stuff from The Blue Alliance’s API, proxied through my backend the same way I already had set up for the FRC Events API (so I’m not spamming TBA directly from a bunch of client apps and to keep my API key private). Architecture-wise, I did something different from my other three apps: instead of passing state down through a million constructor params, I made a MatchDataController (basically one class holding all the team/event/match data + loading state) and wrapped the whole feature in a MatchScope, which is just an InheritedNotifier. So anywhere in the match center I can just call MatchScope.of(context) and get the controller without threading it through every single widget. Probably overkill for how big this feature ended up being, but once I had 4 tabs and a handful of sub-screens all needing the same data, I was really glad I did it this way instead of my usual pass-everything-into-the-constructor approach. Speaking of tabs, I split it into 4: My Team -> your team’s own info/next match Stats -> a season-wide “World Rating” I calculate from aggregating TBA’s OPR data across events (this was its own whole thing, might do a separate devlog on it someday) Events -> browse every FRC event, filter by time or location, see who’s live right now Sim -> the matchup simulator I keep promising Getting match data to actually parse right from TBA’s JSON took a minute (comp levels like qm/qf/sf/f needed their own label logic, predicted_time vs actual_time needed fallback logic since actual_time barely ever gets posted until after the match is already over, that kind of thing) but nothing too crazy, just tedious model-writing. Devlog #13 is basically a straight continuation of this one, mostly bug stories and the simulator, so be ready for that. View it here: https://mirage54321.github.io/RoboLens/
Devlog #13 -> Part 4 of 5 Continuing from #12: more on the match center, mostly the stuff that actually broke on me. Biggest bug of the bunch: on the Events tab, tapping into an event was supposed to show “scheduled to attend” info and the competing teams list, but both of those sections would just spin forever, no error, nothing. I assumed it was a network timing issue at first and went down a whole rabbit hole adding timeouts and retry logic that did absolutely nothing. Turns out the actual problem was way dumber: when I pushed the EventDetailScreen with Navigator.push, that screen gets placed in the Overlay as a sibling of the tab tree, not a child of it, meaning it’s NOT under my MatchScope anymore. So the second that screen tried to call MatchScope.of(context), it threw an assertion error immediately, before initState even got the chance to call setState and load anything. The spinner wasn’t stuck because of a slow network, it was stuck because the load call never even ran. Fixed it by just re-wrapping the pushed route in its own MatchScope using the same controller instance. Felt very silly once I found it, but also weirdly satisfying to finally understand. Next was the matchup simulator and win probabilities. On the schedule screen I show a rough “Red 45% / Blue 55%” prediction for each match. My first instinct was to use each event’s own OPR for this, but that falls apart for upcoming events since OPR doesn’t exist until a team has actually played a match there. So instead I based predictions on the season-wide World Rating from the Stats tab (average points across every event a team’s played all season), which actually gives predictions even for a event that hasn’t started yet. Also went back and hooked the push notification bell (from devlog #11) directly into the match center’s top bar now that there’s finally a “your team” + “your event” to actually attach a subscription to. There’s a little pulsing glow animation on the bell the first time you land on a screen where you could enable alerts, just so people notice it’s there instead of it blending into the top bar. Took way too many attempts to get the glow animation timing feeling smooth and not epileptic-seizure-inducing, but I think I landed on something decent. Genuinely didn’t expect the 4th app to take this many devlogs but here we are. One more to wrap up some small stuff and then I think I’m caught up! View it here: https://mirage54321.github.io/RoboLens/
Devlog #14 -> Part 5 of 5 Finally! This final devlog is about the small tweaks I made in the app. I made it have a new photo Small one, just swapped out one of the app’s images for something more current since the old one was from way back in devlog #1 and didn’t really represent what the app looks like anymore. Nothing technical here, just housekeeping. It kinda works offline I say “kinda” because this isn’t a real offline mode where you can browse cached data with no internet, it’s more like the app now knows when it’s offline and fails fast instead of just hanging. Basically, I added a ConnectivityCheck helper that on web reads navigator.onLine (a free, instant, synchronous browser check for whether the device has a network interface up) so if you’re in airplane mode or your wifi is off, the AI scan screens can immediately say “can’t use this when offline” instead of sitting there for a full request timeout before failing. On native platforms there’s no real equivalent without pulling in a whole new plugin like connectivity_plus, so I just made the stub always report “online” there — an actually-offline phone still gets caught by the AI request’s own timeout/retry handling, just without the instant fail I get on web. One thing worth noting: this only checks if the device thinks it has a network connection, not whether that network actually has working internet behind it. So a wifi network that’s connected but dead will still say “online” here. That case still gets caught eventually, just the slower way through the request timeout instead of instantly. Good enough for now though, this was mostly about killing the most common case of someone trying to scan with their phone in airplane mode and just watching the app hang. I changed the load in screen Went back and reworked the loading screen from devlog #5. It’s now a plain CSS screen sitting directly in index.html instead of living inside the Flutter app itself, which means it can actually paint the instant the page loads, before Flutter has even finished downloading and booting up. That was the whole point: the old version technically only appeared once Flutter itself was far enough along to render it, so there was still a blank/white flash before it. Now there’s a little animated wordmark and spinner (the spinner’s colored arc cycles through the same colors as the logo letters) that fades out and removes itself once Flutter fires its first real frame. While I was in there I also fixed something unrelated but annoying: Flutter’s web service worker by default waits to activate a new version until every open instance of the app is fully closed, which for something people add to their home screen basically never happens naturally. So people could keep opening an old cached version of the app for a long time after I’d pushed updates. Added a bit of JS to force any newly installed service worker to skip that wait and take over immediately (reloading the page once it does), so the next time someone opens the app after I ship something, they actually get it. And that’s it, I’m all caught up! Five devlogs in one sitting was a lot, but future updates should go back to being posted as I actually build them instead of in one giant backlog dump. Current problems / what’s next: Low MongoDB storage for free account Releasing the app (onto chief delphi to get feedback)!! Making it ready to release (working on the ? and report button) Future ideas: team tracker, public chat for teams, judging/interview prep tool, callout tool, round robin generator View it here: https://mirage54321.github.io/RoboLens/
Devlog #15 -> Part 1 (still working on this one!) Finally started actually tackling the AI usage limit problem from devlog #2. Since everyone using the app shares the same free-tier Gemini key, scans would just randomly fail with no real pattern whenever enough people were hitting it at once. Started on the backend side first: instead of letting every incoming scan hit Gemini immediately, I added a little queue that only lets 2 requests be in-flight to Gemini at a time, and everything else waits its turn. Next step is getting it to actually retry instead of just failing after the wait, but that’s for the next devlog.
Devlog #16 -> Part 2, continuing from #15 Got retries working on top of the queue from last time. If Gemini comes back with a 429 (rate limited) or 503 (overloaded) instead of an actual answer, the backend now waits and tries again automatically, using exponential backoff (2s, then 4s, then 8s) instead of hammering it again right away, up to a few attempts before it actually gives up and reports failure. It also checks for a retry-after header first and uses that instead of the backoff timer if Gemini actually tells us how long to wait. Then I mirrored the same idea on the Flutter side, so if the backend’s retries still aren’t enough, the app itself will retry the whole request a couple more times before showing the user an error.
Devlog #17 -> Part 3, wrapping this one up Last piece was making the retrying actually visible instead of just quietly happening in the background. Before, if a scan was retrying you’d just stare at a spinner with no idea what was going on. Now the loading screen updates to say something like “High demand. Retrying (2/3)…” so people know the app hasn’t frozen, it’s just waiting its turn. Between the queueing, the backoff retries on both ends, and this messaging, this should turn a lot of what used to be “scan failed, try again” moments into just a few extra seconds of waiting instead. Doesn’t make the free tier limit go away entirely, but it’s a big improvement over what I had. Current problems / what’s next: Low MongoDB storage for free account Professionalizing (before putting on Chief Delphi)
Devlog #18 -> Okay, super short devlog just to explain what I am doing. Basically all my hours are spent on fixing the notifications. It is super annoying right now because I am trying to finalize my project and the notifications randomly stop working. I tried clearing out mongoDB and checking on my cron-job and those seem to be working just fine. I’m not sure what to do. I pushed the hours up (for the practice day so I can check it earlier) and redeployed with Render. I shall see tomorrow if it works. View it here: https://mirage54321.github.io/RoboLens/
Devlog #19 -> I know I just committed a bunch the last few days. I guess I realized there is only a few days left and I found how to be way more efficent in getting hours. If I just keep this open and something else on another computer and work with them kinda being different windows then I get a lot more time because the switching of windows in the same computer made me keep forgetting to come back and work on the project (and I’m guessing was cutting the time too). Anywho! The most recent changes I have made is removing the ? mark button. I think I was going for a like “about me” thing but I think it was a little redundant and kind of unneccessary to say the least. I added a report button instead (it’s just in the home page). I got this idea from lovable which was something I worked with during my internship. I highkey have been working so much on this project (you can see by all my hours) that I didn’t want to connect it to the backend. It is just a popout that takes you to an gmail link and you can click send. Maybe if I run out of ideas I can add it as a backend. Now, if I am going to be so honest. I have worked a lot on this project and I want to ship but I also want to just crank out some more hours. I’m extremely proud of this project and I need to get it out to the world so that I can get some users! My issues to work on are: Low MongoDB storage for free account Professionalizing (now just looking back over and seeing if there is anything I wanna fix before putting on chief delphi) View it here: https://mirage54321.github.io/RoboLens/
Notifications are working again! Basically, the rebuilding of Render helped fix the issue which is kind of ragebait. I’m getting a little nervous though because I wonder what happens if someone doesn’t reopen the bookmark (because that is how it resets). Would they still get the messages? Will it update automatically? Overall, it works great. I just worry there may be an error that arises (that is a risk with any project honestly). View it here: https://mirage54321.github.io/RoboLens/
Updates!!! Basically, I’ve been checking to see how many users and views I have. I have google analytics on my project to keep an eye on it. Right now I have 52 users and 163 views. Which honestly, I am pretty dang happy about. (1) I haven’t really been advertising (2) I literally thought it was gonna be like 20 views Woop woop! Okay, now on these past few days I have been working on getting as many hours as possible. I don’t have a personal computer so I am really aiming for literally any of the laptops. Now, programatically I have been working on removing the 3 burst messages for iPhone (it wouldn’t compact itself on the Apple homescreen). FYI: 90% of the time for this was spent removing the 3 burst messages for iPhone and writing Ship #2… so you better be ready for Ship 2! View it here: https://mirage54321.github.io/RoboLens/
Devlog #22 -> I was looking at the comments people left me from my ship and the first thing I noticed that I should work on is the load-in page. It is definitely kind of plain. To be honest, I used Claude to help a lot with this one. Making the spinning circle was pretty easy but I had some complex ideas I wanted to put to work and I just didn’t know how to do it. It has a huge radar that has the colors pop up and says “scounting __ teams”. Overall, I am so happy about this new design! Let me know what you guys think! I also added a folder for the photos so it looks more organized! The next thing I plan to work on “loop crashes if the camera disconnects” comment. Live app: https://mirage54321.github.io/RoboLens/
Devlog #23 -> Fixed the camera disconnect crash from the feedback. Turns out the camera plugin doesn’t actually throw an error when the hardware gets yanked mid-session, it just quietly flips an internal hasError flag and keeps going. Which is why the app was crashing somewhere random instead of failing cleanly. Nothing in my code was listening for that flag, so it just kept trying to read frames and capture photos off a dead controller. Fixed it by adding a listener that actually watches for that error state, cleans everything up, and drops the user onto a proper “Camera disconnected, try again” screen instead of freezing or throwing. Also fixed the retry logic after a failed capture so it doesn’t try to restart a stream on a controller that’s already dead. Next up: the cursor. Someone pointed that out, because every button on web just shows the default arrow. Live app: https://mirage54321.github.io/RoboLens/a
Ships:
I made an app for specifically robotics teams (although this could be used for other things too). This is still a work in progress because there is so much more I want to add. I did this project so that I could make something with an AI model and I’m really proud of myself because Flutter was really hard to work with!
What did I make? Since Ship #1, RoboLens grew from one AI scanner into four connected tools. I added a rules checker that reads the actual FRC game manual (2024–2026) alongside your robot photo so it’s grounded in real rules instead of guessing. I built out a full shared battery tracker. I added a guided camera that walks you through lighting/tilt/framing and auto-captures once the angle looks right. And the biggest addition: a Team Stats & Match Center with four tabs (My Team, Stats, Events, Sim) pulling live data from The Blue Alliance and the FRC Events API, including a season-wide “World Rating,” a matchup simulator with win probabilities, and bookmarking teams to get real push notifications before their matches. I also spent a lot of time on stuff that doesn’t show up as a “feature” but makes the app actually usable: a queue + exponential backoff + retry system so the shared free-tier Gemini key doesn’t randomly fail scans under load, a report button that feeds recurring AI mistakes back into future scans, offline detection so scans fail fast instead of hanging, and a new instant-loading splash screen. What was challenging for me? The AI usage limits were the most persistent problem. Everyone shares one free-tier Gemini key, so scans would fail with no clear pattern whenever enough people hit it at once. I fixed it in stages: first a queue limiting in-flight requests, then automatic retries with backoff (and respecting the retry-after header when Gemini gave one), then finally surfacing that retry status to the user (“High demand. Retrying (2/3)…”) instead of just showing a dead spinner. The guided camera and push notifications both turned into whole rabbit holes of browser-specific pain (iOS Safari blocking camera/notification permissions unless triggered by a direct tap, no live frame streaming on web so I had to build a custom JS-interop layer from scratch, and push not working on iOS at all unless the site’s added to the home screen firs)t. My favorite bug story: the Match Center’s Events tab would spin forever with zero errors. I burned time adding timeouts and retries that did nothing before realizing the real issue. The spinner wasn’t stuck waiting on the network, it was stuck because nothing ever tried. What am I the most proud of? Going from a single-purpose AI scanner to four genuinely useful, connected tools without the codebase turning into spaghetti. I’m also proud that scans now degrade gracefully under load instead of just failing, and that notifications work reliably even though I had zero experience with service workers or VAPID keys before this. And honestly, just sticking with it. 21 devlogs and three months of real iteration based on actual user feedback instead of giving up. What should people know so they can test your project? Live app: https://mirage54321.github.io/RoboLens/ You can log in as a guest for team 4388 to browse batteries without needing an account. Push notifications currently work reliably on desktop browsers and Android (iOS Safari requires the site to be added to your home screen as a bookmark). You can test this by logging into -4388 (Yes, a negative. I needed a number that wouldn’t have a real team). The AI scan/rules tools need a robot photo to test against; if you don’t have one handy, any well-lit photo of mechanical/electrical components will still show you how the flow works....
|
1793768130.857615
|
1794632130.857615
|
|
10759
|
My Mini Pad by @florian | Stardance
|
florian
|
1
|
0.25
|
2
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-08T16:36:40Z", "hours": 0.0, "multiplier": 5.0, "payout": 2, "blessing": "neutral", "text": "This is my first time making something like this completely on my own. I gave it my best shot and followed the tutorial. I even added an extra key to the design. I hope everything looks good, but if not, I’d love to get some constructive criticism and a few tips on how to improve. The link pinned by the tutorial did not work so they said I should ship the project. That is why I dont have many photos.", "repo": "https://github.com/KingFlol/King_Flols_Macro_Board", "demo": ""}]...
|
[{"post_id": 5585, "ts": "2026 [{"post_id": 5585, "ts": "2026-06-09T13:11:09Z", "hours": 0.2539, "text": "I now have an Example link where you could download all the assets to recreate the project"}, {"post_id": 4959, "ts": "2026-06-08T16:26:29Z", "hours": 0.3136, "text": "I have now finished the tutorial and looking forward to continue the project"}]...
|
Title: My Mini Pad by @florian | Stardance
Devlog Title: My Mini Pad by @florian | Stardance
Devlogs:
I have now finished the tutorial and looking forward to continue the project
I now have an Example link where you could download all the assets to recreate the project
Ships:
This is my first time making something like this completely on my own. I gave it my best shot and followed the tutorial. I even added an extra key to the design. I hope everything looks good, but if not, I’d love to get some constructive criticism and a few tips on how to improve. The link pinned by the tutorial did not work so they said I should ship the project. That is why I dont have many photos....
|
1793768127.3530734
|
1794632127.3530734
|
|
32101
|
jarvis ai assistant by @yehudagusovsky | Stardance
|
yehudagusovsky
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: jarvis ai assistant by @yehudagusovsky | St Title: jarvis ai assistant by @yehudagusovsky | Stardance...
|
1793768126.472327
|
1794372926.472327
|
|
58343
|
Liquid-Simulation by @Dasher280I | Stardance
|
Dasher280I
|
1
|
24.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-10T14:17:45Z", "hours": 24.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This project is an interactive 2D fluid simulation built with HTML5 and vanilla JavaScript. Users can interact with the canvas by clicking, dragging, or touching to paint dynamic, swirling ink patterns while background particles react to the underlying velocity fields. It features a sleek, expandable settings menu styled with CSS frosted-glass effects, allowing users to customize stroke width, dissipation duration, brightness, and color themes—such as cyan, purple, green, orange, pink, or white—in real time. Programmatically, the simulation is driven by a grid-based Navier-Stokes physics engine that handles diffusion, advection, and pressure projection, rendering efficient pixel data via an offscreen canvas. Cross-platform usability is supported through pointer events paired with CSS rules that prevent unwanted mobile scrolling and block unintended drawing when interacting with the sidebar controls. A key technical challenge addressed during development was preventing the mathematical simulation from breaking or destabilizing under extremely fast inputs or overlapping forces, which was solved by implementing conditional logic that evaluates and updates maximum density increments rather than allowing runaway value accumulation.", "repo": "https://github.com/Slasher22880011/liquid-simulator", "demo": "https://slasher22880011.github.io/liquid-simulator/"}]...
|
[{"post_id": 65376, "ts": "202 [{"post_id": 65376, "ts": "2026-09-10T14:03:15Z", "hours": 6.1764, "text": "The latest update to the fluid simulation introduces a fully interactive settings menu to give users real-time control over the visual output. A new toggle button opens a sliding sidebar menu. Inside this sidebar, a series of range sliders allows users to dynamically adjust the fluid’s stroke width, the duration before it dissipates, and its overall brightness. Furthermore, a dropdown menu was integrated to let users switch the fluid color between cyan, purple, green, orange, pink, and white."}, {"post_id": 64249, "ts": "2026-09-08T14:45:17Z", "hours": 5.3208, "text": "To eliminate the harsh pixelation caused by rendering low-resolution grid cells directly to the main display, the rendering pipeline was updated to use an offscreen canvas matching the exact simulation grid dimensions. Fluid density values are now written directly into an ImageData pixel buffer on this offscreen canvas. When drawing to the screen, the offscreen canvas is scaled up with high-quality bilinear interpolation enabled (imageSmoothingEnabled = true), seamlessly blending the pixel boundaries. This achieves a smooth, continuous fluid flow with soft gradients without impacting the performance of the underlying physics simulation."}, {"post_id": 63512, "ts": "2026-09-07T12:40:47Z", "hours": 5.8981, "text": "Things are starting to get interesting! I spent the last few hours adding a velocity vector field to the grid. Now, instead of just bleeding outward uniformly, the dye actually gets carried by the current. I had to wrap my head around advection, which took some debugging, but mapping the mouse movement to generate directional forces totally changed the feel. When you drag the cursor, it pushes the fluid around, creating these cool, swirling patterns. It’s still just grid-based colors, but it finally behaves like a real liquid. Can’t wait to drop actual particles into this current!"}, {"post_id": 63090, "ts": "2026-09-06T18:03:57Z", "hours": 6.3775, "text": "Just kicked off my new fluid simulation project for Stardance! Today, I got the absolute basics running. I set up the HTML canvas and built a 2D grid array to handle the underlying math. It’s pretty barebones right now—just clicking and dragging the mouse to inject some neon color into the cells. I implemented a simple diffusion algorithm, so the colors spread out to neighboring cells and slowly fade away over time. It looks a bit blocky because of the low resolution, but it’s super satisfying to see the arrays updating correctly. Next up: adding actual fluid movement!"}]...
|
Title: Liquid-Simulation by @Dasher280I | Stardanc Title: Liquid-Simulation by @Dasher280I | Stardance
Devlogs:
Just kicked off my new fluid simulation project for Stardance! Today, I got the absolute basics running. I set up the HTML canvas and built a 2D grid array to handle the underlying math. It’s pretty barebones right now—just clicking and dragging the mouse to inject some neon color into the cells. I implemented a simple diffusion algorithm, so the colors spread out to neighboring cells and slowly fade away over time. It looks a bit blocky because of the low resolution, but it’s super satisfying to see the arrays updating correctly. Next up: adding actual fluid movement!
Things are starting to get interesting! I spent the last few hours adding a velocity vector field to the grid. Now, instead of just bleeding outward uniformly, the dye actually gets carried by the current. I had to wrap my head around advection, which took some debugging, but mapping the mouse movement to generate directional forces totally changed the feel. When you drag the cursor, it pushes the fluid around, creating these cool, swirling patterns. It’s still just grid-based colors, but it finally behaves like a real liquid. Can’t wait to drop actual particles into this current!
To eliminate the harsh pixelation caused by rendering low-resolution grid cells directly to the main display, the rendering pipeline was updated to use an offscreen canvas matching the exact simulation grid dimensions. Fluid density values are now written directly into an ImageData pixel buffer on this offscreen canvas. When drawing to the screen, the offscreen canvas is scaled up with high-quality bilinear interpolation enabled (imageSmoothingEnabled = true), seamlessly blending the pixel boundaries. This achieves a smooth, continuous fluid flow with soft gradients without impacting the performance of the underlying physics simulation.
The latest update to the fluid simulation introduces a fully interactive settings menu to give users real-time control over the visual output. A new toggle button opens a sliding sidebar menu. Inside this sidebar, a series of range sliders allows users to dynamically adjust the fluid’s stroke width, the duration before it dissipates, and its overall brightness. Furthermore, a dropdown menu was integrated to let users switch the fluid color between cyan, purple, green, orange, pink, and white.
Ships:
This project is an interactive 2D fluid simulation built with HTML5 and vanilla JavaScript. Users can interact with the canvas by clicking, dragging, or touching to paint dynamic, swirling ink patterns while background particles react to the underlying velocity fields. It features a sleek, expandable settings menu styled with CSS frosted-glass effects, allowing users to customize stroke width, dissipation duration, brightness, and color themes—such as cyan, purple, green, orange, pink, or white—in real time. Programmatically, the simulation is driven by a grid-based Navier-Stokes physics engine that handles diffusion, advection, and pressure projection, rendering efficient pixel data via an offscreen canvas. Cross-platform usability is supported through pointer events paired with CSS rules that prevent unwanted mobile scrolling and block unintended drawing when interacting with the sidebar controls. A key technical challenge addressed during development was preventing the mathematical simulation from breaking or destabilizing under extremely fast inputs or overlapping forces, which was solved by implementing conditional logic that evaluates and updates maximum density increments rather than allowing runaway value accumulation....
|
1793768125.6189697
|
1794632125.6189697
|
|
58331
|
ESP32-PNA by @vasilije | Stardance
|
vasilije
|
1
|
7.17
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-08T09:33:13Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "ESP32 PNA ( Pocket Network Analyser) is a handheld device that lets you scan nearby Wi-Fi networks, discover BLE devices, and detect activity across the 2.4 GHz band. This uses a 0.96-inch OLED and 4 buttons for controls. It responds well, captures all the signals well, and most of all looks super cool. In the next few days Ill upload a KiCAD schematic, PCB and a DXF file for the enclosure that will probably be laser cut", "repo": "https://github.com/VMechLAB/ESP32_PNA", "demo": "https://github.com/VMechLAB/ESP32_PNA/releases/tag/V1.0"}]...
|
[{"post_id": 64111, "ts": "202 [{"post_id": 64111, "ts": "2026-09-08T09:43:17Z", "hours": 2.1736, "text": "V1.1 is on GitHub now and I forgot to post a devlog before shipping the project 🤦♂️. But ok, everything is still uploaded and ready to use. Hope you have fun using the project as much as I had making it."}, {"post_id": 63773, "ts": "2026-09-07T18:47:56Z", "hours": 0.8608, "text": "Put up a RELEASE V1.0 FINALLY, but there’s a lot to fix in the project. Love how this project has finally brought me back to my hardware side; I’ve been into software for too long, and I miss building stuff. Also, should I say this is a Hardware of a Software project? I guess a mix of both worlds."}, {"post_id": 63558, "ts": "2026-09-07T14:01:16Z", "hours": 2.0672, "text": "Been fixing the code alot. It had a crazy amount of errors but now it works very well. Will do some more fixing and then posting it"}, {"post_id": 63464, "ts": "2026-09-07T10:24:06Z", "hours": 1.7564, "text": "Fixed ALOT of errors and nowwwww finally going to start debugging the hardware YAY so happy. But its gonna be worth it hopefully"}, {"post_id": 61765, "ts": "2026-09-04T20:32:58Z", "hours": 0.5542, "text": "Just started on it. Soon enough Ill relese the CAD files and Schematic. Just thinking what software to make it in either gonna be in KiCAD or smrth similar. It is quite simple to connect tbh"}]...
|
Title: ESP32-PNA by @vasilije | Stardance
Devlogs Title: ESP32-PNA by @vasilije | Stardance
Devlogs:
Just started on it. Soon enough Ill relese the CAD files and Schematic. Just thinking what software to make it in either gonna be in KiCAD or smrth similar. It is quite simple to connect tbh
Fixed ALOT of errors and nowwwww finally going to start debugging the hardware YAY so happy. But its gonna be worth it hopefully
Been fixing the code alot. It had a crazy amount of errors but now it works very well. Will do some more fixing and then posting it
Put up a RELEASE V1.0 FINALLY, but there’s a lot to fix in the project. Love how this project has finally brought me back to my hardware side; I’ve been into software for too long, and I miss building stuff. Also, should I say this is a Hardware of a Software project? I guess a mix of both worlds.
V1.1 is on GitHub now and I forgot to post a devlog before shipping the project 🤦♂️. But ok, everything is still uploaded and ready to use. Hope you have fun using the project as much as I had making it.
Ships:
ESP32 PNA ( Pocket Network Analyser) is a handheld device that lets you scan nearby Wi-Fi networks, discover BLE devices, and detect activity across the 2.4 GHz band. This uses a 0.96-inch OLED and 4 buttons for controls. It responds well, captures all the signals well, and most of all looks super cool. In the next few days Ill upload a KiCAD schematic, PCB and a DXF file for the enclosure that will probably be laser cut...
|
1793768124.7712615
|
1794632124.7712615
|
|
55609
|
personal_portfolio by @Mando328 | Stardance
|
Mando328
|
2
|
15.0
|
36
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-22T15:56:16Z", "hours": 10.0, "multiplier": 3.45, "payout": 36, "blessing": "neutral", "text": "Added a ton of features and polished it all up. I am very happy with this project. I learnd a lot during it and i just have fun. I can always develop it in fututre once I learn new things.", "repo": "https://github.com/Mando328/personalportfolio_os", "demo": "https://mando328.github.io/personalportfolio_os/"}, {"ship_num": 2, "ts": "2026-09-02T15:34:45Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "FIRST VERSION FINALLY READY!!! I am very proud of myself beacuse it is my very first finished fully shipped project. I always lacked the self control to ship a project, and I have started many. I am very very happy with how it turned out, but i plan on working and polishing it until the next ship. I also very like the asthetics, beacuse it leads me to old internet times (which I am probably too young to remember). The most challenging part was once again the self control, but I managed to make it work! I am very very happy.", "repo": "https://github.com/Mando328/personalportfolio_os", "demo": "https://mando328.github.io/personalportfolio_os/"}]...
|
[{"post_id": 72277, "ts": "202 [{"post_id": 72277, "ts": "2026-09-22T15:53:51Z", "hours": 1.2444, "text": "finished the project. tried to add a calculator but gave up. fixed last bugs and i will be shipping rn"}, {"post_id": 67311, "ts": "2026-09-13T11:47:34Z", "hours": 0.8606, "text": "added a function to save window position and state between sessions"}, {"post_id": 66837, "ts": "2026-09-12T19:10:02Z", "hours": 1.4089, "text": "Added a music player and fixed some bugs. It tbh mostly code copied from medium and repurposed for my use. I am pretty happy with how it turned out, but once again I used ai for debbuging which i am not proud of. Next i plan to add a konami code"}, {"post_id": 64304, "ts": "2026-09-08T16:21:43Z", "hours": 1.2106, "text": "added this simple function to optimize the window opening. I am mad at myself i have not coded it right on the start. I had this weird bug where after commiting to gh parts of the function got deleted and the code got corrupted, so i reverted to previous version and wrote the optimalization de novo. I will be working on improving the code further"}, {"post_id": 63569, "ts": "2026-09-07T14:18:25Z", "hours": 2.5175, "text": "added fractals window. It dynamicly generates greyscale fractals from julia set. It was some pretty advanced math for me and a first time doing smth like that, so god bless @polytroper for his tutorial on this matter. It unfortunatly was not very good suited for usage in this type of windows, so i had to change it quite a bit. I also used ai for optimalization of the code beacuse it ran in like 2 frames per second. Next i want to implement a music player."}, {"post_id": 61109, "ts": "2026-09-03T20:42:22Z", "hours": 1.705, "text": "Added NASA astronomy picture of the day. It was VERY hard for me since it was my first time working with API. I am very very happy it turned out to work good. I had to use some copilot for explaining the concepts and stuff but I wrote the code. Tommorow I will create a small app where I will put in all my certificates and achivments (currently 3 lol). Goodnight Btw should i go with 2 column or 1 column layout of the icons(the ones on the left)"}, {"post_id": 60985, "ts": "2026-09-03T17:51:42Z", "hours": 0.455, "text": "added nice project window where you can scroll the gallery and click to get to github. (I am also showcasing the new social media buttons)"}, {"post_id": 60895, "ts": "2026-09-03T15:28:53Z", "hours": 0.9328, "text": "I made the notes window more fitting for the theme, also added reddit dc and github link in the personal tab and added an icon for the next window"}, {"post_id": 60275, "ts": "2026-09-02T15:27:32Z", "hours": 0.7606, "text": "So i added a notes function with memory that persist between site openings and polished everything up for shipping!"}, {"post_id": 57971, "ts": "2026-08-30T09:35:41Z", "hours": 1.2786, "text": "So i added new window with some personal info and a nice scrollable gallery that i stole from the internet. I had to use a lil bit of copilot for debugging beacuse i could not get window opening and image sizing to work. I am not proud of it but its a tool like any other isnt it? Next I plan on adding more advanced app like a music one and ship the project for the first time so I can already track the time towards more stardust than the set payout amount."}, {"post_id": 57678, "ts": "2026-08-29T22:15:21Z", "hours": 0.6539, "text": "added a div for the rest of the icons, those ones are just placeholders for now. I also created some css classes to improve the code readibility, but I still think it is very very bad."}, {"post_id": 57252, "ts": "2026-08-29T11:16:03Z", "hours": 1.5653, "text": "So today I am omw to my aunt’s birthday, so I wrote some code in the car. I added the clock, expanded the text in the welcome window, added some styling and made the windows draggable. I am very very proud of myself tbh, beacuse i never used js"}, {"post_id": 56930, "ts": "2026-08-28T23:12:46Z", "hours": 0.9286, "text": "Starting the basics, organizing file structure and starting with html and css. I was able to create a pretty nice starting page i guess. I am trying to go with kind of windows xp look with the icons, i like the retro vibe. I think i will add a little bit tommorow."}]...
|
Title: personal_portfolio by @Mando328 | Stardance Title: personal_portfolio by @Mando328 | Stardance
Devlogs:
Starting the basics, organizing file structure and starting with html and css. I was able to create a pretty nice starting page i guess. I am trying to go with kind of windows xp look with the icons, i like the retro vibe. I think i will add a little bit tommorow.
So today I am omw to my aunt’s birthday, so I wrote some code in the car. I added the clock, expanded the text in the welcome window, added some styling and made the windows draggable. I am very very proud of myself tbh, beacuse i never used js
added a div for the rest of the icons, those ones are just placeholders for now. I also created some css classes to improve the code readibility, but I still think it is very very bad.
So i added new window with some personal info and a nice scrollable gallery that i stole from the internet. I had to use a lil bit of copilot for debugging beacuse i could not get window opening and image sizing to work. I am not proud of it but its a tool like any other isnt it? Next I plan on adding more advanced app like a music one and ship the project for the first time so I can already track the time towards more stardust than the set payout amount.
So i added a notes function with memory that persist between site openings and polished everything up for shipping!
I made the notes window more fitting for the theme, also added reddit dc and github link in the personal tab and added an icon for the next window
added nice project window where you can scroll the gallery and click to get to github. (I am also showcasing the new social media buttons)
Added NASA astronomy picture of the day. It was VERY hard for me since it was my first time working with API. I am very very happy it turned out to work good. I had to use some copilot for explaining the concepts and stuff but I wrote the code. Tommorow I will create a small app where I will put in all my certificates and achivments (currently 3 lol). Goodnight Btw should i go with 2 column or 1 column layout of the icons(the ones on the left)
added fractals window. It dynamicly generates greyscale fractals from julia set. It was some pretty advanced math for me and a first time doing smth like that, so god bless @polytroper for his tutorial on this matter. It unfortunatly was not very good suited for usage in this type of windows, so i had to change it quite a bit. I also used ai for optimalization of the code beacuse it ran in like 2 frames per second. Next i want to implement a music player.
added this simple function to optimize the window opening. I am mad at myself i have not coded it right on the start. I had this weird bug where after commiting to gh parts of the function got deleted and the code got corrupted, so i reverted to previous version and wrote the optimalization de novo. I will be working on improving the code further
Added a music player and fixed some bugs. It tbh mostly code copied from medium and repurposed for my use. I am pretty happy with how it turned out, but once again I used ai for debbuging which i am not proud of. Next i plan to add a konami code
added a function to save window position and state between sessions
finished the project. tried to add a calculator but gave up. fixed last bugs and i will be shipping rn
Ships:
FIRST VERSION FINALLY READY!!! I am very proud of myself beacuse it is my very first finished fully shipped project. I always lacked the self control to ship a project, and I have started many. I am very very happy with how it turned out, but i plan on working and polishing it until the next ship. I also very like the asthetics, beacuse it leads me to old internet times (which I am probably too young to remember). The most challenging part was once again the self control, but I managed to make it work! I am very very happy.
Added a ton of features and polished it all up. I am very happy with this project. I learnd a lot during it and i just have fun. I can always develop it in fututre once I learn new things....
|
1793768123.549543
|
1793854523.549543
|
|
35663
|
My own site! by @NovaFlame | Stardance
|
NovaFlame
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @NovaFlame | Stardance
|
1793768122.648966
|
1794372922.648966
|
|
54390
|
Line Sledder by @LoginlikeLogan | Stardance
|
LoginlikeLogan
|
1
|
21.6
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-31T13:43:09Z", "hours": 19.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So I made a fun Line Sledder Game that is pretty much a recreation of line rider. This game is pretty fun to play and I hope you guys enjoy it!", "repo": "https://github.com/Logdegret/LineSledder", "demo": "https://logdegret.github.io/LineSledder/"}]...
|
[{"post_id": 59283, "ts": "202 [{"post_id": 59283, "ts": "2026-09-01T00:03:18Z", "hours": 2.5975, "text": "Guys I had to rewrite some code since there were some formatting issues. Also i have rewrote the read me"}, {"post_id": 58854, "ts": "2026-08-31T13:07:49Z", "hours": 1.3683, "text": "Here is the final product!! Ive added mutli sledder and more modes!"}, {"post_id": 58506, "ts": "2026-08-30T22:46:59Z", "hours": 1.8267, "text": "Here is our new savior!!! We have a more detailed character and better physics!!"}, {"post_id": 58422, "ts": "2026-08-30T20:38:38Z", "hours": 2.2817, "text": "I added a pre scene and music to the game. I will make the game look more cartoony!!"}, {"post_id": 58201, "ts": "2026-08-30T15:42:41Z", "hours": 2.305, "text": "I made a loading screen for the game and moved time controls to the bottom"}, {"post_id": 57470, "ts": "2026-08-29T16:59:26Z", "hours": 0.5258, "text": "Ive added physics to the character!"}, {"post_id": 56997, "ts": "2026-08-29T02:04:59Z", "hours": 0.7667, "text": "This will probably be the last part before i get into the graphical side of things! I added record function to it. Stay Tuned!!"}, {"post_id": 56905, "ts": "2026-08-28T22:24:38Z", "hours": 3.0747, "text": "I have been working super duper hard lately trying to get as many hours in as possible. Here is the result so far: Ive added more functions to time and save/load tracks. Hopefully i can get to the graphical side of things soon!"}, {"post_id": 56671, "ts": "2026-08-28T15:05:27Z", "hours": 6.5317, "text": "So I worked really hard last night to get a prototype running of line sledder. Its literally just line rider but you can add music to beat sync it. What do you guys think?"}]...
|
Title: Line Sledder by @LoginlikeLogan | Stardance Title: Line Sledder by @LoginlikeLogan | Stardance
Devlogs:
So I worked really hard last night to get a prototype running of line sledder. Its literally just line rider but you can add music to beat sync it. What do you guys think?
I have been working super duper hard lately trying to get as many hours in as possible. Here is the result so far: Ive added more functions to time and save/load tracks. Hopefully i can get to the graphical side of things soon!
This will probably be the last part before i get into the graphical side of things! I added record function to it. Stay Tuned!!
Ive added physics to the character!
I made a loading screen for the game and moved time controls to the bottom
I added a pre scene and music to the game. I will make the game look more cartoony!!
Here is our new savior!!! We have a more detailed character and better physics!!
Here is the final product!! Ive added mutli sledder and more modes!
Guys I had to rewrite some code since there were some formatting issues. Also i have rewrote the read me
Ships:
So I made a fun Line Sledder Game that is pretty much a recreation of line rider. This game is pretty fun to play and I hope you guys enjoy it!...
|
1793768121.7833834
|
1794632121.7833834
|
|
963
|
CLADES by @onyxtheone | Stardance
|
onyxtheone
|
1
|
14.46
|
262
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-02T21:06:45Z", "hours": 14.0, "multiplier": 18.66, "payout": 262, "blessing": "neutral", "text": "I made a disease epidemiology simulator, and then extended it with age stratification and multiple strain support. A major challenge was figuring out the math behind it and pulling it together at each new component. I am proud to say that, as far as I know, the data is actually worthwhile and should track with reality, but I am not an epidemiologist. I made a simple site for people to check it out, and if you want to try it properly you can build from source (P.S. Its just 2 commands:))) )", "repo": "https://github.com/onyx-the-one/CLADES", "demo": "https://onyx-the-one.github.io/CLADES/clades.html"}]...
|
[{"post_id": 4887, "ts": "2026 [{"post_id": 4887, "ts": "2026-06-08T13:33:09Z", "hours": 0.4636, "text": "As advised by @Amu I made the README nicer, font bigger, and put compiled packages on github via actions."}, {"post_id": 1047, "ts": "2026-06-02T21:00:34Z", "hours": 2.1097, "text": "Fixed some text alignment, and the multistrain component giving completely wrong results. Everything actually (seemingly) works pretty well."}, {"post_id": 905, "ts": "2026-06-02T17:12:43Z", "hours": 4.3306, "text": "Worked on support for multistrain, and while it is somewhat implemented it gonna stay off main branch, theres a lot left to do with it."}, {"post_id": 515, "ts": "2026-06-02T00:07:59Z", "hours": 4.4047, "text": "I implemented age stratification as a separate mode, and will work on integrating them more closely. Very minor text alignment issues left but it is time to sleep."}, {"post_id": 309, "ts": "2026-06-01T15:57:13Z", "hours": 3.1822, "text": "I wrote the core architecture of the simulator, with almost no larger features yet but it should be functional. I have also ran into a build error and fixed it and now built successfully (with 1 error)."}]...
|
Title: CLADES by @onyxtheone | Stardance
Devlogs: Title: CLADES by @onyxtheone | Stardance
Devlogs:
I wrote the core architecture of the simulator, with almost no larger features yet but it should be functional. I have also ran into a build error and fixed it and now built successfully (with 1 error).
I implemented age stratification as a separate mode, and will work on integrating them more closely. Very minor text alignment issues left but it is time to sleep.
Worked on support for multistrain, and while it is somewhat implemented it gonna stay off main branch, theres a lot left to do with it.
Fixed some text alignment, and the multistrain component giving completely wrong results. Everything actually (seemingly) works pretty well.
As advised by @Amu I made the README nicer, font bigger, and put compiled packages on github via actions.
Ships:
I made a disease epidemiology simulator, and then extended it with age stratification and multiple strain support. A major challenge was figuring out the math behind it and pulling it together at each new component. I am proud to say that, as far as I know, the data is actually worthwhile and should track with reality, but I am not an epidemiologist. I made a simple site for people to check it out, and if you want to try it properly you can build from source (P.S. Its just 2 commands:))) )...
|
1793768120.5835369
|
1793854520.5835369
|
|
38315
|
WarioHack by @Dasher2801 | Stardance
|
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-24T14:56:10Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "WarioHack is an arcade-style indie game developed within the Godot Engine for the Hack Club Stardance Challenge, blending tight platforming controls with high-stakes time management. Set against a cosmic background featuring a shifting starry galaxy, the experience challenges players to navigate platform layouts and zero-gravity environments to collect specific items before a strict countdown expires. The game operates on a structured progression loop where successful collection tasks push players forward through ascending difficulty levels, while failing to meet objectives or running out of time subtracts from a limited pool of lives and redirects the flow back through intermission screens. Under the hood, the project is powered by a robust GDScript architecture designed to avoid common runtime pitfalls like null-instance crashes and invalid node references. Rather than relying on fragile external node scripts, the core loop utilizes a self-contained runtime structure within the primary minigame script. Dynamic checks using safe node retrieval ensure that user interface elements, such as the active countdown display, update seamlessly every second without throwing errors during rapid scene transitions. Global state management tracks overall progress across multiple sessions, ensuring that cumulative minigame completions correctly dictate whether the player advances toward final completion screens or repeats the challenge cycle. This combination of responsive arcade mechanics and clean backend scripting results in a polished project that highlights both creative game design and precise technical execution.", "repo": "https://github.com/Dasher2801/WarioHack", "demo": "https://dasher2801.itch.io/wariohack"}]...
|
[{"post_id": 34032, "ts": "202 [{"post_id": 34032, "ts": "2026-07-24T13:33:44Z", "hours": 0.2731, "text": "I added a fourth minigame, where you have to click at a tomato 10 times in 4 seconds"}, {"post_id": 34005, "ts": "2026-07-24T12:18:08Z", "hours": 1.3333, "text": "For the third mini-game, I developed a simple Flappy Bird-style game. You play as the moon with legs again, and you have to dodge pickles of varying lengths."}, {"post_id": 33970, "ts": "2026-07-24T10:21:50Z", "hours": 0.3333, "text": "I designed a winning and a losing screen, both with a ‘play again’-button, wich brings you back in the main menu."}, {"post_id": 33958, "ts": "2026-07-24T09:57:08Z", "hours": 1.0208, "text": "I added a second game where you have to click on all three tomatoes within four seconds; however, I ran into a problem where only one tomato was visible, so I used AI to figure out why. The solution turned out to be quite simple: the animation file had placed all three tomatoes in the exact same spot, as that was the command defined in the file."}, {"post_id": 33417, "ts": "2026-07-23T10:43:03Z", "hours": 1.5106, "text": "I built a platformer game where you play as a moon and have to collect three tomatoes. If you don’t manage to do it within 10 seconds, you lose one of your three lives."}, {"post_id": 32969, "ts": "2026-07-22T13:56:09Z", "hours": 0.6392, "text": "After downloading Godot and setting everything up, I started programming my WarioWare-style minigames. To do this, I first created a start screen with “Start Game,” “Settings,” and “Quit” options; pressing “Quit” closes the game. Selecting “Start Game” takes you to the minigame hub, where you can see your five hearts, the current level, and a timer counting down from five. Next up is the first minigame."}]...
|
Title: WarioHack by @Dasher2801 | Stardance
Devlo Title: WarioHack by @Dasher2801 | Stardance
Devlogs:
After downloading Godot and setting everything up, I started programming my WarioWare-style minigames. To do this, I first created a start screen with “Start Game,” “Settings,” and “Quit” options; pressing “Quit” closes the game. Selecting “Start Game” takes you to the minigame hub, where you can see your five hearts, the current level, and a timer counting down from five. Next up is the first minigame.
I built a platformer game where you play as a moon and have to collect three tomatoes. If you don’t manage to do it within 10 seconds, you lose one of your three lives.
I added a second game where you have to click on all three tomatoes within four seconds; however, I ran into a problem where only one tomato was visible, so I used AI to figure out why. The solution turned out to be quite simple: the animation file had placed all three tomatoes in the exact same spot, as that was the command defined in the file.
I designed a winning and a losing screen, both with a ‘play again’-button, wich brings you back in the main menu.
For the third mini-game, I developed a simple Flappy Bird-style game. You play as the moon with legs again, and you have to dodge pickles of varying lengths.
I added a fourth minigame, where you have to click at a tomato 10 times in 4 seconds
Ships:
WarioHack is an arcade-style indie game developed within the Godot Engine for the Hack Club Stardance Challenge, blending tight platforming controls with high-stakes time management. Set against a cosmic background featuring a shifting starry galaxy, the experience challenges players to navigate platform layouts and zero-gravity environments to collect specific items before a strict countdown expires. The game operates on a structured progression loop where successful collection tasks push players forward through ascending difficulty levels, while failing to meet objectives or running out of time subtracts from a limited pool of lives and redirects the flow back through intermission screens. Under the hood, the project is powered by a robust GDScript architecture designed to avoid common runtime pitfalls like null-instance crashes and invalid node references. Rather than relying on fragile external node scripts, the core loop utilizes a self-contained runtime structure within the primary minigame script. Dynamic checks using safe node retrieval ensure that user interface elements, such as the active countdown display, update seamlessly every second without throwing errors during rapid scene transitions. Global state management tracks overall progress across multiple sessions, ensuring that cumulative minigame completions correctly dictate whether the player advances toward final completion screens or repeats the challenge cycle. This combination of responsive arcade mechanics and clean backend scripting results in a polished project that highlights both creative game design and precise technical execution....
|
1793768119.6952689
|
1793854519.6952689
|
|
40078
|
Frictionless by @dd | Stardance
|
dd
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @dd | Stardance
|
1793768118.7914426
|
1794372918.7914426
|
|
56883
|
VIE-Airport by @lukas_56376 | Stardance
|
lukas_56376
|
1
|
12.22
|
16
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-01T13:25:21Z", "hours": 8.0, "multiplier": 2.03, "payout": 16, "blessing": "neutral", "text": "VIE-Airport is a live dashboard for Vienna International Airport (VIE/LOWW). It shows real-time arrivals and departures from the official airport flight monitor, plus current METAR and TAF weather from NOAA. You can search flights, switch between arrivals, departures and airport info, and see runway wind components calculated from the live METAR. All times are in Austrian local time; the data is for information only and not for operational flight planning.", "repo": "https://github.com/Lukas-56376/VIE-Airport", "demo": "https://lukas-56376.github.io/VIE-Airport/"}]...
|
[{"post_id": 65418, "ts": "202 [{"post_id": 65418, "ts": "2026-09-10T15:25:50Z", "hours": 0.8903, "text": "Added a proper dark/light theme toggle so the board matches both the screenshots and everyday use. The preference is stored in localStorage and respects the system setting on first visit, with no flash of the wrong theme. I also cleaned up the visual hierarchy clearer table rows, better contrast on status pills, and calmer spacing around the filters — so the UI feels less busy in both modes. Took about 1 hour and makes the dashboard much more comfortable to use day or night."}, {"post_id": 60432, "ts": "2026-09-02T19:12:35Z", "hours": 0.3975, "text": "Improved the search and filtering experience based on feedback. The search field now only looks at flight number, airline and city instead of matching against status text as well. I also added a status filter (on time, delayed, landed/departed, cancelled) and sorting options by time, status or city so the board is much easier to scan. This took about 1 hour (sadly forgot to turn on Hakatime so only 22 minutes counted) , I know right and makes the list feel a lot more useful in everyday use and a small redesign to black theme (for now…) only and making it more pop style!"}, {"post_id": 59984, "ts": "2026-09-02T02:10:24Z", "hours": 0.775, "text": "Wow, again a new Design!"}, {"post_id": 59839, "ts": "2026-09-01T20:17:19Z", "hours": 2.1594, "text": "OMG, is that a new Design? Yes, it is"}, {"post_id": 59463, "ts": "2026-09-01T10:23:43Z", "hours": 8.0322, "text": "This is V1 of VIE-Airport a real time synched (via API keys) information about Vienna International Airport!"}]...
|
Title: VIE-Airport by @lukas_56376 | Stardance
De Title: VIE-Airport by @lukas_56376 | Stardance
Devlogs:
This is V1 of VIE-Airport a real time synched (via API keys) information about Vienna International Airport!
OMG, is that a new Design? Yes, it is
Wow, again a new Design!
Improved the search and filtering experience based on feedback. The search field now only looks at flight number, airline and city instead of matching against status text as well. I also added a status filter (on time, delayed, landed/departed, cancelled) and sorting options by time, status or city so the board is much easier to scan. This took about 1 hour (sadly forgot to turn on Hakatime so only 22 minutes counted) , I know right and makes the list feel a lot more useful in everyday use and a small redesign to black theme (for now…) only and making it more pop style!
Added a proper dark/light theme toggle so the board matches both the screenshots and everyday use. The preference is stored in localStorage and respects the system setting on first visit, with no flash of the wrong theme. I also cleaned up the visual hierarchy clearer table rows, better contrast on status pills, and calmer spacing around the filters — so the UI feels less busy in both modes. Took about 1 hour and makes the dashboard much more comfortable to use day or night.
Ships:
VIE-Airport is a live dashboard for Vienna International Airport (VIE/LOWW). It shows real-time arrivals and departures from the official airport flight monitor, plus current METAR and TAF weather from NOAA. You can search flights, switch between arrivals, departures and airport info, and see runway wind components calculated from the live METAR. All times are in Austrian local time; the data is for information only and not for operational flight planning....
|
1793768117.9350908
|
1794632117.9350908
|
|
9346
|
My awesome macropad! by @harlin | Stardance
|
harlin
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @harlin | Stardance
|
1793768117.035914
|
1794372917.035914
|
|
56879
|
Anims-meme by @Freaked | Stardance
|
Freaked
|
2
|
11.5
|
125
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-04T18:33:53Z", "hours": 5.0, "multiplier": 12.81, "payout": 66, "blessing": "neutral", "text": "i made this cool and cute animal meme making page and i made this because i wanted to make meme making more easy and also i have added a lot feature which was really hard to pull off and i am really proud of that i making this page juts to make the task of making new meme easier instead of using any hard over complicated tool", "repo": "https://github.com/15freaker/Anims-meme", "demo": "https://15freaker.github.io/Anims-meme/"}, {"ship_num": 2, "ts": "2026-09-01T16:56:26Z", "hours": 5.0, "multiplier": 11.64, "payout": 59, "blessing": "neutral", "text": "it was really challanges when it comes to API and all i loved how it went and it was real fun making this website i hope this will make other people happy too", "repo": "https://github.com/15freaker/Anims-meme", "demo": "https://15freaker.github.io/Anims-meme/"}]...
|
[{"post_id": 63432, "ts": "202 [{"post_id": 63432, "ts": "2026-09-07T08:46:54Z", "hours": 1.505, "text": "Devlog 11 : i have fixed all the bugs and all the changes it needed to become a better meme making page it is surely happy but its done and things i fixed in it was that cat image is not loading fast then fuctionality isnt working or isnt responsive i understood and fixed all the mistake and now it works better will see more in future and will fix it more (●’◡’●)(●’◡’●)"}, {"post_id": 61668, "ts": "2026-09-04T18:16:16Z", "hours": 2.1722, "text": "Devlog 10 : i have finally added more features and fixed all the bugs ohhh what a relief it is i am really glad and also let me tell you about features now you can have fox, dog, cat images and you can add custom images from your computer and a white bar so text wont get blended up in image (which is your choice if you want you can and if you dont just uncheck it)and i have added few more fonts and aspects ratio and some normal settings like brightness and contrast (it was really tough) and some emoji thats it for now will see what i can do it in future ✨✨"}, {"post_id": 61553, "ts": "2026-09-04T14:59:32Z", "hours": 1.1711, "text": "Devlog 9 : i have added fuctionality in it so every button works and do its work it was a pain in neck though but its finally completed and also i have added emoji fuction where people can also use emoji in their made memes if they want it was pretty tough though but its over and i am thinking of adding other features but for now its pretty awesome 🔥🔥✨✨"}, {"post_id": 61467, "ts": "2026-09-04T12:22:12Z", "hours": 0.7775, "text": "Devlog 8 : i was thinking of adding more fun features but i thought i should first add more customizable feature so it will make quality memes instead of quantity memes and i am thinking of adding more but nothing is coming in my mind rn if you have something please tell me in comment section i will be waiting ✨✨✨✨"}, {"post_id": 61324, "ts": "2026-09-04T05:39:33Z", "hours": 1.0106, "text": "Devlog 7 : i have fixed all the bugs and also added a loading screen so that it wont look like the website is freezed and i am going to add more features to it so that it will not be only cat centered but for other things too"}, {"post_id": 59695, "ts": "2026-09-01T16:50:15Z", "hours": 0.2775, "text": "Devlog 6 : completed README.md file and finally this project was real fun at last i finished it yeahhhhh ✨✨🔥🔥"}, {"post_id": 59621, "ts": "2026-09-01T15:18:40Z", "hours": 1.1211, "text": "Devlog 5: Fixed the bug and added all API needed for project and also made it look awesome filled with new feature 🤌✨"}, {"post_id": 59488, "ts": "2026-09-01T11:08:37Z", "hours": 1.02, "text": "Devlog 4: added some new features with some cool gifs and will going to fix API in place of gifs so that it can get new GIFs and new Images everytime we click and it need more polishing and fixing of bugs i am really tired of bugs 😒😒"}, {"post_id": 59454, "ts": "2026-09-01T09:59:25Z", "hours": 1.2586, "text": "Devlog 3 : i made its UI and its button works i need to add javascript now the most hard part is now starting and it was really hard to build till now but its almost done yeahhhhhh!!!!!!🔥🔥"}, {"post_id": 59192, "ts": "2026-08-31T20:51:55Z", "hours": 0.8411, "text": "#Devlog 2: completed its CSS file seems okay for now lets see how many bugs now we have to fix 🥀🥀"}, {"post_id": 59154, "ts": "2026-08-31T19:44:32Z", "hours": 0.5292, "text": "Devlog 1 : I am working so cool meme website you are gonna love it ✨i am very excited to make it and also this will gonna have a lot of features i hope everyone will love it (●’◡’●)"}]...
|
Title: Anims-meme by @Freaked | Stardance
Devlogs Title: Anims-meme by @Freaked | Stardance
Devlogs:
Devlog 1 : I am working so cool meme website you are gonna love it ✨i am very excited to make it and also this will gonna have a lot of features i hope everyone will love it (●’◡’●)
#Devlog 2: completed its CSS file seems okay for now lets see how many bugs now we have to fix 🥀🥀
Devlog 3 : i made its UI and its button works i need to add javascript now the most hard part is now starting and it was really hard to build till now but its almost done yeahhhhhh!!!!!!🔥🔥
Devlog 4: added some new features with some cool gifs and will going to fix API in place of gifs so that it can get new GIFs and new Images everytime we click and it need more polishing and fixing of bugs i am really tired of bugs 😒😒
Devlog 5: Fixed the bug and added all API needed for project and also made it look awesome filled with new feature 🤌✨
Devlog 6 : completed README.md file and finally this project was real fun at last i finished it yeahhhhh ✨✨🔥🔥
Devlog 7 : i have fixed all the bugs and also added a loading screen so that it wont look like the website is freezed and i am going to add more features to it so that it will not be only cat centered but for other things too
Devlog 8 : i was thinking of adding more fun features but i thought i should first add more customizable feature so it will make quality memes instead of quantity memes and i am thinking of adding more but nothing is coming in my mind rn if you have something please tell me in comment section i will be waiting ✨✨✨✨
Devlog 9 : i have added fuctionality in it so every button works and do its work it was a pain in neck though but its finally completed and also i have added emoji fuction where people can also use emoji in their made memes if they want it was pretty tough though but its over and i am thinking of adding other features but for now its pretty awesome 🔥🔥✨✨
Devlog 10 : i have finally added more features and fixed all the bugs ohhh what a relief it is i am really glad and also let me tell you about features now you can have fox, dog, cat images and you can add custom images from your computer and a white bar so text wont get blended up in image (which is your choice if you want you can and if you dont just uncheck it)and i have added few more fonts and aspects ratio and some normal settings like brightness and contrast (it was really tough) and some emoji thats it for now will see what i can do it in future ✨✨
Devlog 11 : i have fixed all the bugs and all the changes it needed to become a better meme making page it is surely happy but its done and things i fixed in it was that cat image is not loading fast then fuctionality isnt working or isnt responsive i understood and fixed all the mistake and now it works better will see more in future and will fix it more (●’◡’●)(●’◡’●)
Ships:
it was really challanges when it comes to API and all i loved how it went and it was real fun making this website i hope this will make other people happy too
i made this cool and cute animal meme making page and i made this because i wanted to make meme making more easy and also i have added a lot feature which was really hard to pull off and i am really proud of that i making this page juts to make the task of making new meme easier instead of using any hard over complicated tool...
|
1793768116.168409
|
1794632116.168409
|
|
39894
|
My first slack bot! by @ilfattorino | Stardance
|
ilfattorino
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-26T00:42:49Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a basic slack bot following the tutorial, work fine it has been fun, never thought about learning how to run a slack bot but i guess its nice", "repo": "https://github.com/effettot/slackbot", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354"}]...
|
[{"post_id": 34914, "ts": "202 [{"post_id": 34914, "ts": "2026-07-26T00:39:31Z", "hours": 0.2589, "text": "Devlog #1 — Slack bot Built a small Slack bot today. Kept it minimal just a few commands to start. Commands: /help — lists what the bot can do /ping — replies “pong”, quick way to check the bot’s alive /jke — tells a random joke That’s it for now."}]...
|
Title: My first slack bot! by @ilfattorino | Stard Title: My first slack bot! by @ilfattorino | Stardance
Devlogs:
Devlog #1 — Slack bot Built a small Slack bot today. Kept it minimal just a few commands to start. Commands: /help — lists what the bot can do /ping — replies “pong”, quick way to check the bot’s alive /jke — tells a random joke That’s it for now.
Ships:
I made a basic slack bot following the tutorial, work fine it has been fun, never thought about learning how to run a slack bot but i guess its nice...
|
1793768115.3094933
|
1794632115.3094933
|
|
17193
|
My first slack bot! by @saadmoosani30 | Stardance
|
saadmoosani30
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @saadmoosani30 | Sta Title: My first slack bot! by @saadmoosani30 | Stardance...
|
1793768114.4129627
|
1794372914.4129627
|
|
6549
|
Hunter Games by @LoginlikeLogan | Stardance
|
LoginlikeLogan
|
2
|
18.0
|
22
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-07T14:24:03Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "So I made a Games website to play some fun games. I went through many challenges of going through bugs and site issues. Hope you guys enjoy this site and support me!", "repo": "https://github.com/Logdegret/HunterGames", "demo": "https://logdegret.github.io/HunterGames/"}, {"ship_num": 2, "ts": "2026-06-04T00:12:29Z", "hours": 7.0, "multiplier": 15.05, "payout": 22, "blessing": "neutral", "text": "I made a game site called Hunter games that is on a github website. It is open sourced, fun, and highly addicting. I am currently still working out a few bugs but most of the games are fully playable. I did not create the games except bossbound which I used AI to make (sadly). Bossbound is still a work in progress but other than that enjoy!", "repo": "https://github.com/Logdegret/HunterGames", "demo": "https://logdegret.github.io/HunterGames/"}]...
|
[{"post_id": 21745, "ts": "202 [{"post_id": 21745, "ts": "2026-07-03T20:40:35Z", "hours": 0.7319, "text": "Site Back Up! 😁 Ive got the site back up! I think this was a github Issue but feel free to go and play some games now bc Ive added a few more new games that are pretty addicting! Btw these are NOT all of the games"}, {"post_id": 20928, "ts": "2026-07-02T17:31:09Z", "hours": 1.115, "text": "SOOOO many bugs! this is horrible! there is so many deployment bugs that need to be fixed which might be githubs fault since it might be down rn, so I might try agian tomorrow"}, {"post_id": 20262, "ts": "2026-07-01T20:11:48Z", "hours": 0.5294, "text": "Added two more games and will be done pretty soon! Check it out I added two more games, Google doodle baseball and 3 slices to the website!"}, {"post_id": 16037, "ts": "2026-06-26T01:35:52Z", "hours": 1.0981, "text": "Missing games fixed!"}, {"post_id": 14383, "ts": "2026-06-23T14:27:39Z", "hours": 0.6692, "text": "Fixing spacing issues and added OvO"}, {"post_id": 11954, "ts": "2026-06-19T14:47:19Z", "hours": 1.5383, "text": "I added a new logo and created a dev mode to add games, bugs though need to be fixed…"}, {"post_id": 5562, "ts": "2026-06-09T12:02:29Z", "hours": 5.205, "text": "Complete rework! Added friends list, and stats!😙"}, {"post_id": 1789, "ts": "2026-06-04T00:08:43Z", "hours": 0.4333, "text": "Added an opensourced golf game that was found on github. Kinda doesn’t work right now but it is a work in progress"}, {"post_id": 1770, "ts": "2026-06-03T23:21:50Z", "hours": 0.5283, "text": "Added Xp bar to home ui, There are still bugs though"}, {"post_id": 1751, "ts": "2026-06-03T22:49:43Z", "hours": 5.895, "text": "Fixing Hunter Games Bugs"}]...
|
Title: Hunter Games by @LoginlikeLogan | Stardance Title: Hunter Games by @LoginlikeLogan | Stardance
Devlogs:
Fixing Hunter Games Bugs
Added Xp bar to home ui, There are still bugs though
Added an opensourced golf game that was found on github. Kinda doesn’t work right now but it is a work in progress
Complete rework! Added friends list, and stats!😙
I added a new logo and created a dev mode to add games, bugs though need to be fixed…
Fixing spacing issues and added OvO
Missing games fixed!
Added two more games and will be done pretty soon! Check it out I added two more games, Google doodle baseball and 3 slices to the website!
SOOOO many bugs! this is horrible! there is so many deployment bugs that need to be fixed which might be githubs fault since it might be down rn, so I might try agian tomorrow
Site Back Up! 😁 Ive got the site back up! I think this was a github Issue but feel free to go and play some games now bc Ive added a few more new games that are pretty addicting! Btw these are NOT all of the games
Ships:
I made a game site called Hunter games that is on a github website. It is open sourced, fun, and highly addicting. I am currently still working out a few bugs but most of the games are fully playable. I did not create the games except bossbound which I used AI to make (sadly). Bossbound is still a work in progress but other than that enjoy!
So I made a Games website to play some fun games. I went through many challenges of going through bugs and site issues. Hope you guys enjoy this site and support me!...
|
1793768113.557233
|
1794632113.557233
|
|
32611
|
smth tab by @Christianlikes67_Bobbpheus | Stardanc smth tab by @Christianlikes67_Bobbpheus | Stardance...
|
Christianlikes67_Bobbpheus
|
2
|
4.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-07T15:43:20Z", "hours": 1.0, "multiplier": 1.13, "payout": 1, "blessing": "neutral", "text": "I made a basic website weak css and not that much special things but it has a clock and some buttons that send you to different websites so not that much but i originally had made another projects but then i lost most of it and needed to rework it all", "repo": "https://github.com/Christianlikes67/smth-tab", "demo": "https://christianlikes67.github.io/smth-tab/"}, {"ship_num": 2, "ts": "2026-07-10T11:13:29Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "🐱🚀 AstroCat Explorer AstroCat Explorer is a fun and interactive web app that lets you explore NASA’s Astronomy Picture of the Day (APOD) with a unique space-cat theme. Instead of creating a standard NASA gallery, this project combines space exploration, animated visuals, and a playful personality to create a more engaging experience. ✨ Features 🌌 NASA Astronomy Picture of the Day API 📅 Search for a specific date 🎲 Random Mission button 🐱 Random Space Cat facts 🏆 Mission counter ⭐ XP system with Space Cat ranks ☄️ Animated shooting stars 🪐 Floating planets 🚀 Rocket cursor 💎 Glassmorphism UI 📱 Responsive design 🎨 Custom space-themed interface ⚡ Smooth animations and transitions 🛠️ Built With HTML5 CSS3 JavaScript (ES6) NASA APOD API You can get a free API key from: https://api.nasa.gov/ 📂 Project Structure AstroCat Explorer/ │ ├── index.html ├── style.css ├── script.js └── README.md 🎮 Inspiration This project is inspired by: Space exploration Cats 🐱 Modern gaming-inspired UI NASA’s Astronomy Picture of the Day 📸 Main Features View NASA’s daily space image. Explore images from previous dates. Launch random space missions. Earn Space Cat XP as you explore. Unlock new Space Cat ranks. Enjoy animated cosmic effects. 💡 Future Improvements ❤️ Favorite missions 🎥 Support NASA APOD videos 🌍 Dark/Light mode 🔍 Search by keywords 🚀 More achievements 🔊 Optional sound effects 👨💻 Author Made with ❤️ by Christianlikes67.", "repo": "https://github.com/Christianlikes67/smth-tab", "demo": "https://christianlikes67.github.io/smth-tab/"}]...
|
[{"post_id": 27618, "ts": "202 [{"post_id": 27618, "ts": "2026-07-13T11:19:46Z", "hours": 0.4914, "text": "basically changed evrything cuz i just felt like it"}, {"post_id": 26444, "ts": "2026-07-11T07:47:05Z", "hours": 0.4128, "text": "now i fixed the css and a lot of other things"}, {"post_id": 25865, "ts": "2026-07-10T10:56:12Z", "hours": 0.3553, "text": "this is gonna take a bit longer i have ran into a problem and im now tryna fix it"}, {"post_id": 25847, "ts": "2026-07-10T10:22:28Z", "hours": 0.6558, "text": "Almost done with CSS"}, {"post_id": 25498, "ts": "2026-07-09T20:11:08Z", "hours": 0.8886, "text": "I am pretty much done with the “Moving on to JavaScript” part in the guide so i only need to COOK with CSS now"}, {"post_id": 25469, "ts": "2026-07-09T19:09:01Z", "hours": 0.3744, "text": "just finished the “Starting with HTML” part in the guide and i also finished what i wanted to do and the time i used to make it is the logged time from this devlog and the one before with the meowl img."}, {"post_id": 25394, "ts": "2026-07-09T17:34:04Z", "hours": 0.7331, "text": "I am making a cool NASA inspired facts website with cats where there is a date picker and then it finds a text from nasa about that day i couldnt get a screenshot"}, {"post_id": 24785, "ts": "2026-07-08T16:10:25Z", "hours": 0.3531, "text": "just began coding"}]...
|
Title: smth tab by @Christianlikes67_Bobbpheus | S Title: smth tab by @Christianlikes67_Bobbpheus | Stardance
Devlogs:
just began coding
I am making a cool NASA inspired facts website with cats where there is a date picker and then it finds a text from nasa about that day i couldnt get a screenshot
just finished the “Starting with HTML” part in the guide and i also finished what i wanted to do and the time i used to make it is the logged time from this devlog and the one before with the meowl img.
I am pretty much done with the “Moving on to JavaScript” part in the guide so i only need to COOK with CSS now
Almost done with CSS
this is gonna take a bit longer i have ran into a problem and im now tryna fix it
now i fixed the css and a lot of other things
basically changed evrything cuz i just felt like it
Ships:
🐱🚀 AstroCat Explorer AstroCat Explorer is a fun and interactive web app that lets you explore NASA’s Astronomy Picture of the Day (APOD) with a unique space-cat theme. Instead of creating a standard NASA gallery, this project combines space exploration, animated visuals, and a playful personality to create a more engaging experience. ✨ Features 🌌 NASA Astronomy Picture of the Day API 📅 Search for a specific date 🎲 Random Mission button 🐱 Random Space Cat facts 🏆 Mission counter ⭐ XP system with Space Cat ranks ☄️ Animated shooting stars 🪐 Floating planets 🚀 Rocket cursor 💎 Glassmorphism UI 📱 Responsive design 🎨 Custom space-themed interface ⚡ Smooth animations and transitions 🛠️ Built With HTML5 CSS3 JavaScript (ES6) NASA APOD API You can get a free API key from: https://api.nasa.gov/ 📂 Project Structure AstroCat Explorer/ │ ├── index.html ├── style.css ├── script.js └── README.md 🎮 Inspiration This project is inspired by: Space exploration Cats 🐱 Modern gaming-inspired UI NASA’s Astronomy Picture of the Day 📸 Main Features View NASA’s daily space image. Explore images from previous dates. Launch random space missions. Earn Space Cat XP as you explore. Unlock new Space Cat ranks. Enjoy animated cosmic effects. 💡 Future Improvements ❤️ Favorite missions 🎥 Support NASA APOD videos 🌍 Dark/Light mode 🔍 Search by keywords 🚀 More achievements 🔊 Optional sound effects 👨💻 Author Made with ❤️ by Christianlikes67.
I made a basic website weak css and not that much special things but it has a clock and some buttons that send you to different websites so not that much but i originally had made another projects but then i lost most of it and needed to rework it all...
|
1793768112.6705444
|
1794632112.6705444
|
|
36056
|
Doodley by @melodelete | Stardance
|
melodelete
|
1
|
5.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-24T02:35:15Z", "hours": 5.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made Doodley, A Recreation Of google’s quick draw,It helped me learn about AI Models and how far how AI Has come, You doodle and an AI Model Guesses It, It’s that simple", "repo": "https://github.com/melodelete/Doodely", "demo": "https://melodelete.github.io/Doodely/"}]...
|
[{"post_id": 33836, "ts": "202 [{"post_id": 33836, "ts": "2026-07-24T02:27:00Z", "hours": 2.5472, "text": "I finished the main game, experimented with other cool fonts, and implement Difficulty"}, {"post_id": 29853, "ts": "2026-07-17T00:23:39Z", "hours": 1.4858, "text": "Devlog #2 I finally finished the UI but the hard part is actually going to be setting up the AI and the game"}, {"post_id": 29567, "ts": "2026-07-16T16:29:12Z", "hours": 1.4211, "text": "Devlog #1 I found a nice color scheme and implemented it. I’m currently working on the UI, although it isn’t visible yet."}]...
|
Title: Doodley by @melodelete | Stardance
Devlogs Title: Doodley by @melodelete | Stardance
Devlogs:
Devlog #1 I found a nice color scheme and implemented it. I’m currently working on the UI, although it isn’t visible yet.
Devlog #2 I finally finished the UI but the hard part is actually going to be setting up the AI and the game
I finished the main game, experimented with other cool fonts, and implement Difficulty
Ships:
I made Doodley, A Recreation Of google’s quick draw,It helped me learn about AI Models and how far how AI Has come, You doodle and an AI Model Guesses It, It’s that simple...
|
1793768111.4902186
|
1793854511.4902186
|
|
31934
|
Spacxxx by @Abhishekk | Stardance
|
Abhishekk
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Spacxxx by @Abhishekk | Stardance
|
1793768110.6084092
|
1794372910.6084092
|
|
15115
|
Untitled project by @Veronica | Stardance
|
Veronica
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled project by @Veronica | Stardance
|
1793768109.7428517
|
1794372909.7428517
|
|
29246
|
Cozy Bloom by @juhi | Stardance
|
juhi
|
1
|
10.0
|
178
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-01T09:40:23Z", "hours": 10.0, "multiplier": 17.79, "payout": 178, "blessing": "neutral", "text": "I created Cozy Bloom, a game where you grow flowers at night. You plant seeds, give them water. Watch your garden grow. I wanted to make something calm that anyone can play in a minutes. The best part was making the flowers grow and the animations smooth. I like how peaceful the game feels. To try it out you can plant flowers water them and see how your garden looks over time. If you find any bugs or think of flowers let me know!", "repo": "https://github.com/Juhi3921/Cozy-Bloom", "demo": "https://cozy-bloom.vercel.app/"}]...
|
[{"post_id": 19882, "ts": "202 [{"post_id": 19882, "ts": "2026-07-01T09:36:51Z", "hours": 10.0, "text": "I wanted to build a relaxing flower arranging game where users can create different bouquets using random flowers. goal was to practice JavaScript while making something cute and interactive."}]...
|
Title: Cozy Bloom by @juhi | Stardance
Devlogs:
I Title: Cozy Bloom by @juhi | Stardance
Devlogs:
I wanted to build a relaxing flower arranging game where users can create different bouquets using random flowers. goal was to practice JavaScript while making something cute and interactive.
Ships:
I created Cozy Bloom, a game where you grow flowers at night. You plant seeds, give them water. Watch your garden grow. I wanted to make something calm that anyone can play in a minutes. The best part was making the flowers grow and the animations smooth. I like how peaceful the game feels. To try it out you can plant flowers water them and see how your garden looks over time. If you find any bugs or think of flowers let me know!...
|
1793768108.8782518
|
1794632108.8782518
|
|
38560
|
John-Bot / SlackBot by @johanu | Stardance
|
johanu
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-27T22:17:39Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "Built a Slack bot with Node.js and the Bolt framework that responds to slash commands — /ping (latency check), a random cat fact command, and a joke command. The trickiest part was deploying it so it stays online permanently. I set it up on Hack Club’s Nest server and configured it as a systemd service, so it survives reboots, crashes, and doesn’t depend on my laptop being on. To test it, add the bot to a Slack workspace and try /ping, the cat fact command, or the joke command.", "repo": "https://github.com/johanrizzpc-bit/john-bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0P5NE354"}]...
|
[{"post_id": 36060, "ts": "202 [{"post_id": 36060, "ts": "2026-07-27T22:10:15Z", "hours": 0.7322, "text": "WebOS SlackBot"}]...
|
Title: John-Bot / SlackBot by @johanu | Stardance
Title: John-Bot / SlackBot by @johanu | Stardance
Devlogs:
WebOS SlackBot
Ships:
Built a Slack bot with Node.js and the Bolt framework that responds to slash commands — /ping (latency check), a random cat fact command, and a joke command. The trickiest part was deploying it so it stays online permanently. I set it up on Hack Club’s Nest server and configured it as a systemd service, so it survives reboots, crashes, and doesn’t depend on my laptop being on. To test it, add the bot to a Slack workspace and try /ping, the cat fact command, or the joke command....
|
1793768107.6655016
|
1793854507.6655016
|
|
30592
|
Tuguldur's website by @Tuguldur | Stardance
|
Tuguldur
|
1
|
4.16
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-05T06:41:49Z", "hours": 3.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? I built a personal portofolio website using HTML and CSS. What was challenging? In my opinion the most challenging part was the CSS. I wanted the big text that says “Hi, I’m Tuguldur” to scale based on the user’s display size. It took multiple tries but in the end I ended up using the clamp function in CSS. One other part that was difficult was sizing and making sure the flexboxes were exactly how I wanted them. What are you proud of? I’m proud of this website overall. I love the overall sleekness and minimalism that I was able to show. What should people know? I really don’t want to call this project a fully complete one. I am constantly learning new web development tools like JavaScript, React.js etc. I know for sure that I will be updating this project as time passes :D", "repo": "https://github.com/tuguldur0/my-website", "demo": "https://my-website-delta-six-38.vercel.app/index.html"}]...
|
[{"post_id": 62925, "ts": "202 [{"post_id": 62925, "ts": "2026-09-06T13:52:59Z", "hours": 1.1606, "text": "I migrated the project to Next.js and started to migrate the vanilla css to Tailwind css for styling.. This will take a while!"}, {"post_id": 22638, "ts": "2026-07-05T05:57:55Z", "hours": 0.7586, "text": "My website is finally finished and live! You can check it out here: https://my-website-delta-six-38.vercel.app/index.html"}, {"post_id": 22533, "ts": "2026-07-05T01:48:21Z", "hours": 1.1342, "text": "I added some more css! Although right now the spacing isn’t working properly, I am working on a fix"}, {"post_id": 22145, "ts": "2026-07-04T13:34:07Z", "hours": 0.83, "text": "I added some CSS code to make it a bit more cooler, I took some inspiration from some other sites too!"}, {"post_id": 22057, "ts": "2026-07-04T09:38:26Z", "hours": 0.5675, "text": "I wrote the basic HTML structure for my personal website, now I’ll be doing some CSS!"}]...
|
Title: Tuguldur's website by @Tuguldur | Stard Title: Tuguldur's website by @Tuguldur | Stardance
Devlogs:
I wrote the basic HTML structure for my personal website, now I’ll be doing some CSS!
I added some CSS code to make it a bit more cooler, I took some inspiration from some other sites too!
I added some more css! Although right now the spacing isn’t working properly, I am working on a fix
My website is finally finished and live! You can check it out here: https://my-website-delta-six-38.vercel.app/index.html
I migrated the project to Next.js and started to migrate the vanilla css to Tailwind css for styling.. This will take a while!
Ships:
What did you make? I built a personal portofolio website using HTML and CSS. What was challenging? In my opinion the most challenging part was the CSS. I wanted the big text that says “Hi, I’m Tuguldur” to scale based on the user’s display size. It took multiple tries but in the end I ended up using the clamp function in CSS. One other part that was difficult was sizing and making sure the flexboxes were exactly how I wanted them. What are you proud of? I’m proud of this website overall. I love the overall sleekness and minimalism that I was able to show. What should people know? I really don’t want to call this project a fully complete one. I am constantly learning new web development tools like JavaScript, React.js etc. I know for sure that I will be updating this project as time passes :D...
|
1793768106.7907789
|
1794632106.7907789
|
|
50910
|
NET GROUND BOOKING by @Tallurisaikumar | Stardance
|
Tallurisaikumar
|
1
|
29.0
|
164
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-20T18:24:52Z", "hours": 29.0, "multiplier": 5.63, "payout": 164, "blessing": "neutral", "text": "complete my project NET GROUND BOOKING", "repo": "https://github.com/tallurisai9346-beep/NET-GROUNDS-BOOKING-", "demo": "https://net-grounds-booking.vercel.app/"}]...
|
[{"post_id": 51193, "ts": "202 [{"post_id": 51193, "ts": "2026-08-20T18:18:09Z", "hours": 2.6253, "text": "finally my net ground booking complete☺️"}, {"post_id": 51073, "ts": "2026-08-20T15:38:02Z", "hours": 1.3367, "text": "adding person ditals page and time slotes"}, {"post_id": 50740, "ts": "2026-08-20T02:52:55Z", "hours": 6.6217, "text": "iam add daily mini challengs"}, {"post_id": 50536, "ts": "2026-08-19T18:42:04Z", "hours": 4.7219, "text": "iam adding new features like pick your game"}, {"post_id": 50293, "ts": "2026-08-19T13:26:09Z", "hours": 2.8, "text": "my net ground booking main page is just now complete"}, {"post_id": 50042, "ts": "2026-08-19T02:22:07Z", "hours": 7.3147, "text": "after some hours iam add the login page and background image in only frountend it work"}, {"post_id": 49797, "ts": "2026-08-18T18:51:34Z", "hours": 1.4839, "text": "just now add background colour and some founts"}, {"post_id": 49725, "ts": "2026-08-18T17:10:31Z", "hours": 2.0003, "text": "sum more basic HTML coading is complete some more is left"}, {"post_id": 49623, "ts": "2026-08-18T14:45:04Z", "hours": 0.2694, "text": "just few min back iam start the creat web sit"}]...
|
Title: NET GROUND BOOKING by @Tallurisaikumar | St Title: NET GROUND BOOKING by @Tallurisaikumar | Stardance
Devlogs:
just few min back iam start the creat web sit
sum more basic HTML coading is complete some more is left
just now add background colour and some founts
after some hours iam add the login page and background image in only frountend it work
my net ground booking main page is just now complete
iam adding new features like pick your game
iam add daily mini challengs
adding person ditals page and time slotes
finally my net ground booking complete☺️
Ships:
complete my project NET GROUND BOOKING...
|
1793768105.9168186
|
1794632105.9168186
|
|
59673
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768105.0556774
|
1794632105.0556774
|
|
38837
|
Vertex by @Amai | Stardance
|
Amai
|
1
|
5.0
|
6
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-28T19:29:01Z", "hours": 5.0, "multiplier": 1.16, "payout": 6, "blessing": "neutral", "text": "I make enemys,HUD,some model. I ncountered many bugs.And I try to fix them(Something not lol) I hope anyone like kill tung tung tung sahur", "repo": "https://github.com/isnotamai/vertex", "demo": "https://github.com/isnotamai/vertex/releases"}]...
|
[{"post_id": 36543, "ts": "202 [{"post_id": 36543, "ts": "2026-07-28T18:47:28Z", "hours": 0.3506, "text": "Nice tung tung tung"}, {"post_id": 35901, "ts": "2026-07-27T17:03:32Z", "hours": 1.7389, "text": "add tung tung tung sahur"}, {"post_id": 35203, "ts": "2026-07-26T14:01:20Z", "hours": 0.8725, "text": "Add main menu,skybox,bullet and others.And fixxed some bug"}, {"post_id": 34712, "ts": "2026-07-25T17:19:43Z", "hours": 1.1822, "text": "Add reeeecoil"}, {"post_id": 34135, "ts": "2026-07-24T17:12:58Z", "hours": 0.5883, "text": "I can move my camera rn"}, {"post_id": 33691, "ts": "2026-07-23T20:20:17Z", "hours": 0.4742, "text": "I just create a platform haha"}]...
|
Title: Vertex by @Amai | Stardance
Devlogs:
I jus Title: Vertex by @Amai | Stardance
Devlogs:
I just create a platform haha
I can move my camera rn
Add reeeecoil
Add main menu,skybox,bullet and others.And fixxed some bug
add tung tung tung sahur
Nice tung tung tung
Ships:
I make enemys,HUD,some model. I ncountered many bugs.And I try to fix them(Something not lol) I hope anyone like kill tung tung tung sahur...
|
1793768103.8462222
|
1793854503.8462222
|
|
59667
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768103.011084
|
1794632103.011084
|
|
25593
|
Snake Game by @Branson | Stardance
|
Branson
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Snake Game by @Branson | Stardance
|
1793768102.0994105
|
1794372902.0994105
|
|
59649
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768101.2096982
|
1794632101.2096982
|
|
59642
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768100.3238354
|
1794632100.3238354
|
|
17175
|
Custom WebOS by @yassinbs | Stardance
|
yassinbs
|
1
|
2.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-15T19:13:32Z", "hours": 2.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "It is a simple webos, I have added features like clicking on tabs to put them on top of other tabs, and the rest is pretty self explanatory. I explained everything briefly in my Devlogs.", "repo": "https://github.com/guccmanegu-eng/AppleWebOS", "demo": "https://guccmanegu-eng.github.io/AppleWebOS/"}]...
|
[{"post_id": 9248, "ts": "2026 [{"post_id": 9248, "ts": "2026-06-15T15:08:10Z", "hours": 0.5067, "text": "Devlog 5 - Creating an Advanced App: Projects Today, I developed my second desktop application for HackOS: the Projects app. One enhancement I integrated is the ability to click windows to bring them to the forefront. The app aims to showcase the projects I’ve created and provide users with an alternative way to navigate my operating system. What I Added I began by designing a new desktop icon labeled “Projects,” featuring a book icon positioned next to the Journal app. Next, I set up a new window for the application that includes: A draggable header A close button A content area for displaying project details I created a JavaScript array named projectsData to store information about my projects, with each project containing: A title A description The loadProjects() function I wrote iterates through the array and dynamically generates project cards within the app. Current projects include: AppleWebOS Journal App A placeholder for future projects Challenges I Encountered This project proved significantly more challenging than developing the Journal app. I spent considerable time troubleshooting why the Projects window wouldn’t open. The primary issue stemmed from an incorrect HTML structure; I had created the window’s header and content but neglected to establish the projectsWindow container that ties everything together. As a result, JavaScript couldn’t locate: var projectsWindow = document . querySelector ( \" #projectsWindow \" ); This oversight hindered the window-opening functionality. Additionally, I mistakenly placed the projects-content div within the header instead of below it. I also mixed up several IDs, including: projects projectsWindow projectsIcon This experience reinforced the importance of maintaining consistent naming conventions as projects expand. What I Learned I discovered that organization is becoming increasingly crucial. In a growing project like HackOS, minor errors in IDs or HTML structure can disrupt entire features, such as the draggable functionality. I also learned how to dynamically generate content using JavaScript arrays rather than hardcoding everything into the HTML. Current HackOS Features HackOS now boasts several features: A top bar displaying a live clock A Welcome window A Journal application A Projects application Draggable windows Open and close functionality Dynamic content loading Next Potential Steps I aim to continue enhancing HackOS by adding more applications and refining the visual design. Some ideas on my list include: Improved window animations Additional projects within the Projects app A settings application Enhanced styling More interactive desktop features HackOS is progressively evolving into a functioning operating system rather than just a simple webpage."}, {"post_id": 9229, "ts": "2026-06-15T14:34:14Z", "hours": 0.6919, "text": "Devlog 4 - Creating My First App: Journal Today, I launched my first application for my personal operating system: the Journal app. I added an app icon to the desktop, allowing users to open the Journal window only when its icon is clicked, rather than having every window open automatically upon loading the website. I incorporated several systems I had previously built, including draggable windows, open and close functionality, and reusable styling. App Structure Inside the Journal app, I created a sidebar and a content area. The sidebar lists various journal entries, while the main section displays the contents of the selected entry. To keep the code organized and avoid hardcoding, I stored the journal entries in a JavaScript array of objects. Each object includes: A title A date The HTML content for that entry I developed JavaScript functions to: Dynamically generate the sidebar entries Show the selected journal content Open and close the Journal window Keep the Journal hidden when the page initially loads Challenges Faced During development, I encountered several bugs. At one point, the Journal window appeared inside the top bar due to incorrect HTML structure. I also accidentally created duplicate IDs and nested windows, which led to both windows moving simultaneously when dragged. After resolving these issues, the operating system became much more organized and interactive. Current Features The following features have been implemented: Welcome window Desktop top bar with a live clock Draggable windows Open and close buttons Desktop application icons Journal app Dynamically generated journal entries using JavaScript This project is gradually transforming into a genuine operating system rather than just a simple webpage. The codebase is also becoming more modular, facilitating future expansions for additional applications."}, {"post_id": 8894, "ts": "2026-06-14T20:09:46Z", "hours": 0.5447, "text": "Devlog 3 – Enhancing Interactivity in HackOS Today, I significantly improved HackOS by adding interactivity to the welcome window, making it feel more like a real operating system. Organization and Structure I began by organizing my project files. I moved my JavaScript code to a separate script.js file and my styles to style.css . This separation made the code cleaner and easier to navigate. Making the Welcome Window Draggable Next, I implemented drag functionality for the welcome window. Using JavaScript, I tracked the mouse position to update the window’s location as users drag it across the screen. I added a header area that serves as a handle, allowing the window to be moved only when dragging from the top section. Adding a Close Button I also introduced a close button in the top-right corner of the window. When clicked, this button hides the window by altering its display property. To reopen the window, I used the OS name in the top bar as a toggle. Clicking it makes the window visible again. Live Clock Integration Continuing from the previous project, I kept the live clock, which updates every second using JavaScript and remains visible in the top bar. Reusable CSS Classes To facilitate future expansions, I created reusable CSS classes for windows, headers, and buttons. This approach enables me to add more windows later without having to rewrite styles. Key Learnings Through this project, I gained insights into: Separating HTML, CSS, and JavaScript into distinct files Organizing elements using IDs and classes Implementing draggable HTML elements Creating reusable CSS classes Utilizing functions in JavaScript Adding click event listeners Dynamically opening and closing windows Positioning elements within a window header My favorite aspect was enabling the draggable functionality, which made the interface resemble a real desktop environment. I also enjoyed adding the close button, enhancing the window’s behavior to mirror traditional applications. Goals for Next Session Create a fictional open button resembling a taskbar, instead of using the title of the page. Follow the development guide to streamline progress."}, {"post_id": 8638, "ts": "2026-06-14T11:15:19Z", "hours": 0.6606, "text": "Devlog 1 – Building My Welcome Screen Today I created the welcome screen for my Personal OS using HTML and CSS. I started by creating a basic HTML page with a heading and a paragraph. After that, I added an image that represents me and included a link to one of my favorite websites. This helped make the page feel more personal. Next, I experimented with different styles. I changed the background color, adjusted the text colors, and selected a font that matched the look I wanted. I also resized my image and rounded its corners using the border-radius property. One challenge I encountered was making the image look the correct size without becoming stretched. I solved this by setting both the width and height and using styling to keep the image looking natural. Through this project, I learned about: HTML elements such as h1 , p , img , and a Adding images and links to a webpage Using inline CSS styles Changing colors, fonts, spacing, and image appearance Using margin and padding to improve layout My favorite part was customizing the page and making it feel like my own . In the future, I want to add windows, a desktop background, and interactive features using JavaScript. Devlog 2 – Creating My Desktop and Top Bar Today I expanded my Personal OS by creating a desktop layout and adding a top bar with a live clock. I started by placing all of my welcome screen content inside a div , which acts as a window. I added a border, rounded corners, padding, and a background color so the window stood out from the desktop background. Next, I added a desktop wallpaper by setting a background image on the body of the page. I used background-size: cover so the image would fill the screen properly. After creating the desktop, I built a top bar. I used a flexbox layout to place the OS name on one side and the time on the other. I also added a semi-transparent background to give it a more modern operating system appearance. Finally, I learned some basic JavaScript. I created a function that gets the current date and time using new Date().toLocaleString() . Then I displayed the time inside the top bar and used setInterval() to update it every second so the clock stays accurate. Through this project, I learned about: Using div elements as windows Positioning elements with position: absolute Centering content with transform: translate() Creating a desktop wallpaper with CSS Using Flexbox for layout Creating a top bar Writing basic JavaScript functions Updating webpage content with querySelector() and innerHTML Using setInterval() to run code repeatedly My favorite part was adding the live clock because it made the website feel more like a real operating system. Next, I would like to add more windows, applications, and interactive features to make the OS more useful. (I put both my devlogs in here because I forgot to post my first devlog)"}]...
|
Title: Custom WebOS by @yassinbs | Stardance
Devl Title: Custom WebOS by @yassinbs | Stardance
Devlogs:
Devlog 1 – Building My Welcome Screen Today I created the welcome screen for my Personal OS using HTML and CSS. I started by creating a basic HTML page with a heading and a paragraph. After that, I added an image that represents me and included a link to one of my favorite websites. This helped make the page feel more personal. Next, I experimented with different styles. I changed the background color, adjusted the text colors, and selected a font that matched the look I wanted. I also resized my image and rounded its corners using the border-radius property. One challenge I encountered was making the image look the correct size without becoming stretched. I solved this by setting both the width and height and using styling to keep the image looking natural. Through this project, I learned about: HTML elements such as h1 , p , img , and a Adding images and links to a webpage Using inline CSS styles Changing colors, fonts, spacing, and image appearance Using margin and padding to improve layout My favorite part was customizing the page and making it feel like my own . In the future, I want to add windows, a desktop background, and interactive features using JavaScript. Devlog 2 – Creating My Desktop and Top Bar Today I expanded my Personal OS by creating a desktop layout and adding a top bar with a live clock. I started by placing all of my welcome screen content inside a div , which acts as a window. I added a border, rounded corners, padding, and a background color so the window stood out from the desktop background. Next, I added a desktop wallpaper by setting a background image on the body of the page. I used background-size: cover so the image would fill the screen properly. After creating the desktop, I built a top bar. I used a flexbox layout to place the OS name on one side and the time on the other. I also added a semi-transparent background to give it a more modern operating system appearance. Finally, I learned some basic JavaScript. I created a function that gets the current date and time using new Date().toLocaleString() . Then I displayed the time inside the top bar and used setInterval() to update it every second so the clock stays accurate. Through this project, I learned about: Using div elements as windows Positioning elements with position: absolute Centering content with transform: translate() Creating a desktop wallpaper with CSS Using Flexbox for layout Creating a top bar Writing basic JavaScript functions Updating webpage content with querySelector() and innerHTML Using setInterval() to run code repeatedly My favorite part was adding the live clock because it made the website feel more like a real operating system. Next, I would like to add more windows, applications, and interactive features to make the OS more useful. (I put both my devlogs in here because I forgot to post my first devlog)
Devlog 3 – Enhancing Interactivity in HackOS Today, I significantly improved HackOS by adding interactivity to the welcome window, making it feel more like a real operating system. Organization and Structure I began by organizing my project files. I moved my JavaScript code to a separate script.js file and my styles to style.css . This separation made the code cleaner and easier to navigate. Making the Welcome Window Draggable Next, I implemented drag functionality for the welcome window. Using JavaScript, I tracked the mouse position to update the window’s location as users drag it across the screen. I added a header area that serves as a handle, allowing the window to be moved only when dragging from the top section. Adding a Close Button I also introduced a close button in the top-right corner of the window. When clicked, this button hides the window by altering its display property. To reopen the window, I used the OS name in the top bar as a toggle. Clicking it makes the window visible again. Live Clock Integration Continuing from the previous project, I kept the live clock, which updates every second using JavaScript and remains visible in the top bar. Reusable CSS Classes To facilitate future expansions, I created reusable CSS classes for windows, headers, and buttons. This approach enables me to add more windows later without having to rewrite styles. Key Learnings Through this project, I gained insights into: Separating HTML, CSS, and JavaScript into distinct files Organizing elements using IDs and classes Implementing draggable HTML elements Creating reusable CSS classes Utilizing functions in JavaScript Adding click event listeners Dynamically opening and closing windows Positioning elements within a window header My favorite aspect was enabling the draggable functionality, which made the interface resemble a real desktop environment. I also enjoyed adding the close button, enhancing the window’s behavior to mirror traditional applications. Goals for Next Session Create a fictional open button resembling a taskbar, instead of using the title of the page. Follow the development guide to streamline progress.
Devlog 4 - Creating My First App: Journal Today, I launched my first application for my personal operating system: the Journal app. I added an app icon to the desktop, allowing users to open the Journal window only when its icon is clicked, rather than having every window open automatically upon loading the website. I incorporated several systems I had previously built, including draggable windows, open and close functionality, and reusable styling. App Structure Inside the Journal app, I created a sidebar and a content area. The sidebar lists various journal entries, while the main section displays the contents of the selected entry. To keep the code organized and avoid hardcoding, I stored the journal entries in a JavaScript array of objects. Each object includes: A title A date The HTML content for that entry I developed JavaScript functions to: Dynamically generate the sidebar entries Show the selected journal content Open and close the Journal window Keep the Journal hidden when the page initially loads Challenges Faced During development, I encountered several bugs. At one point, the Journal window appeared inside the top bar due to incorrect HTML structure. I also accidentally created duplicate IDs and nested windows, which led to both windows moving simultaneously when dragged. After resolving these issues, the operating system became much more organized and interactive. Current Features The following features have been implemented: Welcome window Desktop top bar with a live clock Draggable windows Open and close buttons Desktop application icons Journal app Dynamically generated journal entries using JavaScript This project is gradually transforming into a genuine operating system rather than just a simple webpage. The codebase is also becoming more modular, facilitating future expansions for additional applications.
Devlog 5 - Creating an Advanced App: Projects Today, I developed my second desktop application for HackOS: the Projects app. One enhancement I integrated is the ability to click windows to bring them to the forefront. The app aims to showcase the projects I’ve created and provide users with an alternative way to navigate my operating system. What I Added I began by designing a new desktop icon labeled “Projects,” featuring a book icon positioned next to the Journal app. Next, I set up a new window for the application that includes: A draggable header A close button A content area for displaying project details I created a JavaScript array named projectsData to store information about my projects, with each project containing: A title A description The loadProjects() function I wrote iterates through the array and dynamically generates project cards within the app. Current projects include: AppleWebOS Journal App A placeholder for future projects Challenges I Encountered This project proved significantly more challenging than developing the Journal app. I spent considerable time troubleshooting why the Projects window wouldn’t open. The primary issue stemmed from an incorrect HTML structure; I had created the window’s header and content but neglected to establish the projectsWindow container that ties everything together. As a result, JavaScript couldn’t locate: var projectsWindow = document . querySelector ( " #projectsWindow " ); This oversight hindered the window-opening functionality. Additionally, I mistakenly placed the projects-content div within the header instead of below it. I also mixed up several IDs, including: projects projectsWindow projectsIcon This experience reinforced the importance of maintaining consistent naming conventions as projects expand. What I Learned I discovered that organization is becoming increasingly crucial. In a growing project like HackOS, minor errors in IDs or HTML structure can disrupt entire features, such as the draggable functionality. I also learned how to dynamically generate content using JavaScript arrays rather than hardcoding everything into the HTML. Current HackOS Features HackOS now boasts several features: A top bar displaying a live clock A Welcome window A Journal application A Projects application Draggable windows Open and close functionality Dynamic content loading Next Potential Steps I aim to continue enhancing HackOS by adding more applications and refining the visual design. Some ideas on my list include: Improved window animations Additional projects within the Projects app A settings application Enhanced styling More interactive desktop features HackOS is progressively evolving into a functioning operating system rather than just a simple webpage.
Ships:
It is a simple webos, I have added features like clicking on tabs to put them on top of other tabs, and the rest is pretty self explanatory. I explained everything briefly in my Devlogs....
|
1793768099.1367311
|
1793854499.1367311
|
|
59616
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768098.2638352
|
1794632098.2638352
|
|
59613
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768097.3821466
|
1794632097.3821466
|
|
31673
|
My awesome macropad! by @libmj | Stardance
|
libmj
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @libmj | Stardance
|
1793768096.426965
|
1794372896.426965
|
|
59603
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768093.022949
|
1794632093.022949
|
|
36609
|
3D Printed Hand Glider Using OpenVSP by @rachat | 3D Printed Hand Glider Using OpenVSP by @rachat | Stardance...
|
rachat
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-23T21:15:50Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a 3D printed glider using OpenVSP, NASA’s open-source parametric aircraft geometry tool. My goal was to make it a print-in-place model so it wouldn’t take multiple steps or be confusing, and to perform similarly to a really good paper airplane. It did just that. I printed seven gliders in total, and they improved with each iteration. Between all the versions, I struggled with the center of gravity the most. After testing all of them, I ended up with a final design that could glide 105 feet when launched from a small hill. The final model includes both a 3MF file with slicer settings and an STL file for compatibility with older slicers. I hope others can print it, test it, and improve on it just like I did. Maybe scaling it up into a full-size model would be a fun challenge. Overall, this was a really fun project that taught me how to design aircraft and create 3D prints intended for consumers. I’m excited to share the final glider with everyone!", "repo": "https://github.com/jrrachat/OpenVSPGlider", "demo": ""}]...
|
[{"post_id": 33715, "ts": "202 [{"post_id": 33715, "ts": "2026-07-23T20:53:59Z", "hours": 0.5667, "text": "Devlog #9 We’re shipping! I tested all seven prints against each other, and the sixth print was the clear winner. Thrown from a hill with moderate force, it flew about 105 feet. When thrown with lots of force, it becomes a “trick plane” that dives, climbs, and can even perform loop-de-loops. I’ve added a demo along with the GitHub page. The image below showcases all seven prints and the damage each one took when I threw them. Overall, it was a really fun project."}, {"post_id": 33194, "ts": "2026-07-22T21:42:23Z", "hours": 0.6336, "text": "Devlog #8 The new plane flew really well, but durability was the main issue. I really didn’t change much on the next iteration, I just changed some slicer settings such as infill and wall loop count for enhanced durability. I also added a little bulge on the bottom of the glider for the plane to skid on so the nose doesn’t snap off when it lands. The entire plane shattered and I tried to duct tape it together but it didn’t really work. The new CAD in OpenVSP is below. I’ll try to record a video of the next flight but it’s really hard to pick up the plane with a camera. UPDATE: This iteration flew pretty poorly the one previous to this was easily the best so far."}, {"post_id": 32692, "ts": "2026-07-22T00:27:03Z", "hours": 0.6167, "text": "Devlog #7 We’re getting close guys! I fixed the center of gravity issue by changing the nose of the glider to 100% infill while the rest still stays at 0%. It flew much more stable, and now we’re just down to tuning. It would dip left while flying, but I mainly think that was because the tail was extremely flimsy and snapped off. The next iteration will focus on strengthening connections between the wings, fuselage, and tail so everything prints straighter and more symmetrical. I also made the winglets larger as they were quite small and I felt they weren’t being taking advantage of. Might try scaling it up later too?"}, {"post_id": 32083, "ts": "2026-07-21T00:12:07Z", "hours": 1.0167, "text": "Devlog #6 The 3rd print has been completed. The glider flies much straighter but the center of gravity is still too far aft in the plane and it falls backwards mid flight. I addressed this issue by taping 2 pennies to the nose to add about 3 grams of weight, and it flew much more stable for the first 8-9 feet, but would spin out of control after that. The next iteration will focus on adding weight to the nose in the print to isolate that from the stability, which I’ll tackle afterwards."}, {"post_id": 30898, "ts": "2026-07-18T21:26:22Z", "hours": 0.7667, "text": "Devlog #5 The 2nd print was completed! The plane works pretty well on shorter glides with not much power behind the throw, but the center of gravity is too far forwards and it takes many dives. Adding polyhedral wings definitely helped along with the vertical stabilizer and shrinking the size so it ways about 2 grams less. Next big change will be changing the wing location along with fuselage tapering to distribute weight evenly, reduce the load on the wings, and fix the center of gravity."}, {"post_id": 30720, "ts": "2026-07-18T15:13:54Z", "hours": 0.85, "text": "Devlog #4 The first iteration of the glider was successfully printed and the sizing was very good. It was a little too heavy by about 1/8 oz for the load I want to put on the wings and would quickly spin out of control. I began a new version with a fixed vertical stabilizer, all the measurements redone for a better center of gravity and weight distribution, and I’m focusing on making it a single-print so you don’t have to add weight to the front of the nose manually like in the previous designs."}, {"post_id": 30460, "ts": "2026-07-18T01:11:47Z", "hours": 0.4, "text": "I finished v4 of the glider and did shrink it down even more so when I ship it it’ll be easier for everyone to print themselves on one build plate. I did test it on VSPAERO and it should fly really well still. The supports are really annoying in the slicing software (orca) as the plane has huge wings that need supports unless you cut it and epoxy/glue it on later - which has its own issues."}, {"post_id": 30454, "ts": "2026-07-18T00:39:04Z", "hours": 0.3003, "text": "Shrunk the plane way down so it’ll be easier to 3D print and the weight you’ll have to add to the nose changed along with this, you’ll have to add weight that is approximately the same weight as the rest of the aircraft (which is probably easier than the 12x multiplier before). Gonna run it through the slicer. Still don’t know whether I want to add a detachable nose to add the weight (ballast) or just drill through it?"}, {"post_id": 30444, "ts": "2026-07-18T00:10:59Z", "hours": 0.5169, "text": "Made another iteration of the glider where I shrunk everything down by about 30% for easier 3D printing and added a detachable nose cap for adding ballasts so users can change the weight of the nose as it’s needed for good flight. I ran many simulations in OpenVSP for optimizing everything as well."}]...
|
Title: 3D Printed Hand Glider Using OpenVSP by @ra Title: 3D Printed Hand Glider Using OpenVSP by @rachat | Stardance
Devlogs:
Made another iteration of the glider where I shrunk everything down by about 30% for easier 3D printing and added a detachable nose cap for adding ballasts so users can change the weight of the nose as it’s needed for good flight. I ran many simulations in OpenVSP for optimizing everything as well.
Shrunk the plane way down so it’ll be easier to 3D print and the weight you’ll have to add to the nose changed along with this, you’ll have to add weight that is approximately the same weight as the rest of the aircraft (which is probably easier than the 12x multiplier before). Gonna run it through the slicer. Still don’t know whether I want to add a detachable nose to add the weight (ballast) or just drill through it?
I finished v4 of the glider and did shrink it down even more so when I ship it it’ll be easier for everyone to print themselves on one build plate. I did test it on VSPAERO and it should fly really well still. The supports are really annoying in the slicing software (orca) as the plane has huge wings that need supports unless you cut it and epoxy/glue it on later - which has its own issues.
Devlog #4 The first iteration of the glider was successfully printed and the sizing was very good. It was a little too heavy by about 1/8 oz for the load I want to put on the wings and would quickly spin out of control. I began a new version with a fixed vertical stabilizer, all the measurements redone for a better center of gravity and weight distribution, and I’m focusing on making it a single-print so you don’t have to add weight to the front of the nose manually like in the previous designs.
Devlog #5 The 2nd print was completed! The plane works pretty well on shorter glides with not much power behind the throw, but the center of gravity is too far forwards and it takes many dives. Adding polyhedral wings definitely helped along with the vertical stabilizer and shrinking the size so it ways about 2 grams less. Next big change will be changing the wing location along with fuselage tapering to distribute weight evenly, reduce the load on the wings, and fix the center of gravity.
Devlog #6 The 3rd print has been completed. The glider flies much straighter but the center of gravity is still too far aft in the plane and it falls backwards mid flight. I addressed this issue by taping 2 pennies to the nose to add about 3 grams of weight, and it flew much more stable for the first 8-9 feet, but would spin out of control after that. The next iteration will focus on adding weight to the nose in the print to isolate that from the stability, which I’ll tackle afterwards.
Devlog #7 We’re getting close guys! I fixed the center of gravity issue by changing the nose of the glider to 100% infill while the rest still stays at 0%. It flew much more stable, and now we’re just down to tuning. It would dip left while flying, but I mainly think that was because the tail was extremely flimsy and snapped off. The next iteration will focus on strengthening connections between the wings, fuselage, and tail so everything prints straighter and more symmetrical. I also made the winglets larger as they were quite small and I felt they weren’t being taking advantage of. Might try scaling it up later too?
Devlog #8 The new plane flew really well, but durability was the main issue. I really didn’t change much on the next iteration, I just changed some slicer settings such as infill and wall loop count for enhanced durability. I also added a little bulge on the bottom of the glider for the plane to skid on so the nose doesn’t snap off when it lands. The entire plane shattered and I tried to duct tape it together but it didn’t really work. The new CAD in OpenVSP is below. I’ll try to record a video of the next flight but it’s really hard to pick up the plane with a camera. UPDATE: This iteration flew pretty poorly the one previous to this was easily the best so far.
Devlog #9 We’re shipping! I tested all seven prints against each other, and the sixth print was the clear winner. Thrown from a hill with moderate force, it flew about 105 feet. When thrown with lots of force, it becomes a “trick plane” that dives, climbs, and can even perform loop-de-loops. I’ve added a demo along with the GitHub page. The image below showcases all seven prints and the damage each one took when I threw them. Overall, it was a really fun project.
Ships:
I made a 3D printed glider using OpenVSP, NASA’s open-source parametric aircraft geometry tool. My goal was to make it a print-in-place model so it wouldn’t take multiple steps or be confusing, and to perform similarly to a really good paper airplane. It did just that. I printed seven gliders in total, and they improved with each iteration. Between all the versions, I struggled with the center of gravity the most. After testing all of them, I ended up with a final design that could glide 105 feet when launched from a small hill. The final model includes both a 3MF file with slicer settings and an STL file for compatibility with older slicers. I hope others can print it, test it, and improve on it just like I did. Maybe scaling it up into a full-size model would be a fun challenge. Overall, this was a really fun project that taught me how to design aircraft and create 3D prints intended for consumers. I’m excited to share the final glider with everyone!...
|
1793768091.7823207
|
1793854491.7823207
|
|
59602
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768090.9035847
|
1794632090.9035847
|
|
13507
|
Hematite Shell by @aster | Stardance
|
aster
|
0
|
3.97
|
0
|
[]
|
[{"post_id": 10876, "ts": "202 [{"post_id": 10876, "ts": "2026-06-17T20:37:19Z", "hours": 2.6214, "text": "After 2 days of fiddling, I finally got an music visualizer working for the media section. Parsing CAVA is actually much less complicated than I thought, so hopefully I’ll be able to do more with this in the future."}, {"post_id": 5209, "ts": "2026-06-08T22:19:59Z", "hours": 1.3519, "text": "Updated the island’s tab bar to match MD3, and actually got animations working"}]...
|
Title: Hematite Shell by @aster | Stardance
Devlo Title: Hematite Shell by @aster | Stardance
Devlogs:
Updated the island’s tab bar to match MD3, and actually got animations working
After 2 days of fiddling, I finally got an music visualizer working for the media section. Parsing CAVA is actually much less complicated than I thought, so hopefully I’ll be able to do more with this in the future....
|
1793768090.0157218
|
1794372890.0157218
|
|
59599
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768089.1331818
|
1794632089.1331818
|
|
31640
|
My awesome macropad! by @stormz | Stardance
|
stormz
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @stormz | Stardance
|
1793768088.2534387
|
1794372888.2534387
|
|
59583
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768087.378328
|
1794632087.378328
|
|
39536
|
My own site! by @Sahas | Stardance
|
Sahas
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-25T09:03:06Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A travel agency website with HTML CSS", "repo": "https://github.com/SahasTechnologies/Travel-agency-fake-site", "demo": "https://sahastechnologies.github.io/Travel-agency-fake-site"}]...
|
[{"post_id": 34508, "ts": "202 [{"post_id": 34508, "ts": "2026-07-25T09:00:43Z", "hours": 1.345, "text": "Just made the HTML CSS site!"}]...
|
Title: My own site! by @Sahas | Stardance
Devlogs Title: My own site! by @Sahas | Stardance
Devlogs:
Just made the HTML CSS site!
Ships:
A travel agency website with HTML CSS...
|
1793768086.243795
|
1793854486.243795
|
|
59577
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768085.4086947
|
1794632085.4086947
|
|
33215
|
My own site! by @shreyan_kagitala | Stardance
|
shreyan_kagitala
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @shreyan_kagitala | Stardan Title: My own site! by @shreyan_kagitala | Stardance...
|
1793768084.490207
|
1794372884.490207
|
|
59566
|
NULL
|
NULL
|
0
|
0.0
|
0
|
[]
|
[]
|
|
1793768083.5829868
|
1794632083.5829868
|