|
21553
|
My awesome macropad! by @jalinaitwe62 | Stardance
|
jalinaitwe62
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @jalinaitwe62 | Sta Title: My awesome macropad! by @jalinaitwe62 | Stardance...
|
1793220698.4944253
|
1793825498.4944253
|
|
30393
|
StudyOS by @zhal | Stardance
|
zhal
|
1
|
24.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-14T17:29:04Z", "hours": 24.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? I built StudyOS, an AI-powered student dashboard that connects with Google Calendar to display upcoming events and generate personalized daily briefings. Instead of checking multiple apps, students get a single dashboard with their schedule, upcoming deadlines, and AI-generated advice for the day. (AI is still in beta) What was challenging? The biggest challenge was integrating multiple technologies together. Setting up Google OAuth, retrieving events from every calendar, deploying the website, and running a local AI model with Ollama all required debugging and learning new tools. I also had to figure out how to make the AI generate useful daily briefings instead of generic responses. What are you proud of? I’m most proud that the project actually works end-to-end. Users can sign in with Google, view all of their upcoming calendar events, and receive an AI-generated morning briefing based on their real schedule. What should people know so they can test it? The live demo is available here: https://study-website-88jo-4xbo1kols-zhal8403s-projects.vercel.app/ To fully test the project: Sign in with a Google account. Allow Calendar permissions. Make sure your Google Calendar has a few upcoming events. The dashboard will display your upcoming events and generate a personalized daily briefing based on your schedule. Note: The AI runs locally using Ollama, so the hosted demo currently uses a placeholder briefing. Running the project locally with Ollama enabled provides the full AI experience.", "repo": "https://github.com/zhal8403/Study-Website", "demo": "https://study-website-941c.vercel.app/"}]...
|
[{"post_id": 28392, "ts": "202 [{"post_id": 28392, "ts": "2026-07-14T16:58:52Z", "hours": 1.3714, "text": "Dev Log #6 – Local AI Integration with Ollama Overview Today I addeed a completely local AI model using Ollama . I researched local large language models and decided to integrate the Llama 3.2 3B model through Ollama. What I Worked On Installed Ollama and downloaded the llama3.2:3b model. Fixed the issue where PowerShell could not recognize the ollama command by updating my system PATH . Learned that Ollama automatically starts its own server, so running ollama serve again caused a port conflict. Created a Node.js backend using Express and CORS . Connected the backend to Ollama’s local API. Updated the React frontend to send AI requests to my local backend instead of OpenRouter. Removed the dependency on paid AI APIs. Challenges One of the biggest challenges was getting the backend running correctly. I accidentally tried to run server.js before creating the file, which caused a MODULE_NOT_FOUND error. After creating the server and installing the required packages, I was able to start it successfully. Another challenge was that the AI initially hallucinated events like holidays and birthdays that weren’t actually on my calendar. To fix this, I rewrote the prompt to clearly instruct the model to only use the calendar events provided and never invent additional information. Improvements I redesigned the AI briefing prompt so it now: Uses only events from the next 7 days . Creates a structured daily briefing. Highlights upcoming due dates, tests, meetings, and deadlines. Suggests what to focus on for the day. Ends with a short motivational message. Avoids generating fake events. Result The AI summary feature now runs entirely on my own computer with: No API keys No usage limits Faster response times Better privacy because calendar data never leaves my computer. The morning briefing is much more useful and feels like a real student assistant instead of a generic chatbot."}, {"post_id": 25646, "ts": "2026-07-10T01:49:24Z", "hours": 3.4958, "text": "Devlog #5 — Calendar event control complete I focused on finishing the calendar management system for StudyOS. My goal was to make it possible to fully manage Google Calendar events without leaving the app. Building the Event Modal The first major feature I completed was the New Event Modal . Users can now enter: Event title Description Location Start date and time End date and time I originally built the modal using a standard HTML form, but I ran into issues where React would disconnect the form before it could submit. Instead of continuing to fight that problem, I redesigned the modal to use React state and button click handlers. This made creating events much more reliable. Editing and Deleting Events After creating events worked, I added the ability to edit them. Clicking an event now opens the same modal with all of the event information already filled in. Users can: Update event information Delete the event Cancel without making changes This required connecting the app to the Google Calendar Update and Delete API endpoints and refreshing the calendar after every change so the UI always stays up to date. Multiple Calendar Support One feature I really wanted was support for multiple calendars. Instead of always saving events in the primary calendar, the app now retrieves every calendar connected to the user’s Google account. A dropdown menu allows users to choose exactly where a new event should be saved. Bug Fixes Along the way I fixed several issues: Fixed React form submission problems by replacing the form with state-based inputs. Fixed the event modal not updating correctly when switching between events. Fixed the calendar not refreshing after creating, editing, or deleting events. Fixed event selection in the Today , Week , and Month views. Fixed creating events in calendars other than the primary calendar. Current Features The calendar now supports: Today , Week , and Month views Searching events Creating new events Editing existing events Deleting events Selecting which Google Calendar an event belongs to Automatic refresh after every change Next Steps Add recurring event support Add event color customization Add reminders and notifications Improve the calendar interface Add drag-and-drop scheduling I’m really happy with how this update turned out because the calendar has gone from being a read-only viewer to a fully functional event manager."}, {"post_id": 25103, "ts": "2026-07-09T02:57:29Z", "hours": 7.4456, "text": "Devlog #4 – Gmail, Google Classroom, and Calendar Improvements What I Worked On I focused on connecting more Google services to StudyOS and improving how calendar data is displayed. Google Classroom I created a new Classroom page that automatically loads my Google Classroom courses and displays assignments from each class. Features Added Connected to the Google Classroom API. Loaded all enrolled courses. Retrieved coursework from every class. Combined assignments into one list. Sorted assignments by due date. Displayed the class name with each assignment. Problems Solved Fixed OAuth authentication issues. Added the required Google Classroom scopes. Debugged 401 Unauthorized and 403 Permission Denied errors. Learned that teachers can restrict API access to coursework, causing some assignments to be unavailable. Gmail I continued improving Gmail integration. Improvements Better loading of Gmail messages. More reliable Google authentication. Cleaner organization for displaying emails. Google Calendar The calendar received several major improvements. Features Added Combined events from every calendar instead of only the primary calendar. Added search functionality. Added Today, Week, and Month views. Added Previous, Next, and Today navigation buttons. Added support for changing weeks and months without reloading. Sorted all events by date. Bug Fixes Fixed missing events caused by incorrect API parameters. Fixed events not appearing from shared calendars. Fixed date filtering logic. Corrected React state issues with currentDate . Fixed navigation bugs while switching between calendar views. Next Steps Create and edit calendar events directly from StudyOS. Add assignment completion tracking. Display Gmail labels and unread counts. Improve the calendar UI with drag-and-drop support. Connect Google Drive files to assignments."}, {"post_id": 22805, "ts": "2026-07-05T11:55:48Z", "hours": 9.0164, "text": "Devlog #3 — Making the Calendar Page and Dashboard This week, I worked on two of the biggest parts of StudyOS so far: the Calendar page and the Dashboard . Calendar Page I started turning the Calendar page into something more useful than a simple event list. I added different views for Today , Week , and Month , making it easier to see upcoming events in different ways. I also improved how events are displayed by adding: Expandable event descriptions A cleaner event layout A structure that’s easier to build on with more features later These changes make the calendar feel much closer to a real productivity app. Dashboard I also redesigned the Dashboard to work more like a student command center. One of the biggest improvements was turning the upcoming events section into a scrollable card . This keeps the dashboard clean even when there are lots of events and prevents long lists from stretching the page. This new layout also leaves room for future dashboard widgets, such as: AI daily briefing Assignment priority Recent activity What’s Next? Next, I plan to continue improving the Calendar page by adding: Creating events Editing events Deleting events After that, I’ll begin building more dashboard widgets to make StudyOS feel like a true all-in-one student workspace."}, {"post_id": 21852, "ts": "2026-07-04T00:14:51Z", "hours": 2.0331, "text": "Devlog #2 – Switching to React & Adding Google Authentication Today I upgraded StudyOS from a basic HTML/CSS/JavaScript project into a React (Vite) application, and then added Google Sign-In authentication. This was a major step toward turning StudyOS into a real student productivity platform instead of just a static UI. StudyOS is designed as a Student Command Center, where students can eventually manage Gmail, Google Calendar, Drive, Classroom, and assignments all in one place. Part 1 – Switching to React I migrated the project into React using Vite to make it more scalable and closer to how real production apps are built. What I changed Converted project from HTML/CSS/JS → React (Vite) Broke UI into reusable components: Sidebar Header Pages (Dashboard, Gmail, Calendar, etc.) Implemented single-page navigation (no page reloads) Why I switched React makes it much easier to: Manage multiple pages (like Gmail + Calendar + Drive) Handle user login state Build dynamic dashboards Scale the project into a real app Part 2 – Google Authentication After setting up React, I integrated Google Sign-In so users can log into StudyOS using their Google account. What I implemented Installed @react-oauth /google Added JWT decoding to extract user info Configured Google OAuth in React Created login flow using Google Identity Services Fixed OAuth issues including: Displayed user profile after login: Name Profile picture Restricted app access until user is signed in What works now Sidebar navigation between pages Dashboard layout structure Google Sign-In authentication system User session state (logged in / logged out) Profile display in header after login Challenges The biggest issue was Google OAuth configuration. I initially encountered: Error 400: origin_mismatch This happened because the correct localhost URLs were not added in the Google Cloud Console. Fix Added the following to Authorized JavaScript origins: http://localhost:5173 http://127.0.0.1:5173 After fixing this, Google Sign-In worked successfully. Next steps Connect Google Calendar API (real events) Connect Gmail API (inbox preview) Connect Google Drive API (file access) Build Assignment Workspace system Add AI Daily Briefing (smart planning system) Implement “Stay signed in” persistence Improve UI with modern styling (glassmorphism + animations)"}, {"post_id": 21721, "ts": "2026-07-03T20:14:35Z", "hours": 0.7917, "text": "Devlog #1 - Building the Base of StudyOS Time Spent: 45 minutes Today I started building StudyOS , a student productivity app that combines Google Classroom, Gmail, Calendar, Drive, and other Google services into one place. My goal is to reduce the number of tabs students need to keep open and make staying organized much easier. What I accomplished Created the project in VS Code. Built the basic dashboard layout. Added a sidebar for navigation. Created a top navigation bar with a search bar and a placeholder Google Sign-In button. Designed the first dashboard cards: Today’s Summary AI Briefing Focus Session Challenges I spent some time deciding how I wanted the app to be organized. Instead of making another simple dashboard, I decided to build it like a Student Command Center where everything can eventually be managed from one place. Next Steps Create a login page. Add Google Sign-In. Keep users signed in if they choose. Connect Google Calendar. Connect Gmail. Add the AI Daily Briefing. Begin building the Assignment Workspace. I’m really happy with the progress so far. Even though it’s only the first version, I now have a solid foundation to build on. Next I’ll start adding real functionality instead of placeholder content."}]...
|
Title: StudyOS by @zhal | Stardance
Devlogs:
Devl Title: StudyOS by @zhal | Stardance
Devlogs:
Devlog #1 - Building the Base of StudyOS Time Spent: 45 minutes Today I started building StudyOS , a student productivity app that combines Google Classroom, Gmail, Calendar, Drive, and other Google services into one place. My goal is to reduce the number of tabs students need to keep open and make staying organized much easier. What I accomplished Created the project in VS Code. Built the basic dashboard layout. Added a sidebar for navigation. Created a top navigation bar with a search bar and a placeholder Google Sign-In button. Designed the first dashboard cards: Today’s Summary AI Briefing Focus Session Challenges I spent some time deciding how I wanted the app to be organized. Instead of making another simple dashboard, I decided to build it like a Student Command Center where everything can eventually be managed from one place. Next Steps Create a login page. Add Google Sign-In. Keep users signed in if they choose. Connect Google Calendar. Connect Gmail. Add the AI Daily Briefing. Begin building the Assignment Workspace. I’m really happy with the progress so far. Even though it’s only the first version, I now have a solid foundation to build on. Next I’ll start adding real functionality instead of placeholder content.
Devlog #2 – Switching to React & Adding Google Authentication Today I upgraded StudyOS from a basic HTML/CSS/JavaScript project into a React (Vite) application, and then added Google Sign-In authentication. This was a major step toward turning StudyOS into a real student productivity platform instead of just a static UI. StudyOS is designed as a Student Command Center, where students can eventually manage Gmail, Google Calendar, Drive, Classroom, and assignments all in one place. Part 1 – Switching to React I migrated the project into React using Vite to make it more scalable and closer to how real production apps are built. What I changed Converted project from HTML/CSS/JS → React (Vite) Broke UI into reusable components: Sidebar Header Pages (Dashboard, Gmail, Calendar, etc.) Implemented single-page navigation (no page reloads) Why I switched React makes it much easier to: Manage multiple pages (like Gmail + Calendar + Drive) Handle user login state Build dynamic dashboards Scale the project into a real app Part 2 – Google Authentication After setting up React, I integrated Google Sign-In so users can log into StudyOS using their Google account. What I implemented Installed @react-oauth /google Added JWT decoding to extract user info Configured Google OAuth in React Created login flow using Google Identity Services Fixed OAuth issues including: Displayed user profile after login: Name Profile picture Restricted app access until user is signed in What works now Sidebar navigation between pages Dashboard layout structure Google Sign-In authentication system User session state (logged in / logged out) Profile display in header after login Challenges The biggest issue was Google OAuth configuration. I initially encountered: Error 400: origin_mismatch This happened because the correct localhost URLs were not added in the Google Cloud Console. Fix Added the following to Authorized JavaScript origins: http://localhost:5173 http://127.0.0.1:5173 After fixing this, Google Sign-In worked successfully. Next steps Connect Google Calendar API (real events) Connect Gmail API (inbox preview) Connect Google Drive API (file access) Build Assignment Workspace system Add AI Daily Briefing (smart planning system) Implement “Stay signed in” persistence Improve UI with modern styling (glassmorphism + animations)
Devlog #3 — Making the Calendar Page and Dashboard This week, I worked on two of the biggest parts of StudyOS so far: the Calendar page and the Dashboard . Calendar Page I started turning the Calendar page into something more useful than a simple event list. I added different views for Today , Week , and Month , making it easier to see upcoming events in different ways. I also improved how events are displayed by adding: Expandable event descriptions A cleaner event layout A structure that’s easier to build on with more features later These changes make the calendar feel much closer to a real productivity app. Dashboard I also redesigned the Dashboard to work more like a student command center. One of the biggest improvements was turning the upcoming events section into a scrollable card . This keeps the dashboard clean even when there are lots of events and prevents long lists from stretching the page. This new layout also leaves room for future dashboard widgets, such as: AI daily briefing Assignment priority Recent activity What’s Next? Next, I plan to continue improving the Calendar page by adding: Creating events Editing events Deleting events After that, I’ll begin building more dashboard widgets to make StudyOS feel like a true all-in-one student workspace.
Devlog #4 – Gmail, Google Classroom, and Calendar Improvements What I Worked On I focused on connecting more Google services to StudyOS and improving how calendar data is displayed. Google Classroom I created a new Classroom page that automatically loads my Google Classroom courses and displays assignments from each class. Features Added Connected to the Google Classroom API. Loaded all enrolled courses. Retrieved coursework from every class. Combined assignments into one list. Sorted assignments by due date. Displayed the class name with each assignment. Problems Solved Fixed OAuth authentication issues. Added the required Google Classroom scopes. Debugged 401 Unauthorized and 403 Permission Denied errors. Learned that teachers can restrict API access to coursework, causing some assignments to be unavailable. Gmail I continued improving Gmail integration. Improvements Better loading of Gmail messages. More reliable Google authentication. Cleaner organization for displaying emails. Google Calendar The calendar received several major improvements. Features Added Combined events from every calendar instead of only the primary calendar. Added search functionality. Added Today, Week, and Month views. Added Previous, Next, and Today navigation buttons. Added support for changing weeks and months without reloading. Sorted all events by date. Bug Fixes Fixed missing events caused by incorrect API parameters. Fixed events not appearing from shared calendars. Fixed date filtering logic. Corrected React state issues with currentDate . Fixed navigation bugs while switching between calendar views. Next Steps Create and edit calendar events directly from StudyOS. Add assignment completion tracking. Display Gmail labels and unread counts. Improve the calendar UI with drag-and-drop support. Connect Google Drive files to assignments.
Devlog #5 — Calendar event control complete I focused on finishing the calendar management system for StudyOS. My goal was to make it possible to fully manage Google Calendar events without leaving the app. Building the Event Modal The first major feature I completed was the New Event Modal . Users can now enter: Event title Description Location Start date and time End date and time I originally built the modal using a standard HTML form, but I ran into issues where React would disconnect the form before it could submit. Instead of continuing to fight that problem, I redesigned the modal to use React state and button click handlers. This made creating events much more reliable. Editing and Deleting Events After creating events worked, I added the ability to edit them. Clicking an event now opens the same modal with all of the event information already filled in. Users can: Update event information Delete the event Cancel without making changes This required connecting the app to the Google Calendar Update and Delete API endpoints and refreshing the calendar after every change so the UI always stays up to date. Multiple Calendar Support One feature I really wanted was support for multiple calendars. Instead of always saving events in the primary calendar, the app now retrieves every calendar connected to the user’s Google account. A dropdown menu allows users to choose exactly where a new event should be saved. Bug Fixes Along the way I fixed several issues: Fixed React form submission problems by replacing the form with state-based inputs. Fixed the event modal not updating correctly when switching between events. Fixed the calendar not refreshing after creating, editing, or deleting events. Fixed event selection in the Today , Week , and Month views. Fixed creating events in calendars other than the primary calendar. Current Features The calendar now supports: Today , Week , and Month views Searching events Creating new events Editing existing events Deleting events Selecting which Google Calendar an event belongs to Automatic refresh after every change Next Steps Add recurring event support Add event color customization Add reminders and notifications Improve the calendar interface Add drag-and-drop scheduling I’m really happy with how this update turned out because the calendar has gone from being a read-only viewer to a fully functional event manager.
Dev Log #6 – Local AI Integration with Ollama Overview Today I addeed a completely local AI model using Ollama . I researched local large language models and decided to integrate the Llama 3.2 3B model through Ollama. What I Worked On Installed Ollama and downloaded the llama3.2:3b model. Fixed the issue where PowerShell could not recognize the ollama command by updating my system PATH . Learned that Ollama automatically starts its own server, so running ollama serve again caused a port conflict. Created a Node.js backend using Express and CORS . Connected the backend to Ollama’s local API. Updated the React frontend to send AI requests to my local backend instead of OpenRouter. Removed the dependency on paid AI APIs. Challenges One of the biggest challenges was getting the backend running correctly. I accidentally tried to run server.js before creating the file, which caused a MODULE_NOT_FOUND error. After creating the server and installing the required packages, I was able to start it successfully. Another challenge was that the AI initially hallucinated events like holidays and birthdays that weren’t actually on my calendar. To fix this, I rewrote the prompt to clearly instruct the model to only use the calendar events provided and never invent additional information. Improvements I redesigned the AI briefing prompt so it now: Uses only events from the next 7 days . Creates a structured daily briefing. Highlights upcoming due dates, tests, meetings, and deadlines. Suggests what to focus on for the day. Ends with a short motivational message. Avoids generating fake events. Result The AI summary feature now runs entirely on my own computer with: No API keys No usage limits Faster response times Better privacy because calendar data never leaves my computer. The morning briefing is much more useful and feels like a real student assistant instead of a generic chatbot.
Ships:
What did you make? I built StudyOS, an AI-powered student dashboard that connects with Google Calendar to display upcoming events and generate personalized daily briefings. Instead of checking multiple apps, students get a single dashboard with their schedule, upcoming deadlines, and AI-generated advice for the day. (AI is still in beta) What was challenging? The biggest challenge was integrating multiple technologies together. Setting up Google OAuth, retrieving events from every calendar, deploying the website, and running a local AI model with Ollama all required debugging and learning new tools. I also had to figure out how to make the AI generate useful daily briefings instead of generic responses. What are you proud of? I’m most proud that the project actually works end-to-end. Users can sign in with Google, view all of their upcoming calendar events, and receive an AI-generated morning briefing based on their real schedule. What should people know so they can test it? The live demo is available here: https://study-website-88jo-4xbo1kols-zhal8403s-projects.vercel.app/ To fully test the project: Sign in with a Google account. Allow Calendar permissions. Make sure your Google Calendar has a few upcoming events. The dashboard will display your upcoming events and generate a personalized daily briefing based on your schedule. Note: The AI runs locally using Ollama, so the hosted demo currently uses a placeholder briefing. Running the project locally with Ollama enabled provides the full AI experience....
|
1793220699.4509747
|
1793307099.4509747
|
|
7768
|
Untitled by @ArnavJ | Stardance
|
ArnavJ
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @ArnavJ | Stardance
|
1793220702.2062323
|
1793825502.2062323
|
|
33817
|
Untitled by @ | Stardance
|
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @ | Stardance
|
1793220703.268512
|
1793825503.268512
|
|
23588
|
LighterWebUI by @Capy | Stardance
|
Capy
|
1
|
45.0
|
838
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-01T20:45:07Z", "hours": 45.0, "multiplier": 18.87, "payout": 838, "blessing": "neutral", "text": "I made LighterWebUI, a lightweight local AI client based on Ollama. It uses as little as 70MB of RAM at idle, over 6x less than OpenWebUI, making it easy to run on a Pi Zero 2 W (512MB RAM). It uses Ollama, a well-known way to run inference locally. The profile system is similar to Neflix. IMPORTANT: For this demo, the AI models are run through an API, not locally, as I’m not able to run large LLMs reliably enough on my hardware. Please don’t use any swearing, slurs or otherwise bad language with the AI. You may create and delete your own chats and users, but please leave the existing ones as they are. The stack: SvelteKit frontend and backend, Ollama for inference, Acebase local (NoSQL) database.", "repo": "https://github.com/CapyGamesXD/LighterWebUI", "demo": "https://lighterwebui.capydesigns.com/home/"}]...
|
[{"post_id": 39117, "ts": "202 [{"post_id": 39117, "ts": "2026-08-01T20:30:17Z", "hours": 0.5122, "text": "Fixed final bugs before shipping! I sent the project to some friends to check that everything worked as expected. It didn’t. I fixed what didn’t and now I’m READY TO SHIP!!!! Thank you guys for reading all these devlogs! <3"}, {"post_id": 39022, "ts": "2026-08-01T18:00:21Z", "hours": 0.5603, "text": "Polished bugs! This might be my last devlog! I plan to write quite a specific ship note for the users telling them what they may and may not do. Thanks so much to everyone who was here from the start of LighterWebUI! I’ve really enjoyed this project and I’m looking forward to the next one! I’ve got some ideas, so keep an eye out! Anyway, I removed some excess logs, polished some code layout, just made the whole thing a little nicer. I also started hosting at https://lighterwebui.capydesigns.com ! I may have to take it down a couple times. I’ve made 3 profiles with a chat in each of them that the users can use to test the site. Bye guys! <3 Happy hacking!"}, {"post_id": 38970, "ts": "2026-08-01T16:18:24Z", "hours": 5.4911, "text": "HUGE devlog! I made a TON of changes, improvements, etc! First, mobile compatibility! The user can now change the system prompt. I added a nice (basic) loading screen . I improved a big database inefficiency with the messaging system. (before I continue, please consider the fact that it was probably 22:30 when I coded this, and I was likely somewhat delirious), the messaging system would take the current array from the DB, add the new messages, and replace the entire file. FOR EVERY MESSAGE. This is heavy on RAM, slow and way more operations than are needed, also getting slower the longer the chat is. Now, when the user sends a message and the AI replies, that pair of messages get sent over and pushed to the chat. 2 messages, not the entire chat! I finally added the Lighter, Web, and UI pages. I had a tag that bound to a routeSelect variable. This routeSelect variable would determine the apiRoute. The fix was to just get rid of the routeSelect and bind the to the apiRoute. (whoops!) OH! Something I totally almost forgot to mention! I made the starting pages! You now follow this flow: Press the PEAK start button, grab your admin code, get prompted to set up Ollama (or the cloud API), then enter your username, then finally, the last page gives you the same glorious button to finish the tutorial/intro, alongside the repo link. I also edited the README a bunch to add instructions for setup. I’m opting to recommend Bun over Node for running it. Also! I tested more for the RAM usage. I found that (after rebooting my Pi) I managed to get <70MB usage at idle. That is INSANE! This will - of course fluctuate with the number of concurrent users/prompts, but is really impressive nonetheless. I also tested in on my Pi Z2W to make sure it worked. Start-to-finish, I found a few missing dependencies in the package.json, which I quickly added. Now, the project can be downloaded and run in just 5 terminal commands! Finally, I ran a code review thingy using VSCode’s AI tool (I made sure to tell it not to generate code!) and it found a few minor bugs, so I fixed the main ones. I also ignored some because they’re incredibly unlikely to happen in general, let alone during the initial ship period. I’d rather not waste time fixing things like “what if the server dies midway through this exact token output and that goes kaboom” or whatever lol. Oh, one last thing, I removed my custom alerts. They were nice, but also very useless… I replaced them with the browser’s own confirmation dialog, since it’s simpler and honestly nicer to use! Also 100% cross-platform. Two little sub-notes, I can’t show all pages of the setup because of the attachment limit on Stardance, so you’ll just have to run the project yourself to see it (hehehe), and secondly, don’t worry, I’ll make sure to change the password shown in that image. I’m gonna delete the database entirely again before I ship! Anyway! Sorry again for the long devlog, I just have so much to say! I also omitted a TON of smaller optimisations/changes again, but they’re generally irrelevant to the user’s experience, and I doubt anyone would want to read a 10,000 word devlog like “and then I added another pixel to the offset… Then removed it… Then added it back…” If I remember something less brain-meltingly boring, I’ll make sure to add it! (P.S, this is me coming back and editing the project because I’d WAY surpassed the character limit!) Thanks so much for reading what’s possibly one of my last devlogs! Happy hacking everyone! I MIGHT see you in the next one!"}, {"post_id": 36518, "ts": "2026-07-28T18:00:34Z", "hours": 3.0181, "text": "# I FINISHED THE MAIN PAGE’S FEATURES!!! I added a create and remove user function. I also entirely overhauled how they’re stored. Time for the boring dev talk: Before, the DB ref was (‘/LighterWebUI/users/’) and now it’s (‘/LighterWebUI/users/${userId}’), meaning I can modify them as I need without having to first fetch the array, modify it and then re-send it to the db. It’s a TINY bit more efficient, and a lot easier to use. Also, STATISTICS! I took a few measurements, here are the results. <100MB idle (about 95MB) Idling with 10 browser tabs running it took it way up to… 105MB According to my very thorough single Google search, the average idle for OpenWebUI is 400-650MB, making mine 4-6x less RAM usage! I also improved some of the logic surrounding the presets for API endpoints. UX improvements too! I MASSIVELY improved the UI of certain things like the user profile system, which now doesn’t display the currently selected profile as an option (not super significant, but nice). I also added the option to add new users. The chats list now (finally) shows which chat you’re active in. It highlights it in a lighter gray. I also made it so that when you use the “override model selection”, the options disappear so you don’t have an empty element :) I fixed the colours and improved continuity across colourful elements (before I had like 4 different blue colours that were basically identical XD) I feel like the UI is kinda Discord-esque on the user page, which I quite like :D I also added a lil function to close all menus, which streamlines all the others instead of manually closing every one of them. As far as I can remember that’s basically it! OH WAIT NO I added a new settings menu! It’s totally different now. :) I organised some things and split it into two sides, regular and advanced. I’m very close to finishing the project! Probably <10 hours left on it. (I’m gonna fix the weird text spacing soon DW lol) I’ll also add a ‘cancel’ option to the New User menu. As usual, if I remember anything else I’ll add it in the comments :D Thanks for reading guys! <3 Happy hacking!"}, {"post_id": 35324, "ts": "2026-07-26T17:20:30Z", "hours": 4.8344, "text": "The grand settings, backend and UX update of ’26! I added a bunch of backup logic behind the custom route fetching! It’s working great now! I then also had to fix a bunch of things with the guest route, because that was all messed up from the settings stuff. I added a new tool! The AI can now run endChat() to stop the user and delete the chat if they ask/say something harmful. I would like to stop it before it reaches my API provider, but I don’t think HC would appreciate me putting a “slurs.txt” file into my repo When the AI calls the function, it fetches the current chat and simply deletes it. It also notifies the user through a simple error system I’ve made. From there, the user can currently create a new chat. I’m prepared to keep it this way for now, since I don’t want to limit other people from using their own local models for whatever they might want. I’m also considering providing the option to rely solely on the model’s guardrails. I’ve just gotta hope nobody wants to test that feature upon shipping… Speaking of which, I’ve massively changed my mind on how I’ll handle that! It’s NOT going to be hosted on-device for the ship, which I know sounds ironic (and frankly, is, given it’s a local AI client), but I don’t want any users saying “this local 0.5B AI is terrible, it must be a bad project!”, and will thus use Ollama’s official cloud API. Also, if my Pi were to receive multiple prompts at once, it would likely… Die. This would A: suck, because I’d need to restart it frequently and B: prevent any users from rating it while it’s off. If it dies at midnight, I won’t know until I wake up! Ollama’s Cloud API has seemingly good uptime (I couldn’t find any stats online, but it seems decent!) and provides me with much larger models, up to 120B (and likely higher) without having to pay. That brings me to one of the largest things I had to figure out! If a user selects an unavailable model (Kimi K2.6, for instance), the server returns an error (which was surprisingly difficult to actually parse/decode!) and fails. I created a system to return that the prompt failed, then check that the fallback model is different from the current model. If so, it warns the user, then goes to the fallback model and regenerates by itself, automatically. The default fallback is Gemma4:31B, since it’s a free Ollama model. I’m providing my own key, so users don’t need to enter their own. If the fallback is the SAME as the current, it’ll show an unexpected error. I also added auto scrolling, although I couldn’t figure it out, so I debugged using Gemini and managed to fix it. It’s a ChatGPT-style scrolling system! It binds you to the bottom while it’s generating, but if you scroll up, it’ll sever that binding, letting you scroll freely. If you want to continue following the AI’s text stream, simply scroll back down! I am considering adding a button to do so as well, since that could be a very easy feature to add and improve overall UX. Oh right, I also fixed the displaying of when the AI uses tools! I found out that the Vercel AI SDK has a new system for it in the newest version and used that instead. I think I added some more stuff, but I can’t really remember it all right now! Most of the time spent was debugging the things I broke while adding new features. I’ll add anything I remember as a comment on this devlog! Also check the changelog if you wanna see more stuff (and specifics!) :) I acknowledge that this is my longest devlog so far, but I just wanted to be thorough! If you have any questions, I’d love to answer them in the comments!!!"}, {"post_id": 34728, "ts": "2026-07-25T18:01:16Z", "hours": 4.57, "text": "URL UPDATEEEE! I FINALLY added custom URLs! I mentioned wanting to do that in the last devlog, but now you CAN! I finished the settings page’s content, including adding an entire auth system (painful) and trying to make the UX nicer (also painful), alongside encountering a TON of other bugs and having to fix those. I also made a system to generate passwords randomly to access the admin controls. It OFFICIALLY works with other APIs! Simply enter the route (e.g, https://ollama.com/api ) and your API key and it’ll handle the rest. This is just the main feature I added, but I added a TON of other things too! ANYWAY! Still on the “//TODO:” list: A TON OF STUFF! I plan to add customisable temperature next, then the into/“welcome” screens, then all the scrolling and animation stuff. I think I can do this in time though, which is a great feeling having coded less recently."}, {"post_id": 31736, "ts": "2026-07-20T11:36:36Z", "hours": 4.4872, "text": "Hey! Added web search integration, a settings menu, and I’m working on an admin page! I also added text formatting, which was a pain to test with the 0.5B model because of how disobedient it can be I plan to allow the user to change the API route (and key) through a locked admin page. I’m working through security issues with that, and spent a fair amount of time thinking of how to fix that. My current plan is: Generate a secret “key” during setup that unlocks the admin page. When the user visits the page, ask them for the key to submit the changes. If the user hasn’t been authenticated, do not allow them to change settings. The main concern is that they could use devtools to just toggle the variable, hence fetching it directly within the function. I think it’ll work, but I’ll need to do some testing. :) I also added a little icon if the user hasn’t got a Tavily API key for web search functionality. The image currently shows the route editable within the client side. I might go with that and have the same logic behind it on the home page instead of a separate /admin page. In all honesty, I’m kinda overwhelmed. This is the biggest project I’ve ever made, and I feel like I keep accidentally switching features and missing stuff out. Anyway, it’s still really fun, so I’m still going for that Flipper Zero and TRMNL kit! :D Thanks for reading!!!"}, {"post_id": 30631, "ts": "2026-07-18T11:01:58Z", "hours": 3.1933, "text": "MASSIVE overhaul of the backend! As you may recall, I previously spent a few hours trying (and failing) to implement tool calling. I did a bit of research (Google Gemini helped with the research portion!) and found that the Vercel AI SDK has the ability to stream text while tool calling, with WAY less code than doing it manually! The great conversion of ’26… That SUCKED!!! It worked great until I noticed that the database no longer worked… Anyway, as of 5 minutes ago, I just fixed that! I completely removed my local “messages” array and replaced it with chat.messages. I LOVE THE VERCEL AI SDK!! It’s amazing. I just need some tool ideas of what to add.. (Currently, there’s just a short pause and a gap above the messages to indicate a tool was used, but I plan to replace that with a nice “Tool used: ____” now! I also did a TON of other things, including fixing many bugs with the new user system, but that seems to OFFICIALLY be working now!! Only took me 20+ hours to get a working AI client T_T But now I can start getting it NICE! :) I’ll improve UI, add a TON of pages, etc! If you have any default tool suggestions, please do give them."}, {"post_id": 29011, "ts": "2026-07-15T17:39:29Z", "hours": 3.2464, "text": "I FINISHED THE USER SYSTEM after a ton of uhh.. Pain and suffering! :D JK, it wasn’t too bad. I did, however encounter a loop of failing code that I couldn’t figure out! Turns out, my localStorage thingy was broken! I accidentally set it wrong! Anyway, after finally fixing that, I kept going! I removed the DB from github too lol. Unfortunately I’ve made no UI changes yet, so there’s really nothing interesting to see. AI usage: I debugged a few errors using Gemini, finding the solution. Still no AI code was used. I found that I could use return functions with $effect runes, which I somehow missed before! That came in handy with the fancy system I added to not entirely break the website if you leave during a stream. :) For some reason, the page is UNBELIEVABLY slow to initially load on development mode, so that sucks… It works instantly on release though, so that’s great! I added a few new messages to the main screen. Some backups too, one of which is visible below. It tells you instantly what profile you’re on. I’ll consider varying that each time like most AI websites do, but I’ll make sure to keep it as small as possible. I have a LOT to do on my Trello board still, which is ironic. The more work I do, the more issues I find! The board gets longer each devlog T_T Somewhat interesting update: I’m gonna add some docs (likely on Github, unless I feel inclined to code them!) in which there’ll be an error code section. I’m making my own error codes, specific to the website. :) Currently got: A1: user error (not logged in, corrupt data, etc.) U1: unknown error M1: unavailable model P1: invalid prompt I plan to maybe add profanity filtering to the prompt validity checker (which I’ve also yet to implement)! I can also make a nice customisable theme across pages. Exciting devlog, because now I can get back onto the FUN STUFF!!! No more ‘why account no work T_T’ stuff! Thanks for reading, happy coding!"}, {"post_id": 28412, "ts": "2026-07-14T17:27:24Z", "hours": 4.5658, "text": "More work! :D As the image shows, I just finished implementing ‘guest’ mode and have started on the user profile system (on the right) I plan to: Finish adding it, fixing the UI, etc. Add it to the setup process :O Anyway, other things (massively summarised to fit a devlog… If you want to know more, check the repo!) I designed an icon! That wasn’t logged for time. :) I implemented the logo (it doubles as a guest profile picture thing on the top right!) It’s a bit generic, very “AI company”-esque, but still - pretty nice for my first Inkscape logo :D I’ve added some nice icons, as you can see in the sidebar. I forced alignment of the title, so that’s fixed! :) I fixed the bug where the user could enter a prompt without having a user object assigned to them. For Guest detection, I basically just say “if(!user.userId)”, since the Guest is the only profile that will NEVER have an automatically assigned user ID. I’ve totally revamped the user system: It’s now a JSON object called user, with various items like userName, userId, and userPlainNum. PlainNum is for ordering, and I was pretty sure I had something in mind, but I can’t remember why I added it so it might be removed. I’m at 571 lines of code! I made several new JS backend files for this user system, so I’m very excited to introduce it! I am posting this devlog only part of the way through coding that system. Suffice to say my Trello board is FULL! Also, heh… Embarrassing story: I kinda committed the database :) BUT! It wasn’t public anyway, so it’s just my debugging “uhhh… hello? HELLO??? Are you there?” prompts. Nothing secret. Also probably best that it happens during development and before I have users! Anyway, since I’m HORRIBLE with Git commands, I used Gemini to help fix it. Hopefully that worked. As I said in the AI declaration thingy, none of the code is copy-pasted from AI, and is all Capy-written :D (PS, I probably skipped over 500 tiny bug fixes and a few bigger features, but we’d both be here for a while if I hadn’t.) Thanks so much for reading my devlog! Happy coding!"}, {"post_id": 22863, "ts": "2026-07-05T14:16:18Z", "hours": 5.1, "text": "I added a BUNCH of stuff! I was so locked in that I forgot to make a devlog! Let’s make this one shorter: I added the left panel I added multiple new backend files for the DATABASE!!! I added a database (AceBase!) I improved the UI I’m testing with another AI model for now Okay, onto the detailed stuff. AceBase! It’s a really nice database package thingy! It has FireStore-like syntax but without the annoying stuff. :) I’ll definitely use it in future projects too! Anyway, using that I made a system to create, fetch, etc new chats! Now they’re stored in the database alongside their associated crypto-UUID key. That’s passed as a search parameter (kinda like YouTube videos!) and fetched, then the messages are loaded. I did way more that honestly can’t fit into this devlog, so that’s the main stuff out of the way. :) To do: UI! It’s still got some smaller issues (the title is off-centre :O) Fix a BUNCH of backend bugs Add auto-chat naming (just the first few words of the user’s prompt for now :D) Add a user profile system (like Netflix :O) Add a “guest mode” account. Make the URL customisable (in case someone’s hosting at a different address) Make a customisable system prompt! Decide what models are suitable for release. Add some nice (lucide.dev) icons! And a BUNCH more! Thanks for reading! :D Happy coding!"}, {"post_id": 22148, "ts": "2026-07-04T13:42:08Z", "hours": 4.6039, "text": "Devlog #2! This one was a challenge… I started by spending an hour or two trying to figure out a nice system for function calling, before coming to the sad realisation that it wouldn’t be very useful. I then experimented with AI models, and realised that SmoLLM is a nice balance between intelligence and size! I also discovered that Ollama (by default) doesn’t allow two prompts at once. I plan to keep this functionality, despite its obvious drawbacks. If I didn’t have it in place, two users using different (or even the same) models could totally crash the Pi. That would leave the site down for hours on end if I’m not available to fix it. With Ollama’s prevention, worst case scenario: one user waits a few extra seconds. Anyway, I also started working on the UI! I’ve also implemented a nice system that fetches the available models, which seems to work great! I’m currently getting a nice input box. The images of UI from the last devlog were the Figma designs, but now it’s time to actually make them in HTML and CSS! I’ve done a lot of other backend stuff, playing around with various experiments, but now I’m back to working on the frontend for now. One last thing: I’m still deciding how the website will work. I might add Firebase authentication. This would allow easy saving of chats. It would also, however make the development experience more complicated and the app itself less streamlined. Another concern is that people run local AI for security, so posting everything they’ve said off to Google is a little pointless. I’ve got two other options: local JSON (or SQL :P) database, and no storage at all. I think the SQL database will have to be made. :) Thanks so much for reading the devlog! Sorry I made it so long… Also! A feature I’m super proud of! The title card at the top of the image isn’t just a title! Each word lights up when you hover. If you click, it takes you to a page detailing the feature of the site. (E.g, ‘lighter’ will take you to the page describing how I made the site efficient and lightweight!) Thanks for reading!"}, {"post_id": 17631, "ts": "2026-06-28T14:44:42Z", "hours": 0.4275, "text": "First devlog! I FINALLY got the text streaming working! Unfortunately, Wakatime didn’t work for the first almost 2 hours of coding! Oh well! Not much I can do XD I am really happy with it! Currently running Qwen 2.5 coder 3B, which works great! This is all running on my Raspberry Pi 5 4gb (which I got from the last Hackclub event!!!), so I’m super grateful that my projects could get me such amazing hardware, thank you Hackclub! ❤️"}]...
|
Title: LighterWebUI by @Capy | Stardance
Devlogs: Title: LighterWebUI by @Capy | Stardance
Devlogs:
First devlog! I FINALLY got the text streaming working! Unfortunately, Wakatime didn’t work for the first almost 2 hours of coding! Oh well! Not much I can do XD I am really happy with it! Currently running Qwen 2.5 coder 3B, which works great! This is all running on my Raspberry Pi 5 4gb (which I got from the last Hackclub event!!!), so I’m super grateful that my projects could get me such amazing hardware, thank you Hackclub! ❤️
Devlog #2! This one was a challenge… I started by spending an hour or two trying to figure out a nice system for function calling, before coming to the sad realisation that it wouldn’t be very useful. I then experimented with AI models, and realised that SmoLLM is a nice balance between intelligence and size! I also discovered that Ollama (by default) doesn’t allow two prompts at once. I plan to keep this functionality, despite its obvious drawbacks. If I didn’t have it in place, two users using different (or even the same) models could totally crash the Pi. That would leave the site down for hours on end if I’m not available to fix it. With Ollama’s prevention, worst case scenario: one user waits a few extra seconds. Anyway, I also started working on the UI! I’ve also implemented a nice system that fetches the available models, which seems to work great! I’m currently getting a nice input box. The images of UI from the last devlog were the Figma designs, but now it’s time to actually make them in HTML and CSS! I’ve done a lot of other backend stuff, playing around with various experiments, but now I’m back to working on the frontend for now. One last thing: I’m still deciding how the website will work. I might add Firebase authentication. This would allow easy saving of chats. It would also, however make the development experience more complicated and the app itself less streamlined. Another concern is that people run local AI for security, so posting everything they’ve said off to Google is a little pointless. I’ve got two other options: local JSON (or SQL :P) database, and no storage at all. I think the SQL database will have to be made. :) Thanks so much for reading the devlog! Sorry I made it so long… Also! A feature I’m super proud of! The title card at the top of the image isn’t just a title! Each word lights up when you hover. If you click, it takes you to a page detailing the feature of the site. (E.g, ‘lighter’ will take you to the page describing how I made the site efficient and lightweight!) Thanks for reading!
I added a BUNCH of stuff! I was so locked in that I forgot to make a devlog! Let’s make this one shorter: I added the left panel I added multiple new backend files for the DATABASE!!! I added a database (AceBase!) I improved the UI I’m testing with another AI model for now Okay, onto the detailed stuff. AceBase! It’s a really nice database package thingy! It has FireStore-like syntax but without the annoying stuff. :) I’ll definitely use it in future projects too! Anyway, using that I made a system to create, fetch, etc new chats! Now they’re stored in the database alongside their associated crypto-UUID key. That’s passed as a search parameter (kinda like YouTube videos!) and fetched, then the messages are loaded. I did way more that honestly can’t fit into this devlog, so that’s the main stuff out of the way. :) To do: UI! It’s still got some smaller issues (the title is off-centre :O) Fix a BUNCH of backend bugs Add auto-chat naming (just the first few words of the user’s prompt for now :D) Add a user profile system (like Netflix :O) Add a “guest mode” account. Make the URL customisable (in case someone’s hosting at a different address) Make a customisable system prompt! Decide what models are suitable for release. Add some nice (lucide.dev) icons! And a BUNCH more! Thanks for reading! :D Happy coding!
More work! :D As the image shows, I just finished implementing ‘guest’ mode and have started on the user profile system (on the right) I plan to: Finish adding it, fixing the UI, etc. Add it to the setup process :O Anyway, other things (massively summarised to fit a devlog… If you want to know more, check the repo!) I designed an icon! That wasn’t logged for time. :) I implemented the logo (it doubles as a guest profile picture thing on the top right!) It’s a bit generic, very “AI company”-esque, but still - pretty nice for my first Inkscape logo :D I’ve added some nice icons, as you can see in the sidebar. I forced alignment of the title, so that’s fixed! :) I fixed the bug where the user could enter a prompt without having a user object assigned to them. For Guest detection, I basically just say “if(!user.userId)”, since the Guest is the only profile that will NEVER have an automatically assigned user ID. I’ve totally revamped the user system: It’s now a JSON object called user, with various items like userName, userId, and userPlainNum. PlainNum is for ordering, and I was pretty sure I had something in mind, but I can’t remember why I added it so it might be removed. I’m at 571 lines of code! I made several new JS backend files for this user system, so I’m very excited to introduce it! I am posting this devlog only part of the way through coding that system. Suffice to say my Trello board is FULL! Also, heh… Embarrassing story: I kinda committed the database :) BUT! It wasn’t public anyway, so it’s just my debugging “uhhh… hello? HELLO??? Are you there?” prompts. Nothing secret. Also probably best that it happens during development and before I have users! Anyway, since I’m HORRIBLE with Git commands, I used Gemini to help fix it. Hopefully that worked. As I said in the AI declaration thingy, none of the code is copy-pasted from AI, and is all Capy-written :D (PS, I probably skipped over 500 tiny bug fixes and a few bigger features, but we’d both be here for a while if I hadn’t.) Thanks so much for reading my devlog! Happy coding!
I FINISHED THE USER SYSTEM after a ton of uhh.. Pain and suffering! :D JK, it wasn’t too bad. I did, however encounter a loop of failing code that I couldn’t figure out! Turns out, my localStorage thingy was broken! I accidentally set it wrong! Anyway, after finally fixing that, I kept going! I removed the DB from github too lol. Unfortunately I’ve made no UI changes yet, so there’s really nothing interesting to see. AI usage: I debugged a few errors using Gemini, finding the solution. Still no AI code was used. I found that I could use return functions with $effect runes, which I somehow missed before! That came in handy with the fancy system I added to not entirely break the website if you leave during a stream. :) For some reason, the page is UNBELIEVABLY slow to initially load on development mode, so that sucks… It works instantly on release though, so that’s great! I added a few new messages to the main screen. Some backups too, one of which is visible below. It tells you instantly what profile you’re on. I’ll consider varying that each time like most AI websites do, but I’ll make sure to keep it as small as possible. I have a LOT to do on my Trello board still, which is ironic. The more work I do, the more issues I find! The board gets longer each devlog T_T Somewhat interesting update: I’m gonna add some docs (likely on Github, unless I feel inclined to code them!) in which there’ll be an error code section. I’m making my own error codes, specific to the website. :) Currently got: A1: user error (not logged in, corrupt data, etc.) U1: unknown error M1: unavailable model P1: invalid prompt I plan to maybe add profanity filtering to the prompt validity checker (which I’ve also yet to implement)! I can also make a nice customisable theme across pages. Exciting devlog, because now I can get back onto the FUN STUFF!!! No more ‘why account no work T_T’ stuff! Thanks for reading, happy coding!
MASSIVE overhaul of the backend! As you may recall, I previously spent a few hours trying (and failing) to implement tool calling. I did a bit of research (Google Gemini helped with the research portion!) and found that the Vercel AI SDK has the ability to stream text while tool calling, with WAY less code than doing it manually! The great conversion of ’26… That SUCKED!!! It worked great until I noticed that the database no longer worked… Anyway, as of 5 minutes ago, I just fixed that! I completely removed my local “messages” array and replaced it with chat.messages. I LOVE THE VERCEL AI SDK!! It’s amazing. I just need some tool ideas of what to add.. (Currently, there’s just a short pause and a gap above the messages to indicate a tool was used, but I plan to replace that with a nice “Tool used: ____” now! I also did a TON of other things, including fixing many bugs with the new user system, but that seems to OFFICIALLY be working now!! Only took me 20+ hours to get a working AI client T_T But now I can start getting it NICE! :) I’ll improve UI, add a TON of pages, etc! If you have any default tool suggestions, please do give them.
Hey! Added web search integration, a settings menu, and I’m working on an admin page! I also added text formatting, which was a pain to test with the 0.5B model because of how disobedient it can be I plan to allow the user to change the API route (and key) through a locked admin page. I’m working through security issues with that, and spent a fair amount of time thinking of how to fix that. My current plan is: Generate a secret “key” during setup that unlocks the admin page. When the user visits the page, ask them for the key to submit the changes. If the user hasn’t been authenticated, do not allow them to change settings. The main concern is that they could use devtools to just toggle the variable, hence fetching it directly within the function. I think it’ll work, but I’ll need to do some testing. :) I also added a little icon if the user hasn’t got a Tavily API key for web search functionality. The image currently shows the route editable within the client side. I might go with that and have the same logic behind it on the home page instead of a separate /admin page. In all honesty, I’m kinda overwhelmed. This is the biggest project I’ve ever made, and I feel like I keep accidentally switching features and missing stuff out. Anyway, it’s still really fun, so I’m still going for that Flipper Zero and TRMNL kit! :D Thanks for reading!!!
URL UPDATEEEE! I FINALLY added custom URLs! I mentioned wanting to do that in the last devlog, but now you CAN! I finished the settings page’s content, including adding an entire auth system (painful) and trying to make the UX nicer (also painful), alongside encountering a TON of other bugs and having to fix those. I also made a system to generate passwords randomly to access the admin controls. It OFFICIALLY works with other APIs! Simply enter the route (e.g, https://ollama.com/api ) and your API key and it’ll handle the rest. This is just the main feature I added, but I added a TON of other things too! ANYWAY! Still on the “//TODO:” list: A TON OF STUFF! I plan to add customisable temperature next, then the into/“welcome” screens, then all the scrolling and animation stuff. I think I can do this in time though, which is a great feeling having coded less recently.
The grand settings, backend and UX update of ’26! I added a bunch of backup logic behind the custom route fetching! It’s working great now! I then also had to fix a bunch of things with the guest route, because that was all messed up from the settings stuff. I added a new tool! The AI can now run endChat() to stop the user and delete the chat if they ask/say something harmful. I would like to stop it before it reaches my API provider, but I don’t think HC would appreciate me putting a “slurs.txt” file into my repo When the AI calls the function, it fetches the current chat and simply deletes it. It also notifies the user through a simple error system I’ve made. From there, the user can currently create a new chat. I’m prepared to keep it this way for now, since I don’t want to limit other people from using their own local models for whatever they might want. I’m also considering providing the option to rely solely on the model’s guardrails. I’ve just gotta hope nobody wants to test that feature upon shipping… Speaking of which, I’ve massively changed my mind on how I’ll handle that! It’s NOT going to be hosted on-device for the ship, which I know sounds ironic (and frankly, is, given it’s a local AI client), but I don’t want any users saying “this local 0.5B AI is terrible, it must be a bad project!”, and will thus use Ollama’s official cloud API. Also, if my Pi were to receive multiple prompts at once, it would likely… Die. This would A: suck, because I’d need to restart it frequently and B: prevent any users from rating it while it’s off. If it dies at midnight, I won’t know until I wake up! Ollama’s Cloud API has seemingly good uptime (I couldn’t find any stats online, but it seems decent!) and provides me with much larger models, up to 120B (and likely higher) without having to pay. That brings me to one of the largest things I had to figure out! If a user selects an unavailable model (Kimi K2.6, for instance), the server returns an error (which was surprisingly difficult to actually parse/decode!) and fails. I created a system to return that the prompt failed, then check that the fallback model is different from the current model. If so, it warns the user, then goes to the fallback model and regenerates by itself, automatically. The default fallback is Gemma4:31B, since it’s a free Ollama model. I’m providing my own key, so users don’t need to enter their own. If the fallback is the SAME as the current, it’ll show an unexpected error. I also added auto scrolling, although I couldn’t figure it out, so I debugged using Gemini and managed to fix it. It’s a ChatGPT-style scrolling system! It binds you to the bottom while it’s generating, but if you scroll up, it’ll sever that binding, letting you scroll freely. If you want to continue following the AI’s text stream, simply scroll back down! I am considering adding a button to do so as well, since that could be a very easy feature to add and improve overall UX. Oh right, I also fixed the displaying of when the AI uses tools! I found out that the Vercel AI SDK has a new system for it in the newest version and used that instead. I think I added some more stuff, but I can’t really remember it all right now! Most of the time spent was debugging the things I broke while adding new features. I’ll add anything I remember as a comment on this devlog! Also check the changelog if you wanna see more stuff (and specifics!) :) I acknowledge that this is my longest devlog so far, but I just wanted to be thorough! If you have any questions, I’d love to answer them in the comments!!!
# I FINISHED THE MAIN PAGE’S FEATURES!!! I added a create and remove user function. I also entirely overhauled how they’re stored. Time for the boring dev talk: Before, the DB ref was (‘/LighterWebUI/users/’) and now it’s (‘/LighterWebUI/users/${userId}’), meaning I can modify them as I need without having to first fetch the array, modify it and then re-send it to the db. It’s a TINY bit more efficient, and a lot easier to use. Also, STATISTICS! I took a few measurements, here are the results. <100MB idle (about 95MB) Idling with 10 browser tabs running it took it way up to… 105MB According to my very thorough single Google search, the average idle for OpenWebUI is 400-650MB, making mine 4-6x less RAM usage! I also improved some of the logic surrounding the presets for API endpoints. UX improvements too! I MASSIVELY improved the UI of certain things like the user profile system, which now doesn’t display the currently selected profile as an option (not super significant, but nice). I also added the option to add new users. The chats list now (finally) shows which chat you’re active in. It highlights it in a lighter gray. I also made it so that when you use the “override model selection”, the options disappear so you don’t have an empty element :) I fixed the colours and improved continuity across colourful elements (before I had like 4 different blue colours that were basically identical XD) I feel like the UI is kinda Discord-esque on the user page, which I quite like :D I also added a lil function to close all menus, which streamlines all the others instead of manually closing every one of them. As far as I can remember that’s basically it! OH WAIT NO I added a new settings menu! It’s totally different now. :) I organised some things and split it into two sides, regular and advanced. I’m very close to finishing the project! Probably <10 hours left on it. (I’m gonna fix the weird text spacing soon DW lol) I’ll also add a ‘cancel’ option to the New User menu. As usual, if I remember anything else I’ll add it in the comments :D Thanks for reading guys! <3 Happy hacking!
HUGE devlog! I made a TON of changes, improvements, etc! First, mobile compatibility! The user can now change the system prompt. I added a nice (basic) loading screen . I improved a big database inefficiency with the messaging system. (before I continue, please consider the fact that it was probably 22:30 when I coded this, and I was likely somewhat delirious), the messaging system would take the current array from the DB, add the new messages, and replace the entire file. FOR EVERY MESSAGE. This is heavy on RAM, slow and way more operations than are needed, also getting slower the longer the chat is. Now, when the user sends a message and the AI replies, that pair of messages get sent over and pushed to the chat. 2 messages, not the entire chat! I finally added the Lighter, Web, and UI pages. I had a tag that bound to a routeSelect variable. This routeSelect variable would determine the apiRoute. The fix was to just get rid of the routeSelect and bind the to the apiRoute. (whoops!) OH! Something I totally almost forgot to mention! I made the starting pages! You now follow this flow: Press the PEAK start button, grab your admin code, get prompted to set up Ollama (or the cloud API), then enter your username, then finally, the last page gives you the same glorious button to finish the tutorial/intro, alongside the repo link. I also edited the README a bunch to add instructions for setup. I’m opting to recommend Bun over Node for running it. Also! I tested more for the RAM usage. I found that (after rebooting my Pi) I managed to get <70MB usage at idle. That is INSANE! This will - of course fluctuate with the number of concurrent users/prompts, but is really impressive nonetheless. I also tested in on my Pi Z2W to make sure it worked. Start-to-finish, I found a few missing dependencies in the package.json, which I quickly added. Now, the project can be downloaded and run in just 5 terminal commands! Finally, I ran a code review thingy using VSCode’s AI tool (I made sure to tell it not to generate code!) and it found a few minor bugs, so I fixed the main ones. I also ignored some because they’re incredibly unlikely to happen in general, let alone during the initial ship period. I’d rather not waste time fixing things like “what if the server dies midway through this exact token output and that goes kaboom” or whatever lol. Oh, one last thing, I removed my custom alerts. They were nice, but also very useless… I replaced them with the browser’s own confirmation dialog, since it’s simpler and honestly nicer to use! Also 100% cross-platform. Two little sub-notes, I can’t show all pages of the setup because of the attachment limit on Stardance, so you’ll just have to run the project yourself to see it (hehehe), and secondly, don’t worry, I’ll make sure to change the password shown in that image. I’m gonna delete the database entirely again before I ship! Anyway! Sorry again for the long devlog, I just have so much to say! I also omitted a TON of smaller optimisations/changes again, but they’re generally irrelevant to the user’s experience, and I doubt anyone would want to read a 10,000 word devlog like “and then I added another pixel to the offset… Then removed it… Then added it back…” If I remember something less brain-meltingly boring, I’ll make sure to add it! (P.S, this is me coming back and editing the project because I’d WAY surpassed the character limit!) Thanks so much for reading what’s possibly one of my last devlogs! Happy hacking everyone! I MIGHT see you in the next one!
Polished bugs! This might be my last devlog! I plan to write quite a specific ship note for the users telling them what they may and may not do. Thanks so much to everyone who was here from the start of LighterWebUI! I’ve really enjoyed this project and I’m looking forward to the next one! I’ve got some ideas, so keep an eye out! Anyway, I removed some excess logs, polished some code layout, just made the whole thing a little nicer. I also started hosting at https://lighterwebui.capydesigns.com ! I may have to take it down a couple times. I’ve made 3 profiles with a chat in each of them that the users can use to test the site. Bye guys! <3 Happy hacking!
Fixed final bugs before shipping! I sent the project to some friends to check that everything worked as expected. It didn’t. I fixed what didn’t and now I’m READY TO SHIP!!!! Thank you guys for reading all these devlogs! <3
Ships:
I made LighterWebUI, a lightweight local AI client based on Ollama. It uses as little as 70MB of RAM at idle, over 6x less than OpenWebUI, making it easy to run on a Pi Zero 2 W (512MB RAM). It uses Ollama, a well-known way to run inference locally. The profile system is similar to Neflix. IMPORTANT: For this demo, the AI models are run through an API, not locally, as I’m not able to run large LLMs reliably enough on my hardware. Please don’t use any swearing, slurs or otherwise bad language with the AI. You may create and delete your own chats and users, but please leave the existing ones as they are. The stack: SvelteKit frontend and backend, Ollama for inference, Acebase local (NoSQL) database....
|
1793220704.936078
|
1793307104.936078
|
|
19167
|
Custom Stardance API by @The_Craw | Stardance
|
The_Craw
|
1
|
4.33
|
36
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-16T12:47:45Z", "hours": 4.0, "multiplier": 9.67, "payout": 36, "blessing": "neutral", "text": "Stardance API is my own attempt at making Stardance Projects queryable. Because the official Stardance API isn’t released yet, this serves as a bridge between that and no API at all.", "repo": "https://github.com/Jonah-Crawford/Stardance-API", "demo": "https://stardance-api.ultimatecraw.xyz/docs"}]...
|
[{"post_id": 45045, "ts": "202 [{"post_id": 45045, "ts": "2026-08-11T09:07:07Z", "hours": 0.3306, "text": "I’m back from camping! (RIP my 60+ day streak) My plans going forward immediately is improving program counter modifications to allow for higher-level concepts to be bootstrapped onto Crawssembly instruction sets. (Image unrelated)"}, {"post_id": 9877, "ts": "2026-06-16T10:56:13Z", "hours": 1.5172, "text": "Finished the quirks, history now works properly."}, {"post_id": 9288, "ts": "2026-06-15T16:20:54Z", "hours": 0.5208, "text": "Added a history marker. Every pass will add to a history logger, so data over time can be tracked"}, {"post_id": 9267, "ts": "2026-06-15T15:42:44Z", "hours": 0.9881, "text": "The database now scrapes stardance every 6 hours"}, {"post_id": 9230, "ts": "2026-06-15T14:37:39Z", "hours": 0.6647, "text": "Barebones FastAPI website made for SDAPI"}]...
|
Title: Custom Stardance API by @The_Craw | Stardan Title: Custom Stardance API by @The_Craw | Stardance
Devlogs:
Barebones FastAPI website made for SDAPI
The database now scrapes stardance every 6 hours
Added a history marker. Every pass will add to a history logger, so data over time can be tracked
Finished the quirks, history now works properly.
I’m back from camping! (RIP my 60+ day streak) My plans going forward immediately is improving program counter modifications to allow for higher-level concepts to be bootstrapped onto Crawssembly instruction sets. (Image unrelated)
Ships:
Stardance API is my own attempt at making Stardance Projects queryable. Because the official Stardance API isn’t released yet, this serves as a bridge between that and no API at all....
|
1793220706.211313
|
1793307106.211313
|
|
20688
|
My awesome macropad! by @erins | Stardance
|
erins
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @erins | Stardance
|
1793220707.371371
|
1793825507.371371
|
|
20336
|
bigbot by @arjundakshin | Stardance
|
arjundakshin
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-08-29T13:23:39Z", "hours": 0.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a slack bot named big bot that has some useful features but mostly just pure fun. But one is extremely dangerous do not do the forbidden command.", "repo": "https://github.com/DrivingStork3952/bigbot_slack/", "demo": "https://app.slack.com/client/E09V59WQY1E/C0P5NE354"}]...
|
[{"post_id": 11027, "ts": "202 [{"post_id": 11027, "ts": "2026-06-18T01:49:20Z", "hours": 0.3392, "text": "My first ever DevLog I built my Slack bot. I used Node.js for the first time,e and it was really interesting using APIs with JavaScript. For reference,e my main language is Python, that’s what I usually code everything in. The project started as just a ping and joke, and cat fact, but I started looking into more APIs and kept adding. Bigbott isn’t live is because I still have to apply for a nest container. Hackatime is also being weird and said I only worked on it for 20 minutes, but it was actually a lot more, at least 1 hour. As soon as my Nest Container gets approved, Bigbot will be available for everyone to use (if you want to)."}]...
|
Title: bigbot by @arjundakshin | Stardance
Devlog Title: bigbot by @arjundakshin | Stardance
Devlogs:
My first ever DevLog I built my Slack bot. I used Node.js for the first time,e and it was really interesting using APIs with JavaScript. For reference,e my main language is Python, that’s what I usually code everything in. The project started as just a ping and joke, and cat fact, but I started looking into more APIs and kept adding. Bigbott isn’t live is because I still have to apply for a nest container. Hackatime is also being weird and said I only worked on it for 20 minutes, but it was actually a lot more, at least 1 hour. As soon as my Nest Container gets approved, Bigbot will be available for everyone to use (if you want to).
Ships:
I made a slack bot named big bot that has some useful features but mostly just pure fun. But one is extremely dangerous do not do the forbidden command....
|
1793220708.2924862
|
1793307108.2924862
|
|
22912
|
Vacuum systems simulation by @khyati | Stardance
|
khyati
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Vacuum systems simulation by @khyati | Star Title: Vacuum systems simulation by @khyati | Stardance...
|
1793220709.2160778
|
1793825509.2160778
|
|
34212
|
Untitled by @alinanoman | Stardance
|
alinanoman
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @alinanoman | Stardance
|
1793220710.0961263
|
1793825510.0961263
|
|
18107
|
Vi Encrypt by @violetdoesntexist | Stardance
|
violetdoesntexist
|
1
|
2.0
|
3
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-13T18:23:31Z", "hours": 2.0, "multiplier": 1.46, "payout": 3, "blessing": "neutral", "text": "i shipped vi encrypt a small tool i made to encrypt text in a pretty unsafe way, i randomly had the idea and tried to build it. you can test it yourself by running it locally or installing via pipx pipx install viencrypt", "repo": "https://github.com/violetdoesntexist/vi-encrypt", "demo": "https://github.com/violetdoesntexist/vi-encrypt/releases/tag/viencrypt"}]...
|
[{"post_id": 8210, "ts": "2026 [{"post_id": 8210, "ts": "2026-06-13T17:37:03Z", "hours": 2.2092, "text": "i made the tool!! i added encryption and decryption and did a lot of fixing to get it to actually work and now it fully does!!"}]...
|
Title: Vi Encrypt by @violetdoesntexist | Stardanc Title: Vi Encrypt by @violetdoesntexist | Stardance
Devlogs:
i made the tool!! i added encryption and decryption and did a lot of fixing to get it to actually work and now it fully does!!
Ships:
i shipped vi encrypt a small tool i made to encrypt text in a pretty unsafe way, i randomly had the idea and tried to build it. you can test it yourself by running it locally or installing via pipx pipx install viencrypt...
|
1793220710.9863045
|
1793307110.9863045
|
|
3963
|
My awesome macropad! by @therichst | Stardance
|
therichst
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @therichst | Starda Title: My awesome macropad! by @therichst | Stardance...
|
1793220711.9476104
|
1793825511.9476104
|
|
3755
|
Untitled by @Ecubides | Stardance
|
Ecubides
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @Ecubides | Stardance
|
1793220714.0355752
|
1793825514.0355752
|
|
26437
|
Wireless Piano by @zhal | Stardance
|
zhal
|
1
|
11.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-02T13:24:53Z", "hours": 11.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "What did you make? I built a 12-key ESP32-powered Piano that has a WIFI Mode that hosts its own webpage. Users can connect to the ESP32 from any device on the same network and play piano notes through their web browser. Also it has a Standalone Mode were you can directly connect it to a speaker. The project combines 3D printing, electronics, programming, and web development into a portable instrument. What was challenging? The biggest challenge was getting the ESP32 and the web interface to communicate reliably while keeping the piano responsive. Designing and fitting the 3D-printed enclosure around all the electronics and wiring also required several iterations. What are you proud of? I’m most proud of creating a system that feels simple to use despite combining several technologies. Instead of needing a dedicated app or speaker, anyone on the same Wi-Fi network can open a browser and immediately start playing. I’m also proud that the project combines hardware, software, and 3D design into one product. What should people know so they can test your project? To test the project: Power on the ESP32. Ensure your device is connected to the same Wi-Fi network as the ESP32. Open the IP address shown in the Serial Monitor. (if not shown press the enable button on the ESP32) Press the physical keys or use the on-screen piano keyboard. Your device’s volume should be turned on since the audio is generated by the web browser rather than the ESP32 itself if in WIFI Mode.", "repo": "https://github.com/zhal8403/Piano", "demo": ""}]...
|
[{"post_id": 20486, "ts": "202 [{"post_id": 20486, "ts": "2026-07-02T02:52:09Z", "hours": 3.955, "text": "I have assembled the 12 key piano and I have adjusted code in the site to fit it I also have fixed many bugs and I’ve also made it have 2 modes. It has a Wi-Fi mode where you can connect to the site, but you can also use the site with your mouse and play or you can open it on your phone and use touchscreen. The second mode is the standalone mode which you can connect to a speaker to play with the board without using a device and I have fully enclosed the piano so you can transport it"}, {"post_id": 18775, "ts": "2026-06-29T23:50:44Z", "hours": 1.9331, "text": "added audio thats plays when keys are pressed connected to the keys and that"}, {"post_id": 18349, "ts": "2026-06-29T13:52:34Z", "hours": 0.7556, "text": "finished printing and assembling the mini version of the piano"}, {"post_id": 18043, "ts": "2026-06-29T00:35:35Z", "hours": 2.5472, "text": "Designed 12 key and 5 key pianos planning on adding more for electronic storage next"}, {"post_id": 17542, "ts": "2026-06-28T11:31:19Z", "hours": 1.2561, "text": "created simple webpage to receive esp32 signals from switches and a starter keyboard display taht shows what keys been pressed"}, {"post_id": 17344, "ts": "2026-06-28T02:57:20Z", "hours": 0.8108, "text": "ESP32 code that hosts a web server and sends piano key states to a browser."}]...
|
Title: Wireless Piano by @zhal | Stardance
Devlog Title: Wireless Piano by @zhal | Stardance
Devlogs:
ESP32 code that hosts a web server and sends piano key states to a browser.
created simple webpage to receive esp32 signals from switches and a starter keyboard display taht shows what keys been pressed
Designed 12 key and 5 key pianos planning on adding more for electronic storage next
finished printing and assembling the mini version of the piano
added audio thats plays when keys are pressed connected to the keys and that
I have assembled the 12 key piano and I have adjusted code in the site to fit it I also have fixed many bugs and I’ve also made it have 2 modes. It has a Wi-Fi mode where you can connect to the site, but you can also use the site with your mouse and play or you can open it on your phone and use touchscreen. The second mode is the standalone mode which you can connect to a speaker to play with the board without using a device and I have fully enclosed the piano so you can transport it
Ships:
What did you make? I built a 12-key ESP32-powered Piano that has a WIFI Mode that hosts its own webpage. Users can connect to the ESP32 from any device on the same network and play piano notes through their web browser. Also it has a Standalone Mode were you can directly connect it to a speaker. The project combines 3D printing, electronics, programming, and web development into a portable instrument. What was challenging? The biggest challenge was getting the ESP32 and the web interface to communicate reliably while keeping the piano responsive. Designing and fitting the 3D-printed enclosure around all the electronics and wiring also required several iterations. What are you proud of? I’m most proud of creating a system that feels simple to use despite combining several technologies. Instead of needing a dedicated app or speaker, anyone on the same Wi-Fi network can open a browser and immediately start playing. I’m also proud that the project combines hardware, software, and 3D design into one product. What should people know so they can test your project? To test the project: Power on the ESP32. Ensure your device is connected to the same Wi-Fi network as the ESP32. Open the IP address shown in the Serial Monitor. (if not shown press the enable button on the ESP32) Press the physical keys or use the on-screen piano keyboard. Your device’s volume should be turned on since the audio is generated by the web browser rather than the ESP32 itself if in WIFI Mode....
|
1793220714.9258835
|
1793307114.9258835
|
|
16756
|
My awesome macropad! by @Domenix | Stardance
|
Domenix
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Domenix | Stardanc Title: My awesome macropad! by @Domenix | Stardance...
|
1793220716.1989117
|
1793825516.1989117
|
|
8920
|
GLSL converter by @kuba_ch101 | Stardance
|
kuba_ch101
|
1
|
8.0
|
96
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-17T20:44:58Z", "hours": 7.0, "multiplier": 14.37, "payout": 96, "blessing": "neutral", "text": "I made a program and a website based on it that converts shaders written in GLSL into a C string that is easier to use in a program with OpenGL, becaose you have everything in one file. For me the most challenging thing was to make the the website look good, also working with more complicated paths to input and output files was a new thing for me. My program saves me time when writing all the quotation marks which also reduces a probability of errors. The website was designed to use when you need shaders up and running fast.", "repo": "https://github.com/kubach101/GLSL-converter", "demo": "https://kubach101.github.io/GLSL-to-C/"}]...
|
[{"post_id": 29120, "ts": "202 [{"post_id": 29120, "ts": "2026-07-15T19:44:59Z", "hours": 0.9953, "text": "I added this thing in the top-right corner which indicates you how your camera is orinted."}, {"post_id": 10816, "ts": "2026-06-17T19:10:15Z", "hours": 0.6567, "text": "Website deployed and my project is ready for shipping. I added an information panel and checked everything."}, {"post_id": 9460, "ts": "2026-06-15T20:24:06Z", "hours": 2.0611, "text": "I made a website from my previous code. I spend a lot of time on the design but I think it was worth it. If I don’t find any bugs, I think this will be my last devlog before shipping."}, {"post_id": 9178, "ts": "2026-06-15T12:18:16Z", "hours": 1.345, "text": "I made a rework and added few features. What I changed: Program checks when file ends(beafore i needed to type “///” and didn’t know this was possible). Improved the files menagment: now there is a folder called “io”, makes program cleaner i think. Now works both: in bash and as an app on windows."}, {"post_id": 5609, "ts": "2026-06-09T14:00:51Z", "hours": 2.7506, "text": "I added a coments ignoring, now the comment will no longer be written in the final string."}]...
|
Title: GLSL converter by @kuba_ch101 | Stardance
Title: GLSL converter by @kuba_ch101 | Stardance
Devlogs:
I added a coments ignoring, now the comment will no longer be written in the final string.
I made a rework and added few features. What I changed: Program checks when file ends(beafore i needed to type “///” and didn’t know this was possible). Improved the files menagment: now there is a folder called “io”, makes program cleaner i think. Now works both: in bash and as an app on windows.
I made a website from my previous code. I spend a lot of time on the design but I think it was worth it. If I don’t find any bugs, I think this will be my last devlog before shipping.
Website deployed and my project is ready for shipping. I added an information panel and checked everything.
I added this thing in the top-right corner which indicates you how your camera is orinted.
Ships:
I made a program and a website based on it that converts shaders written in GLSL into a C string that is easier to use in a program with OpenGL, becaose you have everything in one file. For me the most challenging thing was to make the the website look good, also working with more complicated paths to input and output files was a new thing for me. My program saves me time when writing all the quotation marks which also reduces a probability of errors. The website was designed to use when you need shaders up and running fast....
|
1793220717.1324008
|
1793307117.1324008
|
|
13943
|
My very own WebOS by @Davod | Stardance
|
Davod
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My very own WebOS by @Davod | Stardance
|
1793220718.344291
|
1793825518.344291
|
|
36685
|
My own site! by @alinanoman | Stardance
|
alinanoman
|
1
|
1.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-24T03:38:09Z", "hours": 1.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I created a personal portfolio using HTML and CSS in Visual Studio. The goal of my website was to create a place where people can learn more about me, my interests, my activities, my projects and my future goals. I built it from scratch using an index.html file for the structure and content and a style.css file for the appearance. For the design I created a soft pastel lilac theme because lilac is my favorite color. One of the biggest challenges was learning how HTML and CSS work together. I had to trouble shoot my problems in VS Code. Such as figuring out why certain files were not operating correctly, understand files types and learn how to properly formate my code. I experimented with different color, spacingd and fonts. I am most proud that I was able to create my first and very own website from the ground up. I was also proud that I was able to apply my css and html skills. When testing my site people should know that they can explore each section using the navigation bar at top. they can click different links to jump between the about me, activities, projects and goals section. The website is made to be viewed on a computer browser through the index.html file. users should make sure that both index.html and style.css are kept in the same folder.", "repo": "https://github.com/tommorrownoon/personal-site", "demo": "https://tommorrownoon.github.io/personal-site/#activities"}]...
|
[{"post_id": 33833, "ts": "202 [{"post_id": 33833, "ts": "2026-07-24T02:15:30Z", "hours": 0.8981, "text": "Coded my Site! Today I made significant progress on my personal website using Visual Studio Code. I began by setting up the project structure and creating the two main files required for the website: index.html and style.css. While working on the setup, I learned the difference between HTML and CSS and how they work together to create a functional and visually appealing website. I spent time troubleshooting file organization issues, ensuring that both files were located in the same project folder and correctly linked using the stylesheet reference in the HTML file.After completing the basic setup, I developed the structure of my website in HTML. I created a header section that introduces me and includes navigation links to different parts of the site. I then added several sections containing information about myself, including an About Me section, activities and extracurricular involvement, engineering projects, and future goals. This allowed me to organize my content into a clear and professional layout while practicing the use of HTML elements such as headings, paragraphs, navigation bars, sections, and div containers.Once the content was in place, I focused on the visual design of the website by working extensively with CSS. I customized the appearance of the page by creating a lilac and pastel color scheme that matched the aesthetic I wanted. I adjusted the background colors, text colors, spacing, borders, and corner radii to create a softer and more welcoming design. I also added rounded cards for project information, styled navigation buttons, and implemented a gradient header to improve the overall appearance of the site. Throughout this process, I learned how CSS properties such as background-color, padding, margin, border-radius, font-family, and box-shadow affect the user interface.In addition to improving the visual design, I spent time troubleshooting coding errors and learning how to navigate Visual Studio Code more effectively. I learned how to create and rename files, distinguish between HTML and CSS files, interpret file icons, and resolve warnings related to empty CSS rule sets. These challenges helped me gain a stronger understanding of how web development projects are organized and how different technologies interact within a website.By the end of today’s work session, I successfully created a functional personal portfolio website with multiple sections, custom styling, and a cohesive visual theme. The website now highlights my interests, activities, engineering projects, and future aspirations in an organized and professional format. This progress provided valuable experience in both HTML and CSS while helping me build confidence in web development and problem-solving skills."}]...
|
Title: My own site! by @alinanoman | Stardance
De Title: My own site! by @alinanoman | Stardance
Devlogs:
Coded my Site! Today I made significant progress on my personal website using Visual Studio Code. I began by setting up the project structure and creating the two main files required for the website: index.html and style.css. While working on the setup, I learned the difference between HTML and CSS and how they work together to create a functional and visually appealing website. I spent time troubleshooting file organization issues, ensuring that both files were located in the same project folder and correctly linked using the stylesheet reference in the HTML file.After completing the basic setup, I developed the structure of my website in HTML. I created a header section that introduces me and includes navigation links to different parts of the site. I then added several sections containing information about myself, including an About Me section, activities and extracurricular involvement, engineering projects, and future goals. This allowed me to organize my content into a clear and professional layout while practicing the use of HTML elements such as headings, paragraphs, navigation bars, sections, and div containers.Once the content was in place, I focused on the visual design of the website by working extensively with CSS. I customized the appearance of the page by creating a lilac and pastel color scheme that matched the aesthetic I wanted. I adjusted the background colors, text colors, spacing, borders, and corner radii to create a softer and more welcoming design. I also added rounded cards for project information, styled navigation buttons, and implemented a gradient header to improve the overall appearance of the site. Throughout this process, I learned how CSS properties such as background-color, padding, margin, border-radius, font-family, and box-shadow affect the user interface.In addition to improving the visual design, I spent time troubleshooting coding errors and learning how to navigate Visual Studio Code more effectively. I learned how to create and rename files, distinguish between HTML and CSS files, interpret file icons, and resolve warnings related to empty CSS rule sets. These challenges helped me gain a stronger understanding of how web development projects are organized and how different technologies interact within a website.By the end of today’s work session, I successfully created a functional personal portfolio website with multiple sections, custom styling, and a cohesive visual theme. The website now highlights my interests, activities, engineering projects, and future aspirations in an organized and professional format. This progress provided valuable experience in both HTML and CSS while helping me build confidence in web development and problem-solving skills.
Ships:
I created a personal portfolio using HTML and CSS in Visual Studio. The goal of my website was to create a place where people can learn more about me, my interests, my activities, my projects and my future goals. I built it from scratch using an index.html file for the structure and content and a style.css file for the appearance. For the design I created a soft pastel lilac theme because lilac is my favorite color. One of the biggest challenges was learning how HTML and CSS work together. I had to trouble shoot my problems in VS Code. Such as figuring out why certain files were not operating correctly, understand files types and learn how to properly formate my code. I experimented with different color, spacingd and fonts. I am most proud that I was able to create my first and very own website from the ground up. I was also proud that I was able to apply my css and html skills. When testing my site people should know that they can explore each section using the navigation bar at top. they can click different links to jump between the about me, activities, projects and goals section. The website is made to be viewed on a computer browser through the index.html file. users should make sure that both index.html and style.css are kept in the same folder....
|
1793220719.2486951
|
1793307119.2486951
|
|
35327
|
Dollar Store Desmos by @josht8160 | Stardance
|
josht8160
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Dollar Store Desmos by @josht8160 | Stardan Title: Dollar Store Desmos by @josht8160 | Stardance...
|
1793220720.405042
|
1793825520.405042
|
|
34674
|
Frictionless by @avi_malhotra853 | Stardance
|
avi_malhotra853
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Frictionless by @avi_malhotra853 | Stardanc Title: Frictionless by @avi_malhotra853 | Stardance...
|
1793220721.3047388
|
1793825521.3047388
|
|
4022
|
TAR Macropad by @Hridum | Stardance
|
Hridum
|
1
|
7.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-25T19:51:26Z", "hours": 7.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "I made a macropad with a 9x9 switch matrix, 1 rotary encoder, a 0.91” OLED screen as well as LEDs. I found the hardest part of this project to be designing the PCB, as I had never done that before. On the other hand, the CAD was fairly simple and I just had to remember to space everything properly so that components such as the microcontroller and diodes could fit in the case.", "repo": "https://github.com/HridumD/TAR-Macropad", "demo": ""}]...
|
[{"post_id": 15846, "ts": "202 [{"post_id": 15846, "ts": "2026-06-25T19:25:55Z", "hours": 3.2153, "text": "Finished CAD for Casing Cad was pretty simple, added a bottom body, middle plate and top plate to cover everything up Forgot about the required spacing for components such as diodes and the controller board so I added those as well."}, {"post_id": 2317, "ts": "2026-06-04T19:04:49Z", "hours": 3.01, "text": "Since last devlog, Added rotary encoder, OLED screen, LEDs and re-designed layout to follow scanning matrix layout rather than direct connections for each switches Because of added complexity as well as additional components, PCB was much more complex and a lot of time was used to make sure no traces were overlapping or spacing issues between components. LEDs were not through-hole so they could only use one trace side, which made process also much more complex."}, {"post_id": 1169, "ts": "2026-06-03T00:43:58Z", "hours": 1.2161, "text": "Finished basic design for Hackpad PCB I have never designed a PCB before so it was a challenge, especially routing the PCB and making sure no connections shorted, but the hackpad guide helped a lot."}]...
|
Title: TAR Macropad by @Hridum | Stardance
Devlog Title: TAR Macropad by @Hridum | Stardance
Devlogs:
Finished basic design for Hackpad PCB I have never designed a PCB before so it was a challenge, especially routing the PCB and making sure no connections shorted, but the hackpad guide helped a lot.
Since last devlog, Added rotary encoder, OLED screen, LEDs and re-designed layout to follow scanning matrix layout rather than direct connections for each switches Because of added complexity as well as additional components, PCB was much more complex and a lot of time was used to make sure no traces were overlapping or spacing issues between components. LEDs were not through-hole so they could only use one trace side, which made process also much more complex.
Finished CAD for Casing Cad was pretty simple, added a bottom body, middle plate and top plate to cover everything up Forgot about the required spacing for components such as diodes and the controller board so I added those as well.
Ships:
I made a macropad with a 9x9 switch matrix, 1 rotary encoder, a 0.91” OLED screen as well as LEDs. I found the hardest part of this project to be designing the PCB, as I had never done that before. On the other hand, the CAD was fairly simple and I just had to remember to space everything properly so that components such as the microcontroller and diodes could fit in the case....
|
1793220722.1951537
|
1793307122.1951537
|
|
13409
|
AtomOS by @cyvexx | Stardance
|
cyvexx
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: AtomOS by @cyvexx | Stardance
|
1793220723.366929
|
1793825523.366929
|
|
5816
|
AI Code "Checker" by @Da_BFBM_show | Stard AI Code "Checker" by @Da_BFBM_show | Stardance...
|
Da_BFBM_show
|
0
|
0.41
|
0
|
[]
|
[{"post_id": 5230, "ts": "2026 [{"post_id": 5230, "ts": "2026-06-08T22:49:01Z", "hours": 0.4111, "text": "This session was hard. I feel a bit frustrated. It’s not like I want it to. I can fix it later, though."}]...
|
Title: AI Code "Checker" by @Da_BFBM_show Title: AI Code "Checker" by @Da_BFBM_show | Stardance
Devlogs:
This session was hard. I feel a bit frustrated. It’s not like I want it to. I can fix it later, though....
|
1793220724.2709262
|
1793825524.2709262
|
|
15626
|
My awesome macropad! by @Jsimmons | Stardance
|
Jsimmons
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @Jsimmons | Stardan Title: My awesome macropad! by @Jsimmons | Stardance...
|
1793220725.1717763
|
1793825525.1717763
|
|
38575
|
My own site! by @Zulayho | Stardance
|
Zulayho
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @Zulayho | Stardance
|
1793220726.091144
|
1793825526.091144
|
|
4353
|
InviteHub by @Mrithul_E | Stardance
|
Mrithul_E
|
2
|
85.0
|
1614
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-13T15:04:05Z", "hours": 4.0, "multiplier": 12.49, "payout": 49, "blessing": "neutral", "text": "I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase. what’s new in this ship 2 fixed some security vulnerability as per github code scan Added assets completely handmade with canva replaced many fonts in home page with cursive fonts added our mission section in the home page", "repo": "https://github.com/Mrithul-E/InviteHub", "demo": "https://invitehub.mrithul.in/"}, {"ship_num": 2, "ts": "2026-09-06T13:06:11Z", "hours": 81.0, "multiplier": 19.23, "payout": 1565, "blessing": "neutral", "text": "I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase.", "repo": "https://github.com/Mrithul-E/InviteHub", "demo": "https://invitehub.mrithul.in/"}]...
|
[{"post_id": 66105, "ts": "202 [{"post_id": 66105, "ts": "2026-09-11T18:10:15Z", "hours": 0.3892, "text": "Minor security fixes as per GitHub security scan Inclusion of functionality from an untrusted source Client-side URL redirect using query in URL"}, {"post_id": 66022, "ts": "2026-09-11T15:47:24Z", "hours": 1.2178, "text": "Some reworks readme updated added more gap in between the template card added the github link to the navbar changed some fonts in homepage and added some paragraph sections there"}, {"post_id": 64908, "ts": "2026-09-09T16:58:28Z", "hours": 1.6047, "text": "full css and ui rework: Changed the background image Made the design and animation minimalistic updated the navbar and footer removed unwanted styling in css removed unwanted gradient from text made minimal footer"}, {"post_id": 63600, "ts": "2026-09-07T14:55:46Z", "hours": 0.7089, "text": "Minor css fix removed many useless css code. Made it more good. not that the gradients are not generated by AI, instead it is generated by online CSS gradient maker. Don’t this that this is a AI generated/AI styled project. This site doesn’t have that much huge css to use AI. The Login with Google button is copied by some article in Medium. The gradient used in the home page Get Started button is custom made using CSS gradient generator The background image and the animated phone image is generated by Chatgpt. I don’t know whether this is contributing to the AI feel 🥲🥲😭😭 UPDATE: : By asking to shipwrights, they say that it was flagged and AI because it used AI generated images, which is not allowed. So i made it my self using canva, here it is:"}, {"post_id": 62873, "ts": "2026-09-06T12:22:58Z", "hours": 0.3833, "text": "Fix: Chrome media hub staying active even when video stops fixed this by removing the src and loading the video again into chrome’s memory, this solves the problem ."}, {"post_id": 62835, "ts": "2026-09-06T11:22:25Z", "hours": 1.3864, "text": "Added demo video to the home page Updated README.md and also fixed many minor css and html issues"}, {"post_id": 62397, "ts": "2026-09-05T18:51:00Z", "hours": 1.4019, "text": "Added README.md !! *Not comleted yet, no images and videos are added yet"}, {"post_id": 62092, "ts": "2026-09-05T10:41:55Z", "hours": 1.1986, "text": "Added the pages such as About, privacy-policies etc… Added About, Privacy policies , Terms of service page in hbs and added the corresponding routers for it"}, {"post_id": 62018, "ts": "2026-09-05T07:10:46Z", "hours": 0.5586, "text": "Added confirmation for logout and Added redirect to the last visited URL in login Added redirect to the last visited URL in login Added confirmation for logout, and made the logout route a long random string"}, {"post_id": 61684, "ts": "2026-09-04T18:32:50Z", "hours": 3.3572, "text": "Added ‘My invitations’ section in website Added My invitations section that shows the invitations created by that user. From here user can see the invitation, creation date, and user can also delete the invitation. Delete option will delete all files that are part of that invitation from the cdn, then delete the complete invitation from the db. And also added some minor fixes such as: webpage title issues added favicon etc…"}, {"post_id": 61049, "ts": "2026-09-03T19:19:07Z", "hours": 1.6256, "text": "User experience improvement implemented: made the created invitation url return fron server to frontend removed unwanted console.log used for debugging made the “Get started” button in frontend functional Added: invitation link and copy button in invitation creation form submission page"}, {"post_id": 60427, "ts": "2026-09-02T18:50:07Z", "hours": 1.5317, "text": "Added search option in templates Implemented using Fuse.js *images are placeholders"}, {"post_id": 60264, "ts": "2026-09-02T15:01:57Z", "hours": 1.1522, "text": "Reached initial working stage First working template added Added: render of hbs from cdn rendering of custom form from database"}, {"post_id": 59313, "ts": "2026-09-01T01:12:28Z", "hours": 2.1864, "text": "added template and form rendering from Database"}, {"post_id": 58317, "ts": "2026-08-30T18:12:36Z", "hours": 4.9681, "text": "Added a option to write the template(HBS) and the form from frontend implemented: option to write the template(HBS) and the form from frontend hbs to CDN script 10 MB fields limit in template creation router (multer) Invitation total file size limit 50 MB (formidable) Invitation data processing and cleanup"}, {"post_id": 56814, "ts": "2026-08-28T18:55:14Z", "hours": 1.57, "text": "Connected the form created using jquery forms to HackClub CDN My website is basically a site that have many templates for different kind of event. A user can select a template , this will redirect to a form. Each template have entirely different forms , each form is created by the Admin using a jquery form builder ui. Because these form structures are unknow to the server, the server dont know how much file input fields are there. so we cant set a limit on number of file input fields and per input size. So I set a 50 MB total upload limit using formidable before sending files to hackclub cdn. This makes the usage fair."}, {"post_id": 56609, "ts": "2026-08-28T13:05:06Z", "hours": 1.4072, "text": "Handle multipart uploads with file size limits using busboy formidable ✓ In the last devlog I shared a very large code to limit max total requiest size using busboy. Yesterday , In a simple google search , the Google AI mode suggested me of Formidable previously idk formidable … So I learned about that , it made my code so tiny frontend logic was already there"}, {"post_id": 54984, "ts": "2026-08-26T12:38:33Z", "hours": 2.4072, "text": "Handle multipart uploads with file size limits using busboy i want to limit the max total file upload to 50 MB, multer cant have this feature so I use busboy and wrote long long code to solve this problem code :"}, {"post_id": 54621, "ts": "2026-08-25T17:23:09Z", "hours": 0.6072, "text": "Research: How to limit the total file size in a multipart/formData (Express.js) After many searches I found out that multer don’t support this I am planning to use Busboy directly"}, {"post_id": 54387, "ts": "2026-08-25T11:35:57Z", "hours": 2.1842, "text": "Added error messages in data submissions in rendered template form Added a 50 MB file size limit in file upload (for now only frontend checks are implemented, backend check is TODO)."}, {"post_id": 51711, "ts": "2026-08-21T15:19:40Z", "hours": 2.8461, "text": "Added delete template option for admin The delete option will delete the template from the database and also delete the thumbnail image stored in hackclub CDN"}, {"post_id": 34488, "ts": "2026-07-25T07:52:12Z", "hours": 4.4856, "text": "Switched from formeo to jquery form builder formeo doesn’t support many input types"}, {"post_id": 30066, "ts": "2026-07-17T10:51:07Z", "hours": 1.1742, "text": "Researching on custom form builder On deep research on making a custom form builder form my each templates , I found : formeo, jquery form builder and survayJS"}, {"post_id": 28398, "ts": "2026-07-14T17:08:38Z", "hours": 4.6656, "text": "connected the admin only template creation form to the firestore AND also made the template cards load dynamically currently provided image is a placeholder This is admin page , only admin page have create template button"}, {"post_id": 25450, "ts": "2026-07-09T18:43:35Z", "hours": 1.7492, "text": "Added hackclub cdn to the project !!! At first it didn’t worked because of compatibly issue of new nodejs’s fetch and npm form-data module fixed using new build-in formData()"}, {"post_id": 23622, "ts": "2026-07-06T18:04:21Z", "hours": 2.0433, "text": "new knoledge unlocked: I can use : app . use ( ' /admin ' , requireAdmin , adminRouter ) instead of : app . use ( requireAdmin ) app . use ( ' /admin ' , adminRouter ) I know everybody knows this, but this is a knowledge to me"}, {"post_id": 21534, "ts": "2026-07-03T15:40:01Z", "hours": 1.2683, "text": "added a very very cool text area for entering description for each field completely build on bootstrap accordion check it out !!!"}, {"post_id": 20136, "ts": "2026-07-01T17:55:02Z", "hours": 1.2319, "text": "First template design completed !!! fully using Bootstrap , and some css"}, {"post_id": 19898, "ts": "2026-07-01T10:16:49Z", "hours": 1.5828, "text": "Continuing the writting of the first template for the site !!! basically my project is a invitation page builder, it needs a lot of custom template. | ▽ not complete yet"}, {"post_id": 18554, "ts": "2026-06-29T18:58:19Z", "hours": 6.7694, "text": "Devlog 6 - Template creation form In this 6h 44m, I made a lot of features but the main highlight was the work on the template creation form ( continuation of previous devlog) Story Time: Basically my project is a wedding invitation page generator. My website will have a lot of prebuild invitation template(HBS) for different different events So the point is different templates require different forms should be filled by the user. Therefore when the admin create different template, the admin should list the require fields for the form of the specific template. Problems faced: My thoughts was to make a prebuild list of fields, from that the admin should list them in specific order. Problem - 1 The first problem was there is no form element to do these. So i used a select element with a ‘Add’ btn. For the sorting, at first i used up/down button, but that wasn’t smooth. After researching I found sortable js. At first sortable js also was not smooth, I fixed that by removing some bootstrap classes from the tag. Problem - 2 The next problem I faced was I cant use required in the custom fields list maker, So I can’t make that field mandatory. Solution (simple) The solution was simple, I made a invisible <textarea required .....> , and add the list of fields to that in json string when the admin edited the list. Thank you for reading ❤️, Mrithul."}, {"post_id": 15040, "ts": "2026-06-24T12:54:36Z", "hours": 4.9608, "text": "Devlog 5 - Templates Page Spent 4 hours and 52 minutes working on the templates page today. This page is going to be the main place where all invitation templates are managed, so I wanted to get the basic structure done before moving on to creating more templates. Templates Grid The first thing I worked on was the layout. I switched the page to a responsive grid system and started building the actual templates page. I also added a Create Template card that is only visible to admins. Clicking the card opens a modal for creating new templates. Template Creation Modal The modal is still incomplete, but the basic flow is now working. Currently it has fields for: Template name HTML file name Preview image Template category Template fields There’s still quite a bit of work left to do here, but at least the structure is finally in place. Template Categories & Fields One thing I didn’t want to do was create a completely separate form for every invitation type. Instead, I’m building a system where templates can be configured using categories and predefined fields. const templateCategories = [ { id : \" wedding \" , name : \" Wedding \" }, { id : \" engagement \" , name : \" Engagement \" }, { id : \" birthday \" , name : \" Birthday \" } .... ] const templateFields = [ { id : \" eventTitle \" , label : \" Event Title \" , type : \" text \" , category : \" common \" }, { id : \" groomName \" , label : \" Groom Name \" , type : \" text \" , category : \" wedding \" } .... ] Right now I’ve added categories for weddings, birthdays, engagements, housewarmings, baby showers and several other event types. The field system should make adding future templates a lot easier. Small UI Improvements I also spent some time cleaning up the page and added a footer. The site is slowly starting to look more like an actual product instead of a collection of pages. Next The next step is finishing the template creation page and making the field selection system fully functional. Once that’s done, adding new templates should be much faster than it is right now."}, {"post_id": 8246, "ts": "2026-06-13T18:26:46Z", "hours": 1.1044, "text": "Devlog - 4 Today I connected my website to firestore for database I have implemented the saving of login information of user to user collection of firestore database This is the implementation code: service\\userService.js : async function saveUserLogin ( userRecord ) { return db . collection ( \" users \" ) . doc ( userRecord . uid ) . set ( { displayName : userRecord . displayName || null , email : userRecord . email , photoURL : userRecord . photoURL || null , lastLoginAt : new Date ( userRecord . metadata . lastSignInTime ) }, { merge : true } ) } service\\userService.js : router . post ( \" /sessionLogin \" , async ( req , res ) => { const idToken = req . body . idToken ; const expiresIn = 60 * 60 * 24 * 13 * 1000 ; try { const sessionCookie = await admin . auth (). createSessionCookie ( idToken , { expiresIn : expiresIn }); const options = { maxAge : expiresIn , httpOnly : true , secure : false }; const decodedClaims = await admin . auth (). verifySessionCookie ( sessionCookie , true ); const userRecord = await admin . auth (). getUser ( decodedClaims . uid ); await saveUserLogin ( userRecord ) res . cookie ( ' session ' , sessionCookie , options ) res . status ( 200 ). send ({ status : \" success \" }) } catch ( err ) { console . error ( err ) res . status ( 401 ). send ( ' Unauthorized request! ' ); } }) I also created the redirect from login page if login successful / refresh in login fail (these things where previously missing) Also there are many UI improvements made, that’s not written in this Devlog (●’◡’●)"}, {"post_id": 7934, "ts": "2026-06-13T07:31:13Z", "hours": 8.3672, "text": "Devlog Time spent: 8 hours 15 minutes across ~6 days This week I mostly worked on security-related improvements and continued work on the invitation template system. Security Fixes When I opened GitHub, I got a security notification. After checking it, I found that a Firebase client-side API key was present in the repository. I know Firebase client API keys are not secret credentials by themselves, but leaving them exposed can still make abuse easier, especially if other protections are missing. Since the project is still in development, I decided to clean it up now rather than later. What I did: Revoked the old API key Generated a new one Moved the configuration into environment variables Made sure sensitive files are not pushed to GitHub res . locals . firebaseClientCred = Buffer . from ( process . env . firebaseClientCred , \" base64 \" ) . toString ( \" utf-8 \" ); The long-term plan is to separate development and production configurations. Right now localhost access is required for development, so strict domain restrictions are not practical yet. Once the project is deployed, I plan to have: A development API configuration that allows localhost A production API configuration that only allows requests from the final website domain The developer configuration will stay out of production deployments. Even if development code is accidentally pushed, it should fail instead of exposing access that was never intended for production. The backend Firebase SDK setup was already safe, so most of this work was focused on the client-side configuration. Navbar Improvements I also implemented automatic navbar link highlighting. Instead of manually setting the active page for every route, the navbar now checks the current URL and highlights the correct link automatically. function highlightCurrentPageLink () { const currentPageUrl = window . location . pathname ; const links = document . querySelectorAll ( \" #navbar-ul li a \" ); links . forEach (( link ) => { const href = link . getAttribute ( \" href \" ); if ( href . split ( \" / \" )[ 1 ] === currentPageUrl . split ( \" / \" )[ 1 ]) { link . classList . add ( \" active \" ); } else { link . classList . remove ( \" active \" ); } }); } Small change, but it makes maintaining the navigation much easier. User Menu Worked on the user menu and logout functionality. Nothing huge here, but it is another piece of the authentication flow that is now coming together. Template System I created the HBS file structure for the template page and spent a lot of time thinking about how templates should actually be implemented. This is currently the biggest blocker. There are several ways to handle template rendering and customization, and I don’t want to lock myself into a design that becomes difficult to maintain later. A lot of the development time this week went into planning, experimenting, and changing approaches rather than writing large amounts of code. Next Create separate Firebase development and production configurations Add domain restrictions after deployment Continue work on the invitation template system Finish the template rendering workflow Improve user account features There is still a lot to do, but the project is becoming more stable and secure before moving further into feature development."}, {"post_id": 3693, "ts": "2026-06-06T18:57:54Z", "hours": 2.5967, "text": "Devlog-2: Today , I added a beautiful animation to the home page made the home page overall beautiful Also fixed a authentication error : the fix was simple - I accidently wrote (res, req) instead of (req, res) in express router Also completed the login page design What’s next : Surely build a footer tomorrow 😁 Also planning to create a template creation tool for Admin Note: the PHONE image have a cool animation effect. completely done by hands , no AI only used AI for clearing doubt"}, {"post_id": 2855, "ts": "2026-06-05T18:18:17Z", "hours": 8.5736, "text": "Login Page within 8h 33m , I made the home page, firebase auth, designed logo etc.. currently I am working on designing the ‘Login with google’ page I thought I should only submit and link the project after completing the full project … 😟 but I didn’t forget to connect hackatime 😁🥳"}]...
|
Title: InviteHub by @Mrithul_E | Stardance
Devlog Title: InviteHub by @Mrithul_E | Stardance
Devlogs:
Login Page within 8h 33m , I made the home page, firebase auth, designed logo etc.. currently I am working on designing the ‘Login with google’ page I thought I should only submit and link the project after completing the full project … 😟 but I didn’t forget to connect hackatime 😁🥳
Devlog-2: Today , I added a beautiful animation to the home page made the home page overall beautiful Also fixed a authentication error : the fix was simple - I accidently wrote (res, req) instead of (req, res) in express router Also completed the login page design What’s next : Surely build a footer tomorrow 😁 Also planning to create a template creation tool for Admin Note: the PHONE image have a cool animation effect. completely done by hands , no AI only used AI for clearing doubt
Devlog Time spent: 8 hours 15 minutes across ~6 days This week I mostly worked on security-related improvements and continued work on the invitation template system. Security Fixes When I opened GitHub, I got a security notification. After checking it, I found that a Firebase client-side API key was present in the repository. I know Firebase client API keys are not secret credentials by themselves, but leaving them exposed can still make abuse easier, especially if other protections are missing. Since the project is still in development, I decided to clean it up now rather than later. What I did: Revoked the old API key Generated a new one Moved the configuration into environment variables Made sure sensitive files are not pushed to GitHub res . locals . firebaseClientCred = Buffer . from ( process . env . firebaseClientCred , " base64 " ) . toString ( " utf-8 " ); The long-term plan is to separate development and production configurations. Right now localhost access is required for development, so strict domain restrictions are not practical yet. Once the project is deployed, I plan to have: A development API configuration that allows localhost A production API configuration that only allows requests from the final website domain The developer configuration will stay out of production deployments. Even if development code is accidentally pushed, it should fail instead of exposing access that was never intended for production. The backend Firebase SDK setup was already safe, so most of this work was focused on the client-side configuration. Navbar Improvements I also implemented automatic navbar link highlighting. Instead of manually setting the active page for every route, the navbar now checks the current URL and highlights the correct link automatically. function highlightCurrentPageLink () { const currentPageUrl = window . location . pathname ; const links = document . querySelectorAll ( " #navbar-ul li a " ); links . forEach (( link ) => { const href = link . getAttribute ( " href " ); if ( href . split ( " / " )[ 1 ] === currentPageUrl . split ( " / " )[ 1 ]) { link . classList . add ( " active " ); } else { link . classList . remove ( " active " ); } }); } Small change, but it makes maintaining the navigation much easier. User Menu Worked on the user menu and logout functionality. Nothing huge here, but it is another piece of the authentication flow that is now coming together. Template System I created the HBS file structure for the template page and spent a lot of time thinking about how templates should actually be implemented. This is currently the biggest blocker. There are several ways to handle template rendering and customization, and I don’t want to lock myself into a design that becomes difficult to maintain later. A lot of the development time this week went into planning, experimenting, and changing approaches rather than writing large amounts of code. Next Create separate Firebase development and production configurations Add domain restrictions after deployment Continue work on the invitation template system Finish the template rendering workflow Improve user account features There is still a lot to do, but the project is becoming more stable and secure before moving further into feature development.
Devlog - 4 Today I connected my website to firestore for database I have implemented the saving of login information of user to user collection of firestore database This is the implementation code: service\userService.js : async function saveUserLogin ( userRecord ) { return db . collection ( " users " ) . doc ( userRecord . uid ) . set ( { displayName : userRecord . displayName || null , email : userRecord . email , photoURL : userRecord . photoURL || null , lastLoginAt : new Date ( userRecord . metadata . lastSignInTime ) }, { merge : true } ) } service\userService.js : router . post ( " /sessionLogin " , async ( req , res ) => { const idToken = req . body . idToken ; const expiresIn = 60 * 60 * 24 * 13 * 1000 ; try { const sessionCookie = await admin . auth (). createSessionCookie ( idToken , { expiresIn : expiresIn }); const options = { maxAge : expiresIn , httpOnly : true , secure : false }; const decodedClaims = await admin . auth (). verifySessionCookie ( sessionCookie , true ); const userRecord = await admin . auth (). getUser ( decodedClaims . uid ); await saveUserLogin ( userRecord ) res . cookie ( ' session ' , sessionCookie , options ) res . status ( 200 ). send ({ status : " success " }) } catch ( err ) { console . error ( err ) res . status ( 401 ). send ( ' Unauthorized request! ' ); } }) I also created the redirect from login page if login successful / refresh in login fail (these things where previously missing) Also there are many UI improvements made, that’s not written in this Devlog (●’◡’●)
Devlog 5 - Templates Page Spent 4 hours and 52 minutes working on the templates page today. This page is going to be the main place where all invitation templates are managed, so I wanted to get the basic structure done before moving on to creating more templates. Templates Grid The first thing I worked on was the layout. I switched the page to a responsive grid system and started building the actual templates page. I also added a Create Template card that is only visible to admins. Clicking the card opens a modal for creating new templates. Template Creation Modal The modal is still incomplete, but the basic flow is now working. Currently it has fields for: Template name HTML file name Preview image Template category Template fields There’s still quite a bit of work left to do here, but at least the structure is finally in place. Template Categories & Fields One thing I didn’t want to do was create a completely separate form for every invitation type. Instead, I’m building a system where templates can be configured using categories and predefined fields. const templateCategories = [ { id : " wedding " , name : " Wedding " }, { id : " engagement " , name : " Engagement " }, { id : " birthday " , name : " Birthday " } .... ] const templateFields = [ { id : " eventTitle " , label : " Event Title " , type : " text " , category : " common " }, { id : " groomName " , label : " Groom Name " , type : " text " , category : " wedding " } .... ] Right now I’ve added categories for weddings, birthdays, engagements, housewarmings, baby showers and several other event types. The field system should make adding future templates a lot easier. Small UI Improvements I also spent some time cleaning up the page and added a footer. The site is slowly starting to look more like an actual product instead of a collection of pages. Next The next step is finishing the template creation page and making the field selection system fully functional. Once that’s done, adding new templates should be much faster than it is right now.
Devlog 6 - Template creation form In this 6h 44m, I made a lot of features but the main highlight was the work on the template creation form ( continuation of previous devlog) Story Time: Basically my project is a wedding invitation page generator. My website will have a lot of prebuild invitation template(HBS) for different different events So the point is different templates require different forms should be filled by the user. Therefore when the admin create different template, the admin should list the require fields for the form of the specific template. Problems faced: My thoughts was to make a prebuild list of fields, from that the admin should list them in specific order. Problem - 1 The first problem was there is no form element to do these. So i used a select element with a ‘Add’ btn. For the sorting, at first i used up/down button, but that wasn’t smooth. After researching I found sortable js. At first sortable js also was not smooth, I fixed that by removing some bootstrap classes from the tag. Problem - 2 The next problem I faced was I cant use required in the custom fields list maker, So I can’t make that field mandatory. Solution (simple) The solution was simple, I made a invisible <textarea required .....> , and add the list of fields to that in json string when the admin edited the list. Thank you for reading ❤️, Mrithul.
Continuing the writting of the first template for the site !!! basically my project is a invitation page builder, it needs a lot of custom template. | ▽ not complete yet
First template design completed !!! fully using Bootstrap , and some css
added a very very cool text area for entering description for each field completely build on bootstrap accordion check it out !!!
new knoledge unlocked: I can use : app . use ( ' /admin ' , requireAdmin , adminRouter ) instead of : app . use ( requireAdmin ) app . use ( ' /admin ' , adminRouter ) I know everybody knows this, but this is a knowledge to me
Added hackclub cdn to the project !!! At first it didn’t worked because of compatibly issue of new nodejs’s fetch and npm form-data module fixed using new build-in formData()
connected the admin only template creation form to the firestore AND also made the template cards load dynamically currently provided image is a placeholder This is admin page , only admin page have create template button
Researching on custom form builder On deep research on making a custom form builder form my each templates , I found : formeo, jquery form builder and survayJS
Switched from formeo to jquery form builder formeo doesn’t support many input types
Added delete template option for admin The delete option will delete the template from the database and also delete the thumbnail image stored in hackclub CDN
Added error messages in data submissions in rendered template form Added a 50 MB file size limit in file upload (for now only frontend checks are implemented, backend check is TODO).
Research: How to limit the total file size in a multipart/formData (Express.js) After many searches I found out that multer don’t support this I am planning to use Busboy directly
Handle multipart uploads with file size limits using busboy i want to limit the max total file upload to 50 MB, multer cant have this feature so I use busboy and wrote long long code to solve this problem code :
Handle multipart uploads with file size limits using busboy formidable ✓ In the last devlog I shared a very large code to limit max total requiest size using busboy. Yesterday , In a simple google search , the Google AI mode suggested me of Formidable previously idk formidable … So I learned about that , it made my code so tiny frontend logic was already there
Connected the form created using jquery forms to HackClub CDN My website is basically a site that have many templates for different kind of event. A user can select a template , this will redirect to a form. Each template have entirely different forms , each form is created by the Admin using a jquery form builder ui. Because these form structures are unknow to the server, the server dont know how much file input fields are there. so we cant set a limit on number of file input fields and per input size. So I set a 50 MB total upload limit using formidable before sending files to hackclub cdn. This makes the usage fair.
Added a option to write the template(HBS) and the form from frontend implemented: option to write the template(HBS) and the form from frontend hbs to CDN script 10 MB fields limit in template creation router (multer) Invitation total file size limit 50 MB (formidable) Invitation data processing and cleanup
added template and form rendering from Database
Reached initial working stage First working template added Added: render of hbs from cdn rendering of custom form from database
Added search option in templates Implemented using Fuse.js *images are placeholders
User experience improvement implemented: made the created invitation url return fron server to frontend removed unwanted console.log used for debugging made the “Get started” button in frontend functional Added: invitation link and copy button in invitation creation form submission page
Added ‘My invitations’ section in website Added My invitations section that shows the invitations created by that user. From here user can see the invitation, creation date, and user can also delete the invitation. Delete option will delete all files that are part of that invitation from the cdn, then delete the complete invitation from the db. And also added some minor fixes such as: webpage title issues added favicon etc…
Added confirmation for logout and Added redirect to the last visited URL in login Added redirect to the last visited URL in login Added confirmation for logout, and made the logout route a long random string
Added the pages such as About, privacy-policies etc… Added About, Privacy policies , Terms of service page in hbs and added the corresponding routers for it
Added README.md !! *Not comleted yet, no images and videos are added yet
Added demo video to the home page Updated README.md and also fixed many minor css and html issues
Fix: Chrome media hub staying active even when video stops fixed this by removing the src and loading the video again into chrome’s memory, this solves the problem .
Minor css fix removed many useless css code. Made it more good. not that the gradients are not generated by AI, instead it is generated by online CSS gradient maker. Don’t this that this is a AI generated/AI styled project. This site doesn’t have that much huge css to use AI. The Login with Google button is copied by some article in Medium. The gradient used in the home page Get Started button is custom made using CSS gradient generator The background image and the animated phone image is generated by Chatgpt. I don’t know whether this is contributing to the AI feel 🥲🥲😭😭 UPDATE: : By asking to shipwrights, they say that it was flagged and AI because it used AI generated images, which is not allowed. So i made it my self using canva, here it is:
full css and ui rework: Changed the background image Made the design and animation minimalistic updated the navbar and footer removed unwanted styling in css removed unwanted gradient from text made minimal footer
Some reworks readme updated added more gap in between the template card added the github link to the navbar changed some fonts in homepage and added some paragraph sections there
Minor security fixes as per GitHub security scan Inclusion of functionality from an untrusted source Client-side URL redirect using query in URL
Ships:
I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase.
I made a website for creating digital invitation webpages by simply selecting a template and filling out a form. This can help reduce paper usage by decreasing printed inviation lol .. I faced many challenges during the development: Building the logic for creating different different forms for each and every templates Limiting the total file size in http request Building a UI for creating forms by Drag-and-Droping Couldn’t host in vercel because vercel blocks requests more that ~4 MB Admin centralized working (only admin can create templates, this ensures security) I am proud of dedecating 3 months to complete this project, without doing any other project. To run my project my project you will need firebase api key, and hackclub cdn api. But you can’t get the already created templates because those are stored in firebase. what’s new in this ship 2 fixed some security vulnerability as per github code scan Added assets completely handmade with canva replaced many fonts in home page with cursive fonts added our mission section in the home page...
|
1793220727.0134668
|
1793307127.0134668
|
|
27595
|
first slack bot! by @Akriti_67 | Stardance
|
Akriti_67
|
0
|
1.75
|
0
|
[]
|
[{"post_id": 55537, "ts": "202 [{"post_id": 55537, "ts": "2026-08-27T13:33:27Z", "hours": 0.4289, "text": "Workin on the code and creating slash commands"}, {"post_id": 54614, "ts": "2026-08-25T17:12:31Z", "hours": 0.7667, "text": "Workin on api commands fixed some bugs"}, {"post_id": 50964, "ts": "2026-08-20T13:11:15Z", "hours": 0.5561, "text": "Starting wih my slackbot , just putting some extra slash commands to save for later, i was realy messed up with api keys here"}]...
|
Title: first slack bot! by @Akriti_67 | Stardance
Title: first slack bot! by @Akriti_67 | Stardance
Devlogs:
Starting wih my slackbot , just putting some extra slash commands to save for later, i was realy messed up with api keys here
Workin on api commands fixed some bugs
Workin on the code and creating slash commands...
|
1793220728.3953242
|
1793825528.3953242
|
|
4951
|
Untitled by @exotic | Stardance
|
exotic
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @exotic | Stardance
|
1793220729.3247762
|
1793825529.3247762
|
|
25277
|
Jet Engine by @GregorySem | Stardance
|
GregorySem
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Jet Engine by @GregorySem | Stardance
|
1793220730.2563233
|
1793825530.2563233
|
|
31633
|
GRBSani by @xek1923x | Stardance
|
xek1923x
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: GRBSani by @xek1923x | Stardance
|
1793220731.1816187
|
1793825531.1816187
|
|
5138
|
ShadowMed by @shanmukha | Stardance
|
shanmukha
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: ShadowMed by @shanmukha | Stardance
|
1793220732.0617733
|
1793825532.0617733
|
|
30337
|
WarioWare Game by @Mapplect | Stardance
|
Mapplect
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: WarioWare Game by @Mapplect | Stardance
|
1793220732.9610717
|
1793825532.9610717
|
|
26816
|
My first slack bot! by @Sair | Stardance
|
Sair
|
1
|
0.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-27T19:04:40Z", "hours": 0.0, "multiplier": 1.01, "payout": 0, "blessing": "neutral", "text": "My own first slack bot Commands: /sairbot-ping - checks bots latency /sairbot-catfact - Cat fact /sairbot-rps + Rock; Paper; Scissors (Example: /sairbot-rps rock) - Rock Paper Scissors game Deployed on Nest", "repo": "https://github.com/Sairsides/Sair-Slack-Bot", "demo": "https://hackclub.enterprise.slack.com/archives/C0BDPJN8ZMF"}]...
|
[{"post_id": 17079, "ts": "202 [{"post_id": 17079, "ts": "2026-06-27T18:47:38Z", "hours": 0.3231, "text": "Added ping, cat fact command. Also added a RPS game. Didn’t log 23min because I forgot to setup Wakatime. Deployed on Nest."}]...
|
Title: My first slack bot! by @Sair | Stardance
D Title: My first slack bot! by @Sair | Stardance
Devlogs:
Added ping, cat fact command. Also added a RPS game. Didn’t log 23min because I forgot to setup Wakatime. Deployed on Nest.
Ships:
My own first slack bot Commands: /sairbot-ping - checks bots latency /sairbot-catfact - Cat fact /sairbot-rps + Rock; Paper; Scissors (Example: /sairbot-rps rock) - Rock Paper Scissors game Deployed on Nest...
|
1793220733.8560464
|
1793307133.8560464
|
|
27738
|
Untitled by @dylz | Stardance
|
dylz
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @dylz | Stardance
|
1793220735.5723329
|
1793825535.5723329
|
|
27317
|
My awesome macropad! by @tylerb | Stardance
|
tylerb
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @tylerb | Stardance
|
1793220738.4661722
|
1793825538.4661722
|
|
29036
|
My very own WebOS by @benny | Stardance
|
benny
|
1
|
8.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-04T23:02:53Z", "hours": 8.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "A made a personalized web OS called Weby and it includes a couple of apps that allows everyone to have some insights onto who I am! This is the first time I’ve actively used HTML, CSS, and Java in order to make something of this scale so I’m pretty happy how far I was able to go. It does feature a click to enter loading screen that is paired with a startup sound (pretty dope ik). It has 3 apps that will show a variety of things about me ranging from hobbies to projects done. I won’t say anything more so please check it out if you would like! Thank you!", "repo": "https://github.com/bangzishu-huang/Weby", "demo": "https://bangzishu-huang.github.io/Weby/"}]...
|
[{"post_id": 22467, "ts": "202 [{"post_id": 22467, "ts": "2026-07-04T22:52:21Z", "hours": 3.1153, "text": "So today I was able to grind out and basically finish everything I wanted. I started off with making a projects app that was like a little carousel with arrows that showed some of my projects, then I was also able to make a Songs app, where I used spotify embedded to include 9 songs (in a 3x3 grid). I thought everything was going very well and I had to do some research for all the special functions of course. Then, I also added a loading screen where you had to click to enter and made a startup sound that would play. Pretty happy with my progress and loved how it came out!"}, {"post_id": 21911, "ts": "2026-07-04T02:45:22Z", "hours": 0.6467, "text": "Today it was pretty simple as I just worked on the my first app window and it was suppose to be a simple about me page. I had to fix a problem with the text not aligning to the middle at first for some reason and it was because I forgot to add flex into the window. I was also able to figure out how to add my socials along with their respective logos side by side with it all linked up. Next, I will be working on implementing probably more apps on my os!"}, {"post_id": 21237, "ts": "2026-07-03T02:16:54Z", "hours": 1.3383, "text": "I spent a bunch of time just working on creating an app icon inside Weby and I was just trying to figure out once again how html worked. I am not going to lie I did get lost in the sauce with the code when I first opened it up today because I had a mini brain fart, but then I was able to pick up from where I left off yesterday. Making the windows and new classes took me a while to figure out. Then, I had to also work on the orientation of the windows, basically meaning trying to bring the recently clicked window to the top of the section. Lastly, I worked a lot on just making all the code readable by leaving comments so that when other people, including myself, read the code I can follow through pretty easily. I also made sure to put everything to more condensed and simpler versions so I don’t have chunks of code when I can have lines."}, {"post_id": 20441, "ts": "2026-07-02T01:09:26Z", "hours": 1.9119, "text": "Today, I first started to work on the window outline and making the welcome screen pop up thing look good. I was just playing around with a lot of the code because this was my 2nd day actively using html to code an interface. After a while I was also able to get a background and a header up and running. There were a lot of times I had to go google issues; for example, when I was working on the headers the “Weby” was suppose to be directly in the center of the webpage but for some reason it was a little offsetted. After getting all the basic screen set up done I was able to move and do more detailed work for the screen. I made a close and open button, and also blurred the background of my welcome screen to make everything look more pleasing and function better. I’m looking forward to making apps on the OS next!"}, {"post_id": 19590, "ts": "2026-06-30T22:50:41Z", "hours": 0.6792, "text": "Soooo I started the new webos project that I happened to find under the missions tab. I think that it’s such a cool project that I will be able to do. This will also be the first time for me to code in HTML and also CSS so it would be a really good learning experience for me. At first you can see I was just messing around with the fonts and also the possibilities of what you can do with HTML. I imported a shrimp dish on as a computer so I could see how the import picture worked. Then after a bit of figuring out how html functioned I was able to make kind of a basic intro/welcome screen that would include my socials and just a quick introduction to weby (you can see on the blue background pic on the right)."}]...
|
Title: My very own WebOS by @benny | Stardance
De Title: My very own WebOS by @benny | Stardance
Devlogs:
Soooo I started the new webos project that I happened to find under the missions tab. I think that it’s such a cool project that I will be able to do. This will also be the first time for me to code in HTML and also CSS so it would be a really good learning experience for me. At first you can see I was just messing around with the fonts and also the possibilities of what you can do with HTML. I imported a shrimp dish on as a computer so I could see how the import picture worked. Then after a bit of figuring out how html functioned I was able to make kind of a basic intro/welcome screen that would include my socials and just a quick introduction to weby (you can see on the blue background pic on the right).
Today, I first started to work on the window outline and making the welcome screen pop up thing look good. I was just playing around with a lot of the code because this was my 2nd day actively using html to code an interface. After a while I was also able to get a background and a header up and running. There were a lot of times I had to go google issues; for example, when I was working on the headers the “Weby” was suppose to be directly in the center of the webpage but for some reason it was a little offsetted. After getting all the basic screen set up done I was able to move and do more detailed work for the screen. I made a close and open button, and also blurred the background of my welcome screen to make everything look more pleasing and function better. I’m looking forward to making apps on the OS next!
I spent a bunch of time just working on creating an app icon inside Weby and I was just trying to figure out once again how html worked. I am not going to lie I did get lost in the sauce with the code when I first opened it up today because I had a mini brain fart, but then I was able to pick up from where I left off yesterday. Making the windows and new classes took me a while to figure out. Then, I had to also work on the orientation of the windows, basically meaning trying to bring the recently clicked window to the top of the section. Lastly, I worked a lot on just making all the code readable by leaving comments so that when other people, including myself, read the code I can follow through pretty easily. I also made sure to put everything to more condensed and simpler versions so I don’t have chunks of code when I can have lines.
Today it was pretty simple as I just worked on the my first app window and it was suppose to be a simple about me page. I had to fix a problem with the text not aligning to the middle at first for some reason and it was because I forgot to add flex into the window. I was also able to figure out how to add my socials along with their respective logos side by side with it all linked up. Next, I will be working on implementing probably more apps on my os!
So today I was able to grind out and basically finish everything I wanted. I started off with making a projects app that was like a little carousel with arrows that showed some of my projects, then I was also able to make a Songs app, where I used spotify embedded to include 9 songs (in a 3x3 grid). I thought everything was going very well and I had to do some research for all the special functions of course. Then, I also added a loading screen where you had to click to enter and made a startup sound that would play. Pretty happy with my progress and loved how it came out!
Ships:
A made a personalized web OS called Weby and it includes a couple of apps that allows everyone to have some insights onto who I am! This is the first time I’ve actively used HTML, CSS, and Java in order to make something of this scale so I’m pretty happy how far I was able to go. It does feature a click to enter loading screen that is paired with a startup sound (pretty dope ik). It has 3 apps that will show a variety of things about me ranging from hobbies to projects done. I won’t say anything more so please check it out if you would like! Thank you!...
|
1793220739.41571
|
1793307139.41571
|
|
93
|
FolderHarbor by @Nova | Stardance
|
Nova
|
0
|
3.3
|
0
|
[]
|
[{"post_id": 9176, "ts": "2026 [{"post_id": 9176, "ts": "2026-06-15T11:56:50Z", "hours": 1.6044, "text": "Web - Finished SDK Migration More of what I was doing in my last devlog! I updated to @folderharbor/ [email protected] , and implemented it across the rest of the panel. Specifically, in this time, I added it to: all admin routes (users, roles, acls, permissions, config, logs) user settings Web - Consolidation I also removed all of the web panel’s types that overlapped with the SDK’s ones, such as getting rid of the ClientConfig type and using FHClientConfig from the SDK instead. Notes I’m just about to merge this code into the main branch! :3"}, {"post_id": 9131, "ts": "2026-06-15T08:47:30Z", "hours": 1.6997, "text": "Web - SDK Migration I recently made an SDK for FolderHarbor (as a different project)! I’m now rewriting parts of the web panel to use it instead of direct API calls, as the SDK provides better type-safety. This isn’t done yet, but I’ve gotten the migration done in a few places. I’m doing this on a branch since it’s very breaking (most pages are broken on the branch during this rewrite, but the main branch’s version is still operational with the old code). Server - Fixes I fixed some things with the server, namely: Making a locked account return an error in checkPath() calls (this is to stop in-progress transfers on lock). Fixing the PNPM configuration, making it work properly with PNPM v11 (including on the CI/CD)."}]...
|
Title: FolderHarbor by @Nova | Stardance
Devlogs: Title: FolderHarbor by @Nova | Stardance
Devlogs:
Web - SDK Migration I recently made an SDK for FolderHarbor (as a different project)! I’m now rewriting parts of the web panel to use it instead of direct API calls, as the SDK provides better type-safety. This isn’t done yet, but I’ve gotten the migration done in a few places. I’m doing this on a branch since it’s very breaking (most pages are broken on the branch during this rewrite, but the main branch’s version is still operational with the old code). Server - Fixes I fixed some things with the server, namely: Making a locked account return an error in checkPath() calls (this is to stop in-progress transfers on lock). Fixing the PNPM configuration, making it work properly with PNPM v11 (including on the CI/CD).
Web - Finished SDK Migration More of what I was doing in my last devlog! I updated to @folderharbor/ [email protected] , and implemented it across the rest of the panel. Specifically, in this time, I added it to: all admin routes (users, roles, acls, permissions, config, logs) user settings Web - Consolidation I also removed all of the web panel’s types that overlapped with the SDK’s ones, such as getting rid of the ClientConfig type and using FHClientConfig from the SDK instead. Notes I’m just about to merge this code into the main branch! :3...
|
1793220740.6317718
|
1793825540.6317718
|
|
24002
|
Esp 32 wifi and blutooth jammer by @Taseen | Stard Esp 32 wifi and blutooth jammer by @Taseen | Stardance...
|
Taseen
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Esp 32 wifi and blutooth jammer by @Taseen Title: Esp 32 wifi and blutooth jammer by @Taseen | Stardance...
|
1793220741.5675976
|
1793825541.5675976
|
|
24884
|
Art Swap Website by @PEPERI | Stardance
|
PEPERI
|
1
|
12.02
|
69
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-07-15T15:44:15Z", "hours": 11.0, "multiplier": 6.5, "payout": 69, "blessing": "neutral", "text": "I made a website about a community art swap I want to start! Challenges were getting it to be accessible for smaller screens and I enjoyed seeing it come from design to life.", "repo": "https://github.com/peppapigX10/ArtSwap", "demo": "https://peppapigx10.github.io/ArtSwap/"}]...
|
[{"post_id": 29889, "ts": "202 [{"post_id": 29889, "ts": "2026-07-17T01:36:23Z", "hours": 0.5747, "text": "Fixed a gap between how to join section and made edits to page2 (home) photo"}, {"post_id": 29678, "ts": "2026-07-16T19:02:20Z", "hours": 0.4453, "text": "Just fixed the menu rect to match the background (added gradient)"}, {"post_id": 28927, "ts": "2026-07-15T15:15:54Z", "hours": 5.7322, "text": "Basically finished the website made it accessible for smaller screens, also the menu rect used to be an image (cause I didn’t know there is a blur function in css) so I changed that, couldn’t fit it all in the screenshot but its a whole website not just this page"}, {"post_id": 16036, "ts": "2026-06-26T01:31:16Z", "hours": 4.8975, "text": "Working on a community art swap! Made the overall website, buttons are functionable! Will work on replacing placeholder imgs in the how to join section"}]...
|
Title: Art Swap Website by @PEPERI | Stardance
De Title: Art Swap Website by @PEPERI | Stardance
Devlogs:
Working on a community art swap! Made the overall website, buttons are functionable! Will work on replacing placeholder imgs in the how to join section
Basically finished the website made it accessible for smaller screens, also the menu rect used to be an image (cause I didn’t know there is a blur function in css) so I changed that, couldn’t fit it all in the screenshot but its a whole website not just this page
Just fixed the menu rect to match the background (added gradient)
Fixed a gap between how to join section and made edits to page2 (home) photo
Ships:
I made a website about a community art swap I want to start! Challenges were getting it to be accessible for smaller screens and I enjoyed seeing it come from design to life....
|
1793220742.468607
|
1793307142.468607
|
|
23509
|
Untitled by @takshsrivastava12345 | Stardance
|
takshsrivastava12345
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Untitled by @takshsrivastava12345 | Stardan Title: Untitled by @takshsrivastava12345 | Stardance...
|
1793220743.6653752
|
1793825543.6653752
|
|
33156
|
Fighter Jet game by @ap7 | Stardance
|
ap7
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Fighter Jet game by @ap7 | Stardance
|
1793220744.5750408
|
1793825544.5750408
|
|
21740
|
Cosmic Bounce by @kk_vun | Stardance
|
kk_vun
|
1
|
1.0
|
1
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-18T20:58:50Z", "hours": 1.0, "multiplier": 1.19, "payout": 1, "blessing": "neutral", "text": "I made a flappy bird clone but you are a star with fuel", "repo": "https://github.com/kkv-lang/cosmic-bounce", "demo": "https://kkv-lang.github.io/cosmic-bounce/"}]...
|
[{"post_id": 11445, "ts": "202 [{"post_id": 11445, "ts": "2026-06-18T18:30:36Z", "hours": 0.5228, "text": "Finished the core features for Cosmic Bounce! What I did:Built the layout using HTML and styled the space canvas background with CSS.Wrote the game logic in JavaScript, including gravity physics so the star falls.Added features like player lives, XP, an energy fuel gauge, and custom sound effects for jumping and collecting items.Next steps: Testing the game loop and polishing the mechanics!"}]...
|
Title: Cosmic Bounce by @kk_vun | Stardance
Devlo Title: Cosmic Bounce by @kk_vun | Stardance
Devlogs:
Finished the core features for Cosmic Bounce! What I did:Built the layout using HTML and styled the space canvas background with CSS.Wrote the game logic in JavaScript, including gravity physics so the star falls.Added features like player lives, XP, an energy fuel gauge, and custom sound effects for jumping and collecting items.Next steps: Testing the game loop and polishing the mechanics!
Ships:
I made a flappy bird clone but you are a star with fuel...
|
1793220747.0923817
|
1793307147.0923817
|
|
17660
|
My awesome macropad! by @levifrederickharper | Sta My awesome macropad! by @levifrederickharper | Stardance...
|
levifrederickharper
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My awesome macropad! by @levifrederickharpe Title: My awesome macropad! by @levifrederickharper | Stardance...
|
1793220748.0182607
|
1793825548.0182607
|
|
36900
|
My own site! by @pratyushshandilya | Stardance
|
pratyushshandilya
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My own site! by @pratyushshandilya | Starda Title: My own site! by @pratyushshandilya | Stardance...
|
1793220748.9055927
|
1793825548.9055927
|
|
8652
|
Market Regime Dashboard + Backtester by @jacksalee Market Regime Dashboard + Backtester by @jacksaleeby | Stardance...
|
jacksaleeby
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Market Regime Dashboard + Backtester by @ja Title: Market Regime Dashboard + Backtester by @jacksaleeby | Stardance...
|
1793220749.844133
|
1793825549.844133
|
|
16140
|
My very own WebOS by @sircheetodust | Stardance
|
sircheetodust
|
1
|
6.0
|
0
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-06-12T22:20:05Z", "hours": 6.0, "multiplier": null, "payout": 0, "blessing": "neutral", "text": "This is unnamed OS. Feature list: Custom window system Allows window resizing Easier app creation(one JavaScript command) Completely custom notepad app(No Pad - -) Saving to browser’s localstorage so that notes are saved even through reloads and closing and reopening the website Loading screen simulator Game of the year, source code in its folder This is my first project for hack club so any feedback is appreciated", "repo": "https://github.com/word9317/webOs", "demo": "https://word9317.github.io/webOs/"}]...
|
[{"post_id": 7727, "ts": "2026 [{"post_id": 7727, "ts": "2026-06-12T21:55:44Z", "hours": 0.54, "text": "Updated the readme to be more comprehensive"}, {"post_id": 7697, "ts": "2026-06-12T21:05:35Z", "hours": 1.0128, "text": "Added a notepad app I added NoPad –, it has saving that persists through reloads and text that tells you if its saved or not!"}, {"post_id": 7559, "ts": "2026-06-12T17:14:15Z", "hours": 1.1333, "text": "Added a new app! Ever since i migrated to a new window system, adding apps is so much easier. You create your app as an html file and just add a shortcut to the desktop to open it. I added a very fun game called loading screen simulator. I am going to make some more apps soon!"}, {"post_id": 7204, "ts": "2026-06-12T00:58:04Z", "hours": 1.5847, "text": "Lots of work was done! I redid the background and also completely revised the window system. Now the window has maximizing. Window system is polished so that apps can be launched via a javascript command(scripts are revised versions of scripts i used in a previous project)"}, {"post_id": 7078, "ts": "2026-06-11T21:07:39Z", "hours": 1.6397, "text": "Created a basic window system. Added widgets. Going to continue with the tutorial and then customize it"}]...
|
Title: My very own WebOS by @sircheetodust | Stard Title: My very own WebOS by @sircheetodust | Stardance
Devlogs:
Created a basic window system. Added widgets. Going to continue with the tutorial and then customize it
Lots of work was done! I redid the background and also completely revised the window system. Now the window has maximizing. Window system is polished so that apps can be launched via a javascript command(scripts are revised versions of scripts i used in a previous project)
Added a new app! Ever since i migrated to a new window system, adding apps is so much easier. You create your app as an html file and just add a shortcut to the desktop to open it. I added a very fun game called loading screen simulator. I am going to make some more apps soon!
Added a notepad app I added NoPad –, it has saving that persists through reloads and text that tells you if its saved or not!
Updated the readme to be more comprehensive
Ships:
This is unnamed OS. Feature list: Custom window system Allows window resizing Easier app creation(one JavaScript command) Completely custom notepad app(No Pad - -) Saving to browser’s localstorage so that notes are saved even through reloads and closing and reopening the website Loading screen simulator Game of the year, source code in its folder This is my first project for hack club so any feedback is appreciated...
|
1793220750.7387896
|
1793307150.7387896
|
|
22847
|
Text Based RPG Game by @Riptide | Stardance
|
Riptide
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: Text Based RPG Game by @Riptide | Stardance
|
1793220751.9533513
|
1793825551.9533513
|
|
2813
|
Butterfly Wall Display by @kdhriti15 | Stardance
|
kdhriti15
|
0
|
0.67
|
0
|
[]
|
[{"post_id": 506, "ts": "2026- [{"post_id": 506, "ts": "2026-06-01T23:57:30Z", "hours": 0.6703, "text": "Wrote Code for the Servos and Touch Module"}]...
|
Title: Butterfly Wall Display by @kdhriti15 | Star Title: Butterfly Wall Display by @kdhriti15 | Stardance
Devlogs:
Wrote Code for the Servos and Touch Module...
|
1793220752.8429866
|
1793825552.8429866
|
|
2142
|
My first slack bot! by @Aubrey | Stardance
|
Aubrey
|
0
|
0.0
|
0
|
[]
|
[]
|
Title: My first slack bot! by @Aubrey | Stardance
|
1793220753.7763765
|
1793825553.7763765
|
|
9443
|
Better Music by @muntean_andrew | Stardance
|
muntean_andrew
|
2
|
33.0
|
323
|
[{"ship_num": 1, "ts": "2026-0 [{"ship_num": 1, "ts": "2026-09-27T09:14:00Z", "hours": 20.0, "multiplier": 8.54, "payout": 202, "blessing": "neutral", "text": "I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, can read synced/unsynced lyrics tags from the music files and show them like Spotify, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette and even the base border radius to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. This is just an update and the majority of the time spent on the project was used to make improvements in the backend management of the song objects and to make the UI better reflect and update according to the data in the backend. But also I’ve added lyrics support and if your music files have lyrics tags embedded in them the app will take full advantage of them by enabling you to see each verse when it is singed and also skip to that one part you like the most just by clicking on your favorite line in the track. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now.", "repo": "https://github.com/AliendsOG/Better-Music", "demo": "https://github.com/AliendsOG/Better-Music/releases/tag/better-music"}, {"ship_num": 2, "ts": "2026-06-15T15:17:37Z", "hours": 13.0, "multiplier": 9.67, "payout": 121, "blessing": "neutral", "text": "I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. The challenging part was the steep learning curve as I hadn’t done anything on this scale before. I had to learn to connect the 2 Electron processes together seamlessly. Furthermore I had to dive into the world of databases with SQLite 3, which was uncharted territory for me. I had to use AI to help me learn these things and also to brainstorm ideas about hoe to optimize the app. For instance, when the idea of the search-as-you-type feature came up to me I envisioned a kind of tree structure with letters and that for every song, album, playlist name the app would create the branches in the tree so it would be a very fast and efficient search algorithm, and when I talked to the AI about it I found out that this kind of structure is called a trie. I am really proud that I’ve managed to build a clean, responsive and fast music player that tracks the user’s listening activity and stores it on device. Also it was very exciting when I tested the search feature and it worked perfectly. I’m also proud of the engineering journey itself. I utilized Gemini as an active learning collaborator to help me unpack the architectural patterns of Electron and master data persistence with SQLite 3. Turning that complex technical guidance into a functional, polished desktop product was incredibly rewarding. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now.", "repo": "https://github.com/AliendsOG/Better-Music", "demo": "https://github.com/AliendsOG/Better-Music/releases/tag/better-music"}]...
|
[{"post_id": 74382, "ts": "202 [{"post_id": 74382, "ts": "2026-09-27T09:04:01Z", "hours": 1.0467, "text": "This is the last devlog before shipping the project update. This has been an exciting journey and I am very satisfied with the result! I do wish there would be a bit more time left for the event to continue so I could ship even more things but all good things must come to an end, and this one is a happy ending. I’ve made the necessary last minute touches to make sure that everything works as it should."}, {"post_id": 74114, "ts": "2026-09-26T18:26:03Z", "hours": 1.6697, "text": "Added new ways to customize the player to the user’s liking and fixed that prevented the app from reading the user_version of the database which in return made the app “update” the DB everytime it started."}, {"post_id": 73281, "ts": "2026-09-24T18:58:58Z", "hours": 0.4853, "text": "YEEEEEESS, FINALLLYYYYYY, we have synced lyrics in the app. I know it’s not the most glamorous UI at the moment, but it is still something, and the other music players don’t even do this, like at most they show the lyrics with the timestamps and that’s it, no scaling of the verse, nothing. In future updates certainly I’ll make the UI more polished because it need a lot of it. Still I am happy that I’ve made it this far and after a bit of clean up and maybe some optimizations I’ll ship the project."}, {"post_id": 73261, "ts": "2026-09-24T18:10:26Z", "hours": 1.5067, "text": "I’ve finally found the culprit that prevented me from getting the synced lyrics, now the app can read the synced lyrics from music filed. YEEEEEEE Now the “only” thing is to make the UI for them, which I hope would be easy and fast. 😅"}, {"post_id": 73191, "ts": "2026-09-24T15:40:21Z", "hours": 2.4517, "text": "Trying to add lyrics to the app. But it is a bit of a mess cause in the Samsung Music and Apple Music apps these files contain time stamps for each verse and so I was thinking to read those time stamps and to highlight the verse that is played at that time, but my app doesn’t read those things and I don’t know why. An explanation might be that those apps ping free open source databases of lyrics based on the song details, but I am not really sure."}, {"post_id": 69252, "ts": "2026-09-16T17:55:55Z", "hours": 4.7486, "text": "Another day, another restructuring I guess. 😅 I’ve decided to give each album an id instead of relying on it’s name as the identifier as I did previously. Also I’ve changed the Play function to work with song ids and album ids instead of names. This is because if the name of the song or the album had any of these 2 characters: ’ or “ it would mess up with the HTML structure and the song would not play if the user clicked on it. Not gonna lie, I think that my code now is a little spaghetti and for sure someone with more experience and knowledge on how to structure a music player would have done a much better job than me at this, but still. The main caveat that I think could appear in the future is that the Play function can’t take numbered ids for playlists and I have to rely in the playlist’s name because the function would have no way to distinguish between them at the moment and I don’t want to make another spaghetti to fix this. 😅 In other news, I have successfully changed the backend to update the DB version for the user of the older version of the app and to add the new “lyrics” column and also the app can read the embedded lyrics from the music files. Now the “only” thing remaining is to add the lyrics to the UI and to parse the strings and make the verses synchronize with the song and this feature would be fully implemented."}, {"post_id": 57422, "ts": "2026-08-29T15:54:13Z", "hours": 2.9864, "text": "After successfully changing the song objects management under the hood from the previous devlog I now added an indicator for which song is currently playing. For now I’ve just set the background of the song to be the primary color selected by the user. Also I’ve changed the border radius for everything to be based on one variable so that the user could change it in the settings (but didn’t yet implement the UI for that) cause everyone has their own preference for these things. The first screenshot is with the border radius set a bit higher (30px) than my default one (23px), and the second one is with the border radius set to 0. Additionally I am changing the SQLite db in the backend to support lyrics because I want to add them to the app."}, {"post_id": 56489, "ts": "2026-08-28T08:43:54Z", "hours": 4.7514, "text": "I am currently working on optimizing the code so that changes like adding songs to a playlist or liking a song update instantly across all pages because this was a flaw of my old architecture of the app cause I didn’t just have 1 list of song objects that every album and artist referenced to but instead every album and artist had their own song objects and the list of favorite songs was also composed of song object. So it was a mess of duplicate song objects. Now I am changing things so that there is only one list of song object and albums have just a list of song ids in them so they reference the song object list, this way each change is global. This would hopefully fix the current synchronization issues that sometimes occur in the current version. This change would also allow me to add an indicator that a song is playing when the user looks at an album from which a song plays currently. Additionally I want to add a listening history page where the user can see their listening activity on the app and also maybe add some rewards depending on how much time they spent listening to an artist or album to gamify the experience a little."}, {"post_id": 8658, "ts": "2026-06-14T11:47:22Z", "hours": 0.4289, "text": "Solving some App Manifest problems"}, {"post_id": 8040, "ts": "2026-06-13T12:20:46Z", "hours": 1.7347, "text": "Updating the package on the Microsoft Store"}, {"post_id": 7956, "ts": "2026-06-13T08:50:15Z", "hours": 1.2564, "text": "Added some customization options and a settings menu"}, {"post_id": 7328, "ts": "2026-06-12T06:33:15Z", "hours": 1.7297, "text": "Updating the interface a little"}, {"post_id": 4874, "ts": "2026-06-08T13:08:06Z", "hours": 3.1572, "text": "Implemented search functionality"}, {"post_id": 3541, "ts": "2026-06-06T15:01:03Z", "hours": 2.7919, "text": "Adding clear queue button and a Permanent Queue or Temporary Playlist feature that saves the songs that you add to the queue even after you listen to them so you can set it to repeat all and still have the songs that you wanted"}, {"post_id": 3394, "ts": "2026-06-06T09:28:56Z", "hours": 1.4672, "text": "I implemented the function of changing the name and cover of a playlist"}]...
|
Title: Better Music by @muntean_andrew | Stardance Title: Better Music by @muntean_andrew | Stardance
Devlogs:
I implemented the function of changing the name and cover of a playlist
Adding clear queue button and a Permanent Queue or Temporary Playlist feature that saves the songs that you add to the queue even after you listen to them so you can set it to repeat all and still have the songs that you wanted
Implemented search functionality
Updating the interface a little
Added some customization options and a settings menu
Updating the package on the Microsoft Store
Solving some App Manifest problems
I am currently working on optimizing the code so that changes like adding songs to a playlist or liking a song update instantly across all pages because this was a flaw of my old architecture of the app cause I didn’t just have 1 list of song objects that every album and artist referenced to but instead every album and artist had their own song objects and the list of favorite songs was also composed of song object. So it was a mess of duplicate song objects. Now I am changing things so that there is only one list of song object and albums have just a list of song ids in them so they reference the song object list, this way each change is global. This would hopefully fix the current synchronization issues that sometimes occur in the current version. This change would also allow me to add an indicator that a song is playing when the user looks at an album from which a song plays currently. Additionally I want to add a listening history page where the user can see their listening activity on the app and also maybe add some rewards depending on how much time they spent listening to an artist or album to gamify the experience a little.
After successfully changing the song objects management under the hood from the previous devlog I now added an indicator for which song is currently playing. For now I’ve just set the background of the song to be the primary color selected by the user. Also I’ve changed the border radius for everything to be based on one variable so that the user could change it in the settings (but didn’t yet implement the UI for that) cause everyone has their own preference for these things. The first screenshot is with the border radius set a bit higher (30px) than my default one (23px), and the second one is with the border radius set to 0. Additionally I am changing the SQLite db in the backend to support lyrics because I want to add them to the app.
Another day, another restructuring I guess. 😅 I’ve decided to give each album an id instead of relying on it’s name as the identifier as I did previously. Also I’ve changed the Play function to work with song ids and album ids instead of names. This is because if the name of the song or the album had any of these 2 characters: ’ or “ it would mess up with the HTML structure and the song would not play if the user clicked on it. Not gonna lie, I think that my code now is a little spaghetti and for sure someone with more experience and knowledge on how to structure a music player would have done a much better job than me at this, but still. The main caveat that I think could appear in the future is that the Play function can’t take numbered ids for playlists and I have to rely in the playlist’s name because the function would have no way to distinguish between them at the moment and I don’t want to make another spaghetti to fix this. 😅 In other news, I have successfully changed the backend to update the DB version for the user of the older version of the app and to add the new “lyrics” column and also the app can read the embedded lyrics from the music files. Now the “only” thing remaining is to add the lyrics to the UI and to parse the strings and make the verses synchronize with the song and this feature would be fully implemented.
Trying to add lyrics to the app. But it is a bit of a mess cause in the Samsung Music and Apple Music apps these files contain time stamps for each verse and so I was thinking to read those time stamps and to highlight the verse that is played at that time, but my app doesn’t read those things and I don’t know why. An explanation might be that those apps ping free open source databases of lyrics based on the song details, but I am not really sure.
I’ve finally found the culprit that prevented me from getting the synced lyrics, now the app can read the synced lyrics from music filed. YEEEEEEE Now the “only” thing is to make the UI for them, which I hope would be easy and fast. 😅
YEEEEEESS, FINALLLYYYYYY, we have synced lyrics in the app. I know it’s not the most glamorous UI at the moment, but it is still something, and the other music players don’t even do this, like at most they show the lyrics with the timestamps and that’s it, no scaling of the verse, nothing. In future updates certainly I’ll make the UI more polished because it need a lot of it. Still I am happy that I’ve made it this far and after a bit of clean up and maybe some optimizations I’ll ship the project.
Added new ways to customize the player to the user’s liking and fixed that prevented the app from reading the user_version of the database which in return made the app “update” the DB everytime it started.
This is the last devlog before shipping the project update. This has been an exciting journey and I am very satisfied with the result! I do wish there would be a bit more time left for the event to continue so I could ship even more things but all good things must come to an end, and this one is a happy ending. I’ve made the necessary last minute touches to make sure that everything works as it should.
Ships:
I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. The challenging part was the steep learning curve as I hadn’t done anything on this scale before. I had to learn to connect the 2 Electron processes together seamlessly. Furthermore I had to dive into the world of databases with SQLite 3, which was uncharted territory for me. I had to use AI to help me learn these things and also to brainstorm ideas about hoe to optimize the app. For instance, when the idea of the search-as-you-type feature came up to me I envisioned a kind of tree structure with letters and that for every song, album, playlist name the app would create the branches in the tree so it would be a very fast and efficient search algorithm, and when I talked to the AI about it I found out that this kind of structure is called a trie. I am really proud that I’ve managed to build a clean, responsive and fast music player that tracks the user’s listening activity and stores it on device. Also it was very exciting when I tested the search feature and it worked perfectly. I’m also proud of the engineering journey itself. I utilized Gemini as an active learning collaborator to help me unpack the architectural patterns of Electron and master data persistence with SQLite 3. Turning that complex technical guidance into a functional, polished desktop product was incredibly rewarding. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now.
I built Better Music, a lightweight music player designed for seamless audio playback and intuitive library management. It features an instant search-as-you-type engine, interactive queue management, customizable playlist/album details, detailed listening activity tracking, can read synced/unsynced lyrics tags from the music files and show them like Spotify, a “Permanent Queue” (PQ) feature for when you want listen to a list of particular songs for just that one moment and don’t want to create a whole new playlist for it and you can customize it’s color palette and even the base border radius to your liking in the settings. To bring this to life, I combined the desktop application capabilities of Electron with a robust local relational database powered by SQLite 3, all wrapped in a sleek, responsive frontend built using HTML5, CSS, SCSS and JavaScript. This is just an update and the majority of the time spent on the project was used to make improvements in the backend management of the song objects and to make the UI better reflect and update according to the data in the backend. But also I’ve added lyrics support and if your music files have lyrics tags embedded in them the app will take full advantage of them by enabling you to see each verse when it is singed and also skip to that one part you like the most just by clicking on your favorite line in the track. Testing the app is incredibly simple—there is no need to clone deep source code dependencies or set up a complex development build environment. Where to get it: Head straight over to the Releases section of this repository. How to run it: Download the compiled .zip file for your platform, extract its contents into any folder on your computer, and double-click the main application executable (e.g., Better-Music.exe). Note on Updates: If you are testing store-packaged builds or encountered deployment errors (like MSIX package revision conflicts in the Partner Center), utilizing the raw ZIP release is the fastest, cleanest way to experience the app right now....
|
1793220754.6954992
|
1793307154.6954992
|